From 9f58e9c859380927893490e914b284cb00ee6d8a Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Wed, 31 Aug 2016 10:21:30 -0400 Subject: [PATCH 001/396] Working on drawing highlighted models --- Apps/Sandcastle/gallery/3D Models.html | 18 ++- Source/DataSources/ModelGraphics.js | 11 +- Source/DataSources/ModelVisualizer.js | 5 + Source/Scene/Model.js | 147 ++++++++++++++++++++++++- 4 files changed, 176 insertions(+), 5 deletions(-) diff --git a/Apps/Sandcastle/gallery/3D Models.html b/Apps/Sandcastle/gallery/3D Models.html index 577880df487c..4fd53b4a5fb2 100644 --- a/Apps/Sandcastle/gallery/3D Models.html +++ b/Apps/Sandcastle/gallery/3D Models.html @@ -33,6 +33,10 @@ shadows : true }); +var entity = null; + +var highlight = false; + function createModel(url, height) { viewer.entities.removeAll(); @@ -42,7 +46,7 @@ var roll = 0; var orientation = Cesium.Transforms.headingPitchRollQuaternion(position, heading, pitch, roll); - var entity = viewer.entities.add({ + entity = viewer.entities.add({ name : url, position : position, orientation : orientation, @@ -83,6 +87,18 @@ }]; Sandcastle.addToolbarMenu(options); + +Sandcastle.addToolbarButton('Toggle Highlight', function() { + highlight = !highlight; + entity.model.highlight = new Cesium.ConstantProperty(highlight); +}); + +Sandcastle.addToolbarButton('Change Highlight Color', function() { + entity.model.highlightColor = new Cesium.ConstantProperty(new Cesium.Cartesian4(Math.random(), Math.random(), Math.random(), 1.0)); +}); + + + //Sandcastle_End Sandcastle.finishedLoading(); } diff --git a/Source/DataSources/ModelGraphics.js b/Source/DataSources/ModelGraphics.js index e0b5ceb10794..c02e509102af 100644 --- a/Source/DataSources/ModelGraphics.js +++ b/Source/DataSources/ModelGraphics.js @@ -80,6 +80,8 @@ define([ this._nodeTransformationsSubscription = undefined; this._heightReference = undefined; this._heightReferenceSubscription = undefined; + this._highlight = undefined; + this._highlightColor = undefined; this._definitionChanged = new Event(); this.merge(defaultValue(options, defaultValue.EMPTY_OBJECT)); @@ -200,7 +202,10 @@ define([ * @type {Property} * @default HeightReference.NONE */ - heightReference : createPropertyDescriptor('heightReference') + heightReference : createPropertyDescriptor('heightReference'), + + highlight: createPropertyDescriptor('highlight'), + highlightColor: createPropertyDescriptor('highlightColor') }); /** @@ -225,6 +230,8 @@ define([ result.runAnimations = this.runAnimations; result.nodeTransformations = this.nodeTransformations; result.heightReference = this._heightReference; + result.highlight = this.highlight; + result.highlightColor = this.highlightColor; return result; }; @@ -253,6 +260,8 @@ define([ this.uri = defaultValue(this.uri, source.uri); this.runAnimations = defaultValue(this.runAnimations, source.runAnimations); this.heightReference = defaultValue(this.heightReference, source.heightReference); + this.highlight = defaultValue(this.highlight, source.highlight); + this.highlightColor = defaultValue(this.highlightColor, source.highlightColor); var sourceNodeTransformations = source.nodeTransformations; if (defined(sourceNodeTransformations)) { diff --git a/Source/DataSources/ModelVisualizer.js b/Source/DataSources/ModelVisualizer.js index fde2fedcb7f8..f4d68a4d8a83 100644 --- a/Source/DataSources/ModelVisualizer.js +++ b/Source/DataSources/ModelVisualizer.js @@ -6,6 +6,7 @@ define([ '../Core/destroyObject', '../Core/DeveloperError', '../Core/Matrix4', + '../Core/Cartesian4', '../Scene/HeightReference', '../Scene/Model', '../Scene/ModelAnimationLoop', @@ -19,6 +20,7 @@ define([ destroyObject, DeveloperError, Matrix4, + Cartesian4, HeightReference, Model, ModelAnimationLoop, @@ -32,6 +34,7 @@ define([ var defaultIncrementallyLoadTextures = true; var defaultShadows = ShadowMode.ENABLED; var defaultHeightReference = HeightReference.NONE; + var defaultHighlightColor = new Cartesian4(1.0, 0.0, 0.0, 1.0); var modelMatrixScratch = new Matrix4(); var nodeMatrixScratch = new Matrix4(); @@ -147,6 +150,8 @@ define([ model.modelMatrix = Matrix4.clone(modelMatrix, model.modelMatrix); model.shadows = shadows; model.heightReference = Property.getValueOrDefault(modelGraphics._heightReference, time, defaultHeightReference); + model.highlight = Property.getValueOrDefault(modelGraphics.highlight, time, false); + model.highlightColor = Property.getValueOrDefault(modelGraphics.highlightColor, time, defaultHighlightColor); if (model.ready) { var runAnimations = Property.getValueOrDefault(modelGraphics._runAnimations, time, true); diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 5644c433eb83..39582c3d95cc 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -399,6 +399,25 @@ define([ */ this.show = defaultValue(options.show, true); + /** + * Determines if the model will be highlighted. + * + * @type {Boolean} + * + * @default false + */ + this.highlight = defaultValue(options.highlight, false); + + /** + * The highlight color + * + * @type {Cartesian4} + * + * @default new Cartesian4(1.0, 0.0, 0.0, 1.0) + */ + this.highlightColor = defaultValue(options.highlightColor, new Cartesian4(1.0, 0.0, 0.0, 1.0)); + + /** * The 4x4 transformation matrix that transforms the model from model to world coordinates. * When this is the identity matrix, the model is drawn in world coordinates, i.e., Earth's WGS84 coordinates. @@ -598,6 +617,7 @@ define([ vertexArrays : {}, programs : {}, pickPrograms : {}, + hilightPrograms: {}, textures : {}, samplers : {}, @@ -1801,6 +1821,37 @@ define([ attributeLocations : attributeLocations }); } + + // TODO: This is just the shader for the plane. Need to be more generic. + + var hilightVS = "precision highp float;\n" + + "attribute vec3 a_position;\n" + + "attribute vec3 a_normal;\n" + + "varying vec3 v_normal;\n" + + "uniform mat3 u_normalMatrix;\n" + + "uniform mat4 u_modelViewMatrix;\n" + + "uniform mat4 u_projectionMatrix;\n" + + "attribute vec2 a_texcoord0;\n" + + "varying vec2 v_texcoord0;\n" + + "void main(void) {\n" + + " vec4 pos = u_modelViewMatrix * vec4(a_position,1.0);\n" + + " v_normal = u_normalMatrix * a_normal;\n" + + " pos.xyz += v_normal * 0.2;\n" + + " v_texcoord0 = a_texcoord0;\n" + + " gl_Position = u_projectionMatrix * pos;\n" + + "}\n"; + + var hilightFS = 'uniform vec4 u_highlightColor;\n' + + 'void main() \n' + + '{ \n' + + ' gl_FragColor = u_highlightColor;\n' + + '}'; + model._rendererResources.hilightPrograms[id] = ShaderProgram.fromCache({ + context : context, + vertexShaderSource : hilightVS, + fragmentShaderSource : hilightFS, + attributeLocations : attributeLocations + }); } function createPrograms(model, context) { @@ -2768,6 +2819,7 @@ define([ u.jointMatrixUniformName = jointMatrixUniformName; } } + } function scaleFromMatrix5Array(matrix) { @@ -2877,6 +2929,7 @@ define([ var rendererPrograms = resources.programs; var rendererPickPrograms = resources.pickPrograms; var rendererRenderStates = resources.renderStates; + var rendererHilightPrograms = resources.hilightPrograms; var uniformMaps = model._uniformMaps; var gltf = model.gltf; @@ -2959,6 +3012,27 @@ define([ var castShadows = ShadowMode.castShadows(model._shadows); var receiveShadows = ShadowMode.receiveShadows(model._shadows); + + // Setup the stencil for the first pass + var drawRS = clone(rs); + drawRS.stencilTest = { + enabled : true, + frontFunction : WebGLConstants.ALWAYS, + backFunction : WebGLConstants.ALWAYS, + reference : 1, + mask : ~0, + frontOperation : { + fail : WebGLConstants.KEEP, + zFail : WebGLConstants.KEEP, + zPass : WebGLConstants.REPLACE + }, + backOperation : { + fail : WebGLConstants.KEEP, + zFail : WebGLConstants.KEEP, + zPass : WebGLConstants.REPLACE + } + }; + drawRS = RenderState.fromCache(drawRS); var command = new DrawCommand({ boundingVolume : new BoundingSphere(), // updated in update() @@ -2972,11 +3046,59 @@ define([ castShadows : castShadows, receiveShadows : receiveShadows, uniformMap : uniformMap, - renderState : rs, + renderState : drawRS, owner : owner, pass : isTranslucent ? Pass.TRANSLUCENT : Pass.OPAQUE }); + // Setup the stencil command for the hilight + var hilightRS = clone(rs); + hilightRS.stencilTest = { + enabled : true, + frontFunction : WebGLConstants.NOTEQUAL, + backFunction : WebGLConstants.NOTEQUAL, + reference : 1, + mask : ~0, + frontOperation : { + fail : WebGLConstants.KEEP, + zFail : WebGLConstants.KEEP, + zPass : WebGLConstants.REPLACE + }, + backOperation : { + fail : WebGLConstants.KEEP, + zFail : WebGLConstants.KEEP, + zPass : WebGLConstants.REPLACE + } + }; + hilightRS.cull = { + enabled : true, + face : WebGLConstants.FRONT + }; + hilightRS.depthTest = false; + + hilightRS = RenderState.fromCache(hilightRS); + + // Setup the highlight color uniform. + uniformMap.u_highlightColor = function(){ + return model.highlightColor; + }; + + var hilightCommand = new DrawCommand({ + boundingVolume : new BoundingSphere(), // updated in update() + cull : model.cull, + modelMatrix : new Matrix4(), // computed in update() + primitiveType : primitive.mode, + vertexArray : vertexArray, + count : count, + offset : offset, + shaderProgram : rendererHilightPrograms[technique.program], + uniformMap : uniformMap, + renderState : hilightRS, + owner : owner, + pass : isTranslucent ? Pass.TRANSLUCENT : Pass.OPAQUE + }); + + var pickCommand; if (allowPicking) { @@ -3037,7 +3159,8 @@ define([ command : command, pickCommand : pickCommand, command2D : command2D, - pickCommand2D : pickCommand2D + pickCommand2D : pickCommand2D, + hilightCommand: hilightCommand }; runtimeNode.commands.push(nodeCommand); nodeCommands.push(nodeCommand); @@ -3234,6 +3357,12 @@ define([ BoundingSphere.clone(command.boundingVolume, pickCommand.boundingVolume); } + var hilightCommand = primitiveCommand.hilightCommand; + Matrix4.clone(command.modelMatrix, hilightCommand.modelMatrix); + //Matrix4.multiplyByUniformScale(hilightCommand.modelMatrix, 1.04, hilightCommand.modelMatrix); + BoundingSphere.clone(command.boundingVolume, hilightCommand.boundingVolume); + + // If the model crosses the IDL in 2D, it will be drawn in one viewport, but part of it // will be clipped by the viewport. We create a second command that translates the model // model matrix to the opposite side of the map so the part that was clipped in one viewport @@ -3805,7 +3934,9 @@ define([ var idl2D = frameState.mapProjection.ellipsoid.maximumRadius * CesiumMath.PI; var boundingVolume; - if (passes.render) { + if (passes.render) { + + // The actual render commands for (i = 0; i < length; ++i) { nc = nodeCommands[i]; if (nc.show) { @@ -3819,6 +3950,16 @@ define([ } } } + + if (this.highlight) { + // Hilight commands second. + for (i = 0; i < length; ++i) { + nc = nodeCommands[i]; + if (nc.show) { + commandList.push(nc.hilightCommand); + } + } + } } if (passes.pick && this.allowPicking) { From de364e9daae9e91e976d54da984fbc5ce24387cd Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Wed, 31 Aug 2016 12:51:36 -0400 Subject: [PATCH 002/396] Changed demo to be able to modify the highlight size --- Apps/Sandcastle/gallery/3D Models.html | 47 +++++++++++++++++-- .../gallery/development/3D Models.html | 4 +- Source/DataSources/ModelGraphics.js | 6 ++- Source/DataSources/ModelVisualizer.js | 2 + Source/Scene/Model.js | 22 +++++++-- 5 files changed, 71 insertions(+), 10 deletions(-) diff --git a/Apps/Sandcastle/gallery/3D Models.html b/Apps/Sandcastle/gallery/3D Models.html index 4fd53b4a5fb2..6603c6f065ab 100644 --- a/Apps/Sandcastle/gallery/3D Models.html +++ b/Apps/Sandcastle/gallery/3D Models.html @@ -19,10 +19,31 @@

Loading...

-
+
+ + + + + + +
Highlight Size + + +
+
+ + + + + +
+

Loading...

+
+ + + + + + +
Highlight Size + + +
+
+ + + diff --git a/Apps/Sandcastle/gallery/development/3D Models Outline.jpg b/Apps/Sandcastle/gallery/development/3D Models Outline.jpg new file mode 100644 index 0000000000000000000000000000000000000000..571d9866731e8ffdcfd69aad0b4944b0a76e964b GIT binary patch literal 11892 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 BD^>si literal 0 HcmV?d00001 From bac19f05830267a7cb8814e235dfcce4d9fda1e5 Mon Sep 17 00:00:00 2001 From: Dave Whipps Date: Fri, 9 Sep 2016 12:42:31 -0400 Subject: [PATCH 012/396] Fixed to ensure backwards compatibility. Better variable naming. --- Source/Scene/LabelCollection.js | 43 ++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index fbc9291b8bfb..8077fb2c4703 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -223,10 +223,12 @@ define([ var dimensions; var lineWidth = 0; - var maxWidth = 0; + var maxLineWidth = 0; - var maxHeight = 0; - var numberNewlines = 0; + var maxGlyphHeight = 0; + var maxGlyphDescent = 0; + + var numberOfLines = 1; var glyphIndex = 0; var glyphLength = glyphs.length; @@ -235,10 +237,12 @@ define([ dimensions = glyph.dimensions; lineWidth += dimensions.width; - maxWidth = Math.max(maxWidth, lineWidth); - maxHeight = Math.max(maxHeight, dimensions.height + dimensions.descent); + maxLineWidth = Math.max(maxLineWidth, lineWidth); + maxGlyphHeight = Math.max(maxGlyphHeight, dimensions.height); + maxGlyphDescent = Math.max(maxGlyphDescent, dimensions.descent); + if (text.charAt(glyphIndex) === '\n') { - numberNewlines += 1; + numberOfLines += 1; lineWidth = 0; } } @@ -247,23 +251,28 @@ define([ var horizontalOrigin = label._horizontalOrigin; var widthOffset = 0; if (horizontalOrigin === HorizontalOrigin.CENTER) { - widthOffset -= maxWidth / 2 * scale; + widthOffset -= maxLineWidth / 2 * scale; } else if (horizontalOrigin === HorizontalOrigin.RIGHT) { - widthOffset -= maxWidth * scale; + widthOffset -= maxLineWidth * scale; } var heightOffset = 0; - var totalHeight = maxHeight * numberNewlines; + + + var maxLineHeight = maxGlyphHeight + maxGlyphDescent; + var totalHeight = (maxGlyphHeight * numberOfLines) + (maxGlyphDescent * (numberOfLines-1)); var heightReference = label._heightReference; var verticalOrigin = (heightReference === HeightReference.NONE) ? label._verticalOrigin : VerticalOrigin.BOTTOM; if (verticalOrigin === VerticalOrigin.CENTER) { - heightOffset -= totalHeight / 2 * scale; - } else if (verticalOrigin === VerticalOrigin.TOP) { - heightOffset -= totalHeight * scale; + // Subtract maxGlyphDescent for backwards compatibility + heightOffset += totalHeight / 2 * scale - maxGlyphDescent; } else if (verticalOrigin === VerticalOrigin.BOTTOM) { - heightOffset += totalHeight * scale; + heightOffset += maxLineHeight * (numberOfLines-1) * scale; + } + else if (verticalOrigin === VerticalOrigin.TOP) { + // Don't modify } glyphPixelOffset.x = widthOffset * resolutionScale; @@ -274,16 +283,16 @@ define([ glyph = glyphs[glyphIndex]; dimensions = glyph.dimensions; - if (verticalOrigin === VerticalOrigin.BOTTOM || dimensions.height === maxHeight) { + if (verticalOrigin === VerticalOrigin.BOTTOM) { glyphPixelOffset.y = heightOffset - dimensions.descent * scale; } else if (verticalOrigin === VerticalOrigin.TOP) { - glyphPixelOffset.y = heightOffset - (maxHeight - dimensions.height) * scale - dimensions.descent * scale; + glyphPixelOffset.y = heightOffset - (maxGlyphHeight - dimensions.height) * scale - dimensions.descent * scale; } else if (verticalOrigin === VerticalOrigin.CENTER) { - glyphPixelOffset.y = heightOffset - (maxHeight - dimensions.height) / 2 * scale - dimensions.descent * scale; + glyphPixelOffset.y = heightOffset - (maxGlyphHeight - dimensions.height) / 2 * scale - dimensions.descent * scale; } if (text.charAt(glyphIndex) === '\n') { - glyphNewlineOffset += maxHeight * scale; + glyphNewlineOffset += maxLineHeight * scale; glyphPixelOffset.x = widthOffset; continue; } From 1afb9a948bc1fa4b1d0a2b00dee1d0d75051c9e8 Mon Sep 17 00:00:00 2001 From: Dave Whipps Date: Fri, 9 Sep 2016 12:51:04 -0400 Subject: [PATCH 013/396] Cleanup. --- Source/Scene/LabelCollection.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 8077fb2c4703..95de3b2f31a4 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -259,17 +259,17 @@ define([ var heightOffset = 0; - var maxLineHeight = maxGlyphHeight + maxGlyphDescent; var totalHeight = (maxGlyphHeight * numberOfLines) + (maxGlyphDescent * (numberOfLines-1)); var heightReference = label._heightReference; var verticalOrigin = (heightReference === HeightReference.NONE) ? label._verticalOrigin : VerticalOrigin.BOTTOM; if (verticalOrigin === VerticalOrigin.CENTER) { // Subtract maxGlyphDescent for backwards compatibility - heightOffset += totalHeight / 2 * scale - maxGlyphDescent; + heightOffset += (totalHeight / 2 * scale) - maxGlyphDescent; } else if (verticalOrigin === VerticalOrigin.BOTTOM) { - heightOffset += maxLineHeight * (numberOfLines-1) * scale; + // Subtract maxGlyphHeight for backwards compatibility + heightOffset += (totalHeight * scale) - maxGlyphHeight; } else if (verticalOrigin === VerticalOrigin.TOP) { // Don't modify @@ -278,6 +278,7 @@ define([ glyphPixelOffset.x = widthOffset * resolutionScale; glyphPixelOffset.y = 0; + var maxLineHeight = maxGlyphHeight + maxGlyphDescent; var glyphNewlineOffset = 0; for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { glyph = glyphs[glyphIndex]; From 81a3a78f76ae965c3b5a1fa9fbf4d8ca3e91b240 Mon Sep 17 00:00:00 2001 From: Dave Whipps Date: Fri, 9 Sep 2016 13:44:18 -0400 Subject: [PATCH 014/396] Removed empty block. --- Source/Scene/LabelCollection.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 95de3b2f31a4..ad09fdd133ea 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -258,7 +258,6 @@ define([ var heightOffset = 0; - var totalHeight = (maxGlyphHeight * numberOfLines) + (maxGlyphDescent * (numberOfLines-1)); var heightReference = label._heightReference; @@ -266,14 +265,10 @@ define([ if (verticalOrigin === VerticalOrigin.CENTER) { // Subtract maxGlyphDescent for backwards compatibility heightOffset += (totalHeight / 2 * scale) - maxGlyphDescent; - } - else if (verticalOrigin === VerticalOrigin.BOTTOM) { + } else if (verticalOrigin === VerticalOrigin.BOTTOM) { // Subtract maxGlyphHeight for backwards compatibility heightOffset += (totalHeight * scale) - maxGlyphHeight; } - else if (verticalOrigin === VerticalOrigin.TOP) { - // Don't modify - } glyphPixelOffset.x = widthOffset * resolutionScale; glyphPixelOffset.y = 0; From fa237332a9544292d83d772d5c524fb4a6ffa6a6 Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Tue, 13 Sep 2016 11:10:04 -0400 Subject: [PATCH 015/396] Fix jshint issues --- Source/Scene/Model.js | 69 +++++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 6d486de645a6..7929262265e9 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -1853,26 +1853,32 @@ define([ // Get the projection matrix name. There is probably a better way to do this. var projectionMatrixUniformName = null; for (var techniqueName in model.gltf.techniques) { - var projectionMatrixParameterName = ""; - var technique = model.gltf.techniques[techniqueName]; - for (var parameterName in technique.parameters) { - var parameter = technique.parameters[parameterName]; - if (parameter.semantic === "PROJECTION") { - projectionMatrixParameterName = parameterName; - break; + if (model.gltf.techniques.hasOwnProperty(techniqueName)) { + var technique = model.gltf.techniques[techniqueName]; + var projectionMatrixParameterName = ""; + for (var parameterName in technique.parameters) { + if (technique.parameters.hasOwnProperty(parameterName)) { + var parameter = technique.parameters[parameterName]; + if (parameter.semantic === "PROJECTION") { + projectionMatrixParameterName = parameterName; + break; + } + } } - } - for (var uniformName in technique.uniforms) { - var paramName = technique.uniforms[uniformName]; - if (paramName == projectionMatrixParameterName) { - projectionMatrixUniformName = uniformName; - break; + for (var uniformName in technique.uniforms) { + if (technique.uniforms.hasOwnProperty(uniformName)) { + var paramName = technique.uniforms[uniformName]; + if (paramName === projectionMatrixParameterName) { + projectionMatrixUniformName = uniformName; + break; + } + } } - } - if (projectionMatrixUniformName) { - break; + if (projectionMatrixUniformName) { + break; + } } } @@ -2955,6 +2961,18 @@ define([ }; } + function createHighlightColorFunction(model) { + return function() { + return model.highlightColor; + }; + } + + function createHighlightSizeFunction(model) { + return function() { + return model.highlightSize; + }; + } + function createCommand(model, gltfNode, runtimeNode, context, scene3DOnly) { var nodeCommands = model._nodeCommands; var pickIds = model._pickIds; @@ -3115,14 +3133,9 @@ define([ highlightRS = RenderState.fromCache(highlightRS); - // Setup the highlight color uniform. - uniformMap.u_highlightColor = function(){ - return model.highlightColor; - }; - - uniformMap.u_highlightSize = function() { - return model.highlightSize; - }; + // Setup the highlight color and size uniforms. + uniformMap.u_highlightColor = createHighlightColorFunction(model); + uniformMap.u_highlightSize = createHighlightSizeFunction(model); var highlightCommand = new DrawCommand({ boundingVolume : new BoundingSphere(), // updated in update() @@ -3991,10 +4004,9 @@ define([ for (i = 0; i < length; ++i) { nc = nodeCommands[i]; if (nc.show) { - var command = nc.command; - commandList.push(command); + commandList.push(nc.command); - boundingVolume = command.boundingVolume; + boundingVolume = nc.command.boundingVolume; if (frameState.mode === SceneMode.SCENE2D && (boundingVolume.center.y + boundingVolume.radius > idl2D || boundingVolume.center.y - boundingVolume.radius < idl2D)) { commandList.push(nc.command2D); @@ -4008,8 +4020,7 @@ define([ nc = nodeCommands[i]; if (nc.show) { commandList.push(nc.highlightCommand); - - boundingVolume = command.boundingVolume; + boundingVolume = nc.command.boundingVolume; if (frameState.mode === SceneMode.SCENE2D && (boundingVolume.center.y + boundingVolume.radius > idl2D || boundingVolume.center.y - boundingVolume.radius < idl2D)) { commandList.push(nc.highlightCommand2D); From 751fbda10995f9295cba2139e4869b5b54b7ed12 Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Tue, 13 Sep 2016 11:34:09 -0400 Subject: [PATCH 016/396] Added new getUniformNameForSemantic function --- Source/Scene/Model.js | 65 +++++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 7929262265e9..dee58f2b6e10 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -1799,6 +1799,40 @@ define([ return renamedVS + '\n' + highlightMain; } + function getUniformNameForSemantic(model, semantic) { + var semanticUniformName = null; + for (var techniqueName in model.gltf.techniques) { + if (model.gltf.techniques.hasOwnProperty(techniqueName)) { + var technique = model.gltf.techniques[techniqueName]; + var semanticParameterName = ""; + for (var parameterName in technique.parameters) { + if (technique.parameters.hasOwnProperty(parameterName)) { + var parameter = technique.parameters[parameterName]; + if (parameter.semantic === semantic) { + semanticParameterName = parameterName; + break; + } + } + } + + for (var uniformName in technique.uniforms) { + if (technique.uniforms.hasOwnProperty(uniformName)) { + var paramName = technique.uniforms[uniformName]; + if (paramName === semanticParameterName) { + semanticUniformName = uniformName; + break; + } + } + } + + if (semanticUniformName) { + break; + } + } + } + return semanticUniformName; + } + function createProgram(id, model, context) { var programs = model.gltf.programs; var shaders = model._loadResources.shaders; @@ -1851,36 +1885,7 @@ define([ } // Get the projection matrix name. There is probably a better way to do this. - var projectionMatrixUniformName = null; - for (var techniqueName in model.gltf.techniques) { - if (model.gltf.techniques.hasOwnProperty(techniqueName)) { - var technique = model.gltf.techniques[techniqueName]; - var projectionMatrixParameterName = ""; - for (var parameterName in technique.parameters) { - if (technique.parameters.hasOwnProperty(parameterName)) { - var parameter = technique.parameters[parameterName]; - if (parameter.semantic === "PROJECTION") { - projectionMatrixParameterName = parameterName; - break; - } - } - } - - for (var uniformName in technique.uniforms) { - if (technique.uniforms.hasOwnProperty(uniformName)) { - var paramName = technique.uniforms[uniformName]; - if (paramName === projectionMatrixParameterName) { - projectionMatrixUniformName = uniformName; - break; - } - } - } - - if (projectionMatrixUniformName) { - break; - } - } - } + var projectionMatrixUniformName = getUniformNameForSemantic(model, "PROJECTION"); var highlightVS = createHighlightVertexShaderSource(vs, projectionMatrixUniformName); From f41bb6e4490ee4bd8b20627c5b47960031e40eef Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Tue, 13 Sep 2016 12:04:49 -0400 Subject: [PATCH 017/396] Changed the highlightSize parameter to be in pixels instead of clip space size --- .../gallery/development/3D Models Outline.html | 4 ++-- Source/Scene/Model.js | 13 ++++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Apps/Sandcastle/gallery/development/3D Models Outline.html b/Apps/Sandcastle/gallery/development/3D Models Outline.html index 3c7778ade08b..cb9138fa284b 100644 --- a/Apps/Sandcastle/gallery/development/3D Models Outline.html +++ b/Apps/Sandcastle/gallery/development/3D Models Outline.html @@ -37,7 +37,7 @@ Highlight Size - + @@ -59,7 +59,7 @@ // The viewModel tracks the state of our mini application. var viewModel = { highlight: false, - highlightSize: 0.002 + highlightSize: 2 }; // Convert the viewModel members into knockout observables. diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index dee58f2b6e10..386d4c25dd88 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -1782,7 +1782,7 @@ define([ return shader; } - function createHighlightVertexShaderSource(vertexShaderSource, projectionMatrixName) { + function createHighlightVertexShaderSource(vertexShaderSource, projectionMatrixName, viewportName) { var renamedVS = ShaderSource.replaceMain(vertexShaderSource, 'czm_old_main'); // Modified from http://forum.unity3d.com/threads/toon-outline-but-with-diffuse-surface.24668/ var highlightMain = 'uniform float u_highlightSize;\n' + @@ -1793,7 +1793,7 @@ define([ ' n.x *= ' + projectionMatrixName + '[0][0];\n' + ' n.y *= ' + projectionMatrixName + '[1][1];\n' + ' vec4 clip = gl_Position;\n' + - ' clip.xy += n.xy * clip.w * u_highlightSize;\n' + + ' clip.xy += n.xy * clip.w * u_highlightSize / ' + viewportName + '.z * 2.0;\n' + ' gl_Position = clip;\n' + '}'; return renamedVS + '\n' + highlightMain; @@ -1886,8 +1886,15 @@ define([ // Get the projection matrix name. There is probably a better way to do this. var projectionMatrixUniformName = getUniformNameForSemantic(model, "PROJECTION"); + if (!projectionMatrixUniformName) { + projectionMatrixUniformName = "czm_projection"; + } + var viewportUniformName = getUniformNameForSemantic(model, "VIEWPORT"); + if (!viewportUniformName) { + viewportUniformName = "czm_viewport"; + } - var highlightVS = createHighlightVertexShaderSource(vs, projectionMatrixUniformName); + var highlightVS = createHighlightVertexShaderSource(vs, projectionMatrixUniformName, viewportUniformName); var highlightFS = 'uniform vec4 u_highlightColor;\n' + 'void main() \n' + From 36f046d76af636209e4f6e54c9e45a1f6d63fa82 Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Tue, 13 Sep 2016 13:15:56 -0400 Subject: [PATCH 018/396] Simplified highlight shader just using cesium builtins --- Source/Scene/Model.js | 54 ++++--------------------------------------- 1 file changed, 5 insertions(+), 49 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 386d4c25dd88..88f7d496dd2c 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -1782,7 +1782,7 @@ define([ return shader; } - function createHighlightVertexShaderSource(vertexShaderSource, projectionMatrixName, viewportName) { + function createHighlightVertexShaderSource(vertexShaderSource) { var renamedVS = ShaderSource.replaceMain(vertexShaderSource, 'czm_old_main'); // Modified from http://forum.unity3d.com/threads/toon-outline-but-with-diffuse-surface.24668/ var highlightMain = 'uniform float u_highlightSize;\n' + @@ -1790,49 +1790,15 @@ define([ '{ \n' + ' czm_old_main(); \n' + ' vec3 n = normalize(v_normal);\n' + - ' n.x *= ' + projectionMatrixName + '[0][0];\n' + - ' n.y *= ' + projectionMatrixName + '[1][1];\n' + + ' n.x *= czm_projection[0][0];\n' + + ' n.y *= czm_projection[1][1];\n' + ' vec4 clip = gl_Position;\n' + - ' clip.xy += n.xy * clip.w * u_highlightSize / ' + viewportName + '.z * 2.0;\n' + + ' clip.xy += n.xy * clip.w * u_highlightSize / czm_viewport.z * 2.0;\n' + ' gl_Position = clip;\n' + '}'; return renamedVS + '\n' + highlightMain; } - function getUniformNameForSemantic(model, semantic) { - var semanticUniformName = null; - for (var techniqueName in model.gltf.techniques) { - if (model.gltf.techniques.hasOwnProperty(techniqueName)) { - var technique = model.gltf.techniques[techniqueName]; - var semanticParameterName = ""; - for (var parameterName in technique.parameters) { - if (technique.parameters.hasOwnProperty(parameterName)) { - var parameter = technique.parameters[parameterName]; - if (parameter.semantic === semantic) { - semanticParameterName = parameterName; - break; - } - } - } - - for (var uniformName in technique.uniforms) { - if (technique.uniforms.hasOwnProperty(uniformName)) { - var paramName = technique.uniforms[uniformName]; - if (paramName === semanticParameterName) { - semanticUniformName = uniformName; - break; - } - } - } - - if (semanticUniformName) { - break; - } - } - } - return semanticUniformName; - } - function createProgram(id, model, context) { var programs = model.gltf.programs; var shaders = model._loadResources.shaders; @@ -1884,17 +1850,7 @@ define([ }); } - // Get the projection matrix name. There is probably a better way to do this. - var projectionMatrixUniformName = getUniformNameForSemantic(model, "PROJECTION"); - if (!projectionMatrixUniformName) { - projectionMatrixUniformName = "czm_projection"; - } - var viewportUniformName = getUniformNameForSemantic(model, "VIEWPORT"); - if (!viewportUniformName) { - viewportUniformName = "czm_viewport"; - } - - var highlightVS = createHighlightVertexShaderSource(vs, projectionMatrixUniformName, viewportUniformName); + var highlightVS = createHighlightVertexShaderSource(vs); var highlightFS = 'uniform vec4 u_highlightColor;\n' + 'void main() \n' + From 57eefa23563185ca3acb29e6593ca46eccf2f6aa Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Wed, 5 Oct 2016 11:30:21 -0400 Subject: [PATCH 019/396] Added event to Cesium3DTileset when all visible tiles are loaded --- Apps/Sandcastle/gallery/3D Tiles.html | 4 ++ Source/Scene/Cesium3DTileset.js | 56 +++++++++++++++++++++------ Specs/Cesium3DTilesTester.js | 2 +- Specs/Scene/Cesium3DTilesetSpec.js | 18 +++++++++ 4 files changed, 68 insertions(+), 12 deletions(-) diff --git a/Apps/Sandcastle/gallery/3D Tiles.html b/Apps/Sandcastle/gallery/3D Tiles.html index ff0c00d22f1a..bfe7309421f7 100644 --- a/Apps/Sandcastle/gallery/3D Tiles.html +++ b/Apps/Sandcastle/gallery/3D Tiles.html @@ -117,6 +117,10 @@ //console.log('Loading: requests: ' + numberOfPendingRequests + ', processing: ' + numberProcessing); }); + tileset.allVisibleTilesLoaded.addEventListener(function() { + //console.log('All visible tiles are loaded'); + }); + tileset.tileUnload.addEventListener(function(tile) { //console.log('Tile unloaded.') }); diff --git a/Source/Scene/Cesium3DTileset.js b/Source/Scene/Cesium3DTileset.js index e03a74847b9f..4e8fe707ceaa 100644 --- a/Source/Scene/Cesium3DTileset.js +++ b/Source/Scene/Cesium3DTileset.js @@ -185,6 +185,7 @@ define([ visited : 0, numberOfCommands : 0, // Loading stats + numberOfAttemptedRequests : 0, numberOfPendingRequests : 0, numberProcessing : 0, numberContentReady : 0, // Number of tiles with content loaded, does not include empty tiles @@ -287,6 +288,22 @@ define([ */ this.loadProgress = new Event(); + /** + * The event fired to indicate that all visible tiles are loaded. + *

+ * This event is fired at the end of the frame after the scene is rendered. + *

+ * + * @type {Event} + * @default new Event() + * + * @example + * city.allVisibleTilesLoaded.addEventListener(function() { + * console.log('All visible tiles are loaded'); + * }); + */ + this.allVisibleTilesLoaded = new Event(); + /** * The event fired to indicate that a tile's content was unloaded from the cache. *

@@ -352,15 +369,16 @@ define([ } function Cesium3DTilesetStatistics() { - this.selected = -1; - this.visited = -1; - this.numberOfCommands = -1; - this.numberOfPendingRequests = -1; - this.numberProcessing = -1; - this.numberContentReady = -1; - this.numberTotal = -1; - this.numberOfTilesStyled = -1; - this.numberOfFeaturesStyled = -1; + this.selected = 0; + this.visited = 0; + this.numberOfCommands = 0; + this.numberOfAttemptedRequests = 0; + this.numberOfPendingRequests = 0; + this.numberProcessing = 0; + this.numberContentReady = 0; + this.numberTotal = 0; + this.numberOfTilesStyled = 0; + this.numberOfFeaturesStyled = 0; } defineProperties(Cesium3DTileset.prototype, { @@ -865,13 +883,16 @@ define([ tile.requestContent(); + var stats = tileset._statistics; + if (!tile.contentUnloaded) { - var stats = tileset._statistics; ++stats.numberOfPendingRequests; var removeFunction = removeFromProcessingQueue(tileset, tile); tile.content.contentReadyToProcessPromise.then(addToProcessingQueue(tileset, tile)).otherwise(removeFunction); tile.content.readyPromise.then(removeFunction).otherwise(removeFunction); + } else { + ++stats.numberOfAttemptedRequests; } } @@ -1281,6 +1302,7 @@ define([ var stats = tileset._statistics; stats.visited = 0; stats.numberOfCommands = 0; + stats.numberOfAttemptedRequests = 0; stats.numberOfTilesStyled = 0; stats.numberOfFeaturesStyled = 0; } @@ -1297,6 +1319,7 @@ define([ (last.visited !== stats.visited || last.numberOfCommands !== stats.numberOfCommands || last.selected !== tileset._selectedTiles.length || + last.numberOfAttemptedRequests !== stats.numberOfAttemptedRequests || last.numberOfPendingRequests !== stats.numberOfPendingRequests || last.numberProcessing !== stats.numberProcessing || last.numberContentReady !== stats.numberContentReady || @@ -1326,6 +1349,7 @@ define([ // --- Cache/loading stats ' | Requests: ' + stats.numberOfPendingRequests + + ', Attempted: ' + stats.numberOfAttemptedRequests + ', Processing: ' + stats.numberProcessing + ', Content Ready: ' + stats.numberContentReady + // Total number of tiles includes tiles without content, so "Ready" may never reach @@ -1343,6 +1367,7 @@ define([ last.visited = stats.visited; last.numberOfCommands = stats.numberOfCommands; last.selected = tileset._selectedTiles.length; + last.numberOfAttemptedRequests = stats.numberOfAttemptedRequests; last.numberOfPendingRequests = stats.numberOfPendingRequests; last.numberProcessing = stats.numberProcessing; last.numberContentReady = stats.numberContentReady; @@ -1420,16 +1445,25 @@ define([ function raiseLoadProgressEvent(tileset, frameState) { var stats = tileset._statistics; + var numberOfAttemptedRequests = stats.numberOfAttemptedRequests; var numberOfPendingRequests = stats.numberOfPendingRequests; var numberProcessing = stats.numberProcessing; var lastNumberOfPendingRequest = stats.lastColor.numberOfPendingRequests; var lastNumberProcessing = stats.lastColor.numberProcessing; - if ((numberOfPendingRequests !== lastNumberOfPendingRequest) || (numberProcessing !== lastNumberProcessing)) { + var progressChanged = (numberOfPendingRequests !== lastNumberOfPendingRequest) || (numberProcessing !== lastNumberProcessing); + + if (progressChanged) { frameState.afterRender.push(function() { tileset.loadProgress.raiseEvent(numberOfPendingRequests, numberProcessing); }); } + + if (progressChanged && (numberOfPendingRequests === 0) && (numberProcessing === 0) && (numberOfAttemptedRequests === 0)) { + frameState.afterRender.push(function() { + tileset.allVisibleTilesLoaded.raiseEvent(); + }); + } } /////////////////////////////////////////////////////////////////////////// diff --git a/Specs/Cesium3DTilesTester.js b/Specs/Cesium3DTilesTester.js index dd0701710532..f5b8838f7f99 100644 --- a/Specs/Cesium3DTilesTester.js +++ b/Specs/Cesium3DTilesTester.js @@ -87,7 +87,7 @@ define([ return pollToPromise(function() { scene.renderForSpecs(); var stats = tileset._statistics; - return ((stats.numberOfPendingRequests === 0) && (stats.numberProcessing === 0)); + return ((stats.numberOfPendingRequests === 0) && (stats.numberProcessing === 0) && (stats.numberOfAttemptedRequests === 0)); }); }; diff --git a/Specs/Scene/Cesium3DTilesetSpec.js b/Specs/Scene/Cesium3DTilesetSpec.js index 18eeaf0b1923..a628503dac85 100644 --- a/Specs/Scene/Cesium3DTilesetSpec.js +++ b/Specs/Scene/Cesium3DTilesetSpec.js @@ -995,6 +995,24 @@ defineSuite([ }); }); + it('all visible tiles loaded event is raised', function() { + // Called first when the only the root is visible and it becomes loaded, and then again when + // the rest of the tileset is visible and all tiles are loaded. + var spyUpdate = jasmine.createSpy('listener'); + viewRootOnly(); + return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { + tileset.allVisibleTilesLoaded.addEventListener(spyUpdate); + return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + scene.renderForSpecs(); + viewAllTiles(); + return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + scene.renderForSpecs(); + expect(spyUpdate.calls.count()).toEqual(2); + }); + }); + }); + }); + it('tile visible event is raised', function() { viewRootOnly(); return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { From e0a8d9e70ffe46782a6661afca2ed050871a08c2 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 6 Oct 2016 14:05:13 -0400 Subject: [PATCH 020/396] Added viewComplete --- Apps/Sandcastle/gallery/3D Tiles.html | 4 +- Source/Scene/Cesium3DTileset.js | 84 ++++++++++++++++++++------- Specs/Cesium3DTilesTester.js | 22 ++++--- Specs/Scene/Cesium3DTilesetSpec.js | 80 ++++++++++++++----------- 4 files changed, 123 insertions(+), 67 deletions(-) diff --git a/Apps/Sandcastle/gallery/3D Tiles.html b/Apps/Sandcastle/gallery/3D Tiles.html index bfe7309421f7..cc3ede151ffb 100644 --- a/Apps/Sandcastle/gallery/3D Tiles.html +++ b/Apps/Sandcastle/gallery/3D Tiles.html @@ -117,8 +117,8 @@ //console.log('Loading: requests: ' + numberOfPendingRequests + ', processing: ' + numberProcessing); }); - tileset.allVisibleTilesLoaded.addEventListener(function() { - //console.log('All visible tiles are loaded'); + tileset.allTilesLoaded.addEventListener(function() { + //console.log('All tiles are loaded'); }); tileset.tileUnload.addEventListener(function(tile) { diff --git a/Source/Scene/Cesium3DTileset.js b/Source/Scene/Cesium3DTileset.js index 4e8fe707ceaa..341a26acca8f 100644 --- a/Source/Scene/Cesium3DTileset.js +++ b/Source/Scene/Cesium3DTileset.js @@ -289,7 +289,7 @@ define([ this.loadProgress = new Event(); /** - * The event fired to indicate that all visible tiles are loaded. + * The event fired to indicate that all tiles in view are loaded. *

* This event is fired at the end of the frame after the scene is rendered. *

@@ -298,11 +298,11 @@ define([ * @default new Event() * * @example - * city.allVisibleTilesLoaded.addEventListener(function() { - * console.log('All visible tiles are loaded'); + * city.allTilesLoaded.addEventListener(function() { + * console.log('All tiles are loaded'); * }); */ - this.allVisibleTilesLoaded = new Event(); + this.allTilesLoaded = new Event(); /** * The event fired to indicate that a tile's content was unloaded from the cache. @@ -352,20 +352,9 @@ define([ */ this.tileVisible = new Event(); + this._state = TilesetState.NEEDS_LOAD; + this._ready = false; this._readyPromise = when.defer(); - - var that = this; - - this.loadTileset(tilesetUrl).then(function(data) { - var tilesetJson = data.tilesetJson; - that._asset = tilesetJson.asset; - that._properties = tilesetJson.properties; - that._geometricError = tilesetJson.geometricError; - that._root = data.root; - that._readyPromise.resolve(that); - }).otherwise(function(error) { - that._readyPromise.reject(error); - }); } function Cesium3DTilesetStatistics() { @@ -457,7 +446,7 @@ define([ */ ready : { get : function() { - return defined(this._root); + return this._ready; } }, @@ -489,6 +478,23 @@ define([ } }, + /** + * When true, all tiles in view are are loaded. + * + * @memberof Cesium3DTileset.prototype + * + * @type {Boolean} + * @readonly + * + * @default false + */ + viewComplete : { + get : function() { + var stats = this._statistics; + return this.ready && (stats.numberOfPendingRequests === 0) && (stats.numberProcessing === 0) && (stats.numberOfAttemptedRequests === 0); + } + }, + /** * The url to a tileset.json file or to a directory containing a tileset.json file. * @@ -1445,7 +1451,6 @@ define([ function raiseLoadProgressEvent(tileset, frameState) { var stats = tileset._statistics; - var numberOfAttemptedRequests = stats.numberOfAttemptedRequests; var numberOfPendingRequests = stats.numberOfPendingRequests; var numberProcessing = stats.numberProcessing; var lastNumberOfPendingRequest = stats.lastColor.numberOfPendingRequests; @@ -1459,9 +1464,9 @@ define([ }); } - if (progressChanged && (numberOfPendingRequests === 0) && (numberProcessing === 0) && (numberOfAttemptedRequests === 0)) { + if (progressChanged && tileset.viewComplete) { frameState.afterRender.push(function() { - tileset.allVisibleTilesLoaded.raiseEvent(); + tileset.allTilesLoaded.raiseEvent(); }); } } @@ -1491,6 +1496,26 @@ define([ /////////////////////////////////////////////////////////////////////////// + var TilesetState = { + NEEDS_LOAD : 0, + LOADING : 1, + LOADED : 2, + FAILED : 3 + }; + + function loadTileset(tileset) { + tileset.loadTileset(tileset._tilesetUrl).then(function(data) { + var tilesetJson = data.tilesetJson; + tileset._asset = tilesetJson.asset; + tileset._properties = tilesetJson.properties; + tileset._geometricError = tilesetJson.geometricError; + tileset._root = data.root; + }).otherwise(function(error) { + tileset._state = TilesetState.FAILED; + tileset._readyPromise.reject(error); + }); + } + /** * Called when {@link Viewer} or {@link CesiumWidget} render the scene to * get the draw commands needed to render this primitive. @@ -1502,8 +1527,23 @@ define([ * @exception {DeveloperError} The tileset must be 3D Tiles version 0.0. See https://github.com/AnalyticalGraphicsInc/3d-tiles#spec-status */ Cesium3DTileset.prototype.update = function(frameState) { + if (!this._ready) { + var that = this; + if (this._state === TilesetState.NEEDS_LOAD) { + this._state = TilesetState.LOADING; + loadTileset(this); + } + if ((this._state === TilesetState.LOADING) && defined(this._root)) { + this._state = TilesetState.LOADED; + this._ready = true; + frameState.afterRender.push(function() { + that._readyPromise.resolve(that); + }); + } + } + // TODO: Support 2D and CV - if (!this.show || !defined(this._root) || (frameState.mode !== SceneMode.SCENE3D)) { + if (!this.show || !this._ready || (frameState.mode !== SceneMode.SCENE3D)) { return; } diff --git a/Specs/Cesium3DTilesTester.js b/Specs/Cesium3DTilesTester.js index f5b8838f7f99..02a814b9b761 100644 --- a/Specs/Cesium3DTilesTester.js +++ b/Specs/Cesium3DTilesTester.js @@ -83,11 +83,21 @@ define([ expectRender(scene, tileset); }; - Cesium3DTilesTester.waitForPendingRequests = function(scene, tileset) { + Cesium3DTilesTester.waitForViewComplete = function(scene, tileset) { return pollToPromise(function() { scene.renderForSpecs(); - var stats = tileset._statistics; - return ((stats.numberOfPendingRequests === 0) && (stats.numberProcessing === 0) && (stats.numberOfAttemptedRequests === 0)); + return tileset.viewComplete; + }).then(function() { + return tileset; + }); + }; + + Cesium3DTilesTester.waitForReady = function(scene, tileset) { + return pollToPromise(function() { + scene.renderForSpecs(); + return tileset.ready; + }).then(function() { + return tileset; }); }; @@ -97,11 +107,7 @@ define([ url : url })); - return tileset.readyPromise.then(function() { - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { - return tileset; - }); - }); + return Cesium3DTilesTester.waitForViewComplete(scene, tileset); }; Cesium3DTilesTester.loadTileExpectError = function(scene, arrayBuffer, type) { diff --git a/Specs/Scene/Cesium3DTilesetSpec.js b/Specs/Scene/Cesium3DTilesetSpec.js index a628503dac85..af959f3ca3b0 100644 --- a/Specs/Scene/Cesium3DTilesetSpec.js +++ b/Specs/Scene/Cesium3DTilesetSpec.js @@ -135,7 +135,7 @@ defineSuite([ url : 'invalid' })); scene.renderForSpecs(); - return tileset.readyPromise.then(function(tileset) { + return tileset.readyPromise.then(function() { fail('should not resolve'); }).otherwise(function(error) { expect(tileset.ready).toEqual(false); @@ -155,8 +155,7 @@ defineSuite([ var tileset = scene.primitives.add(new Cesium3DTileset({ url : uri })); - scene.renderForSpecs(); - return tileset.readyPromise.then(function(tileset) { + return tileset.readyPromise.then(function() { fail('should not resolve'); }).otherwise(function(error) { expect(tileset.ready).toEqual(false); @@ -261,7 +260,7 @@ defineSuite([ expect(stats.numberOfPendingRequests).toEqual(4); expect(stats.numberProcessing).toEqual(0); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { expect(stats.numberOfPendingRequests).toEqual(0); expect(stats.numberProcessing).toEqual(0); @@ -301,23 +300,22 @@ defineSuite([ var tileset = scene.primitives.add(new Cesium3DTileset({ url : tilesetUrl })); - scene.renderForSpecs(); - return tileset.readyPromise.then(function(tileset) { - // Verify initial values - var stats = tileset._statistics; - expect(stats.visited).toEqual(0); - expect(stats.numberOfCommands).toEqual(0); - expect(stats.numberOfPendingRequests).toEqual(0); - expect(stats.numberProcessing).toEqual(0); - // Update and check that root tile is requested - scene.renderForSpecs(); + // Verify initial values + var stats = tileset._statistics; + expect(stats.visited).toEqual(0); + expect(stats.numberOfCommands).toEqual(0); + expect(stats.numberOfPendingRequests).toEqual(0); + expect(stats.numberProcessing).toEqual(0); + + return Cesium3DTilesTester.waitForReady(scene, tileset).then(function() { + // Check that root tile is requested expect(stats.visited).toEqual(0); expect(stats.numberOfCommands).toEqual(0); expect(stats.numberOfPendingRequests).toEqual(1); expect(stats.numberProcessing).toEqual(0); - // Update again and check that child tiles are now requested + // Update and check that child tiles are now requested scene.renderForSpecs(); expect(stats.visited).toEqual(1); // Root is visited expect(stats.numberOfCommands).toEqual(0); @@ -325,7 +323,7 @@ defineSuite([ expect(stats.numberProcessing).toEqual(0); // Wait for all tiles to load and check that they are all visited and rendered - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.visited).toEqual(5); expect(stats.numberOfCommands).toEqual(5); @@ -554,7 +552,7 @@ defineSuite([ expect(stats.visited).toEqual(1); // Visits root only, child tiles aren't ready expect(stats.numberOfCommands).toEqual(1); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { // Even though we are only looking at the lower-left tile, all child tiles are loaded scene.renderForSpecs(); expect(stats.visited).toEqual(2); // Only visible tiles are visited - root and ll @@ -591,7 +589,7 @@ defineSuite([ expect(stats.visited).toEqual(1); // Visits root only, ll (lower-left child) isn't ready expect(stats.numberOfCommands).toEqual(1); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.visited).toEqual(2); // Visits root and ll expect(stats.numberOfCommands).toEqual(1); // ll is the only visible child and is ready, so it replaces root @@ -602,7 +600,7 @@ defineSuite([ expect(stats.visited).toEqual(2); // Visits root and ll expect(stats.numberOfCommands).toEqual(2); // Now other children are visible but not ready. Render root and any visible ready children (only ll) - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.visited).toEqual(5); // Visits root and all children expect(stats.numberOfCommands).toEqual(4); // Renders children, root is replaced because all visible children are ready @@ -669,7 +667,7 @@ defineSuite([ expect(stats.numberOfCommands).toEqual(1); // Render root expect(stats.numberOfPendingRequests).toEqual(4); // Loading grandchildren - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(4); // Render children }); @@ -695,14 +693,14 @@ defineSuite([ var root = tileset._root; expect(root.descendantsWithContent).toBeDefined(); expect(root.descendantsWithContent.length).toEqual(2); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForViewComplete(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.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(2); // Renders two content tiles }); @@ -737,7 +735,7 @@ defineSuite([ expect(stats.numberOfCommands).toEqual(1); // Render root expect(stats.numberOfPendingRequests).toEqual(4); // Loading child content tiles - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { scene.renderForSpecs(); expect(root.selected).toEqual(false); expect(stats.numberOfCommands).toEqual(4); // Render child content tiles @@ -912,7 +910,6 @@ defineSuite([ it('debugShowViewerRequestVolume', function() { return Cesium3DTilesTester.loadTileset(scene, tilesetWithViewerRequestVolumeUrl).then(function(tileset) { - console.log('start'); tileset.debugShowViewerRequestVolume = true; scene.renderForSpecs(); var stats = tileset._statistics; @@ -987,7 +984,7 @@ defineSuite([ return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { tileset.loadProgress.addEventListener(spyUpdate); viewRootOnly(); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { scene.renderForSpecs(); expect(spyUpdate.calls.count()).toEqual(3); expect(spyUpdate.calls.allArgs()).toEqual(results); @@ -995,17 +992,30 @@ defineSuite([ }); }); - it('all visible tiles loaded event is raised', function() { + it('view complete', function() { + var tileset = scene.primitives.add(new Cesium3DTileset({ + url : tilesetUrl + })); + expect(tileset.viewComplete).toBe(false); + return Cesium3DTilesTester.waitForReady(scene, tileset).then(function() { + expect(tileset.viewComplete).toBe(false); + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + expect(tileset.viewComplete).toBe(true); + }); + }); + }); + + it('all tiles loaded event is raised', function() { // Called first when the only the root is visible and it becomes loaded, and then again when // the rest of the tileset is visible and all tiles are loaded. var spyUpdate = jasmine.createSpy('listener'); viewRootOnly(); return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { - tileset.allVisibleTilesLoaded.addEventListener(spyUpdate); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + tileset.allTilesLoaded.addEventListener(spyUpdate); + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { scene.renderForSpecs(); viewAllTiles(); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { scene.renderForSpecs(); expect(spyUpdate.calls.count()).toEqual(2); }); @@ -1363,7 +1373,7 @@ defineSuite([ // Zoom back in so all four children are re-requested. viewAllTiles(); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(5); expect(stats.numberContentReady).toEqual(5); // Five loaded tiles @@ -1395,7 +1405,7 @@ defineSuite([ // Zoom back in so the two children are re-requested. viewAllTiles(); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(5); expect(stats.numberContentReady).toEqual(5); // Five loaded tiles @@ -1424,7 +1434,7 @@ defineSuite([ // Reset camera so all tiles are reloaded viewAllTiles(); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(5); expect(stats.numberContentReady).toEqual(5); @@ -1456,7 +1466,7 @@ defineSuite([ // Reset camera so all tiles are reloaded viewAllTiles(); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(5); expect(stats.numberContentReady).toEqual(5); @@ -1488,7 +1498,7 @@ defineSuite([ // Reset camera so all tiles are reloaded viewAllTiles(); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(4); expect(stats.numberContentReady).toEqual(4); @@ -1525,7 +1535,7 @@ defineSuite([ // Zoom back in so the four children are re-requested. viewAllTiles(); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(4); expect(stats.numberContentReady).toEqual(5); From 23fc517590b131789cc54199a6971449549b009f Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 10 Oct 2016 10:56:49 -0400 Subject: [PATCH 021/396] Simplify --- Source/Scene/Cesium3DTileset.js | 49 +++++++++++---------------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/Source/Scene/Cesium3DTileset.js b/Source/Scene/Cesium3DTileset.js index 341a26acca8f..16e7f07ff9c0 100644 --- a/Source/Scene/Cesium3DTileset.js +++ b/Source/Scene/Cesium3DTileset.js @@ -352,9 +352,19 @@ define([ */ this.tileVisible = new Event(); - this._state = TilesetState.NEEDS_LOAD; this._ready = false; this._readyPromise = when.defer(); + + var that = this; + this.loadTileset(tilesetUrl).then(function(data) { + var tilesetJson = data.tilesetJson; + that._asset = tilesetJson.asset; + that._properties = tilesetJson.properties; + that._geometricError = tilesetJson.geometricError; + that._root = data.root; + }).otherwise(function(error) { + that._readyPromise.reject(error); + }); } function Cesium3DTilesetStatistics() { @@ -1496,26 +1506,6 @@ define([ /////////////////////////////////////////////////////////////////////////// - var TilesetState = { - NEEDS_LOAD : 0, - LOADING : 1, - LOADED : 2, - FAILED : 3 - }; - - function loadTileset(tileset) { - tileset.loadTileset(tileset._tilesetUrl).then(function(data) { - var tilesetJson = data.tilesetJson; - tileset._asset = tilesetJson.asset; - tileset._properties = tilesetJson.properties; - tileset._geometricError = tilesetJson.geometricError; - tileset._root = data.root; - }).otherwise(function(error) { - tileset._state = TilesetState.FAILED; - tileset._readyPromise.reject(error); - }); - } - /** * Called when {@link Viewer} or {@link CesiumWidget} render the scene to * get the draw commands needed to render this primitive. @@ -1527,19 +1517,12 @@ define([ * @exception {DeveloperError} The tileset must be 3D Tiles version 0.0. See https://github.com/AnalyticalGraphicsInc/3d-tiles#spec-status */ Cesium3DTileset.prototype.update = function(frameState) { - if (!this._ready) { + if (!this._ready && defined(this._root)) { var that = this; - if (this._state === TilesetState.NEEDS_LOAD) { - this._state = TilesetState.LOADING; - loadTileset(this); - } - if ((this._state === TilesetState.LOADING) && defined(this._root)) { - this._state = TilesetState.LOADED; - this._ready = true; - frameState.afterRender.push(function() { - that._readyPromise.resolve(that); - }); - } + this._ready = true; + frameState.afterRender.push(function() { + that._readyPromise.resolve(that); + }); } // TODO: Support 2D and CV From e99b8d4137d082a50ee379a460458103b5f2be91 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 10 Oct 2016 11:11:32 -0400 Subject: [PATCH 022/396] Change descriptions --- Source/Scene/Cesium3DTileset.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Source/Scene/Cesium3DTileset.js b/Source/Scene/Cesium3DTileset.js index 16e7f07ff9c0..94555d9d44a5 100644 --- a/Source/Scene/Cesium3DTileset.js +++ b/Source/Scene/Cesium3DTileset.js @@ -289,7 +289,8 @@ define([ this.loadProgress = new Event(); /** - * The event fired to indicate that all tiles in view are loaded. + * The event fired to indicate that all tiles that meet the screen space error this frame are loaded. The tileset + * is completely loaded for this view. *

* This event is fired at the end of the frame after the scene is rendered. *

@@ -301,6 +302,8 @@ define([ * city.allTilesLoaded.addEventListener(function() { * console.log('All tiles are loaded'); * }); + * + * @see Cesium3DTileset#viewComplete */ this.allTilesLoaded = new Event(); @@ -489,7 +492,8 @@ define([ }, /** - * When true, all tiles in view are are loaded. + * When true, all tiles that meet the screen space error this frame are loaded. The tileset is + * completely loaded for this view. * * @memberof Cesium3DTileset.prototype * @@ -497,6 +501,8 @@ define([ * @readonly * * @default false + * + * @see Cesium3DTileset#allTilesLoaded */ viewComplete : { get : function() { From be85f12bb3e48af26b8ac8d6d4ad205bc397418b Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 10 Oct 2016 11:18:49 -0400 Subject: [PATCH 023/396] Rename viewComplete to tilesLoaded --- Source/Scene/Cesium3DTileset.js | 6 ++-- Specs/Cesium3DTilesTester.js | 6 ++-- Specs/Scene/Cesium3DTilesetSpec.js | 46 +++++++++++++++--------------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Source/Scene/Cesium3DTileset.js b/Source/Scene/Cesium3DTileset.js index 94555d9d44a5..607dcc59d4e0 100644 --- a/Source/Scene/Cesium3DTileset.js +++ b/Source/Scene/Cesium3DTileset.js @@ -303,7 +303,7 @@ define([ * console.log('All tiles are loaded'); * }); * - * @see Cesium3DTileset#viewComplete + * @see Cesium3DTileset#tilesLoaded */ this.allTilesLoaded = new Event(); @@ -504,7 +504,7 @@ define([ * * @see Cesium3DTileset#allTilesLoaded */ - viewComplete : { + tilesLoaded : { get : function() { var stats = this._statistics; return this.ready && (stats.numberOfPendingRequests === 0) && (stats.numberProcessing === 0) && (stats.numberOfAttemptedRequests === 0); @@ -1480,7 +1480,7 @@ define([ }); } - if (progressChanged && tileset.viewComplete) { + if (progressChanged && tileset.tilesLoaded) { frameState.afterRender.push(function() { tileset.allTilesLoaded.raiseEvent(); }); diff --git a/Specs/Cesium3DTilesTester.js b/Specs/Cesium3DTilesTester.js index 02a814b9b761..1e1d3cb5a24d 100644 --- a/Specs/Cesium3DTilesTester.js +++ b/Specs/Cesium3DTilesTester.js @@ -83,10 +83,10 @@ define([ expectRender(scene, tileset); }; - Cesium3DTilesTester.waitForViewComplete = function(scene, tileset) { + Cesium3DTilesTester.waitForTilesLoaded = function(scene, tileset) { return pollToPromise(function() { scene.renderForSpecs(); - return tileset.viewComplete; + return tileset.tilesLoaded; }).then(function() { return tileset; }); @@ -107,7 +107,7 @@ define([ url : url })); - return Cesium3DTilesTester.waitForViewComplete(scene, tileset); + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset); }; Cesium3DTilesTester.loadTileExpectError = function(scene, arrayBuffer, type) { diff --git a/Specs/Scene/Cesium3DTilesetSpec.js b/Specs/Scene/Cesium3DTilesetSpec.js index af959f3ca3b0..456dc0b44844 100644 --- a/Specs/Scene/Cesium3DTilesetSpec.js +++ b/Specs/Scene/Cesium3DTilesetSpec.js @@ -260,7 +260,7 @@ defineSuite([ expect(stats.numberOfPendingRequests).toEqual(4); expect(stats.numberProcessing).toEqual(0); - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { expect(stats.numberOfPendingRequests).toEqual(0); expect(stats.numberProcessing).toEqual(0); @@ -323,7 +323,7 @@ defineSuite([ expect(stats.numberProcessing).toEqual(0); // Wait for all tiles to load and check that they are all visited and rendered - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.visited).toEqual(5); expect(stats.numberOfCommands).toEqual(5); @@ -552,7 +552,7 @@ defineSuite([ expect(stats.visited).toEqual(1); // Visits root only, child tiles aren't ready expect(stats.numberOfCommands).toEqual(1); - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { // Even though we are only looking at the lower-left tile, all child tiles are loaded scene.renderForSpecs(); expect(stats.visited).toEqual(2); // Only visible tiles are visited - root and ll @@ -589,7 +589,7 @@ defineSuite([ expect(stats.visited).toEqual(1); // Visits root only, ll (lower-left child) isn't ready expect(stats.numberOfCommands).toEqual(1); - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.visited).toEqual(2); // Visits root and ll expect(stats.numberOfCommands).toEqual(1); // ll is the only visible child and is ready, so it replaces root @@ -600,7 +600,7 @@ defineSuite([ expect(stats.visited).toEqual(2); // Visits root and ll expect(stats.numberOfCommands).toEqual(2); // Now other children are visible but not ready. Render root and any visible ready children (only ll) - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.visited).toEqual(5); // Visits root and all children expect(stats.numberOfCommands).toEqual(4); // Renders children, root is replaced because all visible children are ready @@ -667,7 +667,7 @@ defineSuite([ expect(stats.numberOfCommands).toEqual(1); // Render root expect(stats.numberOfPendingRequests).toEqual(4); // Loading grandchildren - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(4); // Render children }); @@ -693,14 +693,14 @@ defineSuite([ var root = tileset._root; expect(root.descendantsWithContent).toBeDefined(); expect(root.descendantsWithContent.length).toEqual(2); - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + 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.waitForViewComplete(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(2); // Renders two content tiles }); @@ -735,7 +735,7 @@ defineSuite([ expect(stats.numberOfCommands).toEqual(1); // Render root expect(stats.numberOfPendingRequests).toEqual(4); // Loading child content tiles - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(root.selected).toEqual(false); expect(stats.numberOfCommands).toEqual(4); // Render child content tiles @@ -984,7 +984,7 @@ defineSuite([ return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { tileset.loadProgress.addEventListener(spyUpdate); viewRootOnly(); - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(spyUpdate.calls.count()).toEqual(3); expect(spyUpdate.calls.allArgs()).toEqual(results); @@ -992,15 +992,15 @@ defineSuite([ }); }); - it('view complete', function() { + it('tilesLoaded', function() { var tileset = scene.primitives.add(new Cesium3DTileset({ url : tilesetUrl })); - expect(tileset.viewComplete).toBe(false); + expect(tileset.tilesLoaded).toBe(false); return Cesium3DTilesTester.waitForReady(scene, tileset).then(function() { - expect(tileset.viewComplete).toBe(false); - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { - expect(tileset.viewComplete).toBe(true); + expect(tileset.tilesLoaded).toBe(false); + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { + expect(tileset.tilesLoaded).toBe(true); }); }); }); @@ -1012,10 +1012,10 @@ defineSuite([ viewRootOnly(); return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { tileset.allTilesLoaded.addEventListener(spyUpdate); - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); viewAllTiles(); - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(spyUpdate.calls.count()).toEqual(2); }); @@ -1373,7 +1373,7 @@ defineSuite([ // Zoom back in so all four children are re-requested. viewAllTiles(); - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(5); expect(stats.numberContentReady).toEqual(5); // Five loaded tiles @@ -1405,7 +1405,7 @@ defineSuite([ // Zoom back in so the two children are re-requested. viewAllTiles(); - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(5); expect(stats.numberContentReady).toEqual(5); // Five loaded tiles @@ -1434,7 +1434,7 @@ defineSuite([ // Reset camera so all tiles are reloaded viewAllTiles(); - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(5); expect(stats.numberContentReady).toEqual(5); @@ -1466,7 +1466,7 @@ defineSuite([ // Reset camera so all tiles are reloaded viewAllTiles(); - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(5); expect(stats.numberContentReady).toEqual(5); @@ -1498,7 +1498,7 @@ defineSuite([ // Reset camera so all tiles are reloaded viewAllTiles(); - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(4); expect(stats.numberContentReady).toEqual(4); @@ -1535,7 +1535,7 @@ defineSuite([ // Zoom back in so the four children are re-requested. viewAllTiles(); - return Cesium3DTilesTester.waitForViewComplete(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(4); expect(stats.numberContentReady).toEqual(5); From d2676b8b6ae996a956b5166ff8860266cd8c3aa0 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Mon, 10 Oct 2016 11:37:46 -0400 Subject: [PATCH 024/396] Style --- Source/Scene/Cesium3DTileset.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Scene/Cesium3DTileset.js b/Source/Scene/Cesium3DTileset.js index 607dcc59d4e0..92b4b99b0bce 100644 --- a/Source/Scene/Cesium3DTileset.js +++ b/Source/Scene/Cesium3DTileset.js @@ -1524,8 +1524,8 @@ define([ */ Cesium3DTileset.prototype.update = function(frameState) { if (!this._ready && defined(this._root)) { - var that = this; this._ready = true; + var that = this; frameState.afterRender.push(function() { that._readyPromise.resolve(that); }); From af86c9a0d461771b5b7c78a490b26dd08e08437e Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Mon, 17 Oct 2016 12:12:02 -0400 Subject: [PATCH 025/396] Defaulting highlight to true in 3D Models Outline example. Changed highlightSize to 2.0 instead of 2 --- Apps/Sandcastle/gallery/development/3D Models Outline.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Apps/Sandcastle/gallery/development/3D Models Outline.html b/Apps/Sandcastle/gallery/development/3D Models Outline.html index cb9138fa284b..2f1151f2322e 100644 --- a/Apps/Sandcastle/gallery/development/3D Models Outline.html +++ b/Apps/Sandcastle/gallery/development/3D Models Outline.html @@ -58,8 +58,8 @@ // The viewModel tracks the state of our mini application. var viewModel = { - highlight: false, - highlightSize: 2 + highlight: true, + highlightSize: 2.0 }; // Convert the viewModel members into knockout observables. From 817da193e904faf96466b704291e6ebb23249c0a Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Mon, 17 Oct 2016 12:17:42 -0400 Subject: [PATCH 026/396] Changed highlightColor default to default constructed color and highlightSize to 2.0 --- Source/DataSources/ModelGraphics.js | 10 +++++----- Source/DataSources/ModelVisualizer.js | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Source/DataSources/ModelGraphics.js b/Source/DataSources/ModelGraphics.js index 7f1ccd85749d..40c148fe6576 100644 --- a/Source/DataSources/ModelGraphics.js +++ b/Source/DataSources/ModelGraphics.js @@ -50,8 +50,8 @@ define([ * @param {Property} [options.shadows=ShadowMode.ENABLED] An enum Property specifying whether the model casts or receives shadows from each light source. * @param {Property} [options.heightReference=HeightReference.NONE] A Property specifying what the height is relative to. * @param {Property} [options.highlight=false] Whether to highlight the model using an outline - * @param {Property} [options.highlightColor=Color(1.0, 0.0, 0.0, 1.0)] The highlight color for the outline. - * @param {Property} [options.highlightSize=0.002] The highlight color for the outline. + * @param {Property} [options.highlightColor=new Color())] The highlight color for the outline. + * @param {Property} [options.highlightSize=2] The size of the highlight in pixels * @param {Property} [options.distanceDisplayCondition] A Property specifying at what distance from the camera that this model will be displayed. * * @see {@link http://cesiumjs.org/2014/03/03/Cesium-3D-Models-Tutorial/|3D Models Tutorial} @@ -199,15 +199,15 @@ define([ * Gets or sets the Color Property specifying the highlight color of this model. * @memberof ModelGraphics.prototype * @type {Property} - * @default Color(1.0,0.0,1.0,1.0) + * @default Color() */ highlightColor: createPropertyDescriptor('highlightColor'), /** - * Gets or sets the float Property specifying the size of the highlight of this model. + * Gets or sets the float Property specifying the size of the highlight of this model in pixels * @memberof ModelGraphics.prototype * @type {Property} - * @default 0.002 + * @default 2.0 */ highlightSize: createPropertyDescriptor('highlightSize'), diff --git a/Source/DataSources/ModelVisualizer.js b/Source/DataSources/ModelVisualizer.js index c63e91d8ce84..dac71ec9a48a 100644 --- a/Source/DataSources/ModelVisualizer.js +++ b/Source/DataSources/ModelVisualizer.js @@ -34,8 +34,8 @@ define([ var defaultIncrementallyLoadTextures = true; var defaultShadows = ShadowMode.ENABLED; var defaultHeightReference = HeightReference.NONE; - var defaultHighlightColor = new Color(1.0, 0.0, 0.0, 1.0); - var defaultHighlightSize = 0.002; + var defaultHighlightColor = new Color(); + var defaultHighlightSize = 2.0; var defaultHighlight = false; var modelMatrixScratch = new Matrix4(); From a492379eb4b27d60132aef7a0ad0a8c9c890960a Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Mon, 17 Oct 2016 12:18:47 -0400 Subject: [PATCH 027/396] Changed hilightSize default to 2.0 in Model.js and highlightColor to default constructed Color --- Source/Scene/Model.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 32b666d7d8a3..24aef2f5ed34 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -412,21 +412,20 @@ define([ /** * The highlight color * - * @type {Cartesian4} + * @type {Color} * - * @default Color(1.0, 0.0, 0.0, 1.0) + * @default Color() */ - this.highlightColor = defaultValue(options.highlightColor, new Color(1.0, 0.0, 0.0, 1.0)); + this.highlightColor = defaultValue(options.highlightColor, new Color()); /** * The size of the highlight * * @type {Float} * - * @default 0.002 + * @default 2.0 */ - this.highlightSize = 0.002; - + this.highlightSize = 2.0; /** * The 4x4 transformation matrix that transforms the model from model to world coordinates. From 20a71493aca30c37d46249029f83893cbde80be5 Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Mon, 17 Oct 2016 12:25:10 -0400 Subject: [PATCH 028/396] Removed extra whitespace --- Source/Scene/Model.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 24aef2f5ed34..5ec798d8aabf 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -1823,12 +1823,12 @@ define([ } var highlightVS = createHighlightVertexShaderSource(vs); - var highlightFS = 'uniform vec4 u_highlightColor;\n' + - 'void main() \n' + - '{ \n' + - ' gl_FragColor = u_highlightColor;\n' + - '}'; + 'void main() \n' + + '{ \n' + + ' gl_FragColor = u_highlightColor;\n' + + '}'; + model._rendererResources.highlightPrograms[id] = ShaderProgram.fromCache({ context : context, vertexShaderSource : highlightVS, From d98e0ea90a807fd5335e7ac262a1dd699b466e2b Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Mon, 17 Oct 2016 12:46:55 -0400 Subject: [PATCH 029/396] Not setting face in highlightRS, just enabled: false --- Source/Scene/Model.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 5ec798d8aabf..492772a07d11 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -3065,8 +3065,7 @@ define([ } }; highlightRS.cull = { - enabled : false, - face : WebGLConstants.FRONT + enabled : false }; highlightRS.depthTest = false; From aa62d4d61a1b0362c24b264c779a0efb31e13bb8 Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Mon, 17 Oct 2016 12:51:00 -0400 Subject: [PATCH 030/396] Whitespace --- Source/Scene/Model.js | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 492772a07d11..8150fc93218c 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -3076,21 +3076,20 @@ define([ uniformMap.u_highlightSize = createHighlightSizeFunction(model); var highlightCommand = new DrawCommand({ - boundingVolume : new BoundingSphere(), // updated in update() - cull : model.cull, - modelMatrix : new Matrix4(), // computed in update() - primitiveType : primitive.mode, - vertexArray : vertexArray, - count : count, - offset : offset, - shaderProgram : rendererhighlightPrograms[technique.program], - uniformMap : uniformMap, - renderState : highlightRS, - owner : owner, - pass : isTranslucent ? Pass.TRANSLUCENT : Pass.OPAQUE + boundingVolume : new BoundingSphere(), // updated in update() + cull : model.cull, + modelMatrix : new Matrix4(), // computed in update() + primitiveType : primitive.mode, + vertexArray : vertexArray, + count : count, + offset : offset, + shaderProgram : rendererhighlightPrograms[technique.program], + uniformMap : uniformMap, + renderState : highlightRS, + owner : owner, + pass : isTranslucent ? Pass.TRANSLUCENT : Pass.OPAQUE }); - var pickCommand; if (allowPicking) { From c2a8ed17af4c70f93cecf558357fcaf216bdd4e6 Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Mon, 17 Oct 2016 12:53:42 -0400 Subject: [PATCH 031/396] Whitespace --- Source/Scene/Model.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 8150fc93218c..f6e2816e7a73 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -3158,7 +3158,6 @@ define([ pickCommand2D : pickCommand2D, highlightCommand: highlightCommand, highlightCommand2D: highlightCommand2D - }; runtimeNode.commands.push(nodeCommand); nodeCommands.push(nodeCommand); @@ -3359,7 +3358,6 @@ define([ Matrix4.clone(command.modelMatrix, highlightCommand.modelMatrix); BoundingSphere.clone(command.boundingVolume, highlightCommand.boundingVolume); - // If the model crosses the IDL in 2D, it will be drawn in one viewport, but part of it // will be clipped by the viewport. We create a second command that translates the model // model matrix to the opposite side of the map so the part that was clipped in one viewport From df36205e518c2dfde27c6568e24c2b06e958b04c Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Mon, 17 Oct 2016 13:13:55 -0400 Subject: [PATCH 032/396] Enabling ALPHA_BLEND blending on highlight state --- Apps/Sandcastle/gallery/development/3D Models Outline.html | 2 +- Source/Scene/Model.js | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Apps/Sandcastle/gallery/development/3D Models Outline.html b/Apps/Sandcastle/gallery/development/3D Models Outline.html index 2f1151f2322e..26658bb3cc08 100644 --- a/Apps/Sandcastle/gallery/development/3D Models Outline.html +++ b/Apps/Sandcastle/gallery/development/3D Models Outline.html @@ -130,7 +130,7 @@ Sandcastle.addToolbarButton('Change Highlight Color', function() { entity.model.highlightColor = new Cesium.ConstantProperty(Cesium.Color.fromRandom({ - alpha : 1.0 + alpha : 0.3 })); }); diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index f6e2816e7a73..99b3a9380e25 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -50,6 +50,7 @@ define([ '../ThirdParty/Uri', '../ThirdParty/when', './getBinaryAccessor', + './BlendingState', './HeightReference', './ModelAnimationCache', './ModelAnimationCollection', @@ -111,6 +112,7 @@ define([ Uri, when, getBinaryAccessor, + BlendingState, HeightReference, ModelAnimationCache, ModelAnimationCollection, @@ -3068,6 +3070,7 @@ define([ enabled : false }; highlightRS.depthTest = false; + highlightRS.blending = BlendingState.ALPHA_BLEND; highlightRS = RenderState.fromCache(highlightRS); From fa3c2e9d3b9b50474e6c92e749458766e211a2c3 Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Mon, 17 Oct 2016 13:31:47 -0400 Subject: [PATCH 033/396] Added opacity slider to 3D Models Outline demo. Outline.html --- .../development/3D Models Outline.html | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/Apps/Sandcastle/gallery/development/3D Models Outline.html b/Apps/Sandcastle/gallery/development/3D Models Outline.html index 26658bb3cc08..268ba40d1fc4 100644 --- a/Apps/Sandcastle/gallery/development/3D Models Outline.html +++ b/Apps/Sandcastle/gallery/development/3D Models Outline.html @@ -34,13 +34,21 @@

Loading...

- - + + + + + + +
Highlight Size
Size
Opacity + + +
@@ -59,7 +67,9 @@ // The viewModel tracks the state of our mini application. var viewModel = { highlight: true, - highlightSize: 2.0 + highlightSize: 2.0, + highlightOpacity: 100.0, + highlightColor: new Cesium.Color(1.0, 1.0, 1.0, 1.0) }; // Convert the viewModel members into knockout observables. @@ -88,7 +98,8 @@ minimumPixelSize : 128, maximumScale : 20000, highlight: viewModel.highlight, - highlightSize: viewModel.highlightSize + highlightSize: viewModel.highlightSize, + highlightColor: viewModel.highlightColor } }); viewer.trackedEntity = entity; @@ -129,9 +140,9 @@ }); Sandcastle.addToolbarButton('Change Highlight Color', function() { - entity.model.highlightColor = new Cesium.ConstantProperty(Cesium.Color.fromRandom({ - alpha : 0.3 - })); + viewModel.highlightColor = Cesium.Color.fromRandom({ + alpha : viewModel.highlightOpacity / 100.0 + }); }); Cesium.knockout.getObservable(viewModel, "highlightSize").subscribe( @@ -140,6 +151,18 @@ } ); +Cesium.knockout.getObservable(viewModel, "highlightOpacity").subscribe( + function(newValue) { + viewModel.highlightColor = Cesium.Color.fromAlpha(viewModel.highlightColor, viewModel.highlightOpacity / 100.0); + } +); + +Cesium.knockout.getObservable(viewModel, "highlightColor").subscribe( + function(newValue) { + entity.model.highlightColor = new Cesium.ConstantProperty(viewModel.highlightColor); + } +); + //Sandcastle_End From 1bcce58df666fe1033cce357425b26cc2c7dfdc8 Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Mon, 17 Oct 2016 14:52:01 -0400 Subject: [PATCH 034/396] Explicitly requesting a stencil buffer in the 3D Models Outline demo since highlighting depends on it --- .../Sandcastle/gallery/development/3D Models Outline.html | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Apps/Sandcastle/gallery/development/3D Models Outline.html b/Apps/Sandcastle/gallery/development/3D Models Outline.html index 268ba40d1fc4..e5320439f935 100644 --- a/Apps/Sandcastle/gallery/development/3D Models Outline.html +++ b/Apps/Sandcastle/gallery/development/3D Models Outline.html @@ -59,7 +59,13 @@ var viewer = new Cesium.Viewer('cesiumContainer', { infoBox : false, selectionIndicator : false, - shadows : true + shadows : true, + // Explicitly request a stencil buffer so highlighting will work. + contextOptions: { + webgl : { + stencil: true + } + } }); var entity = null; From fee0674d73f4d66c2e78133941a185bc770ddaea Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Mon, 17 Oct 2016 15:21:54 -0400 Subject: [PATCH 035/396] Only rendering highlight commands if stencilBits is greater than 0, otherwise logging a warning --- Source/Scene/Model.js | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 99b3a9380e25..c60c3db735f8 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -3983,18 +3983,25 @@ define([ } if (this.highlight) { - // highlight commands second. - for (i = 0; i < length; ++i) { - nc = nodeCommands[i]; - if (nc.show) { - commandList.push(nc.highlightCommand); - boundingVolume = nc.command.boundingVolume; - if (frameState.mode === SceneMode.SCENE2D && - (boundingVolume.center.y + boundingVolume.radius > idl2D || boundingVolume.center.y - boundingVolume.radius < idl2D)) { - commandList.push(nc.highlightCommand2D); + + // Only render the highlight commands if we have sufficient stencil bits. + if (context.stencilBits > 0) { + // highlight commands second. + for (i = 0; i < length; ++i) { + nc = nodeCommands[i]; + if (nc.show) { + commandList.push(nc.highlightCommand); + boundingVolume = nc.command.boundingVolume; + if (frameState.mode === SceneMode.SCENE2D && + (boundingVolume.center.y + boundingVolume.radius > idl2D || boundingVolume.center.y - boundingVolume.radius < idl2D)) { + commandList.push(nc.highlightCommand2D); + } } } } + else { + console.log("Model highlighting not supported, stencilBits = " + context.stencilBits + ". Request a stencil buffer when initializing the Viewer"); + } } } From 508b14df5068b028d5698254f8158ea93e3fa9c7 Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Mon, 17 Oct 2016 15:44:45 -0400 Subject: [PATCH 036/396] ModelGraphicSpec tests for model highlighting --- Specs/DataSources/ModelGraphicsSpec.js | 35 ++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/Specs/DataSources/ModelGraphicsSpec.js b/Specs/DataSources/ModelGraphicsSpec.js index c2c18f2965df..4b52a32866ef 100644 --- a/Specs/DataSources/ModelGraphicsSpec.js +++ b/Specs/DataSources/ModelGraphicsSpec.js @@ -2,6 +2,7 @@ defineSuite([ 'DataSources/ModelGraphics', 'Core/Cartesian3', + 'Core/Color', 'Core/DistanceDisplayCondition', 'Core/JulianDate', 'Core/Quaternion', @@ -12,6 +13,7 @@ defineSuite([ ], function( ModelGraphics, Cartesian3, + Color, DistanceDisplayCondition, JulianDate, Quaternion, @@ -32,6 +34,9 @@ defineSuite([ runAnimations : false, shadows : ShadowMode.DISABLED, distanceDisplayCondition : new DistanceDisplayCondition(), + highlight: false, + highlightSize: 3.0, + highlightColor: new Color(1.0, 0.0, 0.0, 1.0), nodeTransformations : { node1 : { translation : Cartesian3.UNIT_Y, @@ -50,6 +55,9 @@ defineSuite([ expect(model.incrementallyLoadTextures).toBeInstanceOf(ConstantProperty); expect(model.shadows).toBeInstanceOf(ConstantProperty); expect(model.runAnimations).toBeInstanceOf(ConstantProperty); + expect(model.highlight).toBeInstanceOf(ConstantProperty); + expect(model.highlightSize).toBeInstanceOf(ConstantProperty); + expect(model.highlightColor).toBeInstanceOf(ConstantProperty); expect(model.nodeTransformations).toBeInstanceOf(PropertyBag); @@ -62,6 +70,9 @@ defineSuite([ expect(model.shadows.getValue()).toEqual(options.shadows); expect(model.distanceDisplayCondition.getValue()).toEqual(options.distanceDisplayCondition); expect(model.runAnimations.getValue()).toEqual(options.runAnimations); + expect(model.highlight.getValue()).toEqual(options.highlight); + expect(model.highlightSize.getValue()).toEqual(options.highlightSize); + expect(model.highlightColor.getValue()).toEqual(options.highlightColor); var actualNodeTransformations = model.nodeTransformations.getValue(new JulianDate()); var expectedNodeTransformations = options.nodeTransformations; @@ -81,6 +92,9 @@ defineSuite([ source.maximumScale = new ConstantProperty(200.0); source.incrementallyLoadTextures = new ConstantProperty(true); source.shadows = new ConstantProperty(ShadowMode.ENABLED); + source.highlight = new ConstantProperty(true); + source.highlightSize = new ConstantProperty(3.0); + source.highlightColor = new ConstantProperty(new Color(1.0, 0.0, 0.0, 1.0)); source.distanceDisplayCondition = new ConstantProperty(new DistanceDisplayCondition()); source.runAnimations = new ConstantProperty(true); source.nodeTransformations = { @@ -107,6 +121,9 @@ defineSuite([ expect(target.distanceDisplayCondition).toBe(source.distanceDisplayCondition); expect(target.runAnimations).toBe(source.runAnimations); expect(target.nodeTransformations).toEqual(source.nodeTransformations); + expect(target.highlight).toEqual(source.highlight); + expect(target.highlightSize).toEqual(source.highlightSize); + expect(target.highlightColor).toEqual(source.highlightColor); }); it('merge does not assign assigned properties', function() { @@ -123,6 +140,9 @@ defineSuite([ source.nodeTransformations = { transform : new NodeTransformationProperty() }; + source.highlight = new ConstantProperty(true); + source.highlightSize = new ConstantProperty(1.0); + source.highlightColor = new ConstantProperty(new Color()); var uri = new ConstantProperty(''); var show = new ConstantProperty(true); @@ -136,6 +156,9 @@ defineSuite([ var nodeTransformations = new PropertyBag({ transform : new NodeTransformationProperty() }); + var highlight = new ConstantProperty(true); + var highlightSize = new ConstantProperty(1.0); + var highlightColor = new ConstantProperty(new Color()); var target = new ModelGraphics(); target.uri = uri; @@ -148,6 +171,9 @@ defineSuite([ target.distanceDisplayCondition = distanceDisplayCondition; target.runAnimations = runAnimations; target.nodeTransformations = nodeTransformations; + target.highlight = highlight; + target.highlightSize = highlightSize; + target.highlightColor = highlightColor; target.merge(source); @@ -161,6 +187,9 @@ defineSuite([ expect(target.distanceDisplayCondition).toBe(distanceDisplayCondition); expect(target.runAnimations).toBe(runAnimations); expect(target.nodeTransformations).toBe(nodeTransformations); + expect(target.highlight).toBe(highlight); + expect(target.highlightSize).toBe(highlightSize); + expect(target.highlightColor).toBe(highlightColor); }); it('clone works', function() { @@ -178,6 +207,9 @@ defineSuite([ node1 : new NodeTransformationProperty(), node2 : new NodeTransformationProperty() }; + source.highlight = new ConstantProperty(true); + source.highlightSize = new ConstantProperty(2.0); + source.highlightColor = new ConstantProperty(new Color()); var result = source.clone(); expect(result.uri).toBe(source.uri); @@ -190,6 +222,9 @@ defineSuite([ expect(result.distanceDisplayCondition).toBe(source.distanceDisplayCondition); expect(result.runAnimations).toBe(source.runAnimations); expect(result.nodeTransformations).toEqual(source.nodeTransformations); + expect(result.highlight).toEqual(source.highlight); + expect(result.highlightSize).toEqual(source.highlightSize); + expect(result.highlightColor).toEqual(source.highlightColor); }); it('merge throws if source undefined', function() { From 1c3337196905d94c5ae677c2e506422c965a0a77 Mon Sep 17 00:00:00 2001 From: Jason Beverage Date: Mon, 17 Oct 2016 15:52:53 -0400 Subject: [PATCH 037/396] Model testing --- Specs/Scene/ModelSpec.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Specs/Scene/ModelSpec.js b/Specs/Scene/ModelSpec.js index 2699f497616c..58886a31d35e 100644 --- a/Specs/Scene/ModelSpec.js +++ b/Specs/Scene/ModelSpec.js @@ -10,6 +10,7 @@ defineSuite([ 'Core/defaultValue', 'Core/defined', 'Core/defineProperties', + 'Core/Color', 'Core/DistanceDisplayCondition', 'Core/Ellipsoid', 'Core/Event', @@ -42,6 +43,7 @@ defineSuite([ defaultValue, defined, defineProperties, + Color, DistanceDisplayCondition, Ellipsoid, Event, @@ -233,6 +235,10 @@ defineSuite([ expect(texturedBoxModel.debugShowBoundingVolume).toEqual(false); expect(texturedBoxModel.debugWireframe).toEqual(false); expect(texturedBoxModel.distanceDisplayCondition).toBeUndefined(); + expect(texturedBoxModel.highlight).toEqual(false); + expect(texturedBoxModel.highlightSize).toEqual(2.0); + expect(texturedBoxModel.highlightColor).toEqual(new Color()); + }); it('renders', function() { @@ -1986,7 +1992,7 @@ defineSuite([ scene.renderForSpecs(); expect(scene.globe.removedCallback).toEqual(true); expect(scene.globe.callback).not.toBeDefined(); - + primitives.remove(model); }); }); From 9f8e686f02ddaa1afdd45e85b783514fd11f977c Mon Sep 17 00:00:00 2001 From: Dave Whipps Date: Wed, 19 Oct 2016 15:36:14 -0400 Subject: [PATCH 038/396] Looks like newline glyphs had non-zero width. Dont add widths for newlines. --- Source/Scene/LabelCollection.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index fd0afcdbbe29..0631b31f859f 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -235,17 +235,18 @@ define([ var glyphLength = glyphs.length; for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { glyph = glyphs[glyphIndex]; - dimensions = glyph.dimensions; - lineWidth += dimensions.width; - maxLineWidth = Math.max(maxLineWidth, lineWidth); - maxGlyphHeight = Math.max(maxGlyphHeight, dimensions.height); - maxGlyphDescent = Math.max(maxGlyphDescent, dimensions.descent); - if (text.charAt(glyphIndex) === '\n') { numberOfLines += 1; lineWidth = 0; } + else { + dimensions = glyph.dimensions; + lineWidth += dimensions.width; + maxLineWidth = Math.max(maxLineWidth, lineWidth); + maxGlyphHeight = Math.max(maxGlyphHeight, dimensions.height); + maxGlyphDescent = Math.max(maxGlyphDescent, dimensions.descent); + } } var scale = label._scale; From 58cc9bb761ff9302b065116a824d721511939116 Mon Sep 17 00:00:00 2001 From: Dave Whipps Date: Wed, 19 Oct 2016 15:49:29 -0400 Subject: [PATCH 039/396] Cleanup before a bit more tweaking. --- Source/Scene/LabelCollection.js | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 0631b31f859f..4ab66ac8225a 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -233,14 +233,13 @@ define([ var glyphIndex = 0; var glyphLength = glyphs.length; - for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { - glyph = glyphs[glyphIndex]; - + for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { if (text.charAt(glyphIndex) === '\n') { numberOfLines += 1; lineWidth = 0; } else { + glyph = glyphs[glyphIndex]; dimensions = glyph.dimensions; lineWidth += dimensions.width; maxLineWidth = Math.max(maxLineWidth, lineWidth); @@ -266,7 +265,7 @@ define([ var verticalOrigin = (heightReference === HeightReference.NONE) ? label._verticalOrigin : VerticalOrigin.BOTTOM; if (verticalOrigin === VerticalOrigin.CENTER) { // Subtract maxGlyphDescent for backwards compatibility - heightOffset += (totalHeight / 2 * scale) - maxGlyphDescent; + heightOffset += ((totalHeight / 2) * scale) - maxGlyphDescent; } else if (verticalOrigin === VerticalOrigin.BOTTOM) { // Subtract maxGlyphHeight for backwards compatibility heightOffset += (totalHeight * scale) - maxGlyphHeight; @@ -278,9 +277,15 @@ define([ var maxLineHeight = maxGlyphHeight + maxGlyphDescent; var glyphNewlineOffset = 0; for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { + + if (text.charAt(glyphIndex) === '\n') { + glyphNewlineOffset += maxLineHeight * scale; + glyphPixelOffset.x = widthOffset; + continue; + } + glyph = glyphs[glyphIndex]; dimensions = glyph.dimensions; - if (verticalOrigin === VerticalOrigin.BOTTOM) { glyphPixelOffset.y = heightOffset - dimensions.descent * scale; } else if (verticalOrigin === VerticalOrigin.TOP) { @@ -289,14 +294,7 @@ define([ glyphPixelOffset.y = heightOffset - (maxGlyphHeight - dimensions.height) / 2 * scale - dimensions.descent * scale; } - if (text.charAt(glyphIndex) === '\n') { - glyphNewlineOffset += maxLineHeight * scale; - glyphPixelOffset.x = widthOffset; - continue; - } glyphPixelOffset.y -= glyphNewlineOffset; - - glyphPixelOffset.y *= resolutionScale; if (defined(glyph.billboard)) { From 7e65a655e53e0f873e523db30bf4ccb18fdead64 Mon Sep 17 00:00:00 2001 From: Dave Whipps Date: Wed, 19 Oct 2016 15:55:49 -0400 Subject: [PATCH 040/396] Ensure we use computedWidth rather than simple width for glyph width. --- Source/Scene/LabelCollection.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 4ab66ac8225a..68168f3e245d 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -241,7 +241,7 @@ define([ else { glyph = glyphs[glyphIndex]; dimensions = glyph.dimensions; - lineWidth += dimensions.width; + lineWidth += dimensions.computedWidth; maxLineWidth = Math.max(maxLineWidth, lineWidth); maxGlyphHeight = Math.max(maxGlyphHeight, dimensions.height); maxGlyphDescent = Math.max(maxGlyphDescent, dimensions.descent); From 77ed7b42c7f40e16d2b1c1a0a79a4773767a7ba9 Mon Sep 17 00:00:00 2001 From: Dave Whipps Date: Wed, 19 Oct 2016 16:19:05 -0400 Subject: [PATCH 041/396] Ensure vertical centering works correctly. --- Source/Scene/LabelCollection.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 68168f3e245d..c560f96d95ba 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -265,7 +265,7 @@ define([ var verticalOrigin = (heightReference === HeightReference.NONE) ? label._verticalOrigin : VerticalOrigin.BOTTOM; if (verticalOrigin === VerticalOrigin.CENTER) { // Subtract maxGlyphDescent for backwards compatibility - heightOffset += ((totalHeight / 2) * scale) - maxGlyphDescent; + heightOffset += ((totalHeight / 2) - (maxGlyphHeight/2)) * scale; } else if (verticalOrigin === VerticalOrigin.BOTTOM) { // Subtract maxGlyphHeight for backwards compatibility heightOffset += (totalHeight * scale) - maxGlyphHeight; From 88bc7c3ff06a807f9093c346eee0f94376f9c26c Mon Sep 17 00:00:00 2001 From: Dave Whipps Date: Wed, 19 Oct 2016 16:24:15 -0400 Subject: [PATCH 042/396] Removed incorrect comment. --- Source/Scene/LabelCollection.js | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index c560f96d95ba..5236100727d5 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -264,7 +264,6 @@ define([ var heightReference = label._heightReference; var verticalOrigin = (heightReference === HeightReference.NONE) ? label._verticalOrigin : VerticalOrigin.BOTTOM; if (verticalOrigin === VerticalOrigin.CENTER) { - // Subtract maxGlyphDescent for backwards compatibility heightOffset += ((totalHeight / 2) - (maxGlyphHeight/2)) * scale; } else if (verticalOrigin === VerticalOrigin.BOTTOM) { // Subtract maxGlyphHeight for backwards compatibility From 1ca1c89ddddf8a63ff9df70799696711ea7c7e24 Mon Sep 17 00:00:00 2001 From: Dave Whipps Date: Thu, 20 Oct 2016 08:52:58 -0400 Subject: [PATCH 043/396] More renaming. --- Source/Scene/LabelCollection.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 5236100727d5..d99dbd214791 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -257,23 +257,25 @@ define([ widthOffset -= maxLineWidth * scale; } - var heightOffset = 0; - var totalHeight = (maxGlyphHeight * numberOfLines) + (maxGlyphDescent * (numberOfLines-1)); + var LEADING = 1.2; // Traditionally, leading is %20 of the font size. + var maxLineHeight = maxGlyphHeight + maxGlyphDescent; + var totalTextHeight = (maxGlyphHeight * numberOfLines) + (maxGlyphDescent * (numberOfLines-1)); + var topOffset = 0; var heightReference = label._heightReference; var verticalOrigin = (heightReference === HeightReference.NONE) ? label._verticalOrigin : VerticalOrigin.BOTTOM; if (verticalOrigin === VerticalOrigin.CENTER) { - heightOffset += ((totalHeight / 2) - (maxGlyphHeight/2)) * scale; + topOffset += ((totalTextHeight / 2) - (maxGlyphHeight/2)) * scale; } else if (verticalOrigin === VerticalOrigin.BOTTOM) { // Subtract maxGlyphHeight for backwards compatibility - heightOffset += (totalHeight * scale) - maxGlyphHeight; + topOffset += (totalTextHeight * scale) - maxGlyphHeight; } glyphPixelOffset.x = widthOffset * resolutionScale; glyphPixelOffset.y = 0; - var maxLineHeight = maxGlyphHeight + maxGlyphDescent; + var glyphNewlineOffset = 0; for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { @@ -286,11 +288,11 @@ define([ glyph = glyphs[glyphIndex]; dimensions = glyph.dimensions; if (verticalOrigin === VerticalOrigin.BOTTOM) { - glyphPixelOffset.y = heightOffset - dimensions.descent * scale; + glyphPixelOffset.y = topOffset - dimensions.descent * scale; } else if (verticalOrigin === VerticalOrigin.TOP) { - glyphPixelOffset.y = heightOffset - (maxGlyphHeight - dimensions.height) * scale - dimensions.descent * scale; + glyphPixelOffset.y = topOffset - (maxGlyphHeight - dimensions.height) * scale - dimensions.descent * scale; } else if (verticalOrigin === VerticalOrigin.CENTER) { - glyphPixelOffset.y = heightOffset - (maxGlyphHeight - dimensions.height) / 2 * scale - dimensions.descent * scale; + glyphPixelOffset.y = topOffset - (maxGlyphHeight - dimensions.height) / 2 * scale - dimensions.descent * scale; } glyphPixelOffset.y -= glyphNewlineOffset; From d25dcdd015b3e9743724ca1a4cfc2ceb1d2e466c Mon Sep 17 00:00:00 2001 From: Dave Whipps Date: Thu, 20 Oct 2016 09:02:20 -0400 Subject: [PATCH 044/396] Added some leading. Looks better. --- Source/Scene/LabelCollection.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index d99dbd214791..522fc5487a91 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -258,9 +258,9 @@ define([ } - var LEADING = 1.2; // Traditionally, leading is %20 of the font size. var maxLineHeight = maxGlyphHeight + maxGlyphDescent; - var totalTextHeight = (maxGlyphHeight * numberOfLines) + (maxGlyphDescent * (numberOfLines-1)); + var LEADING = 0.2*maxLineHeight; // Traditionally, leading is %20 of the font size. + var totalTextHeight = (maxLineHeight * numberOfLines) + (LEADING * (numberOfLines-1)); var topOffset = 0; var heightReference = label._heightReference; @@ -280,7 +280,7 @@ define([ for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { if (text.charAt(glyphIndex) === '\n') { - glyphNewlineOffset += maxLineHeight * scale; + glyphNewlineOffset += (maxLineHeight + LEADING) * scale; glyphPixelOffset.x = widthOffset; continue; } From 271de972cb55f4fea6bee9b63001c888d8e4c422 Mon Sep 17 00:00:00 2001 From: ggetz Date: Fri, 21 Oct 2016 14:28:17 -0400 Subject: [PATCH 045/396] Tilted CV view and adjust transition from 2D to CV --- Source/Scene/SceneTransitioner.js | 75 +++++++++++++++---------------- 1 file changed, 35 insertions(+), 40 deletions(-) diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index 1951dfb99d34..af7d026a2a12 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -130,11 +130,12 @@ define([ if (duration > 0.0) { position.x = 0.0; - position.y = 0.0; - position.z = 5.0 * ellipsoid.maximumRadius; + position.y = -1.0; + position.z = 1.0; + position = Cartesian3.multiplyByScalar(Cartesian3.normalize(position, position), 5.0 * ellipsoid.maximumRadius, position); - Cartesian3.negate(Cartesian3.UNIT_Z, direction); - Cartesian3.clone(Cartesian3.UNIT_Y, up); + Cartesian3.negate(Cartesian3.normalize(position, direction), direction); + Cartesian3.cross(Cartesian3.UNIT_X, direction, up); } else { var camera = scene.camera; if (this._previousMode === SceneMode.SCENE2D) { @@ -698,48 +699,42 @@ define([ var scene = transitioner._scene; var camera = scene.camera; - var startPos = Cartesian3.clone(camera.position, scratch3DToCVStartPos); - var startDir = Cartesian3.clone(camera.direction, scratch3DToCVStartDir); - var startUp = Cartesian3.clone(camera.up, scratch3DToCVStartUp); - var endPos = Cartesian3.clone(cameraCV.position, scratch3DToCVEndPos); var endDir = Cartesian3.clone(cameraCV.direction, scratch3DToCVEndDir); var endUp = Cartesian3.clone(cameraCV.up, scratch3DToCVEndUp); - var startRight = camera.frustum.right; - var endRight = endPos.z * 0.5; - - function update(value) { - columbusViewMorph(startPos, endPos, value.time, camera.position); - columbusViewMorph(startDir, endDir, value.time, camera.direction); - columbusViewMorph(startUp, endUp, value.time, camera.up); - Cartesian3.cross(camera.direction, camera.up, camera.right); - Cartesian3.normalize(camera.right, camera.right); - - var frustum = camera.frustum; - frustum.right = CesiumMath.lerp(startRight, endRight, value.time); - frustum.left = -frustum.right; - frustum.top = frustum.right * (scene.drawingBufferHeight / scene.drawingBufferWidth); - frustum.bottom = -frustum.top; - - camera.position.z = 2.0 * scene.mapProjection.ellipsoid.maximumRadius; - } - var tween = scene.tweens.add({ - duration : duration, - easingFunction : EasingFunction.QUARTIC_OUT, - startObject : { - time : 0.0 - }, - stopObject : { - time : 1.0 - }, - update : update, - complete : function() { - scene._mode = SceneMode.MORPHING; - morphOrthographicToPerspective(transitioner, duration, cameraCV, complete); + scene._mode = SceneMode.MORPHING; + morphOrthographicToPerspective(transitioner, 0.0, cameraCV, function() { + camera.frustum = cameraCV.frustum.clone(); + + var startPos = Cartesian3.clone(camera.position, scratch3DToCVStartPos); + var startDir = Cartesian3.clone(camera.direction, scratch3DToCVStartDir); + var startUp = Cartesian3.clone(camera.up, scratch3DToCVStartUp); + startPos.z = endPos.z; + + function update(value) { + columbusViewMorph(startPos, endPos, value.time, camera.position); + columbusViewMorph(startDir, endDir, value.time, camera.direction); + columbusViewMorph(startUp, endUp, value.time, camera.up); + Cartesian3.cross(camera.direction, camera.up, camera.right); + Cartesian3.normalize(camera.right, camera.right); } + var tween = scene.tweens.add({ + duration : duration, + easingFunction : EasingFunction.QUARTIC_OUT, + startObject : { + time : 0.0 + }, + stopObject : { + time : 1.0 + }, + update : update, + complete : function() { + complete(transitioner); + } + }); + transitioner._currentTweens.push(tween); }); - transitioner._currentTweens.push(tween); } var scratch3DToCVStartPos = new Cartesian3(); From 28e2056af4153b13aac53576d7035ce5307762ca Mon Sep 17 00:00:00 2001 From: ggetz Date: Fri, 21 Oct 2016 15:07:15 -0400 Subject: [PATCH 046/396] Updated CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index b85cd9b0a27f..b27870fae7f4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -15,6 +15,7 @@ Change Log * Fixed a bug with rotated, textured rectangles. [#4430](https://github.com/AnalyticalGraphicsInc/cesium/pull/4430) * Fixed a bug when morphing from 2D to 3D. [#4388](https://github.com/AnalyticalGraphicsInc/cesium/pull/4388) * Fixed a bug where when KML features had duplicate IDs, only one was drawn. [#3941](https://github.com/AnalyticalGraphicsInc/cesium/issues/3941) +* Fixed a bug where the default view for Columbus View was straight down instead of tilted. [#3878](https://github.com/AnalyticalGraphicsInc/cesium/issues/3878) * Fixed `KmlDataSource` features to respect `timespan` and `timestamp` properties of it's parents (eg. Folders or NetworkLinks). * `GeoJsonDataSource` now treats null crs values as a no-op instead of failing to load. * `GeoJsonDataSource` now gracefully handles missing style icons instead of failing to load. From 306ca1a2407d6231c7aecaf76231544c94042c21 Mon Sep 17 00:00:00 2001 From: Dave Whipps Date: Fri, 28 Oct 2016 09:10:02 -0400 Subject: [PATCH 047/396] Fixed test for changes in Label width and height when adding newlines. --- Specs/Scene/LabelCollectionSpec.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Specs/Scene/LabelCollectionSpec.js b/Specs/Scene/LabelCollectionSpec.js index 831d5c3a6ce5..bb8cfae571d9 100644 --- a/Specs/Scene/LabelCollectionSpec.js +++ b/Specs/Scene/LabelCollectionSpec.js @@ -1622,14 +1622,14 @@ defineSuite([ }); scene.renderForSpecs(); - var originalDimensions = label._glyphs[0].dimensions; + var originalBbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); label.text = 'apl\napl\napl'; scene.renderForSpecs(); + var newlinesBbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); - var dimensions = label._glyphs[0].dimensions; - expect(dimensions.width).toBeLessThan(originalDimensions.width); - expect(dimensions.height).toBeGreaterThan(originalDimensions.height); + expect(newlinesBbox.width).toBeLessThan(originalBbox.width); + expect(newlinesBbox.height).toBeGreaterThan(originalBbox.height); }); }, 'WebGL'); From d1d09f9f2b012ffea465f888346a518481096e6d Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Fri, 28 Oct 2016 20:56:56 -0400 Subject: [PATCH 048/396] Added model color --- CHANGES.md | 1 + Source/Scene/Model.js | 56 +++++++++++++++++++++++++++++++++++++++- Specs/Scene/ModelSpec.js | 30 +++++++++++++++++++++ 3 files changed, 86 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index c2d7354f028f..1402dc954190 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -41,6 +41,7 @@ Change Log * Fix warning when using Webpack. [#4467](https://github.com/AnalyticalGraphicsInc/cesium/pull/4467) * Fix primitive bounding sphere bug that would cause a crash when loading data sources. [#4431](https://github.com/AnalyticalGraphicsInc/cesium/issues/4431) * Fix a crash when clustering is enabled, an entity has a label graphics defined, but the label isn't visible. [#4414](https://github.com/AnalyticalGraphicsInc/cesium/issues/4414) +* Added the ability to blend a `Model` with a color. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) ### 1.26 - 2016-10-03 diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 0d70dce0f32a..aeb2b6014d9e 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -6,6 +6,7 @@ define([ '../Core/Cartesian4', '../Core/Cartographic', '../Core/clone', + '../Core/Color', '../Core/combine', '../Core/ComponentDatatype', '../Core/defaultValue', @@ -66,6 +67,7 @@ define([ Cartesian4, Cartographic, clone, + Color, combine, ComponentDatatype, defaultValue, @@ -321,6 +323,8 @@ define([ * @param {HeightReference} [options.heightReference] Determines how the model is drawn relative to terrain. * @param {Scene} [options.scene] Must be passed in for models that use the height reference property. * @param {DistanceDisplayCondition} [options.istanceDisplayCondition] The condition specifying at what distance from the camera that this model will be displayed. + * @param {Color} [options.blendColor=Color.RED] A color that blends with the model's rendered color. + * @param {Number} [options.blendAmount=0.0] Value used to mix between the render color and blend color. A value of 0.0 results in no blending while a value of 1.0 results in a solid blend color. * * @exception {DeveloperError} bgltf is not a valid Binary glTF file. * @exception {DeveloperError} Only glTF Binary version 1 is supported. @@ -516,6 +520,24 @@ define([ this.shadows = defaultValue(options.shadows, ShadowMode.ENABLED); this._shadows = this.shadows; + /** + * A color that blends with the model's rendered color. + * + * @type {Color} + * + * @default Color.RED + */ + this.blendColor = defaultValue(options.blendColor, Color.RED); + + /** + * Value used to mix between the render color and blend color. A value of 0.0 results in no blending while a value of 1.0 results in a solid blend color. + * + * @type {Number} + * + * @default 0.0 + */ + this.blendAmount = defaultValue(options.blendAmount, 0.0); + /** * This property is for debugging only; it is not for production use nor is it optimized. *

@@ -1719,6 +1741,19 @@ define([ return shader; } + function modifyShaderForBlendColor(shader) { + shader = ShaderSource.replaceMain(shader, 'czm_blend_main'); + shader += + 'uniform vec4 czm_blendColor; \n' + + 'uniform float czm_blendAmount; \n' + + 'void main() \n' + + '{ \n' + + ' czm_blend_main(); \n' + + ' gl_FragColor.rgb = mix(gl_FragColor.rgb, czm_blendColor.rgb, czm_blendAmount); \n' + + '} \n'; + return shader; + } + function modifyShader(shader, programName, callback) { if (defined(callback)) { shader = callback(shader, programName); @@ -1750,8 +1785,10 @@ define([ vs = modifyShaderForQuantizedAttributes(vs, id, model, context); } + var blendFS = modifyShaderForBlendColor(fs); + var drawVS = modifyShader(vs, id, model._vertexShaderLoaded); - var drawFS = modifyShader(fs, id, model._fragmentShaderLoaded); + var drawFS = modifyShader(blendFS, id, model._fragmentShaderLoaded); model._rendererResources.programs[id] = ShaderProgram.fromCache({ context : context, @@ -2841,6 +2878,18 @@ define([ }; } + function createBlendColorFunction(model) { + return function() { + return model.blendColor; + }; + } + + function createBlendAmountFunction(model) { + return function() { + return model.blendAmount; + }; + } + function createCommand(model, gltfNode, runtimeNode, context, scene3DOnly) { var nodeCommands = model._nodeCommands; var pickIds = model._pickIds; @@ -2909,6 +2958,11 @@ define([ uniformMap = combine(uniformMap, jointUniformMap); } + uniformMap = combine(uniformMap, { + czm_blendColor : createBlendColorFunction(model), + czm_blendAmount : createBlendAmountFunction(model) + }); + // Allow callback to modify the uniformMap if (defined(model._uniformMapLoaded)) { uniformMap = model._uniformMapLoaded(uniformMap, programId, runtimeNode); diff --git a/Specs/Scene/ModelSpec.js b/Specs/Scene/ModelSpec.js index 2699f497616c..ca98cf69586b 100644 --- a/Specs/Scene/ModelSpec.js +++ b/Specs/Scene/ModelSpec.js @@ -6,6 +6,7 @@ defineSuite([ 'Core/Cartesian4', 'Core/CesiumTerrainProvider', 'Core/clone', + 'Core/Color', 'Core/combine', 'Core/defaultValue', 'Core/defined', @@ -38,6 +39,7 @@ defineSuite([ Cartesian4, CesiumTerrainProvider, clone, + Color, combine, defaultValue, defined, @@ -1869,6 +1871,34 @@ defineSuite([ }); }); + it('renders with a blend color', function() { + return loadModel(boxUrl).then(function(model) { + model.show = true; + model.zoomTo(); + + // Model is originally red + var sourceColor = scene.renderForSpecs(); + expect(sourceColor[0]).toBeGreaterThan(0); + expect(sourceColor[1]).toEqual(0); + + model.blendColor = Color.LIME; + + model.blendAmount = 0.0; + var blendColor = scene.renderForSpecs(); + expect(blendColor).toEqual(sourceColor); + + model.blendAmount = 0.5; + blendColor = scene.renderForSpecs(); + expect(blendColor[0]).toBeGreaterThan(0); + expect(blendColor[1]).toBeGreaterThan(0); + + model.blendAmount = 1.0; + blendColor = scene.renderForSpecs(); + expect(blendColor[0]).toEqual(0); + expect(blendColor[1]).toEqual(255); + }); + }); + describe('height referenced model', function() { function createMockGlobe() { var globe = { From ead79f498d56f0188754463c97ec1868aa8f914a Mon Sep 17 00:00:00 2001 From: "duvi.fn" Date: Wed, 2 Nov 2016 21:46:32 +0200 Subject: [PATCH 049/396] fix_billboardOnTerrain --- Source/Scene/QuadtreePrimitive.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/Scene/QuadtreePrimitive.js b/Source/Scene/QuadtreePrimitive.js index 3c013df87671..3bb47d6f65f3 100644 --- a/Source/Scene/QuadtreePrimitive.js +++ b/Source/Scene/QuadtreePrimitive.js @@ -631,8 +631,10 @@ define([ } if (mode === SceneMode.SCENE3D) { - Cartesian3.clone(Cartesian3.ZERO, scratchRay.origin); - Cartesian3.normalize(data.position, scratchRay.direction); + var surfaceNormal = ellipsoid.geodeticSurfaceNormal(data.position, scratchRay.direction); + // subtract by earth minor axis radius, to account for a case where the terrain is under ellipsoid surface - is that OK or should I use lower value (maybe -11500.0 which appears some lines bellow)? + var radiusLengthVector = Cartesian3.multiplyByScalar(surfaceNormal, ellipsoid.minimumRadius, scratchPosition); + Cartesian3.subtract(data.position, radiusLengthVector, scratchRay.origin); } else { Cartographic.clone(data.positionCartographic, scratchCartographic); From 9f7d91186fa7cbe368f633386ecc13b81227260d Mon Sep 17 00:00:00 2001 From: "duvi.fn" Date: Thu, 3 Nov 2016 19:59:38 +0200 Subject: [PATCH 050/396] fix Globe.getHeight function better handling of under ellipsoid surface terrain --- Source/Scene/Globe.js | 11 ++++++++++- Source/Scene/QuadtreePrimitive.js | 12 +++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Source/Scene/Globe.js b/Source/Scene/Globe.js index e84b483997b0..0d96fda711ae 100644 --- a/Source/Scene/Globe.js +++ b/Source/Scene/Globe.js @@ -430,7 +430,16 @@ define([ var cartesian = ellipsoid.cartographicToCartesian(cartographic, scratchGetHeightCartesian); var ray = scratchGetHeightRay; - Cartesian3.normalize(cartesian, ray.direction); + var surfaceNormal = ellipsoid.geodeticSurfaceNormal(cartesian, ray.direction); + + // compute origin point, to account for a case where the terrain is under ellipsoid surface + var minimumHeight = Math.min(defaultValue(tile.data.minimumHeight, 0.0), 0.0); + + // take into account the position height + minimumHeight -= cartographic.height; + + var minimumHeightVector = Cartesian3.multiplyByScalar(surfaceNormal, minimumHeight - 1.0, scratchGetHeightIntersection); + Cartesian3.add(cartesian, minimumHeightVector, ray.origin); var intersection = tile.data.pick(ray, undefined, undefined, false, scratchGetHeightIntersection); if (!defined(intersection)) { diff --git a/Source/Scene/QuadtreePrimitive.js b/Source/Scene/QuadtreePrimitive.js index 3bb47d6f65f3..2555401f7f42 100644 --- a/Source/Scene/QuadtreePrimitive.js +++ b/Source/Scene/QuadtreePrimitive.js @@ -632,9 +632,15 @@ define([ if (mode === SceneMode.SCENE3D) { var surfaceNormal = ellipsoid.geodeticSurfaceNormal(data.position, scratchRay.direction); - // subtract by earth minor axis radius, to account for a case where the terrain is under ellipsoid surface - is that OK or should I use lower value (maybe -11500.0 which appears some lines bellow)? - var radiusLengthVector = Cartesian3.multiplyByScalar(surfaceNormal, ellipsoid.minimumRadius, scratchPosition); - Cartesian3.subtract(data.position, radiusLengthVector, scratchRay.origin); + + // compute origin point, to account for a case where the terrain is under ellipsoid surface + var minimumHeight = Math.min(defaultValue(tile.data.minimumHeight, 0.0), 0.0); + + // take into account the position height + minimumHeight -= data.positionCartographic.height; + + var minimumHeightVector = Cartesian3.multiplyByScalar(surfaceNormal, minimumHeight - 1.0, scratchPosition); + Cartesian3.add(data.position, minimumHeightVector, scratchRay.origin); } else { Cartographic.clone(data.positionCartographic, scratchCartographic); From d97e9a897609698eda9697149c7831aaf41da76a Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Tue, 8 Nov 2016 09:54:51 -0500 Subject: [PATCH 051/396] Initial batch table hierarchy support --- .../gallery/3D Tiles Hierarchy.html | 262 ++++++++++++++++++ Source/Scene/Cesium3DTileBatchTable.js | 195 +++++++++++-- Source/Scene/Cesium3DTileFeature.js | 12 +- Source/Scene/Cesium3DTileStyleEngine.js | 1 - Source/Scene/Expression.js | 30 +- .../Hierarchy/BatchTableHierarchy/tile.b3dm | Bin 0 -> 94462 bytes .../BatchTableHierarchy/tileset.json | 47 ++++ .../BatchTableHierarchyBinary/tile.b3dm | Bin 0 -> 95166 bytes .../BatchTableHierarchyBinary/tileset.json | 47 ++++ 9 files changed, 569 insertions(+), 25 deletions(-) create mode 100644 Apps/Sandcastle/gallery/3D Tiles Hierarchy.html create mode 100644 Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm create mode 100644 Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json create mode 100644 Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm create mode 100644 Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json diff --git a/Apps/Sandcastle/gallery/3D Tiles Hierarchy.html b/Apps/Sandcastle/gallery/3D Tiles Hierarchy.html new file mode 100644 index 000000000000..bb412cd7a059 --- /dev/null +++ b/Apps/Sandcastle/gallery/3D Tiles Hierarchy.html @@ -0,0 +1,262 @@ + + + + + + + + + Cesium Demo + + + + + + +

+

Loading...

+
+ + + diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index 2080059f7c42..bb2b340c66fa 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -78,7 +78,22 @@ define([ * @private */ this.batchTableBinary = batchTableBinary; - this._batchTableBinaryProperties = Cesium3DTileBatchTable.getBinaryProperties(featuresLength, batchTableJson, batchTableBinary); + + var batchTableHierarchy; + var batchTableBinaryProperties; + 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); + } + + this._batchTableHierarchy = batchTableHierarchy; + this._batchTableBinaryProperties = batchTableBinaryProperties; // 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? @@ -116,6 +131,53 @@ define([ this._textureStep = textureStep; } + function initializeHierarchy(json, binary) { + var i; + var binaryAccessor; + + var instancesLength = json.instancesLength; + var classes = json.classes; + var classIds = json.classIds; + var parentIds = json.parentIds; + + if (defined(classIds.byteOffset)) { + classIds.componentType = defaultValue(classIds.componentType, 'SHORT'); + classIds.type = 'SCALAR'; + binaryAccessor = getBinaryAccessor(classIds); + classIds = binaryAccessor.createArrayBufferView(binary.buffer, binary.byteOffset + classIds.byteOffset, instancesLength); + } + + if (defined(parentIds.byteOffset)) { + parentIds.componentType = defaultValue(parentIds.componentType, 'SHORT'); + parentIds.type = 'SCALAR'; + binaryAccessor = getBinaryAccessor(parentIds); + parentIds = binaryAccessor.createArrayBufferView(binary.buffer, binary.byteOffset + parentIds.byteOffset, instancesLength); + } + + 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); + classes[i].instances = combine(binaryProperties, properties); + } + + var classCounts = arrayFill(new Array(classesLength), 0); + var classIndexes = new Array(instancesLength); + for (i = 0; i < instancesLength; ++i) { + var classId = classIds[i]; + classIndexes[i] = classCounts[classId]; + ++classCounts[classId]; + } + + return { + classes : classes, + classIds : classIds, + classIndexes : classIndexes, + parentIds : parentIds + }; + } + Cesium3DTileBatchTable.getBinaryProperties = function(featuresLength, json, binary) { var binaryProperties; if (defined(json)) { @@ -369,13 +431,103 @@ define([ return names; }; + Cesium3DTileBatchTable.prototype.isDerived = function(batchId, className) { + var hierarchy = this._batchTableHierarchy; + if (!defined(hierarchy)) { + return false; + } + var instanceIndex = batchId; + while (instanceIndex !== -1) { + var classId = hierarchy.classIds[instanceIndex]; + var instanceClass = hierarchy.classes[classId]; + if (instanceClass.name === className) { + return true; + } + // Recursively check parent + instanceIndex = hierarchy.parentIds[instanceIndex]; + } + return false; + }; + + Cesium3DTileBatchTable.prototype.isClass = function(batchId, className) { + var hierarchy = this._batchTableHierarchy; + if (!defined(hierarchy)) { + return false; + } + var classId = hierarchy.classIds[batchId]; + var instanceClass = hierarchy.classes[classId]; + return instanceClass.name === className; + }; + + function getBinaryProperty(binaryProperty, index) { + var typedArray = binaryProperty.typedArray; + var componentCount = binaryProperty.componentCount; + if (componentCount === 1) { + return typedArray[index]; + } else { + return binaryProperty.type.unpack(typedArray, index * componentCount); + } + } + + function setBinaryProperty(binaryProperty, index, value) { + var typedArray = binaryProperty.typedArray; + var componentCount = binaryProperty.componentCount; + if (componentCount === 1) { + typedArray[index] = value; + } else { + binaryProperty.type.pack(value, typedArray, index * componentCount); + } + } + + function getHierarchyProperty(batchTable, batchId, name) { + var hierarchy = batchTable._batchTableHierarchy; + var instanceIndex = batchId; + while (instanceIndex !== -1) { + var classId = hierarchy.classIds[instanceIndex]; + var instanceClass = hierarchy.classes[classId]; + var indexInClass = hierarchy.classIndexes[instanceIndex]; + var propertyValues = instanceClass.instances[name]; + if (defined(propertyValues)) { + if (defined(propertyValues.typedArray)) { + return getBinaryProperty(propertyValues, indexInClass); + } else { + return clone(propertyValues[indexInClass], true); + } + } + // Recursively check parent for the property + instanceIndex = hierarchy.parentIds[instanceIndex]; + } + return undefined; + } + + function setHierarchyProperty(batchTable, batchId, name, value) { + var hierarchy = batchTable._batchTableHierarchy; + var instanceIndex = batchId; + while (instanceIndex !== -1) { + var classId = hierarchy.classIds[instanceIndex]; + var instanceClass = hierarchy.classes[classId]; + var indexInClass = hierarchy.classIndexes[instanceIndex]; + var propertyValues = instanceClass.instances[name]; + if (defined(propertyValues)) { + if (defined(propertyValues.typedArray)) { + setBinaryProperty(propertyValues, indexInClass, value); + } else { + propertyValues[indexInClass] = clone(value, true); + } + return true; + } + // Recursively check parent for the property + instanceIndex = hierarchy.parentIds[instanceIndex]; + } + return false; + } + Cesium3DTileBatchTable.prototype.getProperty = function(batchId, name) { 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 - + ').'); } - if (!defined(name)) { throw new DeveloperError('name is required.'); } @@ -385,24 +537,26 @@ define([ return undefined; } + if (defined(this._batchTableHierarchy)) { + var hierarchyProperty = getHierarchyProperty(this, batchId, name); + if (defined(hierarchyProperty)) { + return hierarchyProperty; + } + } + if (defined(this._batchTableBinaryProperties)) { var binaryProperty = this._batchTableBinaryProperties[name]; if (defined(binaryProperty)) { - var typedArray = binaryProperty.typedArray; - var componentCount = binaryProperty.componentCount; - if (componentCount === 1) { - return typedArray[batchId]; - } else { - return binaryProperty.type.unpack(typedArray, batchId * componentCount); - } + return getBinaryProperty(binaryProperty, batchId); } } var propertyValues = this.batchTableJson[name]; - if (!defined(propertyValues)) { - return undefined; + if (defined(propertyValues)) { + return clone(propertyValues[batchId], true); } - return clone(propertyValues[batchId], true); + + return undefined; }; Cesium3DTileBatchTable.prototype.setProperty = function(batchId, name, value) { @@ -417,16 +571,16 @@ define([ } //>>includeEnd('debug'); + if (defined(this._batchTableHierarchy)) { + if (setHierarchyProperty(this, batchId, name, value)) { + return; + } + } + if (defined(this._batchTableBinaryProperties)) { var binaryProperty = this._batchTableBinaryProperties[name]; if (defined(binaryProperty)) { - var typedArray = binaryProperty.typedArray; - var componentCount = binaryProperty.componentCount; - if (componentCount === 1) { - typedArray[batchId] = value; - } else { - binaryProperty.type.pack(value, typedArray, batchId * componentCount); - } + setBinaryProperty(binaryProperty, batchId, value); return; } } @@ -473,9 +627,6 @@ define([ '} \n'; } - /** - * @private - */ Cesium3DTileBatchTable.prototype.getVertexShaderCallback = function(handleTranslucent, batchIdAttributeName) { if (this.featuresLength === 0) { return; diff --git a/Source/Scene/Cesium3DTileFeature.js b/Source/Scene/Cesium3DTileFeature.js index 7c9b929521bd..d9294b961ff6 100644 --- a/Source/Scene/Cesium3DTileFeature.js +++ b/Source/Scene/Cesium3DTileFeature.js @@ -168,5 +168,15 @@ define([ this._content.featurePropertiesDirty = true; }; + // TODO : add doc + Cesium3DTileFeature.prototype.isClass = function(className) { + return this._batchTable.isClass(this._batchId, className); + }; + + // TODO : add doc + Cesium3DTileFeature.prototype.isDerived = function(className) { + return this._batchTable.isDerived(this._batchId, className); + }; + return Cesium3DTileFeature; -}); \ No newline at end of file +}); diff --git a/Source/Scene/Cesium3DTileStyleEngine.js b/Source/Scene/Cesium3DTileStyleEngine.js index 98a56a93288b..54fdbb7a05ae 100644 --- a/Source/Scene/Cesium3DTileStyleEngine.js +++ b/Source/Scene/Cesium3DTileStyleEngine.js @@ -103,7 +103,6 @@ define([ if (!content.applyStyleWithShader(frameState, style)) { applyStyleWithBatchTable(content, stats, style); } - } function applyStyleWithBatchTable(content, stats, style) { diff --git a/Source/Scene/Expression.js b/Source/Scene/Expression.js index c10ac18cb8b4..9bfa4bee769b 100644 --- a/Source/Scene/Expression.js +++ b/Source/Scene/Expression.js @@ -338,6 +338,22 @@ define([ } val = createRuntimeAst(expression, args[0]); return new Node(ExpressionNodeType.UNARY, call, val); + } else if (call === 'isClass') { + //>>includeStart('debug', pragmas.debug); + if (args.length < 1 || args.length > 1) { + throw new DeveloperError('Error: ' + call + ' requires exactly one argument.'); + } + //>>includeEnd('debug'); + val = createRuntimeAst(expression, args[0]); + return new Node(ExpressionNodeType.UNARY, call, val); + } else if (call === 'isDerived') { + //>>includeStart('debug', pragmas.debug); + if (args.length < 1 || args.length > 1) { + throw new DeveloperError('Error: ' + call + ' requires exactly one argument.'); + } + //>>includeEnd('debug'); + val = createRuntimeAst(expression, args[0]); + return new Node(ExpressionNodeType.UNARY, call, val); } else if (call === 'abs') { //>>includeStart('debug', pragmas.debug); if (args.length < 1 || args.length > 1) { @@ -591,6 +607,10 @@ define([ node.evaluate = node._evaluateNaN; } else if (node._value === 'isFinite') { node.evaluate = node._evaluateIsFinite; + } else if (node._value === 'isClass') { + node.evaluate = node._evaluateIsClass; + } else if (node._value === 'isDerived') { + node.evaluate = node._evaluateIsDerived; } else if (node._value === 'abs') { node.evaluate = node._evaluateAbsoluteValue; } else if (node._value === 'cos') { @@ -924,6 +944,14 @@ define([ return isFinite(this._left.evaluate(feature)); }; + Node.prototype._evaluateIsClass = function(feature) { + return feature.isClass(this._left.evaluate(feature)); + }; + + Node.prototype._evaluateIsDerived = function(feature) { + return feature.isDerived(this._left.evaluate(feature)); + }; + Node.prototype._evaluateAbsoluteValue = function(feature) { return Math.abs(this._left.evaluate(feature)); }; @@ -1161,7 +1189,7 @@ define([ return 'sqrt(' + left + ')'; } //>>includeStart('debug', pragmas.debug); - else if ((value === 'isNaN') || (value === 'isFinite') || (value === 'String')) { + else if ((value === 'isNaN') || (value === 'isFinite') || (value === 'String') || (value === 'isClass') || (value === 'isDerived')) { throw new DeveloperError('Error generating style shader: "' + value + '" is not supported.'); } //>>includeEnd('debug'); diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..99c68bbb129bd337b0ea2452cc7165ba37fdc4c6 GIT binary patch literal 94462 zcmeGE2Y3}#_x=x`nKKhn5h(&XP(tWv5~`py5k*BxfB>O)8!7^ViUoUDn!R^L zO@h7m-g_^oD0cs!d!Jb+lL$(l=kfP_ulG8RbFa16S$nN}ui1OgoHNl;d1EGfiA3U$ zX=>1|_ryO`cSrgwGMlDcO|4Iol}I&?qD|3Q3JZGOzNLIJ{`mBtEe#QI&%}uHZ1OWXeRGr_Lyv zGEOuiHsfX#9VrgZ`S6k{W2PSNE*xcUo72WVFmmz|IZ2U|6gkN%ZU)p^kxtR(?!GdHkIph)YK^&sin`Ya*g!y z2*B@m$jo6&^{-ZPjjpO+lFh@E~icVoHl$4jVk}<<>a}4TjUNqCMSD*aml#xnvbnn zKk>62*>#YFVf?2bGNkA_Mw_3uJa=jrNdL?7Rg&};`JZ|WJElpKCgUaz?xlS{YoeF9 zx0ZH&?fFHc+2UtTox!!LXpERPb!N$|lBrW<95s9F*y0%nl@uS&ZeP(D;U?CRvx*0d z9Xqp_QnhAo(L7+*jFK^I@-#+YWgh+O^Y_w}OnAGIhq}qDj@M zK%2I0JO0nAz^L_adO&XZR3bQgPIbt&?MRvat4pNKD|LyOlxbel<7H!8EIxwC@i#Na zZ9~tsVY@xURSWI zG_NCe$55Zt!f~r?RLPX08Ap!LdK8;z4HV7b?vnCiI9f@4qsOU^opRgqL^XRxi5|C# zW)*eL$*u^gg_#PQUZ?TuYt6>;RgTQ6u?ZU+?X0310euGd8PK0V=}kC&Bg)C{KVVS5u6^SlMmuy)_TZie zcONidP!H9pqA&YnPIkAhgS+?c(<5%Tc?Nkls}k;i@lS34s<;e%8oLPCr|SOJ_82|s zXHTKw>d!Ohtp4tkqq9ek=Xs7N779tNtqen*rUyvE%_z}bif4=T^U(&hVNrq+uIyvE zA*qP5=z7vkW!-Sp*1Cx(a77|?d{a+t*@uicaNvl+x~49;1~jv1^0Z0C?s-71(ZxI$ zc8+A!cH@mc;j2!n0z;h=W9rH?iwQe>hN}?KDrWD2GkMJCX@9@ogGR*nC#V%oVJ+z4 zLuu%wZ=6hPO`fS^OD4gF2bF2s3x^bs+NUqqcn);kT+YsI$FWlSZn-_8^7Jfk-EPO{qb8M2f+aZK|Kc@ z&~xyhuKf>Swf3x(z8&e)n~>es;MHEd(mPS5513CCgBp?7V{o6oJrC&7r&q57iA}GH zU8+(yKB?HM{_;u1eq|r&!IM6f_pT}*rY|V7D@H24C&kLuUL&n|I*fToTU1rw*yXPr zJ+^OIpNOkXjLQDDnZ=y*v}Rcud^crtFip?q{CpE_ti@A`Mrqv)ZPT$MUxGTdaZg6G zr<7>XyXiK2#9tGSkFNzWKr(~~4UU1Y78 z1Qqi^_KGP`F&mt{Vgh8(OzZlj@&u?nAC8ID(Ul~s>0dU2p)BC^WYKEg@S=~e^Iu34$RtVc0(^e0#}xbq*WhJ|Ldf=N=nw56Zxqqbswm>d8mC%le%rE6fSvY zMPdFIjSKp|o6@^}mtC;+mQxFBbXi#_eeJ|4g})D7>3q&#KiT>3zUOuY>bt1JibCn~ z*|vKs&gSn=bv}Ep+@+w^&r=KU+0Hts&nK4`N*Dht?pU7gTLZhsrTAagNaYouVdt!HeCpPn?s(Qd zXV-#zE}7=WC_dt*yc)Y=PWd#&M}05MUgct1O)Rf!_{Zov=`l*TywcV8sJSVgZtQTA z-PLMjinIBMv-yaFbk$AV#8Y*aF8&&?eB4-wqrTGncT2@IyLg(v@=DjW+vV0;>6p?j zmvpO@bQgy)7OvT(SLATBjD%c-p#?kF6us%GR3r*xWWBtEYUdp5h~Jx<<+?T{Tfm`KTsZ7wRhxC+Dwn zYtZa=-EB>|IY3PD)V$KTq+5Kmi<`|8#Z(;mKYCayzI54@SGxSg$6|`7t!wF;+s4_} zvifQb8fV*cWVd}uG2MEM>R|huVk(YZJGU3%BY(|>^&g$+I7@&1^b_4!RLdidO6jU) zjmIl|+6E`Nx@k?QujY@|dfex?S|_?%Dd+fPO4q!$n2JB={l(5l*YMoEQ@K=Qi>VsO zU-dMe8n5M&t~D(m>Dpt&Uwq82zS>hQzSf!XaWUsCF4VrNF*dz9#YcI?P1jV{%3^Bn zsIOvLO_bN_rh3{KrCVO<+EdlnI4i!ZKYNdACC=uf_~LII6w_*@u^Uf~cRl>YQ+t?n z_0^s#T`|pW^^sk9-L*s4+_0F^Ethnwm2|6>_Eq^mu~(|EtMitrnBsrJ=ZoAJmG`^1 z7p2D~yN&Az{KeTgXdPKh>54gfX3AeR9CFhl=dbZ@Gdva3d^9fe(YRdwiEsRs*T$uo z@=>mjo2Gb*!;hP#Vwzn%6-WN!X)(o3HBn6Is)_ix`lBn3`pUlgvlCMFkL)&2#lVn{_3m!$*#NE#nb%7(_)I7Tkp(6=@wtQxY^uROq<)S<$? zZh57vZ_Um2c0AqK;U>GQRsP=T`0^2F^AQK>s++ipr|K+S{54+rxUmpNeWi~%Iu+CG z;%WZMD_z%4^TA?Dw_MV#R?=M@YNdTuYfBtt*B+@lE2h?#jZtgs^JrXV7dP`a&f=i4 zSWM~K1MJ#q53p;eJ;1K7`Dk3`BMyqMT8W$T>RL;ezwGkSUM2qOtG&wRu-V1a{KeB^ zikrohEo!+nRE7 zAX@vHR~nZ%TYTxVi<`|8#Z(;Gr}aw3moB^Vn!or+S4{D=buC?U+c?`=R$r|_<7|75 z?6xl{rdy9u9c+J7OvSNl=k_9e4i~D_#4I z`Wk1&clBrQQLV(;d=y{&je}xJ7dMUFcxt@*&Lf`M!=$UP_EhPLX?ClR?8@t|9lGX* z#guNjq+6||TdlOO%3t5vWEW3;ud^}gyPvBGeDs~r#wELrOa9_)9Bf>QDP1x3y;T0H z;r@JgmA}TT@2+-z<)d8YBM#!P_{Lv(rOPgV`G~*1ORKLq=)1aNnq7I#UwJL2xTz+J zDP1)YA6I{L#Zh0`^;>|ee`I$xiTuSuKB|wnX^j|9tqbF+Ic7YyE{vzyT|Faz#O)x^|+7p zsy@au&dq$xUq0w*&ZZlOs{Y0y&dvBQr#_ZTx~}cneHXhinyxy_U-r1JI>^UrV!C|d zeN8uiixc-({CJ(K`o#NM{f(#fHM_-$$2UFh<6=_F;V*Z0*IIS0Gp%zaopsktcKNV2 zoo+s=tLe%qU1K-h;>)f$<{#HpbJ>l9>B?2r-+YXZ`kHS3ah`E~V;s!K@+zj~wfHth z%O$&N-)-{(H&0C0*ri(?OjjLL6Z1FS{AG{p@{h-i`&(_z-*TBxyszo#O}sx#S~Vxy;}C%3teRcI&J7RrR=!^r}9_GtSL? z%wIm}Y0jn_hpPU@AMbdx8%wZ(L7ti1#gw#gSe)Z#-taZz`tZ=uB{?`c~*_CknrQ zV*m0h7L=6f+55JgQo5eKzg;)5ynMH@WzuV(y?^<(O^Th*_!@(pzrM4m?~~o9lu4IQ zw@)TJpY=NqbUu1Me=ciad9Pc>l}T63i{F{#Vt(=902g2O7Do>(U)_JSvn%G(2gbOV z@;`rEk&9_O^&D=wq|4|2%chq}7yoDXossSMULSHD38hR~+?~e%e>FT}-o!r}-Yh0eO*lX z-#W5i`r7SwZ{PIwH6M-3d^9e_SFOZNd3CL&%U^c+Jh4w-$6tNF+PZIg4x3$h&0jn% zrnp&5>EffB$VYK(9nE@SKc{P5m|eNdUmR2)`5RBI5#y!@-J;PEIqenS6MONyz!RtMYP6jO2R+NrO62us_ARrmks|er9VCO$8=1^Z$9T;=QHfe zZ_BRO{2iC;(W39tF`vA3t@Bqsji<(Ixun1M%umio`uJUbcKpT1?CQJ!o9ol@mt6Bh znvY`c((L^*?W-E&>@M#)KFTX@x~9E`uT951Z}vB?uVPwFl-KH}dfFJJTVCl6YyIN- z8fV3q{l#N`DO0V)*?bgV{EdTRTCFs8?7E`rVOsyB`;$Z8} z*0OQ7H7FnLdsYYSOI8Qh&s@ zu9%G;?criJ>eAZ9m;IH6t;z@G?Bnc;xx+KPTuk|Icf~#~rt#ExEtho1^Zf4R(#5~; zSr*7R`$5Z?2J(sk0V-z28Q(lc-G2eQ29~V=7+xG13 zVp>fsuWG1z+8Cu)L5PSWM}bOS;ucx{JdYwXaTCl_rI)7`r5tLJuiKI%}3)hA8}B8)k@ry zSJzs){AHImk}#Z&W2>PZU#e$3e^xuarD6f5Xh0pjJbzR*Sbx8Hq{Mokq{7OFS zcdYGdb?4>_%AdypDswp zyfAyA>#LYn6XmtKsh&1Q>6TaeQFD)XeT}o?yZVnjzFf5uXY)~f@iz{NX|>YWji<)@ zHT=bM32~&WZ~ty7T`|pW^^uSAx@(87xnVJ-TQ2EVE9q7%?W^)X_sCRV@m$*=6;u4T zd}%8;&z1MX`?gAtOLiNV{KeTgXdPKh>5BRJ$2Fb5YIx(wt(?EcyW71rT}<=QxXef6 z5`V=v{>p3PQcU?M*Ax5HbUel3tF2Qp%`TpbBY*L}*&0jn%rntHF&ODTE@uiEK&27cB zx&7#2DP42h?8kLy)q#{J`Uj^{F;cwf`S$2e5gmDl>l^{W2EUrv@Uy5U(jH?rSd zS5{R|z1vFpNU!R1-&GCERX5p3e6v-#a+$7N=5KxFulHiITVHXgs>gk#SM@QT#$WNx z$Nc3Z`^Gp_^*0W2Zq`?0v|Q2`*8QXG#;4wQ^*7zdE_+;89pt0>#C7?^`TA0B%g1=eb@7bnHQjtHuko>Q8UJ`L z>93B>Eie7C&|P=aHFoLh8`o6_)x`WwHy_#Ky8PoY^U&v&>Af%#-F=20 z_eo%n`9GtNIku$NE~#luxR!bn}__7d^!xf>p-gwM--wF=KKh-y7ugE)V#A&51 z@|P6o*?ZaVCpulv-ixnXT-xNzQwpRXx9pVCbyH7uK6`gx>U{KEt-jm6ePV%h`HZM} zlJmLen|aPh&*zKV&ntav*Ha3dPRuq-PjWGD??2bYmwoJO3rbfWe44W>X2(lUbuq=E zZQs*fOyjBNZObKHK0CEuTp(Ti&wqVUy07dSm*U^p^h6h5d}bebvg7l{+fy7*eXk$V zY>peF_=ubGYV3-+dim+8nDi|58Mi(mQRQifMN7G=Jrlu4||7BNkJ-<&ti- zk}iLZQQzxFTrkdYkUcTAC_R>|2M$Y*vGDDo>2aA|+|1uNi-X2uF{NKMrN4_Q{}x*w zl)iRz?%ywcea%PXG9Qgg@l`8vQ(j$b>GHSha_8J0j=%ao{YPPX4x3$h&0jn%rnp&5 z>EffB$VYK(9d+rjx6`#Q%&uJKFP^H8{Ees9i1F0AlaKgl-5F0?7iKq}woWak@w9cP zvDi9Nt!%A{kIilKv3knK>Z$nRrfVcV(p3}1l#gnnb)mlEu-h+7-F!B?U3Xhk>Z_RI zsd=SwNw@fB7dM+Him5pA-+AU4F1~cxl~=m_#m8cbr>$%0n%l-%bK5v;4H{?La}?9| zCB;-oSk-x4jdse6#A~Q@Z7nZnctb zwQ~C^99RRcuXwUfTukw2Ex9o&FKaA4F4=8d@)u|0;MPs*kv7jTld@3*)IdW<0enjHlU^%lwUlVv3u^l&<-#nDWJjDH;qg4P`bsJE^e~R zUooXCj`mdPn%ibqUh@}ci>cZwrq+veaj-|B$Y+=yUv>uKf~z&PRKyd^9fgWnMa6KFmw!qnz?leUy`HoYINO z9Ca~gz)|t#(~~`wF*v(oQWqCf92lpIX*^X2%Ozbttiv+t;?LSk_my4aQhe54YFzMP zZMeL;KH?cYuevdckGLtX>Y$ihvs6s_ay?v3tBK`R9Mw~NG)C!`*V*aIzTuWw5 zm-%R1imzIUoAMfe`P+5TUZq^>tG&wRu-V1a{KeB^il@btEd=y8z`f5*=t~FwI z#51v~{Ff*;*4Ho7?7N^^}j* zQ}M-3*GPP%t0symAJs(bLVd-7{mzZu>~`I4O{uS~ea$P4%jSUMOP5{TY@R5l;>gb4 znx5OTE3f&BkHr*E&28hXxow;^w~e#bpmDZ6M=@<*QcU%=I@tcE__n_}owY9?`Rm%U zXO)VxboP-_jYXf6!|CG1K9cs)ZvmP!nvd!$UGp^VL+(=5N7t6zPS?D)n2OK-@9esU zjKSqnjV-2XAb;Z~yT)s|q-*`jN4nOW_=}I()mQ7%;%l85AB~r5P#Qh2mT?UnALSJ{ z)j`+RV(L1muVPwFl-KH}dfFJJTVCnfZ`9W~E57X7dsHiNHXp?of8(H-Rx6F&cxt@j zFP@4cU46BuN>@y?TYY3#UR^usnhzFJy5*8?wUTbNik?@?SYxiQc(P7hOz~$exiKm) zYb-r3*==0%7iZ(())eDXOzDcrI(Po6A$x)I*Lc|r($`l$8khNKT;i|z#$S1DT=JKX z#>?L1`icX4pNnaB@l+i7i>JjDH`PQjrK=|5BOmFCqrTGhTY&0scAF>i7YEr@A92$f zF`il%##3|5cxqi3PqQnR`5Ont6gP`0UGrHn<*&77_0-(9dYX@TnvZxYzSUEC?Yhg~ zuDjNS_^Yq>C%f)uS6=fMPm3vT8kgpwbc-)t++>%(VoFyW?WxjLTeB;#`HQo~RBaVg z>qWXa*t)Z|Y@BTk%E$H-+n1~k>Z>@qcJjAtr*$n|<5FMwf7bK9(#2OyE6}?G>2L3} zq>|2it5xR1doHKPeDY2I>WAS@*Khu&>$iG~8O3ovaXreLALHQkC|4!_m`^3nvYUTQ zcRq2>@w}$T{3~&=aT$NBk8xOZW=ZMXuZ}O!7){sMrK@jTmyc><{-&Fc>~Xzn%(%bR z*8DA(`NaF0E+6AiRaYGA8`rD)YuwZ#Uv*H7s=D57nUC}h_>@{-@|7x=e55Ov`N#T} z>K$2RcYUMymGroe^bPnp&T($$6Z6kUPjimxj>880(__*6uyI*UESK!Mw#8b(acYg;WomiE0 z)?G96VQo4+=A*Ua{FO(#IGb+qWsl-GpSZ4?6JKlJ@;W`rRmnf*Q;Df+ zujw)WN*rulRcm4#RC}(Cdk<^6#xC9JV7ls{nwY=o<}Z6(mw!BF+}~s9?VZe6En?fgZL)~2&dSDq^VZe7bxK3hjlS1$99^|dvwIIeHRp^_f0 zedi;613r$k@mGBFiTT^!Rh7TvumS({Sd5$TSA8s3w4ao5E#01}>nvS$mVZ@Ub&!wh z6W8S*?`yjGSRCtX@#A%_>J#rP-T0Vp9AvjR@%W}!_2+$X;+i3Yc8T8a^KO4$LG+GT zdi1Wpk`JF(@`?Qa;uH0iulZN<;d6`ce9S*?mtGL@K~~cF%>5mLeBwHOX?sEH{kT4N z@6Gw|_nmG&$VxHe{-#&;A(o3TyZ#eAA4KiV;W z^F9+SW~pN4e0@eKXMSPt2?afO^2<02Ze5>S5XHia+y)($YSk?O6H~+%yQQnQVNPFFWHdW&8!=8O1Ch z<|=BS+yxqAtR|&V-BwYzvZ!tvqsHV;@~VE0H+@T^_+|1@{WRuVr_XN|^U06-6s-CD zj8dKZQ$uQ5s+y{v;;-DgUeZ+~T}SB^b17{vl{NBr*YJ;#PnYi8dqP<(W?3v(S#<4` z%lSuhP5${22RBDFW{pL2M0L>^8CQO6TxQp}@*{u8S#w46Bo?zk*Id_6*In~Mb=0-v zTDa>GU0?GljroXwepD;*&)3+*U)NJL6;EA5)ml8^SP+}TW*0~E*IdoleAQgl9I^RB zEemYDQ2PQ~N70&7xphrsck?##ck_hW=a;oVewFGU@zfeIo?3UtQ|r!nx^)rpck40Y zDgOd$nQ!YZ;_2pdR8O~#qFTAN7S+?u?U;|%Q$AMDeCA#mZA?W;zr1$D4FpgOp@p?byUc0p`zM|)tZzSu5c?n6Yc^Vn#emwI-}4@jAr!z?fZY z)9RyZr+q1X?QCC-&%^j!jnBRKe2&$m(lw2ZQ8_KI)`**bntQ}|^HOs%ejkbXxV=Z$ zKom9RzTnmi*D8G{sRtFDgGzPh3Nrp^DdXdke9kgcgw?N`xtvHf53 z$M%1%ssEGvT69mb{Yv+G+pmmgevD^+jHlWEa-Y(gkL^(!`~U1d6|E7+Gg>2d-R*v4 z`@cPFnSG=8DeV*NQO(3T7QaCI(Er6fE4Jrs^!}n9Q1>vN2Q8>iNS_A0y2 z#>Wz?TLITLU7z^9IJ(#WA4X-@44rb_;XZLEB@bX z^K8Gexm2p_s<{Mz?N@(!28h}1Ioyp)F=O}N^!<)&XU`0k?ui?@Z`!`9>ub;3#(#s) z656X&>*zU9`@hX$v%BjbT}Rd5o>l(M`VNcIEViyU>7Etab8KI=`*r$zP;@Vdf7h^U zr?u~{o%rjSCicAQ#-h({Z;950+fU@LwWa+i+7s+vpT396BX-|R*Glu$Vn%b-_SN(= z2{F^p57GK^`>J9_JoUV4x%4|g`ukvf4~*GuUv>L-v@fNvo$agf=cU-(cHcX-p7q@` zT90}j%a7H>o>x`3O4lyh&)s#2@597T*FSzAiTS8b=A-9TyQcrAWXSguOXQK~<+ za{Fq0zm0h6Uin{rZ;i#Y=PP{|vume4)9!Jb{Jk}H53=iG`@g#{YQNf)`&#T?qwhO* z5Bi_o*W%v`qIG9H|Ns6zrF|myysGak`FaM^o*H{z{cpdE*}kWF@VED@*q&qeYui`T z--EOk?7If@!S**7TYHDrLi{`9rs;}mzw!Pzy8GQ)0r+QAbm!;xbJr#PTlB{5whzc- z6ZPn~@QUZysP6{so5DHn<9Mcj7uu8>+Md604u9e4_PxmeAM}df$^V_}9v}OEqr19Q z|*}o+WdFt$$!MZ8uRMko+tnIb+2xHHs-%+*ScbERDWFm?mVeBfA<@%dTE`d z&dL_RB!&&G6p9*eU^JlO`EMrC_wM}IyGY}_!QV`x@AayceXrMVN}2cj{B4c?#wk`G{pRN03F$Yt zSe@N7Ky#TeccM7U!f#zlG_hCk_vG?!x_g(he zV}WX?XNFDr{XhN=I(ny*dA}d~Z8NH&y&F|+-92;z_s!DG`~CFa=IMFWJ!j}%zbWrQ zqIu~4#*Dq<-?*n+Oj}3xeq4Xg>F)Jfv-Z6yc5kxZ-v9O)Alk3=JY)Nn{B0l5-wjr} z-$i?-Jzu5oiJABNfBkM4-J`X?{p){+7QHXiTDI%1{k+n5vFhHZs@w}o?Oq^z=Ka3= z8+ASNyL;%yY8Ah?X5R0o-ZO5>{XO=~V9(X=KBZ^m*gMel-@oa1EL{Wr6aRa&$lv}R zReuNgm%sgp<;uL@PkryOzpv1}Ci8wjy3fYHb7|d2&s6T&U(X8B?-gcu&(vD~+W(`q z@17Gf@Ap&dG=>H~?b?q*GHLm-nj3w?<@f@y974`XBJ^k)}Q?83@o$}k1 zu~ff4o5G=rPc`O=<6J<0`fQ3`eg4&}kK?d`dd9Emrs$h8mdZY<8l+-xqF#-8vMHS7 zJ{zmU#_d(+z@~7k#yt7AuX}v#|BYVxn*Q^iR{e2p;@pVWc2llJ+UK7+$H!RRT5a;Z zCe5e1oyx&haanfLpt|Gz@? zTabGX#rF?;mt^lg+`Fy#?|$*`GWuO7_TNKg-tSlZJ^Ww(n~wNzJ6Z|RyBPbv{6Bqf z68*OTiupf#ZxVYK^MCf=LdM^R^8LENzAta!J%yXk(K{yl{aNpr^v=4{JJy(wy@!%d zrQgpp@AotR{r<+@WyId0xZf1*SvOiQZXU+xYV_Y&xqUT0pY{8Y+Ipv{{XxG)X5R0+ z-_7hj?*{*-?*HX`ljvHzeKopQ{@3qKVlmzP(LMD){cj;N@AoGZWZv()zl-4iPg3z5 zo_W8Y`dg9s`<>XH?A}X9&j#-Ic-x1gXEygvJoA1({r?)$yIuV)f%_XDJwHYNooVL% ze(LX${?G4InfLqd|M{l>-_!=*;YMrU{VkcEwW9wno;|bTZxv$q_k!sAZ~EQ6{f-gs z34i&nr#O0V7yEk{_x&!~PxQ=S@AxwR{r)EWf8=8C+%xa@EB@Zt{dfM+-(%Z%+e+VC zdA3adJy`r+7XPlXDfhLg{+ajtssGQI?tPX1pLIMh*n9lU`~A#+zwh2}S9v$_x4%W} zeqp~G#Gl(YO;_*gydRI}+GIWc8~Z=#)qn3(J^mHnYc{Pu8}oN{+razWjoGU|t}1ij zAL_Qr*CIWa7=Ly6yWbZyx=pKF_4!nHy#MZXcjK%^eKzJ_{p()6ak)Bg%G`+iq~}1z zzOk|E^&j!CR^9%Y!(X_?$MO&Q#@6q~>>Im|8?#rpJ{$9Q@e5LGU{mys@!y#J-<~I% z!a44uMPf_(`Cx#o$&pNK#knO|3tP>^*2D|I zfOhRf9a^duu|h$oru82M3U`7uo=D zKw==RfrBj*8$;fWE*VaUN8 zBVaKChJ#p3^%EmG>L-dg>SG;_9FZ6W4o{3m3Ww8k3{p6ZxW!1}VPqPM6b^;KIHd4U z__ag|$0NsMAD1Y>b1ZrZIDrVoXcNE*iHWo(5`PS$?#ilaRuR^q-6rP9WkGq_BicEs?^hiD}?8S}j>cYE4F;POr)6)4}QN7n3-*1-C~| z$7_3s)A4A5J~c5TF*7j>oRyfJn1h_1I6QF#@^H>MXfu&B6GtYF0*}J$X!M!bj|OL9 znG4QM97DfZ;2h+!9J3S0aUKKC!**=qc;d|g=g^*?SU_t&=kaJqAQuwt2=s;E!o&%* zPDm^Qj|PwASWKQppja#>+g$KOqR$17L!QKWB6uvVlQ~aHEOBxP*^W(|!f`C^Q)!)& zIE}3HzIo&YZ5 zTnwHIo`d~d@I3JB#Q8|!+4Q*pDLjiP7b1mclH($za4A_YMheeJT*7e%94_I!l;d<5 zUdnkH$7wKM#wVA8m(pHFk4wPi$mK-1II)757oo2JS0q-_T1mzW6RY5G0s1O%RpN45 zm&5S<#1)Avk(VRS1O4{Ioygk~cOiwh;e9t!cq>s>BZaq+;~u2&X0qOk z6y5})4D(L0C*>O z2j^n&LGS_W4}uRR9!7hJa}C;q$VX_c0oM@aQKYb(=#L?VW#oPwDJ+G}GUR=UC$Kz@ z{sj0$;z?Rh;{RCUDIz?I{uKB$ksm>O8hkqO46SF#`B387#B<1JkPmY_2aD%m_#kU( zapHN7#fcX<7Gr%D`CQ^f@Y%#mNa3^ed>JWxhPbaFg-?^|RiyAK7`%oQJ_)~NNa5?q z*Rj8rcmvN@(cb{yB*H6bZ-Q?o-lFvu@n2>&zleMb`4ZgS2?Q`UhMEe~5NASnQ zdRprfKY?F?UvT_Po}WOm_?c{9gTD~{Yw%m-ubjVtYia$)`D@~LCx0i~+Qc6mYia*U z>kl5Lzegs#?`V78IyiV(5}xn<0H-8UxDKoD1=s@bN0^1)dYA=XNGtTRXk~euf$I~S zc|URf48I!SW_(tIPc{d$ye*KzEc$JU6oy2ti4+Fp*a|81y`)zQDNK4>b0j?v^t{>} zo|gaj!L)IfgEpHoQZiT)LxQ$nzR(&$o^cuinOY{a{ z1Fs>ihA`a1+tzD@Y>3>PqY>O2F_s$Mc3>l{+tJ?M+W~ER&W32)A$O$J5Nt@S#zpL zm<^}8NMS2vE9@=3)_Ar+Zw$L-$gS&J7 zoY>uK54OYJo^}VXBU%T}Jhb-6PPFpCJfd_)3fmC93sRU%?!A!0*08CIY~}5ZWiRx- z!M(kFTKV{Q@d}908NC23ByuOTLa@;5N~gJ-i<1 zJ-wb_cRYIXSue1gw+~X-jh?-c!mh;agA^8$XhFKiJ4N*01pE#nA&szq0mwc)zjc2Y3UK!U6Q( zA1Ull#6d`5KQh%t3J>rGgM(?+WfiHlKl*|6+8_Nu@Idd6#6Zs9z(3hL4#ewEhX>+O z2mJu=Aa96wFnF+ch<7OR5O1h=7;-4*p=d*pL%d<$aBw(YBhZIn9|0bWWh6M#E27`Q z;GxJ-9EW(LIg7wC*hYE9#5)u`l=fI}9IdgO#b}2i#}n-^^zq<$uY^{KHvt?04&#_e zo(Z5>OeEV#a1zl+f}@d>IVXXmXiedq>`irYD%nPP(>O-ao=$6;H-oHWz%jIE!lD=~ zrag=NW4+l(;aIG*ygAtBz-XLzIE==l9}XVw9YN~|??|u&oWMB|JPJG#`%&Q0;1S+j zr0@v(9D@`dPLyMj!a3wP4k?^P)_F+bZ0~rE*>E_Xb3VsR7|!Qhz%c{n3;AR|IG^@H zdK?d)fINW+^SnjGJPv&kxX4>fYcUy*^-hGtG3Y0PCweE*Ithkzy_3Bq$diyqb1Z@T z62@|rcM7-!>nY%=-f3v3a-M{C3i5PXCxIssYbjEABGJ!43Kx_6Or&rTY!)I<@Xo?= zCi+?6S>D;S&c^=??;Ij5ML!2T$2*tSxx_!+JCAIqqMrwz?_EIaJmhH{7r^2I7@k7= zLbMCfFYqoxp6^|Z6rPXwB}n0UM7b0xJeM4oA%*9Vbs184Hk=kBh0Br4u`lyh;CUJP z3UGzDlGaM%Ta~?=J8* z?{1{JQ5F60{I-JFwYO@`fF9CyHIGJNk~eNV;Xexz^>{U1OI%Zd0PQdmZ&g-GE; z-oxO-v=*|8)OrB@5qdp<{s{O8`^Ej7Q^4uSNAQ~N@DV%~pg-h2>OJN?4nFQZ;XUa+ z4gGEXM*eo-cK-JM4*rgQW3aKmli$SO+0O>E z{ic31e;0pOa94jfe|NvRzX!O7zb9IbYqvnQ^jrC@!Pb7R-^S1L+k$QVc7A)mgWnPC z=y&ov`(6CKz`gvv{d~W`F9Zwyu6{SayWa!s;rH}=`TO|2!QOr!e_ww;zc1L=@8|dT z2lxZQf&TvfApZb=FgVyh&_Bo@;vWni>>q-5sA~^J9_A18hl9iY5&lTO$R7oc@<;n) z{9=DBIMyHMkM~Rb3E%{OqCd%>>`wuw_*4C9{&ar^IK!Xm&+=#cbHF+N;rlvVSnyc?IDejhyg%Px;4kz~@E7@u{S*C@{FD79{we;c{%PQ8{^|Zw{|x_3 z@J#0V|5ET$|1y7>zuaE|uJBj-tNhFTE5IxK zEB&kdtNm-hYy4~d>yX#_*ZVghujjlD?P}!J{*C@k;7xeljD9uto55?a+ydU>-%7u0 z!0V8=aa`-)&Uq_%2e#Y%JBfE4cpdG#{JUx0#d#;%4an6*y8(SQxZ1ym);<2c;LYHT z9QTpuUQjIVBik)tDba5MZ%3AKmV&p@D(5Wo*EqR`Y`6LMbKFMz0b2L_50do`@DAD! z!QxKvPTCKX|1SR#r0_1R5BrZ|dlW`@`;WnBHTq-VWB%i`9`~OB?*Z@SybpX5d;ep4zR39!$Ad6` znNMB>U!?sqJzfA`LB2wS=lxfS`5gMI;H&;?v|c0Qv;OOFcn1A-@OA$UT5rJcY5z_C zE#w=>r#Rk%`&*3VN&ju|Ev#>Y@A&Vcy~Fti+S|zYXuScxL9F+Y!q--;R{Xm?x{*Ofd2K`5HJsH17TMw@Hf1>r1|1tORTt?&7Y{U`EeWFqM$ zeOi9<54@Af-|2^-6(oNpUNRYA3z8wNF!>wVvXYx2!(7thQ!_qDGbP23n@&(XltaAtupv+!BGQ7W$>+$EN9KvOKyV{)}w!Y zq_8d#8z6;s$n>(`z+uDWw&>epeVJ9HR(fp z0(;T!O^=>nA7mdQ^hoYY%g8L@-qqQFyyCwU=p(}b{uy3*-t$r{pO!iL>K=wlx za14O^0LGG^90(4;IuP7HIS6fk&VFbEkq6M~2lgY@V5G1w(GNrl_apZ~Na4P)>5c4@ z9D?N_^daDoD8D2wBGlHW8+w&j#lZ zc`Di*a8B}YT8EQ!a`K4ek;uc5Q#g)<#gQd5g|lIBJW@Cde!Y>x`N;X$k54YZa~}Eva3K+nLt6+gOrAjN z1mYjdYMzTc0eK8(F0EYH&E+@>M!E1kiuIj`$0DTg1o|&V3KtUbM5J&5nR+9ICnZk? zPo~wIRixHp^dTQ~>B83-Y zy(W1bw(DSYN%DFaU5b7^czyB)S~nzb1TO=ZaV`gM0&m2A6L>RtL-H1+@CN$aiWFW? zl-rQP>&S6CQg{tn??4K#P2S0IEgbITyo=*%7~aKsH^)^lU(F|Xfp^hfO^-Xldyw}K z;g00J#JnB-Uhv-JeYEZ)<88@OINXX}3YI3zXqCb6mSlNy4YCY*GshaZuVE}VCGQ8< zV7(uFAo(EL1Ds`O_ah&oRR)$3>tUp@l<1Ejh4+#BQKax**sMn0lY9)zqv(%;k0l?c z^*H{IB%dI{!{|?dPb8nD^(65hNnY@e9M8bw85rJA`&qPS(Vs~^ zhkQEuJW}{H-Y+19PZ8xsr0_{{yo3}!LDrX%!pGsX8Yz4Q`3m-zldt0W68fv)tI5}B zy+)iDldlu`1@za!H^}%r+8f{-$v0`enS2X;4t$n#IrujC7WTKncara-y~Fti+S|zY zXuScxL6rBA!qPs#KhQuqlBzDEi_hTm$Wa2;|T_V1HF;Q1Z;58#hP_!jL)@W11e*mRT7Xo)te^(A8o}oDPJljg3l1;Xl5=ygCblhtt%&M_ zKJ8k;*0gGIZiN;gYZEO%uMO4?>d>ka)CD&KLymgnsSAolJ+jpRw;_5Ba7$!;&TYUg zXf@!hA2f8bA=$PFw&mD@b|YHb2HTOfCRmg9_ORFr+=})NH3@bG>wtAR>w($e&e*fTreKqx8B*AUKD!`=I}v49q_8nLc0&qx zAnWc(;f_Ibjve99oO2J3?P0hF=bjwf!90gg_5k;wokNf2U<+gmBJ3WtB<61DEy0#S zD_X6{xNFcF4!fYY23rTYv~pqCENBztA#;&UIr8A1$5^t1wqPFCwqU!UJz6`?T(q{x z4zzN?Tw--Z3R@Gs6H?fU+?|oamaxe|wg|dl>5Se5>=NunYcKpe1$z^rBl_Op-a$UC zeByTq3dq(Dy#Oo>y3#5@w&&;yi>@$iOS>CdH}tMScVuDE11T)TyC+guK$KocVLmzb zK??UKYj31*FF55Og?*5Hu=fu3#d9C@eZhT${b=n+oL)g+BKJh^3-%*p543(@zo0*@ z{=opSJJ^l09ykyjfPEmie=rDbf6jhr1Ca;N>Ie2C%3!3hFVPP~3il)TK}g}gu*pI8 z35H-f2z>}RBsiGX!T28-972S_=!bxZ68QkML%~CXp|pmQbN}G5U>I^JauCNbSPX;V zK-N;dU^qv;U<5}!tcM|o1tY=3f+D2wFnW$c3WpMRG*WmdnZ_W6hrpm1DLfc{IY{AH zU`cQacuH_;a9VJBuoPSxoDrNEoE4l6o*kSMoEw}MoDZHK zTo7CsTohakUL0H!TpC;!ECZJX%Yzlc%3u|^D!3f&3fI08c~x+Aa1D4(aBXm1aD8wC zctdbwa8qz|a0_@#aBFZ|aC>kEct>z&a9415uo_$)+!Ndz+!vIBr9oLx9;^xO2k#Fa z2p$X`3LXX@4ju^}4IT>~2Okff2%Zd{3Z4d^4xR~~4W0|02cHjKKzq@(UqZedyb`<$ zz8bt1ydJy}ya~P;ycN71yc4_&z8kz3ydQiJd(ued%euv55bSY`rs$Wax9t3BxQfE8Hxs5pEuC0d5g)8P*K93TuJ2!mY#FVV$rpSU0Q}ZWGoI8-NYM zhT*nhqi{QLyKwt(hj7QRG1xfVDQpt%9A<;rVbic#xJ$SzxNEpuxO><<+#}pG%n4hB zEyGq}>o7NL6Xu0&!**eNuzlDe>=B-Sb6G;GsgR1{8!(J1uk;Ph|? ztr_7=a5OlEvlyHO&cr?ooDI$h=OBeM=yNzyIGrd*AcfP&aU@bWg{(&*g;T?$Ii|wl zXwJDDlVLcQ^B9gvFh7=0=7Mu+A4`v;!Q+s}5#gwC9x;zZp9jthkEeA!8IK6(!{KoB z`QZF;0j&ivoD(h#Pe3j}&gM7)?k6yoS>Yn^1gwj|#o>u)i#ZpdEkd3|YXP``SSKTe z^NGF$DLkIsryzy%U~??;xbRdgr=Xt-o*JG;>ookAgr^hXWc1U))5E2-mJpo zMn3~QGdzpd8ORek&Vt2RFkD3YY_zk{&kD~$o*ABt6rPFqc}U?IL^&TRTuP1$kiyf+ zdLdGH8k~+r3NJ!lg#E(sVmvQEzZkqYyoA;z#5q5_l*s3yUkYAE#&gjw11}4g(OMQR z2hRb|<}3zRfXlJ309S^q&{lF@hPDEEIjzgU%ZPFXQg|uRuS5zjA@@~C;l;2y7I{&4 zHI}Q;uLiFUuc37f{#SwP13hm;3a=;b?MUHuWV!<>ycPy`B8At$?^vYp zF63R7#Mn28)Q1}ezQ{c1Mo(`WQ-oxO-w4V=Op!GcGb7+quUnJV2=r4jVhA+{2 zDSR1x0(^|)74p0cip48rdlGz==ud*rAYbEr6?~f3>zuEJZ#ek|*`5yHjxNq8vYorNB)5PgkwG2*E5!n!=J$QSbqY44u3)Wnezvxlk4 zQusZ&|3C`AgUwpxx8a{y{y_f|{4-2s{m%ItHZSW}`X#bFT3(h<%g_3msL8Bf$m3@v zX$4s!tz=dJ{=(zTPn@s7CCJL+lPvTwYcph!RRbvu=(jmim?Y{JNTE-jEs;VmE0I+b zDNJPj3AdUKx1zlj_L^C>@Z1u;7Fa85Yg$_qXN#=bMBW^|Hdu#@HPGsSb+YQxs+(00 z+zia(dq=rz`U zcGl~x`4(9%k-`@AZ-o@*5V18wp?y(2Fx7b(oc;~UmtZdTi@c3JJg_E{aWIwCt{b;|0D?8Mm-tsSymR+p^3z`gL= z8@(O&y}|Za^1=N7ubcA@kFv_*u(bQbC;}>C-`QPvH)zbFVU-n?NJ5E#AWcLiOp-}5 zkj#Y1B!nPRf`Cc~5tXVSMFd1ZAT*ICDhh@YDJmUQloG_szIP^*P20TM$AQ<81mJJ^@(FmW1?6_4BmZc6SCch-vl-> zO^KSCX7B;n0E?qeGibYrquPV;VX{96A3~cm9){6GEf~#B%Ye3|TC{ltizaSG^oVIq z)kd%p@uPGR17nEWP(RkRMJ;2QZDZOo*N%=FoAz|n1iw9OZ#oclFpt5euo)u`c7%^H z-w{3zJD5(WWe3iA0<~;UmM2lmcGP$ZwQNJx&ZuQu6OXl}hj>O8>`^-G!f;}(={$iW zU0@gD1kQ+uiD)7jI-4YNK82qIlZ=bVMa3sgGCe$jpA3^t3Q-Cjb~35Pji#WFV{UqP zb1fZBSLkN8E9_>{@VYTl@VcVuL@6+ZTprXine1NF(nakI)G~=~63|4`otX^$?y$S@ z5&2l}HJN1a;Ag^2<0tZyKiy+_RcsckzOiwi1Ka9S-DMiZf%dIP)SF$LuI{v>6LWnU_$@QJgsrwH!&_mr=_RRC)!q98L$XqL#zx zF9Ee2kB(>lRWpH=ui#IB6Up#0-b6UjOd^^@{&9TGW6??ION{13&FO9|HinLx)9)C* z@0P5Xj9O0O{3)pAL^8gHT27!+0&4lXnF^;8CGZv5XbS!`&YFTh4Nl|d#bibc*b1G- zs#XC`V}%p{b@PUqZf3w4W~P~i&NOeD+31^$S$NaY>ERfVHoQ2NEW}0^xZ^H%5%{L3lHw(@pUS!@STEtk0Hyd3{w%PcL;bOCdXo*=0=fbzJ zeCjNPwu^kK&4bIxJ`cWwE@v!*^NCh4mYbCUT}ie1W)(J{_&uUkW;In8zy-wb)5Su# zka!LC7n!xF^-xt-d3QOj*~Q-E$Y`=usK3>2;GAnp^GDQxQqBG-ckG`=417#x+TS|o8}Tcj*~(}YRfUyxIciy%Okt>HC30VZT2`dym8fL} zwza5+T3)8J^jR&ytB9{+zM87D@=E;bum%~fz^egks3uWO@`q`qsfyM_FJ~+#T26me zG27sB`ZZd?H(yg%qn0%}{~FY?1{tqKEvr+hz+4+(EnSCy9kT^|MK-zyzcy!GgI^og z)+%!~V+DMVpB=ST3$?7xiqH5CYw3F3pc~pnHm{qTN0pa<1Z z(J)#MsgYt73uDz-P1ID)U^B((VKr9^*g`Gw9tp&)(AIiXZD1RokSWC1NE>*skX}MOw6+N>@5OaGP@IMS=mkOhFDg1Gkc!?p54O!sDH$q ze!tJ1kmYwdlGD6Szrz`y;PfY^#w9ffD?OC$O1zsRepgPS*Xv7)uiGFj!{E0w)S_ikQM@uJVaxOZa;q!KNCHhJ8Ulv4> zz(X=;TIk?;9YxVmhBwn~&u$Qw?ez6@dr};<8s*3?InX%fg6ptn1(RNMPRX>_ox}yW zJ>l7SbsW9I95!t|2h|)8TzplI+XIKgOWTRKE3$5#2KKab8sStDMCSC&wMSCY;#(It zAIN#(oggWzgE@kY1(uzAKUh+FExj-GL;_ck74J+>aJxMI(kD?opX5$X&dPLMH1A4x zXWGYn(SghiS7KJ0(^q;R_yT3cXQsM6ZjURI?nAFb=#by%^kil@eJ)R8&x`Iq*Bf}4 z_L*JqI4|*Nq8uf+DCoFzUE$fq&pG%Y?DH$W#=wm%x!%CDjS3xW!OQGtfqjj_>qgd% zaD)&_6Xgh9c_2?Hi1ei-1fG_C|3Z`hPqxqv4rB`j=VdE?WPt_6{&~l<`MzS^K91jc z?$wvx&eGP4PrpQ8=dHS<aX5E)Q>0PtLJv z>qbWKIrRv?poAkeSR;auy5y~`6UZ0Jbcvor%SsBCyaS2eG_QRo|Km*x9_C&Y-y8cx zxd-RoDVwTfS*Q?eLT;e7^A?3(pYtX|uMa;hg5Q40dHf7&;&Z0Nly+J#JXo-#kw|Am TsHaFLwX@>S{e-zwy~F+kzB(h= literal 0 HcmV?d00001 diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json new file mode 100644 index 000000000000..a6e7411f7352 --- /dev/null +++ b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json @@ -0,0 +1,47 @@ +{ + "asset": { + "version": "0.0" + }, + "geometricError": 20, + "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, + 2, + 10, + 0, + 0, + 0, + 10, + 0, + 0, + 0, + 2 + ] + }, + "geometricError": 0, + "content": { + "url": "tile.b3dm" + } + } +} diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..28f075a5bc282abf47266afe09c7062e1b78ad9f GIT binary patch literal 95166 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 J?o{uP{{ZNT{Gb2; literal 0 HcmV?d00001 diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json new file mode 100644 index 000000000000..a6e7411f7352 --- /dev/null +++ b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json @@ -0,0 +1,47 @@ +{ + "asset": { + "version": "0.0" + }, + "geometricError": 20, + "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, + 2, + 10, + 0, + 0, + 0, + 10, + 0, + 0, + 0, + 2 + ] + }, + "geometricError": 0, + "content": { + "url": "tile.b3dm" + } + } +} From 1f39c5126b2ebda26778ac3ef4b3cb56778baa66 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Wed, 9 Nov 2016 11:12:25 -0500 Subject: [PATCH 052/396] Remove hasProperty and getPropertyNames --- Source/Scene/Batched3DModel3DTileContent.js | 7 ----- Source/Scene/Cesium3DTileBatchTable.js | 28 ------------------- Source/Scene/Cesium3DTileContent.js | 11 -------- Source/Scene/Composite3DTileContent.js | 8 ------ Source/Scene/Empty3DTileContent.js | 8 ------ Source/Scene/Instanced3DModel3DTileContent.js | 7 ----- Source/Scene/PointCloud3DTileContent.js | 10 ------- Source/Scene/Tileset3DTileContent.js | 8 ------ .../Scene/Batched3DModel3DTileContentSpec.js | 1 - Specs/Scene/Cesium3DTileBatchTableSpec.js | 28 ------------------- Specs/Scene/Cesium3DTileProviderSpec.js | 3 -- Specs/Scene/PointCloud3DTileContentSpec.js | 3 -- 12 files changed, 122 deletions(-) diff --git a/Source/Scene/Batched3DModel3DTileContent.js b/Source/Scene/Batched3DModel3DTileContent.js index 16b62638bee7..49279d6c7306 100644 --- a/Source/Scene/Batched3DModel3DTileContent.js +++ b/Source/Scene/Batched3DModel3DTileContent.js @@ -122,13 +122,6 @@ define([ } } - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - Batched3DModel3DTileContent.prototype.hasProperty = function(name) { - return this.batchTable.hasProperty(name); - }; - /** * Part of the {@link Cesium3DTileContent} interface. */ diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index bb2b340c66fa..52512b1b7eeb 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -403,34 +403,6 @@ define([ result); }; - Cesium3DTileBatchTable.prototype.hasProperty = function(name) { - //>>includeStart('debug', pragmas.debug); - if (!defined(name)) { - throw new DeveloperError('name is required.'); - } - //>>includeEnd('debug'); - - var json = this.batchTableJson; - return defined(json) && defined(json[name]); - }; - - Cesium3DTileBatchTable.prototype.getPropertyNames = function() { - var names = []; - var json = this.batchTableJson; - - if (!defined(json)) { - return names; - } - - for (var name in json) { - if (json.hasOwnProperty(name)) { - names.push(name); - } - } - - return names; - }; - Cesium3DTileBatchTable.prototype.isDerived = function(batchId, className) { var hierarchy = this._batchTableHierarchy; if (!defined(hierarchy)) { diff --git a/Source/Scene/Cesium3DTileContent.js b/Source/Scene/Cesium3DTileContent.js index 1f8e82413628..e8911f7646b0 100644 --- a/Source/Scene/Cesium3DTileContent.js +++ b/Source/Scene/Cesium3DTileContent.js @@ -124,17 +124,6 @@ define([ } }); - /** - * Determines if the tile's batch table has a property. If it does, each feature in - * the tile will have the property. - * - * @param {String} name The case-sensitive name of the property. - * @returns {Boolean} true if the property exists; otherwise, false. - */ - Cesium3DTileContent.prototype.hasProperty = function(name) { - DeveloperError.throwInstantiationError(); - }; - /** * Returns the {@link Cesium3DTileFeature} object for the feature with the * given batchId. This object is used to get and modify the diff --git a/Source/Scene/Composite3DTileContent.js b/Source/Scene/Composite3DTileContent.js index b0a3c14de0c7..c9347aad6070 100644 --- a/Source/Scene/Composite3DTileContent.js +++ b/Source/Scene/Composite3DTileContent.js @@ -118,14 +118,6 @@ define([ } }); - /** - * Part of the {@link Cesium3DTileContent} interface. Composite3DTileContent - * always returns false. Instead call hasProperty for a tile in the composite. - */ - Composite3DTileContent.prototype.hasProperty = function(name) { - return false; - }; - /** * Part of the {@link Cesium3DTileContent} interface. Composite3DTileContent * always returns undefined. Instead call getFeature for a tile in the composite. diff --git a/Source/Scene/Empty3DTileContent.js b/Source/Scene/Empty3DTileContent.js index 421b524db86f..88e845df81a5 100644 --- a/Source/Scene/Empty3DTileContent.js +++ b/Source/Scene/Empty3DTileContent.js @@ -79,14 +79,6 @@ define([ } }); - /** - * Part of the {@link Cesium3DTileContent} interface. Empty3DTileContent - * always returns false since a tile of this type does not have any features. - */ - Empty3DTileContent.prototype.hasProperty = function(name) { - return false; - }; - /** * Part of the {@link Cesium3DTileContent} interface. Empty3DTileContent * always returns undefined since a tile of this type does not have any features. diff --git a/Source/Scene/Instanced3DModel3DTileContent.js b/Source/Scene/Instanced3DModel3DTileContent.js index aa4a8e4048ec..4f85673fa8f0 100644 --- a/Source/Scene/Instanced3DModel3DTileContent.js +++ b/Source/Scene/Instanced3DModel3DTileContent.js @@ -145,13 +145,6 @@ define([ } } - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - Instanced3DModel3DTileContent.prototype.hasProperty = function(name) { - return this.batchTable.hasProperty(name); - }; - /** * Part of the {@link Cesium3DTileContent} interface. */ diff --git a/Source/Scene/PointCloud3DTileContent.js b/Source/Scene/PointCloud3DTileContent.js index e86e94f57b1e..96f7a237efb9 100644 --- a/Source/Scene/PointCloud3DTileContent.js +++ b/Source/Scene/PointCloud3DTileContent.js @@ -186,16 +186,6 @@ define([ } } - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - PointCloud3DTileContent.prototype.hasProperty = function(name) { - if (defined(this.batchTable)) { - return this.batchTable.hasProperty(name); - } - return false; - }; - /** * Part of the {@link Cesium3DTileContent} interface. * diff --git a/Source/Scene/Tileset3DTileContent.js b/Source/Scene/Tileset3DTileContent.js index 9fd0d5c09296..bf8be7fa87c3 100644 --- a/Source/Scene/Tileset3DTileContent.js +++ b/Source/Scene/Tileset3DTileContent.js @@ -77,14 +77,6 @@ define([ } }); - /** - * Part of the {@link Cesium3DTileContent} interface. Tileset3DTileContent - * always returns false since a tile of this type does not have any features. - */ - Tileset3DTileContent.prototype.hasProperty = function(name) { - return false; - }; - /** * Part of the {@link Cesium3DTileContent} interface. Tileset3DTileContent * always returns undefined since a tile of this type does not have any features. diff --git a/Specs/Scene/Batched3DModel3DTileContentSpec.js b/Specs/Scene/Batched3DModel3DTileContentSpec.js index ff34b4915793..948780cc9ca5 100644 --- a/Specs/Scene/Batched3DModel3DTileContentSpec.js +++ b/Specs/Scene/Batched3DModel3DTileContentSpec.js @@ -181,7 +181,6 @@ defineSuite([ var content = tileset._root.content; expect(content.featuresLength).toBe(10); expect(content.innerContents).toBeUndefined(); - expect(content.hasProperty('id')).toBe(true); expect(content.getFeature(0)).toBeDefined(); }); }); diff --git a/Specs/Scene/Cesium3DTileBatchTableSpec.js b/Specs/Scene/Cesium3DTileBatchTableSpec.js index f717358910cd..bc96d075bc9d 100644 --- a/Specs/Scene/Cesium3DTileBatchTableSpec.js +++ b/Specs/Scene/Cesium3DTileBatchTableSpec.js @@ -229,34 +229,6 @@ defineSuite([ expect(batchTable.getColor(0, result)).toEqual(Color.YELLOW); }); - it('hasProperty throws with undefined name', function() { - var batchTable = new Cesium3DTileBatchTable(mockContent, 1); - expect(function() { - batchTable.hasProperty(); - }).toThrowDeveloperError(); - }); - - it('hasProperty', function() { - var batchTableJson = { - height: [0.0] - }; - var batchTable = new Cesium3DTileBatchTable(mockContent, 1, batchTableJson); - expect(batchTable.hasProperty('height')).toEqual(true); - expect(batchTable.hasProperty('id')).toEqual(false); - }); - - it('getPropertyNames', function() { - var batchTable = new Cesium3DTileBatchTable(mockContent, 1); - expect(batchTable.getPropertyNames()).toEqual([]); - - var batchTableJson = { - height: [0.0], - id : [0] - }; - batchTable = new Cesium3DTileBatchTable(mockContent, 1, batchTableJson); - expect(batchTable.getPropertyNames()).toEqual(['height', 'id']); - }); - it('getProperty throws with invalid batchId', function() { var batchTable = new Cesium3DTileBatchTable(mockContent, 1); expect(function() { diff --git a/Specs/Scene/Cesium3DTileProviderSpec.js b/Specs/Scene/Cesium3DTileProviderSpec.js index 08fc6554c1c0..0fdb71b85faa 100644 --- a/Specs/Scene/Cesium3DTileProviderSpec.js +++ b/Specs/Scene/Cesium3DTileProviderSpec.js @@ -13,9 +13,6 @@ defineSuite([ expect(function() { return content.innerContents; }).toThrowDeveloperError(); - expect(function() { - return content.hasProperty('height'); - }).toThrowDeveloperError(); expect(function() { return content.getFeature(0); }).toThrowDeveloperError(); diff --git a/Specs/Scene/PointCloud3DTileContentSpec.js b/Specs/Scene/PointCloud3DTileContentSpec.js index dec0f6ba5b87..3d1deb2ac851 100644 --- a/Specs/Scene/PointCloud3DTileContentSpec.js +++ b/Specs/Scene/PointCloud3DTileContentSpec.js @@ -292,7 +292,6 @@ defineSuite([ var content = tileset._root.content; expect(content.featuresLength).toBe(0); expect(content.innerContents).toBeUndefined(); - expect(content.hasProperty('name')).toBe(false); expect(content.getFeature(0)).toBeUndefined(); }); }); @@ -302,7 +301,6 @@ defineSuite([ var content = tileset._root.content; expect(content.featuresLength).toBe(8); expect(content.innerContents).toBeUndefined(); - expect(content.hasProperty('name')).toBe(true); expect(content.getFeature(0)).toBeDefined(); }); }); @@ -315,7 +313,6 @@ defineSuite([ var content = tileset._root.content; expect(content.featuresLength).toBe(0); expect(content.innerContents).toBeUndefined(); - expect(content.hasProperty('name')).toBe(false); expect(content.getFeature(0)).toBeUndefined(); }); }); From 2043bff8c7d661d30ab4254a28bbf9cd5a5ddadf Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Wed, 9 Nov 2016 15:25:52 -0500 Subject: [PATCH 053/396] Change root node condition to be when the parentId equals itself --- Source/Scene/Cesium3DTileBatchTable.js | 38 ++++++++++++------ .../Hierarchy/BatchTableHierarchy/tile.b3dm | Bin 94462 -> 94462 bytes .../BatchTableHierarchyBinary/tile.b3dm | Bin 95166 -> 95190 bytes 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index 52512b1b7eeb..0fdbc2425335 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -141,14 +141,14 @@ define([ var parentIds = json.parentIds; if (defined(classIds.byteOffset)) { - classIds.componentType = defaultValue(classIds.componentType, 'SHORT'); + classIds.componentType = defaultValue(classIds.componentType, 'UNSIGNED_SHORT'); classIds.type = 'SCALAR'; binaryAccessor = getBinaryAccessor(classIds); classIds = binaryAccessor.createArrayBufferView(binary.buffer, binary.byteOffset + classIds.byteOffset, instancesLength); } if (defined(parentIds.byteOffset)) { - parentIds.componentType = defaultValue(parentIds.componentType, 'SHORT'); + parentIds.componentType = defaultValue(parentIds.componentType, 'UNSIGNED_SHORT'); parentIds.type = 'SCALAR'; binaryAccessor = getBinaryAccessor(parentIds); parentIds = binaryAccessor.createArrayBufferView(binary.buffer, binary.byteOffset + parentIds.byteOffset, instancesLength); @@ -409,16 +409,20 @@ define([ return false; } var instanceIndex = batchId; - while (instanceIndex !== -1) { + while (true) { var classId = hierarchy.classIds[instanceIndex]; var instanceClass = hierarchy.classes[classId]; if (instanceClass.name === className) { return true; } + // Stop the traversal when the instance has no parent (its parentId equals itself) + var parentId = hierarchy.parentIds[instanceIndex]; + if (parentId === instanceIndex) { + return false; + } // Recursively check parent - instanceIndex = hierarchy.parentIds[instanceIndex]; + instanceIndex = parentId; } - return false; }; Cesium3DTileBatchTable.prototype.isClass = function(batchId, className) { @@ -454,7 +458,7 @@ define([ function getHierarchyProperty(batchTable, batchId, name) { var hierarchy = batchTable._batchTableHierarchy; var instanceIndex = batchId; - while (instanceIndex !== -1) { + while (true) { var classId = hierarchy.classIds[instanceIndex]; var instanceClass = hierarchy.classes[classId]; var indexInClass = hierarchy.classIndexes[instanceIndex]; @@ -466,16 +470,20 @@ define([ return clone(propertyValues[indexInClass], true); } } - // Recursively check parent for the property - instanceIndex = hierarchy.parentIds[instanceIndex]; + // Stop the traversal when the instance has no parent (its parentId equals itself) + var parentId = hierarchy.parentIds[instanceIndex]; + if (parentId === instanceIndex) { + return undefined; + } + // Recursively check parent + instanceIndex = parentId; } - return undefined; } function setHierarchyProperty(batchTable, batchId, name, value) { var hierarchy = batchTable._batchTableHierarchy; var instanceIndex = batchId; - while (instanceIndex !== -1) { + while (true) { var classId = hierarchy.classIds[instanceIndex]; var instanceClass = hierarchy.classes[classId]; var indexInClass = hierarchy.classIndexes[instanceIndex]; @@ -488,10 +496,14 @@ define([ } return true; } - // Recursively check parent for the property - instanceIndex = hierarchy.parentIds[instanceIndex]; + // Stop the traversal when the instance has no parent (its parentId equals itself) + var parentId = hierarchy.parentIds[instanceIndex]; + if (parentId === instanceIndex) { + return false; + } + // Recursively check parent + instanceIndex = parentId; } - return false; } Cesium3DTileBatchTable.prototype.getProperty = function(batchId, name) { diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm index 99c68bbb129bd337b0ea2452cc7165ba37fdc4c6..16a99c7d6f544883adec201367da3dee5fb26c17 100644 GIT binary patch delta 21 dcmezOkoDg~)(!HkOvc8|imcleSsCwU0{~@q2h;!n delta 21 dcmezOkoDg~)(!HkOuB~6imcleSsCwU0{~?p2h0Ef diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm index 28f075a5bc282abf47266afe09c7062e1b78ad9f..3afd696765c3c2a30d2d01e06183fc8ddcb7e813 100644 GIT binary patch delta 87 zcmdn@ob}psR=yC6WUE+g1{DUTYuo|O@)UtLn dDJV=fU<=wD#kPu(MG>gInS*0H2M6P}Yyea}7q0*S delta 58 zcmccioOR!GR=y Date: Wed, 9 Nov 2016 15:29:26 -0500 Subject: [PATCH 054/396] Naming isExactClass and isClass --- Apps/Sandcastle/gallery/3D Tiles Hierarchy.html | 4 ++-- Source/Scene/Cesium3DTileBatchTable.js | 4 ++-- Source/Scene/Cesium3DTileFeature.js | 8 ++++---- Source/Scene/Expression.js | 14 +++++++------- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Apps/Sandcastle/gallery/3D Tiles Hierarchy.html b/Apps/Sandcastle/gallery/3D Tiles Hierarchy.html index bb412cd7a059..33d70bed5a64 100644 --- a/Apps/Sandcastle/gallery/3D Tiles Hierarchy.html +++ b/Apps/Sandcastle/gallery/3D Tiles Hierarchy.html @@ -70,7 +70,7 @@ addStyle('Color all doors', { "color" : { "conditions" : [ - ["isClass('door')", "color('orange')"], + ["isExactClass('door')", "color('orange')"], ["true", "color('white')"] ] } @@ -79,7 +79,7 @@ addStyle('Color all features derived from door', { "color" : { "conditions" : [ - ["isDerived('door')", "color('orange')"], + ["isClass('door')", "color('orange')"], ["true", "color('white')"] ] } diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index 0fdbc2425335..84b8656365a5 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -403,7 +403,7 @@ define([ result); }; - Cesium3DTileBatchTable.prototype.isDerived = function(batchId, className) { + Cesium3DTileBatchTable.prototype.isClass = function(batchId, className) { var hierarchy = this._batchTableHierarchy; if (!defined(hierarchy)) { return false; @@ -425,7 +425,7 @@ define([ } }; - Cesium3DTileBatchTable.prototype.isClass = function(batchId, className) { + Cesium3DTileBatchTable.prototype.isExactClass = function(batchId, className) { var hierarchy = this._batchTableHierarchy; if (!defined(hierarchy)) { return false; diff --git a/Source/Scene/Cesium3DTileFeature.js b/Source/Scene/Cesium3DTileFeature.js index d9294b961ff6..356a29b8b3a2 100644 --- a/Source/Scene/Cesium3DTileFeature.js +++ b/Source/Scene/Cesium3DTileFeature.js @@ -169,13 +169,13 @@ define([ }; // TODO : add doc - Cesium3DTileFeature.prototype.isClass = function(className) { - return this._batchTable.isClass(this._batchId, className); + Cesium3DTileFeature.prototype.isExactClass = function(className) { + return this._batchTable.isExactClass(this._batchId, className); }; // TODO : add doc - Cesium3DTileFeature.prototype.isDerived = function(className) { - return this._batchTable.isDerived(this._batchId, className); + Cesium3DTileFeature.prototype.isClass = function(className) { + return this._batchTable.isClass(this._batchId, className); }; return Cesium3DTileFeature; diff --git a/Source/Scene/Expression.js b/Source/Scene/Expression.js index 9bfa4bee769b..1944f5ae18e2 100644 --- a/Source/Scene/Expression.js +++ b/Source/Scene/Expression.js @@ -338,7 +338,7 @@ define([ } val = createRuntimeAst(expression, args[0]); return new Node(ExpressionNodeType.UNARY, call, val); - } else if (call === 'isClass') { + } else if (call === 'isExactClass') { //>>includeStart('debug', pragmas.debug); if (args.length < 1 || args.length > 1) { throw new DeveloperError('Error: ' + call + ' requires exactly one argument.'); @@ -346,7 +346,7 @@ define([ //>>includeEnd('debug'); val = createRuntimeAst(expression, args[0]); return new Node(ExpressionNodeType.UNARY, call, val); - } else if (call === 'isDerived') { + } else if (call === 'isClass') { //>>includeStart('debug', pragmas.debug); if (args.length < 1 || args.length > 1) { throw new DeveloperError('Error: ' + call + ' requires exactly one argument.'); @@ -607,9 +607,9 @@ define([ node.evaluate = node._evaluateNaN; } else if (node._value === 'isFinite') { node.evaluate = node._evaluateIsFinite; - } else if (node._value === 'isClass') { + } else if (node._value === 'isExactClass') { node.evaluate = node._evaluateIsClass; - } else if (node._value === 'isDerived') { + } else if (node._value === 'isClass') { node.evaluate = node._evaluateIsDerived; } else if (node._value === 'abs') { node.evaluate = node._evaluateAbsoluteValue; @@ -945,11 +945,11 @@ define([ }; Node.prototype._evaluateIsClass = function(feature) { - return feature.isClass(this._left.evaluate(feature)); + return feature.isExactClass(this._left.evaluate(feature)); }; Node.prototype._evaluateIsDerived = function(feature) { - return feature.isDerived(this._left.evaluate(feature)); + return feature.isClass(this._left.evaluate(feature)); }; Node.prototype._evaluateAbsoluteValue = function(feature) { @@ -1189,7 +1189,7 @@ define([ return 'sqrt(' + left + ')'; } //>>includeStart('debug', pragmas.debug); - else if ((value === 'isNaN') || (value === 'isFinite') || (value === 'String') || (value === 'isClass') || (value === 'isDerived')) { + else if ((value === 'isNaN') || (value === 'isFinite') || (value === 'String') || (value === 'isExactClass') || (value === 'isClass')) { throw new DeveloperError('Error generating style shader: "' + value + '" is not supported.'); } //>>includeEnd('debug'); From 4fb68fea84aef1dc023cbd4d7071431c8dd7eb8c Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Wed, 9 Nov 2016 16:35:47 -0500 Subject: [PATCH 055/396] Check for circular dependencies --- Source/Scene/Cesium3DTileBatchTable.js | 24 +++++++++++++++++- .../Hierarchy/BatchTableHierarchy/tile.b3dm | Bin 94462 -> 94462 bytes .../BatchTableHierarchyBinary/tile.b3dm | Bin 95190 -> 95190 bytes 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index 84b8656365a5..440d2fb1b59f 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -133,6 +133,7 @@ define([ function initializeHierarchy(json, binary) { var i; + var classId; var binaryAccessor; var instancesLength = json.instancesLength; @@ -165,11 +166,32 @@ define([ var classCounts = arrayFill(new Array(classesLength), 0); var classIndexes = new Array(instancesLength); for (i = 0; i < instancesLength; ++i) { - var classId = classIds[i]; + classId = classIds[i]; classIndexes[i] = classCounts[classId]; ++classCounts[classId]; } + // Check for circular dependencies + //>>includeStart('debug', pragmas.debug); + var visited = new Array(instancesLength); + for (i = 0; i < instancesLength; ++i) { + arrayFill(visited, false); + var instanceIndex = i; + while (true) { + visited[instanceIndex] = true; + var parentId = parentIds[instanceIndex]; + if (parentId === instanceIndex) { + // Stop the traversal when the instance has no parent (its parentId equals itself) + break; + } + if (visited[parentId]) { + throw new DeveloperError('Circular dependency detected in the batch table hierarchy.'); + } + instanceIndex = parentId; + } + } + //>>includeEnd('debug'); + return { classes : classes, classIds : classIds, diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm index 16a99c7d6f544883adec201367da3dee5fb26c17..4cf1c3f60944b8c3f208c7a70fdf85654aafd48a 100644 GIT binary patch delta 24 gcmezOkoDg~)(v8;j0Te>SRXWhXWjmtm61Ig0E^rS`Tzg` delta 25 hcmezOkoDg~)(v8;Ovc8O#aSOT|6twzgO!mj8vv813NZix diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm index 3afd696765c3c2a30d2d01e06183fc8ddcb7e813..2cfdd3d660f02c20785b13cf69c810d54dd57cdf 100644 GIT binary patch delta 20 ccmcciob}ps)(rw2j10|!9NPss7>{NH09Gjm>i_@% delta 20 ccmcciob}ps)(rw2jEc>I9NPss7>{NH09SJd3;+NC From 0a725f7263f8d96ddf79ce11c7b46f500e17ab1f Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 10 Nov 2016 13:36:59 -0500 Subject: [PATCH 056/396] Added getClassName built-in function --- Source/Scene/Cesium3DTileBatchTable.js | 10 ++++++++-- Source/Scene/Expression.js | 16 +++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index 440d2fb1b59f..43e2074a89e4 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -426,6 +426,8 @@ define([ }; Cesium3DTileBatchTable.prototype.isClass = function(batchId, className) { + // PERFORMANCE_IDEA : cache results in the ancestor classes to speed up this check if + // this area becomes a hotspot var hierarchy = this._batchTableHierarchy; if (!defined(hierarchy)) { return false; @@ -448,13 +450,17 @@ define([ }; Cesium3DTileBatchTable.prototype.isExactClass = function(batchId, className) { + return (this.getClassName(batchId) === className); + }; + + Cesium3DTileBatchTable.prototype.getClassName = function(batchId) { var hierarchy = this._batchTableHierarchy; if (!defined(hierarchy)) { - return false; + return undefined; } var classId = hierarchy.classIds[batchId]; var instanceClass = hierarchy.classes[classId]; - return instanceClass.name === className; + return instanceClass.name; }; function getBinaryProperty(binaryProperty, index) { diff --git a/Source/Scene/Expression.js b/Source/Scene/Expression.js index 1944f5ae18e2..87397c9ac465 100644 --- a/Source/Scene/Expression.js +++ b/Source/Scene/Expression.js @@ -354,6 +354,14 @@ define([ //>>includeEnd('debug'); val = createRuntimeAst(expression, args[0]); return new Node(ExpressionNodeType.UNARY, call, val); + } else if (call === 'getClassName') { + //>>includeStart('debug', pragmas.debug); + if (args.length < 1 || args.length > 1) { + throw new DeveloperError('Error: ' + call + ' requires exactly one argument.'); + } + //>>includeEnd('debug'); + val = createRuntimeAst(expression, args[0]); + return new Node(ExpressionNodeType.UNARY, call, val); } else if (call === 'abs') { //>>includeStart('debug', pragmas.debug); if (args.length < 1 || args.length > 1) { @@ -611,6 +619,8 @@ define([ node.evaluate = node._evaluateIsClass; } else if (node._value === 'isClass') { node.evaluate = node._evaluateIsDerived; + } else if (node._value === 'getClassName') { + node.evaluate = node._evaluateGetClassName; } else if (node._value === 'abs') { node.evaluate = node._evaluateAbsoluteValue; } else if (node._value === 'cos') { @@ -952,6 +962,10 @@ define([ return feature.isClass(this._left.evaluate(feature)); }; + Node.prototype._evaluateGetClassName = function(feature) { + return feature.getClassName(this._left.evaluate(feature)); + }; + Node.prototype._evaluateAbsoluteValue = function(feature) { return Math.abs(this._left.evaluate(feature)); }; @@ -1189,7 +1203,7 @@ define([ return 'sqrt(' + left + ')'; } //>>includeStart('debug', pragmas.debug); - else if ((value === 'isNaN') || (value === 'isFinite') || (value === 'String') || (value === 'isExactClass') || (value === 'isClass')) { + else if ((value === 'isNaN') || (value === 'isFinite') || (value === 'String') || (value === 'isExactClass') || (value === 'isClass') || (value === 'getClassName')) { throw new DeveloperError('Error generating style shader: "' + value + '" is not supported.'); } //>>includeEnd('debug'); From 23145fac6c26415ebb7ed6c50c8c5c9f09b68d22 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 14 Nov 2016 10:49:12 +1100 Subject: [PATCH 057/396] Don't use an ancestor tile if it needs to be reprojected and hasn't been. --- Source/Scene/TileImagery.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Scene/TileImagery.js b/Source/Scene/TileImagery.js index d7ef752a7191..a38510ebae22 100644 --- a/Source/Scene/TileImagery.js +++ b/Source/Scene/TileImagery.js @@ -65,7 +65,7 @@ define([ // Find some ancestor imagery we can use while this imagery is still loading. var ancestor = loadingImagery.parent; var closestAncestorThatNeedsLoading; - while (defined(ancestor) && ancestor.state !== ImageryState.READY) { + while (defined(ancestor) && (ancestor.state !== ImageryState.READY || (!this.useWebMercatorT && !defined(ancestor.texture)))) { if (ancestor.state !== ImageryState.FAILED && ancestor.state !== ImageryState.INVALID) { // ancestor is still loading closestAncestorThatNeedsLoading = closestAncestorThatNeedsLoading || ancestor; From 26bc421a8ed35111abf4c09ef1832d221347123c Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Tue, 15 Nov 2016 15:34:33 -0500 Subject: [PATCH 058/396] Support multiple parents --- .idea/misc.xml | 13 - .../gallery/3D Tiles Hierarchy.html | 13 +- Source/Scene/Cesium3DTileBatchTable.js | 276 +++++++++++++----- .../Hierarchy/BatchTableHierarchy/tile.b3dm | Bin 94462 -> 94462 bytes .../BatchTableHierarchyBinary/tile.b3dm | Bin 95190 -> 95054 bytes .../tile.b3dm | Bin 0 -> 94790 bytes .../tileset.json | 47 +++ 7 files changed, 255 insertions(+), 94 deletions(-) delete mode 100644 .idea/misc.xml create mode 100644 Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tile.b3dm create mode 100644 Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tileset.json diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 72abef0a7321..000000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/Apps/Sandcastle/gallery/3D Tiles Hierarchy.html b/Apps/Sandcastle/gallery/3D Tiles Hierarchy.html index 33d70bed5a64..c38ce003e46d 100644 --- a/Apps/Sandcastle/gallery/3D Tiles Hierarchy.html +++ b/Apps/Sandcastle/gallery/3D Tiles Hierarchy.html @@ -34,7 +34,7 @@ }); var scene = viewer.scene; -var tilesetUrl = '../../../Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy'; +var tilesetUrl = '../../../Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents'; var tileset = scene.primitives.add(new Cesium.Cesium3DTileset({ url : tilesetUrl, debugShowStatistics : true @@ -96,6 +96,17 @@ } }); +addStyle('Style by classifier', { + "color" : { + "conditions" : [ + ["isClass('classifier_new') && isClass('classifier_old')", "color('purple')"], + ["isClass('classifier_new')", "color('red')"], + ["isClass('classifier_old')", "color('blue')"], + ["true", "color()"] + ] + } +}); + function setStyle(style) { return function() { tileset.style = new Cesium.Cesium3DTileStyle(style); diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index 43e2074a89e4..d0366a72b880 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -139,7 +139,9 @@ define([ var instancesLength = json.instancesLength; var classes = json.classes; var classIds = json.classIds; + var parentCounts = json.parentCounts; var parentIds = json.parentIds; + var parentIdsLength = instancesLength; if (defined(classIds.byteOffset)) { classIds.componentType = defaultValue(classIds.componentType, 'UNSIGNED_SHORT'); @@ -148,11 +150,27 @@ define([ classIds = binaryAccessor.createArrayBufferView(binary.buffer, binary.byteOffset + classIds.byteOffset, instancesLength); } + var parentIndexes; + if (defined(parentCounts)) { + if (defined(parentCounts.byteOffset)) { + parentCounts.componentType = defaultValue(parentCounts.componentType, 'UNSIGNED_SHORT'); + parentCounts.type = 'SCALAR'; + binaryAccessor = getBinaryAccessor(parentCounts); + parentCounts = binaryAccessor.createArrayBufferView(binary.buffer, binary.byteOffset + parentCounts.byteOffset, instancesLength); + } + parentIndexes = new Array(instancesLength); + parentIdsLength = 0; + for (i = 0; i < instancesLength; ++i) { + parentIndexes[i] = parentIdsLength; + parentIdsLength += parentCounts[i]; + } + } + if (defined(parentIds.byteOffset)) { parentIds.componentType = defaultValue(parentIds.componentType, 'UNSIGNED_SHORT'); parentIds.type = 'SCALAR'; binaryAccessor = getBinaryAccessor(parentIds); - parentIds = binaryAccessor.createArrayBufferView(binary.buffer, binary.byteOffset + parentIds.byteOffset, instancesLength); + parentIds = binaryAccessor.createArrayBufferView(binary.buffer, binary.byteOffset + parentIds.byteOffset, parentIdsLength); } var classesLength = classes.length; @@ -171,33 +189,40 @@ define([ ++classCounts[classId]; } - // Check for circular dependencies - //>>includeStart('debug', pragmas.debug); - var visited = new Array(instancesLength); - for (i = 0; i < instancesLength; ++i) { - arrayFill(visited, false); - var instanceIndex = i; - while (true) { - visited[instanceIndex] = true; - var parentId = parentIds[instanceIndex]; - if (parentId === instanceIndex) { - // Stop the traversal when the instance has no parent (its parentId equals itself) - break; - } - if (visited[parentId]) { - throw new DeveloperError('Circular dependency detected in the batch table hierarchy.'); - } - instanceIndex = parentId; - } - } - //>>includeEnd('debug'); - - return { + var hierarchy = { classes : classes, classIds : classIds, classIndexes : classIndexes, + parentCounts : parentCounts, + parentIndexes : parentIndexes, parentIds : parentIds }; + + //>>includeStart('debug', pragmas.debug); + validateHierarchy(hierarchy); + //>>includeEnd('debug'); + + return hierarchy; + } + + function validateHierarchy(hierarchy) { + // TODO : this can be optimized by marking instances that have already been checked + // Check for circular dependencies + var classIds = hierarchy.classIds; + var instancesLength = classIds.length; + var visited = new Array(instancesLength); + + var validateInstance = function(hierarchy, instanceIndex) { + if (visited[instanceIndex]) { + throw new DeveloperError('Circular dependency detected in the batch table hierarchy.'); + } + visited[instanceIndex] = true; + }; + + for (var i = 0; i < instancesLength; ++i) { + arrayFill(visited, false); + traverseHierarchy(hierarchy, i, validateInstance); + } } Cesium3DTileBatchTable.getBinaryProperties = function(featuresLength, json, binary) { @@ -425,44 +450,6 @@ define([ result); }; - Cesium3DTileBatchTable.prototype.isClass = function(batchId, className) { - // PERFORMANCE_IDEA : cache results in the ancestor classes to speed up this check if - // this area becomes a hotspot - var hierarchy = this._batchTableHierarchy; - if (!defined(hierarchy)) { - return false; - } - var instanceIndex = batchId; - while (true) { - var classId = hierarchy.classIds[instanceIndex]; - var instanceClass = hierarchy.classes[classId]; - if (instanceClass.name === className) { - return true; - } - // Stop the traversal when the instance has no parent (its parentId equals itself) - var parentId = hierarchy.parentIds[instanceIndex]; - if (parentId === instanceIndex) { - return false; - } - // Recursively check parent - instanceIndex = parentId; - } - }; - - Cesium3DTileBatchTable.prototype.isExactClass = function(batchId, className) { - return (this.getClassName(batchId) === className); - }; - - Cesium3DTileBatchTable.prototype.getClassName = function(batchId) { - var hierarchy = this._batchTableHierarchy; - if (!defined(hierarchy)) { - return undefined; - } - var classId = hierarchy.classIds[batchId]; - var instanceClass = hierarchy.classes[classId]; - return instanceClass.name; - }; - function getBinaryProperty(binaryProperty, index) { var typedArray = binaryProperty.typedArray; var componentCount = binaryProperty.componentCount; @@ -483,10 +470,81 @@ define([ } } + var scratchStack = []; + function traverseHierarchyMultipleParents(hierarchy, instanceIndex, endConditionCallback) { + var parentCounts = hierarchy.parentCounts; + var parentIds = hierarchy.parentIds; + var parentIndexes = hierarchy.parentIndexes; + + var stack = scratchStack; + stack.push(instanceIndex); + while (stack.length > 0) { + instanceIndex = stack.pop(); + var result = endConditionCallback(hierarchy, instanceIndex); + if (defined(result)) { + // The end condition was met, stop the traversal and return the result + return result; + } + var parentCount = parentCounts[instanceIndex]; + var parentIndex = parentIndexes[instanceIndex]; + for (var i = 0; i < parentCount; ++i) { + var parentId = parentIds[parentIndex + i]; + if (parentId !== instanceIndex) { + stack.push(parentId); + } + } + } + } + + function traverseHierarchySingleParent(hierarchy, instanceIndex, endConditionCallback) { + while (true) { + var result = endConditionCallback(hierarchy, instanceIndex); + if (defined(result)) { + // The end condition was met, stop the traversal and return the result + return result; + } + var parentId = hierarchy.parentIds[instanceIndex]; + if (parentId === instanceIndex) { + // Stop the traversal when the instance has no parent (its parentId equals itself) + break; + } + instanceIndex = parentId; + } + } + + function traverseHierarchy(hierarchy, instanceIndex, endConditionCallback) { + var parentCounts = hierarchy.parentCounts; + if (defined(parentCounts)) { + return traverseHierarchyMultipleParents(hierarchy, instanceIndex, endConditionCallback); + } else { + return traverseHierarchySingleParent(hierarchy, instanceIndex, endConditionCallback); + } + } + + function hasPropertyInHierarchy(batchTable, batchId, name) { + var hierarchy = batchTable._batchTableHierarchy; + var result = traverseHierarchy(hierarchy, batchId, function (hierarchy, instanceIndex) { + var classId = hierarchy.classIds[instanceIndex]; + var instances = hierarchy.classes[classId].instances; + if (defined(instances[name])) { + return true; + } + }); + return defined(result); + } + + function getPropertyNamesInHierarchy(batchTable, batchId, names) { + var hierarchy = batchTable._batchTableHierarchy; + traverseHierarchy(hierarchy, batchId, function (hierarchy, instanceIndex) { + var classId = hierarchy.classIds[instanceIndex]; + var instances = hierarchy.classes[classId].instances; + names.push.apply(Object.keys(instances)); + }); + } + function getHierarchyProperty(batchTable, batchId, name) { var hierarchy = batchTable._batchTableHierarchy; - var instanceIndex = batchId; - while (true) { + return traverseHierarchy(hierarchy, batchId, function (hierarchy, instanceIndex) { var classId = hierarchy.classIds[instanceIndex]; var instanceClass = hierarchy.classes[classId]; var indexInClass = hierarchy.classIndexes[instanceIndex]; @@ -498,20 +556,12 @@ define([ return clone(propertyValues[indexInClass], true); } } - // Stop the traversal when the instance has no parent (its parentId equals itself) - var parentId = hierarchy.parentIds[instanceIndex]; - if (parentId === instanceIndex) { - return undefined; - } - // Recursively check parent - instanceIndex = parentId; - } + }); } function setHierarchyProperty(batchTable, batchId, name, value) { var hierarchy = batchTable._batchTableHierarchy; - var instanceIndex = batchId; - while (true) { + var result = traverseHierarchy(hierarchy, batchId, function (hierarchy, instanceIndex) { var classId = hierarchy.classIds[instanceIndex]; var instanceClass = hierarchy.classes[classId]; var indexInClass = hierarchy.classIndexes[instanceIndex]; @@ -524,15 +574,81 @@ define([ } return true; } - // Stop the traversal when the instance has no parent (its parentId equals itself) - var parentId = hierarchy.parentIds[instanceIndex]; - if (parentId === instanceIndex) { - return false; + }); + return defined(result); + } + + Cesium3DTileBatchTable.prototype.isClass = function(batchId, className) { + // PERFORMANCE_IDEA : cache results in the ancestor classes to speed up this check if + // this area becomes a hotspot + var hierarchy = this._batchTableHierarchy; + if (!defined(hierarchy)) { + return false; + } + var result = traverseHierarchy(hierarchy, batchId, function(hierarchy, instanceIndex) { + var classId = hierarchy.classIds[instanceIndex]; + var instanceClass = hierarchy.classes[classId]; + if (instanceClass.name === className) { + return true; } - // Recursively check parent - instanceIndex = parentId; + }); + return defined(result); + }; + + Cesium3DTileBatchTable.prototype.isExactClass = function(batchId, className) { + return (this.getClassName(batchId) === className); + }; + + Cesium3DTileBatchTable.prototype.getClassName = function(batchId) { + var hierarchy = this._batchTableHierarchy; + if (!defined(hierarchy)) { + return undefined; } - } + var classId = hierarchy.classIds[batchId]; + var instanceClass = hierarchy.classes[classId]; + return instanceClass.name; + }; + + Cesium3DTileBatchTable.prototype.hasProperty = function(batchId, name) { + //>>includeStart('debug', pragmas.debug); + if (!defined(name)) { + throw new DeveloperError('name is required.'); + } + //>>includeEnd('debug'); + + var hierarchy = this._batchTableHierarchy; + if (defined(hierarchy)) { + if (hasPropertyInHierarchy(this, batchId)) { + return true; + } + } + + var json = this.batchTableJson; + return defined(json) && defined(json[name]); + }; + + Cesium3DTileBatchTable.prototype.getPropertyNames = function(batchId) { + //>>includeStart('debug', pragmas.debug); + if (!defined(batchId)) { + throw new DeveloperError('batchId required.'); + } + //>>includeEnd('debug'); + + var names = []; + var json = this.batchTableJson; + var hierarchy = this._batchTableHierarchy; + + if (!defined(json)) { + return names; + } + + if (defined(hierarchy)) { + getPropertyNamesInHierarchy(this, batchId, names); + } + + names = names.concat(Object.keys(json)); + return names; + }; Cesium3DTileBatchTable.prototype.getProperty = function(batchId, name) { var featuresLength = this.featuresLength; diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm index 4cf1c3f60944b8c3f208c7a70fdf85654aafd48a..16a99c7d6f544883adec201367da3dee5fb26c17 100644 GIT binary patch delta 25 hcmezOkoDg~)(v8;Ovc8O#aSOT|6twzgO!mj8vv813NZix delta 24 gcmezOkoDg~)(v8;j0Te>SRXWhXWjmtm61Ig0E^rS`Tzg` diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm index 2cfdd3d660f02c20785b13cf69c810d54dd57cdf..53ac2a305df58f44d2bbfa7d902572277fcf6aed 100644 GIT binary patch delta 236 zcmcciob}u@R>36Wlw3vz1_r-kMg|Tx1_q6Zg7uRNSw$z?ut-ka_ng_p$Yk;dMuW*W z7)6;)%#AjGV4TRvXgc`=tM=rz%vH>$#%4fi?a84mwM?calixGyOkyo!GO*ZO!n%a9 zo{<3pnHZRXRzLtDF%||8WCde326hHHB*@3W&mh1c$RLjdB^V?bq!^?b6p)}I0~j{T Mb8MIAVBDS!07D8TbN~PV delta 344 zcmX^2jP=@cR>36Wlw3vz28L_Jj0_xX3=A743f4238cu%CXfW~6VY- zU;r{788ZR-%##zZ35z0&g4l4GdaN=)6)Z@Y70L$DK&LaX1F;+q%m) l99RMFnF5vomhb1^`StEK~ph diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tile.b3dm new file mode 100644 index 0000000000000000000000000000000000000000..e23ca8826c28b7fed2c98771551679b4a4824d7d GIT binary patch literal 94790 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 z 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 Date: Tue, 15 Nov 2016 15:54:16 -0500 Subject: [PATCH 059/396] Add hasPropertyName and getPropertyNames back --- Source/Scene/Batched3DModel3DTileContent.js | 7 ++++ Source/Scene/Cesium3DTileBatchTable.js | 3 ++ Source/Scene/Cesium3DTileContent.js | 12 ++++++ Source/Scene/Composite3DTileContent.js | 8 ++++ Source/Scene/Empty3DTileContent.js | 8 ++++ Source/Scene/Instanced3DModel3DTileContent.js | 7 ++++ Source/Scene/PointCloud3DTileContent.js | 10 +++++ Source/Scene/Tileset3DTileContent.js | 8 ++++ .../Scene/Batched3DModel3DTileContentSpec.js | 1 + Specs/Scene/Cesium3DTileBatchTableSpec.js | 42 +++++++++++++++++++ Specs/Scene/Cesium3DTileProviderSpec.js | 3 ++ Specs/Scene/PointCloud3DTileContentSpec.js | 3 ++ 12 files changed, 112 insertions(+) diff --git a/Source/Scene/Batched3DModel3DTileContent.js b/Source/Scene/Batched3DModel3DTileContent.js index 49279d6c7306..d20cb1e2eb84 100644 --- a/Source/Scene/Batched3DModel3DTileContent.js +++ b/Source/Scene/Batched3DModel3DTileContent.js @@ -122,6 +122,13 @@ define([ } } + /** + * Part of the {@link Cesium3DTileContent} interface. + */ + Batched3DModel3DTileContent.prototype.hasProperty = function(batchId, name) { + return this.batchTable.hasProperty(batchId, name); + }; + /** * Part of the {@link Cesium3DTileContent} interface. */ diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index d0366a72b880..ffd7834aaa18 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -611,6 +611,9 @@ define([ Cesium3DTileBatchTable.prototype.hasProperty = function(batchId, name) { //>>includeStart('debug', pragmas.debug); + if (!defined(batchId)) { + throw new DeveloperError('batchId is required.'); + } if (!defined(name)) { throw new DeveloperError('name is required.'); } diff --git a/Source/Scene/Cesium3DTileContent.js b/Source/Scene/Cesium3DTileContent.js index e8911f7646b0..e63d77075858 100644 --- a/Source/Scene/Cesium3DTileContent.js +++ b/Source/Scene/Cesium3DTileContent.js @@ -124,6 +124,18 @@ define([ } }); + /** + * Determines if the tile's batch table has a property. If it does, each feature in + * the tile will have the property. + * + * @param {Number} batchId The batchId for the feature. + * @param {String} name The case-sensitive name of the property. + * @returns {Boolean} true if the property exists; otherwise, false. + */ + Cesium3DTileContent.prototype.hasProperty = function(batchId, name) { + DeveloperError.throwInstantiationError(); + }; + /** * Returns the {@link Cesium3DTileFeature} object for the feature with the * given batchId. This object is used to get and modify the diff --git a/Source/Scene/Composite3DTileContent.js b/Source/Scene/Composite3DTileContent.js index c9347aad6070..499f17919379 100644 --- a/Source/Scene/Composite3DTileContent.js +++ b/Source/Scene/Composite3DTileContent.js @@ -118,6 +118,14 @@ define([ } }); + /** + * Part of the {@link Cesium3DTileContent} interface. Composite3DTileContent + * always returns false. Instead call hasProperty for a tile in the composite. + */ + Composite3DTileContent.prototype.hasProperty = function(batchId, name) { + return false; + }; + /** * Part of the {@link Cesium3DTileContent} interface. Composite3DTileContent * always returns undefined. Instead call getFeature for a tile in the composite. diff --git a/Source/Scene/Empty3DTileContent.js b/Source/Scene/Empty3DTileContent.js index 88e845df81a5..65b45ade6d1b 100644 --- a/Source/Scene/Empty3DTileContent.js +++ b/Source/Scene/Empty3DTileContent.js @@ -79,6 +79,14 @@ define([ } }); + /** + * Part of the {@link Cesium3DTileContent} interface. Empty3DTileContent + * always returns false since a tile of this type does not have any features. + */ + Empty3DTileContent.prototype.hasProperty = function(batchId, name) { + return false; + }; + /** * Part of the {@link Cesium3DTileContent} interface. Empty3DTileContent * always returns undefined since a tile of this type does not have any features. diff --git a/Source/Scene/Instanced3DModel3DTileContent.js b/Source/Scene/Instanced3DModel3DTileContent.js index 4f85673fa8f0..c1e72aea42e3 100644 --- a/Source/Scene/Instanced3DModel3DTileContent.js +++ b/Source/Scene/Instanced3DModel3DTileContent.js @@ -145,6 +145,13 @@ define([ } } + /** + * Part of the {@link Cesium3DTileContent} interface. + */ + Instanced3DModel3DTileContent.prototype.hasProperty = function(batchId, name) { + return this.batchTable.hasProperty(batchId, name); + }; + /** * Part of the {@link Cesium3DTileContent} interface. */ diff --git a/Source/Scene/PointCloud3DTileContent.js b/Source/Scene/PointCloud3DTileContent.js index 96f7a237efb9..8c2f762bfe13 100644 --- a/Source/Scene/PointCloud3DTileContent.js +++ b/Source/Scene/PointCloud3DTileContent.js @@ -186,6 +186,16 @@ define([ } } + /** + * Part of the {@link Cesium3DTileContent} interface. + */ + PointCloud3DTileContent.prototype.hasProperty = function(batchId, name) { + if (defined(this.batchTable)) { + return this.batchTable.hasProperty(batchId, name); + } + return false; + }; + /** * Part of the {@link Cesium3DTileContent} interface. * diff --git a/Source/Scene/Tileset3DTileContent.js b/Source/Scene/Tileset3DTileContent.js index bf8be7fa87c3..49a7daba114a 100644 --- a/Source/Scene/Tileset3DTileContent.js +++ b/Source/Scene/Tileset3DTileContent.js @@ -77,6 +77,14 @@ define([ } }); + /** + * Part of the {@link Cesium3DTileContent} interface. Tileset3DTileContent + * always returns false since a tile of this type does not have any features. + */ + Tileset3DTileContent.prototype.hasProperty = function(batchId, name) { + return false; + }; + /** * Part of the {@link Cesium3DTileContent} interface. Tileset3DTileContent * always returns undefined since a tile of this type does not have any features. diff --git a/Specs/Scene/Batched3DModel3DTileContentSpec.js b/Specs/Scene/Batched3DModel3DTileContentSpec.js index 948780cc9ca5..cae42963166c 100644 --- a/Specs/Scene/Batched3DModel3DTileContentSpec.js +++ b/Specs/Scene/Batched3DModel3DTileContentSpec.js @@ -181,6 +181,7 @@ defineSuite([ var content = tileset._root.content; expect(content.featuresLength).toBe(10); expect(content.innerContents).toBeUndefined(); + expect(content.hasProperty(0, 'id')).toBe(true); expect(content.getFeature(0)).toBeDefined(); }); }); diff --git a/Specs/Scene/Cesium3DTileBatchTableSpec.js b/Specs/Scene/Cesium3DTileBatchTableSpec.js index bc96d075bc9d..a54e47867280 100644 --- a/Specs/Scene/Cesium3DTileBatchTableSpec.js +++ b/Specs/Scene/Cesium3DTileBatchTableSpec.js @@ -229,6 +229,48 @@ defineSuite([ expect(batchTable.getColor(0, result)).toEqual(Color.YELLOW); }); + it('hasProperty throws with undefined batchId', function() { + var batchTable = new Cesium3DTileBatchTable(mockContent, 1); + expect(function() { + batchTable.hasProperty(); + }).toThrowDeveloperError(); + }); + + it('hasProperty throws with undefined name', function() { + var batchTable = new Cesium3DTileBatchTable(mockContent, 1); + expect(function() { + batchTable.hasProperty(0); + }).toThrowDeveloperError(); + }); + + it('hasProperty', function() { + var batchTableJson = { + height: [0.0] + }; + var batchTable = new Cesium3DTileBatchTable(mockContent, 1, batchTableJson); + expect(batchTable.hasProperty(0, 'height')).toEqual(true); + expect(batchTable.hasProperty(0, 'id')).toEqual(false); + }); + + it('getPropertyNames throws with undefined batchId', function() { + var batchTable = new Cesium3DTileBatchTable(mockContent, 1); + expect(function() { + batchTable.getPropertyNames(); + }).toThrowDeveloperError(); + }); + + it('getPropertyNames', function() { + var batchTable = new Cesium3DTileBatchTable(mockContent, 1); + expect(batchTable.getPropertyNames(0)).toEqual([]); + + var batchTableJson = { + height: [0.0], + id : [0] + }; + batchTable = new Cesium3DTileBatchTable(mockContent, 1, batchTableJson); + expect(batchTable.getPropertyNames(0)).toEqual(['height', 'id']); + }); + it('getProperty throws with invalid batchId', function() { var batchTable = new Cesium3DTileBatchTable(mockContent, 1); expect(function() { diff --git a/Specs/Scene/Cesium3DTileProviderSpec.js b/Specs/Scene/Cesium3DTileProviderSpec.js index 0fdb71b85faa..234cf1c9dd31 100644 --- a/Specs/Scene/Cesium3DTileProviderSpec.js +++ b/Specs/Scene/Cesium3DTileProviderSpec.js @@ -13,6 +13,9 @@ defineSuite([ expect(function() { return content.innerContents; }).toThrowDeveloperError(); + expect(function() { + return content.hasProperty(0, 'height'); + }).toThrowDeveloperError(); expect(function() { return content.getFeature(0); }).toThrowDeveloperError(); diff --git a/Specs/Scene/PointCloud3DTileContentSpec.js b/Specs/Scene/PointCloud3DTileContentSpec.js index 3d1deb2ac851..214f83ea9393 100644 --- a/Specs/Scene/PointCloud3DTileContentSpec.js +++ b/Specs/Scene/PointCloud3DTileContentSpec.js @@ -292,6 +292,7 @@ defineSuite([ var content = tileset._root.content; expect(content.featuresLength).toBe(0); expect(content.innerContents).toBeUndefined(); + expect(content.hasProperty(0, 'name')).toBe(false); expect(content.getFeature(0)).toBeUndefined(); }); }); @@ -301,6 +302,7 @@ defineSuite([ var content = tileset._root.content; expect(content.featuresLength).toBe(8); expect(content.innerContents).toBeUndefined(); + expect(content.hasProperty(0, 'name')).toBe(true); expect(content.getFeature(0)).toBeDefined(); }); }); @@ -313,6 +315,7 @@ defineSuite([ var content = tileset._root.content; expect(content.featuresLength).toBe(0); expect(content.innerContents).toBeUndefined(); + expect(content.hasProperty(0, 'name')).toBe(false); expect(content.getFeature(0)).toBeUndefined(); }); }); From ccb8babf3ad66190085c24a742508bae226f418b Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 17 Nov 2016 10:24:25 -0500 Subject: [PATCH 060/396] Cleanup and more comments --- Source/Scene/Cesium3DTileBatchTable.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index ffd7834aaa18..c12e09ab5bfb 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -158,7 +158,7 @@ define([ binaryAccessor = getBinaryAccessor(parentCounts); parentCounts = binaryAccessor.createArrayBufferView(binary.buffer, binary.byteOffset + parentCounts.byteOffset, instancesLength); } - parentIndexes = new Array(instancesLength); + parentIndexes = new Uint16Array(instancesLength); parentIdsLength = 0; for (i = 0; i < instancesLength; ++i) { parentIndexes[i] = parentIdsLength; @@ -182,7 +182,7 @@ define([ } var classCounts = arrayFill(new Array(classesLength), 0); - var classIndexes = new Array(instancesLength); + var classIndexes = new Uint16Array(instancesLength); for (i = 0; i < instancesLength; ++i) { classId = classIds[i]; classIndexes[i] = classCounts[classId]; @@ -206,7 +206,7 @@ define([ } function validateHierarchy(hierarchy) { - // TODO : this can be optimized by marking instances that have already been checked + // PERFORMANCE_IDEA : this can be optimized by marking instances that have already been checked // Check for circular dependencies var classIds = hierarchy.classIds; var instancesLength = classIds.length; @@ -477,6 +477,7 @@ define([ var parentIndexes = hierarchy.parentIndexes; var stack = scratchStack; + stack.length = 0; stack.push(instanceIndex); while (stack.length > 0) { instanceIndex = stack.pop(); @@ -489,6 +490,8 @@ define([ var parentIndex = parentIndexes[instanceIndex]; for (var i = 0; i < parentCount; ++i) { var parentId = parentIds[parentIndex + i]; + // Stop the traversal when the instance has no parent (its parentId equals itself) + // else add the parent to the stack to continue the traversal. if (parentId !== instanceIndex) { stack.push(parentId); } @@ -513,6 +516,8 @@ define([ } function traverseHierarchy(hierarchy, instanceIndex, endConditionCallback) { + // Traverse over the hierarchy and process each instance with the endConditionCallback. + // When the endConditionCallback returns a value, the traversal stops and that value is returned. var parentCounts = hierarchy.parentCounts; if (defined(parentCounts)) { return traverseHierarchyMultipleParents(hierarchy, instanceIndex, endConditionCallback); @@ -523,7 +528,7 @@ define([ function hasPropertyInHierarchy(batchTable, batchId, name) { var hierarchy = batchTable._batchTableHierarchy; - var result = traverseHierarchy(hierarchy, batchId, function (hierarchy, instanceIndex) { + var result = traverseHierarchy(hierarchy, batchId, function(hierarchy, instanceIndex) { var classId = hierarchy.classIds[instanceIndex]; var instances = hierarchy.classes[classId].instances; if (defined(instances[name])) { @@ -535,7 +540,7 @@ define([ function getPropertyNamesInHierarchy(batchTable, batchId, names) { var hierarchy = batchTable._batchTableHierarchy; - traverseHierarchy(hierarchy, batchId, function (hierarchy, instanceIndex) { + traverseHierarchy(hierarchy, batchId, function(hierarchy, instanceIndex) { var classId = hierarchy.classIds[instanceIndex]; var instances = hierarchy.classes[classId].instances; names.push.apply(Object.keys(instances)); @@ -544,7 +549,7 @@ define([ function getHierarchyProperty(batchTable, batchId, name) { var hierarchy = batchTable._batchTableHierarchy; - return traverseHierarchy(hierarchy, batchId, function (hierarchy, instanceIndex) { + return traverseHierarchy(hierarchy, batchId, function(hierarchy, instanceIndex) { var classId = hierarchy.classIds[instanceIndex]; var instanceClass = hierarchy.classes[classId]; var indexInClass = hierarchy.classIndexes[instanceIndex]; @@ -561,7 +566,7 @@ define([ function setHierarchyProperty(batchTable, batchId, name, value) { var hierarchy = batchTable._batchTableHierarchy; - var result = traverseHierarchy(hierarchy, batchId, function (hierarchy, instanceIndex) { + var result = traverseHierarchy(hierarchy, batchId, function(hierarchy, instanceIndex) { var classId = hierarchy.classIds[instanceIndex]; var instanceClass = hierarchy.classes[classId]; var indexInClass = hierarchy.classIndexes[instanceIndex]; @@ -579,8 +584,7 @@ define([ } Cesium3DTileBatchTable.prototype.isClass = function(batchId, className) { - // PERFORMANCE_IDEA : cache results in the ancestor classes to speed up this check if - // this area becomes a hotspot + // PERFORMANCE_IDEA : cache results in the ancestor classes to speed up this check if this area becomes a hotspot var hierarchy = this._batchTableHierarchy; if (!defined(hierarchy)) { return false; From 2e24750983a3f9d2c187534632bb7fc4c8c8bd4a Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 17 Nov 2016 12:02:03 -0500 Subject: [PATCH 061/396] Small fixes and doc --- Source/Scene/Cesium3DTileBatchTable.js | 24 ++++++++++++++ Source/Scene/Cesium3DTileFeature.js | 39 +++++++++++++++++++++-- Source/Scene/Expression.js | 9 +++--- Specs/Scene/Cesium3DTileBatchTableSpec.js | 6 ++++ 4 files changed, 71 insertions(+), 7 deletions(-) diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index c12e09ab5bfb..f5652b6f82b2 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -213,6 +213,9 @@ define([ var visited = new Array(instancesLength); var validateInstance = function(hierarchy, instanceIndex) { + if (instanceIndex >= instancesLength) { + throw new DeveloperError('Parent index ' + instanceIndex + ' exceeds the total number of instances: ' + instancesLength); + } if (visited[instanceIndex]) { throw new DeveloperError('Circular dependency detected in the batch table hierarchy.'); } @@ -584,6 +587,15 @@ define([ } Cesium3DTileBatchTable.prototype.isClass = function(batchId, className) { + //>>includeStart('debug', pragmas.debug); + if (!defined(batchId)) { + throw new DeveloperError('batchId is required.'); + } + if (!defined(className)) { + throw new DeveloperError('className is required.'); + } + //>>includeEnd('debug'); + // PERFORMANCE_IDEA : cache results in the ancestor classes to speed up this check if this area becomes a hotspot var hierarchy = this._batchTableHierarchy; if (!defined(hierarchy)) { @@ -600,10 +612,22 @@ define([ }; Cesium3DTileBatchTable.prototype.isExactClass = function(batchId, className) { + //>>includeStart('debug', pragmas.debug); + if (!defined(className)) { + throw new DeveloperError('className is required.'); + } + //>>includeEnd('debug'); + return (this.getClassName(batchId) === className); }; Cesium3DTileBatchTable.prototype.getClassName = function(batchId) { + //>>includeStart('debug', pragmas.debug); + if (!defined(batchId)) { + throw new DeveloperError('batchId is required.'); + } + //>>includeEnd('debug'); + var hierarchy = this._batchTableHierarchy; if (!defined(hierarchy)) { return undefined; diff --git a/Source/Scene/Cesium3DTileFeature.js b/Source/Scene/Cesium3DTileFeature.js index 356a29b8b3a2..651fc33b712e 100644 --- a/Source/Scene/Cesium3DTileFeature.js +++ b/Source/Scene/Cesium3DTileFeature.js @@ -168,15 +168,50 @@ define([ this._content.featurePropertiesDirty = true; }; - // TODO : add doc + /** + * Returns whether the feature's class name equals className. Unlike {@link Cesium3DTileFeature#isClass} + * this function only checks the feature's exact class and not base classes. + *

+ * This function returns false if no batch table hierarchy is present. + *

+ * + * @param {String} className The name to check against. + * @returns {Boolean} Whether the feature's class name equals className + * + * @private + */ Cesium3DTileFeature.prototype.isExactClass = function(className) { return this._batchTable.isExactClass(this._batchId, className); }; - // TODO : add doc + /** + * Returns whether the feature's class or any base classes are named className. + *

+ * This function returns false if no batch table hierarchy is present. + *

+ * + * @param {String} className The name to check against. + * @returns {Boolean} Whether the feature's class or base classes are named className + * + * @private + */ Cesium3DTileFeature.prototype.isClass = function(className) { return this._batchTable.isClass(this._batchId, className); }; + /** + * Returns the feature's class name. + *

+ * This function returns undefined if no batch table hierarchy is present. + *

+ * + * @returns {String} The feature's class name. + * + * @private + */ + Cesium3DTileFeature.prototype.getClassName = function() { + return this._batchTable.getClassName(this._batchId); + }; + return Cesium3DTileFeature; }); diff --git a/Source/Scene/Expression.js b/Source/Scene/Expression.js index 723b3106fefd..eac1a5208679 100644 --- a/Source/Scene/Expression.js +++ b/Source/Scene/Expression.js @@ -358,12 +358,11 @@ define([ return new Node(ExpressionNodeType.UNARY, call, val); } else if (call === 'getClassName') { //>>includeStart('debug', pragmas.debug); - if (args.length < 1 || args.length > 1) { - throw new DeveloperError('Error: ' + call + ' requires exactly one argument.'); + if (args.length > 0) { + throw new DeveloperError('Error: ' + call + ' does not take any argument.'); } //>>includeEnd('debug'); - val = createRuntimeAst(expression, args[0]); - return new Node(ExpressionNodeType.UNARY, call, val); + return new Node(ExpressionNodeType.UNARY, call); } else if (call === 'abs') { //>>includeStart('debug', pragmas.debug); if (args.length < 1 || args.length > 1) { @@ -979,7 +978,7 @@ define([ }; Node.prototype._evaluateGetClassName = function(frameState, feature) { - return feature.getClassName(this._left.evaluate(frameState, feature)); + return feature.getClassName(); }; Node.prototype._evaluateAbsoluteValue = function(frameState, feature) { diff --git a/Specs/Scene/Cesium3DTileBatchTableSpec.js b/Specs/Scene/Cesium3DTileBatchTableSpec.js index a54e47867280..e56383333642 100644 --- a/Specs/Scene/Cesium3DTileBatchTableSpec.js +++ b/Specs/Scene/Cesium3DTileBatchTableSpec.js @@ -640,6 +640,12 @@ defineSuite([ }); }); + it('renders tileset with batch table hierarchy', function() { + return Cesium3DTilesTester.loadTileset(scene, batchTableHierarchyUrl).then(function(tileset) { + expectRender(tileset); + }); + }); + it('destroys', function() { return Cesium3DTilesTester.loadTileset(scene, withoutBatchTableUrl).then(function(tileset) { var content = tileset._root.content; From e3ea1bb83c79e0a1715c3ce01a829200e11c63a5 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 17 Nov 2016 15:57:32 -0500 Subject: [PATCH 062/396] Initial tests --- Source/Core/IndexDatatype.js | 2 +- Source/DataSources/PropertyBag.js | 2 +- Source/Scene/Cesium3DTileBatchTable.js | 20 ++- Source/Scene/Cesium3DTileFeature.js | 41 ++++- Specs/Scene/Cesium3DTileBatchTableSpec.js | 177 +++++++++++++++++++++- Specs/Scene/ExpressionSpec.js | 97 ++++++++++++ 6 files changed, 319 insertions(+), 20 deletions(-) diff --git a/Source/Core/IndexDatatype.js b/Source/Core/IndexDatatype.js index 7ffad3c9bc46..4ce79d1eba8c 100644 --- a/Source/Core/IndexDatatype.js +++ b/Source/Core/IndexDatatype.js @@ -96,7 +96,7 @@ define([ * or Uint32Array depending on the number of vertices. * * @param {Number} numberOfVertices Number of vertices that the indices will reference. - * @param {Any} indicesLengthOrArray Passed through to the typed array constructor. + * @param {*} indicesLengthOrArray Passed through to the typed array constructor. * @returns {Uint16Array|Uint32Array} A Uint16Array or Uint32Array constructed with indicesLengthOrArray. * * @example diff --git a/Source/DataSources/PropertyBag.js b/Source/DataSources/PropertyBag.js index 21b2930fa7e4..0dc855e147b6 100644 --- a/Source/DataSources/PropertyBag.js +++ b/Source/DataSources/PropertyBag.js @@ -102,7 +102,7 @@ define([ * Adds a property to this object. * * @param {String} propertyName The name of the property to add. - * @param {Any} [value] The value of the new property, if provided. + * @param {*} [value] The value of the new property, if provided. * @param {Function} [createPropertyCallback] A function that will be called when the value of this new property is set to a value that is not a Property. * * @exception {DeveloperError} "propertyName" is already a registered property. diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index f5652b6f82b2..664fae1d908e 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -587,9 +587,10 @@ define([ } Cesium3DTileBatchTable.prototype.isClass = function(batchId, className) { + var featuresLength = this.featuresLength; //>>includeStart('debug', pragmas.debug); - if (!defined(batchId)) { - throw new DeveloperError('batchId is required.'); + if (!defined(batchId) || (batchId < 0) || (batchId > featuresLength)) { + throw new DeveloperError('batchId is required and between zero and featuresLength - 1 (' + featuresLength - + ').'); } if (!defined(className)) { throw new DeveloperError('className is required.'); @@ -622,9 +623,10 @@ define([ }; Cesium3DTileBatchTable.prototype.getClassName = function(batchId) { + var featuresLength = this.featuresLength; //>>includeStart('debug', pragmas.debug); - if (!defined(batchId)) { - throw new DeveloperError('batchId is required.'); + if (!defined(batchId) || (batchId < 0) || (batchId > featuresLength)) { + throw new DeveloperError('batchId is required and between zero and featuresLength - 1 (' + featuresLength - + ').'); } //>>includeEnd('debug'); @@ -638,9 +640,10 @@ define([ }; Cesium3DTileBatchTable.prototype.hasProperty = function(batchId, name) { + var featuresLength = this.featuresLength; //>>includeStart('debug', pragmas.debug); - if (!defined(batchId)) { - throw new DeveloperError('batchId is required.'); + if (!defined(batchId) || (batchId < 0) || (batchId > featuresLength)) { + throw new DeveloperError('batchId is required and between zero and featuresLength - 1 (' + featuresLength - + ').'); } if (!defined(name)) { throw new DeveloperError('name is required.'); @@ -659,9 +662,10 @@ define([ }; Cesium3DTileBatchTable.prototype.getPropertyNames = function(batchId) { + var featuresLength = this.featuresLength; //>>includeStart('debug', pragmas.debug); - if (!defined(batchId)) { - throw new DeveloperError('batchId required.'); + if (!defined(batchId) || (batchId < 0) || (batchId > featuresLength)) { + throw new DeveloperError('batchId is required and between zero and featuresLength - 1 (' + featuresLength - + ').'); } //>>includeEnd('debug'); diff --git a/Source/Scene/Cesium3DTileFeature.js b/Source/Scene/Cesium3DTileFeature.js index 651fc33b712e..5baf678066ee 100644 --- a/Source/Scene/Cesium3DTileFeature.js +++ b/Source/Scene/Cesium3DTileFeature.js @@ -103,6 +103,37 @@ define([ } }); + /** + * Returns whether the feature contains this property. This includes properties from this feature's + * class and inherited classes, in addition to the standard batch table properties. + *

+ * {@link Cesium3DTileFeature#show} and {@link Cesium3DTileFeature#color} are not equivalent to + * 'show' and 'color' properties; the former are runtime-specific properties + * that are not part of the feature's properties in the stored 3D Tileset. + *

+ * + * @param {String} name The case-sensitive name of the property. + * @returns {Boolean} Whether the feature contains this property. + */ + Cesium3DTileFeature.prototype.hasProperty = function(name) { + return this._batchTable.hasProperty(this._batchId, name); + }; + + /** + * Returns an array of property names for the feature. This includes properties from this feature's + * class and inherited classes, in addition to the standard batch table properties. + *

+ * {@link Cesium3DTileFeature#show} and {@link Cesium3DTileFeature#color} are not equivalent to + * 'show' and 'color' properties; the former are runtime-specific properties + * that are not part of the feature's properties in the stored 3D Tileset. + *

+ * + * @returns {String[]} The names of the feature's properties. + */ + Cesium3DTileFeature.prototype.getPropertyNames = function() { + return this._batchTable.getPropertyNames(this._batchId); + }; + /** * Returns the value of the feature's property with the given name. *

@@ -112,7 +143,7 @@ define([ *

* * @param {String} name The case-sensitive name of the property. - * @returns {Any} The value of the property or undefined if the property does not exist. + * @returns {*} The value of the property or undefined if the property does not exist. * * @example * // Display all the properties for a feature in the console log. @@ -143,7 +174,7 @@ define([ *

* * @param {String} name The case-sensitive name of the property. - * @param {Any} value The value of the property that will be copied. + * @param {*} value The value of the property that will be copied. * * @example * var height = feature.getProperty('Height'); // e.g., the height of a building @@ -170,7 +201,7 @@ define([ /** * Returns whether the feature's class name equals className. Unlike {@link Cesium3DTileFeature#isClass} - * this function only checks the feature's exact class and not base classes. + * this function only checks the feature's exact class and not inherited classes. *

* This function returns false if no batch table hierarchy is present. *

@@ -185,13 +216,13 @@ define([ }; /** - * Returns whether the feature's class or any base classes are named className. + * Returns whether the feature's class or any inherited classes are named className. *

* This function returns false if no batch table hierarchy is present. *

* * @param {String} className The name to check against. - * @returns {Boolean} Whether the feature's class or base classes are named className + * @returns {Boolean} Whether the feature's class or inherited classes are named className * * @private */ diff --git a/Specs/Scene/Cesium3DTileBatchTableSpec.js b/Specs/Scene/Cesium3DTileBatchTableSpec.js index e56383333642..41406570e094 100644 --- a/Specs/Scene/Cesium3DTileBatchTableSpec.js +++ b/Specs/Scene/Cesium3DTileBatchTableSpec.js @@ -10,6 +10,7 @@ defineSuite([ 'Core/Matrix3', 'Core/Matrix4', 'Renderer/ContextLimits', + 'Scene/Cesium3DTileStyle', 'Specs/Cesium3DTilesTester', 'Specs/createScene' ], function( @@ -23,6 +24,7 @@ defineSuite([ Matrix3, Matrix4, ContextLimits, + Cesium3DTileStyle, Cesium3DTilesTester, createScene) { 'use strict'; @@ -34,6 +36,9 @@ defineSuite([ var withBatchTableUrl = './Data/Cesium3DTiles/Batched/BatchedWithBatchTable/'; var withoutBatchTableUrl = './Data/Cesium3DTiles/Batched/BatchedWithoutBatchTable/'; var batchLengthZeroUrl = './Data/Cesium3DTiles/Batched/BatchedNoBuildings/'; + var batchTableHierarchyUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/'; + var batchTableHierarchyBinaryUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/'; + var batchTableHierarchyMultipleParentsUrl = './Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/'; var result = new Color(); @@ -229,11 +234,17 @@ defineSuite([ expect(batchTable.getColor(0, result)).toEqual(Color.YELLOW); }); - it('hasProperty throws with undefined batchId', function() { + it('hasProperty throws with invalid batchId', function() { var batchTable = new Cesium3DTileBatchTable(mockContent, 1); expect(function() { batchTable.hasProperty(); }).toThrowDeveloperError(); + expect(function() { + batchTable.hasProperty(-1); + }).toThrowDeveloperError(); + expect(function() { + batchTable.hasProperty(2); + }).toThrowDeveloperError(); }); it('hasProperty throws with undefined name', function() { @@ -252,11 +263,17 @@ defineSuite([ expect(batchTable.hasProperty(0, 'id')).toEqual(false); }); - it('getPropertyNames throws with undefined batchId', function() { + it('getPropertyNames throws with invalid batchId', function() { var batchTable = new Cesium3DTileBatchTable(mockContent, 1); expect(function() { batchTable.getPropertyNames(); }).toThrowDeveloperError(); + expect(function() { + batchTable.getPropertyNames(-1); + }).toThrowDeveloperError(); + expect(function() { + batchTable.getPropertyNames(2); + }).toThrowDeveloperError(); }); it('getPropertyNames', function() { @@ -640,10 +657,160 @@ defineSuite([ }); }); - it('renders tileset with batch table hierarchy', function() { - return Cesium3DTilesTester.loadTileset(scene, batchTableHierarchyUrl).then(function(tileset) { - expectRender(tileset); + it('isExactClass throws with invalid batchId', function() { + var batchTable = new Cesium3DTileBatchTable(mockContent, 1); + expect(function() { + batchTable.isExactClass(); + }).toThrowDeveloperError(); + expect(function() { + batchTable.isExactClass(2, 'door'); + }).toThrowDeveloperError(); + expect(function() { + batchTable.isExactClass(-1, 'door'); + }).toThrowDeveloperError(); + }); + + it('isExactClass throws with undefined className', function() { + var batchTable = new Cesium3DTileBatchTable(mockContent, 1); + expect(function() { + batchTable.isExactClass(0); + }).toThrowDeveloperError(); + }); + + it('isClass throws with invalid batchId', function() { + var batchTable = new Cesium3DTileBatchTable(mockContent, 1); + expect(function() { + batchTable.isClass(); + }).toThrowDeveloperError(); + expect(function() { + batchTable.isClass(2, 'door'); + }).toThrowDeveloperError(); + expect(function() { + batchTable.isClass(-1, 'door'); + }).toThrowDeveloperError(); + }); + + it('isClass throws with undefined className', function() { + var batchTable = new Cesium3DTileBatchTable(mockContent, 1); + expect(function() { + batchTable.isClass(0); + }).toThrowDeveloperError(); + }); + + it('getClassName throws with invalid batchId', function() { + var batchTable = new Cesium3DTileBatchTable(mockContent, 1); + expect(function() { + batchTable.getClassName(); + }).toThrowDeveloperError(); + expect(function() { + batchTable.getClassName(1000); + }).toThrowDeveloperError(); + expect(function() { + batchTable.getClassName(-1); + }).toThrowDeveloperError(); + }); + + function checkHierarchyStyling(tileset) { + // Check that a feature is colored from a generic batch table property. + tileset.style = new Cesium3DTileStyle({color : "${height} === 6.0 ? color('red') : color('green')"}); + expect(scene.renderForSpecs()[0]).toBeGreaterThan(0); // Expect red + + // Check that a feature is colored from a class property. + tileset.style = new Cesium3DTileStyle({color : "${roof_name} === 'roof2' ? color('red') : color('green')"}); + expect(scene.renderForSpecs()[0]).toBeGreaterThan(0); // Expect red + + // Check that a feature is colored from an inherited property. + tileset.style = new Cesium3DTileStyle({color : "${building_name} === 'building2' ? color('red') : color('green')"}); + expect(scene.renderForSpecs()[0]).toBeGreaterThan(0); // Expect red + + // Check isExactClass + tileset.style = new Cesium3DTileStyle({color : "isExactClass('roof') ? color('red') : color('green')"}); + expect(scene.renderForSpecs()[0]).toBeGreaterThan(0); // Expect red + tileset.style = new Cesium3DTileStyle({color : "isExactClass('door') ? color('red') : color('green')"}); + expect(scene.renderForSpecs()[1]).toBeGreaterThan(0); // Expect green + + // Check isClass + tileset.style = new Cesium3DTileStyle({color : "isClass('roof') ? color('red') : color('green')"}); + expect(scene.renderForSpecs()[0]).toBeGreaterThan(0); // Expect red + tileset.style = new Cesium3DTileStyle({color : "isClass('zone') ? color('red') : color('green')"}); + expect(scene.renderForSpecs()[0]).toBeGreaterThan(0); // Expect red + + // Check getClassName + tileset.style = new Cesium3DTileStyle({color : "getClassName() === 'roof' ? color('red') : color('green')"}); + expect(scene.renderForSpecs()[0]).toBeGreaterThan(0); // Expect red + tileset.style = new Cesium3DTileStyle({color : "getClassName() === 'zone' ? color('red') : color('green')"}); + expect(scene.renderForSpecs()[1]).toBeGreaterThan(0); // Expect green + } + + function checkHierarchyProperties(tileset) { + // Check isExactClass, isClass, and getClassName in Cesium3DTileFeature + var content = tileset._root.content; + var batchTable = content.batchTable; + var hierarchy = batchTable._batchTableHierarchy; + + var doorFeature = content.getFeature(4); + var roofFeature = content.getFeature(8); + expect(doorFeature.isExactClass('door')).toBe(true); + expect(doorFeature.isExactClass('building')).toBe(false); + expect(doorFeature.isClass('door')).toBe(true); + expect(doorFeature.isClass('doorknob')).toBe(false); + expect(doorFeature.isClass('building')).toBe(true); + expect(doorFeature.getClassName()).toBe('door'); + expect(doorFeature.hasProperty('door')).toBe(true); + expect(doorFeature.hasProperty('height')).toBe(true); + + // Includes batch table properties and hierarchy properties from all inherited classes + expect(doorFeature.getPropertyNames()).toEqual(['door', 'building', 'zone', 'height', 'area']); // TODO depending on the url this will also contain classifier_old and classifier_new + + expect(doorFeature.getProperty('height')).toBe(5.0); // Gets generic property + expect(doorFeature.getProperty('door_name')).toBe('door0'); // Gets class property + expect(doorFeature.getProperty('building_name')).toBe('building0'); // Gets inherited property + + // Sets generic property + doorFeature.setProperty('height', 10.0); + expect(doorFeature.getProperty('height')).toBe(10.0); + + // Sets class property. + doorFeature.setProperty('door_name', 'new_door'); + expect(doorFeature.getProperty('door_name')).toBe('new_door'); + expect(roofFeature.getProperty('door_name')).toBeUndefined(); + + // Sets inherited property. Check that both door and roof respond to the property change. + doorFeature.setProperty('building_name', 'new_building'); + expect(doorFeature.getProperty('building_name')).toBe('new_building'); + expect(roofFeature.getProperty('building_name')).toBe('new_building'); + + // Check properties when there is no hierarchy + batchTable._batchTableHierarchy = undefined; + expect(doorFeature.isExactClass('door')).toBe(false); + expect(doorFeature.isClass('door')).toBe(false); + expect(doorFeature.getClassName()).toBeUndefined(); + expect(doorFeature.hasProperty('door')).toBe(false); + expect(doorFeature.hasProperty('height')).toBe(true); + expect(doorFeature.getPropertyNames()).toEqual(['height', 'area']); + expect(doorFeature.getProperty('height')).toBe(10.0); + expect(doorFeature.getProperty('door_name')).toBeUndefined(); + expect(doorFeature.getProperty('building_name')).toBeUndefined(); + batchTable._batchTableHierarchy = hierarchy; + } + + function checkBatchTableHierarchy(url) { + return Cesium3DTilesTester.loadTileset(scene, url).then(function(tileset) { + checkHierarchyStyling(tileset); + checkHierarchyProperties(tileset); }); + } + + it('renders tileset with batch table hierarchy', function() { + return checkBatchTableHierarchy(batchTableHierarchyUrl); + }); + + it('renders tileset with batch table hierarchy using binary properties', function() { + return checkBatchTableHierarchy(batchTableHierarchyBinaryUrl); + }); + + it('renders tileset with batch table hierarchy with multiple parent classes', function() { + return checkBatchTableHierarchy(batchTableHierarchyMultipleParentsUrl); }); it('destroys', function() { diff --git a/Specs/Scene/ExpressionSpec.js b/Specs/Scene/ExpressionSpec.js index 3bc68400eee0..98caa181e443 100644 --- a/Specs/Scene/ExpressionSpec.js +++ b/Specs/Scene/ExpressionSpec.js @@ -13,6 +13,8 @@ defineSuite([ function MockFeature() { this._properties = {}; + this._className = undefined; + this._inheritedClassName = undefined; this._content = { _tileset : { timeSinceLoad : 0.0 @@ -28,6 +30,26 @@ defineSuite([ return this._properties[name]; }; + MockFeature.prototype.setClass = function(className) { + this._className = className; + }; + + MockFeature.prototype.setInheritedClass = function(className) { + this._inheritedClassName = className; + }; + + MockFeature.prototype.isExactClass = function(className) { + return this._className === className; + }; + + MockFeature.prototype.isClass = function(className) { + return (this._className === className) || (this._inheritedClassName === className); + }; + + MockFeature.prototype.getClassName = function() { + return this._className; + }; + it('parses backslashes', function() { var expression = new Expression('"\\he\\\\\\ll\\\\o"'); expect(expression.evaluate(frameState, undefined)).toEqual('\\he\\\\\\ll\\\\o'); @@ -827,6 +849,60 @@ defineSuite([ expect(expression.evaluate(frameState, undefined)).toEqual(false); }); + it('evaluates isExactClass function', function() { + var feature = new MockFeature(); + feature.setClass('door'); + + var expression = new Expression('isExactClass("door")'); + expect(expression.evaluate(frameState, feature)).toEqual(true); + + expression = new Expression('isExactClass("roof")'); + expect(expression.evaluate(frameState, feature)).toEqual(false); + }); + + it('throws if isExactClass takes an invalid number of arguments', function() { + expect(function() { + return new Expression('isExactClass()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('isExactClass("door", "roof")'); + }).toThrowDeveloperError(); + }); + + it('evaluates isClass function', function() { + var feature = new MockFeature(); + + feature.setClass('door'); + feature.setInheritedClass('building'); + + var expression = new Expression('isClass("door") && isClass("building")'); + expect(expression.evaluate(frameState, feature)).toEqual(true); + }); + + it('throws if isClass takes an invalid number of arguments', function() { + expect(function() { + return new Expression('isClass()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('isClass("door", "building")'); + }).toThrowDeveloperError(); + }); + + it('evaluates getClassName function', function() { + var feature = new MockFeature(); + feature.setClass('door'); + var expression = new Expression('getClassName()'); + expect(expression.evaluate(frameState, feature)).toEqual('door'); + }); + + it('throws if getClassName takes an invalid number of arguments', function() { + expect(function() { + return new Expression('getClassName("door")'); + }).toThrowDeveloperError(); + }); + it('evaluates abs function', function() { var expression = new Expression('abs(-1)'); expect(expression.evaluate(frameState, undefined)).toEqual(1); @@ -1756,4 +1832,25 @@ defineSuite([ return expression.getShaderExpression('', {}); }).toThrowDeveloperError(); }); + + it('throws when getting shader expression for isExactClass', function() { + var expression = new Expression('isExactClass("door")'); + expect(function() { + return expression.getShaderExpression('', {}); + }).toThrowDeveloperError(); + }); + + it('throws when getting shader expression for isClass', function() { + var expression = new Expression('isClass("door")'); + expect(function() { + return expression.getShaderExpression('', {}); + }).toThrowDeveloperError(); + }); + + it('throws when getting shader expression for getClassName', function() { + var expression = new Expression('getClassName()'); + expect(function() { + return expression.getShaderExpression('', {}); + }).toThrowDeveloperError(); + }); }); From 3862829a233ce8dd7e9dd80fc2d8aeb7ba8d8574 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Fri, 18 Nov 2016 16:34:12 -0500 Subject: [PATCH 063/396] Updated tests, some issues with checking circular dependencies --- Source/Scene/Cesium3DTileBatchTable.js | 109 +++++++++------ .../Hierarchy/BatchTableHierarchy/tile.b3dm | Bin 94462 -> 94434 bytes .../BatchTableHierarchy/tileset.json | 10 +- .../BatchTableHierarchyBinary/tile.b3dm | Bin 95054 -> 95026 bytes .../BatchTableHierarchyBinary/tileset.json | 10 +- .../tile.b3dm | Bin 94790 -> 94770 bytes .../tileset.json | 10 +- .../Scene/Batched3DModel3DTileContentSpec.js | 2 +- Specs/Scene/Cesium3DTileBatchTableSpec.js | 131 ++++++++++++++++-- 9 files changed, 202 insertions(+), 70 deletions(-) diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index 664fae1d908e..74da679a3253 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -189,13 +189,17 @@ define([ ++classCounts[classId]; } + // Marks visited instances when traversing over the batch table hierarchy + var visited = new Uint32Array(instancesLength); + var hierarchy = { classes : classes, classIds : classIds, classIndexes : classIndexes, parentCounts : parentCounts, parentIndexes : parentIndexes, - parentIds : parentIds + parentIds : parentIds, + visited : visited }; //>>includeStart('debug', pragmas.debug); @@ -206,25 +210,21 @@ define([ } function validateHierarchy(hierarchy) { - // PERFORMANCE_IDEA : this can be optimized by marking instances that have already been checked // Check for circular dependencies var classIds = hierarchy.classIds; var instancesLength = classIds.length; - var visited = new Array(instancesLength); - var validateInstance = function(hierarchy, instanceIndex) { + var validateInstance = function(hierarchy, instanceIndex, stack) { if (instanceIndex >= instancesLength) { throw new DeveloperError('Parent index ' + instanceIndex + ' exceeds the total number of instances: ' + instancesLength); } - if (visited[instanceIndex]) { + if (stack.indexOf(instanceIndex) >= 0) { throw new DeveloperError('Circular dependency detected in the batch table hierarchy.'); } - visited[instanceIndex] = true; }; for (var i = 0; i < instancesLength; ++i) { - arrayFill(visited, false); - traverseHierarchy(hierarchy, i, validateInstance); + traverseHierarchyTree(hierarchy, i, validateInstance); } } @@ -474,23 +474,36 @@ define([ } var scratchStack = []; - function traverseHierarchyMultipleParents(hierarchy, instanceIndex, endConditionCallback) { + var marker = 0; + function traverseHierarchyTree(hierarchy, instanceIndex, endConditionCallback) { var parentCounts = hierarchy.parentCounts; var parentIds = hierarchy.parentIds; var parentIndexes = hierarchy.parentIndexes; + // Ignore instances that have already been visited. This occurs in diamond inheritance situations. + // Use a marker value to indicate that an instance has been visited, which increments with each run. + // This is more efficient than clearing the visited array every time. + var visited = hierarchy.visited; + var visitedMarker = ++marker; + var stack = scratchStack; stack.length = 0; stack.push(instanceIndex); + while (stack.length > 0) { instanceIndex = stack.pop(); - var result = endConditionCallback(hierarchy, instanceIndex); + if (visited[instanceIndex] === visitedMarker) { + // This instance has already been visited, stop traversal + continue; + } + visited[instanceIndex] = visitedMarker; + var result = endConditionCallback(hierarchy, instanceIndex, stack); if (defined(result)) { // The end condition was met, stop the traversal and return the result return result; } - var parentCount = parentCounts[instanceIndex]; - var parentIndex = parentIndexes[instanceIndex]; + var parentCount = defined(parentCounts) ? parentCounts[instanceIndex] : 1; + var parentIndex = defined(parentCounts) ? parentIndexes[instanceIndex] : instanceIndex; for (var i = 0; i < parentCount; ++i) { var parentId = parentIds[parentIndex + i]; // Stop the traversal when the instance has no parent (its parentId equals itself) @@ -502,7 +515,7 @@ define([ } } - function traverseHierarchySingleParent(hierarchy, instanceIndex, endConditionCallback) { + function traverseHierarchyLinear(hierarchy, instanceIndex, endConditionCallback) { while (true) { var result = endConditionCallback(hierarchy, instanceIndex); if (defined(result)) { @@ -523,9 +536,9 @@ define([ // When the endConditionCallback returns a value, the traversal stops and that value is returned. var parentCounts = hierarchy.parentCounts; if (defined(parentCounts)) { - return traverseHierarchyMultipleParents(hierarchy, instanceIndex, endConditionCallback); + return traverseHierarchyTree(hierarchy, instanceIndex, endConditionCallback); } else { - return traverseHierarchySingleParent(hierarchy, instanceIndex, endConditionCallback); + return traverseHierarchyLinear(hierarchy, instanceIndex, endConditionCallback); } } @@ -546,7 +559,11 @@ define([ traverseHierarchy(hierarchy, batchId, function(hierarchy, instanceIndex) { var classId = hierarchy.classIds[instanceIndex]; var instances = hierarchy.classes[classId].instances; - names.push.apply(Object.keys(instances)); + for (var name in instances) { + if (instances.hasOwnProperty(name)) { + names[name] = true; + } + } }); } @@ -650,15 +667,18 @@ define([ } //>>includeEnd('debug'); - var hierarchy = this._batchTableHierarchy; - if (defined(hierarchy)) { - if (hasPropertyInHierarchy(this, batchId)) { + var json = this.batchTableJson; + if (defined(json) && defined(json[name])) { + return true; + } + + if (defined(this._batchTableHierarchy)) { + if (hasPropertyInHierarchy(this, batchId, name)) { return true; } } - var json = this.batchTableJson; - return defined(json) && defined(json[name]); + return false; }; Cesium3DTileBatchTable.prototype.getPropertyNames = function(batchId) { @@ -669,20 +689,27 @@ define([ } //>>includeEnd('debug'); - var names = []; var json = this.batchTableJson; - var hierarchy = this._batchTableHierarchy; if (!defined(json)) { - return names; + return []; } - if (defined(hierarchy)) { - getPropertyNamesInHierarchy(this, batchId, names); + if (!defined(this._batchTableHierarchy)) { + return Object.keys(json); } - names = names.concat(Object.keys(json)); - return names; + // Has a batch table hierarchy. Build a hash map of property names to avoid duplicates. + // Different classes in the hierarchy may have identical property names. + var names = {}; + for (var name in json) { + if (json.hasOwnProperty(name)) { + names[name] = true; + } + } + getPropertyNamesInHierarchy(this, batchId, names); + + return Object.keys(names); }; Cesium3DTileBatchTable.prototype.getProperty = function(batchId, name) { @@ -700,13 +727,6 @@ define([ return undefined; } - if (defined(this._batchTableHierarchy)) { - var hierarchyProperty = getHierarchyProperty(this, batchId, name); - if (defined(hierarchyProperty)) { - return hierarchyProperty; - } - } - if (defined(this._batchTableBinaryProperties)) { var binaryProperty = this._batchTableBinaryProperties[name]; if (defined(binaryProperty)) { @@ -719,6 +739,13 @@ define([ return clone(propertyValues[batchId], true); } + if (defined(this._batchTableHierarchy)) { + var hierarchyProperty = getHierarchyProperty(this, batchId, name); + if (defined(hierarchyProperty)) { + return hierarchyProperty; + } + } + return undefined; }; @@ -734,12 +761,6 @@ define([ } //>>includeEnd('debug'); - if (defined(this._batchTableHierarchy)) { - if (setHierarchyProperty(this, batchId, name, value)) { - return; - } - } - if (defined(this._batchTableBinaryProperties)) { var binaryProperty = this._batchTableBinaryProperties[name]; if (defined(binaryProperty)) { @@ -748,6 +769,12 @@ define([ } } + if (defined(this._batchTableHierarchy)) { + if (setHierarchyProperty(this, batchId, name, value)) { + return; + } + } + if (!defined(this.batchTableJson)) { // Tile payload did not have a batch table. Create one for new user-defined properties. this.batchTableJson = {}; diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm index 16a99c7d6f544883adec201367da3dee5fb26c17..6dfd5056a370c4bb977e132f42dc45313bbf5bc9 100644 GIT binary patch literal 94434 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 z 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 literal 94462 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 diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json index a6e7411f7352..cd19543ab8eb 100644 --- a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json +++ b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json @@ -2,7 +2,7 @@ "asset": { "version": "0.0" }, - "geometricError": 20, + "geometricError": 70, "root": { "transform": [ 0.9686356343768792, @@ -27,16 +27,16 @@ "box": [ 0, 0, - 2, - 10, + 25, + 100, 0, 0, 0, - 10, + 100, 0, 0, 0, - 2 + 50 ] }, "geometricError": 0, diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm index 53ac2a305df58f44d2bbfa7d902572277fcf6aed..4786afac9d1500402626e03c27bb6442fed13dc7 100644 GIT binary patch literal 95026 zcmeFa2VfS}*6u$u?@UBQq+>%df`B3tLRS-lqJSU@SV1vBfJl{QL9tit4Z(&5yI2ql zDk0b#_KLltqQ?Sa_y2qLJL_cO z@MEWz3>YfmE1$?IPI1{4j(<&>ltoiU#JM&~}}x zboe2eiuPDroVk>H;!Lya4N^t&+B4NDxEMEgdu5BPSlc-XM1B(7p!A zcb<&C3ZgG5`jVCC51&>#Ze;0%(fnFf7tCZ>@#K=?%2T6LeodxE#+5O&3b8a@Oii!E z_Bd8|f@xl*0oKpMtm*oR>{yf4;CvZP720du87sGY^%=RI`wks9Fir>TJE+gz`}W#% z*r4761`gKNGl?utn7V=X`R%)|KhBlg<6ull>F6=c;EGFh1F@^z{Wdg?c{P}2Cp2%~ z{DtSA-#vMH-ndrDI7KGro!GI%`N2j!WW)Dw=h5dl0tkHKDf;j{PsEZUXM|uayV~7 zKgpGm@>5j%&AW>7^PBaQ-wRhwoIZNo;Jthr)E?`5OY5TWZ$@tM2yO|cOq}c%krjqb znmDC&YU#uYZf;K-HL7Itfu$u!a~&U^DGYNPMdG^8yw`2OpsABfM{>zue;IVj>)`GT zrfJvj&|Zr)z8yHQ*B-h8jV~qOkexf`waf3E-=S02{LXn@^E!8I-?{D1`RTgO?K^bt zme;vc`;KjQ?$EAdUVg_8o$@+%$ZOxZOV`d_N_Nic#I`WL_!!)DTHnhCsycLQ*QFc# zdi(s2UAlqY4r5(s(lBA-)5qh z=l_hH?ibRd)V^)|3@_=)v~l$;IfnV6jWIJ{Do!4EWvSuh;etM5qMJP3+IL$wdE$G? z46zKY4wZ*jzp38PiTb-n>V^?8n+np}?N#`PcwJM!ZJo(sRT9RTD zFN5OAlZ%f{Tj|0}diuq8;9a{h%iHEon_Q|p^x~<--P`7JUz$j7+HEG=$?PlhiFg$~ zcka}|CTya&Q;R2$cK7lfyLIkRAM5E?r7NjSdkpsIYyR_ z8Z~VS`|*(W?K-u!Q@@mqFP$Pc70jnhDj6|tT=C?Jm19aLluqC>;db?@+%ivb_f8{@ z&F!8C*{LNX#!M(Zire?@>-6?+f{rhlGA2zd#b-&EW9WjQx zdG0SsB)PUU3~`zsZg4lbRM)9IH&kx8Hl%4|Re)hG?W4FLDTxX1dJ;-U-LTj8x`3F?_rPJv{fTZAPhc(R{zGACq?Z)#K6}#SiK9x#!G;@` zN!kk!DjB|aKgM`EblqIe&1=`bT?co2Ke=T5v~g2QCygsD8Cf)L(ionYMzNwwa5#c@ z9g~Y=@0scAI+ZE8J)+|DEKb}Q9bOasmKVZ*Z{SNHY>mWLxzI^0&>fEKX zyiA^WWXT9+Z-Wi@8#thEuRYu%tK2fpeS@ts;ri@*V6TCLdJP^}wC^BRYp)97J87(J z6SB)1ygG|lW+$rf1M_KJr-tS4Ik->1UW4}Rv)5h+;G0(KcBu-@_+{Nzwcao5_AC2I z_nx$=xOY|hF*Bgdt^}#fo|H&eXZ6&^yn=PSMOC&<41Y!MiG9o3#9VD+RJ6CvEMc6l zHOr`vX7(^MVokT_yzz@S){+Uu!?kXPbm-c(W7`hhI=CC%X%kAd=-qUiHf+5K=eD`z z6yy$M*!t6J{TU~_ijyf$Ry?=#duE^ z$>{o};smHTA5KW*(WNAlNo_ZY>(meyaAvY-HE(#)C)fF5ZF5IWE*?Fe%k!Wy#Uo3& zz*efzc(IEyQ8EU}V)}AA#kF4y?O)sLaccSsym)IpNfOdTx5tlRet^YwYxw z7d+SF%TbMcKD%+hp3aT31%a7Vh|M=pxPpcPCvsYZ{8oO_Y-J9_#-C{|%TuGO``gmd9 zJw1ZeX%4EtEw5>&FK-{(G}Fg{rA;&avU+hdd*dt)>Wlf5e&@f^K4pL54NWs+H@f!b znejCn^~-G3FZoxl#7%KE*3xCKdf99@XmgiCwXHLK^UNH!dc`$+@id>}W%!_4%k0HL`H{Wx)EY6KT6e}%>&|%Ex)4uWkK$?T)O;FGTX(Xtb);O` zS`#0e+h$|=l#S(6{>4pWq`1la-wyiw&Kus-~MhsTfL3DttqvYPw~{eQop2| zf2$Wanw==Y{`(zImA*o(C>(?R<)VtNE>69~F1O<*hUQQoZ#{_Tp?Dw2sWDbom@q zFKw?Jjvtz~SAXZMX_XmY*{EM;qkf6M{2PD8wSLK7Hj4GZ9j#njaaetJ+NagmC5Q4O zd+{`%;-;L)r*!2+d}JeCe$-Za>yc@nR&Vn}_J6`b^~#U9X^j|9tqbF+Ic7YyE{vzu zE0)nSd@8PuyXJ``Q#o2r+xALj=B3&G8-Pu|;&b9_+ zWBZBiOO^+0r>}~9{uBEGAYAbu~VJ&`HS)?)2{vlm`(eL9{ec^QNm$l}8;cT?0 z%0~TC+xFAGa=L7K9sHHEQB2t=KZ<$(=(H}MA4Oj|pY`A<|FZdoJ#}uabS(L7cET6V zr|gfI^ttnCJY5dsSkh(l&BJxU zK8laHDX#J$pR2lm?tH54%v(QmJ}oB}SAMi!tdG(yu5`6s-g}kfDgWZ8dgbcI^H*j3 z%SN2dMjWIoZ{jAN%CmIwSAS(AU4GP7`fl%}eOkSEn!Vym*Vt)3m`~{zOSfQ_B@02@2)0XDv7qkfr<`X&F$ zmAEOc##*}URWBRuRpPI<+N*31TfKOiy?B~WaWkLN#YZ`jjr>SgTkWaRwMML7vCLi^ zlpom`PpuK-sdZsIH7AXytqbwA^(daUPR*zBv~?#NTSv;3tu^tnxotL)u-R8pDlv zR#zJ#aiwd&QCs6I|EkyCqg;uz*~q{68wdHcT&eHIQ~ecx z@suCwYO6g}x_nx_zC}s**GZY=2NbX?*%HbtEyUJeu)w8ROuWS^{Y{WtQ<=^-#u5{JQUN(xQ zXKA$+2R*CHr`0R2*(s3|W^WwiQ{2p_bj@eWr`DR~Q*+z$X*S|%HsUG&mQTgCahJV~yViyH ztF87Y8+WT0PqP81nR(17)ake!m8{1E8U$Q)?t^8>0WN%}qbuC@}Qd`-d)46`nXl}2b8#ftPBz?`X`&7{1 z_+saq&8E?qCQdh->Cd#w*k8G*wbS3(>f;`!7mnzf@hLxMpVSps^~S+;#j0#?Hpa&| ztKRHQH=88qWL(qD-r^b`>tp4d7>B(-Y|^vK+}=IaN7L1J>1vzQWuu&!z3FD7`lMdj zXVTtsYxWk)Y?5tFmyL0#tjmwJP3o2H)oc2-HpVl_&1}qGHs~47rW=RK_QoN}&G@U27E8Lu_MvUt zxIUV$Jj-77NnLr6jpf92*(BSVZuaIUX)piDJXf|!wzd2lPit%S<|paj^rVe+|@aH~*@aAG1&DimQ6#V7g*ewl^E&W1LlQ z_NJRnl5;Yy>1JNxibqq`l?V z>@AkrB-@%U8{<$}mmh1J)GOPo-^!8lBOjG@txdC$UfD)@w6@y66iYVJ70c|ct?ad~ zRc~$Ozp|dRkzU!xcqX}-joHfvJ;T{_<51b&I3&3lfA!H~N!Qrw8lyg%ZhcpMQa2mR ziR>*`$+o7Oz4=Mni;uOHUfCwuR=U}kZXA++lKxGvY|r0G^Y_iodtN;BTmEMHJI>ye z=f%3p(vvp&J!xZlWgBaov`^aT_oR*K$$IJLKj}yMzq7Zt&2LWIs@%L)#XeT{sj}Id zUfIUts@{B>joMm$WS6Ub@w5r(f#=z zVX$o6i}lK-%V+r}jhxShD}3i)^}qKEmUXOO*VW5s_h0KepRzCeu#WR-Jar##v82o9 z?Nrlp=`X>5*@UKcHc zKGpV*ftxs=mJ^Gs9P0hE^-;RTm9Dl|U$nX7DgWZ8dgZE5vn?|IWh2gJBM#D)H*p(# zweRvQUHsKw*+`ckwUvJCeQBRoFP>(vxY9LtdLA*K(k+&B%awH5tB>jTrD+bTKXAF1 z=}W8mUZ#%=F84D1vU+hdd*dt)>dT*-tn1gHdTF1spET6Vj9uQ>f0f(#nvMEpHtLuB zD_7#CxEgEevRA!qmK^d|x#p_cu59>Mxy@m#S6s6fPxC3B=2N=(C?~R!A6rNJKmDiE zwJxk)vCLi^lpom}PpuK-sdZ;OweF0ktqbwA^(daUPR*zBv~?#NTSv;3tu^tnxotL< zPuW;Lmd`L}v;vw0$) z@+14E?bH6Ht6p)X%U*oUr+8{^8)waJ<7{hLZM6oCv+X&mw|z-I)zDK* zEm!Kh@l=1sUp(bUy4vpcPFj~wtGE2fMsYQE(ls~Cr*w-Y-Et+}a+Q8xI=4JpnQkkd zgGZe2e2V|VMd!PDuDCb6a(<>?s<(d0UYw1C){!{Kr*!!o^1%hpUOC)h?+cv0`uk#| z3!P81QNPSa{StrqH~xxi{gO}FC|1v#E_6J_Ve?gKpH{E;a`Gd4@id>}rku#9bmc^R zWFuXE)K>akT`qDwt={H|?DalP^~#U9X^j|9tqbF+Ic7YyE{vzuE0)|`n4+Oo${Yces(r9 zr={)HFSUK?oHcI#$mZdj*EpM5@2qfsl%E-ESCsd?Vy(-Yd~W;e8t3zaKJPmJve|Uh zitDu-Vxtc;<7+nRm)WRa@~>Qpo8oG$rORIRvgvu#hmOD6ZocZn z%pA6Q#Wj2JG@s&TKBbF~av~e~v2}D;myevTHDdLOW%lBr{K(#TYK<6AtvlnXb!R+n zU5KZxNAa|EYCesptvlJ+I#RA|t%;A#ZL_g_%Et03|Kg@GQe5fEiG0dNInlaMTX8t} zs$boFwt5?PTT^N)pW>-`rG7~_|5h(7??Mw2hww4Fm-{ez%Z0yulHnN{^>h{aND!AWqmVVvnMXoQ;Zrozo z&K=VF?;Tn!YxK*ajLj+M-0$)>=80U_R`cimS92@aOlx_c%T>$gw_kR8t+Zb6kKBw; z`QPFGh0bQ-j26p&oO7RxJGrPu#^*~6#nnQ@X{HZn=_fxzfHW``?c9oQ;Fl zk@=J^pYxmF?d+AqcOJak*{i>KU*F|?nvMEpHtLu7%fIngT9L#nXI>n{pzb(v=hOk&SfuQCsQzKfS>5w0fH-vKI%{D?j31vzQWuu&!z3FD7`lMdjXVTts zYxWk)Y?5tFmyL0#tjmwJP3o2He|ql5@2F(U8|js8R$csPrfrw8 z_qhJbM!I5|y|tBn`n%Yia%(FNmGz{J^vX8I+4#%9*_gd-R9_W`%J#-V_DQ{REX|XP zpSz~~{H5o)KANsPtF7vjy7C|!%Zcf-NwziJ?9EToUjCDLu56QRYxy^x*4FCHPtw2X zNgL@}N3}bC?Z#UA*FXMLL1*2yG8@*W)6GU}&Gai5c}`c~O*j9tksq^9>b6degKVTL zR%Ls$F+OT*y4hRXWWDsNIGDY~H9poaYnzNE{rsixl~3sSy_+YdtMAg)HmNHQ%8A*V zZZ@h<>atJzOxjy+&E8^}O|q@&vM~;ob@{QjNxiatG`HC@TRUrx-F`h?Ytw9`SGKXW zrut_tJ>T`$bj31zYiny<_10GYE9=?^%tm@;8{?ehW;SLo8;hINjYDO7<6v<$AB?|r zizU6w+~&(B7vAggZ@TgXaZtVa zN%}XvvOV9N%lQsmp8meyd>P-CRp#5UboU#2(q8CpO)>hxj&8NQaTfO>N*=KY0Ew(qkvW@Xny>$6B8@09i$~jDOFdO4zevF&>X&&=Q z+M8aPzqPFxcmK6{OCQ{{U6J1L*4lk1r|Vw2^rALPTeoUoB>mc_cUk)VbM2i?oxvTQ zjqa<}_PWM96-k%P(F1mJHn;7xowL#Xd7C|(FTJ$=E=AJivvBoJ&S%~|&76PLFMYAa z(&xX;bM^B1WR&N8%D!mZeCN}6>VDf|NtaEl-&+?+7yp8bT4&m-Uj35)E8Fhq{EN>k zU$u37`s~x#@znd$``_5Y^-+ApO>xzC`D}AezVoTJsXIG5pOzDgs~qb6v-MHB#g(qM zBPO(RJmp{9RIgk;@bL~A|FRKhvk?dB%A2@}r}8Xa{MBFCNS7bAm44EffDs4wzk>!|kWtDLTNVfBh-_Tr%Y$liErjTld@JL9Q! zXFP3Ph^MVb@w9bnK8>fXJK5MeQm$;RiBD#3$2OKv*;qd1U)(fCiYr|?kx$tuCt4S3 zD-QQ`?d0aO)!Vq+no?W&6i>}7^-H?>w|a52c_N?kBl|C3O#7Fvdc~D4d+{-!;%Vzz zy5_cVwzaIbT7$;f_8isQz9gS&Yk9E!O+Mwv#!hWzBYTZ4dsYu|md-xXLw(Wj*g0Lf zWFN`cu($TmoSDa(P+RGmr%4-P_fUQmlh{r#U|yR~`G>2k*BH_V7fU%dpUQ#kjhpJ# zUyCJO`;%;>Yt4zj_*lK#YEL!)T4%;b{bdY#XkS$y83V^hamCH$fw3~5nmcMMpOzEF zwY({x)<@|USGx8~wKdN2uX^o;%9S{qjr@zhaga~TmHKWx)nD-!Px+Cqw%Svr%cs>_ zepIix8awHl8|G8G#gcBhl5V-uzAAgxfNLwBtP|%`{8>w`kBZA0%k)e2)-TzMvvJTo zF`v@qlfA&%D~GQ<8996Pm%X6S##c7#m)WRa;xGTkUvaHpvX_lwu{RZ}tvImvIiFUq z_j2+hd+{`%;-;L)r*!2+d}JeCe$-Yvd#m$l^@?TodY>j;`4Km*5#yF>CJ6p@f z+18+JY(KGm$?~AK@}seny^WpLwRH7MZDp^$3Oo0XSNn%_^+ms9=XC9t@N+iWQ)Q!m zsV(!;>9S#7Ivd55jq;-^>zCDwo7o#@aZq2h zUaeo+18nTH2iVwY53uny8}-X<)Gzs0uEb4oHP)^#_*A`Yv{xyX+G?+|Ic)XfDgQQC z&8K*pPwC>LoTxAIBVBE^r%Klvv3kWadvQ>HWMe$FMvSM{h4Iw7GoH3C#M9QJc-lHO zpT^VHoos9!DOa}E#3wViV;jq-Y%HJhFK!wm#g(p{$fs)uhcJ_1M)9j_2OppL_Xz5_3W*gxvhG|HGA;xZJaf?jkB#~wbdFl&bH^M z-u5N=R9nk~>}~Ai$Hq==Wg~n2&YrbYoTammELC6hJ9bVNFZPj)jot-l&S*ZWt#r-P zqz$o`DnE)zY^Q6Unos#>|9ABoL;B!iDaYnhIgq_^Q@#3Yv7~GL$ws=?ocN26)vK-6 zrTN!7Gd}7sW3V*7UoB@093RCMHILp84 zwf87j;%qkZFaE|sJ}p=3yYWl|%LdXRrP? z9L#nXI>n{pzb(v=hO zk&SfuQCsPH7a*TjuUKX;4$_q$anl+xo>~{iQ*+FCYF!vlt5+81nR(17)ake!m8{1E8U$Q)?t^8>0WN%}q zbuC@}Qd`;c9bzfpvWoQWKsw*bD(IANHXH1mp0Md*`hACN;&gorFkSEJ&1dY#*(CKi zZjS^9r^m4>*e7f%a8|w9Cv;~M*Dn>%WL(n|_7ynDenUBtz3MOht^U##V{(hsN7L1J z>1vzQWuu&!z3FD7`lMdjXVTtsYxWk)Y?5tFmyL0#tjmwJP3o2H)o;eKhx#rbm37KD znT_-f*etcS#9OLZvXQP>W}j%g6n%%d-nEVWSJ0C-(l=n^I48N8O~PL5Aj3JKI}RJL z&-4Y`q+TJG`m3>JPV`V8O}D z`Xq9E29lzzAt;_~HrzdQdnyxs~#o2W8pYWr#WGXKdVeSku*a>6Qo6l?Ua- z>`ga&)hBh?Cw(UEEw^TGvCJmf)^ynzhswJASlgst*#NfUB1tb4c1d&Pi@&ld!kF%WG>(w~D{->w9uh{C!_Kr@j|gu%TSRhVlk&;h-(6*T**QdwSAFzjHeKSkKt2thSYH$`khJ&Sz|su{Rt2 zUP;f`>o@*3U_;z8ev0_rIGDZa(36~6 zFhAI_?B2J}Eg151Ug2*8hm;lEwy2=TO=bN5$UCV_|{>$Wl%7P_J`h3}J$PjWsvQ0zkWF_Ducao*;Wx3V~I>ZAJPPU0$mjyG+W z#Qw`=*+Z4~?(cEJ@gie?gop@h?!{#9!m7oQkK$P`MUQ zI2LLQI5mf@UL4I{bG1P8RdZEy#O4pVEVT7Pjtgxakt5eP@oTH@6cumQUGO zJ`0$8W%RosUL!W{S|c{@S{F9%TE|*18h5u|;&FFtD$b`{`|&(fE^H1c4=#UkzMLNC z(dIUFnv0qI+T7N7lqG!H+;+K**OYPAdNj^1zv8TUr(9@1(Y#Z>ln0H!crype;&o$V zXZxG2eK&RqZjQ6{C7Fk0eq^7XHz&=H_XNwK@pOLTc~c=*iGJB!wS84<$BlKo9-Ys` zSUaC_ZkK3HSWc38NbZ4&daX^%kN9X`%8VU-ar0A$y^`llbc%_skq+O zwd`$OYfoKoZX{x99oe-e_LtsQwWlWbEA?fG`V#ZE{c3~P+_>+u*FKQB{*wR9^)4Pe z+gDv4<9)R(9^>S7)8>C!ybstl$kx;n?N{-**#58iWBb3>l*ZwI`E@PszwKAL*4ut% zJPQ&$3lco7e!c5dyyk7)sqg<|*Qt1oIG*tuv2nNSk?sH0zD~vaL`&_f3IB!hKIHE4 z;&t!t{nC4nW_D&zwYjZ5)#mm;zGfx%oGPy`iXC6WG{qJ%+uvC z=Hss8$vhk1_A{-2t^L@i*0a`KW`)cgpT{n~0k;GnY>qRydu0e@$@?yU$y(I z4c=EIuM6@1@8-P5Q+d~%hoc*h_&)I8Ue^-$D*w&vn%n=b(7b z+C9kzpNYhu^_byoeTnD4@>ZD0TZMkbdxBl-GkcDFCa#-WFD_T{e&T$_bJg}$tsS?o z;xlvqKp(Ys+`gLNsryxnrS|}C9mekgwC3C%n5egX)%lP2rOepbzM8yWO3ZEZ=X}QN zQS-bYk&`9j7U!+P*v0#~8yD?2Y7^hD7An7*lgaBy!p2?qVjJDB+L-<~ujy`GCt_8& zk5V6PUrp|}Mu6r=Hi$#^%3lDm=F) zu0b{~+RwEQX#Uv#ulqn<&#QcHOw&fm{|I=qNH@6e(+ODnZU9*^1WjYh@0o?kHuh)7P$DZ!)SM{u= z`&HZDG{-X68rF)llWp~MXU8=peJ_Okhx)qv-n0)#KpgOA|B|}u*1a>Vrta>q(%#bd zTK`6O?*w9-f1@Y4RY#Xs+0`g-|AvF}nY5Xo&Wo%6H~N2j+^dt5>e#rxl+iExSsnc! z_3Pi{%Ee9Ez{R+y-y_A`s;aLE|0?Fc#dBN|Hm+P%+^Xv5SAU*Zyz0)|s(4ma@BG&w zKULZPqj4vX)$NyyThqK%mH!RY|0Di2&D#dzx_(tvKfn6(q^j|)s=lgmtg61I`Kij@ z`LDsaSH-`odgs3ed2{wv<-e->n($|i*uScBlC1wnd}`X?YR}uIE%M7g_^@+J&cdp6 zG3K{I*;J*+zndS~uBXRs70>)^P*3j}ma~6%UtxCgULD=p5x=_oQdRS?s(Ry5-Rr5d zuj%+!HE-9ekDuw?JKp5IbbJr2=QX`Ab3gwl9?>_N(mo zedbf;ZyAX^yKA@YtI6+E?2X!6-CT|LRJX4t=dtrs_Ubq$L5y6pG;4gX!7&Hwe@YbCE2$!l5S`lauknfLRF`u`=@wfO#{ z!h31W3yppJzSLd6^^U!&Zxac7H=h&VDYQrFJ)zrEwO=IOKPy+7(>lvItMzwiiEE1e zeb*B4jMs&|dn{B=Iji+|Xz`wE?@Rx;|4mxr8l-tusI&5WcwGzPYna}b+O@!~SM43j zN&HRN?pL)pxOczt-lDweezj0@F1}xl_apcBsLEjhr~c+gHtrg_f$OHe31+|V$KO8U zwczrv{IR$G?RSvm^*u3;ZXCE*&VJud+*c&7L3Y3G?o|@kDfp3p_eLsCa=B_o`d$Zs7PqOu5`@g&I)HNl(p1W(h=8j!o z68AQCzgiaGuV(Hy;_IEek4jvdG#?9f|D-voJ(YF+x7T;}itP9Ob@x{qlkE5X^flV< zt96aG`&Ij!d3|?w&(w)$TfGOcXIq=wmQQ`x*7Kd+|J!|<{=V1#j&6g0(;lyje{`M7 ze&5#)Z2$D`xVrD3)n-HXRlR?%s^0l2OFy?)TmP@UmrnOdJoK+B&dGYSt5M$8dmrw? z#qWeSpx2PN0zWJ)Xa{*#n|7&%jf^tcN0C=s&C?- ze3z1Z$5Ng5D)Ia3?Dzfbf4{H4NyvWR&wk&xcj4~u&60oL6~Cvl|5h&Z9xVACC-Jvr z753HSej9(^vG2V0KH0wS*n42Bx9>ad`)0hSy8r#0zu)J-+f970(Rc35cbWKa7~J}b{|>?a9;2p?(c09*R}up|ISQ&oy~sVUw_|T@0mzDOZNMI z_WQm)FDL$%pu*otYM$8psQCH1An|-%pubg!pResZ?*{*-E`A=DefGcKPp?nqIrG2k z#Wmgi{fF}T|H5@D`+YyXveKw`$JPDb=hou}?5leJTvfgE!}DnMz6-=Wlkc3XqgVUA zG(6mM*SdV9wW{kK{|)5fZ|iHo$N8yFA7dN)2IJb1SNm60y|b$U|C;8fDti|fe$^fK zs`yt`@BG&wZ_d7^<5Cm;HZ`l|BqxAisPQ`7z?=VW#Czva1s`A}6JYFh8&)?nPL)0d=8P4njLYdS79 z;ZH8@Uv+ZzkNDJdU2I@{UEKBRli%^H($zBiec$Ded13#Ob26zryY=#%Zl(FL!Ru^I z$G3*_**IrqHUrrVWHXS>KsE!}3}iEq%|JE-*$iYekj+3g1KA8@Gmy zKsE!}3}iEq%|JE-*$iYekj+3g1KA8@GmyKsE!}3}iEq%|JE-*$iYe zkj+3g1KA8@GmyKsE!}3}iEq%|JE-*$iYekj+3g1KAAxvkdrNK*PXG zc_A|8MP3dv;tbJzr0;Fy)dFi_wK2L+{l;KGO>MBYw+Zb6FhthjNO_xbZUWY&u8y}E z{z5RMT+gddsUGKMXgSCRc*{X=052!D2ITGs@c#zn-@(Qdp1LZM^2x zHHT4sZ#x(@K;I7B&da5g>unD<1RHTS23vsJQ{Mt?3Fdk`AceWKX@wMShnLn!VRK@% zK?=7a>W)a^w%$%0+rnWd&bA!QVAz&(XO695-i}||f^8|cqs30(F34T*u%p)=pKZ|F zgYCUMN_j+V?R9`dEA$Rv2QQyeJ`8v8I(nUu`N)49yaZeyLh`(vm5&E;O<@lr2_1C^$PLO9la1N z^miP{$_EPzuxq;MbPKGgU1`eE4zy&u@m>rbgaetLWR;(2fMeZc`l+zV|0 zIKbPF(th6lU@ve_&c@(CaDVCtf`h!lXoENhpbbPGKxqIt051n3h5O?DAf&KAu@6QH z`@yCiav$#yY7Ry}1U$q$l+vNtALI?e!-42Sz@d0P0BtBZ)H{sQVZyJj z3cq$p;TYr?>PLH}SdKz31&_o-3EGk1k=|HJWAQ(d)jS+I7CC~mDW#^c8_sbAjGDst z2-f!&Sd2po$I^a0Qg|dDCm@BTL~4f=PV^>$lPI-g6{$2H{U}Trh-$wY2I|?H1BBd8068M)6u3Nr+CMD$AQOTH3NML^)tY! z)Eo~U@0~!qso-?vOpa;ZiJT{ZCs8-kI~jk|!ReGw@lK_53g^ja#~@F`+cD^;fv0(= zQ##!{1DpXK%W)=g&H%;YOrjkRo`v`0!4r{ZbDjmxq;wAF+1@NCXAy0tcP__F%I8r! z*E^r6CxItXz5o^{gC|qIkoc!~7a@hGPQzYLMc&mM7s26b&TBX> zfZ;Wq*K(W>^LhMo4R{UZd9=71ybgIC9& zKBf6Eyu!Q5yBRqjIh*5VxZg})F86K$Z>IJZ@K*0Ov|BmnquqkMozi@8KECci3U9>w zok-yg#9n|DUJsjj$m_hjs9Au17kHOJC=ztg)14|ky71K#7^OX*(x-|j6W+O6md z!TY>Lloldy<5&cXMKHXD^8IM{qc8FvK;Gv)h!oz3^+QPELcAY(VpNeM|&Lk6s2;o94}8Jg-h}N3{qG|>}Qd}C9s)?eAIi6nrG3U z1E2Grr}RAb&v-B3;c4_2z~y*;3T-*K+gM5ej zx4jiuzJ0RIqP+{g>%B+mJ^a7HYJLs*9`be0vniboyVp2gfzjFUeTDTs3yb%W z!uM$Z0aExb9zR41R}g6)QuvYgG59g1d8{IpK0yD3Rv(~$0)E1N@jmA{;CaYTusYA- zCsKT!9b_apvRf-5Pn_SR5Z&G{qRSID36_7(b1;7{IKN^8BJ z!EeB?IesC|&!AZRLbPweU-AAe_&xGB&R@arDE-d)oA-y4e-Q0E?@x~JDE~$2Pj04v zM0)-Ylzo3S9DHg#Kk(PUDTNfSrZ(_H>O%h~m_`0tn1y~sDe`kD<@g(cYrT#9pE-Yl zUoCJWeyhbV8-qE1ZKN=VcAFrD5nk&cg&{FEMG6By<<~_DQ~qWgDc=WuzaEG0d!Xmn z=kWZ$yaxPI&u_q4AFNBMf!`3>5D#_zM)=$my%E^RZ%nB%5$pI(;IIjL6R?Tjlu}a| z*7i5|w?H;UZp^U-+_#`Fwfrr?EvVg+@>c%VXj^eMMcWeDj8apuDZaKr3Y*}4Tcoft zv6~}>jbPIN+0fsPn&#-+f!q1Hlyb4(*54iv+n{d`Ztu6C)B^v_{FX%93cV$`gWrl$ zOXSuZtzgj#hFel@jn*2ymEQ)rgTEtExC7QZA%!jR(iSOfL5!V|!tIIL4k^rqQv;-M z7vwI~xAWU$xifluu)Uv0DGxtw{SJ8E3B3cDPsAP3^1*z+Bc+ahC$J6Jn)4U0wci=+ zM15zHp4}AK>qY6b_*M{z&1z zcpQin_9s#Uq;QZw7#vKg0jo%*{m~Dg)&A%QfCu=0di!zy4*td7aR63-IXnQ1`sjoF z1O0>igTaISL;ORLhxkMMp~xYehoT*XJjg%HKO8(9t6}H|Q9lekn3^NNBm8389Sk0d z9L{lwKZ3Iu97)}9zXX4Wf`?Kb<&UN`in9c5C~^$mhN6!F$M~g`O8q0jVc=mLV~KMl zC>CRhb_6&M??-?mkmEVWfx{_H;2iHybaEomhWnE^hEqO@(j@M!-SO2_!ef~DY*oMXY`z+7NCM6VT5B&+^ZvbT$l+_s{WXAKaLoR60~kir}BekW3R1F;t%h1bL8G~{*uUDPZ-Ct^R%fBIH8kZ5)eWu?U8@u$IR9_j8Q(AK(~E?S05a{)6Cs z{zFLNeY9MR6fVT?!${%1M0x}%yaxu4B87Lu?=+-v333VbkNRa;K7w8bF2%#cXiLGR zemSLb{4ZuTKZq4l1*7rm#mLY}Zw0{gKT#CoXk-{<}orV-X z;XesJN$E6JkxGxDKSis@(4PXIV!v3%IRQKh`4m=1IeZF>Q_-LBpZ1^ep9P=wpYxyh zU+|ZM%l#M8UUKD^k+1l#`mcen`LFwL_;31efp7V5`|tQG{CB~3{rCL${SW*P!4Lh9 z{Ez)l{7=D8{m=Z*{V)8L;7b2X|11A%e-*gO|Hl8;|Cj$A_?`c~|AYUdzZzWauknBK z*ZMz$Kl{J4J<4gr%5Cu74POwo>E7&-w4b~1e3F-u! z26e%@!Dd0dpnlK*Y!EaI8U>AmCSa4GX|Q>)MX)8fWw2GSb2HYmtHfSDf7vzGu z!S+Fmpk=TFxI@q?XdSc(b_90}c0z0G$~z<51-k_8!S+F3&>_eVI)WX8PC@6OOVAbU z8gvV~2fGHlfx88}2L(Z4&;#rd6a_tlJ%T;KJ%e7sUcuf$Z?JdJC+HjO6Z8Z71^t74 zg8{*Q;C{jW!N6cpFc=&h91t8B926W39vmEkcBm^4K@JTL3l0Yl4~7Lt1jWH{aCk5x z7#WlVqrg$Y=wM7x8XO588H^3a1>=JW;DlgeFex}Hm<&!1rUX-iX~A@GdT?}bOmJ*) z9C%zXBRD=dA(#oy3{DJA3Qi7A2~G`83r-Kt2+j=73eFDB31$W72ImFmgXaeq1Q!Mu z1s8)C2bTnw2A2hwgO>-hgDZkL!CY`|aAj~+aCLAEcujC^FfX_+xE{PdxFNVPm>=8( z-W1#%+!EXx+y>qj+#cM4ygj%xSb)5f^A5CIk+%kS1$TpYV|5Sut<>KG-bT&6;Jv{@ z+T8};fxM67_Fxg`Lhyd-?h78k-yPr`lphQpqVyo=18577i}AJqeKEK=c$m_|!6V>3 z;9VS#66X<6EFLA=z2FkO-wQ56mT@it@1wMovn(igvYcr51T1yMh^wgz-Tf0GvG79vy`3(v` z`scwHz-NQyNa3@zc@Zgm1}`rmg-;XXWu)*)qP~I@J{7#m@e~|h<$R6f2^hY{`8vnr zFn@zzUISmF{01#v1>Z!ziHBE$xA6Hg`di>z!P}JHCgMxMJ8*ar{T=X~U^j{PUW7kKy>{R{AmU?ruM`2Q&Ql4u{Ge+hmSd`;;~ zYitUt#?(r0`3;e1{aSB*ynh;TJ^x0V(_(PH!NE zKO%pm{)b>SmfxeV23H4bD6PTIcfn71{ulaB;94Sni?$YA8~jY^=inFc8*mlpqu{UL zFVz1E{uca>_8aF~v|o{bP+AMF#mk>a;ZJz~3n^SfY%lef!_}~PgVK*YV*iDF1L>vw zR6r?6{fTud^#|<`l)}_+_)Dci>cUh+DN6lLw4BsN$S9Qq{vK?U`jzuhxGaHZtyC@a zjZ+(g8)30Awza{W)Fwz_4xZ{Dg%Q3tMG8Y=)H4{9SDA~)eIqf`dJ+8niDR0iK#simy>hN(tKVME$C zMhY9?u?bRGpGa>6O&m5&ZH~S+a2v`yrgoyVBWD}5=E$~qYmVL)Y@6Dd($1-N z;P&8l9J>&w9ViyN5UmB+9`7x{R>(Zg_TUbbI&kKt@}0~l+779X96M0%M5$w{Gf`WE zttoebMH{dU<*vlvG1Uzz+>zR@sqWNuhtW={U18J~eOGYT)NYh^OYIKs47TIk1uOt} zr@jCz1b0jIKni!GO%YPKD_(jch24p<2U6ITsCy!X-BP_cy1}6r=UyCLV7M3O-W;7_ z-kV?c0{5can-;ymKFB_J*fZ4^pL?M91^cG% zfb5SfbnM)Iro7h<*@wQ0ibx2V;Lg>JU5(Mn42RBy}jIL-9W-HH2vUqYnXxrVgVt1UZo7 zFjyQ0!~G~9j&?ZuVX0xrp{XN~!l76fBZWioG8`#9lo%tB!b6BU5-B_wPQ8)B5@ZSW zBU7WW9DzOx9F-bPX*7O@r^ev97<~*_O2i}3O2N|9k(7>1jRl8+hjZ=%jswS1KMow9 znt(Q*vlML{aw4TtuoN$okis!|KME-vP3*}?;V9VjMwXCcRa^&Fv^4PajfrrEY3g*PpAEvNa1OCJPRp2 zl}Npj!n0H7fag%^%_>sqO!Qf_Ium^sIE($_49*Txzt^ex)OgEf)`T0Ds?rbt2nPjyBK*5-Y!PJ2D~P9Ev0Ky^T5l%OE|70&OA^o zt|Qvz;PrUF9Gru^f%AIs3Q9L}-jJH_JIAefYH^dJ7IJU`kmmNsRfi4r0xQ*1?O>I2i^_dMg862J>Y`W zy-48#+AKs0@5IY}NZ}pCScDYbM%4R}!rN01aNG`u2RI+(xD|#Eaz4ay3(Obu%Y)#9 zlo!+D0q|ku!+5wq^$0!}p+5pXl6sWVqeQ$fwFC|e(U*WrQe~9NV0dq8X{sDqhP;QP z9PZ`xIe+hOZ})!XJ_ALIo7Wtg)iXcHKg!)V!VzNK1b9ykiuu-v=}LT6Zt0fZ=~MB z@^$pLz_(IwQ+gXeuch9>^Q-9ZfGddj3fc;AMe1Ej@21`ZUj|>|ybgRHe2@C~!4Fa& zqJ6-*0_}a|N0e58EAa9$Quq$uKS2uLCibUD;ajj-jC?co88x4xe+GV*`kd0|*ng7x z0uLXfe*vz<^G9ea!Ih~mDSb)I4^m&HzD9nD{E*{oSbPn`_gPEVrB-oVm->d|I%>Z{ zex3Rj{3`V?r0^?Reuor(iQn&$!j(k&0V(_f20tQ&pTlo4Qn(tqn))A8Yq0zQeGT{% z9==EW3H&LwmeN}Mf5&S67P%JrFU}h%-2l69Iaa~w2KcUGeb2|@XQXf~?SDZEf5PLh zNZ}eHEk+7|OZ^W1PH8c#NTpxU|De?`=zoBJuwVSlc_Vl;@(-+TcK8Pt5262-`ZM(x ze`NP3rymALKTL%oGQ}C7{pBp8Fb6Fs^umq82rWdaT~1hwx?17JwD!ONS)0QTH{skE ztV3Pxa8tYnU_iNUxEZCooSUMB$a;7S(d&Wr!upizhYi4uz=)$EaT}9&Sn0I$#~jTft&ea8t@#6TfcQ3@NNj z?bhKo)NKQ!&BASAR1bYyaNDpsrRL#wV12LwXG1U-+>ZKOaC@+M*a9hRPMelU;kJ0$ z0V&*u7_E@Pt%=$iDQp(D;b;bjHk>dEGcLjG1ccZi$_T9qW z@z520cX0QxfKmbeyM%>A>x5ni_6Un86(T!x6v3hhh8-#QMC*xO6z+lS5$=f;_Q1Lq zQdo$Wy^z8JV(g6+?oQO+Na1d9YKs*1LH41(ci0!pz0v!EeZzey?Sr4a!hU$}h29VB zPsBaZ`h)$$eJSl54gmK6dvZ1e_X7t|zaO}NI1p`r&i-ioAqP?F5BA5)V5G1g-VZtv_~=~!NUl&G2oc6lu{}FhqIcGK$aqlIU7@I47(#Z z4u?@=_#V#sZi>Z`NMR}M$0CJe@Hh@B98ILQNa6T!0yu$ETUL=uW6>wlYApIha3cG~ zk(^DyEsztj+QQ*PEOtU4A5IF73MYe;!ztm^a9TJWoE{#Hc8n_@i##rz5grd7AD$4- z3{MPC0#6E04o?YB4Nn743r`Qv2+s`90?!K14$lc^h3A6jhUbOnhZlqwf)|Dtg%^jH zgqMPshL?qxhqJ>gz$?Nz;oR`b@G9`C@apiI@Y--5I4`^|ygs}kyb-)HoR4;sE8mQ~ zCA>Af4ZJP9J-j2lGh6^J2=5B-4(|!?1@8?PhWCYw!u!Gd!w13#!-vAf;NtM%@R9J* za0$31EDM*0<>4}LS@>A^c=$y4B=}_bRQPoGO!zGLZ1`OGeE34R99$m07`_y~9KHg+ z626M|nk&DKd?S1_d<%Rld^>z6ToJwtz8k(5z8`)Neh7XTeiVKjeiD8Pej0ujeja`i zt^`+xUxr_WUx%x}RpB?`x8c9S@4)ZE@53L$AH&t)>Tpf?Q@A$#8T>i?CHyt~E&Lt) zJ^Um5GyE&`qCYwP=r2B6sGN!dE;&(@1Li~)r;y! z4ZsFb!>CczIBEhmiJC^6M_WW&f?GygMO#PBqHVx!qHUw*(RNWTm>X>$wTN0qJAgYx zt)kXZn`p;qr>JeTbJQ-{C2Ak#MIEC2sAJSA>I`;{xIwFY_K5b3dPRGIdqsOky`w%+U$AeqPt-5!AMFe78x4r|i}sHOf&-&L(O~4D z=z!=z1`eY@#>4P<&J#Gs!F(pa91k8(c_uApfF~kP#KUpXN%%Y# z{Uq?D=wwPK6Y-en6gV7>ehPR>bSkA&VK_ZHEjk@}Dsmdf>2N=tzD$kI08gj(4Dih8 zEVMH@PenTec{Zg}!Bg>d4pMju-e)0&ClmWzr0^uz%tW3Tokz{N=;wjwMdwpGANyI+ z1$a0I{Q~fU=t4>t;{WXEBBGs%ei3+abP1)4kY{mR0*gyvcn0N5(Jn>5B)SZFadbIS zcrn(qk;04cas^U&Au;A4g%=QYE>d_toMs}0S0b;Zer|LXmUGar0F>!`mTydk;~?FPCTEZIo`q{^sa*JluqSJ9r14=cC;L-VxnN z=}uza5G{!ALf(nIk>f5{+y%qySxY6+-5e#+Jsc&}E3*c}b{IT>6y65EnMmP-$Oox^AbJSP`_Uf)7vo_O+G22V^f0A|@qZty`CjD1 z$c3DvDUF8Ry&QMLXf%B9W__1p@d#4*Fzp{j3K!#X2~zkFk!B)=WzkY_DW#dLB9$IR zFQ?U`=;dHJ`^6)iW5BVXE@#@&Ksauyh*g@!ME`KJoqB=ZO*sA<&@sx zd^=j<2|>KBn$t7`+;O z0;AW^KLJ09KBe?&^cna%_y*^j;OF3H)PD|s0e%{-L<&Ep&6h~wCwTb^Dg2liUn7Md z5_J_)_)+u?$47AZhVxsF4`BE$=f61KhxvE>@-6r+w1(0e7_N+diq<06Aiv;P3-`73<@4xga4oezgTF+-qW!|T z2JL6$Zt{{sJtyqrHcf2YpR`Hgm7 zj!((Y2`B|Qzu+~M^DA+JoD`)nC!&fw1~ z^m<@@BGy8y57y6VK&e4aLvSN7hx1JcHUb+`--vSKoF-_EIqRb}LN=vTAFPj;&5^=- zc;5mk+>F>;B87Ef^IfzhxD_>9qHhImm9sUat+C%Crx_kLM{fphgXgAb+x&msoOgJX z)e?uLWCo)MD8&j(Q42#A0{ zXd+Ei6bvOal@2N$#L9ioZZ@IZE7w2rPnhStznSx$Z)U!hhlg@tMX5woiJIlaB9+lf zXnCwMT~wySva*-wUPY?lSCy);GApWbtQxe)qo|>UGao|@E0Onc)UYCz0#L(8=pYa^ ze3<^u`2~7dowz#lfl`B&0r)jw5E&lF3xYvXlc*;7ACvul)zF&gql_G)9QvzJ2J(b7LZ4tX#H)walQ3xv8?&kjem&-! z!1~NIg-zv2&Z`d_qTyHrd5ZBQY{p!;M3Ao`Y)IT(S`am7MBp_-Tav92eoNR=S`oF9 z*02c-!y>8E8k#O5sn!%eP4=enDYOmaX&6q_meEGqd9)qX!sQt(oVY#FGtz;o&0sU) zXXzpWMi6(Tesk%B8a8LPqjYAjGaa>%E_BoqzYFXlQAAPl9Bc(!Ga_ME_#E?H;qx#` zx}k964XYkArbyBeGHPMTw_}7x3d@yd)4M&|x=86g!%LK9AYy-Ojaim7dVf zY){xrlJI&l67YJW$wUb-fm{yMFrMsA)X+xl6x1+|Zeq|_>CH?Ees9=YTtqI`J0+D2 z4*XP@DsCb-`I9A$YQ6B&V7l}nN<)*dK6KHC4to-3;APVFbQ6OP zkWtKx#2*Dm$!Ma{tbaqskl}UwF>oxIU&9*<$I3XOanu|x<7EOm4jq9_po8K6;PUQP;$BG%K;dIWQ zi5gBL<9n##R4T=whVRQPIEyHTugF9*@n>_^O#In!Ha{%q@{+Z-HB6E74Z@0L&fc~mma>x-wXFj4p9yrekJ>4KbnJniS4KN{anj7IRN)FdjKAkLwE-nId})q z?}>6?4!M3n4fm4$N7Qf+wGX3)yXhty-6cnuIgEb<9+9I&M_K=)93#UI_{ZQeIZkw( z{NKw7svX2X0Z+;)q7&#L>=a#`qQe8kr}0kXpOT-@lkziac#_q>poS;Nat1X#PK~pu z;W4V7Lk*A8Q#NXN9zD~Vm z{~Ej|cj#Y?Kbb3{e{kL%T7;;m{zkqcT9mn>T8yZe{!X>x>W3ENFU5YR2S2^a$fB3k z^l5(UoF&SyEM|+Nep&(+*E>puJnu!63adl_rtXZ-A_pyg1* z3at2!@35TSuMg;h@Iie@AJ#{-BCM#D@GPFVGFnBeYBg9*AJxb7aSeb08mQH^h6ceP zt*OCUOG99Y*48>2s&!#qt*7<1fi{E<^$BgHVcHlr)+X9ipVV*|u1{$*jnL+>xwg=j z+Dco))*7i#Ya49~+iE+!XFPFxw1YmY9brf9q@A^kM!_h3PP^*!+6{Ko7xYDaNxQ@D z8m&FlsxdG|V>M1~8V}<&K@-)kJz-DnrAeBs4(L#)rf6?(!n}Jhr*%yst(iPIs%T+*YtILLr21qI!Z_D7#$18>Np** z6Lcb+sBh{deM=|9$@;dwqwnezI7O%GG@Y(9;0&Fq@9FzG3(nHn`hm{Txp1z|!<+Ak zKSUSkN4gL$)J3{jKh`C1iGHF>b(t=Q%k@)Tp(}M2T%}pMTG!}WxK`Kcdi_i{zzzDj zZq!Y>8E)1sx>di>ZE%}@sbA^Wx*cxUZ}eN;p*!_E&DLGITleT*&Cz|jUk~U(Jp>Qw z_xgkWsE6TUJ)%eTm>!46^@N_(Q+gVn)}Qoe{YB5fGkR9f>3O{XFX%Q%pUmvU^>57V z&{f#&F7_NN>}GayE9_R1{o)F{-NSBo1!bk!J+GjwH2d%sl$Bvuzk;%R*(LCw%%i43l?@O$3Am~-O965U17Hh?8jHw?S6IyEGT<`eGCiA%uc8UWe>3%VnNx%?0Nc6 z_6Yl<{u{Hp-7b4fn%icHPjXt_7Hf2j)g7A{85icCe<57XE3G+{J z*<$UfcBjLVXirE?@tz&#pXRW~J6*|^WUITbB`rGH8D~q1vfKK!vr;DGmg6ZdXHQ$K zn>7DrK`03vB(o;@4&KmFC>^CZQ|;#LF#mL`tFPUWV4>AeOM2dc77;gHhdIle^pxNXHAb^z*lvv~?|1voyK&sw~w#hXeB43920&5*TJqyRH#VB|&gT-%N8P zAt|~;Zu6d;H{S`8vf7)&+n8tB_4k7%`Pb6_c2C4}1!>XN?MA&prJ%eciCCM&8Y+V{V2Q`5BWan_o3HGdVgn%|SQbuewEqXJziq z_LlV}dQGMZAfqspHrWJn@U&`y)}aPsPo?1KuhJ#_-5pG; literal 95054 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 G3Hc91)&1Q7 diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json index a6e7411f7352..cd19543ab8eb 100644 --- a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json +++ b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json @@ -2,7 +2,7 @@ "asset": { "version": "0.0" }, - "geometricError": 20, + "geometricError": 70, "root": { "transform": [ 0.9686356343768792, @@ -27,16 +27,16 @@ "box": [ 0, 0, - 2, - 10, + 25, + 100, 0, 0, 0, - 10, + 100, 0, 0, 0, - 2 + 50 ] }, "geometricError": 0, diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tile.b3dm index e23ca8826c28b7fed2c98771551679b4a4824d7d..553c5d77a341679c3990760f24aa6cfda71dbdad 100644 GIT binary patch literal 94770 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
*
@@ -500,10 +501,10 @@ define([ /** * Gets or sets the vertical origin of this billboard, which determines if the billboard is - * to the above, below, or at the center of its position. + * to the above, below, or at the center of its anchor position. *

*
- *
+ *
*
* @memberof Billboard.prototype * @type {VerticalOrigin} diff --git a/Source/Scene/BillboardCollection.js b/Source/Scene/BillboardCollection.js index e269f5a96445..523728ffa6ac 100644 --- a/Source/Scene/BillboardCollection.js +++ b/Source/Scene/BillboardCollection.js @@ -406,12 +406,23 @@ define([ * position : Cesium.Cartesian3.ZERO, * pixelOffset : Cesium.Cartesian2.ZERO, * eyeOffset : Cesium.Cartesian3.ZERO, + * heightReference : Cesium.HeightReference.NONE, * horizontalOrigin : Cesium.HorizontalOrigin.CENTER, * verticalOrigin : Cesium.VerticalOrigin.CENTER, * scale : 1.0, * image : 'url/to/image', + * imageSubRegion : undefined, * color : Cesium.Color.WHITE, - * id : undefined + * id : undefined, + * rotation : 0.0, + * alignedAxis : Cesium.Cartesian3.ZERO, + * width : undefined, + * height : undefined, + * scaleByDistance : undefined, + * translucencyByDistance : undefined, + * pixelOffsetScaleByDistance : undefined, + * sizeInMeters : false, + * distanceDisplayCondition : undefined * }); * * @example diff --git a/Source/Scene/HorizontalOrigin.js b/Source/Scene/HorizontalOrigin.js index 805c1db223b2..db1737fcf688 100644 --- a/Source/Scene/HorizontalOrigin.js +++ b/Source/Scene/HorizontalOrigin.js @@ -10,6 +10,10 @@ define([ * or {@link Label}. For example, setting the horizontal origin to LEFT * or RIGHT will display a billboard to the left or right (in screen space) * of the anchor position. + *

+ *
+ *
+ *
* * @exports HorizontalOrigin * diff --git a/Source/Scene/Label.js b/Source/Scene/Label.js index e2bf4f2d4fa1..ceca9e14094c 100644 --- a/Source/Scene/Label.js +++ b/Source/Scene/Label.js @@ -90,7 +90,7 @@ define([ this._backgroundColor = defaultValue(options.backgroundColor, new Color(0.165, 0.165, 0.165, 0.8)); this._backgroundPadding = defaultValue(options.backgroundPadding, new Cartesian2(2, 2)); this._style = defaultValue(options.style, LabelStyle.FILL); - this._verticalOrigin = defaultValue(options.verticalOrigin, VerticalOrigin.BOTTOM); + this._verticalOrigin = defaultValue(options.verticalOrigin, VerticalOrigin.BASELINE); this._horizontalOrigin = defaultValue(options.horizontalOrigin, HorizontalOrigin.LEFT); this._pixelOffset = Cartesian2.clone(defaultValue(options.pixelOffset, Cartesian2.ZERO)); this._eyeOffset = Cartesian3.clone(defaultValue(options.eyeOffset, Cartesian3.ZERO)); @@ -656,7 +656,7 @@ define([ /** * Gets or sets the horizontal origin of this label, which determines if the label is drawn - * to the left, center, or right of its position. + * to the left, center, or right of its anchor position. *

*
*
@@ -688,10 +688,10 @@ define([ /** * Gets or sets the vertical origin of this label, which determines if the label is - * to the above, below, or at the center of its position. + * to the above, below, or at the center of its anchor position. *

*
- *
+ *
*
* @memberof Label.prototype * @type {VerticalOrigin} diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 6a79b67bcd7d..8edc0a29ce13 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -440,7 +440,6 @@ define([ this.__backgroundTextureAtlas = undefined; this._whitePixelIndex = undefined; - // TODO: Don't allocate this until later. this._backgroundBillboardCollection = new BillboardCollection({ scene : this._scene }); @@ -550,8 +549,12 @@ define([ * pixelOffset : Cesium.Cartesian2.ZERO, * eyeOffset : Cesium.Cartesian3.ZERO, * horizontalOrigin : Cesium.HorizontalOrigin.LEFT, - * verticalOrigin : Cesium.VerticalOrigin.BOTTOM, - * scale : 1.0 + * verticalOrigin : Cesium.VerticalOrigin.BASELINE, + * scale : 1.0, + * translucencyByDistance : undefined, + * pixelOffsetScaleByDistance : undefined, + * heightReference : HeightReference.NONE, + * distanceDisplayCondition : undefined * }); * * @example diff --git a/Source/Scene/VerticalOrigin.js b/Source/Scene/VerticalOrigin.js index 3d6022c6d2d3..1e109364d60f 100644 --- a/Source/Scene/VerticalOrigin.js +++ b/Source/Scene/VerticalOrigin.js @@ -9,7 +9,11 @@ define([ * The vertical location of an origin relative to an object, e.g., a {@link Billboard} * or {@link Label}. For example, setting the vertical origin to TOP * or BOTTOM will display a billboard above or below (in screen space) - * of the anchor position. + * the anchor position. + *

+ *
+ *
+ *
* * @exports VerticalOrigin * diff --git a/Specs/Scene/LabelCollectionSpec.js b/Specs/Scene/LabelCollectionSpec.js index 61b1470ab822..f573c8458b07 100644 --- a/Specs/Scene/LabelCollectionSpec.js +++ b/Specs/Scene/LabelCollectionSpec.js @@ -90,7 +90,7 @@ defineSuite([ expect(label.eyeOffset).toEqual(Cartesian3.ZERO); expect(label.heightReference).toEqual(HeightReference.NONE); expect(label.horizontalOrigin).toEqual(HorizontalOrigin.LEFT); - expect(label.verticalOrigin).toEqual(VerticalOrigin.BOTTOM); + expect(label.verticalOrigin).toEqual(VerticalOrigin.BASELINE); expect(label.scale).toEqual(1.0); expect(label.id).not.toBeDefined(); expect(label.translucencyByDistance).not.toBeDefined(); From 178d71253977472bcc1934705e26151e453da939 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Sat, 3 Dec 2016 22:21:37 -0500 Subject: [PATCH 099/396] Add label to Ground Clamping example. Somehow this has exposed a serious bug with removing a label that has both a label background and a height reference. Further investigation is needed. --- Apps/Sandcastle/gallery/Ground Clamping.html | 37 ++++++++++++-------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/Apps/Sandcastle/gallery/Ground Clamping.html b/Apps/Sandcastle/gallery/Ground Clamping.html index d4081e1d8b1f..6729403d358c 100644 --- a/Apps/Sandcastle/gallery/Ground Clamping.html +++ b/Apps/Sandcastle/gallery/Ground Clamping.html @@ -10,10 +10,10 @@ @@ -29,8 +29,8 @@
From 74a7de59635826c1b5eefa6d258a01a82001e4d8 Mon Sep 17 00:00:00 2001 From: "duvi.fn" Date: Mon, 5 Dec 2016 12:21:02 +0200 Subject: [PATCH 100/396] cartesian is computed on the ellipsoid surface --- Source/Scene/Globe.js | 7 +++---- Source/Scene/QuadtreePrimitive.js | 24 +++++++++++------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/Source/Scene/Globe.js b/Source/Scene/Globe.js index fd1ade9f8b39..5416ec721012 100644 --- a/Source/Scene/Globe.js +++ b/Source/Scene/Globe.js @@ -426,7 +426,9 @@ define([ } var ellipsoid = this._surface._tileProvider.tilingScheme.ellipsoid; - var cartesian = ellipsoid.cartographicToCartesian(cartographic, scratchGetHeightCartesian); + + //cartesian has to be on the ellipsoid surface for `ellipsoid.geodeticSurfaceNormal` + var cartesian = Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0, ellipsoid, scratchGetHeightCartesian); var ray = scratchGetHeightRay; var surfaceNormal = ellipsoid.geodeticSurfaceNormal(cartesian, ray.direction); @@ -458,9 +460,6 @@ define([ // intersection point is outside the ellipsoid, try other value magnitude = Math.min(defaultValue(tile.data.minimumHeight, 0.0),-11500.0); - // take into account the position height - magnitude -= cartographic.height; - // multiply by the *positive* value of the magnitude vectorToMinimumPoint = Cartesian3.multiplyByScalar(surfaceNormal, Math.abs(magnitude) + 1, scratchGetHeightIntersection); Cartesian3.subtract(cartesian, vectorToMinimumPoint, ray.origin); diff --git a/Source/Scene/QuadtreePrimitive.js b/Source/Scene/QuadtreePrimitive.js index d9b21d574b24..07d572570f5a 100644 --- a/Source/Scene/QuadtreePrimitive.js +++ b/Source/Scene/QuadtreePrimitive.js @@ -240,7 +240,7 @@ define([ QuadtreePrimitive.prototype.updateHeight = function(cartographic, callback) { var primitive = this; var object = { - position : undefined, + positionOnEllipsoidSurface : undefined, positionCartographic : cartographic, level : -1, callback : callback @@ -455,7 +455,7 @@ define([ customDataRemoved.length = 0; } - // Our goal with load ordering is to first load all of the tiles we need to + // Our goal with load ordering is to first load all of the tiles we need to // render the current scene at full detail. Loading any other tiles is just // a form of prefetching, and we need not do it at all (other concerns aside). This // simple and obvious statement gets more complicated when we realize that, because @@ -761,12 +761,13 @@ define([ var data = customData[i]; if (tile.level > data.level) { - if (!defined(data.position)) { - data.position = ellipsoid.cartographicToCartesian(data.positionCartographic); + if (!defined(data.positionOnEllipsoidSurface)) { + // cartesian has to be on the ellipsoid surface for `ellipsoid.geodeticSurfaceNormal` + data.positionOnEllipsoidSurface = Cartesian3.fromRadians(data.positionCartographic.longitude, data.positionCartographic.latitude, 0.0, ellipsoid); } if (mode === SceneMode.SCENE3D) { - var surfaceNormal = ellipsoid.geodeticSurfaceNormal(data.position, scratchRay.direction); + var surfaceNormal = ellipsoid.geodeticSurfaceNormal(data.positionOnEllipsoidSurface, scratchRay.direction); // compute origin point @@ -778,29 +779,26 @@ define([ // avoid dividing by zero if (Math.abs(surfaceNormal.x) > CesiumMath.EPSILON16){ - magnitude = data.position.x / surfaceNormal.x; + magnitude = data.positionOnEllipsoidSurface.x / surfaceNormal.x; } else if (Math.abs(surfaceNormal.y) > CesiumMath.EPSILON16){ - magnitude = data.position.y / surfaceNormal.y; + magnitude = data.positionOnEllipsoidSurface.y / surfaceNormal.y; } else if (Math.abs(surfaceNormal.z) > CesiumMath.EPSILON16){ //surface normal is (0,0,1) | (0,0,-1) | (0,0,0) - magnitude = data.position.z / surfaceNormal.z; + magnitude = data.positionOnEllipsoidSurface.z / surfaceNormal.z; } else { //(0,0,0), just for case magnitude = 0; } var vectorToMinimumPoint = Cartesian3.multiplyByScalar(surfaceNormal, magnitude, scratchPosition); - Cartesian3.subtract(data.position, vectorToMinimumPoint, scratchRay.origin); + Cartesian3.subtract(data.positionOnEllipsoidSurface, vectorToMinimumPoint, scratchRay.origin); // Theoretically, the intersection point can be outside the ellipsoid, so we have to check if the result's 'z' is inside the ellipsoid (with some buffer) if (Math.abs(scratchRay.origin.z) >= ellipsoid.radii.z -11500.0){ // intersection point is outside the ellipsoid, try other value magnitude = Math.min(defaultValue(tile.data.minimumHeight, 0.0),-11500.0); - // take into account the position height - magnitude -= data.positionCartographic.height; - // multiply by the *positive* value of the magnitude vectorToMinimumPoint = Cartesian3.multiplyByScalar(surfaceNormal, Math.abs(magnitude) + 1, scratchPosition); - Cartesian3.subtract(data.position, vectorToMinimumPoint, scratchRay.origin); + Cartesian3.subtract(data.positionOnEllipsoidSurface, vectorToMinimumPoint, scratchRay.origin); } } else { From 30e73ff1ef9f404b086aa53187a037ae949274eb Mon Sep 17 00:00:00 2001 From: "duvi.fn" Date: Mon, 5 Dec 2016 13:18:28 +0200 Subject: [PATCH 101/396] fix typo --- CHANGES.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index ffc6059001a3..14a9ec3f4c56 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,7 +1,7 @@ Change Log ========== -* Fixed issue where billboards on terrain have some offset. [#4598](https://github.com/AnalyticalGraphicsInc/cesium/issues/4598) -* Fixed issue where `globe.getHeight` randomly returns 'undefined'. [#3411](https://github.com/AnalyticalGraphicsInc/cesium/issues/3411) +* Fixed issue where billboards on terrain had some offset. [#4598](https://github.com/AnalyticalGraphicsInc/cesium/issues/4598) +* Fixed issue where `globe.getHeight` randomly returned 'undefined'. [#3411](https://github.com/AnalyticalGraphicsInc/cesium/issues/3411) ### 1.28 - 2016-12-01 From 5c7911d01d4b7004c21677e82cf0e68fca2b63fd Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 5 Dec 2016 13:27:05 -0500 Subject: [PATCH 102/396] Updated 3D Models dev Sandcastle --- .../gallery/development/3D Models.html | 87 ++++++++++++++++--- Source/Scene/Model.js | 22 ++--- 2 files changed, 85 insertions(+), 24 deletions(-) diff --git a/Apps/Sandcastle/gallery/development/3D Models.html b/Apps/Sandcastle/gallery/development/3D Models.html index 0504f5af2a7b..90bb61846a9a 100644 --- a/Apps/Sandcastle/gallery/development/3D Models.html +++ b/Apps/Sandcastle/gallery/development/3D Models.html @@ -19,16 +19,70 @@

Loading...

-
+
+ + + + + + + + + +
Blend Amount + + +
Blend Color + + +
+ +
+ + - -$END$ + + +
+

Loading...

+ \ No newline at end of file From 250874e2dacd45663eaee89af948e4aafcee6188 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 5 Dec 2016 16:39:27 -0500 Subject: [PATCH 107/396] Switch render states depending on alpha --- Source/Scene/Model.js | 72 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 66 insertions(+), 6 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index f9e602d44424..05d142555125 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -48,6 +48,8 @@ define([ '../ThirdParty/gltfDefaults', '../ThirdParty/Uri', '../ThirdParty/when', + './BlendingState', + './CullFace', './getBinaryAccessor', './HeightReference', './ModelAnimationCache', @@ -108,6 +110,8 @@ define([ gltfDefaults, Uri, when, + BlendingState, + CullFace, getBinaryAccessor, HeightReference, ModelAnimationCache, @@ -2338,7 +2342,7 @@ define([ if ((blendFuncSeparate[0] === WebGLConstants.ONE) && (blendFuncSeparate[1] === WebGLConstants.ONE_MINUS_SRC_ALPHA)) { blendFuncSeparate[0] = WebGLConstants.SRC_ALPHA; blendFuncSeparate[1] = WebGLConstants.ONE_MINUS_SRC_ALPHA; - blendFuncSeparate[2] = WebGLConstants.ONE; + blendFuncSeparate[2] = WebGLConstants.SRC_ALPHA; blendFuncSeparate[3] = WebGLConstants.ONE_MINUS_SRC_ALPHA; } } @@ -3087,7 +3091,12 @@ define([ command : command, pickCommand : pickCommand, command2D : command2D, - pickCommand2D : pickCommand2D + pickCommand2D : pickCommand2D, + // Generate on demand when blendColor alpha is less than 1.0 + translucentCommandBack : undefined, + translucentCommandFront : undefined, + translucentCommandBack2D : undefined, + translucentCommandFront2D : undefined }; runtimeNode.commands.push(nodeCommand); nodeCommands.push(nodeCommand); @@ -3464,6 +3473,46 @@ define([ } } + function getTranslucentRenderState(renderState, cullFace) { + var rs = clone(renderState, true); + rs.cull.enabled = true; + rs.cull.face = cullFace; + rs.depthTest.enabled = true; + rs.depthMask = false; + rs.blending = BlendingState.ALPHA_BLEND; + + return RenderState.fromCache(rs); + } + + function deriveTranslucentCommand(command, cullFace) { + var translucentCommand = DrawCommand.shallowClone(command); + translucentCommand.pass = Pass.TRANSLUCENT; + translucentCommand.renderState = getTranslucentRenderState(command.renderState, cullFace); + return translucentCommand; + } + + function updateBlendColor(model, frameState) { + var scene3DOnly = frameState.scene3DOnly; + if (model.blendColor.alpha < 1.0) { + var nodeCommands = model._nodeCommands; + var length = nodeCommands.length; + // Generate translucent commands when the blend color has an alpha less than 1.0 + if (!defined(nodeCommands[0].translucentCommandBack)) { + for (var i = 0; i < length; ++i) { + var nodeCommand = nodeCommands[i]; + var command = nodeCommand.command; + nodeCommand.translucentCommandBack = deriveTranslucentCommand(command, CullFace.FRONT); + nodeCommand.translucentCommandFront = deriveTranslucentCommand(command, CullFace.BACK); + if (!scene3DOnly) { + var command2D = nodeCommand.command2D; + nodeCommand.translucentCommandBack2D = deriveTranslucentCommand(command2D, CullFace.FRONT); + nodeCommand.translucentCommandFront2D = deriveTranslucentCommand(command2D, CullFace.BACK); + } + } + } + } + } + var scratchBoundingSphere = new BoundingSphere(); function scaleInPixels(positionWC, radius, frameState) { @@ -3858,6 +3907,7 @@ define([ updateWireframe(this); updateShowBoundingVolume(this); updateShadows(this); + updateBlendColor(this, frameState); } if (justLoaded) { @@ -3889,13 +3939,23 @@ define([ for (i = 0; i < length; ++i) { nc = nodeCommands[i]; if (nc.show) { - var command = nc.command; - commandList.push(command); + var translucent = (this.blendColor.alpha < 1.0); + if (translucent) { + commandList.push(nc.translucentCommandBack); + commandList.push(nc.translucentCommandFront); + } else { + commandList.push(nc.command); + } - boundingVolume = command.boundingVolume; + boundingVolume = nc.command.boundingVolume; if (frameState.mode === SceneMode.SCENE2D && (boundingVolume.center.y + boundingVolume.radius > idl2D || boundingVolume.center.y - boundingVolume.radius < idl2D)) { - commandList.push(nc.command2D); + if (translucent) { + commandList.push(nc.translucentCommandBack2D); + commandList.push(nc.translucentCommandFront2D); + } else { + commandList.push(nc.command2D); + } } } } From dec5b0a28c57d336ceaa6ebbd8ed5d3173bb9820 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 5 Dec 2016 16:54:59 -0500 Subject: [PATCH 108/396] Alpha test --- Apps/Sandcastle/gallery/3D Models.html | 2 +- Apps/Sandcastle/gallery/development/3D Models.html | 1 - Source/Scene/Model.js | 1 + Specs/Scene/ModelSpec.js | 7 +++++++ 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Apps/Sandcastle/gallery/3D Models.html b/Apps/Sandcastle/gallery/3D Models.html index a772afc586db..2699da4aa17a 100644 --- a/Apps/Sandcastle/gallery/3D Models.html +++ b/Apps/Sandcastle/gallery/3D Models.html @@ -56,7 +56,6 @@ -
+ + + + + +
+

Loading...

+
+ + + + + + + + + + + + + + + + + +
Mode
Color
Alpha + + +
Mix + + +
+
+ + + diff --git a/Apps/Sandcastle/gallery/3D Models Coloring.jpg b/Apps/Sandcastle/gallery/3D Models Coloring.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dff69552e5cad26e2a773a4491a6dfd7c1c31f7a GIT binary patch literal 21074 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 W@av$Wc(YYySsald{eL literal 0 HcmV?d00001 diff --git a/Apps/Sandcastle/gallery/3D Models.html b/Apps/Sandcastle/gallery/3D Models.html index 525139952345..faa2af95ed0a 100644 --- a/Apps/Sandcastle/gallery/3D Models.html +++ b/Apps/Sandcastle/gallery/3D Models.html @@ -19,45 +19,10 @@

Loading...

-
- - - - - - - - - - - - - - - - - -
Mode
Color
Alpha - - -
Mix - - -
-
+
- + \ No newline at end of file From 6a60f25a97858de0057dd5ecef08ef851ff47234 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Tue, 6 Dec 2016 10:40:30 -0500 Subject: [PATCH 117/396] Use ColorBlendMode.getColorBlend function --- Source/Scene/ColorBlendMode.js | 17 +++++++++++++++-- Source/Scene/Model.js | 11 +---------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Source/Scene/ColorBlendMode.js b/Source/Scene/ColorBlendMode.js index 732760e7ee00..224acbb5284e 100644 --- a/Source/Scene/ColorBlendMode.js +++ b/Source/Scene/ColorBlendMode.js @@ -1,8 +1,10 @@ /*global define*/ define([ - '../Core/freezeObject' + '../Core/freezeObject', + '../Core/Math' ], function( - freezeObject) { + freezeObject, + CesiumMath) { 'use strict'; /** @@ -22,5 +24,16 @@ define([ MIX : 2 }; + ColorBlendMode.getColorBlend = function(colorBlendMode, colorBlendAmount) { + if (colorBlendMode === ColorBlendMode.HIGHLIGHT) { + return 0.0; + } else if (colorBlendMode === ColorBlendMode.REPLACE) { + return 1.0; + } else if (colorBlendMode === ColorBlendMode.MIX) { + // The value 0.0 is reserved for highlight, so clamp to just above 0.0. + return CesiumMath.clamp(colorBlendAmount, CesiumMath.EPSILON4, 1.0); + } + }; + return freezeObject(ColorBlendMode); }); \ No newline at end of file diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index b86759931900..63e57103369f 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -2927,16 +2927,7 @@ define([ function createColorBlendFunction(model) { return function() { - var colorBlendMode = model.colorBlendMode; - var colorBlendAmount = model.colorBlendAmount; - if (colorBlendMode === ColorBlendMode.HIGHLIGHT) { - return 0.0; - } else if (colorBlendMode === ColorBlendMode.REPLACE) { - return 1.0; - } else if (colorBlendMode === ColorBlendMode.MIX) { - // The value 0.0 is reserved for highlight, so clamp to just above 0.0. - return CesiumMath.clamp(colorBlendAmount, CesiumMath.EPSILON4, 1.0); - } + return ColorBlendMode.getColorBlend(model.colorBlendMode, model.colorBlendAmount); }; } From 9f84da3966e9acb0417a4fd126f7f7d131c5c5a7 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Tue, 6 Dec 2016 11:04:30 -0500 Subject: [PATCH 118/396] Hide/show geocoder suggestions --- Source/Widgets/Geocoder/Geocoder.js | 4 ++- Source/Widgets/Geocoder/GeocoderViewModel.js | 27 +++++++++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/Source/Widgets/Geocoder/Geocoder.js b/Source/Widgets/Geocoder/Geocoder.js index 48d6504d447d..ef6cc207c75d 100644 --- a/Source/Widgets/Geocoder/Geocoder.js +++ b/Source/Widgets/Geocoder/Geocoder.js @@ -69,7 +69,7 @@ define([ value: searchText,\ valueUpdate: "afterkeydown",\ disable: isSearchInProgress,\ -event: { keyup: handleKeyUp, keydown: handleKeyDown },\ +event: { keyup: handleKeyUp, keydown: handleKeyDown, mouseover: deselectSuggestion },\ css: { "cesium-geocoder-input-wide" : keepExpanded || searchText.length > 0 }'); this._onTextBoxFocus = function() { @@ -120,12 +120,14 @@ css: { active: $data === $parent.selectedSuggestion() }'); this._onInputBegin = function(e) { if (!container.contains(e.target)) { textBox.blur(); + viewModel.hideSuggestions(); } }; this._onInputEnd = function(e) { if (container.contains(e.target)) { textBox.focus(); + viewModel.showSuggestions(); } }; diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index f7333d00a85f..4d52327d3145 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -82,6 +82,8 @@ define([ this._complete = new Event(); this._suggestions = knockout.observableArray(); this._selectedSuggestion = knockout.observable(); + this._showSuggestions = knockout.observable(true); + var that = this; @@ -91,7 +93,7 @@ define([ * @type {Boolean} */ this.suggestionsVisible = knockout.pureComputed(function () { - return that._suggestions().length > 0; + return that._suggestions().length > 0 && that._showSuggestions(); }); this._searchCommand = createCommand(function() { @@ -130,6 +132,10 @@ define([ that._selectedSuggestion(that._suggestions()[next]); }; + this.deselectSuggestion = function () { + that._selectedSuggestion(undefined); + }; + this.updateSearchSuggestions = function () { var query = that.searchText; @@ -154,12 +160,6 @@ define([ } }; - this.isSelected = function(data) { - var index = this._suggestions().indexOf(data); - console.log(index); - return index === this._selectedSuggestion(); - }; - this.handleKeyDown = function (data, event) { var key = event.which; if (key === 38) { @@ -193,6 +193,15 @@ define([ updateCamera(that, Rectangle.fromDegrees(bbox.west, bbox.south, bbox.east, bbox.north)); }; + this.hideSuggestions = function () { + that._showSuggestions(false); + that._selectedSuggestion(undefined); + }; + + this.showSuggestions = function () { + that._showSuggestions(true); + }; + this.handleMouseover = function (data, event) { if (data !== that._selectedSuggestion()) { that._selectedSuggestion(data); @@ -369,14 +378,14 @@ define([ if (defined(customGeocoder)) { viewModel._isSearchInProgress = true; + viewModel._suggestions.splice(0, viewModel._suggestions().length); customGeocoder.geocode(query, function (err, results) { if (defined(err)) { viewModel._isSearchInProgress = false; return; - } if (results.length === 0) { - viewModel.searchText = viewModel._searchText + ' (not found)'; + viewModel.searchText = query + ' (not found)'; viewModel._isSearchInProgress = false; return; } From f23d43635dfe65c54fb09f5934f3ba3d1bba352d Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Tue, 6 Dec 2016 11:50:49 -0500 Subject: [PATCH 119/396] Don't issue command when alpha is 0 --- Source/Scene/Model.js | 8 +++++--- Specs/Scene/ModelSpec.js | 8 +++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 63e57103369f..703abe4e8708 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -3505,7 +3505,8 @@ define([ function updateColor(model, frameState) { var scene3DOnly = frameState.scene3DOnly; - if (model.color.alpha < 1.0) { + var alpha = model.color.alpha; + if ((alpha > 0.0) && (alpha < 1.0)) { var nodeCommands = model._nodeCommands; var length = nodeCommands.length; // Generate translucent commands when the blend color has an alpha less than 1.0 @@ -3857,8 +3858,9 @@ define([ } } + var alpha = this.color.alpha; var displayConditionPassed = defined(this.distanceDisplayCondition) ? distanceDisplayConditionVisible(this, frameState) : true; - var show = this.show && displayConditionPassed && (this.scale !== 0.0); + var show = this.show && displayConditionPassed && (this.scale !== 0.0) && (alpha > 0.0); if ((show && this._state === ModelState.LOADED) || justLoaded) { var animated = this.activeAnimations.update(frameState) || this._cesiumAnimationsDirty; @@ -3949,7 +3951,7 @@ define([ for (i = 0; i < length; ++i) { nc = nodeCommands[i]; if (nc.show) { - var translucent = (this.color.alpha < 1.0); + var translucent = (alpha < 1.0); var command = translucent ? nc.translucentCommand : nc.command; commandList.push(command); boundingVolume = nc.command.boundingVolume; diff --git a/Specs/Scene/ModelSpec.js b/Specs/Scene/ModelSpec.js index c6e056fb8808..3e4d240a34e1 100644 --- a/Specs/Scene/ModelSpec.js +++ b/Specs/Scene/ModelSpec.js @@ -1915,13 +1915,19 @@ defineSuite([ expect(sourceColor[1]).toEqual(0); expect(sourceColor[2]).toEqual(0); - // Check alpha. + // Check alpha model.colorBlendMode = ColorBlendMode.REPLACE; model.color = Color.fromAlpha(Color.LIME, 0.5); color = scene.renderForSpecs(); expect(color[0]).toEqual(0); expect(color[1]).toBeLessThan(255); expect(color[1]).toBeGreaterThan(0); + + // No commands are issued when the alpha is 0.0 + model.color = Color.fromAlpha(Color.LIME, 0.0); + scene.renderForSpecs(); + var commands = scene.frameState.commandList; + expect(commands.length).toBe(0); }); }); From bc8ed9ab5de4191251021878581d2e0c64405cfe Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Tue, 6 Dec 2016 12:26:17 -0500 Subject: [PATCH 120/396] Adjust suggestions container scroll when selecting with arrow keys --- Source/Widgets/Geocoder/GeocoderViewModel.js | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index 4d52327d3145..03ea8609cd8e 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -108,6 +108,25 @@ define([ } }); + this._adjustSuggestionsScroll = function (focusedItemIndex) { + var container = document.getElementsByClassName('cesium-viewer-geocoderContainer')[0]; + var searchResults = container.getElementsByClassName('search-results')[0]; + var listItems = container.getElementsByTagName('li'); + var element = listItems[focusedItemIndex]; + + if (focusedItemIndex === 0) { + searchResults.scrollTop = 0; + return; + } + + var offsetTop = element.offsetTop; + if (offsetTop + element.clientHeight > searchResults.clientHeight) { + searchResults.scrollTop = offsetTop + element.clientHeight; + } else if (offsetTop < searchResults.scrollTop) { + searchResults.scrollTop = offsetTop; + } + }; + this.handleArrowDown = function () { if (that._suggestions().length === 0) { return; @@ -116,7 +135,10 @@ define([ var currentIndex = that._suggestions().indexOf(that._selectedSuggestion()); var next = (currentIndex + 1) % numberOfSuggestions; that._selectedSuggestion(that._suggestions()[next]); + + this._adjustSuggestionsScroll(next); }; + this.handleArrowUp = function () { if (that._suggestions().length === 0) { return; @@ -130,6 +152,8 @@ define([ next = currentIndex - 1; } that._selectedSuggestion(that._suggestions()[next]); + + this._adjustSuggestionsScroll(next); }; this.deselectSuggestion = function () { From da2b6cb04269862fbf6993b2aaf97a1680e861b1 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Tue, 6 Dec 2016 12:27:02 -0500 Subject: [PATCH 121/396] Use textInput binding instead of onKeyUp for updating search input value --- Source/Widgets/Geocoder/Geocoder.js | 3 +-- Source/Widgets/Geocoder/GeocoderViewModel.js | 6 +----- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/Source/Widgets/Geocoder/Geocoder.js b/Source/Widgets/Geocoder/Geocoder.js index ef6cc207c75d..d7c8a3feba95 100644 --- a/Source/Widgets/Geocoder/Geocoder.js +++ b/Source/Widgets/Geocoder/Geocoder.js @@ -66,8 +66,7 @@ define([ textBox.className = 'cesium-geocoder-input'; textBox.setAttribute('placeholder', 'Enter an address or landmark...'); textBox.setAttribute('data-bind', '\ -value: searchText,\ -valueUpdate: "afterkeydown",\ +textInput: searchText,\ disable: isSearchInProgress,\ event: { keyup: handleKeyUp, keydown: handleKeyDown, mouseover: deselectSuggestion },\ css: { "cesium-geocoder-input-wide" : keepExpanded || searchText.length > 0 }'); diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index 03ea8609cd8e..367650936673 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -198,15 +198,11 @@ define([ var key = event.which; if (key === 38) { that.handleArrowUp(); - return true; } else if (key === 40) { that.handleArrowDown(); - return true; } else if (key === 13) { that.activateSuggestion(that._selectedSuggestion()); - return false; } - that.updateSearchSuggestions(); return true; }; @@ -274,8 +270,8 @@ define([ throw new DeveloperError('value must be a valid string.'); } //>>includeEnd('debug'); - this._searchText = value; + this.updateSearchSuggestions(); } }); From 202eee3b9c2cb223bf6ef8d5e9e58d17ed8f02a7 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Tue, 6 Dec 2016 12:27:27 -0500 Subject: [PATCH 122/396] Clean up tests --- .../Widgets/Geocoder/GeocoderViewModelSpec.js | 36 +++++++------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js b/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js index a15d7670659b..e71f73fe1231 100644 --- a/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js +++ b/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js @@ -14,6 +14,15 @@ defineSuite([ 'use strict'; var scene; + var customGeocoderOptions = { + geocode : function (input, callback) { + callback(undefined, ['a', 'b', 'c']); + }, + getSuggestions : function (input) { + return ['a', 'b', 'c']; + } + }; + beforeAll(function() { scene = createScene(); }); @@ -133,14 +142,7 @@ defineSuite([ expect(function() { return new GeocoderViewModel({ scene : scene, - customGeocoder : { - geocode : function (input) { - return 'fake'; - }, - getSuggestions : function (input) { - return []; - } - } + customGeocoder : customGeocoderOptions }); }).not.toThrowDeveloperError(); }); @@ -148,14 +150,7 @@ defineSuite([ fit('automatic suggestions can be retrieved', function() { var geocoder = new GeocoderViewModel({ scene : scene, - customGeocoder : { - geocode : function (input, callback) { - callback(undefined, ['a', 'b', 'c']); - }, - getSuggestions : function (input) { - return ['a', 'b', 'c']; - } - } + customGeocoder : customGeocoderOptions }); geocoder._searchText = 'some_text'; geocoder.updateSearchSuggestions(); @@ -165,14 +160,7 @@ defineSuite([ fit('automatic suggestions can be navigated by arrow up/down keys', function() { var geocoder = new GeocoderViewModel({ scene : scene, - customGeocoder : { - geocode : function (input, callback) { - callback(undefined, ['a', 'b', 'c']); - }, - getSuggestions : function (input) { - return ['a', 'b', 'c']; - } - } + customGeocoder : customGeocoderOptions }); geocoder._searchText = 'some_text'; geocoder.updateSearchSuggestions(); From f330bf3db6d6bca911109d29f320cbd8dc0d7cfa Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Tue, 6 Dec 2016 14:12:29 -0500 Subject: [PATCH 123/396] Update default padding to be larger. --- Apps/Sandcastle/gallery/Terrain.html | 3 ++- Source/DataSources/LabelGraphics.js | 4 ++-- Source/DataSources/LabelVisualizer.js | 2 +- Source/Scene/Label.js | 2 +- Source/Scene/LabelCollection.js | 4 ++-- Specs/Scene/LabelCollectionSpec.js | 2 +- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Apps/Sandcastle/gallery/Terrain.html b/Apps/Sandcastle/gallery/Terrain.html index 0d78a6bfda0e..09eedd03e1c4 100644 --- a/Apps/Sandcastle/gallery/Terrain.html +++ b/Apps/Sandcastle/gallery/Terrain.html @@ -154,7 +154,8 @@ fillColor : Cesium.Color.BLACK, outlineColor : Cesium.Color.BLACK, showBackground : true, - backgroundColor : new Cesium.Color(0.9, 0.9, 0.9, 0.7) + backgroundColor : new Cesium.Color(0.9, 0.9, 0.9, 0.7), + backgroundPadding : new Cesium.Cartesian2(4, 3) } }); } diff --git a/Source/DataSources/LabelGraphics.js b/Source/DataSources/LabelGraphics.js index 2898c820706b..e3aacdaca9eb 100644 --- a/Source/DataSources/LabelGraphics.js +++ b/Source/DataSources/LabelGraphics.js @@ -37,7 +37,7 @@ define([ * @param {Property} [options.show=true] A boolean Property specifying the visibility of the label. * @param {Property} [options.showBackground=true] A boolean Property specifying the visibility of the background behind the label. * @param {Property} [options.backgroundColor=new Color(0.165, 0.165, 0.165, 0.8)] A Property specifying the background {@link Color}. - * @param {Property} [options.backgroundPadding=new Cartesian2(2, 2)] A {@link Cartesian2} Property specifying the horizontal and vertical background padding in pixels. + * @param {Property} [options.backgroundPadding=new Cartesian2(7, 5)] A {@link Cartesian2} Property specifying the horizontal and vertical background padding in pixels. * @param {Property} [options.scale=1.0] A numeric Property specifying the scale to apply to the text. * @param {Property} [options.horizontalOrigin=HorizontalOrigin.CENTER] A Property specifying the {@link HorizontalOrigin}. * @param {Property} [options.verticalOrigin=VerticalOrigin.CENTER] A Property specifying the {@link VerticalOrigin}. @@ -262,7 +262,7 @@ define([ * background padding in pixels. * @memberof LabelGraphics.prototype * @type {Property} - * @default new Cartesian2(2, 2) + * @default new Cartesian2(7, 5) */ backgroundPadding : createPropertyDescriptor('backgroundPadding'), diff --git a/Source/DataSources/LabelVisualizer.js b/Source/DataSources/LabelVisualizer.js index 3d008f5ccd63..019e8527fc77 100644 --- a/Source/DataSources/LabelVisualizer.js +++ b/Source/DataSources/LabelVisualizer.js @@ -43,7 +43,7 @@ define([ var defaultOutlineWidth = 1.0; var defaultShowBackground = false; var defaultBackgroundColor = new Color(0.165, 0.165, 0.165, 0.8); - var defaultBackgroundPadding = new Cartesian2(2, 2); + var defaultBackgroundPadding = new Cartesian2(7, 5); var defaultPixelOffset = Cartesian2.ZERO; var defaultEyeOffset = Cartesian3.ZERO; var defaultHeightReference = HeightReference.NONE; diff --git a/Source/Scene/Label.js b/Source/Scene/Label.js index ceca9e14094c..62dd7e650fe9 100644 --- a/Source/Scene/Label.js +++ b/Source/Scene/Label.js @@ -88,7 +88,7 @@ define([ this._outlineWidth = defaultValue(options.outlineWidth, 1.0); this._showBackground = defaultValue(options.showBackground, false); this._backgroundColor = defaultValue(options.backgroundColor, new Color(0.165, 0.165, 0.165, 0.8)); - this._backgroundPadding = defaultValue(options.backgroundPadding, new Cartesian2(2, 2)); + this._backgroundPadding = defaultValue(options.backgroundPadding, new Cartesian2(7, 5)); this._style = defaultValue(options.style, LabelStyle.FILL); this._verticalOrigin = defaultValue(options.verticalOrigin, VerticalOrigin.BASELINE); this._horizontalOrigin = defaultValue(options.horizontalOrigin, HorizontalOrigin.LEFT); diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 8edc0a29ce13..b9fb63bac5d9 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -437,7 +437,7 @@ define([ this._scene = options.scene; this._textureAtlas = undefined; - this.__backgroundTextureAtlas = undefined; + this._backgroundTextureAtlas = undefined; this._whitePixelIndex = undefined; this._backgroundBillboardCollection = new BillboardCollection({ @@ -544,7 +544,7 @@ define([ * outlineWidth : 1.0, * showBackground : false, * backgroundColor : new Cesium.Color(0.165, 0.165, 0.165, 0.8), - * backgroundPadding : new Cesium.Cartesian2(2, 2), + * backgroundPadding : new Cesium.Cartesian2(7, 5), * style : Cesium.LabelStyle.FILL, * pixelOffset : Cesium.Cartesian2.ZERO, * eyeOffset : Cesium.Cartesian3.ZERO, diff --git a/Specs/Scene/LabelCollectionSpec.js b/Specs/Scene/LabelCollectionSpec.js index f573c8458b07..e97bb7631c0a 100644 --- a/Specs/Scene/LabelCollectionSpec.js +++ b/Specs/Scene/LabelCollectionSpec.js @@ -84,7 +84,7 @@ defineSuite([ expect(label.outlineWidth).toEqual(1); expect(label.showBackground).toEqual(false); expect(label.backgroundColor).toEqual(new Color(0.165, 0.165, 0.165, 0.8)); - expect(label.backgroundPadding).toEqual(new Cartesian2(2, 2)); + expect(label.backgroundPadding).toEqual(new Cartesian2(7, 5)); expect(label.style).toEqual(LabelStyle.FILL); expect(label.pixelOffset).toEqual(Cartesian2.ZERO); expect(label.eyeOffset).toEqual(Cartesian3.ZERO); From 4b8c2567299a43c943e43fcb6e7afef6de5e5beb Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Tue, 6 Dec 2016 14:22:21 -0500 Subject: [PATCH 124/396] Add defaults to documentation. --- Source/Scene/Label.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Source/Scene/Label.js b/Source/Scene/Label.js index 62dd7e650fe9..c743892f782d 100644 --- a/Source/Scene/Label.js +++ b/Source/Scene/Label.js @@ -124,6 +124,7 @@ define([ * of removing it and re-adding it to the collection. * @memberof Label.prototype * @type {Boolean} + * @default true */ show : { get : function() { @@ -197,6 +198,7 @@ define([ * Gets or sets the height reference of this billboard. * @memberof Label.prototype * @type {HeightReference} + * @default HeightReference.NONE */ heightReference : { get : function() { @@ -258,6 +260,7 @@ define([ * Gets or sets the font used to draw this label. Fonts are specified using the same syntax as the CSS 'font' property. * @memberof Label.prototype * @type {String} + * @default '30px sans-serif' * @see {@link http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#text-styles|HTML canvas 2D context text styles} */ font : { @@ -282,6 +285,7 @@ define([ * Gets or sets the fill color of this label. * @memberof Label.prototype * @type {Color} + * @default Color.WHITE * @see {@link http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#fill-and-stroke-styles|HTML canvas 2D context fill and stroke styles} */ fillColor : { @@ -307,6 +311,7 @@ define([ * Gets or sets the outline color of this label. * @memberof Label.prototype * @type {Color} + * @default Color.BLACK * @see {@link http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#fill-and-stroke-styles|HTML canvas 2D context fill and stroke styles} */ outlineColor : { @@ -332,6 +337,7 @@ define([ * Gets or sets the outline width of this label. * @memberof Label.prototype * @type {Number} + * @default 1.0 * @see {@link http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#fill-and-stroke-styles|HTML canvas 2D context fill and stroke styles} */ outlineWidth : { @@ -355,6 +361,7 @@ define([ /** * Determines if a background behind this label will be shown. * @memberof Label.prototype + * @default false * @type {Boolean} */ showBackground : { @@ -379,6 +386,7 @@ define([ * Gets or sets the background color of this label. * @memberof Label.prototype * @type {Color} + * @default new Color(0.165, 0.165, 0.165, 0.8) */ backgroundColor : { get : function() { @@ -408,6 +416,7 @@ define([ * controls horizontal padding, and the y value controls vertical padding. * @memberof Label.prototype * @type {Cartesian2} + * @default new Cartesian2(7, 5) */ backgroundPadding : { get : function() { @@ -432,6 +441,7 @@ define([ * Gets or sets the style of this label. * @memberof Label.prototype * @type {LabelStyle} + * @default LabelStyle.FILL */ style : { get : function() { @@ -466,6 +476,7 @@ define([ * * @memberof Label.prototype * @type {Cartesian2} + * @default Cartesian2.ZERO */ pixelOffset : { get : function() { @@ -623,6 +634,7 @@ define([ * * @memberof Label.prototype * @type {Cartesian3} + * @default Cartesian3.ZERO */ eyeOffset : { get : function() { @@ -663,6 +675,7 @@ define([ * * @memberof Label.prototype * @type {HorizontalOrigin} + * @default HorizontalOrigin.LEFT * @example * // Use a top, right origin * l.horizontalOrigin = Cesium.HorizontalOrigin.RIGHT; @@ -695,6 +708,7 @@ define([ * * @memberof Label.prototype * @type {VerticalOrigin} + * @default VerticalOrigin.BASELINE * @example * // Use a top, right origin * l.horizontalOrigin = Cesium.HorizontalOrigin.RIGHT; @@ -747,6 +761,7 @@ define([ * * @memberof Label.prototype * @type {Number} + * @default 1.0 */ scale : { get : function() { @@ -879,6 +894,7 @@ define([ * Determines whether or not this label will be shown or hidden because it was clustered. * @memberof Label.prototype * @type {Boolean} + * @default true * @private */ clusterShow : { From 854ee56ec5b15c188d0506b8f60bedfc16d9ad04 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Tue, 6 Dec 2016 14:37:26 -0500 Subject: [PATCH 125/396] Code style change --- Source/Scene/LabelCollection.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index b9fb63bac5d9..b56a8d44db9c 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -127,16 +127,17 @@ define([ var showBackground = label._showBackground; var backgroundBillboard = label._backgroundBillboard; + var spareBackgroundBillboards = labelCollection._spareBackgroundBillboards; if (!showBackground) { if (defined(backgroundBillboard)) { backgroundBillboard.show = false; - labelCollection._spareBackgroundBillboards.push(backgroundBillboard); + spareBackgroundBillboards.push(backgroundBillboard); label._backgroundBillboard = backgroundBillboard = undefined; } } else { if (!defined(backgroundBillboard)) { - if (labelCollection._spareBackgroundBillboards.length > 0) { - backgroundBillboard = labelCollection._spareBackgroundBillboards.pop(); + if (spareBackgroundBillboards.length > 0) { + backgroundBillboard = spareBackgroundBillboards.pop(); } else { backgroundBillboard = labelCollection._backgroundBillboardCollection.add({ collection : labelCollection, @@ -237,9 +238,10 @@ define([ // if we have a texture, configure the existing billboard, or obtain one if (glyphTextureInfo.index !== -1) { var billboard = glyph.billboard; + var spareBillboards = labelCollection._spareBillboards; if (!defined(billboard)) { - if (labelCollection._spareBillboards.length > 0) { - billboard = labelCollection._spareBillboards.pop(); + if (spareBillboards.length > 0) { + billboard = spareBillboards.pop(); } else { billboard = labelCollection._billboardCollection.add({ collection : labelCollection From d2ef80c5dd3414abee6be47d36b9ccf641abf8d8 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Tue, 6 Dec 2016 14:51:00 -0500 Subject: [PATCH 126/396] Clean up and deprecate unused properties --- Source/Widgets/Geocoder/GeocoderViewModel.js | 57 ++++++++++++++------ 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index 367650936673..82562c62e566 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -5,6 +5,7 @@ define([ '../../Core/defaultValue', '../../Core/defined', '../../Core/defineProperties', + '../../Core/deprecationWarning', '../../Core/DeveloperError', '../../Core/Event', '../../Core/loadJsonp', @@ -20,6 +21,7 @@ define([ defaultValue, defined, defineProperties, + deprecationWarning, DeveloperError, Event, loadJsonp, @@ -63,13 +65,21 @@ define([ } //>>includeEnd('debug'); + var errorCredit; this._url = defaultValue(options.url, 'https://dev.virtualearth.net/'); if (this._url.length > 0 && this._url[this._url.length - 1] !== '/') { this._url += '/'; } this._key = BingMapsApi.getKey(options.key); - var errorCredit = BingMapsApi.getErrorCredit(options.key); + this._defaultGeocoderOptions = { + url: this._url, + key: this._key + }; + + if (defined(options.key)) { + errorCredit = BingMapsApi.getErrorCredit(options.key); + } if (defined(errorCredit)) { options.scene._frameState.creditDisplay.addDefaultCredit(errorCredit); } @@ -84,15 +94,9 @@ define([ this._selectedSuggestion = knockout.observable(); this._showSuggestions = knockout.observable(true); - var that = this; - /** - * Indicates whether search suggestions should be visible. True if there are at least 1 suggestion. - * - * @type {Boolean} - */ - this.suggestionsVisible = knockout.pureComputed(function () { + this._suggestionsVisible = knockout.pureComputed(function () { return that._suggestions().length > 0 && that._showSuggestions(); }); @@ -301,30 +305,30 @@ define([ } defineProperties(GeocoderViewModel.prototype, { - /** - * Gets the currently selected geocoder suggestion - * @memberof GeocoderViewModel.prototype - */ /** * Gets the Bing maps url. + * @deprecated * @memberof GeocoderViewModel.prototype * * @type {String} */ url : { get : function() { + deprecationWarning('url is deprecated', 'The url property was deprecated in Cesium 1.29 and will be removed in version 1.30.'); return this._url; } }, /** * Gets the Bing maps key. + * @deprecated * @memberof GeocoderViewModel.prototype * * @type {String} */ key : { get : function() { + deprecationWarning('key is deprecated', 'The key property was deprecated in Cesium 1.29 and will be removed in version 1.30.'); return this._key; } }, @@ -365,16 +369,39 @@ define([ } }, + /** + * Gets the currently selected geocoder search suggestion + * @memberof GeocoderViewModel.prototype + * + * @type {Object} + */ selectedSuggestion : { get : function() { return this._selectedSuggestion; } }, + /** + * Gets the list of geocoder search suggestions + * @memberof GeocoderViewModel.prototype + * + * @type {Object[]} + */ suggestions : { get : function() { return this._suggestions; } + }, + + /** + * Indicates whether search suggestions should be visible. True if there are at least 1 suggestion. + * + * @type {Boolean} + */ + suggestionsVisible : { + get : function() { + return this._suggestionsVisible; + } } }); @@ -439,6 +466,7 @@ define([ } function defaultGeocode(viewModel, query) { + var defaultOptions = viewModel._defaultGeocoderOptions; // If the user entered (longitude, latitude, [height]) in degrees/meters, // fly without calling the geocoder. @@ -455,11 +483,10 @@ define([ } viewModel._isSearchInProgress = true; - var promise = loadJsonp(viewModel._url + 'REST/v1/Locations', { + var promise = loadJsonp(defaultOptions.url + 'REST/v1/Locations', { parameters : { query : query, - key : viewModel._key - + key : defaultOptions.key }, callbackParameterName : 'jsonp' }); From 570eb3cb0f7ff0dfe4d16037df348de88a735efb Mon Sep 17 00:00:00 2001 From: Hannah Date: Tue, 6 Dec 2016 15:04:04 -0500 Subject: [PATCH 127/396] Update CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index f9eeb43dd66d..ebb563dfaf72 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ Change Log ### 1.29 - 2017-01-02 * Added the ability to blend a `Model` with a color/translucency. Added `color`, `colorBlendMode`, and `colorBlendAmount` properties to `Model`, `ModelGraphics`, and CZML. Added `ColorBlendMode` enum. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) +* Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) ### 1.28 - 2016-12-01 From 53b4d35c65b6a0445b37fc193d00ff3e43ac787a Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Tue, 6 Dec 2016 15:21:18 -0500 Subject: [PATCH 128/396] Remove spare background billboard array. --- Source/Scene/LabelCollection.js | 23 ++++++++--------------- Specs/Scene/LabelCollectionSpec.js | 7 ++----- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index b56a8d44db9c..b37fd0fb3663 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -127,24 +127,19 @@ define([ var showBackground = label._showBackground; var backgroundBillboard = label._backgroundBillboard; - var spareBackgroundBillboards = labelCollection._spareBackgroundBillboards; + var backgroundBillboardCollection = labelCollection._backgroundBillboardCollection; if (!showBackground) { if (defined(backgroundBillboard)) { - backgroundBillboard.show = false; - spareBackgroundBillboards.push(backgroundBillboard); + backgroundBillboardCollection.remove(backgroundBillboard); label._backgroundBillboard = backgroundBillboard = undefined; } } else { if (!defined(backgroundBillboard)) { - if (spareBackgroundBillboards.length > 0) { - backgroundBillboard = spareBackgroundBillboards.pop(); - } else { - backgroundBillboard = labelCollection._backgroundBillboardCollection.add({ - collection : labelCollection, - image : whitePixelCanvasId, - imageSubRegion : whitePixelBoundingRegion - }); - } + backgroundBillboard = backgroundBillboardCollection.add({ + collection : labelCollection, + image : whitePixelCanvasId, + imageSubRegion : whitePixelBoundingRegion + }); label._backgroundBillboard = backgroundBillboard; } @@ -376,8 +371,7 @@ define([ unbindGlyph(labelCollection, glyphs[i]); } if (defined(label._backgroundBillboard)) { - label._backgroundBillboard.show = false; - labelCollection._spareBackgroundBillboards.push(label._backgroundBillboard); + labelCollection._backgroundBillboardCollection.remove(label._backgroundBillboard); label._backgroundBillboard = undefined; } label._labelCollection = undefined; @@ -453,7 +447,6 @@ define([ this._billboardCollection.destroyTextureAtlas = false; this._spareBillboards = []; - this._spareBackgroundBillboards = []; this._glyphTextureCache = {}; this._labels = []; this._labelsToUpdate = []; diff --git a/Specs/Scene/LabelCollectionSpec.js b/Specs/Scene/LabelCollectionSpec.js index e97bb7631c0a..5b5936314091 100644 --- a/Specs/Scene/LabelCollectionSpec.js +++ b/Specs/Scene/LabelCollectionSpec.js @@ -779,24 +779,21 @@ defineSuite([ expect(labels._spareBillboards.length).toEqual(0); }); - it('should reuse background billboards that are not needed any more', function() { + it('should not reuse background billboards that are not needed any more', function() { var label = labels.add({ text : 'abc', showBackground : true }); scene.renderForSpecs(); expect(labels._backgroundBillboardCollection.length).toEqual(1); - expect(labels._spareBackgroundBillboards.length).toEqual(0); label.showBackground = false; scene.renderForSpecs(); - expect(labels._backgroundBillboardCollection.length).toEqual(1); - expect(labels._spareBackgroundBillboards.length).toEqual(1); + expect(labels._backgroundBillboardCollection.length).toEqual(0); label.showBackground = true; scene.renderForSpecs(); expect(labels._backgroundBillboardCollection.length).toEqual(1); - expect(labels._spareBackgroundBillboards.length).toEqual(0); }); describe('Label', function() { From 7680bdc0f504f36205f68bedc8987395e5074531 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Tue, 6 Dec 2016 16:09:32 -0500 Subject: [PATCH 129/396] Fix failing tests --- Source/Widgets/Geocoder/Geocoder.js | 2 ++ Source/Widgets/Geocoder/GeocoderViewModel.js | 12 ++++--- Specs/Widgets/Geocoder/GeocoderSpec.js | 36 +++++++++++++++++++ .../Widgets/Geocoder/GeocoderViewModelSpec.js | 33 +++++++++-------- 4 files changed, 64 insertions(+), 19 deletions(-) diff --git a/Source/Widgets/Geocoder/Geocoder.js b/Source/Widgets/Geocoder/Geocoder.js index d7c8a3feba95..34f1761ff217 100644 --- a/Source/Widgets/Geocoder/Geocoder.js +++ b/Source/Widgets/Geocoder/Geocoder.js @@ -208,7 +208,9 @@ css: { active: $data === $parent.selectedSuggestion() }'); } knockout.cleanNode(this._form); + knockout.cleanNode(this._searchSuggestionsContainer); this._container.removeChild(this._form); + this._container.removeChild(this._searchSuggestionsContainer); this._textBox.removeEventListener('focus', this._onTextBoxFocus, false); return destroyObject(this); diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index 82562c62e566..c956cc3f54e9 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -14,7 +14,8 @@ define([ '../../Scene/SceneMode', '../../ThirdParty/knockout', '../../ThirdParty/when', - '../createCommand' + '../createCommand', + '../getElement' ], function( BingMapsApi, Cartesian3, @@ -30,7 +31,8 @@ define([ SceneMode, knockout, when, - createCommand) { + createCommand, + getElement) { 'use strict'; /** @@ -84,6 +86,7 @@ define([ options.scene._frameState.creditDisplay.addDefaultCredit(errorCredit); } + this._viewContainer = options.container; this._scene = options.scene; this._flightDuration = options.flightDuration; this._searchText = ''; @@ -93,6 +96,7 @@ define([ this._suggestions = knockout.observableArray(); this._selectedSuggestion = knockout.observable(); this._showSuggestions = knockout.observable(true); + this._updateCamera = updateCamera; var that = this; @@ -113,7 +117,7 @@ define([ }); this._adjustSuggestionsScroll = function (focusedItemIndex) { - var container = document.getElementsByClassName('cesium-viewer-geocoderContainer')[0]; + var container = getElement(this._viewContainer); var searchResults = container.getElementsByClassName('search-results')[0]; var listItems = container.getElementsByTagName('li'); var element = listItems[focusedItemIndex]; @@ -180,7 +184,7 @@ define([ } that._suggestions.splice(0, that._suggestions().length); if (results.length > 0) { - results.slice(0, 5).forEach(function (result) { + results.slice(0, Math.min(results.length, 5)).forEach(function (result) { that._suggestions.push(result); }); } diff --git a/Specs/Widgets/Geocoder/GeocoderSpec.js b/Specs/Widgets/Geocoder/GeocoderSpec.js index 484dfb350750..0402dc6fe974 100644 --- a/Specs/Widgets/Geocoder/GeocoderSpec.js +++ b/Specs/Widgets/Geocoder/GeocoderSpec.js @@ -8,6 +8,14 @@ defineSuite([ 'use strict'; var scene; + var customGeocoderOptions = { + geocode : function (input, callback) { + callback(undefined, ['a', 'b', 'c']); + }, + getSuggestions : function (input) { + return ['a', 'b', 'c']; + } + }; beforeEach(function() { scene = createScene(); }); @@ -80,4 +88,32 @@ defineSuite([ }); }).toThrowDeveloperError(); }); + + it('automatic suggestions can be navigated by arrow up/down keys', function() { + var container = document.createElement('div'); + container.id = 'testContainer'; + document.body.appendChild(container); + var geocoder = new Geocoder({ + container : 'testContainer', + scene : scene, + customGeocoder : customGeocoderOptions + }); + var viewModel = geocoder._viewModel; + viewModel._searchText = 'some_text'; + viewModel.updateSearchSuggestions(); + + expect(viewModel._selectedSuggestion()).toEqual(undefined); + viewModel.handleArrowDown(); + expect(viewModel._selectedSuggestion()).toEqual('a'); + viewModel.handleArrowDown(); + viewModel.handleArrowDown(); + expect(viewModel._selectedSuggestion()).toEqual('c'); + viewModel.handleArrowDown(); + expect(viewModel._selectedSuggestion()).toEqual('a'); + viewModel.handleArrowUp(); + expect(viewModel._selectedSuggestion()).toEqual('c'); + viewModel.handleArrowUp(); + expect(viewModel._selectedSuggestion()).toEqual('b'); + }); + }, 'WebGL'); diff --git a/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js b/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js index e71f73fe1231..e252cc0cc1e5 100644 --- a/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js +++ b/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js @@ -147,7 +147,7 @@ defineSuite([ }).not.toThrowDeveloperError(); }); - fit('automatic suggestions can be retrieved', function() { + it('automatic suggestions can be retrieved', function() { var geocoder = new GeocoderViewModel({ scene : scene, customGeocoder : customGeocoderOptions @@ -157,26 +157,29 @@ defineSuite([ expect(geocoder._suggestions().length).toEqual(3); }); - fit('automatic suggestions can be navigated by arrow up/down keys', function() { + it('update search suggestions results in empty list if the query is empty', function() { var geocoder = new GeocoderViewModel({ scene : scene, customGeocoder : customGeocoderOptions }); - geocoder._searchText = 'some_text'; + geocoder._searchText = ''; + spyOn(geocoder, '_adjustSuggestionsScroll'); geocoder.updateSearchSuggestions(); + expect(geocoder._suggestions().length).toEqual(0); + }); + + it('can activate selected search suggestion', function () { + var geocoder = new GeocoderViewModel({ + scene : scene, + customGeocoder : customGeocoderOptions + }); + spyOn(geocoder, '_updateCamera'); + spyOn(geocoder, '_adjustSuggestionsScroll'); - expect(geocoder._selectedSuggestion()).toEqual(undefined); - geocoder.handleArrowDown(); - expect(geocoder._selectedSuggestion()).toEqual('a'); - geocoder.handleArrowDown(); - geocoder.handleArrowDown(); - expect(geocoder._selectedSuggestion()).toEqual('c'); - geocoder.handleArrowDown(); - expect(geocoder._selectedSuggestion()).toEqual('a'); - geocoder.handleArrowUp(); - expect(geocoder._selectedSuggestion()).toEqual('c'); - geocoder.handleArrowUp(); - expect(geocoder._selectedSuggestion()).toEqual('b'); + var suggestion = {displayName: 'a', bbox: {west: 0.0, east: 0.1, north: 0.1, south: -0.1}}; + geocoder._selectedSuggestion(suggestion); + geocoder.activateSuggestion(suggestion); + expect(geocoder._searchText).toEqual('a'); }); }, 'WebGL'); From 3eb09e48ef595380273eb290b6f2f5525485cfe5 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Tue, 6 Dec 2016 16:46:14 -0500 Subject: [PATCH 130/396] Disable background on empty labels. --- Source/Scene/LabelCollection.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index b37fd0fb3663..2ff096b9706f 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -125,7 +125,17 @@ define([ var glyphIndex; var textIndex; - var showBackground = label._showBackground; + // if we have more glyphs than needed, unbind the extras. + if (textLength < glyphsLength) { + for (glyphIndex = textLength; glyphIndex < glyphsLength; ++glyphIndex) { + unbindGlyph(labelCollection, glyphs[glyphIndex]); + } + } + + // presize glyphs to match the new text length + glyphs.length = textLength; + + var showBackground = label._showBackground && (glyphs.length > 0); var backgroundBillboard = label._backgroundBillboard; var backgroundBillboardCollection = labelCollection._backgroundBillboardCollection; if (!showBackground) { @@ -159,16 +169,6 @@ define([ backgroundBillboard.distanceDisplayCondition = label._distanceDisplayCondition; } - // if we have more glyphs than needed, unbind the extras. - if (textLength < glyphsLength) { - for (glyphIndex = textLength; glyphIndex < glyphsLength; ++glyphIndex) { - unbindGlyph(labelCollection, glyphs[glyphIndex]); - } - } - - // presize glyphs to match the new text length - glyphs.length = textLength; - var glyphTextureCache = labelCollection._glyphTextureCache; // walk the text looking for new characters (creating new glyphs for each) @@ -346,7 +346,7 @@ define([ } } - if (defined(backgroundBillboard)) { + if (defined(backgroundBillboard) && (glyphLength > 0)) { glyphPixelOffset.x = (widthOffset - backgroundPadding.x * scale) * resolutionScale; if (verticalOrigin === VerticalOrigin.BASELINE) { glyphPixelOffset.y = -backgroundPadding.y * scale - maxDescent * scale; From 05d680e3dfac2f2548dcd2a9ce3e03c0c65e648a Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Tue, 6 Dec 2016 17:25:48 -0500 Subject: [PATCH 131/396] Use backgrounds a bit more in Sandcastle demos. --- .../gallery/CZML Billboard and Label.html | 20 +++++++++---------- Apps/Sandcastle/gallery/Labels.html | 2 ++ .../gallery/development/Labels.html | 19 +++++++++++++----- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/Apps/Sandcastle/gallery/CZML Billboard and Label.html b/Apps/Sandcastle/gallery/CZML Billboard and Label.html index dc6e1521d663..37889f6d28ca 100644 --- a/Apps/Sandcastle/gallery/CZML Billboard and Label.html +++ b/Apps/Sandcastle/gallery/CZML Billboard and Label.html @@ -42,19 +42,19 @@ }, "label" : { "fillColor" : { - "rgba" : [0, 255, 255, 255] + "rgba" : [255, 255, 255, 255] }, - "font" : "11pt Lucida Console", + "font" : "12pt Lucida Console", "horizontalOrigin" : "LEFT", - "outlineColor" : { - "rgba":[0, 0, 0, 255] - }, - "outlineWidth" : 2, "pixelOffset" : { - "cartesian2" : [12, 0] + "cartesian2" : [8, 0] }, - "style" : "FILL_AND_OUTLINE", - "text" : "AGI" + "style" : "FILL", + "text" : "AGI", + "showBackground" : true, + "backgroundColor" : { + "rgba" : [112, 89, 57, 200] + } }, "position" : { "cartesian":[ @@ -65,7 +65,7 @@ var viewer = new Cesium.Viewer('cesiumContainer'); viewer.dataSources.add(Cesium.CzmlDataSource.load(czml)); - //Sandcastle_End +//Sandcastle_End Sandcastle.finishedLoading(); } if (typeof Cesium !== "undefined") { diff --git a/Apps/Sandcastle/gallery/Labels.html b/Apps/Sandcastle/gallery/Labels.html index 0cbe6839a575..2c4b4b4b7f96 100644 --- a/Apps/Sandcastle/gallery/Labels.html +++ b/Apps/Sandcastle/gallery/Labels.html @@ -64,6 +64,7 @@ }); entity.label.scale = 2.0; + entity.label.showBackground = true; } function offsetByDistance() { @@ -80,6 +81,7 @@ label : { text : 'Label on top of scaling billboard', font : '20px sans-serif', + showBackground : true, horizontalOrigin : Cesium.HorizontalOrigin.CENTER, pixelOffset : new Cesium.Cartesian2(0.0, -image.height), pixelOffsetScaleByDistance : new Cesium.NearFarScalar(1.5e2, 3.0, 1.5e7, 0.5) diff --git a/Apps/Sandcastle/gallery/development/Labels.html b/Apps/Sandcastle/gallery/development/Labels.html index f865fccc0f1a..d5ab916b0955 100644 --- a/Apps/Sandcastle/gallery/development/Labels.html +++ b/Apps/Sandcastle/gallery/development/Labels.html @@ -77,19 +77,27 @@ labels.modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(center); labels.add({ position : new Cesium.Cartesian3(0.0, 0.0, 0.0), - text : 'Center' + text : 'Center', + font : '13pt sans-serif', + showBackground : true }); labels.add({ position : new Cesium.Cartesian3(1000000.0, 0.0, 0.0), - text : 'East' + text : 'East', + font : '13pt sans-serif', + showBackground : true }); labels.add({ position : new Cesium.Cartesian3(0.0, 1000000.0, 0.0), - text : 'North' + text : 'North', + font : '13pt sans-serif', + showBackground : true }); labels.add({ position : new Cesium.Cartesian3(0.0, 0.0, 1000000.0), - text : 'Up' + text : 'Up', + font : '13pt sans-serif', + showBackground : true }); } @@ -108,8 +116,9 @@ var labels = scene.primitives.add(new Cesium.LabelCollection()); labels.add({ position : Cesium.Cartesian3.fromDegrees(-75.1641667, 39.9522222), - text : 'Label on top of scaling billboard', + text : 'Label on top of scaling billboard', font : '20px sans-serif', + showBackground : true, horizontalOrigin : Cesium.HorizontalOrigin.CENTER, pixelOffset : new Cesium.Cartesian2(0.0, -image.height), pixelOffsetScaleByDistance : new Cesium.NearFarScalar(1.5e2, 3.0, 1.5e7, 0.5) From 2e114648498a834ef6a11b90b16943580e8c21bd Mon Sep 17 00:00:00 2001 From: Scott Hunter Date: Tue, 6 Dec 2016 17:34:44 -0500 Subject: [PATCH 132/396] Update CZML validation document and test. --- Specs/Data/CZML/ValidationDocument.czml | 3242 ++++++++++++----------- Specs/DataSources/CzmlDataSourceSpec.js | 1325 ++++----- 2 files changed, 2317 insertions(+), 2250 deletions(-) diff --git a/Specs/Data/CZML/ValidationDocument.czml b/Specs/Data/CZML/ValidationDocument.czml index f7e17fa73f64..a231aca24840 100644 --- a/Specs/Data/CZML/ValidationDocument.czml +++ b/Specs/Data/CZML/ValidationDocument.czml @@ -268,6 +268,13 @@ "incrementallyLoadTextures":true, "runAnimations":true, "heightReference":"CLAMP_TO_GROUND", + "color":{ + "rgba":[ + 54,55,56,53 + ] + }, + "colorBlendMode":"REPLACE", + "colorBlendAmount":35, "nodeTransformations":{ "prop":{ "translation":{ @@ -290,15 +297,15 @@ }, "path":{ "show":true, - "width":35, - "resolution":36, - "leadTime":37, - "trailTime":38, + "width":36, + "resolution":37, + "leadTime":38, + "trailTime":39, "material":{ "solidColor":{ "color":{ "rgba":[ - 54,55,56,53 + 58,59,60,57 ] } } @@ -306,19 +313,19 @@ }, "point":{ "show":true, - "pixelSize":39, + "pixelSize":40, "heightReference":"CLAMP_TO_GROUND", "color":{ "rgba":[ - 58,59,60,57 + 62,63,64,61 ] }, "outlineColor":{ "rgba":[ - 62,63,64,61 + 66,67,68,65 ] }, - "outlineWidth":40, + "outlineWidth":41, "scaleByDistance":{ "nearFarScalar":[ 21,22,23,24 @@ -337,16 +344,16 @@ 7,8,9,10,11,12 ] }, - "height":41, - "extrudedHeight":42, - "stRotation":43, - "granularity":44, + "height":42, + "extrudedHeight":43, + "stRotation":44, + "granularity":45, "fill":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 66,67,68,65 + 70,71,72,69 ] } } @@ -354,10 +361,10 @@ "outline":true, "outlineColor":{ "rgba":[ - 70,71,72,69 + 74,75,76,73 ] }, - "outlineWidth":45, + "outlineWidth":46, "perPositionHeight":true, "closeTop":true, "closeBottom":true @@ -369,13 +376,13 @@ 13,14,15,16,17,18 ] }, - "width":46, - "granularity":47, + "width":47, + "granularity":48, "material":{ "solidColor":{ "color":{ "rgba":[ - 74,75,76,73 + 78,79,80,77 ] } } @@ -389,17 +396,17 @@ 1,0.429203673205103,1.4292036732051,0.858407346410207 ] }, - "height":48, - "extrudedHeight":49, - "rotation":50, - "stRotation":51, - "granularity":52, + "height":49, + "extrudedHeight":50, + "rotation":51, + "stRotation":52, + "granularity":53, "fill":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 78,79,80,77 + 82,83,84,81 ] } } @@ -407,10 +414,10 @@ "outline":true, "outlineColor":{ "rgba":[ - 82,83,84,81 + 86,87,88,85 ] }, - "outlineWidth":53, + "outlineWidth":54, "closeTop":true, "closeBottom":true }, @@ -431,13 +438,13 @@ 3,4 ] }, - "granularity":54, + "granularity":55, "fill":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 86,87,88,85 + 90,91,92,89 ] } } @@ -445,31 +452,31 @@ "outline":true, "outlineColor":{ "rgba":[ - 90,91,92,89 + 94,95,96,93 ] }, - "outlineWidth":55 + "outlineWidth":56 }, "agi_conicSensor":{ "show":true, - "innerHalfAngle":56, - "outerHalfAngle":57, - "minimumClockAngle":58, - "maximumClockAngle":59, - "radius":60, + "innerHalfAngle":57, + "outerHalfAngle":58, + "minimumClockAngle":59, + "maximumClockAngle":60, + "radius":61, "showIntersection":true, "intersectionColor":{ "rgba":[ - 94,95,96,93 + 98,99,100,97 ] }, - "intersectionWidth":61, + "intersectionWidth":62, "showLateralSurfaces":true, "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgba":[ - 98,99,100,97 + 102,103,104,101 ] } } @@ -479,7 +486,7 @@ "solidColor":{ "color":{ "rgba":[ - 102,103,104,101 + 106,107,108,105 ] } } @@ -489,7 +496,7 @@ "solidColor":{ "color":{ "rgba":[ - 106,107,108,105 + 110,111,112,109 ] } } @@ -499,7 +506,7 @@ "solidColor":{ "color":{ "rgba":[ - 110,111,112,109 + 114,115,116,113 ] } } @@ -511,7 +518,7 @@ "solidColor":{ "color":{ "rgba":[ - 114,115,116,113 + 118,119,120,117 ] } } @@ -519,10 +526,10 @@ "showEnvironmentIntersection":true, "environmentIntersectionColor":{ "rgba":[ - 118,119,120,117 + 122,123,124,121 ] }, - "environmentIntersectionWidth":62 + "environmentIntersectionWidth":63 }, "agi_customPatternSensor":{ "show":true, @@ -531,20 +538,20 @@ 1,2,3,4,5,6 ] }, - "radius":63, + "radius":64, "showIntersection":true, "intersectionColor":{ "rgba":[ - 122,123,124,121 + 126,127,128,125 ] }, - "intersectionWidth":64, + "intersectionWidth":65, "showLateralSurfaces":true, "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgba":[ - 126,127,128,125 + 130,131,132,129 ] } } @@ -554,7 +561,7 @@ "solidColor":{ "color":{ "rgba":[ - 130,131,132,129 + 134,135,136,133 ] } } @@ -564,7 +571,7 @@ "solidColor":{ "color":{ "rgba":[ - 134,135,136,133 + 138,139,140,137 ] } } @@ -574,7 +581,7 @@ "solidColor":{ "color":{ "rgba":[ - 138,139,140,137 + 142,143,144,141 ] } } @@ -586,7 +593,7 @@ "solidColor":{ "color":{ "rgba":[ - 142,143,144,141 + 146,147,148,145 ] } } @@ -594,29 +601,29 @@ "showEnvironmentIntersection":true, "environmentIntersectionColor":{ "rgba":[ - 146,147,148,145 + 150,151,152,149 ] }, - "environmentIntersectionWidth":65 + "environmentIntersectionWidth":66 }, "agi_rectangularSensor":{ "show":true, - "xHalfAngle":66, - "yHalfAngle":67, - "radius":68, + "xHalfAngle":67, + "yHalfAngle":68, + "radius":69, "showIntersection":true, "intersectionColor":{ "rgba":[ - 150,151,152,149 + 154,155,156,153 ] }, - "intersectionWidth":69, + "intersectionWidth":70, "showLateralSurfaces":true, "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgba":[ - 154,155,156,153 + 158,159,160,157 ] } } @@ -626,7 +633,7 @@ "solidColor":{ "color":{ "rgba":[ - 158,159,160,157 + 162,163,164,161 ] } } @@ -636,7 +643,7 @@ "solidColor":{ "color":{ "rgba":[ - 162,163,164,161 + 166,167,168,165 ] } } @@ -646,7 +653,7 @@ "solidColor":{ "color":{ "rgba":[ - 166,167,168,165 + 170,171,172,169 ] } } @@ -658,7 +665,7 @@ "solidColor":{ "color":{ "rgba":[ - 170,171,172,169 + 174,175,176,173 ] } } @@ -666,10 +673,10 @@ "showEnvironmentIntersection":true, "environmentIntersectionColor":{ "rgba":[ - 174,175,176,173 + 178,179,180,177 ] }, - "environmentIntersectionWidth":70 + "environmentIntersectionWidth":71 }, "agi_fan":{ "show":true, @@ -678,13 +685,13 @@ 7,8,9,10,11,12 ] }, - "radius":71, + "radius":72, "perDirectionRadius":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 178,179,180,177 + 182,183,184,181 ] } } @@ -693,17 +700,17 @@ "outline":true, "outlineColor":{ "rgba":[ - 182,183,184,181 + 186,187,188,185 ] }, - "outlineWidth":72, - "numberOfRings":73 + "outlineWidth":73, + "numberOfRings":74 }, "agi_vector":{ "show":true, "color":{ "rgba":[ - 186,187,188,185 + 190,191,192,189 ] }, "direction":{ @@ -711,8 +718,8 @@ 1,2,3 ] }, - "length":74, - "minimumLengthInPixels":75 + "length":75, + "minimumLengthInPixels":76 } }, { @@ -786,7 +793,7 @@ }, "color":{ "rgba":[ - 190,191,192,189 + 194,195,196,193 ] }, "transparent":true @@ -801,10 +808,10 @@ "grid":{ "color":{ "rgba":[ - 194,195,196,193 + 198,199,200,197 ] }, - "cellAlpha":76, + "cellAlpha":77, "lineCount":{ "cartesian2":[ 7,8 @@ -832,16 +839,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 198,199,200,197 + 202,203,204,201 ] }, "oddColor":{ "rgba":[ - 202,203,204,201 + 206,207,208,205 ] }, - "offset":77, - "repeat":78 + "offset":78, + "repeat":79 } } } @@ -959,7 +966,7 @@ }, "color":{ "rgba":[ - 206,207,208,205 + 210,211,212,209 ] }, "transparent":true @@ -974,10 +981,10 @@ "grid":{ "color":{ "rgba":[ - 210,211,212,209 + 214,215,216,213 ] }, - "cellAlpha":79, + "cellAlpha":80, "lineCount":{ "cartesian2":[ 15,16 @@ -1005,16 +1012,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 214,215,216,213 + 218,219,220,217 ] }, "oddColor":{ "rgba":[ - 218,219,220,217 + 222,223,224,221 ] }, - "offset":80, - "repeat":81 + "offset":81, + "repeat":82 } } } @@ -1112,7 +1119,7 @@ }, "color":{ "rgba":[ - 222,223,224,221 + 226,227,228,225 ] }, "transparent":true @@ -1127,10 +1134,10 @@ "grid":{ "color":{ "rgba":[ - 226,227,228,225 + 230,231,232,229 ] }, - "cellAlpha":82, + "cellAlpha":83, "lineCount":{ "cartesian2":[ 23,24 @@ -1158,16 +1165,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 230,231,232,229 + 234,235,236,233 ] }, "oddColor":{ "rgba":[ - 234,235,236,233 + 238,239,240,237 ] }, - "offset":83, - "repeat":84 + "offset":84, + "repeat":85 } } } @@ -1265,7 +1272,7 @@ }, "color":{ "rgba":[ - 238,239,240,237 + 242,243,244,241 ] }, "transparent":true @@ -1280,10 +1287,10 @@ "grid":{ "color":{ "rgba":[ - 242,243,244,241 + 246,247,248,245 ] }, - "cellAlpha":85, + "cellAlpha":86, "lineCount":{ "cartesian2":[ 31,32 @@ -1311,16 +1318,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 246,247,248,245 + 250,251,252,249 ] }, "oddColor":{ "rgba":[ - 250,251,252,249 + 254,0,1,253 ] }, - "offset":86, - "repeat":87 + "offset":87, + "repeat":88 } } } @@ -1418,7 +1425,7 @@ }, "color":{ "rgba":[ - 254,0,1,253 + 3,4,5,2 ] }, "transparent":true @@ -1433,10 +1440,10 @@ "grid":{ "color":{ "rgba":[ - 3,4,5,2 + 7,8,9,6 ] }, - "cellAlpha":88, + "cellAlpha":89, "lineCount":{ "cartesian2":[ 39,40 @@ -1464,16 +1471,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 7,8,9,6 + 11,12,13,10 ] }, "oddColor":{ "rgba":[ - 11,12,13,10 + 15,16,17,14 ] }, - "offset":89, - "repeat":90 + "offset":90, + "repeat":91 } } } @@ -1566,12 +1573,22 @@ }, { "id":"constant20", + "model":{ + "color":{ + "rgbaf":[ + 0.5254901960784314,0.5294117647058824,0.5333333333333333,0.5215686274509804 + ] + } + } + }, + { + "id":"constant21", "path":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.5254901960784314,0.5294117647058824,0.5333333333333333,0.5215686274509804 + 0.5411764705882353,0.5450980392156862,0.5490196078431373,0.5372549019607843 ] } } @@ -1585,15 +1602,15 @@ "polylineOutline":{ "color":{ "rgba":[ - 15,16,17,14 + 19,20,21,18 ] }, "outlineColor":{ "rgba":[ - 19,20,21,18 + 23,24,25,22 ] }, - "outlineWidth":91 + "outlineWidth":92 } } } @@ -1605,7 +1622,7 @@ "polylineArrow":{ "color":{ "rgba":[ - 23,24,25,22 + 27,28,29,26 ] } } @@ -1619,10 +1636,10 @@ "polylineGlow":{ "color":{ "rgba":[ - 27,28,29,26 + 31,32,33,30 ] }, - "glowPower":92 + "glowPower":93 } } } @@ -1640,7 +1657,7 @@ }, "color":{ "rgba":[ - 31,32,33,30 + 35,36,37,34 ] }, "transparent":true @@ -1655,10 +1672,10 @@ "grid":{ "color":{ "rgba":[ - 35,36,37,34 + 39,40,41,38 ] }, - "cellAlpha":93, + "cellAlpha":94, "lineCount":{ "cartesian2":[ 47,48 @@ -1686,16 +1703,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 39,40,41,38 + 43,44,45,42 ] }, "oddColor":{ "rgba":[ - 43,44,45,42 + 47,48,49,46 ] }, - "offset":94, - "repeat":95 + "offset":95, + "repeat":96 } } } @@ -1707,7 +1724,7 @@ "polylineOutline":{ "color":{ "rgbaf":[ - 0.5411764705882353,0.5450980392156862,0.5490196078431373,0.5372549019607843 + 0.5568627450980392,0.5607843137254902,0.5647058823529412,0.5529411764705883 ] } } @@ -1721,7 +1738,7 @@ "polylineOutline":{ "outlineColor":{ "rgbaf":[ - 0.5568627450980392,0.5607843137254902,0.5647058823529412,0.5529411764705883 + 0.5725490196078431,0.5764705882352941,0.5803921568627451,0.5686274509803921 ] } } @@ -1735,7 +1752,7 @@ "polylineArrow":{ "color":{ "rgbaf":[ - 0.5725490196078431,0.5764705882352941,0.5803921568627451,0.5686274509803921 + 0.5882352941176471,0.592156862745098,0.596078431372549,0.5843137254901961 ] } } @@ -1749,7 +1766,7 @@ "polylineGlow":{ "color":{ "rgbaf":[ - 0.5882352941176471,0.592156862745098,0.596078431372549,0.5843137254901961 + 0.6039215686274509,0.6078431372549019,0.611764705882353,0.6 ] } } @@ -1763,7 +1780,7 @@ "image":{ "color":{ "rgbaf":[ - 0.6039215686274509,0.6078431372549019,0.611764705882353,0.6 + 0.6196078431372549,0.6235294117647059,0.6274509803921569,0.615686274509804 ] } } @@ -1777,7 +1794,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.6196078431372549,0.6235294117647059,0.6274509803921569,0.615686274509804 + 0.6352941176470588,0.6392156862745098,0.6431372549019608,0.6313725490196078 ] } } @@ -1791,7 +1808,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.6352941176470588,0.6392156862745098,0.6431372549019608,0.6313725490196078 + 0.6509803921568628,0.6549019607843137,0.6588235294117647,0.6470588235294118 ] } } @@ -1805,7 +1822,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.6509803921568628,0.6549019607843137,0.6588235294117647,0.6470588235294118 + 0.6666666666666666,0.6705882352941176,0.6745098039215687,0.6627450980392157 ] } } @@ -1813,27 +1830,27 @@ } }, { - "id":"constant21", + "id":"constant22", "point":{ "color":{ "rgbaf":[ - 0.6666666666666666,0.6705882352941176,0.6745098039215687,0.6627450980392157 + 0.6823529411764706,0.6862745098039216,0.6901960784313725,0.6784313725490196 ] } } }, { - "id":"constant22", + "id":"constant23", "point":{ "outlineColor":{ "rgbaf":[ - 0.6823529411764706,0.6862745098039216,0.6901960784313725,0.6784313725490196 + 0.6980392156862745,0.7019607843137254,0.7058823529411765,0.6941176470588235 ] } } }, { - "id":"constant23", + "id":"constant24", "polygon":{ "positions":{ "cartographicRadians":[ @@ -1843,7 +1860,7 @@ } }, { - "id":"constant24", + "id":"constant25", "polygon":{ "positions":{ "cartographicDegrees":[ @@ -1853,13 +1870,13 @@ } }, { - "id":"constant25", + "id":"constant26", "polygon":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.6980392156862745,0.7019607843137254,0.7058823529411765,0.6941176470588235 + 0.7137254901960784,0.7176470588235294,0.7215686274509804,0.7098039215686275 ] } } @@ -1879,7 +1896,7 @@ }, "color":{ "rgba":[ - 47,48,49,46 + 51,52,53,50 ] }, "transparent":true @@ -1894,10 +1911,10 @@ "grid":{ "color":{ "rgba":[ - 51,52,53,50 + 55,56,57,54 ] }, - "cellAlpha":96, + "cellAlpha":97, "lineCount":{ "cartesian2":[ 55,56 @@ -1925,16 +1942,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 55,56,57,54 + 59,60,61,58 ] }, "oddColor":{ "rgba":[ - 59,60,61,58 + 63,64,65,62 ] }, - "offset":97, - "repeat":98 + "offset":98, + "repeat":99 } } } @@ -1946,7 +1963,7 @@ "image":{ "color":{ "rgbaf":[ - 0.7137254901960784,0.7176470588235294,0.7215686274509804,0.7098039215686275 + 0.7294117647058823,0.7333333333333333,0.7372549019607844,0.7254901960784313 ] } } @@ -1960,7 +1977,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.7294117647058823,0.7333333333333333,0.7372549019607844,0.7254901960784313 + 0.7450980392156863,0.7490196078431373,0.7529411764705882,0.7411764705882353 ] } } @@ -1974,7 +1991,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.7450980392156863,0.7490196078431373,0.7529411764705882,0.7411764705882353 + 0.7607843137254902,0.7647058823529411,0.7686274509803922,0.7568627450980392 ] } } @@ -1988,7 +2005,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.7607843137254902,0.7647058823529411,0.7686274509803922,0.7568627450980392 + 0.7764705882352941,0.7803921568627451,0.7843137254901961,0.7725490196078432 ] } } @@ -1996,17 +2013,17 @@ } }, { - "id":"constant26", + "id":"constant27", "polygon":{ "outlineColor":{ "rgbaf":[ - 0.7764705882352941,0.7803921568627451,0.7843137254901961,0.7725490196078432 + 0.792156862745098,0.796078431372549,0.8,0.788235294117647 ] } } }, { - "id":"constant27", + "id":"constant28", "polyline":{ "positions":{ "cartographicRadians":[ @@ -2016,7 +2033,7 @@ } }, { - "id":"constant28", + "id":"constant29", "polyline":{ "positions":{ "cartographicDegrees":[ @@ -2026,13 +2043,13 @@ } }, { - "id":"constant29", + "id":"constant30", "polyline":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.792156862745098,0.796078431372549,0.8,0.788235294117647 + 0.807843137254902,0.8117647058823529,0.8156862745098039,0.803921568627451 ] } } @@ -2046,15 +2063,15 @@ "polylineOutline":{ "color":{ "rgba":[ - 63,64,65,62 + 67,68,69,66 ] }, "outlineColor":{ "rgba":[ - 67,68,69,66 + 71,72,73,70 ] }, - "outlineWidth":99 + "outlineWidth":100 } } } @@ -2066,7 +2083,7 @@ "polylineArrow":{ "color":{ "rgba":[ - 71,72,73,70 + 75,76,77,74 ] } } @@ -2080,10 +2097,10 @@ "polylineGlow":{ "color":{ "rgba":[ - 75,76,77,74 + 79,80,81,78 ] }, - "glowPower":100 + "glowPower":101 } } } @@ -2101,7 +2118,7 @@ }, "color":{ "rgba":[ - 79,80,81,78 + 83,84,85,82 ] }, "transparent":true @@ -2116,10 +2133,10 @@ "grid":{ "color":{ "rgba":[ - 83,84,85,82 + 87,88,89,86 ] }, - "cellAlpha":101, + "cellAlpha":102, "lineCount":{ "cartesian2":[ 63,64 @@ -2147,16 +2164,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 87,88,89,86 + 91,92,93,90 ] }, "oddColor":{ "rgba":[ - 91,92,93,90 + 95,96,97,94 ] }, - "offset":102, - "repeat":103 + "offset":103, + "repeat":104 } } } @@ -2168,7 +2185,7 @@ "polylineOutline":{ "color":{ "rgbaf":[ - 0.807843137254902,0.8117647058823529,0.8156862745098039,0.803921568627451 + 0.8235294117647058,0.8274509803921568,0.8313725490196079,0.8196078431372549 ] } } @@ -2182,7 +2199,7 @@ "polylineOutline":{ "outlineColor":{ "rgbaf":[ - 0.8235294117647058,0.8274509803921568,0.8313725490196079,0.8196078431372549 + 0.8392156862745098,0.8431372549019608,0.8470588235294118,0.8352941176470589 ] } } @@ -2196,7 +2213,7 @@ "polylineArrow":{ "color":{ "rgbaf":[ - 0.8392156862745098,0.8431372549019608,0.8470588235294118,0.8352941176470589 + 0.8549019607843137,0.8588235294117647,0.8627450980392157,0.8509803921568627 ] } } @@ -2210,7 +2227,7 @@ "polylineGlow":{ "color":{ "rgbaf":[ - 0.8549019607843137,0.8588235294117647,0.8627450980392157,0.8509803921568627 + 0.8705882352941177,0.8745098039215686,0.8784313725490196,0.8666666666666667 ] } } @@ -2224,7 +2241,7 @@ "image":{ "color":{ "rgbaf":[ - 0.8705882352941177,0.8745098039215686,0.8784313725490196,0.8666666666666667 + 0.8862745098039215,0.8901960784313725,0.8941176470588236,0.8823529411764706 ] } } @@ -2238,7 +2255,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.8862745098039215,0.8901960784313725,0.8941176470588236,0.8823529411764706 + 0.9019607843137255,0.9058823529411765,0.9098039215686274,0.8980392156862745 ] } } @@ -2252,7 +2269,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.9019607843137255,0.9058823529411765,0.9098039215686274,0.8980392156862745 + 0.9176470588235294,0.9215686274509803,0.9254901960784314,0.9137254901960784 ] } } @@ -2266,7 +2283,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.9176470588235294,0.9215686274509803,0.9254901960784314,0.9137254901960784 + 0.9333333333333333,0.9372549019607843,0.9411764705882353,0.9294117647058824 ] } } @@ -2274,7 +2291,7 @@ } }, { - "id":"constant30", + "id":"constant31", "rectangle":{ "coordinates":{ "wsenDegrees":[ @@ -2284,13 +2301,13 @@ } }, { - "id":"constant31", + "id":"constant32", "rectangle":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.9333333333333333,0.9372549019607843,0.9411764705882353,0.9294117647058824 + 0.9490196078431372,0.9529411764705882,0.9568627450980393,0.9450980392156862 ] } } @@ -2310,7 +2327,7 @@ }, "color":{ "rgba":[ - 95,96,97,94 + 99,100,101,98 ] }, "transparent":true @@ -2325,10 +2342,10 @@ "grid":{ "color":{ "rgba":[ - 99,100,101,98 + 103,104,105,102 ] }, - "cellAlpha":104, + "cellAlpha":105, "lineCount":{ "cartesian2":[ 71,72 @@ -2356,16 +2373,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 103,104,105,102 + 107,108,109,106 ] }, "oddColor":{ "rgba":[ - 107,108,109,106 + 111,112,113,110 ] }, - "offset":105, - "repeat":106 + "offset":106, + "repeat":107 } } } @@ -2377,7 +2394,7 @@ "image":{ "color":{ "rgbaf":[ - 0.9490196078431372,0.9529411764705882,0.9568627450980393,0.9450980392156862 + 0.9647058823529412,0.9686274509803922,0.9725490196078431,0.9607843137254902 ] } } @@ -2391,7 +2408,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.9647058823529412,0.9686274509803922,0.9725490196078431,0.9607843137254902 + 0.9803921568627451,0.984313725490196,0.9882352941176471,0.9764705882352941 ] } } @@ -2405,7 +2422,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.9803921568627451,0.984313725490196,0.9882352941176471,0.9764705882352941 + 0.996078431372549,0,0.00392156862745098,0.9921568627450981 ] } } @@ -2419,7 +2436,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.996078431372549,0,0.00392156862745098,0.9921568627450981 + 0.011764705882352941,0.01568627450980392,0.0196078431372549,0.00784313725490196 ] } } @@ -2427,17 +2444,17 @@ } }, { - "id":"constant32", + "id":"constant33", "rectangle":{ "outlineColor":{ "rgbaf":[ - 0.011764705882352941,0.01568627450980392,0.0196078431372549,0.00784313725490196 + 0.027450980392156862,0.03137254901960784,0.03529411764705882,0.023529411764705882 ] } } }, { - "id":"constant33", + "id":"constant34", "wall":{ "positions":{ "cartographicRadians":[ @@ -2447,7 +2464,7 @@ } }, { - "id":"constant34", + "id":"constant35", "wall":{ "positions":{ "cartographicDegrees":[ @@ -2457,13 +2474,13 @@ } }, { - "id":"constant35", + "id":"constant36", "wall":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.027450980392156862,0.03137254901960784,0.03529411764705882,0.023529411764705882 + 0.043137254901960784,0.047058823529411764,0.050980392156862744,0.0392156862745098 ] } } @@ -2483,7 +2500,7 @@ }, "color":{ "rgba":[ - 111,112,113,110 + 115,116,117,114 ] }, "transparent":true @@ -2498,10 +2515,10 @@ "grid":{ "color":{ "rgba":[ - 115,116,117,114 + 119,120,121,118 ] }, - "cellAlpha":107, + "cellAlpha":108, "lineCount":{ "cartesian2":[ 79,80 @@ -2529,16 +2546,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 119,120,121,118 + 123,124,125,122 ] }, "oddColor":{ "rgba":[ - 123,124,125,122 + 127,128,129,126 ] }, - "offset":108, - "repeat":109 + "offset":109, + "repeat":110 } } } @@ -2550,7 +2567,7 @@ "image":{ "color":{ "rgbaf":[ - 0.043137254901960784,0.047058823529411764,0.050980392156862744,0.0392156862745098 + 0.058823529411764705,0.06274509803921569,0.06666666666666667,0.054901960784313725 ] } } @@ -2564,7 +2581,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.058823529411764705,0.06274509803921569,0.06666666666666667,0.054901960784313725 + 0.07450980392156863,0.0784313725490196,0.08235294117647059,0.07058823529411765 ] } } @@ -2578,7 +2595,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.07450980392156863,0.0784313725490196,0.08235294117647059,0.07058823529411765 + 0.09019607843137255,0.09411764705882353,0.09803921568627451,0.08627450980392157 ] } } @@ -2592,7 +2609,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.09019607843137255,0.09411764705882353,0.09803921568627451,0.08627450980392157 + 0.10588235294117647,0.10980392156862745,0.11372549019607843,0.10196078431372549 ] } } @@ -2600,33 +2617,33 @@ } }, { - "id":"constant36", + "id":"constant37", "wall":{ "outlineColor":{ "rgbaf":[ - 0.10588235294117647,0.10980392156862745,0.11372549019607843,0.10196078431372549 + 0.12156862745098039,0.12549019607843137,0.12941176470588237,0.11764705882352941 ] } } }, { - "id":"constant37", + "id":"constant38", "agi_conicSensor":{ "intersectionColor":{ "rgbaf":[ - 0.12156862745098039,0.12549019607843137,0.12941176470588237,0.11764705882352941 + 0.13725490196078433,0.1411764705882353,0.1450980392156863,0.13333333333333333 ] } } }, { - "id":"constant38", + "id":"constant39", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.13725490196078433,0.1411764705882353,0.1450980392156863,0.13333333333333333 + 0.15294117647058825,0.1568627450980392,0.1607843137254902,0.14901960784313725 ] } } @@ -2646,7 +2663,7 @@ }, "color":{ "rgba":[ - 127,128,129,126 + 131,132,133,130 ] }, "transparent":true @@ -2661,10 +2678,10 @@ "grid":{ "color":{ "rgba":[ - 131,132,133,130 + 135,136,137,134 ] }, - "cellAlpha":110, + "cellAlpha":111, "lineCount":{ "cartesian2":[ 87,88 @@ -2692,16 +2709,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 135,136,137,134 + 139,140,141,138 ] }, "oddColor":{ "rgba":[ - 139,140,141,138 + 143,144,145,142 ] }, - "offset":111, - "repeat":112 + "offset":112, + "repeat":113 } } } @@ -2713,7 +2730,7 @@ "image":{ "color":{ "rgbaf":[ - 0.15294117647058825,0.1568627450980392,0.1607843137254902,0.14901960784313725 + 0.16862745098039217,0.17254901960784313,0.17647058823529413,0.16470588235294117 ] } } @@ -2727,7 +2744,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.16862745098039217,0.17254901960784313,0.17647058823529413,0.16470588235294117 + 0.1843137254901961,0.18823529411764706,0.19215686274509805,0.1803921568627451 ] } } @@ -2741,7 +2758,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.1843137254901961,0.18823529411764706,0.19215686274509805,0.1803921568627451 + 0.2,0.20392156862745098,0.20784313725490197,0.19607843137254902 ] } } @@ -2755,7 +2772,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.2,0.20392156862745098,0.20784313725490197,0.19607843137254902 + 0.21568627450980393,0.2196078431372549,0.2235294117647059,0.21176470588235294 ] } } @@ -2763,13 +2780,13 @@ } }, { - "id":"constant39", + "id":"constant40", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.21568627450980393,0.2196078431372549,0.2235294117647059,0.21176470588235294 + 0.23137254901960785,0.23529411764705882,0.23921568627450981,0.22745098039215686 ] } } @@ -2789,7 +2806,7 @@ }, "color":{ "rgba":[ - 143,144,145,142 + 147,148,149,146 ] }, "transparent":true @@ -2804,10 +2821,10 @@ "grid":{ "color":{ "rgba":[ - 147,148,149,146 + 151,152,153,150 ] }, - "cellAlpha":113, + "cellAlpha":114, "lineCount":{ "cartesian2":[ 95,96 @@ -2835,16 +2852,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 151,152,153,150 + 155,156,157,154 ] }, "oddColor":{ "rgba":[ - 155,156,157,154 + 159,160,161,158 ] }, - "offset":114, - "repeat":115 + "offset":115, + "repeat":116 } } } @@ -2856,7 +2873,7 @@ "image":{ "color":{ "rgbaf":[ - 0.23137254901960785,0.23529411764705882,0.23921568627450981,0.22745098039215686 + 0.24705882352941178,0.25098039215686274,0.2549019607843137,0.24313725490196078 ] } } @@ -2870,7 +2887,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.24705882352941178,0.25098039215686274,0.2549019607843137,0.24313725490196078 + 0.2627450980392157,0.26666666666666666,0.27058823529411763,0.25882352941176473 ] } } @@ -2884,7 +2901,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.2627450980392157,0.26666666666666666,0.27058823529411763,0.25882352941176473 + 0.2784313725490196,0.2823529411764706,0.28627450980392155,0.27450980392156865 ] } } @@ -2898,7 +2915,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.2784313725490196,0.2823529411764706,0.28627450980392155,0.27450980392156865 + 0.29411764705882354,0.2980392156862745,0.30196078431372547,0.2901960784313726 ] } } @@ -2906,13 +2923,13 @@ } }, { - "id":"constant40", + "id":"constant41", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.29411764705882354,0.2980392156862745,0.30196078431372547,0.2901960784313726 + 0.30980392156862746,0.3137254901960784,0.3176470588235294,0.3058823529411765 ] } } @@ -2932,7 +2949,7 @@ }, "color":{ "rgba":[ - 159,160,161,158 + 163,164,165,162 ] }, "transparent":true @@ -2947,10 +2964,10 @@ "grid":{ "color":{ "rgba":[ - 163,164,165,162 + 167,168,169,166 ] }, - "cellAlpha":116, + "cellAlpha":117, "lineCount":{ "cartesian2":[ 103,104 @@ -2978,16 +2995,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 167,168,169,166 + 171,172,173,170 ] }, "oddColor":{ "rgba":[ - 171,172,173,170 + 175,176,177,174 ] }, - "offset":117, - "repeat":118 + "offset":118, + "repeat":119 } } } @@ -2999,7 +3016,7 @@ "image":{ "color":{ "rgbaf":[ - 0.30980392156862746,0.3137254901960784,0.3176470588235294,0.3058823529411765 + 0.3254901960784314,0.32941176470588235,0.3333333333333333,0.3215686274509804 ] } } @@ -3013,7 +3030,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.3254901960784314,0.32941176470588235,0.3333333333333333,0.3215686274509804 + 0.3411764705882353,0.34509803921568627,0.34901960784313724,0.33725490196078434 ] } } @@ -3027,7 +3044,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.3411764705882353,0.34509803921568627,0.34901960784313724,0.33725490196078434 + 0.3568627450980392,0.3607843137254902,0.36470588235294116,0.35294117647058826 ] } } @@ -3041,7 +3058,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.3568627450980392,0.3607843137254902,0.36470588235294116,0.35294117647058826 + 0.37254901960784315,0.3764705882352941,0.3803921568627451,0.3686274509803922 ] } } @@ -3049,13 +3066,13 @@ } }, { - "id":"constant41", + "id":"constant42", "agi_conicSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.37254901960784315,0.3764705882352941,0.3803921568627451,0.3686274509803922 + 0.38823529411764707,0.39215686274509803,0.396078431372549,0.3843137254901961 ] } } @@ -3075,7 +3092,7 @@ }, "color":{ "rgba":[ - 175,176,177,174 + 179,180,181,178 ] }, "transparent":true @@ -3090,10 +3107,10 @@ "grid":{ "color":{ "rgba":[ - 179,180,181,178 + 183,184,185,182 ] }, - "cellAlpha":119, + "cellAlpha":120, "lineCount":{ "cartesian2":[ 111,112 @@ -3121,16 +3138,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 183,184,185,182 + 187,188,189,186 ] }, "oddColor":{ "rgba":[ - 187,188,189,186 + 191,192,193,190 ] }, - "offset":120, - "repeat":121 + "offset":121, + "repeat":122 } } } @@ -3142,7 +3159,7 @@ "image":{ "color":{ "rgbaf":[ - 0.38823529411764707,0.39215686274509803,0.396078431372549,0.3843137254901961 + 0.403921568627451,0.40784313725490196,0.4117647058823529,0.4 ] } } @@ -3156,7 +3173,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.403921568627451,0.40784313725490196,0.4117647058823529,0.4 + 0.4196078431372549,0.4235294117647059,0.42745098039215684,0.41568627450980394 ] } } @@ -3170,7 +3187,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.4196078431372549,0.4235294117647059,0.42745098039215684,0.41568627450980394 + 0.43529411764705883,0.4392156862745098,0.44313725490196076,0.43137254901960786 ] } } @@ -3184,7 +3201,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.43529411764705883,0.4392156862745098,0.44313725490196076,0.43137254901960786 + 0.45098039215686275,0.4549019607843137,0.4588235294117647,0.4470588235294118 ] } } @@ -3192,13 +3209,13 @@ } }, { - "id":"constant42", + "id":"constant43", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.45098039215686275,0.4549019607843137,0.4588235294117647,0.4470588235294118 + 0.4666666666666667,0.47058823529411764,0.4745098039215686,0.4627450980392157 ] } } @@ -3218,7 +3235,7 @@ }, "color":{ "rgba":[ - 191,192,193,190 + 195,196,197,194 ] }, "transparent":true @@ -3233,10 +3250,10 @@ "grid":{ "color":{ "rgba":[ - 195,196,197,194 + 199,200,201,198 ] }, - "cellAlpha":122, + "cellAlpha":123, "lineCount":{ "cartesian2":[ 119,120 @@ -3264,16 +3281,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 199,200,201,198 + 203,204,205,202 ] }, "oddColor":{ "rgba":[ - 203,204,205,202 + 207,208,209,206 ] }, - "offset":123, - "repeat":124 + "offset":124, + "repeat":125 } } } @@ -3285,7 +3302,7 @@ "image":{ "color":{ "rgbaf":[ - 0.4666666666666667,0.47058823529411764,0.4745098039215686,0.4627450980392157 + 0.4823529411764706,0.48627450980392156,0.49019607843137253,0.47843137254901963 ] } } @@ -3299,7 +3316,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.4823529411764706,0.48627450980392156,0.49019607843137253,0.47843137254901963 + 0.4980392156862745,0.5019607843137255,0.5058823529411764,0.49411764705882355 ] } } @@ -3313,7 +3330,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.4980392156862745,0.5019607843137255,0.5058823529411764,0.49411764705882355 + 0.5137254901960784,0.5176470588235295,0.5215686274509804,0.5098039215686274 ] } } @@ -3327,7 +3344,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.5137254901960784,0.5176470588235295,0.5215686274509804,0.5098039215686274 + 0.5294117647058824,0.5333333333333333,0.5372549019607843,0.5254901960784314 ] } } @@ -3335,17 +3352,17 @@ } }, { - "id":"constant43", + "id":"constant44", "agi_conicSensor":{ "environmentIntersectionColor":{ "rgbaf":[ - 0.5294117647058824,0.5333333333333333,0.5372549019607843,0.5254901960784314 + 0.5450980392156862,0.5490196078431373,0.5529411764705883,0.5411764705882353 ] } } }, { - "id":"constant44", + "id":"constant45", "agi_customPatternSensor":{ "directions":{ "unitSpherical":[ @@ -3355,7 +3372,7 @@ } }, { - "id":"constant45", + "id":"constant46", "agi_customPatternSensor":{ "directions":{ "cartesian":[ @@ -3365,7 +3382,7 @@ } }, { - "id":"constant46", + "id":"constant47", "agi_customPatternSensor":{ "directions":{ "unitCartesian":[ @@ -3375,23 +3392,23 @@ } }, { - "id":"constant47", + "id":"constant48", "agi_customPatternSensor":{ "intersectionColor":{ "rgbaf":[ - 0.5450980392156862,0.5490196078431373,0.5529411764705883,0.5411764705882353 + 0.5607843137254902,0.5647058823529412,0.5686274509803921,0.5568627450980392 ] } } }, { - "id":"constant48", + "id":"constant49", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.5607843137254902,0.5647058823529412,0.5686274509803921,0.5568627450980392 + 0.5764705882352941,0.5803921568627451,0.5843137254901961,0.5725490196078431 ] } } @@ -3411,7 +3428,7 @@ }, "color":{ "rgba":[ - 207,208,209,206 + 211,212,213,210 ] }, "transparent":true @@ -3426,10 +3443,10 @@ "grid":{ "color":{ "rgba":[ - 211,212,213,210 + 215,216,217,214 ] }, - "cellAlpha":125, + "cellAlpha":126, "lineCount":{ "cartesian2":[ 127,128 @@ -3457,16 +3474,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 215,216,217,214 + 219,220,221,218 ] }, "oddColor":{ "rgba":[ - 219,220,221,218 + 223,224,225,222 ] }, - "offset":126, - "repeat":127 + "offset":127, + "repeat":128 } } } @@ -3478,7 +3495,7 @@ "image":{ "color":{ "rgbaf":[ - 0.5764705882352941,0.5803921568627451,0.5843137254901961,0.5725490196078431 + 0.592156862745098,0.596078431372549,0.6,0.5882352941176471 ] } } @@ -3492,7 +3509,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.592156862745098,0.596078431372549,0.6,0.5882352941176471 + 0.6078431372549019,0.611764705882353,0.615686274509804,0.6039215686274509 ] } } @@ -3506,7 +3523,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.6078431372549019,0.611764705882353,0.615686274509804,0.6039215686274509 + 0.6235294117647059,0.6274509803921569,0.6313725490196078,0.6196078431372549 ] } } @@ -3520,7 +3537,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.6235294117647059,0.6274509803921569,0.6313725490196078,0.6196078431372549 + 0.6392156862745098,0.6431372549019608,0.6470588235294118,0.6352941176470588 ] } } @@ -3528,13 +3545,13 @@ } }, { - "id":"constant49", + "id":"constant50", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.6392156862745098,0.6431372549019608,0.6470588235294118,0.6352941176470588 + 0.6549019607843137,0.6588235294117647,0.6627450980392157,0.6509803921568628 ] } } @@ -3554,7 +3571,7 @@ }, "color":{ "rgba":[ - 223,224,225,222 + 227,228,229,226 ] }, "transparent":true @@ -3569,10 +3586,10 @@ "grid":{ "color":{ "rgba":[ - 227,228,229,226 + 231,232,233,230 ] }, - "cellAlpha":128, + "cellAlpha":129, "lineCount":{ "cartesian2":[ 135,136 @@ -3600,16 +3617,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 231,232,233,230 + 235,236,237,234 ] }, "oddColor":{ "rgba":[ - 235,236,237,234 + 239,240,241,238 ] }, - "offset":129, - "repeat":130 + "offset":130, + "repeat":131 } } } @@ -3621,7 +3638,7 @@ "image":{ "color":{ "rgbaf":[ - 0.6549019607843137,0.6588235294117647,0.6627450980392157,0.6509803921568628 + 0.6705882352941176,0.6745098039215687,0.6784313725490196,0.6666666666666666 ] } } @@ -3635,7 +3652,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.6705882352941176,0.6745098039215687,0.6784313725490196,0.6666666666666666 + 0.6862745098039216,0.6901960784313725,0.6941176470588235,0.6823529411764706 ] } } @@ -3649,7 +3666,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.6862745098039216,0.6901960784313725,0.6941176470588235,0.6823529411764706 + 0.7019607843137254,0.7058823529411765,0.7098039215686275,0.6980392156862745 ] } } @@ -3663,7 +3680,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.7019607843137254,0.7058823529411765,0.7098039215686275,0.6980392156862745 + 0.7176470588235294,0.7215686274509804,0.7254901960784313,0.7137254901960784 ] } } @@ -3671,13 +3688,13 @@ } }, { - "id":"constant50", + "id":"constant51", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.7176470588235294,0.7215686274509804,0.7254901960784313,0.7137254901960784 + 0.7333333333333333,0.7372549019607844,0.7411764705882353,0.7294117647058823 ] } } @@ -3697,7 +3714,7 @@ }, "color":{ "rgba":[ - 239,240,241,238 + 243,244,245,242 ] }, "transparent":true @@ -3712,10 +3729,10 @@ "grid":{ "color":{ "rgba":[ - 243,244,245,242 + 247,248,249,246 ] }, - "cellAlpha":131, + "cellAlpha":132, "lineCount":{ "cartesian2":[ 143,144 @@ -3743,16 +3760,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 247,248,249,246 + 251,252,253,250 ] }, "oddColor":{ "rgba":[ - 251,252,253,250 + 0,1,2,254 ] }, - "offset":132, - "repeat":133 + "offset":133, + "repeat":134 } } } @@ -3764,7 +3781,7 @@ "image":{ "color":{ "rgbaf":[ - 0.7333333333333333,0.7372549019607844,0.7411764705882353,0.7294117647058823 + 0.7490196078431373,0.7529411764705882,0.7568627450980392,0.7450980392156863 ] } } @@ -3778,7 +3795,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.7490196078431373,0.7529411764705882,0.7568627450980392,0.7450980392156863 + 0.7647058823529411,0.7686274509803922,0.7725490196078432,0.7607843137254902 ] } } @@ -3792,7 +3809,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.7647058823529411,0.7686274509803922,0.7725490196078432,0.7607843137254902 + 0.7803921568627451,0.7843137254901961,0.788235294117647,0.7764705882352941 ] } } @@ -3806,7 +3823,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.7803921568627451,0.7843137254901961,0.788235294117647,0.7764705882352941 + 0.796078431372549,0.8,0.803921568627451,0.792156862745098 ] } } @@ -3814,13 +3831,13 @@ } }, { - "id":"constant51", + "id":"constant52", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.796078431372549,0.8,0.803921568627451,0.792156862745098 + 0.8117647058823529,0.8156862745098039,0.8196078431372549,0.807843137254902 ] } } @@ -3840,7 +3857,7 @@ }, "color":{ "rgba":[ - 0,1,2,254 + 4,5,6,3 ] }, "transparent":true @@ -3855,10 +3872,10 @@ "grid":{ "color":{ "rgba":[ - 4,5,6,3 + 8,9,10,7 ] }, - "cellAlpha":134, + "cellAlpha":135, "lineCount":{ "cartesian2":[ 151,152 @@ -3886,16 +3903,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 8,9,10,7 + 12,13,14,11 ] }, "oddColor":{ "rgba":[ - 12,13,14,11 + 16,17,18,15 ] }, - "offset":135, - "repeat":136 + "offset":136, + "repeat":137 } } } @@ -3907,7 +3924,7 @@ "image":{ "color":{ "rgbaf":[ - 0.8117647058823529,0.8156862745098039,0.8196078431372549,0.807843137254902 + 0.8274509803921568,0.8313725490196079,0.8352941176470589,0.8235294117647058 ] } } @@ -3921,7 +3938,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.8274509803921568,0.8313725490196079,0.8352941176470589,0.8235294117647058 + 0.8431372549019608,0.8470588235294118,0.8509803921568627,0.8392156862745098 ] } } @@ -3935,7 +3952,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.8431372549019608,0.8470588235294118,0.8509803921568627,0.8392156862745098 + 0.8588235294117647,0.8627450980392157,0.8666666666666667,0.8549019607843137 ] } } @@ -3949,7 +3966,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.8588235294117647,0.8627450980392157,0.8666666666666667,0.8549019607843137 + 0.8745098039215686,0.8784313725490196,0.8823529411764706,0.8705882352941177 ] } } @@ -3957,13 +3974,13 @@ } }, { - "id":"constant52", + "id":"constant53", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.8745098039215686,0.8784313725490196,0.8823529411764706,0.8705882352941177 + 0.8901960784313725,0.8941176470588236,0.8980392156862745,0.8862745098039215 ] } } @@ -3983,7 +4000,7 @@ }, "color":{ "rgba":[ - 16,17,18,15 + 20,21,22,19 ] }, "transparent":true @@ -3998,10 +4015,10 @@ "grid":{ "color":{ "rgba":[ - 20,21,22,19 + 24,25,26,23 ] }, - "cellAlpha":137, + "cellAlpha":138, "lineCount":{ "cartesian2":[ 159,160 @@ -4029,16 +4046,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 24,25,26,23 + 28,29,30,27 ] }, "oddColor":{ "rgba":[ - 28,29,30,27 + 32,33,34,31 ] }, - "offset":138, - "repeat":139 + "offset":139, + "repeat":140 } } } @@ -4050,7 +4067,7 @@ "image":{ "color":{ "rgbaf":[ - 0.8901960784313725,0.8941176470588236,0.8980392156862745,0.8862745098039215 + 0.9058823529411765,0.9098039215686274,0.9137254901960784,0.9019607843137255 ] } } @@ -4064,7 +4081,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.9058823529411765,0.9098039215686274,0.9137254901960784,0.9019607843137255 + 0.9215686274509803,0.9254901960784314,0.9294117647058824,0.9176470588235294 ] } } @@ -4078,7 +4095,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.9215686274509803,0.9254901960784314,0.9294117647058824,0.9176470588235294 + 0.9372549019607843,0.9411764705882353,0.9450980392156862,0.9333333333333333 ] } } @@ -4092,7 +4109,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.9372549019607843,0.9411764705882353,0.9450980392156862,0.9333333333333333 + 0.9529411764705882,0.9568627450980393,0.9607843137254902,0.9490196078431372 ] } } @@ -4100,33 +4117,33 @@ } }, { - "id":"constant53", + "id":"constant54", "agi_customPatternSensor":{ "environmentIntersectionColor":{ "rgbaf":[ - 0.9529411764705882,0.9568627450980393,0.9607843137254902,0.9490196078431372 + 0.9686274509803922,0.9725490196078431,0.9764705882352941,0.9647058823529412 ] } } }, { - "id":"constant54", + "id":"constant55", "agi_rectangularSensor":{ "intersectionColor":{ "rgbaf":[ - 0.9686274509803922,0.9725490196078431,0.9764705882352941,0.9647058823529412 + 0.984313725490196,0.9882352941176471,0.9921568627450981,0.9803921568627451 ] } } }, { - "id":"constant55", + "id":"constant56", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.984313725490196,0.9882352941176471,0.9921568627450981,0.9803921568627451 + 0,0.00392156862745098,0.00784313725490196,0.996078431372549 ] } } @@ -4146,7 +4163,7 @@ }, "color":{ "rgba":[ - 32,33,34,31 + 36,37,38,35 ] }, "transparent":true @@ -4161,10 +4178,10 @@ "grid":{ "color":{ "rgba":[ - 36,37,38,35 + 40,41,42,39 ] }, - "cellAlpha":140, + "cellAlpha":141, "lineCount":{ "cartesian2":[ 167,168 @@ -4192,16 +4209,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 40,41,42,39 + 44,45,46,43 ] }, "oddColor":{ "rgba":[ - 44,45,46,43 + 48,49,50,47 ] }, - "offset":141, - "repeat":142 + "offset":142, + "repeat":143 } } } @@ -4213,7 +4230,7 @@ "image":{ "color":{ "rgbaf":[ - 0,0.00392156862745098,0.00784313725490196,0.996078431372549 + 0.01568627450980392,0.0196078431372549,0.023529411764705882,0.011764705882352941 ] } } @@ -4227,7 +4244,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.01568627450980392,0.0196078431372549,0.023529411764705882,0.011764705882352941 + 0.03137254901960784,0.03529411764705882,0.0392156862745098,0.027450980392156862 ] } } @@ -4241,7 +4258,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.03137254901960784,0.03529411764705882,0.0392156862745098,0.027450980392156862 + 0.047058823529411764,0.050980392156862744,0.054901960784313725,0.043137254901960784 ] } } @@ -4255,7 +4272,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.047058823529411764,0.050980392156862744,0.054901960784313725,0.043137254901960784 + 0.06274509803921569,0.06666666666666667,0.07058823529411765,0.058823529411764705 ] } } @@ -4263,13 +4280,13 @@ } }, { - "id":"constant56", + "id":"constant57", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.06274509803921569,0.06666666666666667,0.07058823529411765,0.058823529411764705 + 0.0784313725490196,0.08235294117647059,0.08627450980392157,0.07450980392156863 ] } } @@ -4289,7 +4306,7 @@ }, "color":{ "rgba":[ - 48,49,50,47 + 52,53,54,51 ] }, "transparent":true @@ -4304,10 +4321,10 @@ "grid":{ "color":{ "rgba":[ - 52,53,54,51 + 56,57,58,55 ] }, - "cellAlpha":143, + "cellAlpha":144, "lineCount":{ "cartesian2":[ 175,176 @@ -4335,16 +4352,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 56,57,58,55 + 60,61,62,59 ] }, "oddColor":{ "rgba":[ - 60,61,62,59 + 64,65,66,63 ] }, - "offset":144, - "repeat":145 + "offset":145, + "repeat":146 } } } @@ -4356,7 +4373,7 @@ "image":{ "color":{ "rgbaf":[ - 0.0784313725490196,0.08235294117647059,0.08627450980392157,0.07450980392156863 + 0.09411764705882353,0.09803921568627451,0.10196078431372549,0.09019607843137255 ] } } @@ -4370,7 +4387,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.09411764705882353,0.09803921568627451,0.10196078431372549,0.09019607843137255 + 0.10980392156862745,0.11372549019607843,0.11764705882352941,0.10588235294117647 ] } } @@ -4384,7 +4401,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.10980392156862745,0.11372549019607843,0.11764705882352941,0.10588235294117647 + 0.12549019607843137,0.12941176470588237,0.13333333333333333,0.12156862745098039 ] } } @@ -4398,7 +4415,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.12549019607843137,0.12941176470588237,0.13333333333333333,0.12156862745098039 + 0.1411764705882353,0.1450980392156863,0.14901960784313725,0.13725490196078433 ] } } @@ -4406,13 +4423,13 @@ } }, { - "id":"constant57", + "id":"constant58", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.1411764705882353,0.1450980392156863,0.14901960784313725,0.13725490196078433 + 0.1568627450980392,0.1607843137254902,0.16470588235294117,0.15294117647058825 ] } } @@ -4432,7 +4449,7 @@ }, "color":{ "rgba":[ - 64,65,66,63 + 68,69,70,67 ] }, "transparent":true @@ -4447,10 +4464,10 @@ "grid":{ "color":{ "rgba":[ - 68,69,70,67 + 72,73,74,71 ] }, - "cellAlpha":146, + "cellAlpha":147, "lineCount":{ "cartesian2":[ 183,184 @@ -4478,16 +4495,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 72,73,74,71 + 76,77,78,75 ] }, "oddColor":{ "rgba":[ - 76,77,78,75 + 80,81,82,79 ] }, - "offset":147, - "repeat":148 + "offset":148, + "repeat":149 } } } @@ -4499,7 +4516,7 @@ "image":{ "color":{ "rgbaf":[ - 0.1568627450980392,0.1607843137254902,0.16470588235294117,0.15294117647058825 + 0.17254901960784313,0.17647058823529413,0.1803921568627451,0.16862745098039217 ] } } @@ -4513,7 +4530,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.17254901960784313,0.17647058823529413,0.1803921568627451,0.16862745098039217 + 0.18823529411764706,0.19215686274509805,0.19607843137254902,0.1843137254901961 ] } } @@ -4527,7 +4544,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.18823529411764706,0.19215686274509805,0.19607843137254902,0.1843137254901961 + 0.20392156862745098,0.20784313725490197,0.21176470588235294,0.2 ] } } @@ -4541,7 +4558,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.20392156862745098,0.20784313725490197,0.21176470588235294,0.2 + 0.2196078431372549,0.2235294117647059,0.22745098039215686,0.21568627450980393 ] } } @@ -4549,13 +4566,13 @@ } }, { - "id":"constant58", + "id":"constant59", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.2196078431372549,0.2235294117647059,0.22745098039215686,0.21568627450980393 + 0.23529411764705882,0.23921568627450981,0.24313725490196078,0.23137254901960785 ] } } @@ -4575,7 +4592,7 @@ }, "color":{ "rgba":[ - 80,81,82,79 + 84,85,86,83 ] }, "transparent":true @@ -4590,10 +4607,10 @@ "grid":{ "color":{ "rgba":[ - 84,85,86,83 + 88,89,90,87 ] }, - "cellAlpha":149, + "cellAlpha":150, "lineCount":{ "cartesian2":[ 191,192 @@ -4621,16 +4638,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 88,89,90,87 + 92,93,94,91 ] }, "oddColor":{ "rgba":[ - 92,93,94,91 + 96,97,98,95 ] }, - "offset":150, - "repeat":151 + "offset":151, + "repeat":152 } } } @@ -4642,7 +4659,7 @@ "image":{ "color":{ "rgbaf":[ - 0.23529411764705882,0.23921568627450981,0.24313725490196078,0.23137254901960785 + 0.25098039215686274,0.2549019607843137,0.25882352941176473,0.24705882352941178 ] } } @@ -4656,7 +4673,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.25098039215686274,0.2549019607843137,0.25882352941176473,0.24705882352941178 + 0.26666666666666666,0.27058823529411763,0.27450980392156865,0.2627450980392157 ] } } @@ -4670,7 +4687,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.26666666666666666,0.27058823529411763,0.27450980392156865,0.2627450980392157 + 0.2823529411764706,0.28627450980392155,0.2901960784313726,0.2784313725490196 ] } } @@ -4684,7 +4701,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.2823529411764706,0.28627450980392155,0.2901960784313726,0.2784313725490196 + 0.2980392156862745,0.30196078431372547,0.3058823529411765,0.29411764705882354 ] } } @@ -4692,13 +4709,13 @@ } }, { - "id":"constant59", + "id":"constant60", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.2980392156862745,0.30196078431372547,0.3058823529411765,0.29411764705882354 + 0.3137254901960784,0.3176470588235294,0.3215686274509804,0.30980392156862746 ] } } @@ -4718,7 +4735,7 @@ }, "color":{ "rgba":[ - 96,97,98,95 + 100,101,102,99 ] }, "transparent":true @@ -4733,10 +4750,10 @@ "grid":{ "color":{ "rgba":[ - 100,101,102,99 + 104,105,106,103 ] }, - "cellAlpha":152, + "cellAlpha":153, "lineCount":{ "cartesian2":[ 199,200 @@ -4764,16 +4781,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 104,105,106,103 + 108,109,110,107 ] }, "oddColor":{ "rgba":[ - 108,109,110,107 + 112,113,114,111 ] }, - "offset":153, - "repeat":154 + "offset":154, + "repeat":155 } } } @@ -4785,7 +4802,7 @@ "image":{ "color":{ "rgbaf":[ - 0.3137254901960784,0.3176470588235294,0.3215686274509804,0.30980392156862746 + 0.32941176470588235,0.3333333333333333,0.33725490196078434,0.3254901960784314 ] } } @@ -4799,7 +4816,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.32941176470588235,0.3333333333333333,0.33725490196078434,0.3254901960784314 + 0.34509803921568627,0.34901960784313724,0.35294117647058826,0.3411764705882353 ] } } @@ -4813,7 +4830,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.34509803921568627,0.34901960784313724,0.35294117647058826,0.3411764705882353 + 0.3607843137254902,0.36470588235294116,0.3686274509803922,0.3568627450980392 ] } } @@ -4827,7 +4844,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.3607843137254902,0.36470588235294116,0.3686274509803922,0.3568627450980392 + 0.3764705882352941,0.3803921568627451,0.3843137254901961,0.37254901960784315 ] } } @@ -4835,17 +4852,17 @@ } }, { - "id":"constant60", + "id":"constant61", "agi_rectangularSensor":{ "environmentIntersectionColor":{ "rgbaf":[ - 0.3764705882352941,0.3803921568627451,0.3843137254901961,0.37254901960784315 + 0.39215686274509803,0.396078431372549,0.4,0.38823529411764707 ] } } }, { - "id":"constant61", + "id":"constant62", "agi_fan":{ "directions":{ "unitSpherical":[ @@ -4855,7 +4872,7 @@ } }, { - "id":"constant62", + "id":"constant63", "agi_fan":{ "directions":{ "cartesian":[ @@ -4865,7 +4882,7 @@ } }, { - "id":"constant63", + "id":"constant64", "agi_fan":{ "directions":{ "unitCartesian":[ @@ -4875,13 +4892,13 @@ } }, { - "id":"constant64", + "id":"constant65", "agi_fan":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.39215686274509803,0.396078431372549,0.4,0.38823529411764707 + 0.40784313725490196,0.4117647058823529,0.41568627450980394,0.403921568627451 ] } } @@ -4901,7 +4918,7 @@ }, "color":{ "rgba":[ - 112,113,114,111 + 116,117,118,115 ] }, "transparent":true @@ -4916,10 +4933,10 @@ "grid":{ "color":{ "rgba":[ - 116,117,118,115 + 120,121,122,119 ] }, - "cellAlpha":155, + "cellAlpha":156, "lineCount":{ "cartesian2":[ 207,208 @@ -4947,16 +4964,16 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 120,121,122,119 + 124,125,126,123 ] }, "oddColor":{ "rgba":[ - 124,125,126,123 + 128,129,130,127 ] }, - "offset":156, - "repeat":157 + "offset":157, + "repeat":158 } } } @@ -4968,7 +4985,7 @@ "image":{ "color":{ "rgbaf":[ - 0.40784313725490196,0.4117647058823529,0.41568627450980394,0.403921568627451 + 0.4235294117647059,0.42745098039215684,0.43137254901960786,0.4196078431372549 ] } } @@ -4982,7 +4999,7 @@ "grid":{ "color":{ "rgbaf":[ - 0.4235294117647059,0.42745098039215684,0.43137254901960786,0.4196078431372549 + 0.4392156862745098,0.44313725490196076,0.4470588235294118,0.43529411764705883 ] } } @@ -4996,7 +5013,7 @@ "stripe":{ "evenColor":{ "rgbaf":[ - 0.4392156862745098,0.44313725490196076,0.4470588235294118,0.43529411764705883 + 0.4549019607843137,0.4588235294117647,0.4627450980392157,0.45098039215686275 ] } } @@ -5010,7 +5027,7 @@ "stripe":{ "oddColor":{ "rgbaf":[ - 0.4549019607843137,0.4588235294117647,0.4627450980392157,0.45098039215686275 + 0.47058823529411764,0.4745098039215686,0.47843137254901963,0.4666666666666667 ] } } @@ -5018,27 +5035,27 @@ } }, { - "id":"constant65", + "id":"constant66", "agi_fan":{ "outlineColor":{ "rgbaf":[ - 0.47058823529411764,0.4745098039215686,0.47843137254901963,0.4666666666666667 + 0.48627450980392156,0.49019607843137253,0.49411764705882355,0.4823529411764706 ] } } }, { - "id":"constant66", + "id":"constant67", "agi_vector":{ "color":{ "rgbaf":[ - 0.48627450980392156,0.49019607843137253,0.49411764705882355,0.4823529411764706 + 0.5019607843137255,0.5058823529411764,0.5098039215686274,0.4980392156862745 ] } } }, { - "id":"constant67", + "id":"constant68", "agi_vector":{ "direction":{ "unitSpherical":[ @@ -5048,7 +5065,7 @@ } }, { - "id":"constant68", + "id":"constant69", "agi_vector":{ "direction":{ "cartesian":[ @@ -5058,7 +5075,7 @@ } }, { - "id":"constant69", + "id":"constant70", "agi_vector":{ "direction":{ "unitCartesian":[ @@ -5078,7 +5095,7 @@ { "id":"ConstantDouble1", "billboard":{ - "scale":158 + "scale":159 } }, { @@ -5092,7 +5109,7 @@ { "id":"ConstantDouble2", "billboard":{ - "scale":159 + "scale":160 } }, { @@ -5431,6 +5448,15 @@ "heightReference":{ "reference":"Constant#model.heightReference" }, + "color":{ + "reference":"Constant#model.color" + }, + "colorBlendMode":{ + "reference":"Constant#model.colorBlendMode" + }, + "colorBlendAmount":{ + "reference":"Constant#model.colorBlendAmount" + }, "nodeTransformations":{ "referenceProp":{ "translation":{ @@ -7905,8 +7931,8 @@ "scale":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,160, - 3600,161 + 0,161, + 3600,162 ] }, "pixelOffset":{ @@ -7926,15 +7952,15 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,128,129,130,127, - 3600,132,133,134,131 + 0,132,133,134,131, + 3600,136,137,138,135 ] }, "rotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,162, - 3600,163 + 0,163, + 3600,164 ] }, "alignedAxis":{ @@ -7947,15 +7973,15 @@ "width":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,164, - 3600,165 + 0,165, + 3600,166 ] }, "height":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,166, - 3600,167 + 0,167, + 3600,168 ] }, "scaleByDistance":{ @@ -8000,8 +8026,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,136,137,138,135, - 3600,140,141,142,139 + 0,140,141,142,139, + 3600,144,145,146,143 ] } } @@ -8009,15 +8035,15 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,144,145,146,143, - 3600,148,149,150,147 + 0,148,149,150,147, + 3600,152,153,154,151 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,168, - 3600,169 + 0,169, + 3600,170 ] } }, @@ -8025,29 +8051,29 @@ "width":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,170, - 3600,171 + 0,171, + 3600,172 ] }, "height":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,172, - 3600,173 + 0,173, + 3600,174 ] }, "extrudedHeight":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,174, - 3600,175 + 0,175, + 3600,176 ] }, "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,176, - 3600,177 + 0,177, + 3600,178 ] }, "material":{ @@ -8055,8 +8081,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,152,153,154,151, - 3600,156,157,158,155 + 0,156,157,158,155, + 3600,160,161,162,159 ] } } @@ -8064,15 +8090,15 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,160,161,162,159, - 3600,164,165,166,163 + 0,164,165,166,163, + 3600,168,169,170,167 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,178, - 3600,179 + 0,179, + 3600,180 ] } }, @@ -8080,22 +8106,22 @@ "length":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,180, - 3600,181 + 0,181, + 3600,182 ] }, "topRadius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,182, - 3600,183 + 0,183, + 3600,184 ] }, "bottomRadius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,184, - 3600,185 + 0,185, + 3600,186 ] }, "material":{ @@ -8103,8 +8129,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,168,169,170,167, - 3600,172,173,174,171 + 0,172,173,174,171, + 3600,176,177,178,175 ] } } @@ -8112,29 +8138,29 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,176,177,178,175, - 3600,180,181,182,179 + 0,180,181,182,179, + 3600,184,185,186,183 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,186, - 3600,187 + 0,187, + 3600,188 ] }, "numberOfVerticalLines":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,188, - 3600,189 + 0,189, + 3600,190 ] }, "slices":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,190, - 3600,191 + 0,191, + 3600,192 ] } }, @@ -8142,50 +8168,50 @@ "semiMajorAxis":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,192, - 3600,193 + 0,193, + 3600,194 ] }, "semiMinorAxis":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,194, - 3600,195 + 0,195, + 3600,196 ] }, "height":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,196, - 3600,197 + 0,197, + 3600,198 ] }, "extrudedHeight":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,198, - 3600,199 + 0,199, + 3600,200 ] }, "rotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,200, - 3600,201 + 0,201, + 3600,202 ] }, "stRotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,202, - 3600,203 + 0,203, + 3600,204 ] }, "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,204, - 3600,205 + 0,205, + 3600,206 ] }, "material":{ @@ -8193,8 +8219,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,184,185,186,183, - 3600,188,189,190,187 + 0,188,189,190,187, + 3600,192,193,194,191 ] } } @@ -8202,22 +8228,22 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,192,193,194,191, - 3600,196,197,198,195 + 0,196,197,198,195, + 3600,200,201,202,199 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,206, - 3600,207 + 0,207, + 3600,208 ] }, "numberOfVerticalLines":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,208, - 3600,209 + 0,209, + 3600,210 ] } }, @@ -8234,8 +8260,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,200,201,202,199, - 3600,204,205,206,203 + 0,204,205,206,203, + 3600,208,209,210,207 ] } } @@ -8243,36 +8269,36 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,208,209,210,207, - 3600,212,213,214,211 + 0,212,213,214,211, + 3600,216,217,218,215 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,210, - 3600,211 + 0,211, + 3600,212 ] }, "stackPartitions":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,212, - 3600,213 + 0,213, + 3600,214 ] }, "slicePartitions":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,214, - 3600,215 + 0,215, + 3600,216 ] }, "subdivisions":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,216, - 3600,217 + 0,217, + 3600,218 ] } }, @@ -8280,8 +8306,8 @@ "scale":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,218, - 3600,219 + 0,219, + 3600,220 ] }, "pixelOffset":{ @@ -8301,22 +8327,22 @@ "fillColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,216,217,218,215, - 3600,220,221,222,219 + 0,220,221,222,219, + 3600,224,225,226,223 ] }, "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,224,225,226,223, - 3600,228,229,230,227 + 0,228,229,230,227, + 3600,232,233,234,231 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,220, - 3600,221 + 0,221, + 3600,222 ] }, "translucencyByDistance":{ @@ -8338,22 +8364,36 @@ "scale":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,222, - 3600,223 + 0,223, + 3600,224 ] }, "minimumPixelSize":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,224, - 3600,225 + 0,225, + 3600,226 ] }, "maximumScale":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,226, - 3600,227 + 0,227, + 3600,228 + ] + }, + "color":{ + "epoch":"2016-06-17T12:00:00Z", + "rgba":[ + 0,236,237,238,235, + 3600,240,241,242,239 + ] + }, + "colorBlendAmount":{ + "epoch":"2016-06-17T12:00:00Z", + "number":[ + 0,229, + 3600,230 ] } }, @@ -8361,29 +8401,29 @@ "width":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,228, - 3600,229 + 0,231, + 3600,232 ] }, "resolution":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,230, - 3600,231 + 0,233, + 3600,234 ] }, "leadTime":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,232, - 3600,233 + 0,235, + 3600,236 ] }, "trailTime":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,234, - 3600,235 + 0,237, + 3600,238 ] }, "material":{ @@ -8391,8 +8431,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,232,233,234,231, - 3600,236,237,238,235 + 0,244,245,246,243, + 3600,248,249,250,247 ] } } @@ -8402,29 +8442,29 @@ "pixelSize":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,236, - 3600,237 + 0,239, + 3600,240 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,240,241,242,239, - 3600,244,245,246,243 + 0,252,253,254,251, + 3600,1,2,3,0 ] }, "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,248,249,250,247, - 3600,252,253,254,251 + 0,5,6,7,4, + 3600,9,10,11,8 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,238, - 3600,239 + 0,241, + 3600,242 ] }, "scaleByDistance":{ @@ -8446,29 +8486,29 @@ "height":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,240, - 3600,241 + 0,243, + 3600,244 ] }, "extrudedHeight":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,242, - 3600,243 + 0,245, + 3600,246 ] }, "stRotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,244, - 3600,245 + 0,247, + 3600,248 ] }, "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,246, - 3600,247 + 0,249, + 3600,250 ] }, "material":{ @@ -8476,8 +8516,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,1,2,3,0, - 3600,5,6,7,4 + 0,13,14,15,12, + 3600,17,18,19,16 ] } } @@ -8485,15 +8525,15 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,9,10,11,8, - 3600,13,14,15,12 + 0,21,22,23,20, + 3600,25,26,27,24 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,248, - 3600,249 + 0,251, + 3600,252 ] } }, @@ -8501,15 +8541,15 @@ "width":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,250, - 3600,251 + 0,253, + 3600,254 ] }, "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,252, - 3600,253 + 0,255, + 3600,256 ] }, "material":{ @@ -8517,8 +8557,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,17,18,19,16, - 3600,21,22,23,20 + 0,29,30,31,28, + 3600,33,34,35,32 ] } } @@ -8535,36 +8575,36 @@ "height":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,254, - 3600,255 + 0,257, + 3600,258 ] }, "extrudedHeight":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,256, - 3600,257 + 0,259, + 3600,260 ] }, "rotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,258, - 3600,259 + 0,261, + 3600,262 ] }, "stRotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,260, - 3600,261 + 0,263, + 3600,264 ] }, "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,262, - 3600,263 + 0,265, + 3600,266 ] }, "material":{ @@ -8572,8 +8612,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,25,26,27,24, - 3600,29,30,31,28 + 0,37,38,39,36, + 3600,41,42,43,40 ] } } @@ -8581,15 +8621,15 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,33,34,35,32, - 3600,37,38,39,36 + 0,45,46,47,44, + 3600,49,50,51,48 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,264, - 3600,265 + 0,267, + 3600,268 ] } }, @@ -8597,8 +8637,8 @@ "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,266, - 3600,267 + 0,269, + 3600,270 ] }, "material":{ @@ -8606,8 +8646,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,41,42,43,40, - 3600,45,46,47,44 + 0,53,54,55,52, + 3600,57,58,59,56 ] } } @@ -8615,15 +8655,15 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,49,50,51,48, - 3600,53,54,55,52 + 0,61,62,63,60, + 3600,65,66,67,64 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,268, - 3600,269 + 0,271, + 3600,272 ] } }, @@ -8631,50 +8671,50 @@ "innerHalfAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,270, - 3600,271 + 0,273, + 3600,274 ] }, "outerHalfAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,272, - 3600,273 + 0,275, + 3600,276 ] }, "minimumClockAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,274, - 3600,275 + 0,277, + 3600,278 ] }, "maximumClockAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,276, - 3600,277 + 0,279, + 3600,280 ] }, "radius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,278, - 3600,279 + 0,281, + 3600,282 ] }, "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,57,58,59,56, - 3600,61,62,63,60 + 0,69,70,71,68, + 3600,73,74,75,72 ] }, "intersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,280, - 3600,281 + 0,283, + 3600,284 ] }, "lateralSurfaceMaterial":{ @@ -8682,8 +8722,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,65,66,67,64, - 3600,69,70,71,68 + 0,77,78,79,76, + 3600,81,82,83,80 ] } } @@ -8693,8 +8733,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,73,74,75,72, - 3600,77,78,79,76 + 0,85,86,87,84, + 3600,89,90,91,88 ] } } @@ -8704,8 +8744,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,81,82,83,80, - 3600,85,86,87,84 + 0,93,94,95,92, + 3600,97,98,99,96 ] } } @@ -8715,8 +8755,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,89,90,91,88, - 3600,93,94,95,92 + 0,101,102,103,100, + 3600,105,106,107,104 ] } } @@ -8726,8 +8766,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,97,98,99,96, - 3600,101,102,103,100 + 0,109,110,111,108, + 3600,113,114,115,112 ] } } @@ -8735,15 +8775,15 @@ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,105,106,107,104, - 3600,109,110,111,108 + 0,117,118,119,116, + 3600,121,122,123,120 ] }, "environmentIntersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,282, - 3600,283 + 0,285, + 3600,286 ] } }, @@ -8751,22 +8791,22 @@ "radius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,284, - 3600,285 + 0,287, + 3600,288 ] }, "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,113,114,115,112, - 3600,117,118,119,116 + 0,125,126,127,124, + 3600,129,130,131,128 ] }, "intersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,286, - 3600,287 + 0,289, + 3600,290 ] }, "lateralSurfaceMaterial":{ @@ -8774,8 +8814,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,121,122,123,120, - 3600,125,126,127,124 + 0,133,134,135,132, + 3600,137,138,139,136 ] } } @@ -8785,8 +8825,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,129,130,131,128, - 3600,133,134,135,132 + 0,141,142,143,140, + 3600,145,146,147,144 ] } } @@ -8796,8 +8836,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,137,138,139,136, - 3600,141,142,143,140 + 0,149,150,151,148, + 3600,153,154,155,152 ] } } @@ -8807,8 +8847,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,145,146,147,144, - 3600,149,150,151,148 + 0,157,158,159,156, + 3600,161,162,163,160 ] } } @@ -8818,8 +8858,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,153,154,155,152, - 3600,157,158,159,156 + 0,165,166,167,164, + 3600,169,170,171,168 ] } } @@ -8827,15 +8867,15 @@ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,161,162,163,160, - 3600,165,166,167,164 + 0,173,174,175,172, + 3600,177,178,179,176 ] }, "environmentIntersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,288, - 3600,289 + 0,291, + 3600,292 ] } }, @@ -8843,36 +8883,36 @@ "xHalfAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,290, - 3600,291 + 0,293, + 3600,294 ] }, "yHalfAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,292, - 3600,293 + 0,295, + 3600,296 ] }, "radius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,294, - 3600,295 + 0,297, + 3600,298 ] }, "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,169,170,171,168, - 3600,173,174,175,172 + 0,181,182,183,180, + 3600,185,186,187,184 ] }, "intersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,296, - 3600,297 + 0,299, + 3600,300 ] }, "lateralSurfaceMaterial":{ @@ -8880,8 +8920,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,177,178,179,176, - 3600,181,182,183,180 + 0,189,190,191,188, + 3600,193,194,195,192 ] } } @@ -8891,8 +8931,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,185,186,187,184, - 3600,189,190,191,188 + 0,197,198,199,196, + 3600,201,202,203,200 ] } } @@ -8902,8 +8942,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,193,194,195,192, - 3600,197,198,199,196 + 0,205,206,207,204, + 3600,209,210,211,208 ] } } @@ -8913,8 +8953,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,201,202,203,200, - 3600,205,206,207,204 + 0,213,214,215,212, + 3600,217,218,219,216 ] } } @@ -8924,8 +8964,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,209,210,211,208, - 3600,213,214,215,212 + 0,221,222,223,220, + 3600,225,226,227,224 ] } } @@ -8933,15 +8973,15 @@ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,217,218,219,216, - 3600,221,222,223,220 + 0,229,230,231,228, + 3600,233,234,235,232 ] }, "environmentIntersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,298, - 3600,299 + 0,301, + 3600,302 ] } }, @@ -8949,8 +8989,8 @@ "radius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,300, - 3600,301 + 0,303, + 3600,304 ] }, "material":{ @@ -8958,8 +8998,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,225,226,227,224, - 3600,229,230,231,228 + 0,237,238,239,236, + 3600,241,242,243,240 ] } } @@ -8967,22 +9007,22 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,233,234,235,232, - 3600,237,238,239,236 + 0,245,246,247,244, + 3600,249,250,251,248 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,302, - 3600,303 + 0,305, + 3600,306 ] }, "numberOfRings":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,304, - 3600,305 + 0,307, + 3600,308 ] } }, @@ -8990,8 +9030,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,241,242,243,240, - 3600,245,246,247,244 + 0,253,254,0,252, + 3600,2,3,4,1 ] }, "direction":{ @@ -9004,15 +9044,15 @@ "length":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,306, - 3600,307 + 0,309, + 3600,310 ] }, "minimumLengthInPixels":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,308, - 3600,309 + 0,311, + 3600,312 ] } } @@ -9053,8 +9093,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5019607843137255,0.5058823529411764,0.5098039215686274,0.4980392156862745, - 3600,0.5176470588235295,0.5215686274509804,0.5254901960784314,0.5137254901960784 + 0,0.5176470588235295,0.5215686274509804,0.5254901960784314,0.5137254901960784, + 3600,0.5333333333333333,0.5372549019607843,0.5411764705882353,0.5294117647058824 ] } } @@ -9079,8 +9119,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5333333333333333,0.5372549019607843,0.5411764705882353,0.5294117647058824, - 3600,0.5490196078431373,0.5529411764705883,0.5568627450980392,0.5450980392156862 + 0,0.5490196078431373,0.5529411764705883,0.5568627450980392,0.5450980392156862, + 3600,0.5647058823529412,0.5686274509803921,0.5725490196078431,0.5607843137254902 ] } } @@ -9102,8 +9142,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,249,250,251,248, - 3600,253,254,0,252 + 0,6,7,8,5, + 3600,10,11,12,9 ] } } @@ -9118,15 +9158,15 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,2,3,4,1, - 3600,6,7,8,5 + 0,14,15,16,13, + 3600,18,19,20,17 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,310, - 3600,311 + 0,313, + 3600,314 ] }, "lineCount":{ @@ -9162,29 +9202,29 @@ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,10,11,12,9, - 3600,14,15,16,13 + 0,22,23,24,21, + 3600,26,27,28,25 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,18,19,20,17, - 3600,22,23,24,21 + 0,30,31,32,29, + 3600,34,35,36,33 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,312, - 3600,313 + 0,315, + 3600,316 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,314, - 3600,315 + 0,317, + 3600,318 ] } } @@ -9199,8 +9239,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5647058823529412,0.5686274509803921,0.5725490196078431,0.5607843137254902, - 3600,0.5803921568627451,0.5843137254901961,0.5882352941176471,0.5764705882352941 + 0,0.5803921568627451,0.5843137254901961,0.5882352941176471,0.5764705882352941, + 3600,0.596078431372549,0.6,0.6039215686274509,0.592156862745098 ] } } @@ -9215,8 +9255,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.596078431372549,0.6,0.6039215686274509,0.592156862745098, - 3600,0.611764705882353,0.615686274509804,0.6196078431372549,0.6078431372549019 + 0,0.611764705882353,0.615686274509804,0.6196078431372549,0.6078431372549019, + 3600,0.6274509803921569,0.6313725490196078,0.6352941176470588,0.6235294117647059 ] } } @@ -9231,8 +9271,8 @@ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6274509803921569,0.6313725490196078,0.6352941176470588,0.6235294117647059, - 3600,0.6431372549019608,0.6470588235294118,0.6509803921568628,0.6392156862745098 + 0,0.6431372549019608,0.6470588235294118,0.6509803921568628,0.6392156862745098, + 3600,0.6588235294117647,0.6627450980392157,0.6666666666666666,0.6549019607843137 ] } } @@ -9247,8 +9287,8 @@ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6588235294117647,0.6627450980392157,0.6666666666666666,0.6549019607843137, - 3600,0.6745098039215687,0.6784313725490196,0.6823529411764706,0.6705882352941176 + 0,0.6745098039215687,0.6784313725490196,0.6823529411764706,0.6705882352941176, + 3600,0.6901960784313725,0.6941176470588235,0.6980392156862745,0.6862745098039216 ] } } @@ -9261,8 +9301,8 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6901960784313725,0.6941176470588235,0.6980392156862745,0.6862745098039216, - 3600,0.7058823529411765,0.7098039215686275,0.7137254901960784,0.7019607843137254 + 0,0.7058823529411765,0.7098039215686275,0.7137254901960784,0.7019607843137254, + 3600,0.7215686274509804,0.7254901960784313,0.7294117647058823,0.7176470588235294 ] } } @@ -9275,8 +9315,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7215686274509804,0.7254901960784313,0.7294117647058823,0.7176470588235294, - 3600,0.7372549019607844,0.7411764705882353,0.7450980392156863,0.7333333333333333 + 0,0.7372549019607844,0.7411764705882353,0.7450980392156863,0.7333333333333333, + 3600,0.7529411764705882,0.7568627450980392,0.7607843137254902,0.7490196078431373 ] } } @@ -9298,8 +9338,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,26,27,28,25, - 3600,30,31,32,29 + 0,38,39,40,37, + 3600,42,43,44,41 ] } } @@ -9314,15 +9354,15 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,34,35,36,33, - 3600,38,39,40,37 + 0,46,47,48,45, + 3600,50,51,52,49 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,316, - 3600,317 + 0,319, + 3600,320 ] }, "lineCount":{ @@ -9358,29 +9398,29 @@ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,42,43,44,41, - 3600,46,47,48,45 + 0,54,55,56,53, + 3600,58,59,60,57 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,50,51,52,49, - 3600,54,55,56,53 + 0,62,63,64,61, + 3600,66,67,68,65 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,318, - 3600,319 + 0,321, + 3600,322 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,320, - 3600,321 + 0,323, + 3600,324 ] } } @@ -9395,8 +9435,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7529411764705882,0.7568627450980392,0.7607843137254902,0.7490196078431373, - 3600,0.7686274509803922,0.7725490196078432,0.7764705882352941,0.7647058823529411 + 0,0.7686274509803922,0.7725490196078432,0.7764705882352941,0.7647058823529411, + 3600,0.7843137254901961,0.788235294117647,0.792156862745098,0.7803921568627451 ] } } @@ -9411,8 +9451,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7843137254901961,0.788235294117647,0.792156862745098,0.7803921568627451, - 3600,0.8,0.803921568627451,0.807843137254902,0.796078431372549 + 0,0.8,0.803921568627451,0.807843137254902,0.796078431372549, + 3600,0.8156862745098039,0.8196078431372549,0.8235294117647058,0.8117647058823529 ] } } @@ -9427,8 +9467,8 @@ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8156862745098039,0.8196078431372549,0.8235294117647058,0.8117647058823529, - 3600,0.8313725490196079,0.8352941176470589,0.8392156862745098,0.8274509803921568 + 0,0.8313725490196079,0.8352941176470589,0.8392156862745098,0.8274509803921568, + 3600,0.8470588235294118,0.8509803921568627,0.8549019607843137,0.8431372549019608 ] } } @@ -9443,8 +9483,8 @@ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8470588235294118,0.8509803921568627,0.8549019607843137,0.8431372549019608, - 3600,0.8627450980392157,0.8666666666666667,0.8705882352941177,0.8588235294117647 + 0,0.8627450980392157,0.8666666666666667,0.8705882352941177,0.8588235294117647, + 3600,0.8784313725490196,0.8823529411764706,0.8862745098039215,0.8745098039215686 ] } } @@ -9457,8 +9497,8 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8784313725490196,0.8823529411764706,0.8862745098039215,0.8745098039215686, - 3600,0.8941176470588236,0.8980392156862745,0.9019607843137255,0.8901960784313725 + 0,0.8941176470588236,0.8980392156862745,0.9019607843137255,0.8901960784313725, + 3600,0.9098039215686274,0.9137254901960784,0.9176470588235294,0.9058823529411765 ] } } @@ -9471,8 +9511,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9098039215686274,0.9137254901960784,0.9176470588235294,0.9058823529411765, - 3600,0.9254901960784314,0.9294117647058824,0.9333333333333333,0.9215686274509803 + 0,0.9254901960784314,0.9294117647058824,0.9333333333333333,0.9215686274509803, + 3600,0.9411764705882353,0.9450980392156862,0.9490196078431372,0.9372549019607843 ] } } @@ -9494,8 +9534,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,58,59,60,57, - 3600,62,63,64,61 + 0,70,71,72,69, + 3600,74,75,76,73 ] } } @@ -9510,15 +9550,15 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,66,67,68,65, - 3600,70,71,72,69 + 0,78,79,80,77, + 3600,82,83,84,81 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,322, - 3600,323 + 0,325, + 3600,326 ] }, "lineCount":{ @@ -9554,29 +9594,29 @@ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,74,75,76,73, - 3600,78,79,80,77 + 0,86,87,88,85, + 3600,90,91,92,89 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,82,83,84,81, - 3600,86,87,88,85 + 0,94,95,96,93, + 3600,98,99,100,97 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,324, - 3600,325 + 0,327, + 3600,328 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,326, - 3600,327 + 0,329, + 3600,330 ] } } @@ -9591,8 +9631,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9411764705882353,0.9450980392156862,0.9490196078431372,0.9372549019607843, - 3600,0.9568627450980393,0.9607843137254902,0.9647058823529412,0.9529411764705882 + 0,0.9568627450980393,0.9607843137254902,0.9647058823529412,0.9529411764705882, + 3600,0.9725490196078431,0.9764705882352941,0.9803921568627451,0.9686274509803922 ] } } @@ -9607,8 +9647,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9725490196078431,0.9764705882352941,0.9803921568627451,0.9686274509803922, - 3600,0.9882352941176471,0.9921568627450981,0.996078431372549,0.984313725490196 + 0,0.9882352941176471,0.9921568627450981,0.996078431372549,0.984313725490196, + 3600,0.00392156862745098,0.00784313725490196,0.011764705882352941,0 ] } } @@ -9623,8 +9663,8 @@ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.00392156862745098,0.00784313725490196,0.011764705882352941,0, - 3600,0.0196078431372549,0.023529411764705882,0.027450980392156862,0.01568627450980392 + 0,0.0196078431372549,0.023529411764705882,0.027450980392156862,0.01568627450980392, + 3600,0.03529411764705882,0.0392156862745098,0.043137254901960784,0.03137254901960784 ] } } @@ -9639,8 +9679,8 @@ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.03529411764705882,0.0392156862745098,0.043137254901960784,0.03137254901960784, - 3600,0.050980392156862744,0.054901960784313725,0.058823529411764705,0.047058823529411764 + 0,0.050980392156862744,0.054901960784313725,0.058823529411764705,0.047058823529411764, + 3600,0.06666666666666667,0.07058823529411765,0.07450980392156863,0.06274509803921569 ] } } @@ -9653,8 +9693,8 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.06666666666666667,0.07058823529411765,0.07450980392156863,0.06274509803921569, - 3600,0.08235294117647059,0.08627450980392157,0.09019607843137255,0.0784313725490196 + 0,0.08235294117647059,0.08627450980392157,0.09019607843137255,0.0784313725490196, + 3600,0.09803921568627451,0.10196078431372549,0.10588235294117647,0.09411764705882353 ] } } @@ -9667,8 +9707,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.09803921568627451,0.10196078431372549,0.10588235294117647,0.09411764705882353, - 3600,0.11372549019607843,0.11764705882352941,0.12156862745098039,0.10980392156862745 + 0,0.11372549019607843,0.11764705882352941,0.12156862745098039,0.10980392156862745, + 3600,0.12941176470588237,0.13333333333333333,0.13725490196078433,0.12549019607843137 ] } } @@ -9690,8 +9730,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,90,91,92,89, - 3600,94,95,96,93 + 0,102,103,104,101, + 3600,106,107,108,105 ] } } @@ -9706,15 +9746,15 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,98,99,100,97, - 3600,102,103,104,101 + 0,110,111,112,109, + 3600,114,115,116,113 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,328, - 3600,329 + 0,331, + 3600,332 ] }, "lineCount":{ @@ -9750,29 +9790,29 @@ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,106,107,108,105, - 3600,110,111,112,109 + 0,118,119,120,117, + 3600,122,123,124,121 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,114,115,116,113, - 3600,118,119,120,117 + 0,126,127,128,125, + 3600,130,131,132,129 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,330, - 3600,331 + 0,333, + 3600,334 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,332, - 3600,333 + 0,335, + 3600,336 ] } } @@ -9787,8 +9827,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.12941176470588237,0.13333333333333333,0.13725490196078433,0.12549019607843137, - 3600,0.1450980392156863,0.14901960784313725,0.15294117647058825,0.1411764705882353 + 0,0.1450980392156863,0.14901960784313725,0.15294117647058825,0.1411764705882353, + 3600,0.1607843137254902,0.16470588235294117,0.16862745098039217,0.1568627450980392 ] } } @@ -9803,8 +9843,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.1607843137254902,0.16470588235294117,0.16862745098039217,0.1568627450980392, - 3600,0.17647058823529413,0.1803921568627451,0.1843137254901961,0.17254901960784313 + 0,0.17647058823529413,0.1803921568627451,0.1843137254901961,0.17254901960784313, + 3600,0.19215686274509805,0.19607843137254902,0.2,0.18823529411764706 ] } } @@ -9819,8 +9859,8 @@ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.19215686274509805,0.19607843137254902,0.2,0.18823529411764706, - 3600,0.20784313725490197,0.21176470588235294,0.21568627450980393,0.20392156862745098 + 0,0.20784313725490197,0.21176470588235294,0.21568627450980393,0.20392156862745098, + 3600,0.2235294117647059,0.22745098039215686,0.23137254901960785,0.2196078431372549 ] } } @@ -9835,8 +9875,8 @@ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.2235294117647059,0.22745098039215686,0.23137254901960785,0.2196078431372549, - 3600,0.23921568627450981,0.24313725490196078,0.24705882352941178,0.23529411764705882 + 0,0.23921568627450981,0.24313725490196078,0.24705882352941178,0.23529411764705882, + 3600,0.2549019607843137,0.25882352941176473,0.2627450980392157,0.25098039215686274 ] } } @@ -9849,8 +9889,8 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.2549019607843137,0.25882352941176473,0.2627450980392157,0.25098039215686274, - 3600,0.27058823529411763,0.27450980392156865,0.2784313725490196,0.26666666666666666 + 0,0.27058823529411763,0.27450980392156865,0.2784313725490196,0.26666666666666666, + 3600,0.28627450980392155,0.2901960784313726,0.29411764705882354,0.2823529411764706 ] } } @@ -9863,8 +9903,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.28627450980392155,0.2901960784313726,0.29411764705882354,0.2823529411764706, - 3600,0.30196078431372547,0.3058823529411765,0.30980392156862746,0.2980392156862745 + 0,0.30196078431372547,0.3058823529411765,0.30980392156862746,0.2980392156862745, + 3600,0.3176470588235294,0.3215686274509804,0.3254901960784314,0.3137254901960784 ] } } @@ -9886,8 +9926,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,122,123,124,121, - 3600,126,127,128,125 + 0,134,135,136,133, + 3600,138,139,140,137 ] } } @@ -9902,15 +9942,15 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,130,131,132,129, - 3600,134,135,136,133 + 0,142,143,144,141, + 3600,146,147,148,145 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,334, - 3600,335 + 0,337, + 3600,338 ] }, "lineCount":{ @@ -9946,29 +9986,29 @@ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,138,139,140,137, - 3600,142,143,144,141 + 0,150,151,152,149, + 3600,154,155,156,153 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,146,147,148,145, - 3600,150,151,152,149 + 0,158,159,160,157, + 3600,162,163,164,161 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,336, - 3600,337 + 0,339, + 3600,340 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,338, - 3600,339 + 0,341, + 3600,342 ] } } @@ -9983,8 +10023,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3176470588235294,0.3215686274509804,0.3254901960784314,0.3137254901960784, - 3600,0.3333333333333333,0.33725490196078434,0.3411764705882353,0.32941176470588235 + 0,0.3333333333333333,0.33725490196078434,0.3411764705882353,0.32941176470588235, + 3600,0.34901960784313724,0.35294117647058826,0.3568627450980392,0.34509803921568627 ] } } @@ -9999,8 +10039,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.34901960784313724,0.35294117647058826,0.3568627450980392,0.34509803921568627, - 3600,0.36470588235294116,0.3686274509803922,0.37254901960784315,0.3607843137254902 + 0,0.36470588235294116,0.3686274509803922,0.37254901960784315,0.3607843137254902, + 3600,0.3803921568627451,0.3843137254901961,0.38823529411764707,0.3764705882352941 ] } } @@ -10015,8 +10055,8 @@ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3803921568627451,0.3843137254901961,0.38823529411764707,0.3764705882352941, - 3600,0.396078431372549,0.4,0.403921568627451,0.39215686274509803 + 0,0.396078431372549,0.4,0.403921568627451,0.39215686274509803, + 3600,0.4117647058823529,0.41568627450980394,0.4196078431372549,0.40784313725490196 ] } } @@ -10031,8 +10071,8 @@ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4117647058823529,0.41568627450980394,0.4196078431372549,0.40784313725490196, - 3600,0.42745098039215684,0.43137254901960786,0.43529411764705883,0.4235294117647059 + 0,0.42745098039215684,0.43137254901960786,0.43529411764705883,0.4235294117647059, + 3600,0.44313725490196076,0.4470588235294118,0.45098039215686275,0.4392156862745098 ] } } @@ -10045,8 +10085,8 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.44313725490196076,0.4470588235294118,0.45098039215686275,0.4392156862745098, - 3600,0.4588235294117647,0.4627450980392157,0.4666666666666667,0.4549019607843137 + 0,0.4588235294117647,0.4627450980392157,0.4666666666666667,0.4549019607843137, + 3600,0.4745098039215686,0.47843137254901963,0.4823529411764706,0.47058823529411764 ] } } @@ -10057,8 +10097,8 @@ "fillColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4745098039215686,0.47843137254901963,0.4823529411764706,0.47058823529411764, - 3600,0.49019607843137253,0.49411764705882355,0.4980392156862745,0.48627450980392156 + 0,0.49019607843137253,0.49411764705882355,0.4980392156862745,0.48627450980392156, + 3600,0.5058823529411764,0.5098039215686274,0.5137254901960784,0.5019607843137255 ] } } @@ -10069,22 +10109,34 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5058823529411764,0.5098039215686274,0.5137254901960784,0.5019607843137255, - 3600,0.5215686274509804,0.5254901960784314,0.5294117647058824,0.5176470588235295 + 0,0.5215686274509804,0.5254901960784314,0.5294117647058824,0.5176470588235295, + 3600,0.5372549019607843,0.5411764705882353,0.5450980392156862,0.5333333333333333 ] } } }, { "id":"sampled53", - "path":{ + "model":{ + "color":{ + "epoch":"2016-06-17T12:00:00Z", + "rgbaf":[ + 0,0.5529411764705883,0.5568627450980392,0.5607843137254902,0.5490196078431373, + 3600,0.5686274509803921,0.5725490196078431,0.5764705882352941,0.5647058823529412 + ] + } + } + }, + { + "id":"sampled54", + "path":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5372549019607843,0.5411764705882353,0.5450980392156862,0.5333333333333333, - 3600,0.5529411764705883,0.5568627450980392,0.5607843137254902,0.5490196078431373 + 0,0.5843137254901961,0.5882352941176471,0.592156862745098,0.5803921568627451, + 3600,0.6,0.6039215686274509,0.6078431372549019,0.596078431372549 ] } } @@ -10092,29 +10144,29 @@ } }, { - "id":"sampled54", + "id":"sampled55", "path":{ "material":{ "polylineOutline":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,154,155,156,153, - 3600,158,159,160,157 + 0,166,167,168,165, + 3600,170,171,172,169 ] }, "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,162,163,164,161, - 3600,166,167,168,165 + 0,174,175,176,173, + 3600,178,179,180,177 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,340, - 3600,341 + 0,343, + 3600,344 ] } } @@ -10122,15 +10174,15 @@ } }, { - "id":"sampled55", + "id":"sampled56", "path":{ "material":{ "polylineArrow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,170,171,172,169, - 3600,174,175,176,173 + 0,182,183,184,181, + 3600,186,187,188,185 ] } } @@ -10138,22 +10190,22 @@ } }, { - "id":"sampled56", + "id":"sampled57", "path":{ "material":{ "polylineGlow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,178,179,180,177, - 3600,182,183,184,181 + 0,190,191,192,189, + 3600,194,195,196,193 ] }, "glowPower":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,342, - 3600,343 + 0,345, + 3600,346 ] } } @@ -10161,7 +10213,7 @@ } }, { - "id":"sampled57", + "id":"sampled58", "path":{ "material":{ "image":{ @@ -10175,8 +10227,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,186,187,188,185, - 3600,190,191,192,189 + 0,198,199,200,197, + 3600,202,203,204,201 ] } } @@ -10184,22 +10236,22 @@ } }, { - "id":"sampled58", + "id":"sampled59", "path":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,194,195,196,193, - 3600,198,199,200,197 + 0,206,207,208,205, + 3600,210,211,212,209 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,344, - 3600,345 + 0,347, + 3600,348 ] }, "lineCount":{ @@ -10228,36 +10280,36 @@ } }, { - "id":"sampled59", + "id":"sampled60", "path":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,202,203,204,201, - 3600,206,207,208,205 + 0,214,215,216,213, + 3600,218,219,220,217 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,210,211,212,209, - 3600,214,215,216,213 + 0,222,223,224,221, + 3600,226,227,228,225 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,346, - 3600,347 + 0,349, + 3600,350 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,348, - 3600,349 + 0,351, + 3600,352 ] } } @@ -10265,15 +10317,15 @@ } }, { - "id":"sampled60", + "id":"sampled61", "path":{ "material":{ "polylineOutline":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5686274509803921,0.5725490196078431,0.5764705882352941,0.5647058823529412, - 3600,0.5843137254901961,0.5882352941176471,0.592156862745098,0.5803921568627451 + 0,0.615686274509804,0.6196078431372549,0.6235294117647059,0.611764705882353, + 3600,0.6313725490196078,0.6352941176470588,0.6392156862745098,0.6274509803921569 ] } } @@ -10281,15 +10333,15 @@ } }, { - "id":"sampled61", + "id":"sampled62", "path":{ "material":{ "polylineOutline":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6,0.6039215686274509,0.6078431372549019,0.596078431372549, - 3600,0.615686274509804,0.6196078431372549,0.6235294117647059,0.611764705882353 + 0,0.6470588235294118,0.6509803921568628,0.6549019607843137,0.6431372549019608, + 3600,0.6627450980392157,0.6666666666666666,0.6705882352941176,0.6588235294117647 ] } } @@ -10297,15 +10349,15 @@ } }, { - "id":"sampled62", + "id":"sampled63", "path":{ "material":{ "polylineArrow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6313725490196078,0.6352941176470588,0.6392156862745098,0.6274509803921569, - 3600,0.6470588235294118,0.6509803921568628,0.6549019607843137,0.6431372549019608 + 0,0.6784313725490196,0.6823529411764706,0.6862745098039216,0.6745098039215687, + 3600,0.6941176470588235,0.6980392156862745,0.7019607843137254,0.6901960784313725 ] } } @@ -10313,15 +10365,15 @@ } }, { - "id":"sampled63", + "id":"sampled64", "path":{ "material":{ "polylineGlow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6627450980392157,0.6666666666666666,0.6705882352941176,0.6588235294117647, - 3600,0.6784313725490196,0.6823529411764706,0.6862745098039216,0.6745098039215687 + 0,0.7098039215686275,0.7137254901960784,0.7176470588235294,0.7058823529411765, + 3600,0.7254901960784313,0.7294117647058823,0.7333333333333333,0.7215686274509804 ] } } @@ -10329,15 +10381,15 @@ } }, { - "id":"sampled64", + "id":"sampled65", "path":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6941176470588235,0.6980392156862745,0.7019607843137254,0.6901960784313725, - 3600,0.7098039215686275,0.7137254901960784,0.7176470588235294,0.7058823529411765 + 0,0.7411764705882353,0.7450980392156863,0.7490196078431373,0.7372549019607844, + 3600,0.7568627450980392,0.7607843137254902,0.7647058823529411,0.7529411764705882 ] } } @@ -10345,15 +10397,15 @@ } }, { - "id":"sampled65", + "id":"sampled66", "path":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7254901960784313,0.7294117647058823,0.7333333333333333,0.7215686274509804, - 3600,0.7411764705882353,0.7450980392156863,0.7490196078431373,0.7372549019607844 + 0,0.7725490196078432,0.7764705882352941,0.7803921568627451,0.7686274509803922, + 3600,0.788235294117647,0.792156862745098,0.796078431372549,0.7843137254901961 ] } } @@ -10361,15 +10413,15 @@ } }, { - "id":"sampled66", + "id":"sampled67", "path":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7568627450980392,0.7607843137254902,0.7647058823529411,0.7529411764705882, - 3600,0.7725490196078432,0.7764705882352941,0.7803921568627451,0.7686274509803922 + 0,0.803921568627451,0.807843137254902,0.8117647058823529,0.8, + 3600,0.8196078431372549,0.8235294117647058,0.8274509803921568,0.8156862745098039 ] } } @@ -10377,15 +10429,15 @@ } }, { - "id":"sampled67", + "id":"sampled68", "path":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.788235294117647,0.792156862745098,0.796078431372549,0.7843137254901961, - 3600,0.803921568627451,0.807843137254902,0.8117647058823529,0.8 + 0,0.8352941176470589,0.8392156862745098,0.8431372549019608,0.8313725490196079, + 3600,0.8509803921568627,0.8549019607843137,0.8588235294117647,0.8470588235294118 ] } } @@ -10393,39 +10445,39 @@ } }, { - "id":"sampled68", + "id":"sampled69", "point":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8196078431372549,0.8235294117647058,0.8274509803921568,0.8156862745098039, - 3600,0.8352941176470589,0.8392156862745098,0.8431372549019608,0.8313725490196079 + 0,0.8666666666666667,0.8705882352941177,0.8745098039215686,0.8627450980392157, + 3600,0.8823529411764706,0.8862745098039215,0.8901960784313725,0.8784313725490196 ] } } }, { - "id":"sampled69", + "id":"sampled70", "point":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8509803921568627,0.8549019607843137,0.8588235294117647,0.8470588235294118, - 3600,0.8666666666666667,0.8705882352941177,0.8745098039215686,0.8627450980392157 + 0,0.8980392156862745,0.9019607843137255,0.9058823529411765,0.8941176470588236, + 3600,0.9137254901960784,0.9176470588235294,0.9215686274509803,0.9098039215686274 ] } } }, { - "id":"sampled70", + "id":"sampled71", "polygon":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8823529411764706,0.8862745098039215,0.8901960784313725,0.8784313725490196, - 3600,0.8980392156862745,0.9019607843137255,0.9058823529411765,0.8941176470588236 + 0,0.9294117647058824,0.9333333333333333,0.9372549019607843,0.9254901960784314, + 3600,0.9450980392156862,0.9490196078431372,0.9529411764705882,0.9411764705882353 ] } } @@ -10433,7 +10485,7 @@ } }, { - "id":"sampled71", + "id":"sampled72", "polygon":{ "material":{ "image":{ @@ -10447,8 +10499,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,218,219,220,217, - 3600,222,223,224,221 + 0,230,231,232,229, + 3600,234,235,236,233 ] } } @@ -10456,22 +10508,22 @@ } }, { - "id":"sampled72", + "id":"sampled73", "polygon":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,226,227,228,225, - 3600,230,231,232,229 + 0,238,239,240,237, + 3600,242,243,244,241 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,350, - 3600,351 + 0,353, + 3600,354 ] }, "lineCount":{ @@ -10500,36 +10552,36 @@ } }, { - "id":"sampled73", + "id":"sampled74", "polygon":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,234,235,236,233, - 3600,238,239,240,237 + 0,246,247,248,245, + 3600,250,251,252,249 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,242,243,244,241, - 3600,246,247,248,245 + 0,254,0,1,253, + 3600,3,4,5,2 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,352, - 3600,353 + 0,355, + 3600,356 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,354, - 3600,355 + 0,357, + 3600,358 ] } } @@ -10537,15 +10589,15 @@ } }, { - "id":"sampled74", + "id":"sampled75", "polygon":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9137254901960784,0.9176470588235294,0.9215686274509803,0.9098039215686274, - 3600,0.9294117647058824,0.9333333333333333,0.9372549019607843,0.9254901960784314 + 0,0.9607843137254902,0.9647058823529412,0.9686274509803922,0.9568627450980393, + 3600,0.9764705882352941,0.9803921568627451,0.984313725490196,0.9725490196078431 ] } } @@ -10553,15 +10605,15 @@ } }, { - "id":"sampled75", + "id":"sampled76", "polygon":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9450980392156862,0.9490196078431372,0.9529411764705882,0.9411764705882353, - 3600,0.9607843137254902,0.9647058823529412,0.9686274509803922,0.9568627450980393 + 0,0.9921568627450981,0.996078431372549,0,0.9882352941176471, + 3600,0.00784313725490196,0.011764705882352941,0.01568627450980392,0.00392156862745098 ] } } @@ -10569,15 +10621,15 @@ } }, { - "id":"sampled76", + "id":"sampled77", "polygon":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9764705882352941,0.9803921568627451,0.984313725490196,0.9725490196078431, - 3600,0.9921568627450981,0.996078431372549,0,0.9882352941176471 + 0,0.023529411764705882,0.027450980392156862,0.03137254901960784,0.0196078431372549, + 3600,0.0392156862745098,0.043137254901960784,0.047058823529411764,0.03529411764705882 ] } } @@ -10585,15 +10637,15 @@ } }, { - "id":"sampled77", + "id":"sampled78", "polygon":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.00784313725490196,0.011764705882352941,0.01568627450980392,0.00392156862745098, - 3600,0.023529411764705882,0.027450980392156862,0.03137254901960784,0.0196078431372549 + 0,0.054901960784313725,0.058823529411764705,0.06274509803921569,0.050980392156862744, + 3600,0.07058823529411765,0.07450980392156863,0.0784313725490196,0.06666666666666667 ] } } @@ -10601,27 +10653,27 @@ } }, { - "id":"sampled78", + "id":"sampled79", "polygon":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.0392156862745098,0.043137254901960784,0.047058823529411764,0.03529411764705882, - 3600,0.054901960784313725,0.058823529411764705,0.06274509803921569,0.050980392156862744 + 0,0.08627450980392157,0.09019607843137255,0.09411764705882353,0.08235294117647059, + 3600,0.10196078431372549,0.10588235294117647,0.10980392156862745,0.09803921568627451 ] } } }, { - "id":"sampled79", + "id":"sampled80", "polyline":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.07058823529411765,0.07450980392156863,0.0784313725490196,0.06666666666666667, - 3600,0.08627450980392157,0.09019607843137255,0.09411764705882353,0.08235294117647059 + 0,0.11764705882352941,0.12156862745098039,0.12549019607843137,0.11372549019607843, + 3600,0.13333333333333333,0.13725490196078433,0.1411764705882353,0.12941176470588237 ] } } @@ -10629,29 +10681,29 @@ } }, { - "id":"sampled80", + "id":"sampled81", "polyline":{ "material":{ "polylineOutline":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,250,251,252,249, - 3600,254,0,1,253 + 0,7,8,9,6, + 3600,11,12,13,10 ] }, "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,3,4,5,2, - 3600,7,8,9,6 + 0,15,16,17,14, + 3600,19,20,21,18 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,356, - 3600,357 + 0,359, + 3600,360 ] } } @@ -10659,15 +10711,15 @@ } }, { - "id":"sampled81", + "id":"sampled82", "polyline":{ "material":{ "polylineArrow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,11,12,13,10, - 3600,15,16,17,14 + 0,23,24,25,22, + 3600,27,28,29,26 ] } } @@ -10675,22 +10727,22 @@ } }, { - "id":"sampled82", + "id":"sampled83", "polyline":{ "material":{ "polylineGlow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,19,20,21,18, - 3600,23,24,25,22 + 0,31,32,33,30, + 3600,35,36,37,34 ] }, "glowPower":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,358, - 3600,359 + 0,361, + 3600,362 ] } } @@ -10698,7 +10750,7 @@ } }, { - "id":"sampled83", + "id":"sampled84", "polyline":{ "material":{ "image":{ @@ -10712,8 +10764,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,27,28,29,26, - 3600,31,32,33,30 + 0,39,40,41,38, + 3600,43,44,45,42 ] } } @@ -10721,22 +10773,22 @@ } }, { - "id":"sampled84", + "id":"sampled85", "polyline":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,35,36,37,34, - 3600,39,40,41,38 + 0,47,48,49,46, + 3600,51,52,53,50 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,360, - 3600,361 + 0,363, + 3600,364 ] }, "lineCount":{ @@ -10765,36 +10817,36 @@ } }, { - "id":"sampled85", + "id":"sampled86", "polyline":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,43,44,45,42, - 3600,47,48,49,46 + 0,55,56,57,54, + 3600,59,60,61,58 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,51,52,53,50, - 3600,55,56,57,54 + 0,63,64,65,62, + 3600,67,68,69,66 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,362, - 3600,363 + 0,365, + 3600,366 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,364, - 3600,365 + 0,367, + 3600,368 ] } } @@ -10802,15 +10854,15 @@ } }, { - "id":"sampled86", + "id":"sampled87", "polyline":{ "material":{ "polylineOutline":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.10196078431372549,0.10588235294117647,0.10980392156862745,0.09803921568627451, - 3600,0.11764705882352941,0.12156862745098039,0.12549019607843137,0.11372549019607843 + 0,0.14901960784313725,0.15294117647058825,0.1568627450980392,0.1450980392156863, + 3600,0.16470588235294117,0.16862745098039217,0.17254901960784313,0.1607843137254902 ] } } @@ -10818,15 +10870,15 @@ } }, { - "id":"sampled87", + "id":"sampled88", "polyline":{ "material":{ "polylineOutline":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.13333333333333333,0.13725490196078433,0.1411764705882353,0.12941176470588237, - 3600,0.14901960784313725,0.15294117647058825,0.1568627450980392,0.1450980392156863 + 0,0.1803921568627451,0.1843137254901961,0.18823529411764706,0.17647058823529413, + 3600,0.19607843137254902,0.2,0.20392156862745098,0.19215686274509805 ] } } @@ -10834,15 +10886,15 @@ } }, { - "id":"sampled88", + "id":"sampled89", "polyline":{ "material":{ "polylineArrow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.16470588235294117,0.16862745098039217,0.17254901960784313,0.1607843137254902, - 3600,0.1803921568627451,0.1843137254901961,0.18823529411764706,0.17647058823529413 + 0,0.21176470588235294,0.21568627450980393,0.2196078431372549,0.20784313725490197, + 3600,0.22745098039215686,0.23137254901960785,0.23529411764705882,0.2235294117647059 ] } } @@ -10850,15 +10902,15 @@ } }, { - "id":"sampled89", + "id":"sampled90", "polyline":{ "material":{ "polylineGlow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.19607843137254902,0.2,0.20392156862745098,0.19215686274509805, - 3600,0.21176470588235294,0.21568627450980393,0.2196078431372549,0.20784313725490197 + 0,0.24313725490196078,0.24705882352941178,0.25098039215686274,0.23921568627450981, + 3600,0.25882352941176473,0.2627450980392157,0.26666666666666666,0.2549019607843137 ] } } @@ -10866,15 +10918,15 @@ } }, { - "id":"sampled90", + "id":"sampled91", "polyline":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.22745098039215686,0.23137254901960785,0.23529411764705882,0.2235294117647059, - 3600,0.24313725490196078,0.24705882352941178,0.25098039215686274,0.23921568627450981 + 0,0.27450980392156865,0.2784313725490196,0.2823529411764706,0.27058823529411763, + 3600,0.2901960784313726,0.29411764705882354,0.2980392156862745,0.28627450980392155 ] } } @@ -10882,15 +10934,15 @@ } }, { - "id":"sampled91", + "id":"sampled92", "polyline":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.25882352941176473,0.2627450980392157,0.26666666666666666,0.2549019607843137, - 3600,0.27450980392156865,0.2784313725490196,0.2823529411764706,0.27058823529411763 + 0,0.3058823529411765,0.30980392156862746,0.3137254901960784,0.30196078431372547, + 3600,0.3215686274509804,0.3254901960784314,0.32941176470588235,0.3176470588235294 ] } } @@ -10898,15 +10950,15 @@ } }, { - "id":"sampled92", + "id":"sampled93", "polyline":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.2901960784313726,0.29411764705882354,0.2980392156862745,0.28627450980392155, - 3600,0.3058823529411765,0.30980392156862746,0.3137254901960784,0.30196078431372547 + 0,0.33725490196078434,0.3411764705882353,0.34509803921568627,0.3333333333333333, + 3600,0.35294117647058826,0.3568627450980392,0.3607843137254902,0.34901960784313724 ] } } @@ -10914,15 +10966,15 @@ } }, { - "id":"sampled93", + "id":"sampled94", "polyline":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3215686274509804,0.3254901960784314,0.32941176470588235,0.3176470588235294, - 3600,0.33725490196078434,0.3411764705882353,0.34509803921568627,0.3333333333333333 + 0,0.3686274509803922,0.37254901960784315,0.3764705882352941,0.36470588235294116, + 3600,0.3843137254901961,0.38823529411764707,0.39215686274509803,0.3803921568627451 ] } } @@ -10930,7 +10982,7 @@ } }, { - "id":"sampled94", + "id":"sampled95", "rectangle":{ "coordinates":{ "epoch":"2016-06-17T12:00:00Z", @@ -10942,15 +10994,15 @@ } }, { - "id":"sampled95", + "id":"sampled96", "rectangle":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.35294117647058826,0.3568627450980392,0.3607843137254902,0.34901960784313724, - 3600,0.3686274509803922,0.37254901960784315,0.3764705882352941,0.36470588235294116 + 0,0.4,0.403921568627451,0.40784313725490196,0.396078431372549, + 3600,0.41568627450980394,0.4196078431372549,0.4235294117647059,0.4117647058823529 ] } } @@ -10958,7 +11010,7 @@ } }, { - "id":"sampled96", + "id":"sampled97", "rectangle":{ "material":{ "image":{ @@ -10972,8 +11024,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,59,60,61,58, - 3600,63,64,65,62 + 0,71,72,73,70, + 3600,75,76,77,74 ] } } @@ -10981,22 +11033,22 @@ } }, { - "id":"sampled97", + "id":"sampled98", "rectangle":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,67,68,69,66, - 3600,71,72,73,70 + 0,79,80,81,78, + 3600,83,84,85,82 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,366, - 3600,367 + 0,369, + 3600,370 ] }, "lineCount":{ @@ -11025,36 +11077,36 @@ } }, { - "id":"sampled98", + "id":"sampled99", "rectangle":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,75,76,77,74, - 3600,79,80,81,78 + 0,87,88,89,86, + 3600,91,92,93,90 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,83,84,85,82, - 3600,87,88,89,86 + 0,95,96,97,94, + 3600,99,100,101,98 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,368, - 3600,369 + 0,371, + 3600,372 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,370, - 3600,371 + 0,373, + 3600,374 ] } } @@ -11062,15 +11114,15 @@ } }, { - "id":"sampled99", + "id":"sampled100", "rectangle":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3843137254901961,0.38823529411764707,0.39215686274509803,0.3803921568627451, - 3600,0.4,0.403921568627451,0.40784313725490196,0.396078431372549 + 0,0.43137254901960786,0.43529411764705883,0.4392156862745098,0.42745098039215684, + 3600,0.4470588235294118,0.45098039215686275,0.4549019607843137,0.44313725490196076 ] } } @@ -11078,15 +11130,15 @@ } }, { - "id":"sampled100", + "id":"sampled101", "rectangle":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.41568627450980394,0.4196078431372549,0.4235294117647059,0.4117647058823529, - 3600,0.43137254901960786,0.43529411764705883,0.4392156862745098,0.42745098039215684 + 0,0.4627450980392157,0.4666666666666667,0.47058823529411764,0.4588235294117647, + 3600,0.47843137254901963,0.4823529411764706,0.48627450980392156,0.4745098039215686 ] } } @@ -11094,15 +11146,15 @@ } }, { - "id":"sampled101", + "id":"sampled102", "rectangle":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4470588235294118,0.45098039215686275,0.4549019607843137,0.44313725490196076, - 3600,0.4627450980392157,0.4666666666666667,0.47058823529411764,0.4588235294117647 + 0,0.49411764705882355,0.4980392156862745,0.5019607843137255,0.49019607843137253, + 3600,0.5098039215686274,0.5137254901960784,0.5176470588235295,0.5058823529411764 ] } } @@ -11110,15 +11162,15 @@ } }, { - "id":"sampled102", + "id":"sampled103", "rectangle":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.47843137254901963,0.4823529411764706,0.48627450980392156,0.4745098039215686, - 3600,0.49411764705882355,0.4980392156862745,0.5019607843137255,0.49019607843137253 + 0,0.5254901960784314,0.5294117647058824,0.5333333333333333,0.5215686274509804, + 3600,0.5411764705882353,0.5450980392156862,0.5490196078431373,0.5372549019607843 ] } } @@ -11126,27 +11178,27 @@ } }, { - "id":"sampled103", + "id":"sampled104", "rectangle":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5098039215686274,0.5137254901960784,0.5176470588235295,0.5058823529411764, - 3600,0.5254901960784314,0.5294117647058824,0.5333333333333333,0.5215686274509804 + 0,0.5568627450980392,0.5607843137254902,0.5647058823529412,0.5529411764705883, + 3600,0.5725490196078431,0.5764705882352941,0.5803921568627451,0.5686274509803921 ] } } }, { - "id":"sampled104", + "id":"sampled105", "wall":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5411764705882353,0.5450980392156862,0.5490196078431373,0.5372549019607843, - 3600,0.5568627450980392,0.5607843137254902,0.5647058823529412,0.5529411764705883 + 0,0.5882352941176471,0.592156862745098,0.596078431372549,0.5843137254901961, + 3600,0.6039215686274509,0.6078431372549019,0.611764705882353,0.6 ] } } @@ -11154,7 +11206,7 @@ } }, { - "id":"sampled105", + "id":"sampled106", "wall":{ "material":{ "image":{ @@ -11168,8 +11220,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,91,92,93,90, - 3600,95,96,97,94 + 0,103,104,105,102, + 3600,107,108,109,106 ] } } @@ -11177,22 +11229,22 @@ } }, { - "id":"sampled106", + "id":"sampled107", "wall":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,99,100,101,98, - 3600,103,104,105,102 + 0,111,112,113,110, + 3600,115,116,117,114 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,372, - 3600,373 + 0,375, + 3600,376 ] }, "lineCount":{ @@ -11221,36 +11273,36 @@ } }, { - "id":"sampled107", + "id":"sampled108", "wall":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,107,108,109,106, - 3600,111,112,113,110 + 0,119,120,121,118, + 3600,123,124,125,122 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,115,116,117,114, - 3600,119,120,121,118 + 0,127,128,129,126, + 3600,131,132,133,130 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,374, - 3600,375 + 0,377, + 3600,378 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,376, - 3600,377 + 0,379, + 3600,380 ] } } @@ -11258,15 +11310,15 @@ } }, { - "id":"sampled108", + "id":"sampled109", "wall":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5725490196078431,0.5764705882352941,0.5803921568627451,0.5686274509803921, - 3600,0.5882352941176471,0.592156862745098,0.596078431372549,0.5843137254901961 + 0,0.6196078431372549,0.6235294117647059,0.6274509803921569,0.615686274509804, + 3600,0.6352941176470588,0.6392156862745098,0.6431372549019608,0.6313725490196078 ] } } @@ -11274,15 +11326,15 @@ } }, { - "id":"sampled109", + "id":"sampled110", "wall":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6039215686274509,0.6078431372549019,0.611764705882353,0.6, - 3600,0.6196078431372549,0.6235294117647059,0.6274509803921569,0.615686274509804 + 0,0.6509803921568628,0.6549019607843137,0.6588235294117647,0.6470588235294118, + 3600,0.6666666666666666,0.6705882352941176,0.6745098039215687,0.6627450980392157 ] } } @@ -11290,15 +11342,15 @@ } }, { - "id":"sampled110", + "id":"sampled111", "wall":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6352941176470588,0.6392156862745098,0.6431372549019608,0.6313725490196078, - 3600,0.6509803921568628,0.6549019607843137,0.6588235294117647,0.6470588235294118 + 0,0.6823529411764706,0.6862745098039216,0.6901960784313725,0.6784313725490196, + 3600,0.6980392156862745,0.7019607843137254,0.7058823529411765,0.6941176470588235 ] } } @@ -11306,15 +11358,15 @@ } }, { - "id":"sampled111", + "id":"sampled112", "wall":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6666666666666666,0.6705882352941176,0.6745098039215687,0.6627450980392157, - 3600,0.6823529411764706,0.6862745098039216,0.6901960784313725,0.6784313725490196 + 0,0.7137254901960784,0.7176470588235294,0.7215686274509804,0.7098039215686275, + 3600,0.7294117647058823,0.7333333333333333,0.7372549019607844,0.7254901960784313 ] } } @@ -11322,39 +11374,39 @@ } }, { - "id":"sampled112", + "id":"sampled113", "wall":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6980392156862745,0.7019607843137254,0.7058823529411765,0.6941176470588235, - 3600,0.7137254901960784,0.7176470588235294,0.7215686274509804,0.7098039215686275 + 0,0.7450980392156863,0.7490196078431373,0.7529411764705882,0.7411764705882353, + 3600,0.7607843137254902,0.7647058823529411,0.7686274509803922,0.7568627450980392 ] } } }, { - "id":"sampled113", + "id":"sampled114", "agi_conicSensor":{ "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7294117647058823,0.7333333333333333,0.7372549019607844,0.7254901960784313, - 3600,0.7450980392156863,0.7490196078431373,0.7529411764705882,0.7411764705882353 + 0,0.7764705882352941,0.7803921568627451,0.7843137254901961,0.7725490196078432, + 3600,0.792156862745098,0.796078431372549,0.8,0.788235294117647 ] } } }, { - "id":"sampled114", + "id":"sampled115", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7607843137254902,0.7647058823529411,0.7686274509803922,0.7568627450980392, - 3600,0.7764705882352941,0.7803921568627451,0.7843137254901961,0.7725490196078432 + 0,0.807843137254902,0.8117647058823529,0.8156862745098039,0.803921568627451, + 3600,0.8235294117647058,0.8274509803921568,0.8313725490196079,0.8196078431372549 ] } } @@ -11362,7 +11414,7 @@ } }, { - "id":"sampled115", + "id":"sampled116", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "image":{ @@ -11376,8 +11428,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,123,124,125,122, - 3600,127,128,129,126 + 0,135,136,137,134, + 3600,139,140,141,138 ] } } @@ -11385,22 +11437,22 @@ } }, { - "id":"sampled116", + "id":"sampled117", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,131,132,133,130, - 3600,135,136,137,134 + 0,143,144,145,142, + 3600,147,148,149,146 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,378, - 3600,379 + 0,381, + 3600,382 ] }, "lineCount":{ @@ -11429,36 +11481,36 @@ } }, { - "id":"sampled117", + "id":"sampled118", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,139,140,141,138, - 3600,143,144,145,142 + 0,151,152,153,150, + 3600,155,156,157,154 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,147,148,149,146, - 3600,151,152,153,150 + 0,159,160,161,158, + 3600,163,164,165,162 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,380, - 3600,381 + 0,383, + 3600,384 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,382, - 3600,383 + 0,385, + 3600,386 ] } } @@ -11466,15 +11518,15 @@ } }, { - "id":"sampled118", + "id":"sampled119", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.792156862745098,0.796078431372549,0.8,0.788235294117647, - 3600,0.807843137254902,0.8117647058823529,0.8156862745098039,0.803921568627451 + 0,0.8392156862745098,0.8431372549019608,0.8470588235294118,0.8352941176470589, + 3600,0.8549019607843137,0.8588235294117647,0.8627450980392157,0.8509803921568627 ] } } @@ -11482,15 +11534,15 @@ } }, { - "id":"sampled119", + "id":"sampled120", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8235294117647058,0.8274509803921568,0.8313725490196079,0.8196078431372549, - 3600,0.8392156862745098,0.8431372549019608,0.8470588235294118,0.8352941176470589 + 0,0.8705882352941177,0.8745098039215686,0.8784313725490196,0.8666666666666667, + 3600,0.8862745098039215,0.8901960784313725,0.8941176470588236,0.8823529411764706 ] } } @@ -11498,15 +11550,15 @@ } }, { - "id":"sampled120", + "id":"sampled121", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8549019607843137,0.8588235294117647,0.8627450980392157,0.8509803921568627, - 3600,0.8705882352941177,0.8745098039215686,0.8784313725490196,0.8666666666666667 + 0,0.9019607843137255,0.9058823529411765,0.9098039215686274,0.8980392156862745, + 3600,0.9176470588235294,0.9215686274509803,0.9254901960784314,0.9137254901960784 ] } } @@ -11514,15 +11566,15 @@ } }, { - "id":"sampled121", + "id":"sampled122", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8862745098039215,0.8901960784313725,0.8941176470588236,0.8823529411764706, - 3600,0.9019607843137255,0.9058823529411765,0.9098039215686274,0.8980392156862745 + 0,0.9333333333333333,0.9372549019607843,0.9411764705882353,0.9294117647058824, + 3600,0.9490196078431372,0.9529411764705882,0.9568627450980393,0.9450980392156862 ] } } @@ -11530,15 +11582,15 @@ } }, { - "id":"sampled122", + "id":"sampled123", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9176470588235294,0.9215686274509803,0.9254901960784314,0.9137254901960784, - 3600,0.9333333333333333,0.9372549019607843,0.9411764705882353,0.9294117647058824 + 0,0.9647058823529412,0.9686274509803922,0.9725490196078431,0.9607843137254902, + 3600,0.9803921568627451,0.984313725490196,0.9882352941176471,0.9764705882352941 ] } } @@ -11546,7 +11598,7 @@ } }, { - "id":"sampled123", + "id":"sampled124", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ @@ -11560,8 +11612,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,155,156,157,154, - 3600,159,160,161,158 + 0,167,168,169,166, + 3600,171,172,173,170 ] } } @@ -11569,22 +11621,22 @@ } }, { - "id":"sampled124", + "id":"sampled125", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,163,164,165,162, - 3600,167,168,169,166 + 0,175,176,177,174, + 3600,179,180,181,178 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,384, - 3600,385 + 0,387, + 3600,388 ] }, "lineCount":{ @@ -11613,36 +11665,36 @@ } }, { - "id":"sampled125", + "id":"sampled126", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,171,172,173,170, - 3600,175,176,177,174 + 0,183,184,185,182, + 3600,187,188,189,186 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,179,180,181,178, - 3600,183,184,185,182 + 0,191,192,193,190, + 3600,195,196,197,194 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,386, - 3600,387 + 0,389, + 3600,390 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,388, - 3600,389 + 0,391, + 3600,392 ] } } @@ -11650,15 +11702,15 @@ } }, { - "id":"sampled126", + "id":"sampled127", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9490196078431372,0.9529411764705882,0.9568627450980393,0.9450980392156862, - 3600,0.9647058823529412,0.9686274509803922,0.9725490196078431,0.9607843137254902 + 0,0.996078431372549,0,0.00392156862745098,0.9921568627450981, + 3600,0.011764705882352941,0.01568627450980392,0.0196078431372549,0.00784313725490196 ] } } @@ -11666,15 +11718,15 @@ } }, { - "id":"sampled127", + "id":"sampled128", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9803921568627451,0.984313725490196,0.9882352941176471,0.9764705882352941, - 3600,0.996078431372549,0,0.00392156862745098,0.9921568627450981 + 0,0.027450980392156862,0.03137254901960784,0.03529411764705882,0.023529411764705882, + 3600,0.043137254901960784,0.047058823529411764,0.050980392156862744,0.0392156862745098 ] } } @@ -11682,15 +11734,15 @@ } }, { - "id":"sampled128", + "id":"sampled129", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.011764705882352941,0.01568627450980392,0.0196078431372549,0.00784313725490196, - 3600,0.027450980392156862,0.03137254901960784,0.03529411764705882,0.023529411764705882 + 0,0.058823529411764705,0.06274509803921569,0.06666666666666667,0.054901960784313725, + 3600,0.07450980392156863,0.0784313725490196,0.08235294117647059,0.07058823529411765 ] } } @@ -11698,15 +11750,15 @@ } }, { - "id":"sampled129", + "id":"sampled130", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.043137254901960784,0.047058823529411764,0.050980392156862744,0.0392156862745098, - 3600,0.058823529411764705,0.06274509803921569,0.06666666666666667,0.054901960784313725 + 0,0.09019607843137255,0.09411764705882353,0.09803921568627451,0.08627450980392157, + 3600,0.10588235294117647,0.10980392156862745,0.11372549019607843,0.10196078431372549 ] } } @@ -11714,15 +11766,15 @@ } }, { - "id":"sampled130", + "id":"sampled131", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.07450980392156863,0.0784313725490196,0.08235294117647059,0.07058823529411765, - 3600,0.09019607843137255,0.09411764705882353,0.09803921568627451,0.08627450980392157 + 0,0.12156862745098039,0.12549019607843137,0.12941176470588237,0.11764705882352941, + 3600,0.13725490196078433,0.1411764705882353,0.1450980392156863,0.13333333333333333 ] } } @@ -11730,7 +11782,7 @@ } }, { - "id":"sampled131", + "id":"sampled132", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ @@ -11744,8 +11796,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,187,188,189,186, - 3600,191,192,193,190 + 0,199,200,201,198, + 3600,203,204,205,202 ] } } @@ -11753,22 +11805,22 @@ } }, { - "id":"sampled132", + "id":"sampled133", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,195,196,197,194, - 3600,199,200,201,198 + 0,207,208,209,206, + 3600,211,212,213,210 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,390, - 3600,391 + 0,393, + 3600,394 ] }, "lineCount":{ @@ -11797,36 +11849,36 @@ } }, { - "id":"sampled133", + "id":"sampled134", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,203,204,205,202, - 3600,207,208,209,206 + 0,215,216,217,214, + 3600,219,220,221,218 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,211,212,213,210, - 3600,215,216,217,214 + 0,223,224,225,222, + 3600,227,228,229,226 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,392, - 3600,393 + 0,395, + 3600,396 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,394, - 3600,395 + 0,397, + 3600,398 ] } } @@ -11834,15 +11886,15 @@ } }, { - "id":"sampled134", + "id":"sampled135", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.10588235294117647,0.10980392156862745,0.11372549019607843,0.10196078431372549, - 3600,0.12156862745098039,0.12549019607843137,0.12941176470588237,0.11764705882352941 + 0,0.15294117647058825,0.1568627450980392,0.1607843137254902,0.14901960784313725, + 3600,0.16862745098039217,0.17254901960784313,0.17647058823529413,0.16470588235294117 ] } } @@ -11850,15 +11902,15 @@ } }, { - "id":"sampled135", + "id":"sampled136", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.13725490196078433,0.1411764705882353,0.1450980392156863,0.13333333333333333, - 3600,0.15294117647058825,0.1568627450980392,0.1607843137254902,0.14901960784313725 + 0,0.1843137254901961,0.18823529411764706,0.19215686274509805,0.1803921568627451, + 3600,0.2,0.20392156862745098,0.20784313725490197,0.19607843137254902 ] } } @@ -11866,15 +11918,15 @@ } }, { - "id":"sampled136", + "id":"sampled137", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.16862745098039217,0.17254901960784313,0.17647058823529413,0.16470588235294117, - 3600,0.1843137254901961,0.18823529411764706,0.19215686274509805,0.1803921568627451 + 0,0.21568627450980393,0.2196078431372549,0.2235294117647059,0.21176470588235294, + 3600,0.23137254901960785,0.23529411764705882,0.23921568627450981,0.22745098039215686 ] } } @@ -11882,15 +11934,15 @@ } }, { - "id":"sampled137", + "id":"sampled138", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.2,0.20392156862745098,0.20784313725490197,0.19607843137254902, - 3600,0.21568627450980393,0.2196078431372549,0.2235294117647059,0.21176470588235294 + 0,0.24705882352941178,0.25098039215686274,0.2549019607843137,0.24313725490196078, + 3600,0.2627450980392157,0.26666666666666666,0.27058823529411763,0.25882352941176473 ] } } @@ -11898,15 +11950,15 @@ } }, { - "id":"sampled138", + "id":"sampled139", "agi_conicSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.23137254901960785,0.23529411764705882,0.23921568627450981,0.22745098039215686, - 3600,0.24705882352941178,0.25098039215686274,0.2549019607843137,0.24313725490196078 + 0,0.2784313725490196,0.2823529411764706,0.28627450980392155,0.27450980392156865, + 3600,0.29411764705882354,0.2980392156862745,0.30196078431372547,0.2901960784313726 ] } } @@ -11914,7 +11966,7 @@ } }, { - "id":"sampled139", + "id":"sampled140", "agi_conicSensor":{ "domeSurfaceMaterial":{ "image":{ @@ -11928,8 +11980,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,219,220,221,218, - 3600,223,224,225,222 + 0,231,232,233,230, + 3600,235,236,237,234 ] } } @@ -11937,22 +11989,22 @@ } }, { - "id":"sampled140", + "id":"sampled141", "agi_conicSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,227,228,229,226, - 3600,231,232,233,230 + 0,239,240,241,238, + 3600,243,244,245,242 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,396, - 3600,397 + 0,399, + 3600,400 ] }, "lineCount":{ @@ -11981,36 +12033,36 @@ } }, { - "id":"sampled141", + "id":"sampled142", "agi_conicSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,235,236,237,234, - 3600,239,240,241,238 + 0,247,248,249,246, + 3600,251,252,253,250 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,243,244,245,242, - 3600,247,248,249,246 + 0,0,1,2,254, + 3600,4,5,6,3 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,398, - 3600,399 + 0,401, + 3600,402 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,400, - 3600,401 + 0,403, + 3600,404 ] } } @@ -12018,15 +12070,15 @@ } }, { - "id":"sampled142", + "id":"sampled143", "agi_conicSensor":{ "domeSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.2627450980392157,0.26666666666666666,0.27058823529411763,0.25882352941176473, - 3600,0.2784313725490196,0.2823529411764706,0.28627450980392155,0.27450980392156865 + 0,0.30980392156862746,0.3137254901960784,0.3176470588235294,0.3058823529411765, + 3600,0.3254901960784314,0.32941176470588235,0.3333333333333333,0.3215686274509804 ] } } @@ -12034,15 +12086,15 @@ } }, { - "id":"sampled143", + "id":"sampled144", "agi_conicSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.29411764705882354,0.2980392156862745,0.30196078431372547,0.2901960784313726, - 3600,0.30980392156862746,0.3137254901960784,0.3176470588235294,0.3058823529411765 + 0,0.3411764705882353,0.34509803921568627,0.34901960784313724,0.33725490196078434, + 3600,0.3568627450980392,0.3607843137254902,0.36470588235294116,0.35294117647058826 ] } } @@ -12050,15 +12102,15 @@ } }, { - "id":"sampled144", + "id":"sampled145", "agi_conicSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3254901960784314,0.32941176470588235,0.3333333333333333,0.3215686274509804, - 3600,0.3411764705882353,0.34509803921568627,0.34901960784313724,0.33725490196078434 + 0,0.37254901960784315,0.3764705882352941,0.3803921568627451,0.3686274509803922, + 3600,0.38823529411764707,0.39215686274509803,0.396078431372549,0.3843137254901961 ] } } @@ -12066,15 +12118,15 @@ } }, { - "id":"sampled145", + "id":"sampled146", "agi_conicSensor":{ "domeSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3568627450980392,0.3607843137254902,0.36470588235294116,0.35294117647058826, - 3600,0.37254901960784315,0.3764705882352941,0.3803921568627451,0.3686274509803922 + 0,0.403921568627451,0.40784313725490196,0.4117647058823529,0.4, + 3600,0.4196078431372549,0.4235294117647059,0.42745098039215684,0.41568627450980394 ] } } @@ -12082,15 +12134,15 @@ } }, { - "id":"sampled146", + "id":"sampled147", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.38823529411764707,0.39215686274509803,0.396078431372549,0.3843137254901961, - 3600,0.403921568627451,0.40784313725490196,0.4117647058823529,0.4 + 0,0.43529411764705883,0.4392156862745098,0.44313725490196076,0.43137254901960786, + 3600,0.45098039215686275,0.4549019607843137,0.4588235294117647,0.4470588235294118 ] } } @@ -12098,7 +12150,7 @@ } }, { - "id":"sampled147", + "id":"sampled148", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "image":{ @@ -12112,8 +12164,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,251,252,253,250, - 3600,0,1,2,254 + 0,8,9,10,7, + 3600,12,13,14,11 ] } } @@ -12121,22 +12173,22 @@ } }, { - "id":"sampled148", + "id":"sampled149", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,4,5,6,3, - 3600,8,9,10,7 + 0,16,17,18,15, + 3600,20,21,22,19 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,402, - 3600,403 + 0,405, + 3600,406 ] }, "lineCount":{ @@ -12165,36 +12217,36 @@ } }, { - "id":"sampled149", + "id":"sampled150", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,12,13,14,11, - 3600,16,17,18,15 + 0,24,25,26,23, + 3600,28,29,30,27 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,20,21,22,19, - 3600,24,25,26,23 + 0,32,33,34,31, + 3600,36,37,38,35 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,404, - 3600,405 + 0,407, + 3600,408 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,406, - 3600,407 + 0,409, + 3600,410 ] } } @@ -12202,15 +12254,15 @@ } }, { - "id":"sampled150", + "id":"sampled151", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4196078431372549,0.4235294117647059,0.42745098039215684,0.41568627450980394, - 3600,0.43529411764705883,0.4392156862745098,0.44313725490196076,0.43137254901960786 + 0,0.4666666666666667,0.47058823529411764,0.4745098039215686,0.4627450980392157, + 3600,0.4823529411764706,0.48627450980392156,0.49019607843137253,0.47843137254901963 ] } } @@ -12218,15 +12270,15 @@ } }, { - "id":"sampled151", + "id":"sampled152", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.45098039215686275,0.4549019607843137,0.4588235294117647,0.4470588235294118, - 3600,0.4666666666666667,0.47058823529411764,0.4745098039215686,0.4627450980392157 + 0,0.4980392156862745,0.5019607843137255,0.5058823529411764,0.49411764705882355, + 3600,0.5137254901960784,0.5176470588235295,0.5215686274509804,0.5098039215686274 ] } } @@ -12234,15 +12286,15 @@ } }, { - "id":"sampled152", + "id":"sampled153", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4823529411764706,0.48627450980392156,0.49019607843137253,0.47843137254901963, - 3600,0.4980392156862745,0.5019607843137255,0.5058823529411764,0.49411764705882355 + 0,0.5294117647058824,0.5333333333333333,0.5372549019607843,0.5254901960784314, + 3600,0.5450980392156862,0.5490196078431373,0.5529411764705883,0.5411764705882353 ] } } @@ -12250,15 +12302,15 @@ } }, { - "id":"sampled153", + "id":"sampled154", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5137254901960784,0.5176470588235295,0.5215686274509804,0.5098039215686274, - 3600,0.5294117647058824,0.5333333333333333,0.5372549019607843,0.5254901960784314 + 0,0.5607843137254902,0.5647058823529412,0.5686274509803921,0.5568627450980392, + 3600,0.5764705882352941,0.5803921568627451,0.5843137254901961,0.5725490196078431 ] } } @@ -12266,39 +12318,39 @@ } }, { - "id":"sampled154", + "id":"sampled155", "agi_conicSensor":{ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5450980392156862,0.5490196078431373,0.5529411764705883,0.5411764705882353, - 3600,0.5607843137254902,0.5647058823529412,0.5686274509803921,0.5568627450980392 + 0,0.592156862745098,0.596078431372549,0.6,0.5882352941176471, + 3600,0.6078431372549019,0.611764705882353,0.615686274509804,0.6039215686274509 ] } } }, { - "id":"sampled155", + "id":"sampled156", "agi_customPatternSensor":{ "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5764705882352941,0.5803921568627451,0.5843137254901961,0.5725490196078431, - 3600,0.592156862745098,0.596078431372549,0.6,0.5882352941176471 + 0,0.6235294117647059,0.6274509803921569,0.6313725490196078,0.6196078431372549, + 3600,0.6392156862745098,0.6431372549019608,0.6470588235294118,0.6352941176470588 ] } } }, { - "id":"sampled156", + "id":"sampled157", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6078431372549019,0.611764705882353,0.615686274509804,0.6039215686274509, - 3600,0.6235294117647059,0.6274509803921569,0.6313725490196078,0.6196078431372549 + 0,0.6549019607843137,0.6588235294117647,0.6627450980392157,0.6509803921568628, + 3600,0.6705882352941176,0.6745098039215687,0.6784313725490196,0.6666666666666666 ] } } @@ -12306,7 +12358,7 @@ } }, { - "id":"sampled157", + "id":"sampled158", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "image":{ @@ -12320,8 +12372,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,28,29,30,27, - 3600,32,33,34,31 + 0,40,41,42,39, + 3600,44,45,46,43 ] } } @@ -12329,22 +12381,22 @@ } }, { - "id":"sampled158", + "id":"sampled159", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,36,37,38,35, - 3600,40,41,42,39 + 0,48,49,50,47, + 3600,52,53,54,51 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,408, - 3600,409 + 0,411, + 3600,412 ] }, "lineCount":{ @@ -12373,36 +12425,36 @@ } }, { - "id":"sampled159", + "id":"sampled160", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,44,45,46,43, - 3600,48,49,50,47 + 0,56,57,58,55, + 3600,60,61,62,59 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,52,53,54,51, - 3600,56,57,58,55 + 0,64,65,66,63, + 3600,68,69,70,67 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,410, - 3600,411 + 0,413, + 3600,414 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,412, - 3600,413 + 0,415, + 3600,416 ] } } @@ -12410,15 +12462,15 @@ } }, { - "id":"sampled160", + "id":"sampled161", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6392156862745098,0.6431372549019608,0.6470588235294118,0.6352941176470588, - 3600,0.6549019607843137,0.6588235294117647,0.6627450980392157,0.6509803921568628 + 0,0.6862745098039216,0.6901960784313725,0.6941176470588235,0.6823529411764706, + 3600,0.7019607843137254,0.7058823529411765,0.7098039215686275,0.6980392156862745 ] } } @@ -12426,15 +12478,15 @@ } }, { - "id":"sampled161", + "id":"sampled162", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6705882352941176,0.6745098039215687,0.6784313725490196,0.6666666666666666, - 3600,0.6862745098039216,0.6901960784313725,0.6941176470588235,0.6823529411764706 + 0,0.7176470588235294,0.7215686274509804,0.7254901960784313,0.7137254901960784, + 3600,0.7333333333333333,0.7372549019607844,0.7411764705882353,0.7294117647058823 ] } } @@ -12442,15 +12494,15 @@ } }, { - "id":"sampled162", + "id":"sampled163", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7019607843137254,0.7058823529411765,0.7098039215686275,0.6980392156862745, - 3600,0.7176470588235294,0.7215686274509804,0.7254901960784313,0.7137254901960784 + 0,0.7490196078431373,0.7529411764705882,0.7568627450980392,0.7450980392156863, + 3600,0.7647058823529411,0.7686274509803922,0.7725490196078432,0.7607843137254902 ] } } @@ -12458,15 +12510,15 @@ } }, { - "id":"sampled163", + "id":"sampled164", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7333333333333333,0.7372549019607844,0.7411764705882353,0.7294117647058823, - 3600,0.7490196078431373,0.7529411764705882,0.7568627450980392,0.7450980392156863 + 0,0.7803921568627451,0.7843137254901961,0.788235294117647,0.7764705882352941, + 3600,0.796078431372549,0.8,0.803921568627451,0.792156862745098 ] } } @@ -12474,15 +12526,15 @@ } }, { - "id":"sampled164", + "id":"sampled165", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7647058823529411,0.7686274509803922,0.7725490196078432,0.7607843137254902, - 3600,0.7803921568627451,0.7843137254901961,0.788235294117647,0.7764705882352941 + 0,0.8117647058823529,0.8156862745098039,0.8196078431372549,0.807843137254902, + 3600,0.8274509803921568,0.8313725490196079,0.8352941176470589,0.8235294117647058 ] } } @@ -12490,7 +12542,7 @@ } }, { - "id":"sampled165", + "id":"sampled166", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ @@ -12504,8 +12556,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,60,61,62,59, - 3600,64,65,66,63 + 0,72,73,74,71, + 3600,76,77,78,75 ] } } @@ -12513,22 +12565,22 @@ } }, { - "id":"sampled166", + "id":"sampled167", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,68,69,70,67, - 3600,72,73,74,71 + 0,80,81,82,79, + 3600,84,85,86,83 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,414, - 3600,415 + 0,417, + 3600,418 ] }, "lineCount":{ @@ -12557,36 +12609,36 @@ } }, { - "id":"sampled167", + "id":"sampled168", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,76,77,78,75, - 3600,80,81,82,79 + 0,88,89,90,87, + 3600,92,93,94,91 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,84,85,86,83, - 3600,88,89,90,87 + 0,96,97,98,95, + 3600,100,101,102,99 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,416, - 3600,417 + 0,419, + 3600,420 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,418, - 3600,419 + 0,421, + 3600,422 ] } } @@ -12594,15 +12646,15 @@ } }, { - "id":"sampled168", + "id":"sampled169", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.796078431372549,0.8,0.803921568627451,0.792156862745098, - 3600,0.8117647058823529,0.8156862745098039,0.8196078431372549,0.807843137254902 + 0,0.8431372549019608,0.8470588235294118,0.8509803921568627,0.8392156862745098, + 3600,0.8588235294117647,0.8627450980392157,0.8666666666666667,0.8549019607843137 ] } } @@ -12610,15 +12662,15 @@ } }, { - "id":"sampled169", + "id":"sampled170", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8274509803921568,0.8313725490196079,0.8352941176470589,0.8235294117647058, - 3600,0.8431372549019608,0.8470588235294118,0.8509803921568627,0.8392156862745098 + 0,0.8745098039215686,0.8784313725490196,0.8823529411764706,0.8705882352941177, + 3600,0.8901960784313725,0.8941176470588236,0.8980392156862745,0.8862745098039215 ] } } @@ -12626,15 +12678,15 @@ } }, { - "id":"sampled170", + "id":"sampled171", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8588235294117647,0.8627450980392157,0.8666666666666667,0.8549019607843137, - 3600,0.8745098039215686,0.8784313725490196,0.8823529411764706,0.8705882352941177 + 0,0.9058823529411765,0.9098039215686274,0.9137254901960784,0.9019607843137255, + 3600,0.9215686274509803,0.9254901960784314,0.9294117647058824,0.9176470588235294 ] } } @@ -12642,15 +12694,15 @@ } }, { - "id":"sampled171", + "id":"sampled172", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8901960784313725,0.8941176470588236,0.8980392156862745,0.8862745098039215, - 3600,0.9058823529411765,0.9098039215686274,0.9137254901960784,0.9019607843137255 + 0,0.9372549019607843,0.9411764705882353,0.9450980392156862,0.9333333333333333, + 3600,0.9529411764705882,0.9568627450980393,0.9607843137254902,0.9490196078431372 ] } } @@ -12658,15 +12710,15 @@ } }, { - "id":"sampled172", + "id":"sampled173", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9215686274509803,0.9254901960784314,0.9294117647058824,0.9176470588235294, - 3600,0.9372549019607843,0.9411764705882353,0.9450980392156862,0.9333333333333333 + 0,0.9686274509803922,0.9725490196078431,0.9764705882352941,0.9647058823529412, + 3600,0.984313725490196,0.9882352941176471,0.9921568627450981,0.9803921568627451 ] } } @@ -12674,7 +12726,7 @@ } }, { - "id":"sampled173", + "id":"sampled174", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ @@ -12688,8 +12740,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,92,93,94,91, - 3600,96,97,98,95 + 0,104,105,106,103, + 3600,108,109,110,107 ] } } @@ -12697,22 +12749,22 @@ } }, { - "id":"sampled174", + "id":"sampled175", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,100,101,102,99, - 3600,104,105,106,103 + 0,112,113,114,111, + 3600,116,117,118,115 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,420, - 3600,421 + 0,423, + 3600,424 ] }, "lineCount":{ @@ -12741,36 +12793,36 @@ } }, { - "id":"sampled175", + "id":"sampled176", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,108,109,110,107, - 3600,112,113,114,111 + 0,120,121,122,119, + 3600,124,125,126,123 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,116,117,118,115, - 3600,120,121,122,119 + 0,128,129,130,127, + 3600,132,133,134,131 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,422, - 3600,423 + 0,425, + 3600,426 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,424, - 3600,425 + 0,427, + 3600,428 ] } } @@ -12778,15 +12830,15 @@ } }, { - "id":"sampled176", + "id":"sampled177", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9529411764705882,0.9568627450980393,0.9607843137254902,0.9490196078431372, - 3600,0.9686274509803922,0.9725490196078431,0.9764705882352941,0.9647058823529412 + 0,0,0.00392156862745098,0.00784313725490196,0.996078431372549, + 3600,0.01568627450980392,0.0196078431372549,0.023529411764705882,0.011764705882352941 ] } } @@ -12794,15 +12846,15 @@ } }, { - "id":"sampled177", + "id":"sampled178", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.984313725490196,0.9882352941176471,0.9921568627450981,0.9803921568627451, - 3600,0,0.00392156862745098,0.00784313725490196,0.996078431372549 + 0,0.03137254901960784,0.03529411764705882,0.0392156862745098,0.027450980392156862, + 3600,0.047058823529411764,0.050980392156862744,0.054901960784313725,0.043137254901960784 ] } } @@ -12810,15 +12862,15 @@ } }, { - "id":"sampled178", + "id":"sampled179", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.01568627450980392,0.0196078431372549,0.023529411764705882,0.011764705882352941, - 3600,0.03137254901960784,0.03529411764705882,0.0392156862745098,0.027450980392156862 + 0,0.06274509803921569,0.06666666666666667,0.07058823529411765,0.058823529411764705, + 3600,0.0784313725490196,0.08235294117647059,0.08627450980392157,0.07450980392156863 ] } } @@ -12826,15 +12878,15 @@ } }, { - "id":"sampled179", + "id":"sampled180", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.047058823529411764,0.050980392156862744,0.054901960784313725,0.043137254901960784, - 3600,0.06274509803921569,0.06666666666666667,0.07058823529411765,0.058823529411764705 + 0,0.09411764705882353,0.09803921568627451,0.10196078431372549,0.09019607843137255, + 3600,0.10980392156862745,0.11372549019607843,0.11764705882352941,0.10588235294117647 ] } } @@ -12842,15 +12894,15 @@ } }, { - "id":"sampled180", + "id":"sampled181", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.0784313725490196,0.08235294117647059,0.08627450980392157,0.07450980392156863, - 3600,0.09411764705882353,0.09803921568627451,0.10196078431372549,0.09019607843137255 + 0,0.12549019607843137,0.12941176470588237,0.13333333333333333,0.12156862745098039, + 3600,0.1411764705882353,0.1450980392156863,0.14901960784313725,0.13725490196078433 ] } } @@ -12858,7 +12910,7 @@ } }, { - "id":"sampled181", + "id":"sampled182", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "image":{ @@ -12872,8 +12924,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,124,125,126,123, - 3600,128,129,130,127 + 0,136,137,138,135, + 3600,140,141,142,139 ] } } @@ -12881,22 +12933,22 @@ } }, { - "id":"sampled182", + "id":"sampled183", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,132,133,134,131, - 3600,136,137,138,135 + 0,144,145,146,143, + 3600,148,149,150,147 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,426, - 3600,427 + 0,429, + 3600,430 ] }, "lineCount":{ @@ -12925,36 +12977,36 @@ } }, { - "id":"sampled183", + "id":"sampled184", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,140,141,142,139, - 3600,144,145,146,143 + 0,152,153,154,151, + 3600,156,157,158,155 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,148,149,150,147, - 3600,152,153,154,151 + 0,160,161,162,159, + 3600,164,165,166,163 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,428, - 3600,429 + 0,431, + 3600,432 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,430, - 3600,431 + 0,433, + 3600,434 ] } } @@ -12962,15 +13014,15 @@ } }, { - "id":"sampled184", + "id":"sampled185", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.10980392156862745,0.11372549019607843,0.11764705882352941,0.10588235294117647, - 3600,0.12549019607843137,0.12941176470588237,0.13333333333333333,0.12156862745098039 + 0,0.1568627450980392,0.1607843137254902,0.16470588235294117,0.15294117647058825, + 3600,0.17254901960784313,0.17647058823529413,0.1803921568627451,0.16862745098039217 ] } } @@ -12978,15 +13030,15 @@ } }, { - "id":"sampled185", + "id":"sampled186", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.1411764705882353,0.1450980392156863,0.14901960784313725,0.13725490196078433, - 3600,0.1568627450980392,0.1607843137254902,0.16470588235294117,0.15294117647058825 + 0,0.18823529411764706,0.19215686274509805,0.19607843137254902,0.1843137254901961, + 3600,0.20392156862745098,0.20784313725490197,0.21176470588235294,0.2 ] } } @@ -12994,15 +13046,15 @@ } }, { - "id":"sampled186", + "id":"sampled187", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.17254901960784313,0.17647058823529413,0.1803921568627451,0.16862745098039217, - 3600,0.18823529411764706,0.19215686274509805,0.19607843137254902,0.1843137254901961 + 0,0.2196078431372549,0.2235294117647059,0.22745098039215686,0.21568627450980393, + 3600,0.23529411764705882,0.23921568627450981,0.24313725490196078,0.23137254901960785 ] } } @@ -13010,15 +13062,15 @@ } }, { - "id":"sampled187", + "id":"sampled188", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.20392156862745098,0.20784313725490197,0.21176470588235294,0.2, - 3600,0.2196078431372549,0.2235294117647059,0.22745098039215686,0.21568627450980393 + 0,0.25098039215686274,0.2549019607843137,0.25882352941176473,0.24705882352941178, + 3600,0.26666666666666666,0.27058823529411763,0.27450980392156865,0.2627450980392157 ] } } @@ -13026,15 +13078,15 @@ } }, { - "id":"sampled188", + "id":"sampled189", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.23529411764705882,0.23921568627450981,0.24313725490196078,0.23137254901960785, - 3600,0.25098039215686274,0.2549019607843137,0.25882352941176473,0.24705882352941178 + 0,0.2823529411764706,0.28627450980392155,0.2901960784313726,0.2784313725490196, + 3600,0.2980392156862745,0.30196078431372547,0.3058823529411765,0.29411764705882354 ] } } @@ -13042,7 +13094,7 @@ } }, { - "id":"sampled189", + "id":"sampled190", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "image":{ @@ -13056,8 +13108,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,156,157,158,155, - 3600,160,161,162,159 + 0,168,169,170,167, + 3600,172,173,174,171 ] } } @@ -13065,22 +13117,22 @@ } }, { - "id":"sampled190", + "id":"sampled191", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,164,165,166,163, - 3600,168,169,170,167 + 0,176,177,178,175, + 3600,180,181,182,179 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,432, - 3600,433 + 0,435, + 3600,436 ] }, "lineCount":{ @@ -13109,36 +13161,36 @@ } }, { - "id":"sampled191", + "id":"sampled192", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,172,173,174,171, - 3600,176,177,178,175 + 0,184,185,186,183, + 3600,188,189,190,187 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,180,181,182,179, - 3600,184,185,186,183 + 0,192,193,194,191, + 3600,196,197,198,195 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,434, - 3600,435 + 0,437, + 3600,438 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,436, - 3600,437 + 0,439, + 3600,440 ] } } @@ -13146,15 +13198,15 @@ } }, { - "id":"sampled192", + "id":"sampled193", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.26666666666666666,0.27058823529411763,0.27450980392156865,0.2627450980392157, - 3600,0.2823529411764706,0.28627450980392155,0.2901960784313726,0.2784313725490196 + 0,0.3137254901960784,0.3176470588235294,0.3215686274509804,0.30980392156862746, + 3600,0.32941176470588235,0.3333333333333333,0.33725490196078434,0.3254901960784314 ] } } @@ -13162,15 +13214,15 @@ } }, { - "id":"sampled193", + "id":"sampled194", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.2980392156862745,0.30196078431372547,0.3058823529411765,0.29411764705882354, - 3600,0.3137254901960784,0.3176470588235294,0.3215686274509804,0.30980392156862746 + 0,0.34509803921568627,0.34901960784313724,0.35294117647058826,0.3411764705882353, + 3600,0.3607843137254902,0.36470588235294116,0.3686274509803922,0.3568627450980392 ] } } @@ -13178,15 +13230,15 @@ } }, { - "id":"sampled194", + "id":"sampled195", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.32941176470588235,0.3333333333333333,0.33725490196078434,0.3254901960784314, - 3600,0.34509803921568627,0.34901960784313724,0.35294117647058826,0.3411764705882353 + 0,0.3764705882352941,0.3803921568627451,0.3843137254901961,0.37254901960784315, + 3600,0.39215686274509803,0.396078431372549,0.4,0.38823529411764707 ] } } @@ -13194,15 +13246,15 @@ } }, { - "id":"sampled195", + "id":"sampled196", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3607843137254902,0.36470588235294116,0.3686274509803922,0.3568627450980392, - 3600,0.3764705882352941,0.3803921568627451,0.3843137254901961,0.37254901960784315 + 0,0.40784313725490196,0.4117647058823529,0.41568627450980394,0.403921568627451, + 3600,0.4235294117647059,0.42745098039215684,0.43137254901960786,0.4196078431372549 ] } } @@ -13210,39 +13262,39 @@ } }, { - "id":"sampled196", + "id":"sampled197", "agi_customPatternSensor":{ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.39215686274509803,0.396078431372549,0.4,0.38823529411764707, - 3600,0.40784313725490196,0.4117647058823529,0.41568627450980394,0.403921568627451 + 0,0.4392156862745098,0.44313725490196076,0.4470588235294118,0.43529411764705883, + 3600,0.4549019607843137,0.4588235294117647,0.4627450980392157,0.45098039215686275 ] } } }, { - "id":"sampled197", + "id":"sampled198", "agi_rectangularSensor":{ "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4235294117647059,0.42745098039215684,0.43137254901960786,0.4196078431372549, - 3600,0.4392156862745098,0.44313725490196076,0.4470588235294118,0.43529411764705883 + 0,0.47058823529411764,0.4745098039215686,0.47843137254901963,0.4666666666666667, + 3600,0.48627450980392156,0.49019607843137253,0.49411764705882355,0.4823529411764706 ] } } }, { - "id":"sampled198", + "id":"sampled199", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4549019607843137,0.4588235294117647,0.4627450980392157,0.45098039215686275, - 3600,0.47058823529411764,0.4745098039215686,0.47843137254901963,0.4666666666666667 + 0,0.5019607843137255,0.5058823529411764,0.5098039215686274,0.4980392156862745, + 3600,0.5176470588235295,0.5215686274509804,0.5254901960784314,0.5137254901960784 ] } } @@ -13250,7 +13302,7 @@ } }, { - "id":"sampled199", + "id":"sampled200", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "image":{ @@ -13264,8 +13316,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,188,189,190,187, - 3600,192,193,194,191 + 0,200,201,202,199, + 3600,204,205,206,203 ] } } @@ -13273,22 +13325,22 @@ } }, { - "id":"sampled200", + "id":"sampled201", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,196,197,198,195, - 3600,200,201,202,199 + 0,208,209,210,207, + 3600,212,213,214,211 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,438, - 3600,439 + 0,441, + 3600,442 ] }, "lineCount":{ @@ -13317,36 +13369,36 @@ } }, { - "id":"sampled201", + "id":"sampled202", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,204,205,206,203, - 3600,208,209,210,207 + 0,216,217,218,215, + 3600,220,221,222,219 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,212,213,214,211, - 3600,216,217,218,215 + 0,224,225,226,223, + 3600,228,229,230,227 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,440, - 3600,441 + 0,443, + 3600,444 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,442, - 3600,443 + 0,445, + 3600,446 ] } } @@ -13354,15 +13406,15 @@ } }, { - "id":"sampled202", + "id":"sampled203", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.48627450980392156,0.49019607843137253,0.49411764705882355,0.4823529411764706, - 3600,0.5019607843137255,0.5058823529411764,0.5098039215686274,0.4980392156862745 + 0,0.5333333333333333,0.5372549019607843,0.5411764705882353,0.5294117647058824, + 3600,0.5490196078431373,0.5529411764705883,0.5568627450980392,0.5450980392156862 ] } } @@ -13370,15 +13422,15 @@ } }, { - "id":"sampled203", + "id":"sampled204", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5176470588235295,0.5215686274509804,0.5254901960784314,0.5137254901960784, - 3600,0.5333333333333333,0.5372549019607843,0.5411764705882353,0.5294117647058824 + 0,0.5647058823529412,0.5686274509803921,0.5725490196078431,0.5607843137254902, + 3600,0.5803921568627451,0.5843137254901961,0.5882352941176471,0.5764705882352941 ] } } @@ -13386,15 +13438,15 @@ } }, { - "id":"sampled204", + "id":"sampled205", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5490196078431373,0.5529411764705883,0.5568627450980392,0.5450980392156862, - 3600,0.5647058823529412,0.5686274509803921,0.5725490196078431,0.5607843137254902 + 0,0.596078431372549,0.6,0.6039215686274509,0.592156862745098, + 3600,0.611764705882353,0.615686274509804,0.6196078431372549,0.6078431372549019 ] } } @@ -13402,15 +13454,15 @@ } }, { - "id":"sampled205", + "id":"sampled206", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5803921568627451,0.5843137254901961,0.5882352941176471,0.5764705882352941, - 3600,0.596078431372549,0.6,0.6039215686274509,0.592156862745098 + 0,0.6274509803921569,0.6313725490196078,0.6352941176470588,0.6235294117647059, + 3600,0.6431372549019608,0.6470588235294118,0.6509803921568628,0.6392156862745098 ] } } @@ -13418,15 +13470,15 @@ } }, { - "id":"sampled206", + "id":"sampled207", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.611764705882353,0.615686274509804,0.6196078431372549,0.6078431372549019, - 3600,0.6274509803921569,0.6313725490196078,0.6352941176470588,0.6235294117647059 + 0,0.6588235294117647,0.6627450980392157,0.6666666666666666,0.6549019607843137, + 3600,0.6745098039215687,0.6784313725490196,0.6823529411764706,0.6705882352941176 ] } } @@ -13434,7 +13486,7 @@ } }, { - "id":"sampled207", + "id":"sampled208", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ @@ -13448,8 +13500,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,220,221,222,219, - 3600,224,225,226,223 + 0,232,233,234,231, + 3600,236,237,238,235 ] } } @@ -13457,22 +13509,22 @@ } }, { - "id":"sampled208", + "id":"sampled209", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,228,229,230,227, - 3600,232,233,234,231 + 0,240,241,242,239, + 3600,244,245,246,243 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,444, - 3600,445 + 0,447, + 3600,448 ] }, "lineCount":{ @@ -13501,36 +13553,36 @@ } }, { - "id":"sampled209", + "id":"sampled210", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,236,237,238,235, - 3600,240,241,242,239 + 0,248,249,250,247, + 3600,252,253,254,251 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,244,245,246,243, - 3600,248,249,250,247 + 0,1,2,3,0, + 3600,5,6,7,4 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,446, - 3600,447 + 0,449, + 3600,450 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,448, - 3600,449 + 0,451, + 3600,452 ] } } @@ -13538,15 +13590,15 @@ } }, { - "id":"sampled210", + "id":"sampled211", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6431372549019608,0.6470588235294118,0.6509803921568628,0.6392156862745098, - 3600,0.6588235294117647,0.6627450980392157,0.6666666666666666,0.6549019607843137 + 0,0.6901960784313725,0.6941176470588235,0.6980392156862745,0.6862745098039216, + 3600,0.7058823529411765,0.7098039215686275,0.7137254901960784,0.7019607843137254 ] } } @@ -13554,15 +13606,15 @@ } }, { - "id":"sampled211", + "id":"sampled212", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6745098039215687,0.6784313725490196,0.6823529411764706,0.6705882352941176, - 3600,0.6901960784313725,0.6941176470588235,0.6980392156862745,0.6862745098039216 + 0,0.7215686274509804,0.7254901960784313,0.7294117647058823,0.7176470588235294, + 3600,0.7372549019607844,0.7411764705882353,0.7450980392156863,0.7333333333333333 ] } } @@ -13570,15 +13622,15 @@ } }, { - "id":"sampled212", + "id":"sampled213", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7058823529411765,0.7098039215686275,0.7137254901960784,0.7019607843137254, - 3600,0.7215686274509804,0.7254901960784313,0.7294117647058823,0.7176470588235294 + 0,0.7529411764705882,0.7568627450980392,0.7607843137254902,0.7490196078431373, + 3600,0.7686274509803922,0.7725490196078432,0.7764705882352941,0.7647058823529411 ] } } @@ -13586,15 +13638,15 @@ } }, { - "id":"sampled213", + "id":"sampled214", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7372549019607844,0.7411764705882353,0.7450980392156863,0.7333333333333333, - 3600,0.7529411764705882,0.7568627450980392,0.7607843137254902,0.7490196078431373 + 0,0.7843137254901961,0.788235294117647,0.792156862745098,0.7803921568627451, + 3600,0.8,0.803921568627451,0.807843137254902,0.796078431372549 ] } } @@ -13602,15 +13654,15 @@ } }, { - "id":"sampled214", + "id":"sampled215", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7686274509803922,0.7725490196078432,0.7764705882352941,0.7647058823529411, - 3600,0.7843137254901961,0.788235294117647,0.792156862745098,0.7803921568627451 + 0,0.8156862745098039,0.8196078431372549,0.8235294117647058,0.8117647058823529, + 3600,0.8313725490196079,0.8352941176470589,0.8392156862745098,0.8274509803921568 ] } } @@ -13618,7 +13670,7 @@ } }, { - "id":"sampled215", + "id":"sampled216", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ @@ -13632,8 +13684,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,252,253,254,251, - 3600,1,2,3,0 + 0,9,10,11,8, + 3600,13,14,15,12 ] } } @@ -13641,22 +13693,22 @@ } }, { - "id":"sampled216", + "id":"sampled217", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,5,6,7,4, - 3600,9,10,11,8 + 0,17,18,19,16, + 3600,21,22,23,20 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,450, - 3600,451 + 0,453, + 3600,454 ] }, "lineCount":{ @@ -13685,36 +13737,36 @@ } }, { - "id":"sampled217", + "id":"sampled218", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,13,14,15,12, - 3600,17,18,19,16 + 0,25,26,27,24, + 3600,29,30,31,28 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,21,22,23,20, - 3600,25,26,27,24 + 0,33,34,35,32, + 3600,37,38,39,36 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,452, - 3600,453 + 0,455, + 3600,456 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,454, - 3600,455 + 0,457, + 3600,458 ] } } @@ -13722,15 +13774,15 @@ } }, { - "id":"sampled218", + "id":"sampled219", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8,0.803921568627451,0.807843137254902,0.796078431372549, - 3600,0.8156862745098039,0.8196078431372549,0.8235294117647058,0.8117647058823529 + 0,0.8470588235294118,0.8509803921568627,0.8549019607843137,0.8431372549019608, + 3600,0.8627450980392157,0.8666666666666667,0.8705882352941177,0.8588235294117647 ] } } @@ -13738,15 +13790,15 @@ } }, { - "id":"sampled219", + "id":"sampled220", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8313725490196079,0.8352941176470589,0.8392156862745098,0.8274509803921568, - 3600,0.8470588235294118,0.8509803921568627,0.8549019607843137,0.8431372549019608 + 0,0.8784313725490196,0.8823529411764706,0.8862745098039215,0.8745098039215686, + 3600,0.8941176470588236,0.8980392156862745,0.9019607843137255,0.8901960784313725 ] } } @@ -13754,15 +13806,15 @@ } }, { - "id":"sampled220", + "id":"sampled221", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8627450980392157,0.8666666666666667,0.8705882352941177,0.8588235294117647, - 3600,0.8784313725490196,0.8823529411764706,0.8862745098039215,0.8745098039215686 + 0,0.9098039215686274,0.9137254901960784,0.9176470588235294,0.9058823529411765, + 3600,0.9254901960784314,0.9294117647058824,0.9333333333333333,0.9215686274509803 ] } } @@ -13770,15 +13822,15 @@ } }, { - "id":"sampled221", + "id":"sampled222", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8941176470588236,0.8980392156862745,0.9019607843137255,0.8901960784313725, - 3600,0.9098039215686274,0.9137254901960784,0.9176470588235294,0.9058823529411765 + 0,0.9411764705882353,0.9450980392156862,0.9490196078431372,0.9372549019607843, + 3600,0.9568627450980393,0.9607843137254902,0.9647058823529412,0.9529411764705882 ] } } @@ -13786,15 +13838,15 @@ } }, { - "id":"sampled222", + "id":"sampled223", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9254901960784314,0.9294117647058824,0.9333333333333333,0.9215686274509803, - 3600,0.9411764705882353,0.9450980392156862,0.9490196078431372,0.9372549019607843 + 0,0.9725490196078431,0.9764705882352941,0.9803921568627451,0.9686274509803922, + 3600,0.9882352941176471,0.9921568627450981,0.996078431372549,0.984313725490196 ] } } @@ -13802,7 +13854,7 @@ } }, { - "id":"sampled223", + "id":"sampled224", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "image":{ @@ -13816,8 +13868,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,29,30,31,28, - 3600,33,34,35,32 + 0,41,42,43,40, + 3600,45,46,47,44 ] } } @@ -13825,22 +13877,22 @@ } }, { - "id":"sampled224", + "id":"sampled225", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,37,38,39,36, - 3600,41,42,43,40 + 0,49,50,51,48, + 3600,53,54,55,52 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,456, - 3600,457 + 0,459, + 3600,460 ] }, "lineCount":{ @@ -13869,36 +13921,36 @@ } }, { - "id":"sampled225", + "id":"sampled226", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,45,46,47,44, - 3600,49,50,51,48 + 0,57,58,59,56, + 3600,61,62,63,60 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,53,54,55,52, - 3600,57,58,59,56 + 0,65,66,67,64, + 3600,69,70,71,68 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,458, - 3600,459 + 0,461, + 3600,462 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,460, - 3600,461 + 0,463, + 3600,464 ] } } @@ -13906,15 +13958,15 @@ } }, { - "id":"sampled226", + "id":"sampled227", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9568627450980393,0.9607843137254902,0.9647058823529412,0.9529411764705882, - 3600,0.9725490196078431,0.9764705882352941,0.9803921568627451,0.9686274509803922 + 0,0.00392156862745098,0.00784313725490196,0.011764705882352941,0, + 3600,0.0196078431372549,0.023529411764705882,0.027450980392156862,0.01568627450980392 ] } } @@ -13922,15 +13974,15 @@ } }, { - "id":"sampled227", + "id":"sampled228", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9882352941176471,0.9921568627450981,0.996078431372549,0.984313725490196, - 3600,0.00392156862745098,0.00784313725490196,0.011764705882352941,0 + 0,0.03529411764705882,0.0392156862745098,0.043137254901960784,0.03137254901960784, + 3600,0.050980392156862744,0.054901960784313725,0.058823529411764705,0.047058823529411764 ] } } @@ -13938,15 +13990,15 @@ } }, { - "id":"sampled228", + "id":"sampled229", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.0196078431372549,0.023529411764705882,0.027450980392156862,0.01568627450980392, - 3600,0.03529411764705882,0.0392156862745098,0.043137254901960784,0.03137254901960784 + 0,0.06666666666666667,0.07058823529411765,0.07450980392156863,0.06274509803921569, + 3600,0.08235294117647059,0.08627450980392157,0.09019607843137255,0.0784313725490196 ] } } @@ -13954,15 +14006,15 @@ } }, { - "id":"sampled229", + "id":"sampled230", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.050980392156862744,0.054901960784313725,0.058823529411764705,0.047058823529411764, - 3600,0.06666666666666667,0.07058823529411765,0.07450980392156863,0.06274509803921569 + 0,0.09803921568627451,0.10196078431372549,0.10588235294117647,0.09411764705882353, + 3600,0.11372549019607843,0.11764705882352941,0.12156862745098039,0.10980392156862745 ] } } @@ -13970,15 +14022,15 @@ } }, { - "id":"sampled230", + "id":"sampled231", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.08235294117647059,0.08627450980392157,0.09019607843137255,0.0784313725490196, - 3600,0.09803921568627451,0.10196078431372549,0.10588235294117647,0.09411764705882353 + 0,0.12941176470588237,0.13333333333333333,0.13725490196078433,0.12549019607843137, + 3600,0.1450980392156863,0.14901960784313725,0.15294117647058825,0.1411764705882353 ] } } @@ -13986,7 +14038,7 @@ } }, { - "id":"sampled231", + "id":"sampled232", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "image":{ @@ -14000,8 +14052,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,61,62,63,60, - 3600,65,66,67,64 + 0,73,74,75,72, + 3600,77,78,79,76 ] } } @@ -14009,22 +14061,22 @@ } }, { - "id":"sampled232", + "id":"sampled233", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,69,70,71,68, - 3600,73,74,75,72 + 0,81,82,83,80, + 3600,85,86,87,84 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,462, - 3600,463 + 0,465, + 3600,466 ] }, "lineCount":{ @@ -14053,36 +14105,36 @@ } }, { - "id":"sampled233", + "id":"sampled234", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,77,78,79,76, - 3600,81,82,83,80 + 0,89,90,91,88, + 3600,93,94,95,92 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,85,86,87,84, - 3600,89,90,91,88 + 0,97,98,99,96, + 3600,101,102,103,100 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,464, - 3600,465 + 0,467, + 3600,468 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,466, - 3600,467 + 0,469, + 3600,470 ] } } @@ -14090,15 +14142,15 @@ } }, { - "id":"sampled234", + "id":"sampled235", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.11372549019607843,0.11764705882352941,0.12156862745098039,0.10980392156862745, - 3600,0.12941176470588237,0.13333333333333333,0.13725490196078433,0.12549019607843137 + 0,0.1607843137254902,0.16470588235294117,0.16862745098039217,0.1568627450980392, + 3600,0.17647058823529413,0.1803921568627451,0.1843137254901961,0.17254901960784313 ] } } @@ -14106,15 +14158,15 @@ } }, { - "id":"sampled235", + "id":"sampled236", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.1450980392156863,0.14901960784313725,0.15294117647058825,0.1411764705882353, - 3600,0.1607843137254902,0.16470588235294117,0.16862745098039217,0.1568627450980392 + 0,0.19215686274509805,0.19607843137254902,0.2,0.18823529411764706, + 3600,0.20784313725490197,0.21176470588235294,0.21568627450980393,0.20392156862745098 ] } } @@ -14122,15 +14174,15 @@ } }, { - "id":"sampled236", + "id":"sampled237", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.17647058823529413,0.1803921568627451,0.1843137254901961,0.17254901960784313, - 3600,0.19215686274509805,0.19607843137254902,0.2,0.18823529411764706 + 0,0.2235294117647059,0.22745098039215686,0.23137254901960785,0.2196078431372549, + 3600,0.23921568627450981,0.24313725490196078,0.24705882352941178,0.23529411764705882 ] } } @@ -14138,15 +14190,15 @@ } }, { - "id":"sampled237", + "id":"sampled238", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.20784313725490197,0.21176470588235294,0.21568627450980393,0.20392156862745098, - 3600,0.2235294117647059,0.22745098039215686,0.23137254901960785,0.2196078431372549 + 0,0.2549019607843137,0.25882352941176473,0.2627450980392157,0.25098039215686274, + 3600,0.27058823529411763,0.27450980392156865,0.2784313725490196,0.26666666666666666 ] } } @@ -14154,27 +14206,27 @@ } }, { - "id":"sampled238", + "id":"sampled239", "agi_rectangularSensor":{ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.23921568627450981,0.24313725490196078,0.24705882352941178,0.23529411764705882, - 3600,0.2549019607843137,0.25882352941176473,0.2627450980392157,0.25098039215686274 + 0,0.28627450980392155,0.2901960784313726,0.29411764705882354,0.2823529411764706, + 3600,0.30196078431372547,0.3058823529411765,0.30980392156862746,0.2980392156862745 ] } } }, { - "id":"sampled239", + "id":"sampled240", "agi_fan":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.27058823529411763,0.27450980392156865,0.2784313725490196,0.26666666666666666, - 3600,0.28627450980392155,0.2901960784313726,0.29411764705882354,0.2823529411764706 + 0,0.3176470588235294,0.3215686274509804,0.3254901960784314,0.3137254901960784, + 3600,0.3333333333333333,0.33725490196078434,0.3411764705882353,0.32941176470588235 ] } } @@ -14182,7 +14234,7 @@ } }, { - "id":"sampled240", + "id":"sampled241", "agi_fan":{ "material":{ "image":{ @@ -14196,8 +14248,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,93,94,95,92, - 3600,97,98,99,96 + 0,105,106,107,104, + 3600,109,110,111,108 ] } } @@ -14205,22 +14257,22 @@ } }, { - "id":"sampled241", + "id":"sampled242", "agi_fan":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,101,102,103,100, - 3600,105,106,107,104 + 0,113,114,115,112, + 3600,117,118,119,116 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,468, - 3600,469 + 0,471, + 3600,472 ] }, "lineCount":{ @@ -14249,36 +14301,36 @@ } }, { - "id":"sampled242", + "id":"sampled243", "agi_fan":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,109,110,111,108, - 3600,113,114,115,112 + 0,121,122,123,120, + 3600,125,126,127,124 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,117,118,119,116, - 3600,121,122,123,120 + 0,129,130,131,128, + 3600,133,134,135,132 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,470, - 3600,471 + 0,473, + 3600,474 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,472, - 3600,473 + 0,475, + 3600,476 ] } } @@ -14286,15 +14338,15 @@ } }, { - "id":"sampled243", + "id":"sampled244", "agi_fan":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.30196078431372547,0.3058823529411765,0.30980392156862746,0.2980392156862745, - 3600,0.3176470588235294,0.3215686274509804,0.3254901960784314,0.3137254901960784 + 0,0.34901960784313724,0.35294117647058826,0.3568627450980392,0.34509803921568627, + 3600,0.36470588235294116,0.3686274509803922,0.37254901960784315,0.3607843137254902 ] } } @@ -14302,15 +14354,15 @@ } }, { - "id":"sampled244", + "id":"sampled245", "agi_fan":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3333333333333333,0.33725490196078434,0.3411764705882353,0.32941176470588235, - 3600,0.34901960784313724,0.35294117647058826,0.3568627450980392,0.34509803921568627 + 0,0.3803921568627451,0.3843137254901961,0.38823529411764707,0.3764705882352941, + 3600,0.396078431372549,0.4,0.403921568627451,0.39215686274509803 ] } } @@ -14318,15 +14370,15 @@ } }, { - "id":"sampled245", + "id":"sampled246", "agi_fan":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.36470588235294116,0.3686274509803922,0.37254901960784315,0.3607843137254902, - 3600,0.3803921568627451,0.3843137254901961,0.38823529411764707,0.3764705882352941 + 0,0.4117647058823529,0.41568627450980394,0.4196078431372549,0.40784313725490196, + 3600,0.42745098039215684,0.43137254901960786,0.43529411764705883,0.4235294117647059 ] } } @@ -14334,15 +14386,15 @@ } }, { - "id":"sampled246", + "id":"sampled247", "agi_fan":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.396078431372549,0.4,0.403921568627451,0.39215686274509803, - 3600,0.4117647058823529,0.41568627450980394,0.4196078431372549,0.40784313725490196 + 0,0.44313725490196076,0.4470588235294118,0.45098039215686275,0.4392156862745098, + 3600,0.4588235294117647,0.4627450980392157,0.4666666666666667,0.4549019607843137 ] } } @@ -14350,31 +14402,31 @@ } }, { - "id":"sampled247", + "id":"sampled248", "agi_fan":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.42745098039215684,0.43137254901960786,0.43529411764705883,0.4235294117647059, - 3600,0.44313725490196076,0.4470588235294118,0.45098039215686275,0.4392156862745098 + 0,0.4745098039215686,0.47843137254901963,0.4823529411764706,0.47058823529411764, + 3600,0.49019607843137253,0.49411764705882355,0.4980392156862745,0.48627450980392156 ] } } }, { - "id":"sampled248", + "id":"sampled249", "agi_vector":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4588235294117647,0.4627450980392157,0.4666666666666667,0.4549019607843137, - 3600,0.4745098039215686,0.47843137254901963,0.4823529411764706,0.47058823529411764 + 0,0.5058823529411764,0.5098039215686274,0.5137254901960784,0.5019607843137255, + 3600,0.5215686274509804,0.5254901960784314,0.5294117647058824,0.5176470588235295 ] } } }, { - "id":"sampled249", + "id":"sampled250", "agi_vector":{ "direction":{ "epoch":"2016-06-17T12:00:00Z", @@ -14386,7 +14438,7 @@ } }, { - "id":"sampled250", + "id":"sampled251", "agi_vector":{ "direction":{ "epoch":"2016-06-17T12:00:00Z", @@ -14398,7 +14450,7 @@ } }, { - "id":"sampled251", + "id":"sampled252", "agi_vector":{ "direction":{ "epoch":"2016-06-17T12:00:00Z", diff --git a/Specs/DataSources/CzmlDataSourceSpec.js b/Specs/DataSources/CzmlDataSourceSpec.js index b3be324ede7e..3e3d8cf9da4a 100644 --- a/Specs/DataSources/CzmlDataSourceSpec.js +++ b/Specs/DataSources/CzmlDataSourceSpec.js @@ -2813,7 +2813,7 @@ defineSuite([ // by the czml-writer ValidationDocumentationGenerator. // https://github.com/AnalyticalGraphicsInc/czml-writer/blob/master/DotNet/GenerateFromSchema/ValidationDocumentGenerator.cs // using command line - // GenerateFromSchema.exe -p ..\..\..\..\Schema\Packet.jsonschema -t validation -o ..\..\..\CesiumLanguageWriterTests\ + // GenerateFromSchema.exe -p ..\..\..\..\Schema\Packet.json -t validation -o ..\..\..\CesiumLanguageWriterTests\ // then running the generated TestGenerateValidationDocument unit test // to produce ValidationDocument.czml and ValidationDocumentAssertions.js @@ -2932,67 +2932,70 @@ defineSuite([ expect(e.model.incrementallyLoadTextures.getValue(date)).toEqual(true); expect(e.model.runAnimations.getValue(date)).toEqual(true); expect(e.model.heightReference.getValue(date)).toEqual(HeightReference.CLAMP_TO_GROUND); + expect(e.model.color.getValue(date)).toEqual(Color.fromBytes(54, 55, 56, 53)); + expect(e.model.colorBlendMode.getValue(date)).toEqual(ColorBlendMode.REPLACE); + expect(e.model.colorBlendAmount.getValue(date)).toEqual(35.0); expect(e.model.nodeTransformations.prop.translation.getValue(date)).toEqual(new Cartesian3(19, 20, 21)); expect(e.model.nodeTransformations.prop.rotation.getValue(date)).toEqualEpsilon(new Quaternion(0.454858826147342, 0.530668630505232, 0.606478434863123, 0.379049021789452), 1e-14); expect(e.model.nodeTransformations.prop.scale.getValue(date)).toEqual(new Cartesian3(22, 23, 24)); expect(e.path.show.getValue(date)).toEqual(true); - expect(e.path.width.getValue(date)).toEqual(35.0); - expect(e.path.resolution.getValue(date)).toEqual(36.0); - expect(e.path.leadTime.getValue(date)).toEqual(37.0); - expect(e.path.trailTime.getValue(date)).toEqual(38.0); - expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(54, 55, 56, 53)); + expect(e.path.width.getValue(date)).toEqual(36.0); + expect(e.path.resolution.getValue(date)).toEqual(37.0); + expect(e.path.leadTime.getValue(date)).toEqual(38.0); + expect(e.path.trailTime.getValue(date)).toEqual(39.0); + expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(58, 59, 60, 57)); expect(e.point.show.getValue(date)).toEqual(true); - expect(e.point.pixelSize.getValue(date)).toEqual(39.0); + expect(e.point.pixelSize.getValue(date)).toEqual(40.0); expect(e.point.heightReference.getValue(date)).toEqual(HeightReference.CLAMP_TO_GROUND); - expect(e.point.color.getValue(date)).toEqual(Color.fromBytes(58, 59, 60, 57)); - expect(e.point.outlineColor.getValue(date)).toEqual(Color.fromBytes(62, 63, 64, 61)); - expect(e.point.outlineWidth.getValue(date)).toEqual(40.0); + expect(e.point.color.getValue(date)).toEqual(Color.fromBytes(62, 63, 64, 61)); + expect(e.point.outlineColor.getValue(date)).toEqual(Color.fromBytes(66, 67, 68, 65)); + expect(e.point.outlineWidth.getValue(date)).toEqual(41.0); expect(e.point.scaleByDistance.getValue(date)).toEqual(new NearFarScalar(21, 22, 23, 24)); expect(e.point.translucencyByDistance.getValue(date)).toEqual(new NearFarScalar(25, 26, 27, 28)); expect(e.polygon.show.getValue(date)).toEqual(true); expect(e.polygon.hierarchy.getValue(date)).toEqual([ new Cartesian3(7, 8, 9), new Cartesian3(10, 11, 12) ]); - expect(e.polygon.height.getValue(date)).toEqual(41.0); - expect(e.polygon.extrudedHeight.getValue(date)).toEqual(42.0); - expect(e.polygon.stRotation.getValue(date)).toEqual(43.0); - expect(e.polygon.granularity.getValue(date)).toEqual(44.0); + expect(e.polygon.height.getValue(date)).toEqual(42.0); + expect(e.polygon.extrudedHeight.getValue(date)).toEqual(43.0); + expect(e.polygon.stRotation.getValue(date)).toEqual(44.0); + expect(e.polygon.granularity.getValue(date)).toEqual(45.0); expect(e.polygon.fill.getValue(date)).toEqual(true); - expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(66, 67, 68, 65)); + expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(70, 71, 72, 69)); expect(e.polygon.outline.getValue(date)).toEqual(true); - expect(e.polygon.outlineColor.getValue(date)).toEqual(Color.fromBytes(70, 71, 72, 69)); - expect(e.polygon.outlineWidth.getValue(date)).toEqual(45.0); + expect(e.polygon.outlineColor.getValue(date)).toEqual(Color.fromBytes(74, 75, 76, 73)); + expect(e.polygon.outlineWidth.getValue(date)).toEqual(46.0); expect(e.polygon.perPositionHeight.getValue(date)).toEqual(true); expect(e.polygon.closeTop.getValue(date)).toEqual(true); expect(e.polygon.closeBottom.getValue(date)).toEqual(true); expect(e.polyline.show.getValue(date)).toEqual(true); expect(e.polyline.positions.getValue(date)).toEqual([ new Cartesian3(13, 14, 15), new Cartesian3(16, 17, 18) ]); - expect(e.polyline.width.getValue(date)).toEqual(46.0); - expect(e.polyline.granularity.getValue(date)).toEqual(47.0); - expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(74, 75, 76, 73)); + expect(e.polyline.width.getValue(date)).toEqual(47.0); + expect(e.polyline.granularity.getValue(date)).toEqual(48.0); + expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(78, 79, 80, 77)); expect(e.polyline.followSurface.getValue(date)).toEqual(true); expect(e.rectangle.show.getValue(date)).toEqual(true); expect(e.rectangle.coordinates.getValue(date)).toEqual(new Rectangle(1, 0.429203673205103, 1.4292036732051, 0.858407346410207)); - expect(e.rectangle.height.getValue(date)).toEqual(48.0); - expect(e.rectangle.extrudedHeight.getValue(date)).toEqual(49.0); - expect(e.rectangle.rotation.getValue(date)).toEqual(50.0); - expect(e.rectangle.stRotation.getValue(date)).toEqual(51.0); - expect(e.rectangle.granularity.getValue(date)).toEqual(52.0); + expect(e.rectangle.height.getValue(date)).toEqual(49.0); + expect(e.rectangle.extrudedHeight.getValue(date)).toEqual(50.0); + expect(e.rectangle.rotation.getValue(date)).toEqual(51.0); + expect(e.rectangle.stRotation.getValue(date)).toEqual(52.0); + expect(e.rectangle.granularity.getValue(date)).toEqual(53.0); expect(e.rectangle.fill.getValue(date)).toEqual(true); - expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(78, 79, 80, 77)); + expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(82, 83, 84, 81)); expect(e.rectangle.outline.getValue(date)).toEqual(true); - expect(e.rectangle.outlineColor.getValue(date)).toEqual(Color.fromBytes(82, 83, 84, 81)); - expect(e.rectangle.outlineWidth.getValue(date)).toEqual(53.0); + expect(e.rectangle.outlineColor.getValue(date)).toEqual(Color.fromBytes(86, 87, 88, 85)); + expect(e.rectangle.outlineWidth.getValue(date)).toEqual(54.0); expect(e.rectangle.closeTop.getValue(date)).toEqual(true); expect(e.rectangle.closeBottom.getValue(date)).toEqual(true); expect(e.wall.show.getValue(date)).toEqual(true); expect(e.wall.positions.getValue(date)).toEqual([ new Cartesian3(19, 20, 21), new Cartesian3(22, 23, 24) ]); expect(e.wall.minimumHeights.getValue(date)).toEqual([ 1, 2 ]); expect(e.wall.maximumHeights.getValue(date)).toEqual([ 3, 4 ]); - expect(e.wall.granularity.getValue(date)).toEqual(54.0); + expect(e.wall.granularity.getValue(date)).toEqual(55.0); expect(e.wall.fill.getValue(date)).toEqual(true); - expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(86, 87, 88, 85)); + expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(90, 91, 92, 89)); expect(e.wall.outline.getValue(date)).toEqual(true); - expect(e.wall.outlineColor.getValue(date)).toEqual(Color.fromBytes(90, 91, 92, 89)); - expect(e.wall.outlineWidth.getValue(date)).toEqual(55.0); + expect(e.wall.outlineColor.getValue(date)).toEqual(Color.fromBytes(94, 95, 96, 93)); + expect(e.wall.outlineWidth.getValue(date)).toEqual(56.0); expect(e = dataSource.entities.getById('constant1')).toBeDefined(); expect(e.position.getValue(date)).toEqual(Cartesian3.fromRadians(1, 0.429203673205103, 3)); expect(e = dataSource.entities.getById('constant2')).toBeDefined(); @@ -3008,20 +3011,20 @@ defineSuite([ expect(e = dataSource.entities.getById('material_box_material_image')).toBeDefined(); expect(e.box.material.image.getValue(date)).toEqual('http://example.com/3'); expect(e.box.material.repeat.getValue(date)).toEqual(new Cartesian2(5, 6)); - expect(e.box.material.color.getValue(date)).toEqual(Color.fromBytes(190, 191, 192, 189)); + expect(e.box.material.color.getValue(date)).toEqual(Color.fromBytes(194, 195, 196, 193)); expect(e.box.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_box_material_grid')).toBeDefined(); - expect(e.box.material.color.getValue(date)).toEqual(Color.fromBytes(194, 195, 196, 193)); - expect(e.box.material.cellAlpha.getValue(date)).toEqual(76.0); + expect(e.box.material.color.getValue(date)).toEqual(Color.fromBytes(198, 199, 200, 197)); + expect(e.box.material.cellAlpha.getValue(date)).toEqual(77.0); expect(e.box.material.lineCount.getValue(date)).toEqual(new Cartesian2(7, 8)); expect(e.box.material.lineThickness.getValue(date)).toEqual(new Cartesian2(9, 10)); expect(e.box.material.lineOffset.getValue(date)).toEqual(new Cartesian2(11, 12)); expect(e = dataSource.entities.getById('material_box_material_stripe')).toBeDefined(); expect(e.box.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.box.material.evenColor.getValue(date)).toEqual(Color.fromBytes(198, 199, 200, 197)); - expect(e.box.material.oddColor.getValue(date)).toEqual(Color.fromBytes(202, 203, 204, 201)); - expect(e.box.material.offset.getValue(date)).toEqual(77.0); - expect(e.box.material.repeat.getValue(date)).toEqual(78.0); + expect(e.box.material.evenColor.getValue(date)).toEqual(Color.fromBytes(202, 203, 204, 201)); + expect(e.box.material.oddColor.getValue(date)).toEqual(Color.fromBytes(206, 207, 208, 205)); + expect(e.box.material.offset.getValue(date)).toEqual(78.0); + expect(e.box.material.repeat.getValue(date)).toEqual(79.0); expect(e = dataSource.entities.getById('material1')).toBeDefined(); expect(e.box.material.color.getValue(date)).toEqualEpsilon(new Color(0.0392156862745098, 0.0431372549019608, 0.0470588235294118, 0.0352941176470588), 1e-14); expect(e = dataSource.entities.getById('material2')).toBeDefined(); @@ -3041,20 +3044,20 @@ defineSuite([ expect(e = dataSource.entities.getById('material_corridor_material_image')).toBeDefined(); expect(e.corridor.material.image.getValue(date)).toEqual('http://example.com/4'); expect(e.corridor.material.repeat.getValue(date)).toEqual(new Cartesian2(13, 14)); - expect(e.corridor.material.color.getValue(date)).toEqual(Color.fromBytes(206, 207, 208, 205)); + expect(e.corridor.material.color.getValue(date)).toEqual(Color.fromBytes(210, 211, 212, 209)); expect(e.corridor.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_corridor_material_grid')).toBeDefined(); - expect(e.corridor.material.color.getValue(date)).toEqual(Color.fromBytes(210, 211, 212, 209)); - expect(e.corridor.material.cellAlpha.getValue(date)).toEqual(79.0); + expect(e.corridor.material.color.getValue(date)).toEqual(Color.fromBytes(214, 215, 216, 213)); + expect(e.corridor.material.cellAlpha.getValue(date)).toEqual(80.0); expect(e.corridor.material.lineCount.getValue(date)).toEqual(new Cartesian2(15, 16)); expect(e.corridor.material.lineThickness.getValue(date)).toEqual(new Cartesian2(17, 18)); expect(e.corridor.material.lineOffset.getValue(date)).toEqual(new Cartesian2(19, 20)); expect(e = dataSource.entities.getById('material_corridor_material_stripe')).toBeDefined(); expect(e.corridor.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.corridor.material.evenColor.getValue(date)).toEqual(Color.fromBytes(214, 215, 216, 213)); - expect(e.corridor.material.oddColor.getValue(date)).toEqual(Color.fromBytes(218, 219, 220, 217)); - expect(e.corridor.material.offset.getValue(date)).toEqual(80.0); - expect(e.corridor.material.repeat.getValue(date)).toEqual(81.0); + expect(e.corridor.material.evenColor.getValue(date)).toEqual(Color.fromBytes(218, 219, 220, 217)); + expect(e.corridor.material.oddColor.getValue(date)).toEqual(Color.fromBytes(222, 223, 224, 221)); + expect(e.corridor.material.offset.getValue(date)).toEqual(81.0); + expect(e.corridor.material.repeat.getValue(date)).toEqual(82.0); expect(e = dataSource.entities.getById('material5')).toBeDefined(); expect(e.corridor.material.color.getValue(date)).toEqualEpsilon(new Color(0.133333333333333, 0.137254901960784, 0.141176470588235, 0.129411764705882), 1e-14); expect(e = dataSource.entities.getById('material6')).toBeDefined(); @@ -3070,20 +3073,20 @@ defineSuite([ expect(e = dataSource.entities.getById('material_cylinder_material_image')).toBeDefined(); expect(e.cylinder.material.image.getValue(date)).toEqual('http://example.com/5'); expect(e.cylinder.material.repeat.getValue(date)).toEqual(new Cartesian2(21, 22)); - expect(e.cylinder.material.color.getValue(date)).toEqual(Color.fromBytes(222, 223, 224, 221)); + expect(e.cylinder.material.color.getValue(date)).toEqual(Color.fromBytes(226, 227, 228, 225)); expect(e.cylinder.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_cylinder_material_grid')).toBeDefined(); - expect(e.cylinder.material.color.getValue(date)).toEqual(Color.fromBytes(226, 227, 228, 225)); - expect(e.cylinder.material.cellAlpha.getValue(date)).toEqual(82.0); + expect(e.cylinder.material.color.getValue(date)).toEqual(Color.fromBytes(230, 231, 232, 229)); + expect(e.cylinder.material.cellAlpha.getValue(date)).toEqual(83.0); expect(e.cylinder.material.lineCount.getValue(date)).toEqual(new Cartesian2(23, 24)); expect(e.cylinder.material.lineThickness.getValue(date)).toEqual(new Cartesian2(25, 26)); expect(e.cylinder.material.lineOffset.getValue(date)).toEqual(new Cartesian2(27, 28)); expect(e = dataSource.entities.getById('material_cylinder_material_stripe')).toBeDefined(); expect(e.cylinder.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.cylinder.material.evenColor.getValue(date)).toEqual(Color.fromBytes(230, 231, 232, 229)); - expect(e.cylinder.material.oddColor.getValue(date)).toEqual(Color.fromBytes(234, 235, 236, 233)); - expect(e.cylinder.material.offset.getValue(date)).toEqual(83.0); - expect(e.cylinder.material.repeat.getValue(date)).toEqual(84.0); + expect(e.cylinder.material.evenColor.getValue(date)).toEqual(Color.fromBytes(234, 235, 236, 233)); + expect(e.cylinder.material.oddColor.getValue(date)).toEqual(Color.fromBytes(238, 239, 240, 237)); + expect(e.cylinder.material.offset.getValue(date)).toEqual(84.0); + expect(e.cylinder.material.repeat.getValue(date)).toEqual(85.0); expect(e = dataSource.entities.getById('material9')).toBeDefined(); expect(e.cylinder.material.color.getValue(date)).toEqualEpsilon(new Color(0.227450980392157, 0.231372549019608, 0.235294117647059, 0.223529411764706), 1e-14); expect(e = dataSource.entities.getById('material10')).toBeDefined(); @@ -3099,20 +3102,20 @@ defineSuite([ expect(e = dataSource.entities.getById('material_ellipse_material_image')).toBeDefined(); expect(e.ellipse.material.image.getValue(date)).toEqual('http://example.com/6'); expect(e.ellipse.material.repeat.getValue(date)).toEqual(new Cartesian2(29, 30)); - expect(e.ellipse.material.color.getValue(date)).toEqual(Color.fromBytes(238, 239, 240, 237)); + expect(e.ellipse.material.color.getValue(date)).toEqual(Color.fromBytes(242, 243, 244, 241)); expect(e.ellipse.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_ellipse_material_grid')).toBeDefined(); - expect(e.ellipse.material.color.getValue(date)).toEqual(Color.fromBytes(242, 243, 244, 241)); - expect(e.ellipse.material.cellAlpha.getValue(date)).toEqual(85.0); + expect(e.ellipse.material.color.getValue(date)).toEqual(Color.fromBytes(246, 247, 248, 245)); + expect(e.ellipse.material.cellAlpha.getValue(date)).toEqual(86.0); expect(e.ellipse.material.lineCount.getValue(date)).toEqual(new Cartesian2(31, 32)); expect(e.ellipse.material.lineThickness.getValue(date)).toEqual(new Cartesian2(33, 34)); expect(e.ellipse.material.lineOffset.getValue(date)).toEqual(new Cartesian2(35, 36)); expect(e = dataSource.entities.getById('material_ellipse_material_stripe')).toBeDefined(); expect(e.ellipse.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.ellipse.material.evenColor.getValue(date)).toEqual(Color.fromBytes(246, 247, 248, 245)); - expect(e.ellipse.material.oddColor.getValue(date)).toEqual(Color.fromBytes(250, 251, 252, 249)); - expect(e.ellipse.material.offset.getValue(date)).toEqual(86.0); - expect(e.ellipse.material.repeat.getValue(date)).toEqual(87.0); + expect(e.ellipse.material.evenColor.getValue(date)).toEqual(Color.fromBytes(250, 251, 252, 249)); + expect(e.ellipse.material.oddColor.getValue(date)).toEqual(Color.fromBytes(254, 0, 1, 253)); + expect(e.ellipse.material.offset.getValue(date)).toEqual(87.0); + expect(e.ellipse.material.repeat.getValue(date)).toEqual(88.0); expect(e = dataSource.entities.getById('material13')).toBeDefined(); expect(e.ellipse.material.color.getValue(date)).toEqualEpsilon(new Color(0.32156862745098, 0.325490196078431, 0.329411764705882, 0.317647058823529), 1e-14); expect(e = dataSource.entities.getById('material14')).toBeDefined(); @@ -3128,20 +3131,20 @@ defineSuite([ expect(e = dataSource.entities.getById('material_ellipsoid_material_image')).toBeDefined(); expect(e.ellipsoid.material.image.getValue(date)).toEqual('http://example.com/7'); expect(e.ellipsoid.material.repeat.getValue(date)).toEqual(new Cartesian2(37, 38)); - expect(e.ellipsoid.material.color.getValue(date)).toEqual(Color.fromBytes(254, 0, 1, 253)); + expect(e.ellipsoid.material.color.getValue(date)).toEqual(Color.fromBytes(3, 4, 5, 2)); expect(e.ellipsoid.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_ellipsoid_material_grid')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(date)).toEqual(Color.fromBytes(3, 4, 5, 2)); - expect(e.ellipsoid.material.cellAlpha.getValue(date)).toEqual(88.0); + expect(e.ellipsoid.material.color.getValue(date)).toEqual(Color.fromBytes(7, 8, 9, 6)); + expect(e.ellipsoid.material.cellAlpha.getValue(date)).toEqual(89.0); expect(e.ellipsoid.material.lineCount.getValue(date)).toEqual(new Cartesian2(39, 40)); expect(e.ellipsoid.material.lineThickness.getValue(date)).toEqual(new Cartesian2(41, 42)); expect(e.ellipsoid.material.lineOffset.getValue(date)).toEqual(new Cartesian2(43, 44)); expect(e = dataSource.entities.getById('material_ellipsoid_material_stripe')).toBeDefined(); expect(e.ellipsoid.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.ellipsoid.material.evenColor.getValue(date)).toEqual(Color.fromBytes(7, 8, 9, 6)); - expect(e.ellipsoid.material.oddColor.getValue(date)).toEqual(Color.fromBytes(11, 12, 13, 10)); - expect(e.ellipsoid.material.offset.getValue(date)).toEqual(89.0); - expect(e.ellipsoid.material.repeat.getValue(date)).toEqual(90.0); + expect(e.ellipsoid.material.evenColor.getValue(date)).toEqual(Color.fromBytes(11, 12, 13, 10)); + expect(e.ellipsoid.material.oddColor.getValue(date)).toEqual(Color.fromBytes(15, 16, 17, 14)); + expect(e.ellipsoid.material.offset.getValue(date)).toEqual(90.0); + expect(e.ellipsoid.material.repeat.getValue(date)).toEqual(91.0); expect(e = dataSource.entities.getById('material17')).toBeDefined(); expect(e.ellipsoid.material.color.getValue(date)).toEqualEpsilon(new Color(0.415686274509804, 0.419607843137255, 0.423529411764706, 0.411764705882353), 1e-14); expect(e = dataSource.entities.getById('material18')).toBeDefined(); @@ -3157,200 +3160,202 @@ defineSuite([ expect(e = dataSource.entities.getById('constant19')).toBeDefined(); expect(e.label.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.509803921568627, 0.513725490196078, 0.517647058823529, 0.505882352941176), 1e-14); expect(e = dataSource.entities.getById('constant20')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.525490196078431, 0.529411764705882, 0.533333333333333, 0.52156862745098), 1e-14); + expect(e.model.color.getValue(date)).toEqualEpsilon(new Color(0.525490196078431, 0.529411764705882, 0.533333333333333, 0.52156862745098), 1e-14); + expect(e = dataSource.entities.getById('constant21')).toBeDefined(); + expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.541176470588235, 0.545098039215686, 0.549019607843137, 0.537254901960784), 1e-14); expect(e = dataSource.entities.getById('material_path_material_polylineOutline')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(15, 16, 17, 14)); - expect(e.path.material.outlineColor.getValue(date)).toEqual(Color.fromBytes(19, 20, 21, 18)); - expect(e.path.material.outlineWidth.getValue(date)).toEqual(91.0); + expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(19, 20, 21, 18)); + expect(e.path.material.outlineColor.getValue(date)).toEqual(Color.fromBytes(23, 24, 25, 22)); + expect(e.path.material.outlineWidth.getValue(date)).toEqual(92.0); expect(e = dataSource.entities.getById('material_path_material_polylineArrow')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(23, 24, 25, 22)); - expect(e = dataSource.entities.getById('material_path_material_polylineGlow')).toBeDefined(); expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(27, 28, 29, 26)); - expect(e.path.material.glowPower.getValue(date)).toEqual(92.0); + expect(e = dataSource.entities.getById('material_path_material_polylineGlow')).toBeDefined(); + expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(31, 32, 33, 30)); + expect(e.path.material.glowPower.getValue(date)).toEqual(93.0); expect(e = dataSource.entities.getById('material_path_material_image')).toBeDefined(); expect(e.path.material.image.getValue(date)).toEqual('http://example.com/8'); expect(e.path.material.repeat.getValue(date)).toEqual(new Cartesian2(45, 46)); - expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(31, 32, 33, 30)); + expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(35, 36, 37, 34)); expect(e.path.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_path_material_grid')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(35, 36, 37, 34)); - expect(e.path.material.cellAlpha.getValue(date)).toEqual(93.0); + expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(39, 40, 41, 38)); + expect(e.path.material.cellAlpha.getValue(date)).toEqual(94.0); expect(e.path.material.lineCount.getValue(date)).toEqual(new Cartesian2(47, 48)); expect(e.path.material.lineThickness.getValue(date)).toEqual(new Cartesian2(49, 50)); expect(e.path.material.lineOffset.getValue(date)).toEqual(new Cartesian2(51, 52)); expect(e = dataSource.entities.getById('material_path_material_stripe')).toBeDefined(); expect(e.path.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.path.material.evenColor.getValue(date)).toEqual(Color.fromBytes(39, 40, 41, 38)); - expect(e.path.material.oddColor.getValue(date)).toEqual(Color.fromBytes(43, 44, 45, 42)); - expect(e.path.material.offset.getValue(date)).toEqual(94.0); - expect(e.path.material.repeat.getValue(date)).toEqual(95.0); + expect(e.path.material.evenColor.getValue(date)).toEqual(Color.fromBytes(43, 44, 45, 42)); + expect(e.path.material.oddColor.getValue(date)).toEqual(Color.fromBytes(47, 48, 49, 46)); + expect(e.path.material.offset.getValue(date)).toEqual(95.0); + expect(e.path.material.repeat.getValue(date)).toEqual(96.0); expect(e = dataSource.entities.getById('material21')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.541176470588235, 0.545098039215686, 0.549019607843137, 0.537254901960784), 1e-14); + expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.556862745098039, 0.56078431372549, 0.564705882352941, 0.552941176470588), 1e-14); expect(e = dataSource.entities.getById('material22')).toBeDefined(); - expect(e.path.material.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.556862745098039, 0.56078431372549, 0.564705882352941, 0.552941176470588), 1e-14); + expect(e.path.material.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.572549019607843, 0.576470588235294, 0.580392156862745, 0.568627450980392), 1e-14); expect(e = dataSource.entities.getById('material23')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.572549019607843, 0.576470588235294, 0.580392156862745, 0.568627450980392), 1e-14); - expect(e = dataSource.entities.getById('material24')).toBeDefined(); expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.588235294117647, 0.592156862745098, 0.596078431372549, 0.584313725490196), 1e-14); - expect(e = dataSource.entities.getById('material25')).toBeDefined(); + expect(e = dataSource.entities.getById('material24')).toBeDefined(); expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.603921568627451, 0.607843137254902, 0.611764705882353, 0.6), 1e-14); - expect(e = dataSource.entities.getById('material26')).toBeDefined(); + expect(e = dataSource.entities.getById('material25')).toBeDefined(); expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.619607843137255, 0.623529411764706, 0.627450980392157, 0.615686274509804), 1e-14); + expect(e = dataSource.entities.getById('material26')).toBeDefined(); + expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.635294117647059, 0.63921568627451, 0.643137254901961, 0.631372549019608), 1e-14); expect(e = dataSource.entities.getById('material27')).toBeDefined(); - expect(e.path.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.635294117647059, 0.63921568627451, 0.643137254901961, 0.631372549019608), 1e-14); + expect(e.path.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.650980392156863, 0.654901960784314, 0.658823529411765, 0.647058823529412), 1e-14); expect(e = dataSource.entities.getById('material28')).toBeDefined(); - expect(e.path.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.650980392156863, 0.654901960784314, 0.658823529411765, 0.647058823529412), 1e-14); - expect(e = dataSource.entities.getById('constant21')).toBeDefined(); - expect(e.point.color.getValue(date)).toEqualEpsilon(new Color(0.666666666666667, 0.670588235294118, 0.674509803921569, 0.662745098039216), 1e-14); + expect(e.path.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.666666666666667, 0.670588235294118, 0.674509803921569, 0.662745098039216), 1e-14); expect(e = dataSource.entities.getById('constant22')).toBeDefined(); - expect(e.point.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.682352941176471, 0.686274509803922, 0.690196078431373, 0.67843137254902), 1e-14); + expect(e.point.color.getValue(date)).toEqualEpsilon(new Color(0.682352941176471, 0.686274509803922, 0.690196078431373, 0.67843137254902), 1e-14); expect(e = dataSource.entities.getById('constant23')).toBeDefined(); - expect(e.polygon.hierarchy.getValue(date)).toEqual([ Cartesian3.fromRadians(0.433629385640828, 1.43362938564083, 15), Cartesian3.fromRadians(0.292036732051034, 1.29203673205103, 18) ]); + expect(e.point.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.698039215686274, 0.701960784313725, 0.705882352941177, 0.694117647058824), 1e-14); expect(e = dataSource.entities.getById('constant24')).toBeDefined(); - expect(e.polygon.hierarchy.getValue(date)).toEqual([ Cartesian3.fromDegrees(19, 20, 21), Cartesian3.fromDegrees(22, 23, 24) ]); + expect(e.polygon.hierarchy.getValue(date)).toEqual([ Cartesian3.fromRadians(0.433629385640828, 1.43362938564083, 15), Cartesian3.fromRadians(0.292036732051034, 1.29203673205103, 18) ]); expect(e = dataSource.entities.getById('constant25')).toBeDefined(); - expect(e.polygon.material.color.getValue(date)).toEqualEpsilon(new Color(0.698039215686274, 0.701960784313725, 0.705882352941177, 0.694117647058824), 1e-14); + expect(e.polygon.hierarchy.getValue(date)).toEqual([ Cartesian3.fromDegrees(19, 20, 21), Cartesian3.fromDegrees(22, 23, 24) ]); + expect(e = dataSource.entities.getById('constant26')).toBeDefined(); + expect(e.polygon.material.color.getValue(date)).toEqualEpsilon(new Color(0.713725490196078, 0.717647058823529, 0.72156862745098, 0.709803921568627), 1e-14); expect(e = dataSource.entities.getById('material_polygon_material_image')).toBeDefined(); expect(e.polygon.material.image.getValue(date)).toEqual('http://example.com/9'); expect(e.polygon.material.repeat.getValue(date)).toEqual(new Cartesian2(53, 54)); - expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(47, 48, 49, 46)); + expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(51, 52, 53, 50)); expect(e.polygon.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_polygon_material_grid')).toBeDefined(); - expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(51, 52, 53, 50)); - expect(e.polygon.material.cellAlpha.getValue(date)).toEqual(96.0); + expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(55, 56, 57, 54)); + expect(e.polygon.material.cellAlpha.getValue(date)).toEqual(97.0); expect(e.polygon.material.lineCount.getValue(date)).toEqual(new Cartesian2(55, 56)); expect(e.polygon.material.lineThickness.getValue(date)).toEqual(new Cartesian2(57, 58)); expect(e.polygon.material.lineOffset.getValue(date)).toEqual(new Cartesian2(59, 60)); expect(e = dataSource.entities.getById('material_polygon_material_stripe')).toBeDefined(); expect(e.polygon.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.polygon.material.evenColor.getValue(date)).toEqual(Color.fromBytes(55, 56, 57, 54)); - expect(e.polygon.material.oddColor.getValue(date)).toEqual(Color.fromBytes(59, 60, 61, 58)); - expect(e.polygon.material.offset.getValue(date)).toEqual(97.0); - expect(e.polygon.material.repeat.getValue(date)).toEqual(98.0); + expect(e.polygon.material.evenColor.getValue(date)).toEqual(Color.fromBytes(59, 60, 61, 58)); + expect(e.polygon.material.oddColor.getValue(date)).toEqual(Color.fromBytes(63, 64, 65, 62)); + expect(e.polygon.material.offset.getValue(date)).toEqual(98.0); + expect(e.polygon.material.repeat.getValue(date)).toEqual(99.0); expect(e = dataSource.entities.getById('material29')).toBeDefined(); - expect(e.polygon.material.color.getValue(date)).toEqualEpsilon(new Color(0.713725490196078, 0.717647058823529, 0.72156862745098, 0.709803921568627), 1e-14); - expect(e = dataSource.entities.getById('material30')).toBeDefined(); expect(e.polygon.material.color.getValue(date)).toEqualEpsilon(new Color(0.729411764705882, 0.733333333333333, 0.737254901960784, 0.725490196078431), 1e-14); + expect(e = dataSource.entities.getById('material30')).toBeDefined(); + expect(e.polygon.material.color.getValue(date)).toEqualEpsilon(new Color(0.745098039215686, 0.749019607843137, 0.752941176470588, 0.741176470588235), 1e-14); expect(e = dataSource.entities.getById('material31')).toBeDefined(); - expect(e.polygon.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.745098039215686, 0.749019607843137, 0.752941176470588, 0.741176470588235), 1e-14); + expect(e.polygon.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.76078431372549, 0.764705882352941, 0.768627450980392, 0.756862745098039), 1e-14); expect(e = dataSource.entities.getById('material32')).toBeDefined(); - expect(e.polygon.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.76078431372549, 0.764705882352941, 0.768627450980392, 0.756862745098039), 1e-14); - expect(e = dataSource.entities.getById('constant26')).toBeDefined(); - expect(e.polygon.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.776470588235294, 0.780392156862745, 0.784313725490196, 0.772549019607843), 1e-14); + expect(e.polygon.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.776470588235294, 0.780392156862745, 0.784313725490196, 0.772549019607843), 1e-14); expect(e = dataSource.entities.getById('constant27')).toBeDefined(); - expect(e.polyline.positions.getValue(date)).toEqual([ Cartesian3.fromRadians(1.43805509807655, 0.867258771281655, 27), Cartesian3.fromRadians(1.29646244448676, 0.725666117691862, 30) ]); + expect(e.polygon.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.792156862745098, 0.796078431372549, 0.8, 0.788235294117647), 1e-14); expect(e = dataSource.entities.getById('constant28')).toBeDefined(); - expect(e.polyline.positions.getValue(date)).toEqual([ Cartesian3.fromDegrees(31, 32, 33), Cartesian3.fromDegrees(34, 35, 36) ]); + expect(e.polyline.positions.getValue(date)).toEqual([ Cartesian3.fromRadians(1.43805509807655, 0.867258771281655, 27), Cartesian3.fromRadians(1.29646244448676, 0.725666117691862, 30) ]); expect(e = dataSource.entities.getById('constant29')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.792156862745098, 0.796078431372549, 0.8, 0.788235294117647), 1e-14); + expect(e.polyline.positions.getValue(date)).toEqual([ Cartesian3.fromDegrees(31, 32, 33), Cartesian3.fromDegrees(34, 35, 36) ]); + expect(e = dataSource.entities.getById('constant30')).toBeDefined(); + expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.807843137254902, 0.811764705882353, 0.815686274509804, 0.803921568627451), 1e-14); expect(e = dataSource.entities.getById('material_polyline_material_polylineOutline')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(63, 64, 65, 62)); - expect(e.polyline.material.outlineColor.getValue(date)).toEqual(Color.fromBytes(67, 68, 69, 66)); - expect(e.polyline.material.outlineWidth.getValue(date)).toEqual(99.0); + expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(67, 68, 69, 66)); + expect(e.polyline.material.outlineColor.getValue(date)).toEqual(Color.fromBytes(71, 72, 73, 70)); + expect(e.polyline.material.outlineWidth.getValue(date)).toEqual(100.0); expect(e = dataSource.entities.getById('material_polyline_material_polylineArrow')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(71, 72, 73, 70)); - expect(e = dataSource.entities.getById('material_polyline_material_polylineGlow')).toBeDefined(); expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(75, 76, 77, 74)); - expect(e.polyline.material.glowPower.getValue(date)).toEqual(100.0); + expect(e = dataSource.entities.getById('material_polyline_material_polylineGlow')).toBeDefined(); + expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(79, 80, 81, 78)); + expect(e.polyline.material.glowPower.getValue(date)).toEqual(101.0); expect(e = dataSource.entities.getById('material_polyline_material_image')).toBeDefined(); expect(e.polyline.material.image.getValue(date)).toEqual('http://example.com/10'); expect(e.polyline.material.repeat.getValue(date)).toEqual(new Cartesian2(61, 62)); - expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(79, 80, 81, 78)); + expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(83, 84, 85, 82)); expect(e.polyline.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_polyline_material_grid')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(83, 84, 85, 82)); - expect(e.polyline.material.cellAlpha.getValue(date)).toEqual(101.0); + expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(87, 88, 89, 86)); + expect(e.polyline.material.cellAlpha.getValue(date)).toEqual(102.0); expect(e.polyline.material.lineCount.getValue(date)).toEqual(new Cartesian2(63, 64)); expect(e.polyline.material.lineThickness.getValue(date)).toEqual(new Cartesian2(65, 66)); expect(e.polyline.material.lineOffset.getValue(date)).toEqual(new Cartesian2(67, 68)); expect(e = dataSource.entities.getById('material_polyline_material_stripe')).toBeDefined(); expect(e.polyline.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.polyline.material.evenColor.getValue(date)).toEqual(Color.fromBytes(87, 88, 89, 86)); - expect(e.polyline.material.oddColor.getValue(date)).toEqual(Color.fromBytes(91, 92, 93, 90)); - expect(e.polyline.material.offset.getValue(date)).toEqual(102.0); - expect(e.polyline.material.repeat.getValue(date)).toEqual(103.0); + expect(e.polyline.material.evenColor.getValue(date)).toEqual(Color.fromBytes(91, 92, 93, 90)); + expect(e.polyline.material.oddColor.getValue(date)).toEqual(Color.fromBytes(95, 96, 97, 94)); + expect(e.polyline.material.offset.getValue(date)).toEqual(103.0); + expect(e.polyline.material.repeat.getValue(date)).toEqual(104.0); expect(e = dataSource.entities.getById('material33')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.807843137254902, 0.811764705882353, 0.815686274509804, 0.803921568627451), 1e-14); + expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.823529411764706, 0.827450980392157, 0.831372549019608, 0.819607843137255), 1e-14); expect(e = dataSource.entities.getById('material34')).toBeDefined(); - expect(e.polyline.material.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.823529411764706, 0.827450980392157, 0.831372549019608, 0.819607843137255), 1e-14); + expect(e.polyline.material.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.83921568627451, 0.843137254901961, 0.847058823529412, 0.835294117647059), 1e-14); expect(e = dataSource.entities.getById('material35')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.83921568627451, 0.843137254901961, 0.847058823529412, 0.835294117647059), 1e-14); - expect(e = dataSource.entities.getById('material36')).toBeDefined(); expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.854901960784314, 0.858823529411765, 0.862745098039216, 0.850980392156863), 1e-14); - expect(e = dataSource.entities.getById('material37')).toBeDefined(); + expect(e = dataSource.entities.getById('material36')).toBeDefined(); expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.870588235294118, 0.874509803921569, 0.87843137254902, 0.866666666666667), 1e-14); - expect(e = dataSource.entities.getById('material38')).toBeDefined(); + expect(e = dataSource.entities.getById('material37')).toBeDefined(); expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.886274509803922, 0.890196078431373, 0.894117647058824, 0.882352941176471), 1e-14); + expect(e = dataSource.entities.getById('material38')).toBeDefined(); + expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.901960784313726, 0.905882352941176, 0.909803921568627, 0.898039215686275), 1e-14); expect(e = dataSource.entities.getById('material39')).toBeDefined(); - expect(e.polyline.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.901960784313726, 0.905882352941176, 0.909803921568627, 0.898039215686275), 1e-14); + expect(e.polyline.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.917647058823529, 0.92156862745098, 0.925490196078431, 0.913725490196078), 1e-14); expect(e = dataSource.entities.getById('material40')).toBeDefined(); - expect(e.polyline.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.917647058823529, 0.92156862745098, 0.925490196078431, 0.913725490196078), 1e-14); - expect(e = dataSource.entities.getById('constant30')).toBeDefined(); - expect(e.rectangle.coordinates.getValue(date)).toEqual(Rectangle.fromDegrees(5, 6, 7, 8)); + expect(e.polyline.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.933333333333333, 0.937254901960784, 0.941176470588235, 0.929411764705882), 1e-14); expect(e = dataSource.entities.getById('constant31')).toBeDefined(); - expect(e.rectangle.material.color.getValue(date)).toEqualEpsilon(new Color(0.933333333333333, 0.937254901960784, 0.941176470588235, 0.929411764705882), 1e-14); + expect(e.rectangle.coordinates.getValue(date)).toEqual(Rectangle.fromDegrees(5, 6, 7, 8)); + expect(e = dataSource.entities.getById('constant32')).toBeDefined(); + expect(e.rectangle.material.color.getValue(date)).toEqualEpsilon(new Color(0.949019607843137, 0.952941176470588, 0.956862745098039, 0.945098039215686), 1e-14); expect(e = dataSource.entities.getById('material_rectangle_material_image')).toBeDefined(); expect(e.rectangle.material.image.getValue(date)).toEqual('http://example.com/11'); expect(e.rectangle.material.repeat.getValue(date)).toEqual(new Cartesian2(69, 70)); - expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(95, 96, 97, 94)); + expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(99, 100, 101, 98)); expect(e.rectangle.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_rectangle_material_grid')).toBeDefined(); - expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(99, 100, 101, 98)); - expect(e.rectangle.material.cellAlpha.getValue(date)).toEqual(104.0); + expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(103, 104, 105, 102)); + expect(e.rectangle.material.cellAlpha.getValue(date)).toEqual(105.0); expect(e.rectangle.material.lineCount.getValue(date)).toEqual(new Cartesian2(71, 72)); expect(e.rectangle.material.lineThickness.getValue(date)).toEqual(new Cartesian2(73, 74)); expect(e.rectangle.material.lineOffset.getValue(date)).toEqual(new Cartesian2(75, 76)); expect(e = dataSource.entities.getById('material_rectangle_material_stripe')).toBeDefined(); expect(e.rectangle.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.rectangle.material.evenColor.getValue(date)).toEqual(Color.fromBytes(103, 104, 105, 102)); - expect(e.rectangle.material.oddColor.getValue(date)).toEqual(Color.fromBytes(107, 108, 109, 106)); - expect(e.rectangle.material.offset.getValue(date)).toEqual(105.0); - expect(e.rectangle.material.repeat.getValue(date)).toEqual(106.0); + expect(e.rectangle.material.evenColor.getValue(date)).toEqual(Color.fromBytes(107, 108, 109, 106)); + expect(e.rectangle.material.oddColor.getValue(date)).toEqual(Color.fromBytes(111, 112, 113, 110)); + expect(e.rectangle.material.offset.getValue(date)).toEqual(106.0); + expect(e.rectangle.material.repeat.getValue(date)).toEqual(107.0); expect(e = dataSource.entities.getById('material41')).toBeDefined(); - expect(e.rectangle.material.color.getValue(date)).toEqualEpsilon(new Color(0.949019607843137, 0.952941176470588, 0.956862745098039, 0.945098039215686), 1e-14); - expect(e = dataSource.entities.getById('material42')).toBeDefined(); expect(e.rectangle.material.color.getValue(date)).toEqualEpsilon(new Color(0.964705882352941, 0.968627450980392, 0.972549019607843, 0.96078431372549), 1e-14); + expect(e = dataSource.entities.getById('material42')).toBeDefined(); + expect(e.rectangle.material.color.getValue(date)).toEqualEpsilon(new Color(0.980392156862745, 0.984313725490196, 0.988235294117647, 0.976470588235294), 1e-14); expect(e = dataSource.entities.getById('material43')).toBeDefined(); - expect(e.rectangle.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.980392156862745, 0.984313725490196, 0.988235294117647, 0.976470588235294), 1e-14); + expect(e.rectangle.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.996078431372549, 0, 0.00392156862745098, 0.992156862745098), 1e-14); expect(e = dataSource.entities.getById('material44')).toBeDefined(); - expect(e.rectangle.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.996078431372549, 0, 0.00392156862745098, 0.992156862745098), 1e-14); - expect(e = dataSource.entities.getById('constant32')).toBeDefined(); - expect(e.rectangle.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.0117647058823529, 0.0156862745098039, 0.0196078431372549, 0.00784313725490196), 1e-14); + expect(e.rectangle.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.0117647058823529, 0.0156862745098039, 0.0196078431372549, 0.00784313725490196), 1e-14); expect(e = dataSource.entities.getById('constant33')).toBeDefined(); - expect(e.wall.positions.getValue(date)).toEqual([ Cartesian3.fromRadians(0.871684483717379, 0.300888156922483, 39), Cartesian3.fromRadians(0.730091830127586, 0.159295503332689, 42) ]); + expect(e.rectangle.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.0274509803921569, 0.0313725490196078, 0.0352941176470588, 0.0235294117647059), 1e-14); expect(e = dataSource.entities.getById('constant34')).toBeDefined(); - expect(e.wall.positions.getValue(date)).toEqual([ Cartesian3.fromDegrees(43, 44, 45), Cartesian3.fromDegrees(1, 2, 48) ]); + expect(e.wall.positions.getValue(date)).toEqual([ Cartesian3.fromRadians(0.871684483717379, 0.300888156922483, 39), Cartesian3.fromRadians(0.730091830127586, 0.159295503332689, 42) ]); expect(e = dataSource.entities.getById('constant35')).toBeDefined(); - expect(e.wall.material.color.getValue(date)).toEqualEpsilon(new Color(0.0274509803921569, 0.0313725490196078, 0.0352941176470588, 0.0235294117647059), 1e-14); + expect(e.wall.positions.getValue(date)).toEqual([ Cartesian3.fromDegrees(43, 44, 45), Cartesian3.fromDegrees(1, 2, 48) ]); + expect(e = dataSource.entities.getById('constant36')).toBeDefined(); + expect(e.wall.material.color.getValue(date)).toEqualEpsilon(new Color(0.0431372549019608, 0.0470588235294118, 0.0509803921568627, 0.0392156862745098), 1e-14); expect(e = dataSource.entities.getById('material_wall_material_image')).toBeDefined(); expect(e.wall.material.image.getValue(date)).toEqual('http://example.com/12'); expect(e.wall.material.repeat.getValue(date)).toEqual(new Cartesian2(77, 78)); - expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(111, 112, 113, 110)); + expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(115, 116, 117, 114)); expect(e.wall.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_wall_material_grid')).toBeDefined(); - expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(115, 116, 117, 114)); - expect(e.wall.material.cellAlpha.getValue(date)).toEqual(107.0); + expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(119, 120, 121, 118)); + expect(e.wall.material.cellAlpha.getValue(date)).toEqual(108.0); expect(e.wall.material.lineCount.getValue(date)).toEqual(new Cartesian2(79, 80)); expect(e.wall.material.lineThickness.getValue(date)).toEqual(new Cartesian2(81, 82)); expect(e.wall.material.lineOffset.getValue(date)).toEqual(new Cartesian2(83, 84)); expect(e = dataSource.entities.getById('material_wall_material_stripe')).toBeDefined(); expect(e.wall.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.wall.material.evenColor.getValue(date)).toEqual(Color.fromBytes(119, 120, 121, 118)); - expect(e.wall.material.oddColor.getValue(date)).toEqual(Color.fromBytes(123, 124, 125, 122)); - expect(e.wall.material.offset.getValue(date)).toEqual(108.0); - expect(e.wall.material.repeat.getValue(date)).toEqual(109.0); + expect(e.wall.material.evenColor.getValue(date)).toEqual(Color.fromBytes(123, 124, 125, 122)); + expect(e.wall.material.oddColor.getValue(date)).toEqual(Color.fromBytes(127, 128, 129, 126)); + expect(e.wall.material.offset.getValue(date)).toEqual(109.0); + expect(e.wall.material.repeat.getValue(date)).toEqual(110.0); expect(e = dataSource.entities.getById('material45')).toBeDefined(); - expect(e.wall.material.color.getValue(date)).toEqualEpsilon(new Color(0.0431372549019608, 0.0470588235294118, 0.0509803921568627, 0.0392156862745098), 1e-14); - expect(e = dataSource.entities.getById('material46')).toBeDefined(); expect(e.wall.material.color.getValue(date)).toEqualEpsilon(new Color(0.0588235294117647, 0.0627450980392157, 0.0666666666666667, 0.0549019607843137), 1e-14); + expect(e = dataSource.entities.getById('material46')).toBeDefined(); + expect(e.wall.material.color.getValue(date)).toEqualEpsilon(new Color(0.0745098039215686, 0.0784313725490196, 0.0823529411764706, 0.0705882352941176), 1e-14); expect(e = dataSource.entities.getById('material47')).toBeDefined(); - expect(e.wall.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.0745098039215686, 0.0784313725490196, 0.0823529411764706, 0.0705882352941176), 1e-14); + expect(e.wall.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.0901960784313725, 0.0941176470588235, 0.0980392156862745, 0.0862745098039216), 1e-14); expect(e = dataSource.entities.getById('material48')).toBeDefined(); - expect(e.wall.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.0901960784313725, 0.0941176470588235, 0.0980392156862745, 0.0862745098039216), 1e-14); - expect(e = dataSource.entities.getById('constant36')).toBeDefined(); - expect(e.wall.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.105882352941176, 0.109803921568627, 0.113725490196078, 0.101960784313725), 1e-14); + expect(e.wall.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.105882352941176, 0.109803921568627, 0.113725490196078, 0.101960784313725), 1e-14); expect(e = dataSource.entities.getById('constant37')).toBeDefined(); + expect(e.wall.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.12156862745098, 0.125490196078431, 0.129411764705882, 0.117647058823529), 1e-14); expect(e = dataSource.entities.getById('constant38')).toBeDefined(); + expect(e = dataSource.entities.getById('constant39')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_lateralSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_lateralSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); @@ -3358,7 +3363,7 @@ defineSuite([ expect(e = dataSource.entities.getById('material50')).toBeDefined(); expect(e = dataSource.entities.getById('material51')).toBeDefined(); expect(e = dataSource.entities.getById('material52')).toBeDefined(); - expect(e = dataSource.entities.getById('constant39')).toBeDefined(); + expect(e = dataSource.entities.getById('constant40')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); @@ -3366,7 +3371,7 @@ defineSuite([ expect(e = dataSource.entities.getById('material54')).toBeDefined(); expect(e = dataSource.entities.getById('material55')).toBeDefined(); expect(e = dataSource.entities.getById('material56')).toBeDefined(); - expect(e = dataSource.entities.getById('constant40')).toBeDefined(); + expect(e = dataSource.entities.getById('constant41')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); @@ -3374,7 +3379,7 @@ defineSuite([ expect(e = dataSource.entities.getById('material58')).toBeDefined(); expect(e = dataSource.entities.getById('material59')).toBeDefined(); expect(e = dataSource.entities.getById('material60')).toBeDefined(); - expect(e = dataSource.entities.getById('constant41')).toBeDefined(); + expect(e = dataSource.entities.getById('constant42')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_domeSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_domeSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_domeSurfaceMaterial_stripe')).toBeDefined(); @@ -3382,7 +3387,7 @@ defineSuite([ expect(e = dataSource.entities.getById('material62')).toBeDefined(); expect(e = dataSource.entities.getById('material63')).toBeDefined(); expect(e = dataSource.entities.getById('material64')).toBeDefined(); - expect(e = dataSource.entities.getById('constant42')).toBeDefined(); + expect(e = dataSource.entities.getById('constant43')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_environmentOcclusionMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_environmentOcclusionMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); @@ -3390,12 +3395,12 @@ defineSuite([ expect(e = dataSource.entities.getById('material66')).toBeDefined(); expect(e = dataSource.entities.getById('material67')).toBeDefined(); expect(e = dataSource.entities.getById('material68')).toBeDefined(); - expect(e = dataSource.entities.getById('constant43')).toBeDefined(); expect(e = dataSource.entities.getById('constant44')).toBeDefined(); expect(e = dataSource.entities.getById('constant45')).toBeDefined(); expect(e = dataSource.entities.getById('constant46')).toBeDefined(); expect(e = dataSource.entities.getById('constant47')).toBeDefined(); expect(e = dataSource.entities.getById('constant48')).toBeDefined(); + expect(e = dataSource.entities.getById('constant49')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_lateralSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_lateralSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); @@ -3403,7 +3408,7 @@ defineSuite([ expect(e = dataSource.entities.getById('material70')).toBeDefined(); expect(e = dataSource.entities.getById('material71')).toBeDefined(); expect(e = dataSource.entities.getById('material72')).toBeDefined(); - expect(e = dataSource.entities.getById('constant49')).toBeDefined(); + expect(e = dataSource.entities.getById('constant50')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); @@ -3411,7 +3416,7 @@ defineSuite([ expect(e = dataSource.entities.getById('material74')).toBeDefined(); expect(e = dataSource.entities.getById('material75')).toBeDefined(); expect(e = dataSource.entities.getById('material76')).toBeDefined(); - expect(e = dataSource.entities.getById('constant50')).toBeDefined(); + expect(e = dataSource.entities.getById('constant51')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); @@ -3419,7 +3424,7 @@ defineSuite([ expect(e = dataSource.entities.getById('material78')).toBeDefined(); expect(e = dataSource.entities.getById('material79')).toBeDefined(); expect(e = dataSource.entities.getById('material80')).toBeDefined(); - expect(e = dataSource.entities.getById('constant51')).toBeDefined(); + expect(e = dataSource.entities.getById('constant52')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_domeSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_domeSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_domeSurfaceMaterial_stripe')).toBeDefined(); @@ -3427,7 +3432,7 @@ defineSuite([ expect(e = dataSource.entities.getById('material82')).toBeDefined(); expect(e = dataSource.entities.getById('material83')).toBeDefined(); expect(e = dataSource.entities.getById('material84')).toBeDefined(); - expect(e = dataSource.entities.getById('constant52')).toBeDefined(); + expect(e = dataSource.entities.getById('constant53')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_environmentOcclusionMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_environmentOcclusionMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); @@ -3435,9 +3440,9 @@ defineSuite([ expect(e = dataSource.entities.getById('material86')).toBeDefined(); expect(e = dataSource.entities.getById('material87')).toBeDefined(); expect(e = dataSource.entities.getById('material88')).toBeDefined(); - expect(e = dataSource.entities.getById('constant53')).toBeDefined(); expect(e = dataSource.entities.getById('constant54')).toBeDefined(); expect(e = dataSource.entities.getById('constant55')).toBeDefined(); + expect(e = dataSource.entities.getById('constant56')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_lateralSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_lateralSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); @@ -3445,7 +3450,7 @@ defineSuite([ expect(e = dataSource.entities.getById('material90')).toBeDefined(); expect(e = dataSource.entities.getById('material91')).toBeDefined(); expect(e = dataSource.entities.getById('material92')).toBeDefined(); - expect(e = dataSource.entities.getById('constant56')).toBeDefined(); + expect(e = dataSource.entities.getById('constant57')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); @@ -3453,7 +3458,7 @@ defineSuite([ expect(e = dataSource.entities.getById('material94')).toBeDefined(); expect(e = dataSource.entities.getById('material95')).toBeDefined(); expect(e = dataSource.entities.getById('material96')).toBeDefined(); - expect(e = dataSource.entities.getById('constant57')).toBeDefined(); + expect(e = dataSource.entities.getById('constant58')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); @@ -3461,7 +3466,7 @@ defineSuite([ expect(e = dataSource.entities.getById('material98')).toBeDefined(); expect(e = dataSource.entities.getById('material99')).toBeDefined(); expect(e = dataSource.entities.getById('material100')).toBeDefined(); - expect(e = dataSource.entities.getById('constant58')).toBeDefined(); + expect(e = dataSource.entities.getById('constant59')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_domeSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_domeSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_domeSurfaceMaterial_stripe')).toBeDefined(); @@ -3469,7 +3474,7 @@ defineSuite([ expect(e = dataSource.entities.getById('material102')).toBeDefined(); expect(e = dataSource.entities.getById('material103')).toBeDefined(); expect(e = dataSource.entities.getById('material104')).toBeDefined(); - expect(e = dataSource.entities.getById('constant59')).toBeDefined(); + expect(e = dataSource.entities.getById('constant60')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_environmentOcclusionMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_environmentOcclusionMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); @@ -3477,11 +3482,11 @@ defineSuite([ expect(e = dataSource.entities.getById('material106')).toBeDefined(); expect(e = dataSource.entities.getById('material107')).toBeDefined(); expect(e = dataSource.entities.getById('material108')).toBeDefined(); - expect(e = dataSource.entities.getById('constant60')).toBeDefined(); expect(e = dataSource.entities.getById('constant61')).toBeDefined(); expect(e = dataSource.entities.getById('constant62')).toBeDefined(); expect(e = dataSource.entities.getById('constant63')).toBeDefined(); expect(e = dataSource.entities.getById('constant64')).toBeDefined(); + expect(e = dataSource.entities.getById('constant65')).toBeDefined(); expect(e = dataSource.entities.getById('material_fan_material_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_fan_material_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_fan_material_stripe')).toBeDefined(); @@ -3489,19 +3494,19 @@ defineSuite([ expect(e = dataSource.entities.getById('material110')).toBeDefined(); expect(e = dataSource.entities.getById('material111')).toBeDefined(); expect(e = dataSource.entities.getById('material112')).toBeDefined(); - expect(e = dataSource.entities.getById('constant65')).toBeDefined(); expect(e = dataSource.entities.getById('constant66')).toBeDefined(); expect(e = dataSource.entities.getById('constant67')).toBeDefined(); expect(e = dataSource.entities.getById('constant68')).toBeDefined(); expect(e = dataSource.entities.getById('constant69')).toBeDefined(); + expect(e = dataSource.entities.getById('constant70')).toBeDefined(); expect(e = dataSource.entities.getById('ConstantPosition1')).toBeDefined(); expect(e.position.getValue(date)).toEqual(new Cartesian3(28, 29, 30)); expect(e = dataSource.entities.getById('ConstantDouble1')).toBeDefined(); - expect(e.billboard.scale.getValue(date)).toEqual(158.0); + expect(e.billboard.scale.getValue(date)).toEqual(159.0); expect(e = dataSource.entities.getById('ConstantPosition2')).toBeDefined(); expect(e.position.getValue(date)).toEqual(new Cartesian3(31, 32, 33)); expect(e = dataSource.entities.getById('ConstantDouble2')).toBeDefined(); - expect(e.billboard.scale.getValue(date)).toEqual(159.0); + expect(e.billboard.scale.getValue(date)).toEqual(160.0); expect(e = dataSource.entities.getById('Reference')).toBeDefined(); expect(e.description.getValue(date)).toEqual(constant.description.getValue(date)); expect(e.position.getValue(date)).toEqual(constant.position.getValue(date)); @@ -3602,6 +3607,9 @@ defineSuite([ expect(e.model.incrementallyLoadTextures.getValue(date)).toEqual(constant.model.incrementallyLoadTextures.getValue(date)); expect(e.model.runAnimations.getValue(date)).toEqual(constant.model.runAnimations.getValue(date)); expect(e.model.heightReference.getValue(date)).toEqual(constant.model.heightReference.getValue(date)); + expect(e.model.color.getValue(date)).toEqual(constant.model.color.getValue(date)); + expect(e.model.colorBlendMode.getValue(date)).toEqual(constant.model.colorBlendMode.getValue(date)); + expect(e.model.colorBlendAmount.getValue(date)).toEqual(constant.model.colorBlendAmount.getValue(date)); expect(e.model.nodeTransformations.referenceProp.translation.getValue(date)).toEqual(constant.model.nodeTransformations.prop.translation.getValue(date)); expect(e.model.nodeTransformations.referenceProp.rotation.getValue(date)).toEqual(constant.model.nodeTransformations.prop.rotation.getValue(date)); expect(e.model.nodeTransformations.referenceProp.scale.getValue(date)).toEqual(constant.model.nodeTransformations.prop.scale.getValue(date)); @@ -3911,22 +3919,22 @@ defineSuite([ expect(e.orientation.getValue(documentStopDate)).toEqualEpsilon(new Quaternion(0.48132991492077, 0.515710623129397, 0.550091331338023, 0.446949206712144), 1e-14); expect(e.viewFrom.getValue(documentStartDate)).toEqual(new Cartesian3(40, 41, 42)); expect(e.viewFrom.getValue(documentStopDate)).toEqual(new Cartesian3(43, 44, 45)); - expect(e.billboard.scale.getValue(documentStartDate)).toEqual(160.0); - expect(e.billboard.scale.getValue(documentStopDate)).toEqual(161.0); + expect(e.billboard.scale.getValue(documentStartDate)).toEqual(161.0); + expect(e.billboard.scale.getValue(documentStopDate)).toEqual(162.0); expect(e.billboard.pixelOffset.getValue(documentStartDate)).toEqual(new Cartesian2(213, 214)); expect(e.billboard.pixelOffset.getValue(documentStopDate)).toEqual(new Cartesian2(215, 216)); expect(e.billboard.eyeOffset.getValue(documentStartDate)).toEqual(new Cartesian3(46, 47, 48)); expect(e.billboard.eyeOffset.getValue(documentStopDate)).toEqual(new Cartesian3(49, 50, 51)); - expect(e.billboard.color.getValue(documentStartDate)).toEqual(Color.fromBytes(128, 129, 130, 127)); - expect(e.billboard.color.getValue(documentStopDate)).toEqual(Color.fromBytes(132, 133, 134, 131)); - expect(e.billboard.rotation.getValue(documentStartDate)).toEqual(162.0); - expect(e.billboard.rotation.getValue(documentStopDate)).toEqual(163.0); + expect(e.billboard.color.getValue(documentStartDate)).toEqual(Color.fromBytes(132, 133, 134, 131)); + expect(e.billboard.color.getValue(documentStopDate)).toEqual(Color.fromBytes(136, 137, 138, 135)); + expect(e.billboard.rotation.getValue(documentStartDate)).toEqual(163.0); + expect(e.billboard.rotation.getValue(documentStopDate)).toEqual(164.0); expect(e.billboard.alignedAxis.getValue(documentStartDate)).toEqualEpsilon(new Cartesian3(0.502570711032417, 0.574366526894191, 0.646162342755964), 1e-14); expect(e.billboard.alignedAxis.getValue(documentStopDate)).toEqualEpsilon(new Cartesian3(0.523423922590214, 0.575766314849235, 0.628108707108257), 1e-14); - expect(e.billboard.width.getValue(documentStartDate)).toEqual(164.0); - expect(e.billboard.width.getValue(documentStopDate)).toEqual(165.0); - expect(e.billboard.height.getValue(documentStartDate)).toEqual(166.0); - expect(e.billboard.height.getValue(documentStopDate)).toEqual(167.0); + expect(e.billboard.width.getValue(documentStartDate)).toEqual(165.0); + expect(e.billboard.width.getValue(documentStopDate)).toEqual(166.0); + expect(e.billboard.height.getValue(documentStartDate)).toEqual(167.0); + expect(e.billboard.height.getValue(documentStopDate)).toEqual(168.0); expect(e.billboard.scaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(29, 30, 31, 32)); expect(e.billboard.scaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(33, 34, 35, 36)); expect(e.billboard.translucencyByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(37, 38, 39, 40)); @@ -3937,168 +3945,172 @@ defineSuite([ expect(e.billboard.imageSubRegion.getValue(documentStopDate)).toEqual(new BoundingRectangle(9, 10, 11, 12)); expect(e.box.dimensions.getValue(documentStartDate)).toEqual(new Cartesian3(52, 53, 54)); expect(e.box.dimensions.getValue(documentStopDate)).toEqual(new Cartesian3(55, 56, 57)); - expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(136, 137, 138, 135)); - expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(140, 141, 142, 139)); - expect(e.box.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(144, 145, 146, 143)); - expect(e.box.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(148, 149, 150, 147)); - expect(e.box.outlineWidth.getValue(documentStartDate)).toEqual(168.0); - expect(e.box.outlineWidth.getValue(documentStopDate)).toEqual(169.0); - expect(e.corridor.width.getValue(documentStartDate)).toEqual(170.0); - expect(e.corridor.width.getValue(documentStopDate)).toEqual(171.0); - expect(e.corridor.height.getValue(documentStartDate)).toEqual(172.0); - expect(e.corridor.height.getValue(documentStopDate)).toEqual(173.0); - expect(e.corridor.extrudedHeight.getValue(documentStartDate)).toEqual(174.0); - expect(e.corridor.extrudedHeight.getValue(documentStopDate)).toEqual(175.0); - expect(e.corridor.granularity.getValue(documentStartDate)).toEqual(176.0); - expect(e.corridor.granularity.getValue(documentStopDate)).toEqual(177.0); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(152, 153, 154, 151)); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(156, 157, 158, 155)); - expect(e.corridor.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(160, 161, 162, 159)); - expect(e.corridor.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(164, 165, 166, 163)); - expect(e.corridor.outlineWidth.getValue(documentStartDate)).toEqual(178.0); - expect(e.corridor.outlineWidth.getValue(documentStopDate)).toEqual(179.0); - expect(e.cylinder.length.getValue(documentStartDate)).toEqual(180.0); - expect(e.cylinder.length.getValue(documentStopDate)).toEqual(181.0); - expect(e.cylinder.topRadius.getValue(documentStartDate)).toEqual(182.0); - expect(e.cylinder.topRadius.getValue(documentStopDate)).toEqual(183.0); - expect(e.cylinder.bottomRadius.getValue(documentStartDate)).toEqual(184.0); - expect(e.cylinder.bottomRadius.getValue(documentStopDate)).toEqual(185.0); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(168, 169, 170, 167)); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(172, 173, 174, 171)); - expect(e.cylinder.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(176, 177, 178, 175)); - expect(e.cylinder.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(180, 181, 182, 179)); - expect(e.cylinder.outlineWidth.getValue(documentStartDate)).toEqual(186.0); - expect(e.cylinder.outlineWidth.getValue(documentStopDate)).toEqual(187.0); - expect(e.cylinder.numberOfVerticalLines.getValue(documentStartDate)).toEqual(188.0); - expect(e.cylinder.numberOfVerticalLines.getValue(documentStopDate)).toEqual(189.0); - expect(e.cylinder.slices.getValue(documentStartDate)).toEqual(190.0); - expect(e.cylinder.slices.getValue(documentStopDate)).toEqual(191.0); - expect(e.ellipse.semiMajorAxis.getValue(documentStartDate)).toEqual(192.0); - expect(e.ellipse.semiMajorAxis.getValue(documentStopDate)).toEqual(193.0); - expect(e.ellipse.semiMinorAxis.getValue(documentStartDate)).toEqual(194.0); - expect(e.ellipse.semiMinorAxis.getValue(documentStopDate)).toEqual(195.0); - expect(e.ellipse.height.getValue(documentStartDate)).toEqual(196.0); - expect(e.ellipse.height.getValue(documentStopDate)).toEqual(197.0); - expect(e.ellipse.extrudedHeight.getValue(documentStartDate)).toEqual(198.0); - expect(e.ellipse.extrudedHeight.getValue(documentStopDate)).toEqual(199.0); - expect(e.ellipse.rotation.getValue(documentStartDate)).toEqual(200.0); - expect(e.ellipse.rotation.getValue(documentStopDate)).toEqual(201.0); - expect(e.ellipse.stRotation.getValue(documentStartDate)).toEqual(202.0); - expect(e.ellipse.stRotation.getValue(documentStopDate)).toEqual(203.0); - expect(e.ellipse.granularity.getValue(documentStartDate)).toEqual(204.0); - expect(e.ellipse.granularity.getValue(documentStopDate)).toEqual(205.0); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(184, 185, 186, 183)); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(188, 189, 190, 187)); - expect(e.ellipse.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(192, 193, 194, 191)); - expect(e.ellipse.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(196, 197, 198, 195)); - expect(e.ellipse.outlineWidth.getValue(documentStartDate)).toEqual(206.0); - expect(e.ellipse.outlineWidth.getValue(documentStopDate)).toEqual(207.0); - expect(e.ellipse.numberOfVerticalLines.getValue(documentStartDate)).toEqual(208.0); - expect(e.ellipse.numberOfVerticalLines.getValue(documentStopDate)).toEqual(209.0); + expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(140, 141, 142, 139)); + expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(144, 145, 146, 143)); + expect(e.box.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(148, 149, 150, 147)); + expect(e.box.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(152, 153, 154, 151)); + expect(e.box.outlineWidth.getValue(documentStartDate)).toEqual(169.0); + expect(e.box.outlineWidth.getValue(documentStopDate)).toEqual(170.0); + expect(e.corridor.width.getValue(documentStartDate)).toEqual(171.0); + expect(e.corridor.width.getValue(documentStopDate)).toEqual(172.0); + expect(e.corridor.height.getValue(documentStartDate)).toEqual(173.0); + expect(e.corridor.height.getValue(documentStopDate)).toEqual(174.0); + expect(e.corridor.extrudedHeight.getValue(documentStartDate)).toEqual(175.0); + expect(e.corridor.extrudedHeight.getValue(documentStopDate)).toEqual(176.0); + expect(e.corridor.granularity.getValue(documentStartDate)).toEqual(177.0); + expect(e.corridor.granularity.getValue(documentStopDate)).toEqual(178.0); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(156, 157, 158, 155)); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(160, 161, 162, 159)); + expect(e.corridor.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(164, 165, 166, 163)); + expect(e.corridor.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(168, 169, 170, 167)); + expect(e.corridor.outlineWidth.getValue(documentStartDate)).toEqual(179.0); + expect(e.corridor.outlineWidth.getValue(documentStopDate)).toEqual(180.0); + expect(e.cylinder.length.getValue(documentStartDate)).toEqual(181.0); + expect(e.cylinder.length.getValue(documentStopDate)).toEqual(182.0); + expect(e.cylinder.topRadius.getValue(documentStartDate)).toEqual(183.0); + expect(e.cylinder.topRadius.getValue(documentStopDate)).toEqual(184.0); + expect(e.cylinder.bottomRadius.getValue(documentStartDate)).toEqual(185.0); + expect(e.cylinder.bottomRadius.getValue(documentStopDate)).toEqual(186.0); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(172, 173, 174, 171)); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(176, 177, 178, 175)); + expect(e.cylinder.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(180, 181, 182, 179)); + expect(e.cylinder.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(184, 185, 186, 183)); + expect(e.cylinder.outlineWidth.getValue(documentStartDate)).toEqual(187.0); + expect(e.cylinder.outlineWidth.getValue(documentStopDate)).toEqual(188.0); + expect(e.cylinder.numberOfVerticalLines.getValue(documentStartDate)).toEqual(189.0); + expect(e.cylinder.numberOfVerticalLines.getValue(documentStopDate)).toEqual(190.0); + expect(e.cylinder.slices.getValue(documentStartDate)).toEqual(191.0); + expect(e.cylinder.slices.getValue(documentStopDate)).toEqual(192.0); + expect(e.ellipse.semiMajorAxis.getValue(documentStartDate)).toEqual(193.0); + expect(e.ellipse.semiMajorAxis.getValue(documentStopDate)).toEqual(194.0); + expect(e.ellipse.semiMinorAxis.getValue(documentStartDate)).toEqual(195.0); + expect(e.ellipse.semiMinorAxis.getValue(documentStopDate)).toEqual(196.0); + expect(e.ellipse.height.getValue(documentStartDate)).toEqual(197.0); + expect(e.ellipse.height.getValue(documentStopDate)).toEqual(198.0); + expect(e.ellipse.extrudedHeight.getValue(documentStartDate)).toEqual(199.0); + expect(e.ellipse.extrudedHeight.getValue(documentStopDate)).toEqual(200.0); + expect(e.ellipse.rotation.getValue(documentStartDate)).toEqual(201.0); + expect(e.ellipse.rotation.getValue(documentStopDate)).toEqual(202.0); + expect(e.ellipse.stRotation.getValue(documentStartDate)).toEqual(203.0); + expect(e.ellipse.stRotation.getValue(documentStopDate)).toEqual(204.0); + expect(e.ellipse.granularity.getValue(documentStartDate)).toEqual(205.0); + expect(e.ellipse.granularity.getValue(documentStopDate)).toEqual(206.0); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(188, 189, 190, 187)); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(192, 193, 194, 191)); + expect(e.ellipse.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(196, 197, 198, 195)); + expect(e.ellipse.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(200, 201, 202, 199)); + expect(e.ellipse.outlineWidth.getValue(documentStartDate)).toEqual(207.0); + expect(e.ellipse.outlineWidth.getValue(documentStopDate)).toEqual(208.0); + expect(e.ellipse.numberOfVerticalLines.getValue(documentStartDate)).toEqual(209.0); + expect(e.ellipse.numberOfVerticalLines.getValue(documentStopDate)).toEqual(210.0); expect(e.ellipsoid.radii.getValue(documentStartDate)).toEqual(new Cartesian3(58, 59, 60)); expect(e.ellipsoid.radii.getValue(documentStopDate)).toEqual(new Cartesian3(61, 62, 63)); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(200, 201, 202, 199)); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(204, 205, 206, 203)); - expect(e.ellipsoid.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(208, 209, 210, 207)); - expect(e.ellipsoid.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(212, 213, 214, 211)); - expect(e.ellipsoid.outlineWidth.getValue(documentStartDate)).toEqual(210.0); - expect(e.ellipsoid.outlineWidth.getValue(documentStopDate)).toEqual(211.0); - expect(e.ellipsoid.stackPartitions.getValue(documentStartDate)).toEqual(212.0); - expect(e.ellipsoid.stackPartitions.getValue(documentStopDate)).toEqual(213.0); - expect(e.ellipsoid.slicePartitions.getValue(documentStartDate)).toEqual(214.0); - expect(e.ellipsoid.slicePartitions.getValue(documentStopDate)).toEqual(215.0); - expect(e.ellipsoid.subdivisions.getValue(documentStartDate)).toEqual(216.0); - expect(e.ellipsoid.subdivisions.getValue(documentStopDate)).toEqual(217.0); - expect(e.label.scale.getValue(documentStartDate)).toEqual(218.0); - expect(e.label.scale.getValue(documentStopDate)).toEqual(219.0); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(204, 205, 206, 203)); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(208, 209, 210, 207)); + expect(e.ellipsoid.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(212, 213, 214, 211)); + expect(e.ellipsoid.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(216, 217, 218, 215)); + expect(e.ellipsoid.outlineWidth.getValue(documentStartDate)).toEqual(211.0); + expect(e.ellipsoid.outlineWidth.getValue(documentStopDate)).toEqual(212.0); + expect(e.ellipsoid.stackPartitions.getValue(documentStartDate)).toEqual(213.0); + expect(e.ellipsoid.stackPartitions.getValue(documentStopDate)).toEqual(214.0); + expect(e.ellipsoid.slicePartitions.getValue(documentStartDate)).toEqual(215.0); + expect(e.ellipsoid.slicePartitions.getValue(documentStopDate)).toEqual(216.0); + expect(e.ellipsoid.subdivisions.getValue(documentStartDate)).toEqual(217.0); + expect(e.ellipsoid.subdivisions.getValue(documentStopDate)).toEqual(218.0); + expect(e.label.scale.getValue(documentStartDate)).toEqual(219.0); + expect(e.label.scale.getValue(documentStopDate)).toEqual(220.0); expect(e.label.pixelOffset.getValue(documentStartDate)).toEqual(new Cartesian2(217, 218)); expect(e.label.pixelOffset.getValue(documentStopDate)).toEqual(new Cartesian2(219, 220)); expect(e.label.eyeOffset.getValue(documentStartDate)).toEqual(new Cartesian3(64, 65, 66)); expect(e.label.eyeOffset.getValue(documentStopDate)).toEqual(new Cartesian3(67, 68, 69)); - expect(e.label.fillColor.getValue(documentStartDate)).toEqual(Color.fromBytes(216, 217, 218, 215)); - expect(e.label.fillColor.getValue(documentStopDate)).toEqual(Color.fromBytes(220, 221, 222, 219)); - expect(e.label.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(224, 225, 226, 223)); - expect(e.label.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(228, 229, 230, 227)); - expect(e.label.outlineWidth.getValue(documentStartDate)).toEqual(220.0); - expect(e.label.outlineWidth.getValue(documentStopDate)).toEqual(221.0); + expect(e.label.fillColor.getValue(documentStartDate)).toEqual(Color.fromBytes(220, 221, 222, 219)); + expect(e.label.fillColor.getValue(documentStopDate)).toEqual(Color.fromBytes(224, 225, 226, 223)); + expect(e.label.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(228, 229, 230, 227)); + expect(e.label.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(232, 233, 234, 231)); + expect(e.label.outlineWidth.getValue(documentStartDate)).toEqual(221.0); + expect(e.label.outlineWidth.getValue(documentStopDate)).toEqual(222.0); expect(e.label.translucencyByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(53, 54, 55, 56)); expect(e.label.translucencyByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(57, 58, 59, 60)); expect(e.label.pixelOffsetScaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(61, 62, 63, 64)); expect(e.label.pixelOffsetScaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(65, 66, 67, 68)); - expect(e.model.scale.getValue(documentStartDate)).toEqual(222.0); - expect(e.model.scale.getValue(documentStopDate)).toEqual(223.0); - expect(e.model.minimumPixelSize.getValue(documentStartDate)).toEqual(224.0); - expect(e.model.minimumPixelSize.getValue(documentStopDate)).toEqual(225.0); - expect(e.model.maximumScale.getValue(documentStartDate)).toEqual(226.0); - expect(e.model.maximumScale.getValue(documentStopDate)).toEqual(227.0); - expect(e.path.width.getValue(documentStartDate)).toEqual(228.0); - expect(e.path.width.getValue(documentStopDate)).toEqual(229.0); - expect(e.path.resolution.getValue(documentStartDate)).toEqual(230.0); - expect(e.path.resolution.getValue(documentStopDate)).toEqual(231.0); - expect(e.path.leadTime.getValue(documentStartDate)).toEqual(232.0); - expect(e.path.leadTime.getValue(documentStopDate)).toEqual(233.0); - expect(e.path.trailTime.getValue(documentStartDate)).toEqual(234.0); - expect(e.path.trailTime.getValue(documentStopDate)).toEqual(235.0); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(232, 233, 234, 231)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(236, 237, 238, 235)); - expect(e.point.pixelSize.getValue(documentStartDate)).toEqual(236.0); - expect(e.point.pixelSize.getValue(documentStopDate)).toEqual(237.0); - expect(e.point.color.getValue(documentStartDate)).toEqual(Color.fromBytes(240, 241, 242, 239)); - expect(e.point.color.getValue(documentStopDate)).toEqual(Color.fromBytes(244, 245, 246, 243)); - expect(e.point.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(248, 249, 250, 247)); - expect(e.point.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(252, 253, 254, 251)); - expect(e.point.outlineWidth.getValue(documentStartDate)).toEqual(238.0); - expect(e.point.outlineWidth.getValue(documentStopDate)).toEqual(239.0); + expect(e.model.scale.getValue(documentStartDate)).toEqual(223.0); + expect(e.model.scale.getValue(documentStopDate)).toEqual(224.0); + expect(e.model.minimumPixelSize.getValue(documentStartDate)).toEqual(225.0); + expect(e.model.minimumPixelSize.getValue(documentStopDate)).toEqual(226.0); + expect(e.model.maximumScale.getValue(documentStartDate)).toEqual(227.0); + expect(e.model.maximumScale.getValue(documentStopDate)).toEqual(228.0); + expect(e.model.color.getValue(documentStartDate)).toEqual(Color.fromBytes(236, 237, 238, 235)); + expect(e.model.color.getValue(documentStopDate)).toEqual(Color.fromBytes(240, 241, 242, 239)); + expect(e.model.colorBlendAmount.getValue(documentStartDate)).toEqual(229.0); + expect(e.model.colorBlendAmount.getValue(documentStopDate)).toEqual(230.0); + expect(e.path.width.getValue(documentStartDate)).toEqual(231.0); + expect(e.path.width.getValue(documentStopDate)).toEqual(232.0); + expect(e.path.resolution.getValue(documentStartDate)).toEqual(233.0); + expect(e.path.resolution.getValue(documentStopDate)).toEqual(234.0); + expect(e.path.leadTime.getValue(documentStartDate)).toEqual(235.0); + expect(e.path.leadTime.getValue(documentStopDate)).toEqual(236.0); + expect(e.path.trailTime.getValue(documentStartDate)).toEqual(237.0); + expect(e.path.trailTime.getValue(documentStopDate)).toEqual(238.0); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(244, 245, 246, 243)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(248, 249, 250, 247)); + expect(e.point.pixelSize.getValue(documentStartDate)).toEqual(239.0); + expect(e.point.pixelSize.getValue(documentStopDate)).toEqual(240.0); + expect(e.point.color.getValue(documentStartDate)).toEqual(Color.fromBytes(252, 253, 254, 251)); + expect(e.point.color.getValue(documentStopDate)).toEqual(Color.fromBytes(1, 2, 3, 0)); + expect(e.point.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(5, 6, 7, 4)); + expect(e.point.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(9, 10, 11, 8)); + expect(e.point.outlineWidth.getValue(documentStartDate)).toEqual(241.0); + expect(e.point.outlineWidth.getValue(documentStopDate)).toEqual(242.0); expect(e.point.scaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(69, 70, 71, 72)); expect(e.point.scaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(73, 74, 75, 76)); expect(e.point.translucencyByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(77, 78, 79, 80)); expect(e.point.translucencyByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(81, 82, 83, 84)); - expect(e.polygon.height.getValue(documentStartDate)).toEqual(240.0); - expect(e.polygon.height.getValue(documentStopDate)).toEqual(241.0); - expect(e.polygon.extrudedHeight.getValue(documentStartDate)).toEqual(242.0); - expect(e.polygon.extrudedHeight.getValue(documentStopDate)).toEqual(243.0); - expect(e.polygon.stRotation.getValue(documentStartDate)).toEqual(244.0); - expect(e.polygon.stRotation.getValue(documentStopDate)).toEqual(245.0); - expect(e.polygon.granularity.getValue(documentStartDate)).toEqual(246.0); - expect(e.polygon.granularity.getValue(documentStopDate)).toEqual(247.0); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(1, 2, 3, 0)); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(5, 6, 7, 4)); - expect(e.polygon.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(9, 10, 11, 8)); - expect(e.polygon.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(13, 14, 15, 12)); - expect(e.polygon.outlineWidth.getValue(documentStartDate)).toEqual(248.0); - expect(e.polygon.outlineWidth.getValue(documentStopDate)).toEqual(249.0); - expect(e.polyline.width.getValue(documentStartDate)).toEqual(250.0); - expect(e.polyline.width.getValue(documentStopDate)).toEqual(251.0); - expect(e.polyline.granularity.getValue(documentStartDate)).toEqual(252.0); - expect(e.polyline.granularity.getValue(documentStopDate)).toEqual(253.0); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(17, 18, 19, 16)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(21, 22, 23, 20)); + expect(e.polygon.height.getValue(documentStartDate)).toEqual(243.0); + expect(e.polygon.height.getValue(documentStopDate)).toEqual(244.0); + expect(e.polygon.extrudedHeight.getValue(documentStartDate)).toEqual(245.0); + expect(e.polygon.extrudedHeight.getValue(documentStopDate)).toEqual(246.0); + expect(e.polygon.stRotation.getValue(documentStartDate)).toEqual(247.0); + expect(e.polygon.stRotation.getValue(documentStopDate)).toEqual(248.0); + expect(e.polygon.granularity.getValue(documentStartDate)).toEqual(249.0); + expect(e.polygon.granularity.getValue(documentStopDate)).toEqual(250.0); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(13, 14, 15, 12)); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(17, 18, 19, 16)); + expect(e.polygon.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(21, 22, 23, 20)); + expect(e.polygon.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(25, 26, 27, 24)); + expect(e.polygon.outlineWidth.getValue(documentStartDate)).toEqual(251.0); + expect(e.polygon.outlineWidth.getValue(documentStopDate)).toEqual(252.0); + expect(e.polyline.width.getValue(documentStartDate)).toEqual(253.0); + expect(e.polyline.width.getValue(documentStopDate)).toEqual(254.0); + expect(e.polyline.granularity.getValue(documentStartDate)).toEqual(255.0); + expect(e.polyline.granularity.getValue(documentStopDate)).toEqual(256.0); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(29, 30, 31, 28)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(33, 34, 35, 32)); expect(e.rectangle.coordinates.getValue(documentStartDate)).toEqual(new Rectangle(1.14601836602552, 0.575222039230621, 0.00442571243572409, 1.00442571243572)); expect(e.rectangle.coordinates.getValue(documentStopDate)).toEqual(new Rectangle(0.433629385640828, 1.43362938564083, 0.862833058845931, 0.292036732051034)); - expect(e.rectangle.height.getValue(documentStartDate)).toEqual(254.0); - expect(e.rectangle.height.getValue(documentStopDate)).toEqual(255.0); - expect(e.rectangle.extrudedHeight.getValue(documentStartDate)).toEqual(256.0); - expect(e.rectangle.extrudedHeight.getValue(documentStopDate)).toEqual(257.0); - expect(e.rectangle.rotation.getValue(documentStartDate)).toEqual(258.0); - expect(e.rectangle.rotation.getValue(documentStopDate)).toEqual(259.0); - expect(e.rectangle.stRotation.getValue(documentStartDate)).toEqual(260.0); - expect(e.rectangle.stRotation.getValue(documentStopDate)).toEqual(261.0); - expect(e.rectangle.granularity.getValue(documentStartDate)).toEqual(262.0); - expect(e.rectangle.granularity.getValue(documentStopDate)).toEqual(263.0); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(25, 26, 27, 24)); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(29, 30, 31, 28)); - expect(e.rectangle.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(33, 34, 35, 32)); - expect(e.rectangle.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(37, 38, 39, 36)); - expect(e.rectangle.outlineWidth.getValue(documentStartDate)).toEqual(264.0); - expect(e.rectangle.outlineWidth.getValue(documentStopDate)).toEqual(265.0); - expect(e.wall.granularity.getValue(documentStartDate)).toEqual(266.0); - expect(e.wall.granularity.getValue(documentStopDate)).toEqual(267.0); - expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(41, 42, 43, 40)); - expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(45, 46, 47, 44)); - expect(e.wall.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(49, 50, 51, 48)); - expect(e.wall.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(53, 54, 55, 52)); - expect(e.wall.outlineWidth.getValue(documentStartDate)).toEqual(268.0); - expect(e.wall.outlineWidth.getValue(documentStopDate)).toEqual(269.0); + expect(e.rectangle.height.getValue(documentStartDate)).toEqual(257.0); + expect(e.rectangle.height.getValue(documentStopDate)).toEqual(258.0); + expect(e.rectangle.extrudedHeight.getValue(documentStartDate)).toEqual(259.0); + expect(e.rectangle.extrudedHeight.getValue(documentStopDate)).toEqual(260.0); + expect(e.rectangle.rotation.getValue(documentStartDate)).toEqual(261.0); + expect(e.rectangle.rotation.getValue(documentStopDate)).toEqual(262.0); + expect(e.rectangle.stRotation.getValue(documentStartDate)).toEqual(263.0); + expect(e.rectangle.stRotation.getValue(documentStopDate)).toEqual(264.0); + expect(e.rectangle.granularity.getValue(documentStartDate)).toEqual(265.0); + expect(e.rectangle.granularity.getValue(documentStopDate)).toEqual(266.0); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(37, 38, 39, 36)); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(41, 42, 43, 40)); + expect(e.rectangle.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(45, 46, 47, 44)); + expect(e.rectangle.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(49, 50, 51, 48)); + expect(e.rectangle.outlineWidth.getValue(documentStartDate)).toEqual(267.0); + expect(e.rectangle.outlineWidth.getValue(documentStopDate)).toEqual(268.0); + expect(e.wall.granularity.getValue(documentStartDate)).toEqual(269.0); + expect(e.wall.granularity.getValue(documentStopDate)).toEqual(270.0); + expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(53, 54, 55, 52)); + expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(57, 58, 59, 56)); + expect(e.wall.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(61, 62, 63, 60)); + expect(e.wall.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(65, 66, 67, 64)); + expect(e.wall.outlineWidth.getValue(documentStartDate)).toEqual(271.0); + expect(e.wall.outlineWidth.getValue(documentStopDate)).toEqual(272.0); expect(e = dataSource.entities.getById('sampled1')).toBeDefined(); expect(e.position.getValue(documentStartDate)).toEqual(Cartesian3.fromRadians(0.716814692820414, 0.146018366025517, 9)); expect(e.position.getValue(documentStopDate)).toEqual(Cartesian3.fromRadians(0.575222039230621, 0.00442571243572409, 12)); @@ -4109,24 +4121,24 @@ defineSuite([ expect(e.position.getValue(documentStartDate)).toEqual(new Cartesian3(7, 8, 9)); expect(e.position.getValue(documentStopDate)).toEqual(new Cartesian3(13, 14, 15)); expect(e = dataSource.entities.getById('sampled4')).toBeDefined(); - expect(e.billboard.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.501960784313725, 0.505882352941176, 0.509803921568627, 0.498039215686275), 1e-14); - expect(e.billboard.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.517647058823529, 0.52156862745098, 0.525490196078431, 0.513725490196078), 1e-14); + expect(e.billboard.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.517647058823529, 0.52156862745098, 0.525490196078431, 0.513725490196078), 1e-14); + expect(e.billboard.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.533333333333333, 0.537254901960784, 0.541176470588235, 0.529411764705882), 1e-14); expect(e = dataSource.entities.getById('sampled5')).toBeDefined(); expect(e.billboard.alignedAxis.getValue(documentStartDate)).toEqual(Cartesian3.fromSpherical(new Spherical(5, 6))); expect(e.billboard.alignedAxis.getValue(documentStopDate)).toEqual(Cartesian3.fromSpherical(new Spherical(7, 8))); expect(e = dataSource.entities.getById('sampled6')).toBeDefined(); - expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.533333333333333, 0.537254901960784, 0.541176470588235, 0.529411764705882), 1e-14); - expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.549019607843137, 0.552941176470588, 0.556862745098039, 0.545098039215686), 1e-14); + expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.549019607843137, 0.552941176470588, 0.556862745098039, 0.545098039215686), 1e-14); + expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.564705882352941, 0.568627450980392, 0.572549019607843, 0.56078431372549), 1e-14); expect(e = dataSource.entities.getById('sampled7')).toBeDefined(); expect(e.box.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(221, 222)); expect(e.box.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(223, 224)); - expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(249, 250, 251, 248)); - expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(253, 254, 0, 252)); + expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(6, 7, 8, 5)); + expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(10, 11, 12, 9)); expect(e = dataSource.entities.getById('sampled8')).toBeDefined(); - expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(2, 3, 4, 1)); - expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(6, 7, 8, 5)); - expect(e.box.material.cellAlpha.getValue(documentStartDate)).toEqual(310.0); - expect(e.box.material.cellAlpha.getValue(documentStopDate)).toEqual(311.0); + expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(14, 15, 16, 13)); + expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(18, 19, 20, 17)); + expect(e.box.material.cellAlpha.getValue(documentStartDate)).toEqual(313.0); + expect(e.box.material.cellAlpha.getValue(documentStopDate)).toEqual(314.0); expect(e.box.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(225, 226)); expect(e.box.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(227, 228)); expect(e.box.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(229, 230)); @@ -4134,42 +4146,42 @@ defineSuite([ expect(e.box.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(233, 234)); expect(e.box.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(235, 236)); expect(e = dataSource.entities.getById('sampled9')).toBeDefined(); - expect(e.box.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(10, 11, 12, 9)); - expect(e.box.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(14, 15, 16, 13)); - expect(e.box.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(18, 19, 20, 17)); - expect(e.box.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(22, 23, 24, 21)); - expect(e.box.material.offset.getValue(documentStartDate)).toEqual(312.0); - expect(e.box.material.offset.getValue(documentStopDate)).toEqual(313.0); - expect(e.box.material.repeat.getValue(documentStartDate)).toEqual(314.0); - expect(e.box.material.repeat.getValue(documentStopDate)).toEqual(315.0); + expect(e.box.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(22, 23, 24, 21)); + expect(e.box.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(26, 27, 28, 25)); + expect(e.box.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(30, 31, 32, 29)); + expect(e.box.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(34, 35, 36, 33)); + expect(e.box.material.offset.getValue(documentStartDate)).toEqual(315.0); + expect(e.box.material.offset.getValue(documentStopDate)).toEqual(316.0); + expect(e.box.material.repeat.getValue(documentStartDate)).toEqual(317.0); + expect(e.box.material.repeat.getValue(documentStopDate)).toEqual(318.0); expect(e = dataSource.entities.getById('sampled10')).toBeDefined(); - expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.564705882352941, 0.568627450980392, 0.572549019607843, 0.56078431372549), 1e-14); - expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.580392156862745, 0.584313725490196, 0.588235294117647, 0.576470588235294), 1e-14); + expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.580392156862745, 0.584313725490196, 0.588235294117647, 0.576470588235294), 1e-14); + expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.596078431372549, 0.6, 0.603921568627451, 0.592156862745098), 1e-14); expect(e = dataSource.entities.getById('sampled11')).toBeDefined(); - expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.596078431372549, 0.6, 0.603921568627451, 0.592156862745098), 1e-14); - expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.611764705882353, 0.615686274509804, 0.619607843137255, 0.607843137254902), 1e-14); + expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.611764705882353, 0.615686274509804, 0.619607843137255, 0.607843137254902), 1e-14); + expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.627450980392157, 0.631372549019608, 0.635294117647059, 0.623529411764706), 1e-14); expect(e = dataSource.entities.getById('sampled12')).toBeDefined(); - expect(e.box.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.627450980392157, 0.631372549019608, 0.635294117647059, 0.623529411764706), 1e-14); - expect(e.box.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.643137254901961, 0.647058823529412, 0.650980392156863, 0.63921568627451), 1e-14); + expect(e.box.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.643137254901961, 0.647058823529412, 0.650980392156863, 0.63921568627451), 1e-14); + expect(e.box.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.658823529411765, 0.662745098039216, 0.666666666666667, 0.654901960784314), 1e-14); expect(e = dataSource.entities.getById('sampled13')).toBeDefined(); - expect(e.box.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.658823529411765, 0.662745098039216, 0.666666666666667, 0.654901960784314), 1e-14); - expect(e.box.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.674509803921569, 0.67843137254902, 0.682352941176471, 0.670588235294118), 1e-14); + expect(e.box.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.674509803921569, 0.67843137254902, 0.682352941176471, 0.670588235294118), 1e-14); + expect(e.box.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.690196078431373, 0.694117647058824, 0.698039215686274, 0.686274509803922), 1e-14); expect(e = dataSource.entities.getById('sampled14')).toBeDefined(); - expect(e.box.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.690196078431373, 0.694117647058824, 0.698039215686274, 0.686274509803922), 1e-14); - expect(e.box.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.705882352941177, 0.709803921568627, 0.713725490196078, 0.701960784313725), 1e-14); + expect(e.box.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.705882352941177, 0.709803921568627, 0.713725490196078, 0.701960784313725), 1e-14); + expect(e.box.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.72156862745098, 0.725490196078431, 0.729411764705882, 0.717647058823529), 1e-14); expect(e = dataSource.entities.getById('sampled15')).toBeDefined(); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.72156862745098, 0.725490196078431, 0.729411764705882, 0.717647058823529), 1e-14); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.737254901960784, 0.741176470588235, 0.745098039215686, 0.733333333333333), 1e-14); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.737254901960784, 0.741176470588235, 0.745098039215686, 0.733333333333333), 1e-14); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.752941176470588, 0.756862745098039, 0.76078431372549, 0.749019607843137), 1e-14); expect(e = dataSource.entities.getById('sampled16')).toBeDefined(); expect(e.corridor.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(237, 238)); expect(e.corridor.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(239, 240)); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(26, 27, 28, 25)); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(30, 31, 32, 29)); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(38, 39, 40, 37)); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(42, 43, 44, 41)); expect(e = dataSource.entities.getById('sampled17')).toBeDefined(); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(34, 35, 36, 33)); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(38, 39, 40, 37)); - expect(e.corridor.material.cellAlpha.getValue(documentStartDate)).toEqual(316.0); - expect(e.corridor.material.cellAlpha.getValue(documentStopDate)).toEqual(317.0); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(46, 47, 48, 45)); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(50, 51, 52, 49)); + expect(e.corridor.material.cellAlpha.getValue(documentStartDate)).toEqual(319.0); + expect(e.corridor.material.cellAlpha.getValue(documentStopDate)).toEqual(320.0); expect(e.corridor.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(241, 242)); expect(e.corridor.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(243, 244)); expect(e.corridor.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(245, 246)); @@ -4177,42 +4189,42 @@ defineSuite([ expect(e.corridor.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(249, 250)); expect(e.corridor.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(251, 252)); expect(e = dataSource.entities.getById('sampled18')).toBeDefined(); - expect(e.corridor.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(42, 43, 44, 41)); - expect(e.corridor.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(46, 47, 48, 45)); - expect(e.corridor.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(50, 51, 52, 49)); - expect(e.corridor.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(54, 55, 56, 53)); - expect(e.corridor.material.offset.getValue(documentStartDate)).toEqual(318.0); - expect(e.corridor.material.offset.getValue(documentStopDate)).toEqual(319.0); - expect(e.corridor.material.repeat.getValue(documentStartDate)).toEqual(320.0); - expect(e.corridor.material.repeat.getValue(documentStopDate)).toEqual(321.0); + expect(e.corridor.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(54, 55, 56, 53)); + expect(e.corridor.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(58, 59, 60, 57)); + expect(e.corridor.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(62, 63, 64, 61)); + expect(e.corridor.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(66, 67, 68, 65)); + expect(e.corridor.material.offset.getValue(documentStartDate)).toEqual(321.0); + expect(e.corridor.material.offset.getValue(documentStopDate)).toEqual(322.0); + expect(e.corridor.material.repeat.getValue(documentStartDate)).toEqual(323.0); + expect(e.corridor.material.repeat.getValue(documentStopDate)).toEqual(324.0); expect(e = dataSource.entities.getById('sampled19')).toBeDefined(); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.752941176470588, 0.756862745098039, 0.76078431372549, 0.749019607843137), 1e-14); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.768627450980392, 0.772549019607843, 0.776470588235294, 0.764705882352941), 1e-14); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.768627450980392, 0.772549019607843, 0.776470588235294, 0.764705882352941), 1e-14); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.784313725490196, 0.788235294117647, 0.792156862745098, 0.780392156862745), 1e-14); expect(e = dataSource.entities.getById('sampled20')).toBeDefined(); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.784313725490196, 0.788235294117647, 0.792156862745098, 0.780392156862745), 1e-14); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.8, 0.803921568627451, 0.807843137254902, 0.796078431372549), 1e-14); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.8, 0.803921568627451, 0.807843137254902, 0.796078431372549), 1e-14); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.815686274509804, 0.819607843137255, 0.823529411764706, 0.811764705882353), 1e-14); expect(e = dataSource.entities.getById('sampled21')).toBeDefined(); - expect(e.corridor.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.815686274509804, 0.819607843137255, 0.823529411764706, 0.811764705882353), 1e-14); - expect(e.corridor.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.831372549019608, 0.835294117647059, 0.83921568627451, 0.827450980392157), 1e-14); + expect(e.corridor.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.831372549019608, 0.835294117647059, 0.83921568627451, 0.827450980392157), 1e-14); + expect(e.corridor.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.847058823529412, 0.850980392156863, 0.854901960784314, 0.843137254901961), 1e-14); expect(e = dataSource.entities.getById('sampled22')).toBeDefined(); - expect(e.corridor.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.847058823529412, 0.850980392156863, 0.854901960784314, 0.843137254901961), 1e-14); - expect(e.corridor.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.862745098039216, 0.866666666666667, 0.870588235294118, 0.858823529411765), 1e-14); + expect(e.corridor.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.862745098039216, 0.866666666666667, 0.870588235294118, 0.858823529411765), 1e-14); + expect(e.corridor.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.87843137254902, 0.882352941176471, 0.886274509803922, 0.874509803921569), 1e-14); expect(e = dataSource.entities.getById('sampled23')).toBeDefined(); - expect(e.corridor.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.87843137254902, 0.882352941176471, 0.886274509803922, 0.874509803921569), 1e-14); - expect(e.corridor.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.894117647058824, 0.898039215686275, 0.901960784313726, 0.890196078431373), 1e-14); + expect(e.corridor.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.894117647058824, 0.898039215686275, 0.901960784313726, 0.890196078431373), 1e-14); + expect(e.corridor.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.909803921568627, 0.913725490196078, 0.917647058823529, 0.905882352941176), 1e-14); expect(e = dataSource.entities.getById('sampled24')).toBeDefined(); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.909803921568627, 0.913725490196078, 0.917647058823529, 0.905882352941176), 1e-14); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.925490196078431, 0.929411764705882, 0.933333333333333, 0.92156862745098), 1e-14); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.925490196078431, 0.929411764705882, 0.933333333333333, 0.92156862745098), 1e-14); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.941176470588235, 0.945098039215686, 0.949019607843137, 0.937254901960784), 1e-14); expect(e = dataSource.entities.getById('sampled25')).toBeDefined(); expect(e.cylinder.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(253, 254)); expect(e.cylinder.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(255, 256)); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(58, 59, 60, 57)); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(62, 63, 64, 61)); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(70, 71, 72, 69)); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(74, 75, 76, 73)); expect(e = dataSource.entities.getById('sampled26')).toBeDefined(); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(66, 67, 68, 65)); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(70, 71, 72, 69)); - expect(e.cylinder.material.cellAlpha.getValue(documentStartDate)).toEqual(322.0); - expect(e.cylinder.material.cellAlpha.getValue(documentStopDate)).toEqual(323.0); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(78, 79, 80, 77)); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(82, 83, 84, 81)); + expect(e.cylinder.material.cellAlpha.getValue(documentStartDate)).toEqual(325.0); + expect(e.cylinder.material.cellAlpha.getValue(documentStopDate)).toEqual(326.0); expect(e.cylinder.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(257, 258)); expect(e.cylinder.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(259, 260)); expect(e.cylinder.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(261, 262)); @@ -4220,42 +4232,42 @@ defineSuite([ expect(e.cylinder.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(265, 266)); expect(e.cylinder.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(267, 268)); expect(e = dataSource.entities.getById('sampled27')).toBeDefined(); - expect(e.cylinder.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(74, 75, 76, 73)); - expect(e.cylinder.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(78, 79, 80, 77)); - expect(e.cylinder.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(82, 83, 84, 81)); - expect(e.cylinder.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(86, 87, 88, 85)); - expect(e.cylinder.material.offset.getValue(documentStartDate)).toEqual(324.0); - expect(e.cylinder.material.offset.getValue(documentStopDate)).toEqual(325.0); - expect(e.cylinder.material.repeat.getValue(documentStartDate)).toEqual(326.0); - expect(e.cylinder.material.repeat.getValue(documentStopDate)).toEqual(327.0); + expect(e.cylinder.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(86, 87, 88, 85)); + expect(e.cylinder.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(90, 91, 92, 89)); + expect(e.cylinder.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(94, 95, 96, 93)); + expect(e.cylinder.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(98, 99, 100, 97)); + expect(e.cylinder.material.offset.getValue(documentStartDate)).toEqual(327.0); + expect(e.cylinder.material.offset.getValue(documentStopDate)).toEqual(328.0); + expect(e.cylinder.material.repeat.getValue(documentStartDate)).toEqual(329.0); + expect(e.cylinder.material.repeat.getValue(documentStopDate)).toEqual(330.0); expect(e = dataSource.entities.getById('sampled28')).toBeDefined(); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.941176470588235, 0.945098039215686, 0.949019607843137, 0.937254901960784), 1e-14); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.956862745098039, 0.96078431372549, 0.964705882352941, 0.952941176470588), 1e-14); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.956862745098039, 0.96078431372549, 0.964705882352941, 0.952941176470588), 1e-14); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.972549019607843, 0.976470588235294, 0.980392156862745, 0.968627450980392), 1e-14); expect(e = dataSource.entities.getById('sampled29')).toBeDefined(); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.972549019607843, 0.976470588235294, 0.980392156862745, 0.968627450980392), 1e-14); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.988235294117647, 0.992156862745098, 0.996078431372549, 0.984313725490196), 1e-14); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.988235294117647, 0.992156862745098, 0.996078431372549, 0.984313725490196), 1e-14); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.00392156862745098, 0.00784313725490196, 0.0117647058823529, 0), 1e-14); expect(e = dataSource.entities.getById('sampled30')).toBeDefined(); - expect(e.cylinder.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.00392156862745098, 0.00784313725490196, 0.0117647058823529, 0), 1e-14); - expect(e.cylinder.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0196078431372549, 0.0235294117647059, 0.0274509803921569, 0.0156862745098039), 1e-14); + expect(e.cylinder.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0196078431372549, 0.0235294117647059, 0.0274509803921569, 0.0156862745098039), 1e-14); + expect(e.cylinder.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0352941176470588, 0.0392156862745098, 0.0431372549019608, 0.0313725490196078), 1e-14); expect(e = dataSource.entities.getById('sampled31')).toBeDefined(); - expect(e.cylinder.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0352941176470588, 0.0392156862745098, 0.0431372549019608, 0.0313725490196078), 1e-14); - expect(e.cylinder.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0509803921568627, 0.0549019607843137, 0.0588235294117647, 0.0470588235294118), 1e-14); + expect(e.cylinder.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0509803921568627, 0.0549019607843137, 0.0588235294117647, 0.0470588235294118), 1e-14); + expect(e.cylinder.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0666666666666667, 0.0705882352941176, 0.0745098039215686, 0.0627450980392157), 1e-14); expect(e = dataSource.entities.getById('sampled32')).toBeDefined(); - expect(e.cylinder.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0666666666666667, 0.0705882352941176, 0.0745098039215686, 0.0627450980392157), 1e-14); - expect(e.cylinder.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0823529411764706, 0.0862745098039216, 0.0901960784313725, 0.0784313725490196), 1e-14); + expect(e.cylinder.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0823529411764706, 0.0862745098039216, 0.0901960784313725, 0.0784313725490196), 1e-14); + expect(e.cylinder.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0980392156862745, 0.101960784313725, 0.105882352941176, 0.0941176470588235), 1e-14); expect(e = dataSource.entities.getById('sampled33')).toBeDefined(); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0980392156862745, 0.101960784313725, 0.105882352941176, 0.0941176470588235), 1e-14); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.113725490196078, 0.117647058823529, 0.12156862745098, 0.109803921568627), 1e-14); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.113725490196078, 0.117647058823529, 0.12156862745098, 0.109803921568627), 1e-14); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.129411764705882, 0.133333333333333, 0.137254901960784, 0.125490196078431), 1e-14); expect(e = dataSource.entities.getById('sampled34')).toBeDefined(); expect(e.ellipse.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(269, 270)); expect(e.ellipse.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(271, 272)); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(90, 91, 92, 89)); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(94, 95, 96, 93)); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(102, 103, 104, 101)); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(106, 107, 108, 105)); expect(e = dataSource.entities.getById('sampled35')).toBeDefined(); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(98, 99, 100, 97)); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(102, 103, 104, 101)); - expect(e.ellipse.material.cellAlpha.getValue(documentStartDate)).toEqual(328.0); - expect(e.ellipse.material.cellAlpha.getValue(documentStopDate)).toEqual(329.0); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(110, 111, 112, 109)); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(114, 115, 116, 113)); + expect(e.ellipse.material.cellAlpha.getValue(documentStartDate)).toEqual(331.0); + expect(e.ellipse.material.cellAlpha.getValue(documentStopDate)).toEqual(332.0); expect(e.ellipse.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(273, 274)); expect(e.ellipse.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(275, 276)); expect(e.ellipse.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(277, 278)); @@ -4263,42 +4275,42 @@ defineSuite([ expect(e.ellipse.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(281, 282)); expect(e.ellipse.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(283, 284)); expect(e = dataSource.entities.getById('sampled36')).toBeDefined(); - expect(e.ellipse.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(106, 107, 108, 105)); - expect(e.ellipse.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(110, 111, 112, 109)); - expect(e.ellipse.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(114, 115, 116, 113)); - expect(e.ellipse.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(118, 119, 120, 117)); - expect(e.ellipse.material.offset.getValue(documentStartDate)).toEqual(330.0); - expect(e.ellipse.material.offset.getValue(documentStopDate)).toEqual(331.0); - expect(e.ellipse.material.repeat.getValue(documentStartDate)).toEqual(332.0); - expect(e.ellipse.material.repeat.getValue(documentStopDate)).toEqual(333.0); + expect(e.ellipse.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(118, 119, 120, 117)); + expect(e.ellipse.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(122, 123, 124, 121)); + expect(e.ellipse.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(126, 127, 128, 125)); + expect(e.ellipse.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(130, 131, 132, 129)); + expect(e.ellipse.material.offset.getValue(documentStartDate)).toEqual(333.0); + expect(e.ellipse.material.offset.getValue(documentStopDate)).toEqual(334.0); + expect(e.ellipse.material.repeat.getValue(documentStartDate)).toEqual(335.0); + expect(e.ellipse.material.repeat.getValue(documentStopDate)).toEqual(336.0); expect(e = dataSource.entities.getById('sampled37')).toBeDefined(); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.129411764705882, 0.133333333333333, 0.137254901960784, 0.125490196078431), 1e-14); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.145098039215686, 0.149019607843137, 0.152941176470588, 0.141176470588235), 1e-14); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.145098039215686, 0.149019607843137, 0.152941176470588, 0.141176470588235), 1e-14); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.16078431372549, 0.164705882352941, 0.168627450980392, 0.156862745098039), 1e-14); expect(e = dataSource.entities.getById('sampled38')).toBeDefined(); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.16078431372549, 0.164705882352941, 0.168627450980392, 0.156862745098039), 1e-14); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.176470588235294, 0.180392156862745, 0.184313725490196, 0.172549019607843), 1e-14); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.176470588235294, 0.180392156862745, 0.184313725490196, 0.172549019607843), 1e-14); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.192156862745098, 0.196078431372549, 0.2, 0.188235294117647), 1e-14); expect(e = dataSource.entities.getById('sampled39')).toBeDefined(); - expect(e.ellipse.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.192156862745098, 0.196078431372549, 0.2, 0.188235294117647), 1e-14); - expect(e.ellipse.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.207843137254902, 0.211764705882353, 0.215686274509804, 0.203921568627451), 1e-14); + expect(e.ellipse.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.207843137254902, 0.211764705882353, 0.215686274509804, 0.203921568627451), 1e-14); + expect(e.ellipse.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.223529411764706, 0.227450980392157, 0.231372549019608, 0.219607843137255), 1e-14); expect(e = dataSource.entities.getById('sampled40')).toBeDefined(); - expect(e.ellipse.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.223529411764706, 0.227450980392157, 0.231372549019608, 0.219607843137255), 1e-14); - expect(e.ellipse.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.23921568627451, 0.243137254901961, 0.247058823529412, 0.235294117647059), 1e-14); + expect(e.ellipse.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.23921568627451, 0.243137254901961, 0.247058823529412, 0.235294117647059), 1e-14); + expect(e.ellipse.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.254901960784314, 0.258823529411765, 0.262745098039216, 0.250980392156863), 1e-14); expect(e = dataSource.entities.getById('sampled41')).toBeDefined(); - expect(e.ellipse.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.254901960784314, 0.258823529411765, 0.262745098039216, 0.250980392156863), 1e-14); - expect(e.ellipse.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.270588235294118, 0.274509803921569, 0.27843137254902, 0.266666666666667), 1e-14); + expect(e.ellipse.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.270588235294118, 0.274509803921569, 0.27843137254902, 0.266666666666667), 1e-14); + expect(e.ellipse.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.286274509803922, 0.290196078431373, 0.294117647058824, 0.282352941176471), 1e-14); expect(e = dataSource.entities.getById('sampled42')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.286274509803922, 0.290196078431373, 0.294117647058824, 0.282352941176471), 1e-14); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.301960784313725, 0.305882352941176, 0.309803921568627, 0.298039215686275), 1e-14); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.301960784313725, 0.305882352941176, 0.309803921568627, 0.298039215686275), 1e-14); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.317647058823529, 0.32156862745098, 0.325490196078431, 0.313725490196078), 1e-14); expect(e = dataSource.entities.getById('sampled43')).toBeDefined(); expect(e.ellipsoid.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(285, 286)); expect(e.ellipsoid.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(287, 288)); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(122, 123, 124, 121)); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(126, 127, 128, 125)); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(134, 135, 136, 133)); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(138, 139, 140, 137)); expect(e = dataSource.entities.getById('sampled44')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(130, 131, 132, 129)); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(134, 135, 136, 133)); - expect(e.ellipsoid.material.cellAlpha.getValue(documentStartDate)).toEqual(334.0); - expect(e.ellipsoid.material.cellAlpha.getValue(documentStopDate)).toEqual(335.0); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(142, 143, 144, 141)); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(146, 147, 148, 145)); + expect(e.ellipsoid.material.cellAlpha.getValue(documentStartDate)).toEqual(337.0); + expect(e.ellipsoid.material.cellAlpha.getValue(documentStopDate)).toEqual(338.0); expect(e.ellipsoid.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(289, 290)); expect(e.ellipsoid.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(291, 292)); expect(e.ellipsoid.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(293, 294)); @@ -4306,308 +4318,310 @@ defineSuite([ expect(e.ellipsoid.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(297, 298)); expect(e.ellipsoid.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(299, 300)); expect(e = dataSource.entities.getById('sampled45')).toBeDefined(); - expect(e.ellipsoid.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(138, 139, 140, 137)); - expect(e.ellipsoid.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(142, 143, 144, 141)); - expect(e.ellipsoid.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(146, 147, 148, 145)); - expect(e.ellipsoid.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(150, 151, 152, 149)); - expect(e.ellipsoid.material.offset.getValue(documentStartDate)).toEqual(336.0); - expect(e.ellipsoid.material.offset.getValue(documentStopDate)).toEqual(337.0); - expect(e.ellipsoid.material.repeat.getValue(documentStartDate)).toEqual(338.0); - expect(e.ellipsoid.material.repeat.getValue(documentStopDate)).toEqual(339.0); + expect(e.ellipsoid.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(150, 151, 152, 149)); + expect(e.ellipsoid.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(154, 155, 156, 153)); + expect(e.ellipsoid.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(158, 159, 160, 157)); + expect(e.ellipsoid.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(162, 163, 164, 161)); + expect(e.ellipsoid.material.offset.getValue(documentStartDate)).toEqual(339.0); + expect(e.ellipsoid.material.offset.getValue(documentStopDate)).toEqual(340.0); + expect(e.ellipsoid.material.repeat.getValue(documentStartDate)).toEqual(341.0); + expect(e.ellipsoid.material.repeat.getValue(documentStopDate)).toEqual(342.0); expect(e = dataSource.entities.getById('sampled46')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.317647058823529, 0.32156862745098, 0.325490196078431, 0.313725490196078), 1e-14); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.333333333333333, 0.337254901960784, 0.341176470588235, 0.329411764705882), 1e-14); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.333333333333333, 0.337254901960784, 0.341176470588235, 0.329411764705882), 1e-14); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.349019607843137, 0.352941176470588, 0.356862745098039, 0.345098039215686), 1e-14); expect(e = dataSource.entities.getById('sampled47')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.349019607843137, 0.352941176470588, 0.356862745098039, 0.345098039215686), 1e-14); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.364705882352941, 0.368627450980392, 0.372549019607843, 0.36078431372549), 1e-14); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.364705882352941, 0.368627450980392, 0.372549019607843, 0.36078431372549), 1e-14); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.380392156862745, 0.384313725490196, 0.388235294117647, 0.376470588235294), 1e-14); expect(e = dataSource.entities.getById('sampled48')).toBeDefined(); - expect(e.ellipsoid.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.380392156862745, 0.384313725490196, 0.388235294117647, 0.376470588235294), 1e-14); - expect(e.ellipsoid.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.396078431372549, 0.4, 0.403921568627451, 0.392156862745098), 1e-14); + expect(e.ellipsoid.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.396078431372549, 0.4, 0.403921568627451, 0.392156862745098), 1e-14); + expect(e.ellipsoid.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.411764705882353, 0.415686274509804, 0.419607843137255, 0.407843137254902), 1e-14); expect(e = dataSource.entities.getById('sampled49')).toBeDefined(); - expect(e.ellipsoid.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.411764705882353, 0.415686274509804, 0.419607843137255, 0.407843137254902), 1e-14); - expect(e.ellipsoid.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.427450980392157, 0.431372549019608, 0.435294117647059, 0.423529411764706), 1e-14); + expect(e.ellipsoid.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.427450980392157, 0.431372549019608, 0.435294117647059, 0.423529411764706), 1e-14); + expect(e.ellipsoid.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.443137254901961, 0.447058823529412, 0.450980392156863, 0.43921568627451), 1e-14); expect(e = dataSource.entities.getById('sampled50')).toBeDefined(); - expect(e.ellipsoid.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.443137254901961, 0.447058823529412, 0.450980392156863, 0.43921568627451), 1e-14); - expect(e.ellipsoid.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.458823529411765, 0.462745098039216, 0.466666666666667, 0.454901960784314), 1e-14); + expect(e.ellipsoid.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.458823529411765, 0.462745098039216, 0.466666666666667, 0.454901960784314), 1e-14); + expect(e.ellipsoid.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.474509803921569, 0.47843137254902, 0.482352941176471, 0.470588235294118), 1e-14); expect(e = dataSource.entities.getById('sampled51')).toBeDefined(); - expect(e.label.fillColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.474509803921569, 0.47843137254902, 0.482352941176471, 0.470588235294118), 1e-14); - expect(e.label.fillColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.490196078431373, 0.494117647058824, 0.498039215686275, 0.486274509803922), 1e-14); + expect(e.label.fillColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.490196078431373, 0.494117647058824, 0.498039215686275, 0.486274509803922), 1e-14); + expect(e.label.fillColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.505882352941176, 0.509803921568627, 0.513725490196078, 0.501960784313725), 1e-14); expect(e = dataSource.entities.getById('sampled52')).toBeDefined(); - expect(e.label.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.505882352941176, 0.509803921568627, 0.513725490196078, 0.501960784313725), 1e-14); - expect(e.label.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.52156862745098, 0.525490196078431, 0.529411764705882, 0.517647058823529), 1e-14); + expect(e.label.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.52156862745098, 0.525490196078431, 0.529411764705882, 0.517647058823529), 1e-14); + expect(e.label.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.537254901960784, 0.541176470588235, 0.545098039215686, 0.533333333333333), 1e-14); expect(e = dataSource.entities.getById('sampled53')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.537254901960784, 0.541176470588235, 0.545098039215686, 0.533333333333333), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.552941176470588, 0.556862745098039, 0.56078431372549, 0.549019607843137), 1e-14); + expect(e.model.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.552941176470588, 0.556862745098039, 0.56078431372549, 0.549019607843137), 1e-14); + expect(e.model.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.568627450980392, 0.572549019607843, 0.576470588235294, 0.564705882352941), 1e-14); expect(e = dataSource.entities.getById('sampled54')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(154, 155, 156, 153)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(158, 159, 160, 157)); - expect(e.path.material.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(162, 163, 164, 161)); - expect(e.path.material.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(166, 167, 168, 165)); - expect(e.path.material.outlineWidth.getValue(documentStartDate)).toEqual(340.0); - expect(e.path.material.outlineWidth.getValue(documentStopDate)).toEqual(341.0); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.584313725490196, 0.588235294117647, 0.592156862745098, 0.580392156862745), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.6, 0.603921568627451, 0.607843137254902, 0.596078431372549), 1e-14); expect(e = dataSource.entities.getById('sampled55')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(170, 171, 172, 169)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(174, 175, 176, 173)); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(166, 167, 168, 165)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(170, 171, 172, 169)); + expect(e.path.material.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(174, 175, 176, 173)); + expect(e.path.material.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(178, 179, 180, 177)); + expect(e.path.material.outlineWidth.getValue(documentStartDate)).toEqual(343.0); + expect(e.path.material.outlineWidth.getValue(documentStopDate)).toEqual(344.0); expect(e = dataSource.entities.getById('sampled56')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(178, 179, 180, 177)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(182, 183, 184, 181)); - expect(e.path.material.glowPower.getValue(documentStartDate)).toEqual(342.0); - expect(e.path.material.glowPower.getValue(documentStopDate)).toEqual(343.0); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(182, 183, 184, 181)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(186, 187, 188, 185)); expect(e = dataSource.entities.getById('sampled57')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(190, 191, 192, 189)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(194, 195, 196, 193)); + expect(e.path.material.glowPower.getValue(documentStartDate)).toEqual(345.0); + expect(e.path.material.glowPower.getValue(documentStopDate)).toEqual(346.0); + expect(e = dataSource.entities.getById('sampled58')).toBeDefined(); expect(e.path.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(301, 302)); expect(e.path.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(303, 304)); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(186, 187, 188, 185)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(190, 191, 192, 189)); - expect(e = dataSource.entities.getById('sampled58')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(194, 195, 196, 193)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(198, 199, 200, 197)); - expect(e.path.material.cellAlpha.getValue(documentStartDate)).toEqual(344.0); - expect(e.path.material.cellAlpha.getValue(documentStopDate)).toEqual(345.0); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(198, 199, 200, 197)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(202, 203, 204, 201)); + expect(e = dataSource.entities.getById('sampled59')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(206, 207, 208, 205)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(210, 211, 212, 209)); + expect(e.path.material.cellAlpha.getValue(documentStartDate)).toEqual(347.0); + expect(e.path.material.cellAlpha.getValue(documentStopDate)).toEqual(348.0); expect(e.path.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(305, 306)); expect(e.path.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(307, 308)); expect(e.path.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(309, 310)); expect(e.path.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(311, 312)); expect(e.path.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(313, 314)); expect(e.path.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(315, 316)); - expect(e = dataSource.entities.getById('sampled59')).toBeDefined(); - expect(e.path.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(202, 203, 204, 201)); - expect(e.path.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(206, 207, 208, 205)); - expect(e.path.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(210, 211, 212, 209)); - expect(e.path.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(214, 215, 216, 213)); - expect(e.path.material.offset.getValue(documentStartDate)).toEqual(346.0); - expect(e.path.material.offset.getValue(documentStopDate)).toEqual(347.0); - expect(e.path.material.repeat.getValue(documentStartDate)).toEqual(348.0); - expect(e.path.material.repeat.getValue(documentStopDate)).toEqual(349.0); expect(e = dataSource.entities.getById('sampled60')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.568627450980392, 0.572549019607843, 0.576470588235294, 0.564705882352941), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.584313725490196, 0.588235294117647, 0.592156862745098, 0.580392156862745), 1e-14); + expect(e.path.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(214, 215, 216, 213)); + expect(e.path.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(218, 219, 220, 217)); + expect(e.path.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(222, 223, 224, 221)); + expect(e.path.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(226, 227, 228, 225)); + expect(e.path.material.offset.getValue(documentStartDate)).toEqual(349.0); + expect(e.path.material.offset.getValue(documentStopDate)).toEqual(350.0); + expect(e.path.material.repeat.getValue(documentStartDate)).toEqual(351.0); + expect(e.path.material.repeat.getValue(documentStopDate)).toEqual(352.0); expect(e = dataSource.entities.getById('sampled61')).toBeDefined(); - expect(e.path.material.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.6, 0.603921568627451, 0.607843137254902, 0.596078431372549), 1e-14); - expect(e.path.material.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.615686274509804, 0.619607843137255, 0.623529411764706, 0.611764705882353), 1e-14); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.615686274509804, 0.619607843137255, 0.623529411764706, 0.611764705882353), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.631372549019608, 0.635294117647059, 0.63921568627451, 0.627450980392157), 1e-14); expect(e = dataSource.entities.getById('sampled62')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.631372549019608, 0.635294117647059, 0.63921568627451, 0.627450980392157), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.647058823529412, 0.650980392156863, 0.654901960784314, 0.643137254901961), 1e-14); + expect(e.path.material.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.647058823529412, 0.650980392156863, 0.654901960784314, 0.643137254901961), 1e-14); + expect(e.path.material.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.662745098039216, 0.666666666666667, 0.670588235294118, 0.658823529411765), 1e-14); expect(e = dataSource.entities.getById('sampled63')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.662745098039216, 0.666666666666667, 0.670588235294118, 0.658823529411765), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.67843137254902, 0.682352941176471, 0.686274509803922, 0.674509803921569), 1e-14); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.67843137254902, 0.682352941176471, 0.686274509803922, 0.674509803921569), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.694117647058824, 0.698039215686274, 0.701960784313725, 0.690196078431373), 1e-14); expect(e = dataSource.entities.getById('sampled64')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.694117647058824, 0.698039215686274, 0.701960784313725, 0.690196078431373), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.709803921568627, 0.713725490196078, 0.717647058823529, 0.705882352941177), 1e-14); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.709803921568627, 0.713725490196078, 0.717647058823529, 0.705882352941177), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.725490196078431, 0.729411764705882, 0.733333333333333, 0.72156862745098), 1e-14); expect(e = dataSource.entities.getById('sampled65')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.725490196078431, 0.729411764705882, 0.733333333333333, 0.72156862745098), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.741176470588235, 0.745098039215686, 0.749019607843137, 0.737254901960784), 1e-14); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.741176470588235, 0.745098039215686, 0.749019607843137, 0.737254901960784), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.756862745098039, 0.76078431372549, 0.764705882352941, 0.752941176470588), 1e-14); expect(e = dataSource.entities.getById('sampled66')).toBeDefined(); - expect(e.path.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.756862745098039, 0.76078431372549, 0.764705882352941, 0.752941176470588), 1e-14); - expect(e.path.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.772549019607843, 0.776470588235294, 0.780392156862745, 0.768627450980392), 1e-14); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.772549019607843, 0.776470588235294, 0.780392156862745, 0.768627450980392), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.788235294117647, 0.792156862745098, 0.796078431372549, 0.784313725490196), 1e-14); expect(e = dataSource.entities.getById('sampled67')).toBeDefined(); - expect(e.path.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.788235294117647, 0.792156862745098, 0.796078431372549, 0.784313725490196), 1e-14); - expect(e.path.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.803921568627451, 0.807843137254902, 0.811764705882353, 0.8), 1e-14); + expect(e.path.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.803921568627451, 0.807843137254902, 0.811764705882353, 0.8), 1e-14); + expect(e.path.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.819607843137255, 0.823529411764706, 0.827450980392157, 0.815686274509804), 1e-14); expect(e = dataSource.entities.getById('sampled68')).toBeDefined(); - expect(e.point.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.819607843137255, 0.823529411764706, 0.827450980392157, 0.815686274509804), 1e-14); - expect(e.point.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.835294117647059, 0.83921568627451, 0.843137254901961, 0.831372549019608), 1e-14); + expect(e.path.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.835294117647059, 0.83921568627451, 0.843137254901961, 0.831372549019608), 1e-14); + expect(e.path.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.850980392156863, 0.854901960784314, 0.858823529411765, 0.847058823529412), 1e-14); expect(e = dataSource.entities.getById('sampled69')).toBeDefined(); - expect(e.point.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.850980392156863, 0.854901960784314, 0.858823529411765, 0.847058823529412), 1e-14); - expect(e.point.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.866666666666667, 0.870588235294118, 0.874509803921569, 0.862745098039216), 1e-14); + expect(e.point.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.866666666666667, 0.870588235294118, 0.874509803921569, 0.862745098039216), 1e-14); + expect(e.point.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.882352941176471, 0.886274509803922, 0.890196078431373, 0.87843137254902), 1e-14); expect(e = dataSource.entities.getById('sampled70')).toBeDefined(); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.882352941176471, 0.886274509803922, 0.890196078431373, 0.87843137254902), 1e-14); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.898039215686275, 0.901960784313726, 0.905882352941176, 0.894117647058824), 1e-14); + expect(e.point.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.898039215686275, 0.901960784313726, 0.905882352941176, 0.894117647058824), 1e-14); + expect(e.point.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.913725490196078, 0.917647058823529, 0.92156862745098, 0.909803921568627), 1e-14); expect(e = dataSource.entities.getById('sampled71')).toBeDefined(); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.929411764705882, 0.933333333333333, 0.937254901960784, 0.925490196078431), 1e-14); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.945098039215686, 0.949019607843137, 0.952941176470588, 0.941176470588235), 1e-14); + expect(e = dataSource.entities.getById('sampled72')).toBeDefined(); expect(e.polygon.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(317, 318)); expect(e.polygon.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(319, 320)); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(218, 219, 220, 217)); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(222, 223, 224, 221)); - expect(e = dataSource.entities.getById('sampled72')).toBeDefined(); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(226, 227, 228, 225)); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(230, 231, 232, 229)); - expect(e.polygon.material.cellAlpha.getValue(documentStartDate)).toEqual(350.0); - expect(e.polygon.material.cellAlpha.getValue(documentStopDate)).toEqual(351.0); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(230, 231, 232, 229)); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(234, 235, 236, 233)); + expect(e = dataSource.entities.getById('sampled73')).toBeDefined(); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(238, 239, 240, 237)); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(242, 243, 244, 241)); + expect(e.polygon.material.cellAlpha.getValue(documentStartDate)).toEqual(353.0); + expect(e.polygon.material.cellAlpha.getValue(documentStopDate)).toEqual(354.0); expect(e.polygon.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(321, 322)); expect(e.polygon.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(323, 324)); expect(e.polygon.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(325, 326)); expect(e.polygon.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(327, 328)); expect(e.polygon.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(329, 330)); expect(e.polygon.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(331, 332)); - expect(e = dataSource.entities.getById('sampled73')).toBeDefined(); - expect(e.polygon.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(234, 235, 236, 233)); - expect(e.polygon.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(238, 239, 240, 237)); - expect(e.polygon.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(242, 243, 244, 241)); - expect(e.polygon.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(246, 247, 248, 245)); - expect(e.polygon.material.offset.getValue(documentStartDate)).toEqual(352.0); - expect(e.polygon.material.offset.getValue(documentStopDate)).toEqual(353.0); - expect(e.polygon.material.repeat.getValue(documentStartDate)).toEqual(354.0); - expect(e.polygon.material.repeat.getValue(documentStopDate)).toEqual(355.0); expect(e = dataSource.entities.getById('sampled74')).toBeDefined(); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.913725490196078, 0.917647058823529, 0.92156862745098, 0.909803921568627), 1e-14); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.929411764705882, 0.933333333333333, 0.937254901960784, 0.925490196078431), 1e-14); + expect(e.polygon.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(246, 247, 248, 245)); + expect(e.polygon.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(250, 251, 252, 249)); + expect(e.polygon.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(254, 0, 1, 253)); + expect(e.polygon.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(3, 4, 5, 2)); + expect(e.polygon.material.offset.getValue(documentStartDate)).toEqual(355.0); + expect(e.polygon.material.offset.getValue(documentStopDate)).toEqual(356.0); + expect(e.polygon.material.repeat.getValue(documentStartDate)).toEqual(357.0); + expect(e.polygon.material.repeat.getValue(documentStopDate)).toEqual(358.0); expect(e = dataSource.entities.getById('sampled75')).toBeDefined(); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.945098039215686, 0.949019607843137, 0.952941176470588, 0.941176470588235), 1e-14); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.96078431372549, 0.964705882352941, 0.968627450980392, 0.956862745098039), 1e-14); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.96078431372549, 0.964705882352941, 0.968627450980392, 0.956862745098039), 1e-14); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.976470588235294, 0.980392156862745, 0.984313725490196, 0.972549019607843), 1e-14); expect(e = dataSource.entities.getById('sampled76')).toBeDefined(); - expect(e.polygon.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.976470588235294, 0.980392156862745, 0.984313725490196, 0.972549019607843), 1e-14); - expect(e.polygon.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.992156862745098, 0.996078431372549, 0, 0.988235294117647), 1e-14); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.992156862745098, 0.996078431372549, 0, 0.988235294117647), 1e-14); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.00784313725490196, 0.0117647058823529, 0.0156862745098039, 0.00392156862745098), 1e-14); expect(e = dataSource.entities.getById('sampled77')).toBeDefined(); - expect(e.polygon.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.00784313725490196, 0.0117647058823529, 0.0156862745098039, 0.00392156862745098), 1e-14); - expect(e.polygon.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0235294117647059, 0.0274509803921569, 0.0313725490196078, 0.0196078431372549), 1e-14); + expect(e.polygon.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0235294117647059, 0.0274509803921569, 0.0313725490196078, 0.0196078431372549), 1e-14); + expect(e.polygon.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0392156862745098, 0.0431372549019608, 0.0470588235294118, 0.0352941176470588), 1e-14); expect(e = dataSource.entities.getById('sampled78')).toBeDefined(); - expect(e.polygon.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0392156862745098, 0.0431372549019608, 0.0470588235294118, 0.0352941176470588), 1e-14); - expect(e.polygon.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0549019607843137, 0.0588235294117647, 0.0627450980392157, 0.0509803921568627), 1e-14); + expect(e.polygon.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0549019607843137, 0.0588235294117647, 0.0627450980392157, 0.0509803921568627), 1e-14); + expect(e.polygon.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0705882352941176, 0.0745098039215686, 0.0784313725490196, 0.0666666666666667), 1e-14); expect(e = dataSource.entities.getById('sampled79')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0705882352941176, 0.0745098039215686, 0.0784313725490196, 0.0666666666666667), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0862745098039216, 0.0901960784313725, 0.0941176470588235, 0.0823529411764706), 1e-14); + expect(e.polygon.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0862745098039216, 0.0901960784313725, 0.0941176470588235, 0.0823529411764706), 1e-14); + expect(e.polygon.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.101960784313725, 0.105882352941176, 0.109803921568627, 0.0980392156862745), 1e-14); expect(e = dataSource.entities.getById('sampled80')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(250, 251, 252, 249)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(254, 0, 1, 253)); - expect(e.polyline.material.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(3, 4, 5, 2)); - expect(e.polyline.material.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(7, 8, 9, 6)); - expect(e.polyline.material.outlineWidth.getValue(documentStartDate)).toEqual(356.0); - expect(e.polyline.material.outlineWidth.getValue(documentStopDate)).toEqual(357.0); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.117647058823529, 0.12156862745098, 0.125490196078431, 0.113725490196078), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.133333333333333, 0.137254901960784, 0.141176470588235, 0.129411764705882), 1e-14); expect(e = dataSource.entities.getById('sampled81')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(11, 12, 13, 10)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(15, 16, 17, 14)); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(7, 8, 9, 6)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(11, 12, 13, 10)); + expect(e.polyline.material.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(15, 16, 17, 14)); + expect(e.polyline.material.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(19, 20, 21, 18)); + expect(e.polyline.material.outlineWidth.getValue(documentStartDate)).toEqual(359.0); + expect(e.polyline.material.outlineWidth.getValue(documentStopDate)).toEqual(360.0); expect(e = dataSource.entities.getById('sampled82')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(19, 20, 21, 18)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(23, 24, 25, 22)); - expect(e.polyline.material.glowPower.getValue(documentStartDate)).toEqual(358.0); - expect(e.polyline.material.glowPower.getValue(documentStopDate)).toEqual(359.0); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(23, 24, 25, 22)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(27, 28, 29, 26)); expect(e = dataSource.entities.getById('sampled83')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(31, 32, 33, 30)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(35, 36, 37, 34)); + expect(e.polyline.material.glowPower.getValue(documentStartDate)).toEqual(361.0); + expect(e.polyline.material.glowPower.getValue(documentStopDate)).toEqual(362.0); + expect(e = dataSource.entities.getById('sampled84')).toBeDefined(); expect(e.polyline.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(333, 334)); expect(e.polyline.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(335, 336)); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(27, 28, 29, 26)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(31, 32, 33, 30)); - expect(e = dataSource.entities.getById('sampled84')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(35, 36, 37, 34)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(39, 40, 41, 38)); - expect(e.polyline.material.cellAlpha.getValue(documentStartDate)).toEqual(360.0); - expect(e.polyline.material.cellAlpha.getValue(documentStopDate)).toEqual(361.0); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(39, 40, 41, 38)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(43, 44, 45, 42)); + expect(e = dataSource.entities.getById('sampled85')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(47, 48, 49, 46)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(51, 52, 53, 50)); + expect(e.polyline.material.cellAlpha.getValue(documentStartDate)).toEqual(363.0); + expect(e.polyline.material.cellAlpha.getValue(documentStopDate)).toEqual(364.0); expect(e.polyline.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(337, 338)); expect(e.polyline.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(339, 340)); expect(e.polyline.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(341, 342)); expect(e.polyline.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(343, 344)); expect(e.polyline.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(345, 346)); expect(e.polyline.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(347, 348)); - expect(e = dataSource.entities.getById('sampled85')).toBeDefined(); - expect(e.polyline.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(43, 44, 45, 42)); - expect(e.polyline.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(47, 48, 49, 46)); - expect(e.polyline.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(51, 52, 53, 50)); - expect(e.polyline.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(55, 56, 57, 54)); - expect(e.polyline.material.offset.getValue(documentStartDate)).toEqual(362.0); - expect(e.polyline.material.offset.getValue(documentStopDate)).toEqual(363.0); - expect(e.polyline.material.repeat.getValue(documentStartDate)).toEqual(364.0); - expect(e.polyline.material.repeat.getValue(documentStopDate)).toEqual(365.0); expect(e = dataSource.entities.getById('sampled86')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.101960784313725, 0.105882352941176, 0.109803921568627, 0.0980392156862745), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.117647058823529, 0.12156862745098, 0.125490196078431, 0.113725490196078), 1e-14); + expect(e.polyline.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(55, 56, 57, 54)); + expect(e.polyline.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(59, 60, 61, 58)); + expect(e.polyline.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(63, 64, 65, 62)); + expect(e.polyline.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(67, 68, 69, 66)); + expect(e.polyline.material.offset.getValue(documentStartDate)).toEqual(365.0); + expect(e.polyline.material.offset.getValue(documentStopDate)).toEqual(366.0); + expect(e.polyline.material.repeat.getValue(documentStartDate)).toEqual(367.0); + expect(e.polyline.material.repeat.getValue(documentStopDate)).toEqual(368.0); expect(e = dataSource.entities.getById('sampled87')).toBeDefined(); - expect(e.polyline.material.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.133333333333333, 0.137254901960784, 0.141176470588235, 0.129411764705882), 1e-14); - expect(e.polyline.material.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.149019607843137, 0.152941176470588, 0.156862745098039, 0.145098039215686), 1e-14); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.149019607843137, 0.152941176470588, 0.156862745098039, 0.145098039215686), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.164705882352941, 0.168627450980392, 0.172549019607843, 0.16078431372549), 1e-14); expect(e = dataSource.entities.getById('sampled88')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.164705882352941, 0.168627450980392, 0.172549019607843, 0.16078431372549), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.180392156862745, 0.184313725490196, 0.188235294117647, 0.176470588235294), 1e-14); + expect(e.polyline.material.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.180392156862745, 0.184313725490196, 0.188235294117647, 0.176470588235294), 1e-14); + expect(e.polyline.material.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.196078431372549, 0.2, 0.203921568627451, 0.192156862745098), 1e-14); expect(e = dataSource.entities.getById('sampled89')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.196078431372549, 0.2, 0.203921568627451, 0.192156862745098), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.211764705882353, 0.215686274509804, 0.219607843137255, 0.207843137254902), 1e-14); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.211764705882353, 0.215686274509804, 0.219607843137255, 0.207843137254902), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.227450980392157, 0.231372549019608, 0.235294117647059, 0.223529411764706), 1e-14); expect(e = dataSource.entities.getById('sampled90')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.227450980392157, 0.231372549019608, 0.235294117647059, 0.223529411764706), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.243137254901961, 0.247058823529412, 0.250980392156863, 0.23921568627451), 1e-14); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.243137254901961, 0.247058823529412, 0.250980392156863, 0.23921568627451), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.258823529411765, 0.262745098039216, 0.266666666666667, 0.254901960784314), 1e-14); expect(e = dataSource.entities.getById('sampled91')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.258823529411765, 0.262745098039216, 0.266666666666667, 0.254901960784314), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.274509803921569, 0.27843137254902, 0.282352941176471, 0.270588235294118), 1e-14); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.274509803921569, 0.27843137254902, 0.282352941176471, 0.270588235294118), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.290196078431373, 0.294117647058824, 0.298039215686275, 0.286274509803922), 1e-14); expect(e = dataSource.entities.getById('sampled92')).toBeDefined(); - expect(e.polyline.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.290196078431373, 0.294117647058824, 0.298039215686275, 0.286274509803922), 1e-14); - expect(e.polyline.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.305882352941176, 0.309803921568627, 0.313725490196078, 0.301960784313725), 1e-14); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.305882352941176, 0.309803921568627, 0.313725490196078, 0.301960784313725), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.32156862745098, 0.325490196078431, 0.329411764705882, 0.317647058823529), 1e-14); expect(e = dataSource.entities.getById('sampled93')).toBeDefined(); - expect(e.polyline.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.32156862745098, 0.325490196078431, 0.329411764705882, 0.317647058823529), 1e-14); - expect(e.polyline.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.337254901960784, 0.341176470588235, 0.345098039215686, 0.333333333333333), 1e-14); + expect(e.polyline.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.337254901960784, 0.341176470588235, 0.345098039215686, 0.333333333333333), 1e-14); + expect(e.polyline.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.352941176470588, 0.356862745098039, 0.36078431372549, 0.349019607843137), 1e-14); expect(e = dataSource.entities.getById('sampled94')).toBeDefined(); + expect(e.polyline.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.368627450980392, 0.372549019607843, 0.376470588235294, 0.364705882352941), 1e-14); + expect(e.polyline.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.384313725490196, 0.388235294117647, 0.392156862745098, 0.380392156862745), 1e-14); + expect(e = dataSource.entities.getById('sampled95')).toBeDefined(); expect(e.rectangle.coordinates.getValue(documentStartDate)).toEqual(Rectangle.fromDegrees(17, 18, 19, 20)); expect(e.rectangle.coordinates.getValue(documentStopDate)).toEqual(Rectangle.fromDegrees(21, 22, 23, 24)); - expect(e = dataSource.entities.getById('sampled95')).toBeDefined(); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.352941176470588, 0.356862745098039, 0.36078431372549, 0.349019607843137), 1e-14); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.368627450980392, 0.372549019607843, 0.376470588235294, 0.364705882352941), 1e-14); expect(e = dataSource.entities.getById('sampled96')).toBeDefined(); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.4, 0.403921568627451, 0.407843137254902, 0.396078431372549), 1e-14); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.415686274509804, 0.419607843137255, 0.423529411764706, 0.411764705882353), 1e-14); + expect(e = dataSource.entities.getById('sampled97')).toBeDefined(); expect(e.rectangle.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(349, 350)); expect(e.rectangle.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(351, 352)); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(59, 60, 61, 58)); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(63, 64, 65, 62)); - expect(e = dataSource.entities.getById('sampled97')).toBeDefined(); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(67, 68, 69, 66)); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(71, 72, 73, 70)); - expect(e.rectangle.material.cellAlpha.getValue(documentStartDate)).toEqual(366.0); - expect(e.rectangle.material.cellAlpha.getValue(documentStopDate)).toEqual(367.0); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(71, 72, 73, 70)); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(75, 76, 77, 74)); + expect(e = dataSource.entities.getById('sampled98')).toBeDefined(); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(79, 80, 81, 78)); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(83, 84, 85, 82)); + expect(e.rectangle.material.cellAlpha.getValue(documentStartDate)).toEqual(369.0); + expect(e.rectangle.material.cellAlpha.getValue(documentStopDate)).toEqual(370.0); expect(e.rectangle.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(353, 354)); expect(e.rectangle.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(355, 356)); expect(e.rectangle.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(357, 358)); expect(e.rectangle.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(359, 360)); expect(e.rectangle.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(361, 362)); expect(e.rectangle.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(363, 364)); - expect(e = dataSource.entities.getById('sampled98')).toBeDefined(); - expect(e.rectangle.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(75, 76, 77, 74)); - expect(e.rectangle.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(79, 80, 81, 78)); - expect(e.rectangle.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(83, 84, 85, 82)); - expect(e.rectangle.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(87, 88, 89, 86)); - expect(e.rectangle.material.offset.getValue(documentStartDate)).toEqual(368.0); - expect(e.rectangle.material.offset.getValue(documentStopDate)).toEqual(369.0); - expect(e.rectangle.material.repeat.getValue(documentStartDate)).toEqual(370.0); - expect(e.rectangle.material.repeat.getValue(documentStopDate)).toEqual(371.0); expect(e = dataSource.entities.getById('sampled99')).toBeDefined(); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.384313725490196, 0.388235294117647, 0.392156862745098, 0.380392156862745), 1e-14); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.4, 0.403921568627451, 0.407843137254902, 0.396078431372549), 1e-14); + expect(e.rectangle.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(87, 88, 89, 86)); + expect(e.rectangle.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(91, 92, 93, 90)); + expect(e.rectangle.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(95, 96, 97, 94)); + expect(e.rectangle.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(99, 100, 101, 98)); + expect(e.rectangle.material.offset.getValue(documentStartDate)).toEqual(371.0); + expect(e.rectangle.material.offset.getValue(documentStopDate)).toEqual(372.0); + expect(e.rectangle.material.repeat.getValue(documentStartDate)).toEqual(373.0); + expect(e.rectangle.material.repeat.getValue(documentStopDate)).toEqual(374.0); expect(e = dataSource.entities.getById('sampled100')).toBeDefined(); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.415686274509804, 0.419607843137255, 0.423529411764706, 0.411764705882353), 1e-14); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.431372549019608, 0.435294117647059, 0.43921568627451, 0.427450980392157), 1e-14); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.431372549019608, 0.435294117647059, 0.43921568627451, 0.427450980392157), 1e-14); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.447058823529412, 0.450980392156863, 0.454901960784314, 0.443137254901961), 1e-14); expect(e = dataSource.entities.getById('sampled101')).toBeDefined(); - expect(e.rectangle.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.447058823529412, 0.450980392156863, 0.454901960784314, 0.443137254901961), 1e-14); - expect(e.rectangle.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.462745098039216, 0.466666666666667, 0.470588235294118, 0.458823529411765), 1e-14); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.462745098039216, 0.466666666666667, 0.470588235294118, 0.458823529411765), 1e-14); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.47843137254902, 0.482352941176471, 0.486274509803922, 0.474509803921569), 1e-14); expect(e = dataSource.entities.getById('sampled102')).toBeDefined(); - expect(e.rectangle.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.47843137254902, 0.482352941176471, 0.486274509803922, 0.474509803921569), 1e-14); - expect(e.rectangle.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.494117647058824, 0.498039215686275, 0.501960784313725, 0.490196078431373), 1e-14); + expect(e.rectangle.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.494117647058824, 0.498039215686275, 0.501960784313725, 0.490196078431373), 1e-14); + expect(e.rectangle.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.509803921568627, 0.513725490196078, 0.517647058823529, 0.505882352941176), 1e-14); expect(e = dataSource.entities.getById('sampled103')).toBeDefined(); - expect(e.rectangle.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.509803921568627, 0.513725490196078, 0.517647058823529, 0.505882352941176), 1e-14); - expect(e.rectangle.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.525490196078431, 0.529411764705882, 0.533333333333333, 0.52156862745098), 1e-14); + expect(e.rectangle.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.525490196078431, 0.529411764705882, 0.533333333333333, 0.52156862745098), 1e-14); + expect(e.rectangle.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.541176470588235, 0.545098039215686, 0.549019607843137, 0.537254901960784), 1e-14); expect(e = dataSource.entities.getById('sampled104')).toBeDefined(); - expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.541176470588235, 0.545098039215686, 0.549019607843137, 0.537254901960784), 1e-14); - expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.556862745098039, 0.56078431372549, 0.564705882352941, 0.552941176470588), 1e-14); + expect(e.rectangle.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.556862745098039, 0.56078431372549, 0.564705882352941, 0.552941176470588), 1e-14); + expect(e.rectangle.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.572549019607843, 0.576470588235294, 0.580392156862745, 0.568627450980392), 1e-14); expect(e = dataSource.entities.getById('sampled105')).toBeDefined(); + expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.588235294117647, 0.592156862745098, 0.596078431372549, 0.584313725490196), 1e-14); + expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.603921568627451, 0.607843137254902, 0.611764705882353, 0.6), 1e-14); + expect(e = dataSource.entities.getById('sampled106')).toBeDefined(); expect(e.wall.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(365, 366)); expect(e.wall.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(367, 368)); - expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(91, 92, 93, 90)); - expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(95, 96, 97, 94)); - expect(e = dataSource.entities.getById('sampled106')).toBeDefined(); - expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(99, 100, 101, 98)); - expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(103, 104, 105, 102)); - expect(e.wall.material.cellAlpha.getValue(documentStartDate)).toEqual(372.0); - expect(e.wall.material.cellAlpha.getValue(documentStopDate)).toEqual(373.0); + expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(103, 104, 105, 102)); + expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(107, 108, 109, 106)); + expect(e = dataSource.entities.getById('sampled107')).toBeDefined(); + expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(111, 112, 113, 110)); + expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(115, 116, 117, 114)); + expect(e.wall.material.cellAlpha.getValue(documentStartDate)).toEqual(375.0); + expect(e.wall.material.cellAlpha.getValue(documentStopDate)).toEqual(376.0); expect(e.wall.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(369, 370)); expect(e.wall.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(371, 372)); expect(e.wall.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(373, 374)); expect(e.wall.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(375, 376)); expect(e.wall.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(377, 378)); expect(e.wall.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(379, 380)); - expect(e = dataSource.entities.getById('sampled107')).toBeDefined(); - expect(e.wall.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(107, 108, 109, 106)); - expect(e.wall.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(111, 112, 113, 110)); - expect(e.wall.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(115, 116, 117, 114)); - expect(e.wall.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(119, 120, 121, 118)); - expect(e.wall.material.offset.getValue(documentStartDate)).toEqual(374.0); - expect(e.wall.material.offset.getValue(documentStopDate)).toEqual(375.0); - expect(e.wall.material.repeat.getValue(documentStartDate)).toEqual(376.0); - expect(e.wall.material.repeat.getValue(documentStopDate)).toEqual(377.0); expect(e = dataSource.entities.getById('sampled108')).toBeDefined(); - expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.572549019607843, 0.576470588235294, 0.580392156862745, 0.568627450980392), 1e-14); - expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.588235294117647, 0.592156862745098, 0.596078431372549, 0.584313725490196), 1e-14); + expect(e.wall.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(119, 120, 121, 118)); + expect(e.wall.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(123, 124, 125, 122)); + expect(e.wall.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(127, 128, 129, 126)); + expect(e.wall.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(131, 132, 133, 130)); + expect(e.wall.material.offset.getValue(documentStartDate)).toEqual(377.0); + expect(e.wall.material.offset.getValue(documentStopDate)).toEqual(378.0); + expect(e.wall.material.repeat.getValue(documentStartDate)).toEqual(379.0); + expect(e.wall.material.repeat.getValue(documentStopDate)).toEqual(380.0); expect(e = dataSource.entities.getById('sampled109')).toBeDefined(); - expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.603921568627451, 0.607843137254902, 0.611764705882353, 0.6), 1e-14); - expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.619607843137255, 0.623529411764706, 0.627450980392157, 0.615686274509804), 1e-14); + expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.619607843137255, 0.623529411764706, 0.627450980392157, 0.615686274509804), 1e-14); + expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.635294117647059, 0.63921568627451, 0.643137254901961, 0.631372549019608), 1e-14); expect(e = dataSource.entities.getById('sampled110')).toBeDefined(); - expect(e.wall.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.635294117647059, 0.63921568627451, 0.643137254901961, 0.631372549019608), 1e-14); - expect(e.wall.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.650980392156863, 0.654901960784314, 0.658823529411765, 0.647058823529412), 1e-14); + expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.650980392156863, 0.654901960784314, 0.658823529411765, 0.647058823529412), 1e-14); + expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.666666666666667, 0.670588235294118, 0.674509803921569, 0.662745098039216), 1e-14); expect(e = dataSource.entities.getById('sampled111')).toBeDefined(); - expect(e.wall.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.666666666666667, 0.670588235294118, 0.674509803921569, 0.662745098039216), 1e-14); - expect(e.wall.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.682352941176471, 0.686274509803922, 0.690196078431373, 0.67843137254902), 1e-14); + expect(e.wall.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.682352941176471, 0.686274509803922, 0.690196078431373, 0.67843137254902), 1e-14); + expect(e.wall.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.698039215686274, 0.701960784313725, 0.705882352941177, 0.694117647058824), 1e-14); expect(e = dataSource.entities.getById('sampled112')).toBeDefined(); - expect(e.wall.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.698039215686274, 0.701960784313725, 0.705882352941177, 0.694117647058824), 1e-14); - expect(e.wall.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.713725490196078, 0.717647058823529, 0.72156862745098, 0.709803921568627), 1e-14); + expect(e.wall.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.713725490196078, 0.717647058823529, 0.72156862745098, 0.709803921568627), 1e-14); + expect(e.wall.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.729411764705882, 0.733333333333333, 0.737254901960784, 0.725490196078431), 1e-14); expect(e = dataSource.entities.getById('sampled113')).toBeDefined(); + expect(e.wall.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.745098039215686, 0.749019607843137, 0.752941176470588, 0.741176470588235), 1e-14); + expect(e.wall.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.76078431372549, 0.764705882352941, 0.768627450980392, 0.756862745098039), 1e-14); expect(e = dataSource.entities.getById('sampled114')).toBeDefined(); expect(e = dataSource.entities.getById('sampled115')).toBeDefined(); expect(e = dataSource.entities.getById('sampled116')).toBeDefined(); @@ -4746,6 +4760,7 @@ defineSuite([ expect(e = dataSource.entities.getById('sampled249')).toBeDefined(); expect(e = dataSource.entities.getById('sampled250')).toBeDefined(); expect(e = dataSource.entities.getById('sampled251')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled252')).toBeDefined(); }); }); }); From 466b034e753959dab3f6df307b377db45c97ae73 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Tue, 6 Dec 2016 18:16:46 -0500 Subject: [PATCH 133/396] fix texture rotation --- Source/Core/RectangleGeometry.js | 14 ++- Source/Core/RectangleGeometryLibrary.js | 144 ++++++++++++++++++++---- 2 files changed, 128 insertions(+), 30 deletions(-) diff --git a/Source/Core/RectangleGeometry.js b/Source/Core/RectangleGeometry.js index f69cd251fe5c..6244f3c9866a 100644 --- a/Source/Core/RectangleGeometry.js +++ b/Source/Core/RectangleGeometry.js @@ -776,6 +776,7 @@ define([ var surfaceHeight = rectangleGeometry._surfaceHeight; var extrude = rectangleGeometry._extrude; var extrudedHeight = rectangleGeometry._extrudedHeight; + var rotation = rectangleGeometry._rotation; var stRotation = rectangleGeometry._stRotation; var vertexFormat = rectangleGeometry._vertexFormat; @@ -783,12 +784,11 @@ define([ var textureMatrix = textureMatrixScratch; var tangentRotationMatrix = tangentRotationMatrixScratch; - if (defined(stRotation)) { + if (stRotation !== 0 || rotation !== 0) { // negate angle for a counter-clockwise rotation - Matrix2.fromRotation(-stRotation, textureMatrix); + Matrix2.fromRotation(-(stRotation - rotation), textureMatrix); var center = Rectangle.center(rectangle, centerScratch); - var axis = ellipsoid.cartographicToCartesian(center, v1Scratch); - Cartesian3.normalize(axis, axis); + var axis = ellipsoid.geodeticSurfaceNormalCartographic(center, v1Scratch); Quaternion.fromAxisAngle(axis, -stRotation, quaternionScratch); Matrix3.fromQuaternion(quaternionScratch, tangentRotationMatrix); } else { @@ -796,10 +796,12 @@ define([ Matrix3.clone(Matrix3.IDENTITY, tangentRotationMatrix); } - options.lonScalar = 1.0 / rectangle.width; - options.latScalar = 1.0 / rectangle.height; + options.lonScalar = 1.0 / rectangleGeometry._rectangle.width; + options.latScalar = 1.0 / rectangleGeometry._rectangle.height; options.vertexFormat = vertexFormat; options.textureMatrix = textureMatrix; + options.rotation = rotation; + options.stRotation = stRotation; options.tangentRotationMatrix = tangentRotationMatrix; options.size = options.width * options.height; diff --git a/Source/Core/RectangleGeometryLibrary.js b/Source/Core/RectangleGeometryLibrary.js index e1c30e46a9ac..fb4249909036 100644 --- a/Source/Core/RectangleGeometryLibrary.js +++ b/Source/Core/RectangleGeometryLibrary.js @@ -1,22 +1,22 @@ /*global define*/ define([ - './Cartesian3', - './Cartographic', - './defined', - './DeveloperError', - './GeographicProjection', - './Math', - './Matrix2', - './Rectangle' - ], function( - Cartesian3, - Cartographic, - defined, - DeveloperError, - GeographicProjection, - CesiumMath, - Matrix2, - Rectangle) { + './Cartesian3', + './Cartographic', + './defined', + './DeveloperError', + './GeographicProjection', + './Math', + './Matrix2', + './Rectangle' +], function( + Cartesian3, + Cartographic, + defined, + DeveloperError, + GeographicProjection, + CesiumMath, + Matrix2, + Rectangle) { 'use strict'; var cos = Math.cos; @@ -55,10 +55,50 @@ define([ position.z = kZ / gamma; if (defined(options.vertexFormat) && options.vertexFormat.st) { - st.x = (stLongitude - rectangle.west) * options.lonScalar; - st.y = (stLatitude - rectangle.south) * options.latScalar; + var stnwCorner = options.stnwCorner; + if (defined(stnwCorner)) { + stLatitude = stnwCorner.latitude - options.stgranycos * row + col * options.stgranxsin; + stLongitude = stnwCorner.longitude + row * options.stgranysin + col * options.stgranxcos; - Matrix2.multiplyByVector(options.textureMatrix, st, st); + st.x = (stLongitude - options.stwest) * options.lonScalar; + st.y = (stLatitude - options.stsouth) * options.latScalar; + } else { + st.x = (stLongitude - rectangle.west) * options.lonScalar; + st.y = (stLatitude - rectangle.south) * options.latScalar; + } + + + // var stRotation = options.stRotation - options.rotation; + // var cosRotation = Math.cos(stRotation); + // var granularityX = 1/options.width; + // var granularityY = 1/options.height; + // var granYCos = granularityY; + // var granXCos = granularityX; + // var granYSin = 0.0; + // var granXSin = 0.0; + // + // granYCos *= cosRotation; + // granXCos *= cosRotation; + // + // var sinRotation = Math.sin(stRotation); + // granYSin = granularityY * sinRotation; + // granXSin = granularityX * sinRotation; + // + // + // st.x -= 0.5; + // st.y -= 0.5; + // + // + // + // + // // st.x = col * 1/options.width; + // // st.y = 1 - row * 1/options.height; + // + // st.x = row * granYSin + col * granXCos; + // st.y = 1 - (granYCos * row + col * granXSin); + // + // st.x += 0.5; + // st.y += 0.5; } }; @@ -75,6 +115,7 @@ define([ var ellipsoid = geometry._ellipsoid; var surfaceHeight = geometry._surfaceHeight; var rotation = geometry._rotation; + var stRotation = geometry._stRotation; var extrudedHeight = geometry._extrudedHeight; var east = rectangle.east; var west = rectangle.west; @@ -149,7 +190,7 @@ define([ //>>includeStart('debug', pragmas.debug); if (north < -CesiumMath.PI_OVER_TWO || north > CesiumMath.PI_OVER_TWO || - south < -CesiumMath.PI_OVER_TWO || south > CesiumMath.PI_OVER_TWO) { + south < -CesiumMath.PI_OVER_TWO || south > CesiumMath.PI_OVER_TWO) { throw new DeveloperError('Rotated rectangle is invalid. It crosses over either the north or south pole.'); } //>>includeEnd('debug') @@ -160,18 +201,73 @@ define([ rectangle.west = west; } - return { + var stgranYCos; + var stgranXCos; + var stgranYSin; + var stgranXSin; + var stnwCorner; + var stsouth; + var stwest; + if (stRotation !== 0) { + rotation = rotation - stRotation; + stgranYCos = granularityY; + stgranXCos = granularityX; + // stgranYSin = 0.0; +// stgranXSin = 0.0; + + var stcosRotation = Math.cos(rotation); + stgranYCos *= stcosRotation; + stgranXCos *= stcosRotation; + + var stsinRotation = Math.sin(rotation); + stgranYSin = granularityY * stsinRotation; + stgranXSin = granularityX * stsinRotation; + + stnwCorner = Rectangle.northwest(rectangle, stnwCorner); + nwCartesian = proj.project(stnwCorner, nwCartesian); + centerCartesian = proj.project(center, centerCartesian); + + nwCartesian = Cartesian3.subtract(nwCartesian, centerCartesian, nwCartesian); + nwCartesian = Matrix2.multiplyByVector(Matrix2.fromRotation(rotation, rotationMatrixScratch), nwCartesian, nwCartesian); + nwCartesian = Cartesian3.add(nwCartesian, centerCartesian, nwCartesian); + stnwCorner = proj.unproject(nwCartesian, stnwCorner); + + var la = nwCorner.latitude; + var l0 = la + (width - 1) * granXSin; + var l1 = la - granYCos * (height - 1); + var l2 = la - granYCos * (height - 1) + (width - 1) * granXSin; + + stsouth = Math.min(la, l0, l1, l2); + + var lo = nwCorner.longitude; + var lo0 = lo + (width - 1) * granXCos; + var lo1 = lo + (height - 1) * granYSin; + var lo2 = lo + (height - 1) * granYSin + (width - 1) * granXCos; + + stwest = Math.min(lo, lo0, lo1, lo2); + } + + return { granYCos : granYCos, granYSin : granYSin, granXCos : granXCos, granXSin : granXSin, + granX: granularityX, + granY: granularityY, ellipsoid : ellipsoid, width : width, height : height, surfaceHeight : surfaceHeight, extrudedHeight : extrudedHeight, - nwCorner: nwCorner, - rectangle: rectangle + nwCorner : nwCorner, + rectangle : rectangle, + stgranycos: stgranYCos, + stgranxcos: stgranXCos, + stgranysin: stgranYSin, + stgranxsin: stgranXSin, + stnwCorner: stnwCorner, + stwest: stwest, + stsouth: stsouth }; }; From 1e7d904670c53df25be30e2012e3047487057f3a Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Tue, 6 Dec 2016 18:40:11 -0500 Subject: [PATCH 134/396] Add check module for parameter checking --- Source/Core/check.js | 85 ++++++++++++++++++++++++++++ Specs/Core/check.js | 131 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 216 insertions(+) create mode 100644 Source/Core/check.js create mode 100644 Specs/Core/check.js diff --git a/Source/Core/check.js b/Source/Core/check.js new file mode 100644 index 000000000000..5fde8bba9c6e --- /dev/null +++ b/Source/Core/check.js @@ -0,0 +1,85 @@ +/*global define*/ +define([ + './defined', + './DeveloperError', + './isArray' +], function(defined, + DeveloperError, + isArray) { + 'use strict'; + + var Where = function(condition) { + this.condition = condition; + }; + + var Match = { + Where: function(condition) { + return new Where(condition); + } + }; + + function throwUnless(passed, message) { + if (!passed) { + throw new DeveloperError(message); + } + } + + function makeErrorMessage(expectedType, seenType, optionalMessage) { + if (defined(optionalMessage)) { + return optionalMessage; + } + return 'Expected ' + expectedType + ', got ' + seenType; + } + + var typeChecks = [ + [String, 'string'], + [Number, 'number'], + [Boolean, 'boolean'], + [Function, 'function'], + ]; + + function check(arg, pattern, optionalMessage) { + var typeCheck; + var patternValid = false; + for (var i = 0; i < typeChecks.length; i++) { + typeCheck = typeChecks[i]; + if (typeCheck[0] === pattern) { + patternValid = true; + throwUnless(typeof arg === typeCheck[1], makeErrorMessage(typeCheck[1], typeof arg, optionalMessage)); + } + } + + if (pattern === null) { + throwUnless(arg === null, makeErrorMessage('null', arg, optionalMessage)); + return true; + } + if (pattern instanceof Where) { + throwUnless(pattern.condition(arg), 'Failed Match.Where condition for arg: ' + JSON.stringify(arg)); + return true; + } + if (pattern === Object) { + throwUnless(typeof arg === 'object' && !isArray(arg), makeErrorMessage('object', JSON.stringify(arg), optionalMessage)); + return true; + } + if (isArray(pattern)) { + if (pattern.length !== 1 && pattern.length !== 0) { + throw new DeveloperError('invalid pattern: array pattern must contain 0 or 1 element'); + } + if (pattern.length === 1) { + for (var j = 0; j < arg.length; j++) { + check(arg[j], pattern[1], optionalMessage ? '(checking array elements) ' + optionalMessage : undefined); + } + } + throwUnless(isArray(arg), makeErrorMessage('array', JSON.stringify(arg)), optionalMessage); + return true; + } + if (!patternValid) { + throw new DeveloperError('unsupported pattern'); + } + } + + return { + Match: Match, + check: check + }; +}); diff --git a/Specs/Core/check.js b/Specs/Core/check.js new file mode 100644 index 000000000000..0be4cad594c1 --- /dev/null +++ b/Specs/Core/check.js @@ -0,0 +1,131 @@ +/*global defineSuite*/ +defineSuite([ + 'Core/check' + ], function( + validation) { + 'use strict'; + var check = validation.check; + var Match = validation.Match; + + it('does not throw on matching empty object against Object', function () { + expect(function () { + check({}, Object); + }).not.toThrowDeveloperError(); + }); + + it('does not throw on matching plain object against Object', function () { + var obj = { + a: 2, + b: 'snt' + }; + expect(function () { + check(obj, Object); + }).not.toThrowDeveloperError(); + }); + + it('throws on matching array against Object', function () { + expect(function () { + check([], Object); + }).toThrowDeveloperError(); + }); + + it('does not throw when matching array of any elements against []', function () { + expect(function () { + check([], []); + }).toThrowDeveloperError(); + expect(function () { + check([2], []); + }).toThrowDeveloperError(); + expect(function () { + check([34, 'snth'], []); + }).toThrowDeveloperError(); + }); + + it('throws when matching array with non-matching elements against [Type]', function () { + expect(function () { + check(['snth', 2], [Number]); + }).toThrowDeveloperError(); + expect(function () { + check([2, 'snth'], [String]); + }).toThrowDeveloperError(); + expect(function () { + check([34, 'snth'], [Boolean]); + }).toThrowDeveloperError(); + }); + + it('does not throw when matching array of matching elements against [Type]', function () { + expect(function () { + check([4, 2], [Number]); + }).toThrowDeveloperError(); + expect(function () { + check(['snth', 'snth'], [String]); + }).toThrowDeveloperError(); + expect(function () { + check([true, false], [Boolean]); + }).toThrowDeveloperError(); + }); + + it('throws on matching non-number with Number', function () { + expect(function () { + check('aeou', Number); + }).toThrowDeveloperError(); + expect(function () { + check(true, Number); + }).toThrowDeveloperError(); + expect(function () { + check(function() {}, Number); + }).toThrowDeveloperError(); + expect(function () { + check({}, Number); + }).toThrowDeveloperError(); + }); + + it('does not throw on matching number with Number', function () { + expect(function () { + check(3.39, Number); + }).not.toThrowDeveloperError(); + expect(function () { + check(3, Number); + }).not.toThrowDeveloperError(); + }); + + it('throws on matching non-string with String', function () { + expect(function () { + check(23, String); + }).toThrowDeveloperError(); + expect(function () { + check(true, String); + }).toThrowDeveloperError(); + expect(function () { + check(function() {}, String); + }).toThrowDeveloperError(); + expect(function () { + check({}, String); + }).toThrowDeveloperError(); + }); + + it('does not throw on matching string with String', function () { + expect(function () { + check('snt', String); + }).not.toThrowDeveloperError(); + }); + + it('throws for failing Match.Where condition', function () { + var condition = function (x) { + return x > 0.0; + }; + expect(function () { + check(-1, Match.Where(condition)); + }).toThrowDeveloperError(); + }); + + it('does not throw for valid Match.Where condition', function () { + var condition = function (x) { + return x > 0.0; + }; + expect(function () { + check(1, Match.Where(condition)); + }).toThrowDeveloperError(); + }); + +}); From 82d6cdb2c14a6d9256ef70c1d5400d9f25de3f0d Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Tue, 6 Dec 2016 18:40:44 -0500 Subject: [PATCH 135/396] Replace old parameter checking with the new check module methods --- Source/Core/Cartesian3.js | 268 +++++++++++--------------------------- 1 file changed, 74 insertions(+), 194 deletions(-) diff --git a/Source/Core/Cartesian3.js b/Source/Core/Cartesian3.js index a2e1f2f268f7..c7a0ceca1d92 100644 --- a/Source/Core/Cartesian3.js +++ b/Source/Core/Cartesian3.js @@ -1,11 +1,13 @@ /*global define*/ define([ + './check', './defaultValue', './defined', './DeveloperError', './freezeObject', './Math' ], function( + validation, defaultValue, defined, DeveloperError, @@ -13,6 +15,9 @@ define([ CesiumMath) { 'use strict'; + var check = validation.check; + var Match = validation.Match; + /** * A 3D Cartesian point. * @alias Cartesian3 @@ -58,9 +63,7 @@ define([ */ Cartesian3.fromSpherical = function(spherical, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(spherical)) { - throw new DeveloperError('spherical is required'); - } + check(spherical, Object, 'spherical is required'); //>>includeEnd('debug'); if (!defined(result)) { @@ -146,13 +149,8 @@ define([ */ Cartesian3.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + check(value, Object, 'value is required'); + check(array, [], 'array is required'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -174,9 +172,7 @@ define([ */ Cartesian3.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + check(array, [], 'array is required'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -199,9 +195,7 @@ define([ */ Cartesian3.packArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + check(array, [], 'array is required'); //>>includeEnd('debug'); var length = array.length; @@ -226,11 +220,9 @@ define([ */ Cartesian3.unpackArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + check(array, [], 'array is required'); if (array.length < 3) { - throw new DeveloperError('array length cannot be less than 3.'); + throw new DeveloperError(); } if (array.length % 3 !== 0) { throw new DeveloperError('array length must be a multiple of 3.'); @@ -295,9 +287,7 @@ define([ */ Cartesian3.minimumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + check(cartesian, Object, 'cartesian is required'); //>>includeEnd('debug'); return Math.min(cartesian.x, cartesian.y, cartesian.z); @@ -313,15 +303,9 @@ define([ */ Cartesian3.minimumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(first)) { - throw new DeveloperError('first is required.'); - } - if (!defined(second)) { - throw new DeveloperError('second is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + check(first, Object, 'first is required.'); + check(second, Object, 'second is required.'); + check(result, Object, 'result is required.'); //>>includeEnd('debug'); result.x = Math.min(first.x, second.x); @@ -341,15 +325,9 @@ define([ */ Cartesian3.maximumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(first)) { - throw new DeveloperError('first is required.'); - } - if (!defined(second)) { - throw new DeveloperError('second is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + check(first, Object, 'first is required.'); + check(second, Object, 'second is required.'); + check(result, Object, 'result is required.'); //>>includeEnd('debug'); result.x = Math.max(first.x, second.x); @@ -366,9 +344,7 @@ define([ */ Cartesian3.magnitudeSquared = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + check(cartesian, Object, 'cartesian is required'); //>>includeEnd('debug'); return cartesian.x * cartesian.x + cartesian.y * cartesian.y + cartesian.z * cartesian.z; @@ -440,12 +416,8 @@ define([ */ Cartesian3.normalize = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + check(cartesian, Object, 'cartesian is required'); + check(result, Object, 'result is required'); //>>includeEnd('debug'); var magnitude = Cartesian3.magnitude(cartesian); @@ -472,12 +444,8 @@ define([ */ Cartesian3.dot = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } + check(left, Object, 'left is required'); + check(right, Object, 'right is required'); //>>includeEnd('debug'); return left.x * right.x + left.y * right.y + left.z * right.z; @@ -493,15 +461,9 @@ define([ */ Cartesian3.multiplyComponents = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + check(left, Object, 'left is required'); + check(right, Object, 'right is required'); + check(result, Object, 'result is required'); //>>includeEnd('debug'); result.x = left.x * right.x; @@ -520,15 +482,9 @@ define([ */ Cartesian3.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + check(left, Object, 'left is required'); + check(right, Object, 'right is required'); + check(result, Object, 'result is required'); //>>includeEnd('debug'); result.x = left.x + right.x; @@ -547,15 +503,9 @@ define([ */ Cartesian3.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + check(left, Object, 'left is required'); + check(right, Object, 'right is required'); + check(result, Object, 'result is required'); //>>includeEnd('debug'); result.x = left.x - right.x; @@ -574,15 +524,9 @@ define([ */ Cartesian3.multiplyByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + check(cartesian, Object, 'cartesian is required'); + check(scalar, Number, 'scalar is required'); + check(result, Object, 'result is required'); //>>includeEnd('debug'); result.x = cartesian.x * scalar; @@ -601,15 +545,9 @@ define([ */ Cartesian3.divideByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + check(cartesian, Object, 'cartesian is required'); + check(scalar, Number, 'scalar is required'); + check(result, Object, 'result is required'); //>>includeEnd('debug'); result.x = cartesian.x / scalar; @@ -627,12 +565,8 @@ define([ */ Cartesian3.negate = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + check(cartesian, Object, 'cartesian is required'); + check(result, Object, 'result is required'); //>>includeEnd('debug'); result.x = -cartesian.x; @@ -650,12 +584,8 @@ define([ */ Cartesian3.abs = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + check(cartesian, Object, 'cartesian is required'); + check(result, Object, 'result is required'); //>>includeEnd('debug'); result.x = Math.abs(cartesian.x); @@ -676,18 +606,10 @@ define([ */ Cartesian3.lerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(start)) { - throw new DeveloperError('start is required.'); - } - if (!defined(end)) { - throw new DeveloperError('end is required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + check(start, Object, 'start is required'); + check(end, Object, 'end is required'); + check(t, Number, 'number is required'); + check(result, Object, 'result is required'); //>>includeEnd('debug'); Cartesian3.multiplyByScalar(end, t, lerpScratch); @@ -706,12 +628,8 @@ define([ */ Cartesian3.angleBetween = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } + check(left, Object, 'left is required'); + check(right, Object, 'right is required'); //>>includeEnd('debug'); Cartesian3.normalize(left, angleBetweenScratch); @@ -731,12 +649,8 @@ define([ */ Cartesian3.mostOrthogonalAxis = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + check(cartesian, Object, 'cartesian is required'); + check(result, Object, 'result is required'); //>>includeEnd('debug'); var f = Cartesian3.normalize(cartesian, mostOrthogonalAxisScratch); @@ -815,15 +729,9 @@ define([ */ Cartesian3.cross = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + check(left, Object, 'left is required'); + check(right, Object, 'right is required'); + check(result, Object, 'result is required'); //>>includeEnd('debug'); var leftX = left.x; @@ -858,12 +766,8 @@ define([ */ Cartesian3.fromDegrees = function(longitude, latitude, height, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(longitude)) { - throw new DeveloperError('longitude is required'); - } - if (!defined(latitude)) { - throw new DeveloperError('latitude is required'); - } + check(longitude, Number, 'longitude is required'); + check(latitude, Number, 'latitude is required'); //>>includeEnd('debug'); longitude = CesiumMath.toRadians(longitude); @@ -890,12 +794,8 @@ define([ */ Cartesian3.fromRadians = function(longitude, latitude, height, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(longitude)) { - throw new DeveloperError('longitude is required'); - } - if (!defined(latitude)) { - throw new DeveloperError('latitude is required'); - } + check(longitude, Number, 'longitude is required'); + check(latitude, Number, 'latitude is required'); //>>includeEnd('debug'); height = defaultValue(height, 0.0); @@ -931,15 +831,10 @@ define([ */ Cartesian3.fromDegreesArray = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(coordinates)) { - throw new DeveloperError('coordinates is required.'); - } - if (coordinates.length < 2) { - throw new DeveloperError('coordinates length cannot be less than 2.'); - } - if (coordinates.length % 2 !== 0) { - throw new DeveloperError('coordinates length must be a multiple of 2.'); - } + check(coordinates, [], 'coordinates is required.'); + check(coordinates.length, Match.Where(function (length) { + return length >= 2 && length % 2 === 0; + }), 'the number of coordinates must be a multiple of 2 and at least 2'); //>>includeEnd('debug'); var length = coordinates.length; @@ -972,15 +867,10 @@ define([ */ Cartesian3.fromRadiansArray = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(coordinates)) { - throw new DeveloperError('coordinates is required.'); - } - if (coordinates.length < 2) { - throw new DeveloperError('coordinates length cannot be less than 2.'); - } - if (coordinates.length % 2 !== 0) { - throw new DeveloperError('coordinates length must be a multiple of 2.'); - } + check(coordinates, [], 'coordinates is required.'); + check(coordinates.length, Match.Where(function (length) { + return length >= 2 && length % 2 === 0; + }), 'the number of coordinates must be a multiple of 2 and at least 2'); //>>includeEnd('debug'); var length = coordinates.length; @@ -1013,15 +903,10 @@ define([ */ Cartesian3.fromDegreesArrayHeights = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(coordinates)) { - throw new DeveloperError('coordinates is required.'); - } - if (coordinates.length < 3) { - throw new DeveloperError('coordinates length cannot be less than 3.'); - } - if (coordinates.length % 3 !== 0) { - throw new DeveloperError('coordinates length must be a multiple of 3.'); - } + check(coordinates, [], 'coordinates is required.'); + check(coordinates.length, Match.Where(function (length) { + return length >= 3 && length % 3 === 0; + }), 'the number of coordinates must be a multiple of 3 and at least 2'); //>>includeEnd('debug'); var length = coordinates.length; @@ -1055,15 +940,10 @@ define([ */ Cartesian3.fromRadiansArrayHeights = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(coordinates)) { - throw new DeveloperError('coordinates is required.'); - } - if (coordinates.length < 3) { - throw new DeveloperError('coordinates length cannot be less than 3.'); - } - if (coordinates.length % 3 !== 0) { - throw new DeveloperError('coordinates length must be a multiple of 3.'); - } + check(coordinates, [], 'coordinates is required.'); + check(coordinates.length, Match.Where(function (length) { + return length >= 3 && length % 3 === 0; + }), 'the number of coordinates must be a multiple of 3 and at least 2'); //>>includeEnd('debug'); var length = coordinates.length; From a1348bc1b3b308d9380f0fd9cc67f2ed4ecd918a Mon Sep 17 00:00:00 2001 From: hpinkos Date: Tue, 6 Dec 2016 19:33:41 -0500 Subject: [PATCH 136/396] clean up, add spec --- Source/Core/RectangleGeometry.js | 9 +- Source/Core/RectangleGeometryLibrary.js | 237 ++++++++++-------------- Specs/Core/RectangleGeometrySpec.js | 22 +++ 3 files changed, 123 insertions(+), 145 deletions(-) diff --git a/Source/Core/RectangleGeometry.js b/Source/Core/RectangleGeometry.js index 6244f3c9866a..420b95cceeb4 100644 --- a/Source/Core/RectangleGeometry.js +++ b/Source/Core/RectangleGeometry.js @@ -752,9 +752,9 @@ define([ return result; }; - var textureMatrixScratch = new Matrix2(); var tangentRotationMatrixScratch = new Matrix3(); var nwScratch = new Cartographic(); + var stNwScratch = new Cartographic(); var quaternionScratch = new Quaternion(); var centerScratch = new Cartographic(); /** @@ -780,26 +780,21 @@ define([ var stRotation = rectangleGeometry._stRotation; var vertexFormat = rectangleGeometry._vertexFormat; - var options = RectangleGeometryLibrary.computeOptions(rectangleGeometry, rectangle, nwScratch); + var options = RectangleGeometryLibrary.computeOptions(rectangleGeometry, rectangle, nwScratch, stNwScratch); - var textureMatrix = textureMatrixScratch; var tangentRotationMatrix = tangentRotationMatrixScratch; if (stRotation !== 0 || rotation !== 0) { - // negate angle for a counter-clockwise rotation - Matrix2.fromRotation(-(stRotation - rotation), textureMatrix); var center = Rectangle.center(rectangle, centerScratch); var axis = ellipsoid.geodeticSurfaceNormalCartographic(center, v1Scratch); Quaternion.fromAxisAngle(axis, -stRotation, quaternionScratch); Matrix3.fromQuaternion(quaternionScratch, tangentRotationMatrix); } else { - Matrix2.clone(Matrix2.IDENTITY, textureMatrix); Matrix3.clone(Matrix3.IDENTITY, tangentRotationMatrix); } options.lonScalar = 1.0 / rectangleGeometry._rectangle.width; options.latScalar = 1.0 / rectangleGeometry._rectangle.height; options.vertexFormat = vertexFormat; - options.textureMatrix = textureMatrix; options.rotation = rotation; options.stRotation = stRotation; options.tangentRotationMatrix = tangentRotationMatrix; diff --git a/Source/Core/RectangleGeometryLibrary.js b/Source/Core/RectangleGeometryLibrary.js index fb4249909036..38d0d76b20e8 100644 --- a/Source/Core/RectangleGeometryLibrary.js +++ b/Source/Core/RectangleGeometryLibrary.js @@ -55,50 +55,17 @@ define([ position.z = kZ / gamma; if (defined(options.vertexFormat) && options.vertexFormat.st) { - var stnwCorner = options.stnwCorner; - if (defined(stnwCorner)) { - stLatitude = stnwCorner.latitude - options.stgranycos * row + col * options.stgranxsin; - stLongitude = stnwCorner.longitude + row * options.stgranysin + col * options.stgranxcos; + var stNwCorner = options.stNwCorner; + if (defined(stNwCorner)) { + stLatitude = stNwCorner.latitude - options.stGranYCos * row + col * options.stGranXSin; + stLongitude = stNwCorner.longitude + row * options.stGranYSin + col * options.stGranXCos; - st.x = (stLongitude - options.stwest) * options.lonScalar; - st.y = (stLatitude - options.stsouth) * options.latScalar; + st.x = (stLongitude - options.stWest) * options.lonScalar; + st.y = (stLatitude - options.stSouth) * options.latScalar; } else { st.x = (stLongitude - rectangle.west) * options.lonScalar; st.y = (stLatitude - rectangle.south) * options.latScalar; } - - - // var stRotation = options.stRotation - options.rotation; - // var cosRotation = Math.cos(stRotation); - // var granularityX = 1/options.width; - // var granularityY = 1/options.height; - // var granYCos = granularityY; - // var granXCos = granularityX; - // var granYSin = 0.0; - // var granXSin = 0.0; - // - // granYCos *= cosRotation; - // granXCos *= cosRotation; - // - // var sinRotation = Math.sin(stRotation); - // granYSin = granularityY * sinRotation; - // granXSin = granularityX * sinRotation; - // - // - // st.x -= 0.5; - // st.y -= 0.5; - // - // - // - // - // // st.x = col * 1/options.width; - // // st.y = 1 - row * 1/options.height; - // - // st.x = row * granYSin + col * granXCos; - // st.y = 1 - (granYCos * row + col * granXSin); - // - // st.x += 0.5; - // st.y += 0.5; } }; @@ -107,10 +74,60 @@ define([ var centerScratch = new Cartographic(); var centerCartesian = new Cartesian3(); var proj = new GeographicProjection(); + + function getRotationOptions(nwCorner, rotation, granularityX, granularityY, center, width, height) { + var cosRotation = Math.cos(rotation); + var granYCos = granularityY * cosRotation; + var granXCos = granularityX * cosRotation; + + var sinRotation = Math.sin(rotation); + var granYSin = granularityY * sinRotation; + var granXSin = granularityX * sinRotation; + + nwCartesian = proj.project(nwCorner, nwCartesian); + + nwCartesian = Cartesian3.subtract(nwCartesian, centerCartesian, nwCartesian); + var rotationMatrix = Matrix2.fromRotation(rotation, rotationMatrixScratch); + nwCartesian = Matrix2.multiplyByVector(rotationMatrix, nwCartesian, nwCartesian); + nwCartesian = Cartesian3.add(nwCartesian, centerCartesian, nwCartesian); + nwCorner = proj.unproject(nwCartesian, nwCorner); + + width -= 1; + height -= 1; + + var latitude = nwCorner.latitude; + var latitude0 = latitude + width * granXSin; + var latitude1 = latitude - granYCos * height; + var latitude2 = latitude - granYCos * height + width * granXSin; + + var north = Math.max(latitude, latitude0, latitude1, latitude2); + var south = Math.min(latitude, latitude0, latitude1, latitude2); + + var longitude = nwCorner.longitude; + var longitude0 = longitude + width * granXCos; + var longitude1 = longitude + height * granYSin; + var longitude2 = longitude + height * granYSin + width * granXCos; + + var east = Math.max(longitude, longitude0, longitude1, longitude2); + var west = Math.min(longitude, longitude0, longitude1, longitude2); + + return { + north: north, + south: south, + east: east, + west: west, + granYCos : granYCos, + granYSin : granYSin, + granXCos : granXCos, + granXSin : granXSin, + nwCorner : nwCorner + }; + + } /** * @private */ - RectangleGeometryLibrary.computeOptions = function(geometry, rectangle, nwCorner) { + RectangleGeometryLibrary.computeOptions = function(geometry, rectangle, nwCorner, stNwCorner) { var granularity = geometry._granularity; var ellipsoid = geometry._ellipsoid; var surfaceHeight = geometry._surfaceHeight; @@ -144,49 +161,38 @@ define([ nwCorner = Rectangle.northwest(rectangle, nwCorner); var center = Rectangle.center(rectangle, centerScratch); - - var granYCos = granularityY; - var granXCos = granularityX; - var granYSin = 0.0; - var granXSin = 0.0; - - if (defined(rotation) && rotation !== 0) { - var cosRotation = Math.cos(rotation); - granYCos *= cosRotation; - granXCos *= cosRotation; - - var sinRotation = Math.sin(rotation); - granYSin = granularityY * sinRotation; - granXSin = granularityX * sinRotation; - + if (rotation !== 0 || stRotation !== 0) { if (center.longitude < nwCorner.longitude) { center.longitude += CesiumMath.TWO_PI; } - - nwCartesian = proj.project(nwCorner, nwCartesian); centerCartesian = proj.project(center, centerCartesian); + } - nwCartesian = Cartesian3.subtract(nwCartesian, centerCartesian, nwCartesian); - var rotationMatrix = Matrix2.fromRotation(rotation, rotationMatrixScratch); - nwCartesian = Matrix2.multiplyByVector(rotationMatrix, nwCartesian, nwCartesian); - nwCartesian = Cartesian3.add(nwCartesian, centerCartesian, nwCartesian); - nwCorner = proj.unproject(nwCartesian, nwCorner); - - var latitude = nwCorner.latitude; - var latitude0 = latitude + (width - 1) * granXSin; - var latitude1 = latitude - granYCos * (height - 1); - var latitude2 = latitude - granYCos * (height - 1) + (width - 1) * granXSin; - - north = Math.max(latitude, latitude0, latitude1, latitude2); - south = Math.min(latitude, latitude0, latitude1, latitude2); + var granYCos = granularityY; + var granXCos = granularityX; + var granYSin = 0.0; + var granXSin = 0.0; - var longitude = nwCorner.longitude; - var longitude0 = longitude + (width - 1) * granXCos; - var longitude1 = longitude + (height - 1) * granYSin; - var longitude2 = longitude + (height - 1) * granYSin + (width - 1) * granXCos; + var options = { + granYCos : granYCos, + granYSin : granYSin, + granXCos : granXCos, + granXSin : granXSin, + ellipsoid : ellipsoid, + surfaceHeight : surfaceHeight, + extrudedHeight : extrudedHeight, + nwCorner : nwCorner, + rectangle : rectangle, + width: width, + height: height + }; - east = Math.max(longitude, longitude0, longitude1, longitude2); - west = Math.min(longitude, longitude0, longitude1, longitude2); + if (rotation !== 0) { + var rotationOptions = getRotationOptions(nwCorner, rotation, granularityX, granularityY, center, width, height); + north = rotationOptions.north; + south = rotationOptions.south; + east = rotationOptions.east; + west = rotationOptions.west; //>>includeStart('debug', pragmas.debug); if (north < -CesiumMath.PI_OVER_TWO || north > CesiumMath.PI_OVER_TWO || @@ -195,80 +201,35 @@ define([ } //>>includeEnd('debug') + options.granYCos = rotationOptions.granYCos; + options.granYSin = rotationOptions.granYSin; + options.granXCos = rotationOptions.granXCos; + options.granXSin = rotationOptions.granXSin; + rectangle.north = north; rectangle.south = south; rectangle.east = east; rectangle.west = west; } - var stgranYCos; - var stgranXCos; - var stgranYSin; - var stgranXSin; - var stnwCorner; - var stsouth; - var stwest; - if (stRotation !== 0) { - rotation = rotation - stRotation; - stgranYCos = granularityY; - stgranXCos = granularityX; - // stgranYSin = 0.0; -// stgranXSin = 0.0; - var stcosRotation = Math.cos(rotation); - stgranYCos *= stcosRotation; - stgranXCos *= stcosRotation; - var stsinRotation = Math.sin(rotation); - stgranYSin = granularityY * stsinRotation; - stgranXSin = granularityX * stsinRotation; - - stnwCorner = Rectangle.northwest(rectangle, stnwCorner); - nwCartesian = proj.project(stnwCorner, nwCartesian); - centerCartesian = proj.project(center, centerCartesian); - - nwCartesian = Cartesian3.subtract(nwCartesian, centerCartesian, nwCartesian); - nwCartesian = Matrix2.multiplyByVector(Matrix2.fromRotation(rotation, rotationMatrixScratch), nwCartesian, nwCartesian); - nwCartesian = Cartesian3.add(nwCartesian, centerCartesian, nwCartesian); - stnwCorner = proj.unproject(nwCartesian, stnwCorner); - - var la = nwCorner.latitude; - var l0 = la + (width - 1) * granXSin; - var l1 = la - granYCos * (height - 1); - var l2 = la - granYCos * (height - 1) + (width - 1) * granXSin; - - stsouth = Math.min(la, l0, l1, l2); + if (stRotation !== 0) { + rotation = rotation - stRotation; + stNwCorner = Rectangle.northwest(rectangle, stNwCorner); - var lo = nwCorner.longitude; - var lo0 = lo + (width - 1) * granXCos; - var lo1 = lo + (height - 1) * granYSin; - var lo2 = lo + (height - 1) * granYSin + (width - 1) * granXCos; + var stRotationOptions = getRotationOptions(stNwCorner, rotation, granularityX, granularityY, center, width, height); - stwest = Math.min(lo, lo0, lo1, lo2); + options.stGranYCos = stRotationOptions.granYCos; + options.stGranXCos = stRotationOptions.granXCos; + options.stGranYSin = stRotationOptions.granYSin; + options.stGranXSin = stRotationOptions.granXSin; + options.stNwCorner = stNwCorner; + options.stWest = stRotationOptions.west; + options.stSouth = stRotationOptions.south; } - return { - granYCos : granYCos, - granYSin : granYSin, - granXCos : granXCos, - granXSin : granXSin, - granX: granularityX, - granY: granularityY, - ellipsoid : ellipsoid, - width : width, - height : height, - surfaceHeight : surfaceHeight, - extrudedHeight : extrudedHeight, - nwCorner : nwCorner, - rectangle : rectangle, - stgranycos: stgranYCos, - stgranxcos: stgranXCos, - stgranysin: stgranYSin, - stgranxsin: stgranXSin, - stnwCorner: stnwCorner, - stwest: stwest, - stsouth: stsouth - }; + return options; }; return RectangleGeometryLibrary; diff --git a/Specs/Core/RectangleGeometrySpec.js b/Specs/Core/RectangleGeometrySpec.js index 7ead596031a6..5ed3b14f5b39 100644 --- a/Specs/Core/RectangleGeometrySpec.js +++ b/Specs/Core/RectangleGeometrySpec.js @@ -145,6 +145,28 @@ defineSuite([ expect(st[length - 1]).toEqualEpsilon(0.0, CesiumMath.EPSILON14); }); + it('compute texture coordinate rotation with rectangle rotation', function() { + var rectangle = new Rectangle(-1, -1, 1, 1); + var angle = CesiumMath.toRadians(30); + var m = RectangleGeometry.createGeometry(new RectangleGeometry({ + vertexFormat : VertexFormat.POSITION_AND_ST, + rectangle : rectangle, + rotation: angle, + stRotation : angle, + granularity : 1.0 + })); + var st = m.attributes.st.values; + + expect(st[0]).toEqual(0.0); //top left corner + expect(st[1]).toEqual(1.0); + expect(st[4]).toEqual(1.0); //top right corner + expect(st[5]).toEqual(1.0); + expect(st[12]).toEqual(0.0); //bottom left corner + expect(st[13]).toEqual(0.0); + expect(st[16]).toEqual(1.0); //bottom right corner + expect(st[17]).toEqual(0.0); + }); + it('throws without rectangle', function() { expect(function() { return new RectangleGeometry({}); From 64aed2d30f406072ee372aa4e7d4c60381355b93 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Tue, 6 Dec 2016 19:52:08 -0500 Subject: [PATCH 137/396] sandcastle, changes --- Apps/Sandcastle/gallery/Rectangle.html | 18 +++++++++++++++++- Apps/Sandcastle/gallery/Rectangle.jpg | Bin 15407 -> 18270 bytes CHANGES.md | 1 + 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Apps/Sandcastle/gallery/Rectangle.html b/Apps/Sandcastle/gallery/Rectangle.html index 02f20c1c8229..7861a1cc0262 100644 --- a/Apps/Sandcastle/gallery/Rectangle.html +++ b/Apps/Sandcastle/gallery/Rectangle.html @@ -42,7 +42,7 @@ var greenRectangle = viewer.entities.add({ name : 'Green translucent, rotated, and extruded rectangle at height with outline', rectangle : { - coordinates : Cesium.Rectangle.fromDegrees(-100.0, 30.0, -90.0, 40.0), + coordinates : Cesium.Rectangle.fromDegrees(-110.0, 30.0, -100.0, 40.0), material : Cesium.Color.GREEN.withAlpha(0.5), rotation : Cesium.Math.toRadians(45), extrudedHeight : 300000.0, @@ -52,6 +52,22 @@ } }); +var rotation = Cesium.Math.toRadians(30); + +function getRotationValue() { + rotation += 0.005; + return rotation; +} +viewer.entities.add({ + name: 'Rotating rectangle with rotating texture coordinate', + rectangle: { + coordinates: Cesium.Rectangle.fromDegrees(-92.0, 30.0, -76.0, 40.0), + material: '../images/Cesium_Logo_Color.jpg', + rotation: new Cesium.CallbackProperty(getRotationValue, false), + stRotation: new Cesium.CallbackProperty(getRotationValue, false) + } +}); + viewer.zoomTo(viewer.entities); //Sandcastle_End Sandcastle.finishedLoading(); diff --git a/Apps/Sandcastle/gallery/Rectangle.jpg b/Apps/Sandcastle/gallery/Rectangle.jpg index 3aa5238d6ea8165732989e8541957a637dd37c7b..eac9a0ba48f474dc3ea44803e62167256cc5364c 100644 GIT binary patch delta 17955 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≺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 diff --git a/CHANGES.md b/CHANGES.md index ebb563dfaf72..f7659ea2524a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,7 @@ Change Log * Added the ability to blend a `Model` with a color/translucency. Added `color`, `colorBlendMode`, and `colorBlendAmount` properties to `Model`, `ModelGraphics`, and CZML. Added `ColorBlendMode` enum. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) +* Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) ### 1.28 - 2016-12-01 From 0392fe58264afa8cf0f31cf049feebef1cab978b Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Tue, 6 Dec 2016 21:58:50 -0500 Subject: [PATCH 138/396] Fix test failures related to checking types of typed arrays --- Source/Core/check.js | 10 ++++++---- Specs/Core/check.js | 14 +++++++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Source/Core/check.js b/Source/Core/check.js index 5fde8bba9c6e..8b9c24882f2c 100644 --- a/Source/Core/check.js +++ b/Source/Core/check.js @@ -54,11 +54,11 @@ define([ return true; } if (pattern instanceof Where) { - throwUnless(pattern.condition(arg), 'Failed Match.Where condition for arg: ' + JSON.stringify(arg)); + throwUnless(pattern.condition(arg), 'Failed Match.Where condition for arg: ' + typeof arg); return true; } if (pattern === Object) { - throwUnless(typeof arg === 'object' && !isArray(arg), makeErrorMessage('object', JSON.stringify(arg), optionalMessage)); + throwUnless(typeof arg === 'object' && !isArray(arg), makeErrorMessage('object', typeof arg, optionalMessage)); return true; } if (isArray(pattern)) { @@ -67,10 +67,12 @@ define([ } if (pattern.length === 1) { for (var j = 0; j < arg.length; j++) { - check(arg[j], pattern[1], optionalMessage ? '(checking array elements) ' + optionalMessage : undefined); + check(arg[j], pattern[0], optionalMessage ? '(checking array elements) ' + optionalMessage : undefined); } } - throwUnless(isArray(arg), makeErrorMessage('array', JSON.stringify(arg)), optionalMessage); + var isArrayOrTypedArray = isArray(arg) || arg instanceof Float32Array || arg instanceof Float64Array || + arg instanceof Int8Array || arg instanceof Int16Array || arg instanceof Int32Array; + throwUnless(isArrayOrTypedArray, makeErrorMessage('array', typeof arg), optionalMessage); return true; } if (!patternValid) { diff --git a/Specs/Core/check.js b/Specs/Core/check.js index 0be4cad594c1..f7fb3779fe41 100644 --- a/Specs/Core/check.js +++ b/Specs/Core/check.js @@ -32,13 +32,13 @@ defineSuite([ it('does not throw when matching array of any elements against []', function () { expect(function () { check([], []); - }).toThrowDeveloperError(); + }).not.toThrowDeveloperError(); expect(function () { check([2], []); - }).toThrowDeveloperError(); + }).not.toThrowDeveloperError(); expect(function () { check([34, 'snth'], []); - }).toThrowDeveloperError(); + }).not.toThrowDeveloperError(); }); it('throws when matching array with non-matching elements against [Type]', function () { @@ -56,13 +56,13 @@ defineSuite([ it('does not throw when matching array of matching elements against [Type]', function () { expect(function () { check([4, 2], [Number]); - }).toThrowDeveloperError(); + }).not.toThrowDeveloperError(); expect(function () { check(['snth', 'snth'], [String]); - }).toThrowDeveloperError(); + }).not.toThrowDeveloperError(); expect(function () { check([true, false], [Boolean]); - }).toThrowDeveloperError(); + }).not.toThrowDeveloperError(); }); it('throws on matching non-number with Number', function () { @@ -125,7 +125,7 @@ defineSuite([ }; expect(function () { check(1, Match.Where(condition)); - }).toThrowDeveloperError(); + }).not.toThrowDeveloperError(); }); }); From 7894d20cc736c08285f335ca36021498726c5f5d Mon Sep 17 00:00:00 2001 From: "duvi.fn" Date: Wed, 7 Dec 2016 11:49:36 +0200 Subject: [PATCH 139/396] added Ellipsoid.getSurfaceNormalRayFromZAxis. no tested --- Source/Core/Ellipsoid.js | 64 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/Source/Core/Ellipsoid.js b/Source/Core/Ellipsoid.js index 5428122a9ef0..cd8f29868a0c 100644 --- a/Source/Core/Ellipsoid.js +++ b/Source/Core/Ellipsoid.js @@ -8,6 +8,7 @@ define([ './DeveloperError', './freezeObject', './Math', + './Ray', './scaleToGeodeticSurface' ], function( Cartesian3, @@ -18,6 +19,7 @@ define([ DeveloperError, freezeObject, CesiumMath, + Ray, scaleToGeodeticSurface) { 'use strict'; @@ -608,5 +610,67 @@ define([ return this._radii.toString(); }; + var vectorToZAxisScratch = new Cartesian3(); + /** + * Computes a ray which its direction is the geodetic surface normal at a position and its + * origin is the intersection of this normal with the z-axis. + * + * There is no guarantee that the result would be inside the ellipsoid. + * + * @param {Cartesian3} position the position *on the surface of the ellipsoid* + * @param {Ellipsoid} [ellipsoid = Ellipsoid.WGS84] The ellipsoid for which to compute this ray + * @param {Ray} [result] The cartesian to which to copy the result, or undefined to create and + * return a new instance. + * @returns {Ray} the ray + * + * @exception {DeveloperError} position is required. + * @exception {DeveloperError} Ellipsoid must be an ellipsoid of revolution (radii.x == radii.y). + * @exception {DeveloperError} Result is not on the z-axis. Please ensure that your input data is valid. + */ + Ellipsoid.prototype.getSurfaceNormalRayFromZAxis = function(position, ellipsoid, result) { + //>>includeStart('debug', pragmas.debug); + if (!defined(position)) { + throw new DeveloperError('position is required.'); + } + if (defined(ellipsoid) && !CesiumMath.equalsEpsilon(ellipsoid.radii.x, ellipsoid.radii.y, CesiumMath.EPSILON15)) { + throw new DeveloperError('Ellipsoid must be an ellipsoid of revolution (radii.x == radii.y)'); + } + //>>includeEnd('debug'); + + ellipsoid = defaultValue(ellipsoid, Ellipsoid.WGS84); + + if (!defined(result)){ + result = new Ray(); + } + + var surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, result.direction); + + // compute the magnitude required to bring surface normal to x=0, y=0, from position + var magnitude; + + // avoid dividing by zero + if (Math.abs(surfaceNormal.x) > CesiumMath.EPSILON16){ + magnitude = cartesian.x / surfaceNormal.x; + } else if (Math.abs(surfaceNormal.y) > CesiumMath.EPSILON16){ + magnitude = cartesian.y / surfaceNormal.y; + } else if (Math.abs(surfaceNormal.z) > CesiumMath.EPSILON16){ //surface normal is (0,0,1) | (0,0,-1) | (0,0,0) + magnitude = cartesian.z / surfaceNormal.z; + } else { //(0,0,0), just in case + magnitude = 0; + } + + var vectorToZAxis = Cartesian3.multiplyByScalar(surfaceNormal, magnitude, vectorToZAxisScratch); + Cartesian3.subtract(position, vectorToZAxis, result.origin); + + //>>includeStart('debug', pragmas.debug); + // sub millimeter accuracy + if (Math.abs(result.origin.x > CesiumMath.EPSILON4) || Math.abs(result.origin.y > CesiumMath.EPSILON4)){ + throw new DeveloperError('Result is not on the z-axis. Please ensure that your input data is valid.'); + } + //>>includeEnd('debug'); + + return result; + }; + return Ellipsoid; }); From 42f89321fc414efc48930123f02626ee837a4038 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Wed, 7 Dec 2016 09:59:13 -0500 Subject: [PATCH 140/396] Whitespace --- Source/Core/RectangleGeometryLibrary.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Source/Core/RectangleGeometryLibrary.js b/Source/Core/RectangleGeometryLibrary.js index 38d0d76b20e8..6f7ef2cb8e51 100644 --- a/Source/Core/RectangleGeometryLibrary.js +++ b/Source/Core/RectangleGeometryLibrary.js @@ -122,8 +122,8 @@ define([ granXSin : granXSin, nwCorner : nwCorner }; - } + /** * @private */ @@ -212,8 +212,6 @@ define([ rectangle.west = west; } - - if (stRotation !== 0) { rotation = rotation - stRotation; stNwCorner = Rectangle.northwest(rectangle, stNwCorner); From 8d049445202673cb3b41a325299fe96e7bf40425 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Wed, 7 Dec 2016 10:52:15 -0500 Subject: [PATCH 141/396] Clean up GeocoderService API --- Apps/Sandcastle/gallery/Custom Geocoder.html | 3 -- Source/Core/GeocoderService.js | 49 ++++++++++++++++++++ Source/Widgets/Geocoder/GeocoderViewModel.js | 23 ++++----- Source/Widgets/Viewer/Viewer.js | 2 +- 4 files changed, 59 insertions(+), 18 deletions(-) create mode 100644 Source/Core/GeocoderService.js diff --git a/Apps/Sandcastle/gallery/Custom Geocoder.html b/Apps/Sandcastle/gallery/Custom Geocoder.html index d8bfe5d5b605..1c818cbeb70b 100644 --- a/Apps/Sandcastle/gallery/Custom Geocoder.html +++ b/Apps/Sandcastle/gallery/Custom Geocoder.html @@ -38,9 +38,6 @@ //Sandcastle_Begin var options = { geocoder: { - getSuggestions: function () { - return []; - }, geocode: function (input, callback) { var endpoint = 'http://nominatim.openstreetmap.org/search?'; var query = 'format=json&q=' + input; diff --git a/Source/Core/GeocoderService.js b/Source/Core/GeocoderService.js new file mode 100644 index 000000000000..f0ca404d8eba --- /dev/null +++ b/Source/Core/GeocoderService.js @@ -0,0 +1,49 @@ +/*global define*/ +define([ + './defineProperties', + './DeveloperError' + ], function( + defineProperties, + DeveloperError) { + 'use strict'; + + /** + * @typedef {Object} GeocoderResult + * @property {String} displayName The display name for a location + * @property {Rectangle} rectangle The bounding box for a location + */ + + /** + * Provides geocoding through an external service. This type describes an interface and + * is not intended to be used. + * @alias GeocoderService + * @constructor + * + * @see BingMapsGeocoderService + */ + function GeocoderService () { + } + + defineProperties(GeocoderService.prototype, { + /** + * The name of this service to be displayed next to suggestions + * in case more than one geocoder is in use + * @type {String} + * + */ + displayName : { + get : DeveloperError.throwInstantiationError + } + }); + + /** + * @function + * + * @param {String} query The query to be sent to the geocoder service + * @returns {GeocoderResult[]} geocoderResults An array containing the results from the + * geocoder service + */ + GeocoderService.prototype.geocode = DeveloperError.throwInstantiationError; + + return GeocoderService; +}); diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index c956cc3f54e9..dee1ec700ce3 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -57,13 +57,8 @@ define([ if (!defined(options) || !defined(options.scene)) { throw new DeveloperError('options.scene is required.'); } - if (defined(options.customGeocoder)) { - if (!defined(options.customGeocoder.getSuggestions)) { - throw new DeveloperError('options.customGeocoder is available but missing a getSuggestions method'); - } - if (!defined(options.customGeocoder.geocode)) { - throw new DeveloperError('options.customGeocoder is available but missing a geocode method'); - } + if (defined(options.geocoderService) && !defined(options.geocoderService.geocode)) { + throw new DeveloperError('options.geocoderService is available but missing a geocode method'); } //>>includeEnd('debug'); @@ -112,7 +107,7 @@ define([ if (that.isSearchInProgress) { cancelGeocode(that); } else { - geocode(that, options.customGeocoder); + geocode(that, options.geocoderService); } }); @@ -176,9 +171,9 @@ define([ return; } - var customGeocoder = options.customGeocoder; - if (defined(customGeocoder)) { - customGeocoder.geocode(query, function (err, results) { + var geocoderService = options.geocoderService; + if (defined(geocoderService)) { + geocoderService.geocode(query, function (err, results) { if (defined(err)) { return; } @@ -420,17 +415,17 @@ define([ }); } - function geocode(viewModel, customGeocoder) { + function geocode(viewModel, geocoderService) { var query = viewModel.searchText; if (hasOnlyWhitespace(query)) { return; } - if (defined(customGeocoder)) { + if (defined(geocoderService)) { viewModel._isSearchInProgress = true; viewModel._suggestions.splice(0, viewModel._suggestions().length); - customGeocoder.geocode(query, function (err, results) { + geocoderService.geocode(query, function (err, results) { if (defined(err)) { viewModel._isSearchInProgress = false; return; diff --git a/Source/Widgets/Viewer/Viewer.js b/Source/Widgets/Viewer/Viewer.js index dcf0c865bc1a..67b21c1cf2aa 100644 --- a/Source/Widgets/Viewer/Viewer.js +++ b/Source/Widgets/Viewer/Viewer.js @@ -473,7 +473,7 @@ Either specify options.terrainProvider instead or set options.baseLayerPicker to toolbar.appendChild(geocoderContainer); geocoder = new Geocoder({ container : geocoderContainer, - customGeocoder: options.geocoder, + geocoderService: options.geocoder, scene : cesiumWidget.scene }); // Subscribe to search so that we can clear the trackedEntity when it is clicked. From ef121fd03c004dcd8b46d15577d2eef208079e86 Mon Sep 17 00:00:00 2001 From: Scott Hunter Date: Wed, 7 Dec 2016 11:23:07 -0500 Subject: [PATCH 142/396] Update CZML validation document and test. This should hopefully reduce diff churn in future revisions. --- Specs/Data/CZML/ValidationDocument.czml | 4818 +++++++++++------------ Specs/DataSources/CzmlDataSourceSpec.js | 2898 +++++++------- 2 files changed, 3858 insertions(+), 3858 deletions(-) diff --git a/Specs/Data/CZML/ValidationDocument.czml b/Specs/Data/CZML/ValidationDocument.czml index a231aca24840..ee2f1882ec3b 100644 --- a/Specs/Data/CZML/ValidationDocument.czml +++ b/Specs/Data/CZML/ValidationDocument.czml @@ -14,34 +14,34 @@ }, { "id":"Constant", - "description":"string1", + "description":"string31449", "position":{ "cartesian":[ - 1,2,3 + 24944,16481,24896 ] }, "orientation":{ "unitQuaternion":[ - 0.36514837167011116,0.5477225575051662,0.7302967433402213,0.18257418583505508 + 0.43149331197758906,0.5608119145093391,0.42352282258757407,0.5656252619981141 ] }, "viewFrom":{ "cartesian":[ - 4,5,6 + 17794,13381,18228 ] }, "billboard":{ "show":true, - "image":"http://example.com/1", - "scale":1, + "image":"http://example.com/3792", + "scale":27514, "pixelOffset":{ "cartesian2":[ - 1,2 + 16996,51010 ] }, "eyeOffset":{ "cartesian":[ - 7,8,9 + 64633,11516,17196 ] }, "horizontalOrigin":"LEFT", @@ -49,36 +49,36 @@ "heightReference":"CLAMP_TO_GROUND", "color":{ "rgba":[ - 2,3,4,1 + 87,118,167,140 ] }, - "rotation":2, + "rotation":57379, "alignedAxis":{ "unitCartesian":[ - 0.26726124191242406,0.5345224838248491,0.8017837257372731 + 0.20506209189572408,0.9757682134856994,0.07632779322289032 ] }, "sizeInMeters":true, - "width":3, - "height":4, + "width":25197, + "height":53328, "scaleByDistance":{ "nearFarScalar":[ - 1,2,3,4 + 59318,31207,63353,55287 ] }, "translucencyByDistance":{ "nearFarScalar":[ - 5,6,7,8 + 43707,31146,12921,57138 ] }, "pixelOffsetScaleByDistance":{ "nearFarScalar":[ - 9,10,11,12 + 11873,40494,29598,27507 ] }, "imageSubRegion":{ "boundingRectangle":[ - 1,2,3,4 + 62620,63220,23030,63321 ] } }, @@ -86,7 +86,7 @@ "show":true, "dimensions":{ "cartesian":[ - 10,11,12 + 57494,62432,42995 ] }, "fill":true, @@ -94,7 +94,7 @@ "solidColor":{ "color":{ "rgba":[ - 6,7,8,5 + 88,226,91,144 ] } } @@ -102,29 +102,29 @@ "outline":true, "outlineColor":{ "rgba":[ - 10,11,12,9 + 121,42,244,168 ] }, - "outlineWidth":5 + "outlineWidth":15323 }, "corridor":{ "show":true, "positions":{ "cartesian":[ - 1,2,3,4,5,6 + 36415,2702,36618,47759,11706,63277 ] }, - "width":6, - "height":7, - "extrudedHeight":8, + "width":20413, + "height":8062, + "extrudedHeight":22846, "cornerType":"BEVELED", - "granularity":9, + "granularity":44105, "fill":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 14,15,16,13 + 230,252,22,236 ] } } @@ -132,22 +132,22 @@ "outline":true, "outlineColor":{ "rgba":[ - 18,19,20,17 + 198,25,134,60 ] }, - "outlineWidth":10 + "outlineWidth":9132 }, "cylinder":{ "show":true, - "length":11, - "topRadius":12, - "bottomRadius":13, + "length":33298, + "topRadius":16245, + "bottomRadius":59378, "fill":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 22,23,24,21 + 216,68,53,64 ] } } @@ -155,28 +155,28 @@ "outline":true, "outlineColor":{ "rgba":[ - 26,27,28,25 + 4,90,209,96 ] }, - "outlineWidth":14, - "numberOfVerticalLines":15, - "slices":16 + "outlineWidth":64018, + "numberOfVerticalLines":38567, + "slices":39979 }, "ellipse":{ "show":true, - "semiMajorAxis":17, - "semiMinorAxis":18, - "height":19, - "extrudedHeight":20, - "rotation":21, - "stRotation":22, - "granularity":23, + "semiMajorAxis":60072, + "semiMinorAxis":38653, + "height":15549, + "extrudedHeight":55640, + "rotation":27722, + "stRotation":4692, + "granularity":62192, "fill":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 30,31,32,29 + 116,186,200,40 ] } } @@ -184,17 +184,17 @@ "outline":true, "outlineColor":{ "rgba":[ - 34,35,36,33 + 160,82,145,104 ] }, - "outlineWidth":24, - "numberOfVerticalLines":25 + "outlineWidth":8839, + "numberOfVerticalLines":38878 }, "ellipsoid":{ "show":true, "radii":{ "cartesian":[ - 13,14,15 + 15638,24381,37983 ] }, "fill":true, @@ -202,7 +202,7 @@ "solidColor":{ "color":{ "rgba":[ - 38,39,40,37 + 202,67,110,69 ] } } @@ -210,28 +210,28 @@ "outline":true, "outlineColor":{ "rgba":[ - 42,43,44,41 + 55,23,226,7 ] }, - "outlineWidth":26, - "stackPartitions":27, - "slicePartitions":28, - "subdivisions":29 + "outlineWidth":47507, + "stackPartitions":54278, + "slicePartitions":28562, + "subdivisions":14008 }, "label":{ "show":true, - "text":"string2", - "font":"6px sans-serif", + "text":"string36641", + "font":"14px sans-serif", "style":"FILL_AND_OUTLINE", - "scale":30, + "scale":6510, "pixelOffset":{ "cartesian2":[ - 3,4 + 25913,30821 ] }, "eyeOffset":{ "cartesian":[ - 16,17,18 + 30502,29047,25457 ] }, "horizontalOrigin":"LEFT", @@ -239,57 +239,57 @@ "heightReference":"CLAMP_TO_GROUND", "fillColor":{ "rgba":[ - 46,47,48,45 + 88,197,147,137 ] }, "outlineColor":{ "rgba":[ - 50,51,52,49 + 171,128,159,223 ] }, - "outlineWidth":31, + "outlineWidth":36637, "translucencyByDistance":{ "nearFarScalar":[ - 13,14,15,16 + 34067,16517,11328,13612 ] }, "pixelOffsetScaleByDistance":{ "nearFarScalar":[ - 17,18,19,20 + 21220,35154,33161,36737 ] } }, "model":{ "show":true, - "gltf":"http://example.com/2", - "scale":32, - "minimumPixelSize":33, - "maximumScale":34, + "gltf":"http://example.com/60043", + "scale":44278, + "minimumPixelSize":35888, + "maximumScale":64305, "incrementallyLoadTextures":true, "runAnimations":true, "heightReference":"CLAMP_TO_GROUND", "color":{ "rgba":[ - 54,55,56,53 + 0,52,75,73 ] }, "colorBlendMode":"REPLACE", - "colorBlendAmount":35, + "colorBlendAmount":7475, "nodeTransformations":{ "prop":{ "translation":{ "cartesian":[ - 19,20,21 + 18548,48456,21181 ] }, "rotation":{ "unitQuaternion":[ - 0.454858826147342,0.530668630505232,0.606478434863123,0.379049021789452 + 0.5279606063289254,0.5671567049191863,0.6248129645698993,0.09591469926647515 ] }, "scale":{ "cartesian":[ - 22,23,24 + 53739,37841,41107 ] } } @@ -297,15 +297,15 @@ }, "path":{ "show":true, - "width":36, - "resolution":37, - "leadTime":38, - "trailTime":39, + "width":56040, + "resolution":31563, + "leadTime":5997, + "trailTime":52915, "material":{ "solidColor":{ "color":{ "rgba":[ - 58,59,60,57 + 10,78,168,13 ] } } @@ -313,27 +313,27 @@ }, "point":{ "show":true, - "pixelSize":40, + "pixelSize":53869, "heightReference":"CLAMP_TO_GROUND", "color":{ "rgba":[ - 62,63,64,61 + 3,147,219,77 ] }, "outlineColor":{ "rgba":[ - 66,67,68,65 + 254,106,11,94 ] }, - "outlineWidth":41, + "outlineWidth":27922, "scaleByDistance":{ "nearFarScalar":[ - 21,22,23,24 + 20128,16462,49728,18882 ] }, "translucencyByDistance":{ "nearFarScalar":[ - 25,26,27,28 + 52796,43982,61099,50158 ] } }, @@ -341,19 +341,19 @@ "show":true, "positions":{ "cartesian":[ - 7,8,9,10,11,12 + 39143,2200,6408,27161,33386,62338 ] }, - "height":42, - "extrudedHeight":43, - "stRotation":44, - "granularity":45, + "height":26391, + "extrudedHeight":15922, + "stRotation":2555, + "granularity":17060, "fill":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 70,71,72,69 + 216,139,124,253 ] } } @@ -361,10 +361,10 @@ "outline":true, "outlineColor":{ "rgba":[ - 74,75,76,73 + 172,48,134,87 ] }, - "outlineWidth":46, + "outlineWidth":62220, "perPositionHeight":true, "closeTop":true, "closeBottom":true @@ -373,16 +373,16 @@ "show":true, "positions":{ "cartesian":[ - 13,14,15,16,17,18 + 23333,31067,17529,57924,41186,31648 ] }, - "width":47, - "granularity":48, + "width":14667, + "granularity":53395, "material":{ "solidColor":{ "color":{ "rgba":[ - 78,79,80,77 + 88,0,232,230 ] } } @@ -393,20 +393,20 @@ "show":true, "coordinates":{ "wsen":[ - 1,0.429203673205103,1.4292036732051,0.858407346410207 + 1.13325368272577,0.703573207377445,0.756676249095309,0.339217858685931 ] }, - "height":49, - "extrudedHeight":50, - "rotation":51, - "stRotation":52, - "granularity":53, + "height":20608, + "extrudedHeight":23002, + "rotation":54979, + "stRotation":8079, + "granularity":60343, "fill":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 82,83,84,81 + 160,249,70,249 ] } } @@ -414,10 +414,10 @@ "outline":true, "outlineColor":{ "rgba":[ - 86,87,88,85 + 196,59,142,36 ] }, - "outlineWidth":54, + "outlineWidth":59794, "closeTop":true, "closeBottom":true }, @@ -425,26 +425,26 @@ "show":true, "positions":{ "cartesian":[ - 19,20,21,22,23,24 + 21681,40276,30621,3959,61967,19442 ] }, "minimumHeights":{ "array":[ - 1,2 + 49466,44737 ] }, "maximumHeights":{ "array":[ - 3,4 + 59672,62697 ] }, - "granularity":55, + "granularity":47652, "fill":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 90,91,92,89 + 64,176,190,65 ] } } @@ -452,31 +452,31 @@ "outline":true, "outlineColor":{ "rgba":[ - 94,95,96,93 + 107,196,96,198 ] }, - "outlineWidth":56 + "outlineWidth":50458 }, "agi_conicSensor":{ "show":true, - "innerHalfAngle":57, - "outerHalfAngle":58, - "minimumClockAngle":59, - "maximumClockAngle":60, - "radius":61, + "innerHalfAngle":62994, + "outerHalfAngle":27216, + "minimumClockAngle":18231, + "maximumClockAngle":59909, + "radius":29788, "showIntersection":true, "intersectionColor":{ "rgba":[ - 98,99,100,97 + 61,222,182,163 ] }, - "intersectionWidth":62, + "intersectionWidth":50429, "showLateralSurfaces":true, "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgba":[ - 102,103,104,101 + 130,80,209,249 ] } } @@ -486,7 +486,7 @@ "solidColor":{ "color":{ "rgba":[ - 106,107,108,105 + 107,30,24,25 ] } } @@ -496,7 +496,7 @@ "solidColor":{ "color":{ "rgba":[ - 110,111,112,109 + 149,40,134,42 ] } } @@ -506,7 +506,7 @@ "solidColor":{ "color":{ "rgba":[ - 114,115,116,113 + 208,75,13,71 ] } } @@ -518,7 +518,7 @@ "solidColor":{ "color":{ "rgba":[ - 118,119,120,117 + 241,9,164,213 ] } } @@ -526,32 +526,32 @@ "showEnvironmentIntersection":true, "environmentIntersectionColor":{ "rgba":[ - 122,123,124,121 + 83,22,249,147 ] }, - "environmentIntersectionWidth":63 + "environmentIntersectionWidth":13317 }, "agi_customPatternSensor":{ "show":true, "directions":{ "spherical":[ - 1,2,3,4,5,6 + 49130,29887,4468,25873,21605,54100 ] }, - "radius":64, + "radius":26731, "showIntersection":true, "intersectionColor":{ "rgba":[ - 126,127,128,125 + 59,147,243,67 ] }, - "intersectionWidth":65, + "intersectionWidth":63237, "showLateralSurfaces":true, "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgba":[ - 130,131,132,129 + 35,33,155,191 ] } } @@ -561,7 +561,7 @@ "solidColor":{ "color":{ "rgba":[ - 134,135,136,133 + 6,121,164,89 ] } } @@ -571,7 +571,7 @@ "solidColor":{ "color":{ "rgba":[ - 138,139,140,137 + 185,102,188,167 ] } } @@ -581,7 +581,7 @@ "solidColor":{ "color":{ "rgba":[ - 142,143,144,141 + 160,74,45,44 ] } } @@ -593,7 +593,7 @@ "solidColor":{ "color":{ "rgba":[ - 146,147,148,145 + 238,207,29,137 ] } } @@ -601,29 +601,29 @@ "showEnvironmentIntersection":true, "environmentIntersectionColor":{ "rgba":[ - 150,151,152,149 + 134,29,12,55 ] }, - "environmentIntersectionWidth":66 + "environmentIntersectionWidth":53576 }, "agi_rectangularSensor":{ "show":true, - "xHalfAngle":67, - "yHalfAngle":68, - "radius":69, + "xHalfAngle":4927, + "yHalfAngle":37224, + "radius":35686, "showIntersection":true, "intersectionColor":{ "rgba":[ - 154,155,156,153 + 211,199,212,246 ] }, - "intersectionWidth":70, + "intersectionWidth":41682, "showLateralSurfaces":true, "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgba":[ - 158,159,160,157 + 34,130,31,98 ] } } @@ -633,7 +633,7 @@ "solidColor":{ "color":{ "rgba":[ - 162,163,164,161 + 134,158,149,146 ] } } @@ -643,7 +643,7 @@ "solidColor":{ "color":{ "rgba":[ - 166,167,168,165 + 52,43,245,197 ] } } @@ -653,7 +653,7 @@ "solidColor":{ "color":{ "rgba":[ - 170,171,172,169 + 32,23,251,181 ] } } @@ -665,7 +665,7 @@ "solidColor":{ "color":{ "rgba":[ - 174,175,176,173 + 175,187,53,80 ] } } @@ -673,25 +673,25 @@ "showEnvironmentIntersection":true, "environmentIntersectionColor":{ "rgba":[ - 178,179,180,177 + 84,60,81,144 ] }, - "environmentIntersectionWidth":71 + "environmentIntersectionWidth":64839 }, "agi_fan":{ "show":true, "directions":{ "spherical":[ - 7,8,9,10,11,12 + 19722,1613,23046,14938,16954,50242 ] }, - "radius":72, + "radius":54355, "perDirectionRadius":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 182,183,184,181 + 172,23,214,145 ] } } @@ -700,80 +700,80 @@ "outline":true, "outlineColor":{ "rgba":[ - 186,187,188,185 + 107,168,140,214 ] }, - "outlineWidth":73, - "numberOfRings":74 + "outlineWidth":18367, + "numberOfRings":33012 }, "agi_vector":{ "show":true, "color":{ "rgba":[ - 190,191,192,189 + 92,133,96,189 ] }, "direction":{ "spherical":[ - 1,2,3 + 44405,20909,43089 ] }, - "length":75, - "minimumLengthInPixels":76 + "length":5478, + "minimumLengthInPixels":58959 } }, { - "id":"constant1", + "id":"constant_position_cartographicRadians", "position":{ "cartographicRadians":[ - 1,0.429203673205103,3 + 0.368123392863751,0.678098621973879,32050 ] } }, { - "id":"constant2", + "id":"constant_position_cartographicDegrees", "position":{ "cartographicDegrees":[ - 4,5,6 + 14,14,24697 ] } }, { - "id":"constant3", + "id":"constant_position_cartesianVelocity", "position":{ "cartesianVelocity":[ - 1,2,3,4,5,6 + 15776,23613,14940,35130,14217,19511 ] } }, { - "id":"constant4", + "id":"constant_billboard_color_rgbaf", "billboard":{ "color":{ "rgbaf":[ - 0.00784313725490196,0.011764705882352941,0.01568627450980392,0.00392156862745098 + 0.6745098039215687,0.8666666666666667,0.6,0.6509803921568628 ] } } }, { - "id":"constant5", + "id":"constant_billboard_alignedAxis_unitSpherical", "billboard":{ "alignedAxis":{ "unitSpherical":[ - 1,2 + 20514,39760 ] } } }, { - "id":"constant6", + "id":"constant_box_material_solidColor_color", "box":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.023529411764705882,0.027450980392156862,0.03137254901960784,0.0196078431372549 + 0.996078431372549,0.08235294117647059,0.49411764705882355,0.10196078431372549 ] } } @@ -785,15 +785,15 @@ "box":{ "material":{ "image":{ - "image":"http://example.com/3", + "image":"http://example.com/50881", "repeat":{ "cartesian2":[ - 5,6 + 58955,45286 ] }, "color":{ "rgba":[ - 194,195,196,193 + 98,97,133,129 ] }, "transparent":true @@ -808,23 +808,23 @@ "grid":{ "color":{ "rgba":[ - 198,199,200,197 + 178,10,106,226 ] }, - "cellAlpha":77, + "cellAlpha":47180, "lineCount":{ "cartesian2":[ - 7,8 + 24659,13408 ] }, "lineThickness":{ "cartesian2":[ - 9,10 + 13897,25654 ] }, "lineOffset":{ "cartesian2":[ - 11,12 + 14153,49207 ] } } @@ -839,28 +839,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 202,203,204,201 + 18,147,177,80 ] }, "oddColor":{ "rgba":[ - 206,207,208,205 + 189,226,187,107 ] }, - "offset":78, - "repeat":79 + "offset":43563, + "repeat":24480 } } } }, { - "id":"material1", + "id":"constant_box_material_image_color", "box":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.0392156862745098,0.043137254901960784,0.047058823529411764,0.03529411764705882 + 0.7333333333333333,0.4745098039215686,0.5607843137254902,0.34901960784313724 ] } } @@ -868,13 +868,13 @@ } }, { - "id":"material2", + "id":"constant_box_material_grid_color", "box":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.054901960784313725,0.058823529411764705,0.06274509803921569,0.050980392156862744 + 0.8470588235294118,0.39215686274509803,0.35294117647058826,0.8980392156862745 ] } } @@ -882,13 +882,13 @@ } }, { - "id":"material3", + "id":"constant_box_material_stripe_evenColor", "box":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.07058823529411765,0.07450980392156863,0.0784313725490196,0.06666666666666667 + 0.6666666666666666,0.9764705882352941,0.8392156862745098,0.6431372549019608 ] } } @@ -896,13 +896,13 @@ } }, { - "id":"material4", + "id":"constant_box_material_stripe_oddColor", "box":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.08627450980392157,0.09019607843137255,0.09411764705882353,0.08235294117647059 + 0.25882352941176473,0.796078431372549,0.7176470588235294,0.7490196078431373 ] } } @@ -910,43 +910,43 @@ } }, { - "id":"constant7", + "id":"constant_box_outlineColor_rgbaf", "box":{ "outlineColor":{ "rgbaf":[ - 0.10196078431372549,0.10588235294117647,0.10980392156862745,0.09803921568627451 + 0.8352941176470589,0.03137254901960784,0.2823529411764706,0.33725490196078434 ] } } }, { - "id":"constant8", + "id":"constant_corridor_positions_cartographicRadians", "corridor":{ "positions":{ "cartographicRadians":[ - 1,0.429203673205103,3,0.858407346410207,0.28761101961531,6 + 0.220356654342316,0.879184920197648,64909,0.175978952571564,1.00316515710468,913 ] } } }, { - "id":"constant9", + "id":"constant_corridor_positions_cartographicDegrees", "corridor":{ "positions":{ "cartographicDegrees":[ - 7,8,9,10,11,12 + 28,14,63058,15,37,26381 ] } } }, { - "id":"constant10", + "id":"constant_corridor_material_solidColor_color", "corridor":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.11764705882352941,0.12156862745098039,0.12549019607843137,0.11372549019607843 + 0.3333333333333333,0.8784313725490196,0.3568627450980392,0.43529411764705883 ] } } @@ -958,15 +958,15 @@ "corridor":{ "material":{ "image":{ - "image":"http://example.com/4", + "image":"http://example.com/8903", "repeat":{ "cartesian2":[ - 13,14 + 41660,35234 ] }, "color":{ "rgba":[ - 210,211,212,209 + 213,25,147,247 ] }, "transparent":true @@ -981,23 +981,23 @@ "grid":{ "color":{ "rgba":[ - 214,215,216,213 + 236,51,112,235 ] }, - "cellAlpha":80, + "cellAlpha":11472, "lineCount":{ "cartesian2":[ - 15,16 + 1254,38404 ] }, "lineThickness":{ "cartesian2":[ - 17,18 + 48962,63679 ] }, "lineOffset":{ "cartesian2":[ - 19,20 + 39061,4.7e4 ] } } @@ -1012,28 +1012,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 218,219,220,217 + 245,61,208,138 ] }, "oddColor":{ "rgba":[ - 222,223,224,221 + 114,73,91,165 ] }, - "offset":81, - "repeat":82 + "offset":12788, + "repeat":33136 } } } }, { - "id":"material5", + "id":"constant_corridor_material_image_color", "corridor":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.13333333333333333,0.13725490196078433,0.1411764705882353,0.12941176470588237 + 0.01568627450980392,0.09411764705882353,0.4,0.5294117647058824 ] } } @@ -1041,13 +1041,13 @@ } }, { - "id":"material6", + "id":"constant_corridor_material_grid_color", "corridor":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.14901960784313725,0.15294117647058825,0.1568627450980392,0.1450980392156863 + 0.5764705882352941,0.7607843137254902,0.15294117647058825,0.00392156862745098 ] } } @@ -1055,13 +1055,13 @@ } }, { - "id":"material7", + "id":"constant_corridor_material_stripe_evenColor", "corridor":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.16470588235294117,0.16862745098039217,0.17254901960784313,0.1607843137254902 + 0.9137254901960784,0.6392156862745098,0.6313725490196078,0.8901960784313725 ] } } @@ -1069,13 +1069,13 @@ } }, { - "id":"material8", + "id":"constant_corridor_material_stripe_oddColor", "corridor":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.1803921568627451,0.1843137254901961,0.18823529411764706,0.17647058823529413 + 0.2,0.13725490196078433,0.792156862745098,0.30196078431372547 ] } } @@ -1083,23 +1083,23 @@ } }, { - "id":"constant11", + "id":"constant_corridor_outlineColor_rgbaf", "corridor":{ "outlineColor":{ "rgbaf":[ - 0.19607843137254902,0.2,0.20392156862745098,0.19215686274509805 + 0.6901960784313725,0.054901960784313725,0.24705882352941178,0.2980392156862745 ] } } }, { - "id":"constant12", + "id":"constant_cylinder_material_solidColor_color", "cylinder":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.21176470588235294,0.21568627450980393,0.2196078431372549,0.20784313725490197 + 0.47843137254901963,0.050980392156862744,0.45098039215686275,0.8784313725490196 ] } } @@ -1111,15 +1111,15 @@ "cylinder":{ "material":{ "image":{ - "image":"http://example.com/5", + "image":"http://example.com/27447", "repeat":{ "cartesian2":[ - 21,22 + 65243,41470 ] }, "color":{ "rgba":[ - 226,227,228,225 + 200,175,107,217 ] }, "transparent":true @@ -1134,23 +1134,23 @@ "grid":{ "color":{ "rgba":[ - 230,231,232,229 + 173,210,231,62 ] }, - "cellAlpha":83, + "cellAlpha":9555, "lineCount":{ "cartesian2":[ - 23,24 + 58545,26852 ] }, "lineThickness":{ "cartesian2":[ - 25,26 + 58520,44260 ] }, "lineOffset":{ "cartesian2":[ - 27,28 + 61513,28656 ] } } @@ -1165,28 +1165,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 234,235,236,233 + 158,155,154,86 ] }, "oddColor":{ "rgba":[ - 238,239,240,237 + 191,226,188,74 ] }, - "offset":84, - "repeat":85 + "offset":55018, + "repeat":33073 } } } }, { - "id":"material9", + "id":"constant_cylinder_material_image_color", "cylinder":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.22745098039215686,0.23137254901960785,0.23529411764705882,0.2235294117647059 + 0.6549019607843137,0.06274509803921569,0.5176470588235295,0.5372549019607843 ] } } @@ -1194,13 +1194,13 @@ } }, { - "id":"material10", + "id":"constant_cylinder_material_grid_color", "cylinder":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.24313725490196078,0.24705882352941178,0.25098039215686274,0.23921568627450981 + 0.9019607843137255,0.36470588235294116,0.3058823529411765,0.9450980392156862 ] } } @@ -1208,13 +1208,13 @@ } }, { - "id":"material11", + "id":"constant_cylinder_material_stripe_evenColor", "cylinder":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.25882352941176473,0.2627450980392157,0.26666666666666666,0.2549019607843137 + 0.09019607843137255,0.13333333333333333,0.37254901960784315,0.4980392156862745 ] } } @@ -1222,13 +1222,13 @@ } }, { - "id":"material12", + "id":"constant_cylinder_material_stripe_oddColor", "cylinder":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.27450980392156865,0.2784313725490196,0.2823529411764706,0.27058823529411763 + 0.9058823529411765,0.5647058823529412,0.48627450980392156,0.6784313725490196 ] } } @@ -1236,23 +1236,23 @@ } }, { - "id":"constant13", + "id":"constant_cylinder_outlineColor_rgbaf", "cylinder":{ "outlineColor":{ "rgbaf":[ - 0.2901960784313726,0.29411764705882354,0.2980392156862745,0.28627450980392155 + 0.6470588235294118,0.5647058823529412,0.4,0.08627450980392157 ] } } }, { - "id":"constant14", + "id":"constant_ellipse_material_solidColor_color", "ellipse":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.3058823529411765,0.30980392156862746,0.3137254901960784,0.30196078431372547 + 0.09803921568627451,0.9137254901960784,0.8117647058823529,0.2 ] } } @@ -1264,15 +1264,15 @@ "ellipse":{ "material":{ "image":{ - "image":"http://example.com/6", + "image":"http://example.com/2481", "repeat":{ "cartesian2":[ - 29,30 + 45447,53937 ] }, "color":{ "rgba":[ - 242,243,244,241 + 45,86,136,120 ] }, "transparent":true @@ -1287,23 +1287,23 @@ "grid":{ "color":{ "rgba":[ - 246,247,248,245 + 217,159,32,60 ] }, - "cellAlpha":86, + "cellAlpha":24764, "lineCount":{ "cartesian2":[ - 31,32 + 25721,6500 ] }, "lineThickness":{ "cartesian2":[ - 33,34 + 57205,63455 ] }, "lineOffset":{ "cartesian2":[ - 35,36 + 49829,3778 ] } } @@ -1318,28 +1318,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 250,251,252,249 + 7,152,58,224 ] }, "oddColor":{ "rgba":[ - 254,0,1,253 + 4,228,224,57 ] }, - "offset":87, - "repeat":88 + "offset":26719, + "repeat":15097 } } } }, { - "id":"material13", + "id":"constant_ellipse_material_image_color", "ellipse":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.3215686274509804,0.3254901960784314,0.32941176470588235,0.3176470588235294 + 0.36470588235294116,0.6980392156862745,0.803921568627451,0.8431372549019608 ] } } @@ -1347,13 +1347,13 @@ } }, { - "id":"material14", + "id":"constant_ellipse_material_grid_color", "ellipse":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.33725490196078434,0.3411764705882353,0.34509803921568627,0.3333333333333333 + 0.6784313725490196,0.5803921568627451,0.8235294117647058,0.6274509803921569 ] } } @@ -1361,13 +1361,13 @@ } }, { - "id":"material15", + "id":"constant_ellipse_material_stripe_evenColor", "ellipse":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.35294117647058826,0.3568627450980392,0.3607843137254902,0.34901960784313724 + 0.3137254901960784,0.7686274509803922,0.6745098039215687,0.7058823529411765 ] } } @@ -1375,13 +1375,13 @@ } }, { - "id":"material16", + "id":"constant_ellipse_material_stripe_oddColor", "ellipse":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.3686274509803922,0.37254901960784315,0.3764705882352941,0.36470588235294116 + 0.6823529411764706,0.6588235294117647,0.9529411764705882,0.08235294117647059 ] } } @@ -1389,23 +1389,23 @@ } }, { - "id":"constant15", + "id":"constant_ellipse_outlineColor_rgbaf", "ellipse":{ "outlineColor":{ "rgbaf":[ - 0.3843137254901961,0.38823529411764707,0.39215686274509803,0.3803921568627451 + 0.5725490196078431,0.9568627450980393,0.9686274509803922,0.6745098039215687 ] } } }, { - "id":"constant16", + "id":"constant_ellipsoid_material_solidColor_color", "ellipsoid":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.4,0.403921568627451,0.40784313725490196,0.396078431372549 + 0.5725490196078431,0.5333333333333333,0.3843137254901961,0.2 ] } } @@ -1417,15 +1417,15 @@ "ellipsoid":{ "material":{ "image":{ - "image":"http://example.com/7", + "image":"http://example.com/47428", "repeat":{ "cartesian2":[ - 37,38 + 53733,35793 ] }, "color":{ "rgba":[ - 3,4,5,2 + 125,49,160,165 ] }, "transparent":true @@ -1440,23 +1440,23 @@ "grid":{ "color":{ "rgba":[ - 7,8,9,6 + 95,212,218,57 ] }, - "cellAlpha":89, + "cellAlpha":53044, "lineCount":{ "cartesian2":[ - 39,40 + 7763,58654 ] }, "lineThickness":{ "cartesian2":[ - 41,42 + 25480,4707 ] }, "lineOffset":{ "cartesian2":[ - 43,44 + 38422,44182 ] } } @@ -1471,28 +1471,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 11,12,13,10 + 174,241,84,24 ] }, "oddColor":{ "rgba":[ - 15,16,17,14 + 134,51,175,154 ] }, - "offset":90, - "repeat":91 + "offset":24796, + "repeat":2913 } } } }, { - "id":"material17", + "id":"constant_ellipsoid_material_image_color", "ellipsoid":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.41568627450980394,0.4196078431372549,0.4235294117647059,0.4117647058823529 + 0.24705882352941178,0.403921568627451,0.1450980392156863,0.47843137254901963 ] } } @@ -1500,13 +1500,13 @@ } }, { - "id":"material18", + "id":"constant_ellipsoid_material_grid_color", "ellipsoid":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.43137254901960786,0.43529411764705883,0.4392156862745098,0.42745098039215684 + 0.27058823529411763,0.7843137254901961,0.17254901960784313,0.8352941176470589 ] } } @@ -1514,13 +1514,13 @@ } }, { - "id":"material19", + "id":"constant_ellipsoid_material_stripe_evenColor", "ellipsoid":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.4470588235294118,0.45098039215686275,0.4549019607843137,0.44313725490196076 + 0.41568627450980394,0.19215686274509805,0.3686274509803922,0.12941176470588237 ] } } @@ -1528,13 +1528,13 @@ } }, { - "id":"material20", + "id":"constant_ellipsoid_material_stripe_oddColor", "ellipsoid":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.4627450980392157,0.4666666666666667,0.47058823529411764,0.4588235294117647 + 0.5803921568627451,0.16470588235294117,0.7411764705882353,0.09411764705882353 ] } } @@ -1542,53 +1542,53 @@ } }, { - "id":"constant17", + "id":"constant_ellipsoid_outlineColor_rgbaf", "ellipsoid":{ "outlineColor":{ "rgbaf":[ - 0.47843137254901963,0.4823529411764706,0.48627450980392156,0.4745098039215686 + 0.49411764705882355,0.08235294117647059,0.27450980392156865,0.8235294117647058 ] } } }, { - "id":"constant18", + "id":"constant_label_fillColor_rgbaf", "label":{ "fillColor":{ "rgbaf":[ - 0.49411764705882355,0.4980392156862745,0.5019607843137255,0.49019607843137253 + 0.1607843137254902,0.5686274509803921,0.7764705882352941,0.5058823529411764 ] } } }, { - "id":"constant19", + "id":"constant_label_outlineColor_rgbaf", "label":{ "outlineColor":{ "rgbaf":[ - 0.5098039215686274,0.5137254901960784,0.5176470588235295,0.5058823529411764 + 0.4588235294117647,0.3254901960784314,0.9098039215686274,0.6784313725490196 ] } } }, { - "id":"constant20", + "id":"constant_model_color_rgbaf", "model":{ "color":{ "rgbaf":[ - 0.5254901960784314,0.5294117647058824,0.5333333333333333,0.5215686274509804 + 0.5686274509803921,0.3333333333333333,0.1411764705882353,0.5725490196078431 ] } } }, { - "id":"constant21", + "id":"constant_path_material_solidColor_color", "path":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.5411764705882353,0.5450980392156862,0.5490196078431373,0.5372549019607843 + 0.4588235294117647,0.5176470588235295,0.5215686274509804,0.9254901960784314 ] } } @@ -1602,15 +1602,15 @@ "polylineOutline":{ "color":{ "rgba":[ - 19,20,21,18 + 158,14,3,86 ] }, "outlineColor":{ "rgba":[ - 23,24,25,22 + 137,101,236,136 ] }, - "outlineWidth":92 + "outlineWidth":11017 } } } @@ -1622,7 +1622,7 @@ "polylineArrow":{ "color":{ "rgba":[ - 27,28,29,26 + 166,131,155,102 ] } } @@ -1636,10 +1636,10 @@ "polylineGlow":{ "color":{ "rgba":[ - 31,32,33,30 + 72,114,200,147 ] }, - "glowPower":93 + "glowPower":42344 } } } @@ -1649,15 +1649,15 @@ "path":{ "material":{ "image":{ - "image":"http://example.com/8", + "image":"http://example.com/31068", "repeat":{ "cartesian2":[ - 45,46 + 48351,63420 ] }, "color":{ "rgba":[ - 35,36,37,34 + 105,166,133,7 ] }, "transparent":true @@ -1672,23 +1672,23 @@ "grid":{ "color":{ "rgba":[ - 39,40,41,38 + 120,196,99,165 ] }, - "cellAlpha":94, + "cellAlpha":41317, "lineCount":{ "cartesian2":[ - 47,48 + 52557,7629 ] }, "lineThickness":{ "cartesian2":[ - 49,50 + 21845,52309 ] }, "lineOffset":{ "cartesian2":[ - 51,52 + 48700,4542 ] } } @@ -1703,28 +1703,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 43,44,45,42 + 20,43,77,229 ] }, "oddColor":{ "rgba":[ - 47,48,49,46 + 157,171,93,187 ] }, - "offset":95, - "repeat":96 + "offset":41305, + "repeat":43637 } } } }, { - "id":"material21", + "id":"constant_path_material_polylineOutline_color", "path":{ "material":{ "polylineOutline":{ "color":{ "rgbaf":[ - 0.5568627450980392,0.5607843137254902,0.5647058823529412,0.5529411764705883 + 0.058823529411764705,0.08235294117647059,0.9647058823529412,0.3176470588235294 ] } } @@ -1732,13 +1732,13 @@ } }, { - "id":"material22", + "id":"constant_path_material_polylineOutline_outlineColor", "path":{ "material":{ "polylineOutline":{ "outlineColor":{ "rgbaf":[ - 0.5725490196078431,0.5764705882352941,0.5803921568627451,0.5686274509803921 + 0.26666666666666666,0.5568627450980392,0.35294117647058826,0.7607843137254902 ] } } @@ -1746,13 +1746,13 @@ } }, { - "id":"material23", + "id":"constant_path_material_polylineArrow_color", "path":{ "material":{ "polylineArrow":{ "color":{ "rgbaf":[ - 0.5882352941176471,0.592156862745098,0.596078431372549,0.5843137254901961 + 0.6274509803921569,0.2784313725490196,0.9725490196078431,0.9215686274509803 ] } } @@ -1760,13 +1760,13 @@ } }, { - "id":"material24", + "id":"constant_path_material_polylineGlow_color", "path":{ "material":{ "polylineGlow":{ "color":{ "rgbaf":[ - 0.6039215686274509,0.6078431372549019,0.611764705882353,0.6 + 0.5843137254901961,0.01568627450980392,0.32941176470588235,0.27058823529411763 ] } } @@ -1774,13 +1774,13 @@ } }, { - "id":"material25", + "id":"constant_path_material_image_color", "path":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.6196078431372549,0.6235294117647059,0.6274509803921569,0.615686274509804 + 0.44313725490196076,0.45098039215686275,0.6392156862745098,0.41568627450980394 ] } } @@ -1788,13 +1788,13 @@ } }, { - "id":"material26", + "id":"constant_path_material_grid_color", "path":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.6352941176470588,0.6392156862745098,0.6431372549019608,0.6313725490196078 + 0.984313725490196,0.9450980392156862,0.7647058823529411,0.9333333333333333 ] } } @@ -1802,13 +1802,13 @@ } }, { - "id":"material27", + "id":"constant_path_material_stripe_evenColor", "path":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.6509803921568628,0.6549019607843137,0.6588235294117647,0.6470588235294118 + 0.5843137254901961,0.6313725490196078,0.0196078431372549,0.34901960784313724 ] } } @@ -1816,13 +1816,13 @@ } }, { - "id":"material28", + "id":"constant_path_material_stripe_oddColor", "path":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.6666666666666666,0.6705882352941176,0.6745098039215687,0.6627450980392157 + 0.23137254901960785,0.21176470588235294,0.9411764705882353,0.5019607843137255 ] } } @@ -1830,53 +1830,53 @@ } }, { - "id":"constant22", + "id":"constant_point_color_rgbaf", "point":{ "color":{ "rgbaf":[ - 0.6823529411764706,0.6862745098039216,0.6901960784313725,0.6784313725490196 + 0.6627450980392157,0.3176470588235294,0.6431372549019608,0.7058823529411765 ] } } }, { - "id":"constant23", + "id":"constant_point_outlineColor_rgbaf", "point":{ "outlineColor":{ "rgbaf":[ - 0.6980392156862745,0.7019607843137254,0.7058823529411765,0.6941176470588235 + 0.00392156862745098,0.38823529411764707,0.10196078431372549,0.1607843137254902 ] } } }, { - "id":"constant24", + "id":"constant_polygon_hierarchy_cartographicRadians", "polygon":{ "positions":{ "cartographicRadians":[ - 0.433629385640828,1.43362938564083,15,0.292036732051034,1.29203673205103,18 + 0.612948853926511,1.3346715688367,54401,1.1867596160592,0.345663242797974,35811 ] } } }, { - "id":"constant25", + "id":"constant_polygon_hierarchy_cartographicDegrees", "polygon":{ "positions":{ "cartographicDegrees":[ - 19,20,21,22,23,24 + 19,41,50907,28,40,24937 ] } } }, { - "id":"constant26", + "id":"constant_polygon_material_solidColor_color", "polygon":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.7137254901960784,0.7176470588235294,0.7215686274509804,0.7098039215686275 + 0.9803921568627451,0.9058823529411765,0.27450980392156865,0.9725490196078431 ] } } @@ -1888,15 +1888,15 @@ "polygon":{ "material":{ "image":{ - "image":"http://example.com/9", + "image":"http://example.com/3481", "repeat":{ "cartesian2":[ - 53,54 + 29381,10354 ] }, "color":{ "rgba":[ - 51,52,53,50 + 36,184,236,209 ] }, "transparent":true @@ -1911,23 +1911,23 @@ "grid":{ "color":{ "rgba":[ - 55,56,57,54 + 246,64,141,13 ] }, - "cellAlpha":97, + "cellAlpha":986, "lineCount":{ "cartesian2":[ - 55,56 + 26094,44645 ] }, "lineThickness":{ "cartesian2":[ - 57,58 + 30775,17784 ] }, "lineOffset":{ "cartesian2":[ - 59,60 + 58344,3555 ] } } @@ -1942,28 +1942,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 59,60,61,58 + 98,184,45,52 ] }, "oddColor":{ "rgba":[ - 63,64,65,62 + 164,123,182,228 ] }, - "offset":98, - "repeat":99 + "offset":12114, + "repeat":60350 } } } }, { - "id":"material29", + "id":"constant_polygon_material_image_color", "polygon":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.7294117647058823,0.7333333333333333,0.7372549019607844,0.7254901960784313 + 0.6745098039215687,0.8,0.4117647058823529,0.20784313725490197 ] } } @@ -1971,13 +1971,13 @@ } }, { - "id":"material30", + "id":"constant_polygon_material_grid_color", "polygon":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.7450980392156863,0.7490196078431373,0.7529411764705882,0.7411764705882353 + 0.6039215686274509,0.09411764705882353,0.00784313725490196,0.08627450980392157 ] } } @@ -1985,13 +1985,13 @@ } }, { - "id":"material31", + "id":"constant_polygon_material_stripe_evenColor", "polygon":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.7607843137254902,0.7647058823529411,0.7686274509803922,0.7568627450980392 + 0.7725490196078432,0.8666666666666667,0.9647058823529412,0.8627450980392157 ] } } @@ -1999,13 +1999,13 @@ } }, { - "id":"material32", + "id":"constant_polygon_material_stripe_oddColor", "polygon":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.7764705882352941,0.7803921568627451,0.7843137254901961,0.7725490196078432 + 0.8627450980392157,0.0392156862745098,0.4588235294117647,0.596078431372549 ] } } @@ -2013,43 +2013,43 @@ } }, { - "id":"constant27", + "id":"constant_polygon_outlineColor_rgbaf", "polygon":{ "outlineColor":{ "rgbaf":[ - 0.792156862745098,0.796078431372549,0.8,0.788235294117647 + 0.10588235294117647,0.4235294117647059,0.6196078431372549,0.9568627450980393 ] } } }, { - "id":"constant28", + "id":"constant_polyline_positions_cartographicRadians", "polyline":{ "positions":{ "cartographicRadians":[ - 1.43805509807655,0.867258771281655,27,1.29646244448676,0.725666117691862,30 + 0.23083587429617,0.738315731088925,41390,0.537259577218533,0.25389340391868,10573 ] } } }, { - "id":"constant29", + "id":"constant_polyline_positions_cartographicDegrees", "polyline":{ "positions":{ "cartographicDegrees":[ - 31,32,33,34,35,36 + 19,5,11802,15,40,39495 ] } } }, { - "id":"constant30", + "id":"constant_polyline_material_solidColor_color", "polyline":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.807843137254902,0.8117647058823529,0.8156862745098039,0.803921568627451 + 0.7647058823529411,0.8941176470588236,0.8745098039215686,0.10588235294117647 ] } } @@ -2063,15 +2063,15 @@ "polylineOutline":{ "color":{ "rgba":[ - 67,68,69,66 + 152,14,11,33 ] }, "outlineColor":{ "rgba":[ - 71,72,73,70 + 222,51,202,92 ] }, - "outlineWidth":100 + "outlineWidth":6879 } } } @@ -2083,7 +2083,7 @@ "polylineArrow":{ "color":{ "rgba":[ - 75,76,77,74 + 82,169,80,107 ] } } @@ -2097,10 +2097,10 @@ "polylineGlow":{ "color":{ "rgba":[ - 79,80,81,78 + 59,125,181,171 ] }, - "glowPower":101 + "glowPower":41345 } } } @@ -2110,15 +2110,15 @@ "polyline":{ "material":{ "image":{ - "image":"http://example.com/10", + "image":"http://example.com/29020", "repeat":{ "cartesian2":[ - 61,62 + 8980,60451 ] }, "color":{ "rgba":[ - 83,84,85,82 + 46,136,39,94 ] }, "transparent":true @@ -2133,23 +2133,23 @@ "grid":{ "color":{ "rgba":[ - 87,88,89,86 + 157,57,26,26 ] }, - "cellAlpha":102, + "cellAlpha":27197, "lineCount":{ "cartesian2":[ - 63,64 + 17878,15173 ] }, "lineThickness":{ "cartesian2":[ - 65,66 + 64504,24571 ] }, "lineOffset":{ "cartesian2":[ - 67,68 + 51933,9674 ] } } @@ -2164,28 +2164,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 91,92,93,90 + 98,239,47,132 ] }, "oddColor":{ "rgba":[ - 95,96,97,94 + 41,198,29,144 ] }, - "offset":103, - "repeat":104 + "offset":10077, + "repeat":31817 } } } }, { - "id":"material33", + "id":"constant_polyline_material_polylineOutline_color", "polyline":{ "material":{ "polylineOutline":{ "color":{ "rgbaf":[ - 0.8235294117647058,0.8274509803921568,0.8313725490196079,0.8196078431372549 + 0.45098039215686275,0.8901960784313725,0.403921568627451,0.1607843137254902 ] } } @@ -2193,13 +2193,13 @@ } }, { - "id":"material34", + "id":"constant_polyline_material_polylineOutline_outlineColor", "polyline":{ "material":{ "polylineOutline":{ "outlineColor":{ "rgbaf":[ - 0.8392156862745098,0.8431372549019608,0.8470588235294118,0.8352941176470589 + 0.8156862745098039,0.5450980392156862,0.5294117647058824,0.3176470588235294 ] } } @@ -2207,13 +2207,13 @@ } }, { - "id":"material35", + "id":"constant_polyline_material_polylineArrow_color", "polyline":{ "material":{ "polylineArrow":{ "color":{ "rgbaf":[ - 0.8549019607843137,0.8588235294117647,0.8627450980392157,0.8509803921568627 + 0.8313725490196079,0.8235294117647058,0.6313725490196078,0.44313725490196076 ] } } @@ -2221,13 +2221,13 @@ } }, { - "id":"material36", + "id":"constant_polyline_material_polylineGlow_color", "polyline":{ "material":{ "polylineGlow":{ "color":{ "rgbaf":[ - 0.8705882352941177,0.8745098039215686,0.8784313725490196,0.8666666666666667 + 0.4117647058823529,0.3137254901960784,0.8588235294117647,0.3803921568627451 ] } } @@ -2235,13 +2235,13 @@ } }, { - "id":"material37", + "id":"constant_polyline_material_image_color", "polyline":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.8862745098039215,0.8901960784313725,0.8941176470588236,0.8823529411764706 + 0.13333333333333333,0.5529411764705883,0.043137254901960784,0.1843137254901961 ] } } @@ -2249,13 +2249,13 @@ } }, { - "id":"material38", + "id":"constant_polyline_material_grid_color", "polyline":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.9019607843137255,0.9058823529411765,0.9098039215686274,0.8980392156862745 + 0.1411764705882353,0.8235294117647058,0.5882352941176471,0.5607843137254902 ] } } @@ -2263,13 +2263,13 @@ } }, { - "id":"material39", + "id":"constant_polyline_material_stripe_evenColor", "polyline":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.9176470588235294,0.9215686274509803,0.9254901960784314,0.9137254901960784 + 0.6470588235294118,0.8627450980392157,0.12941176470588237,0.7803921568627451 ] } } @@ -2277,13 +2277,13 @@ } }, { - "id":"material40", + "id":"constant_polyline_material_stripe_oddColor", "polyline":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.9333333333333333,0.9372549019607843,0.9411764705882353,0.9294117647058824 + 0.2901960784313726,0.7803921568627451,0.07058823529411765,0.2784313725490196 ] } } @@ -2291,23 +2291,23 @@ } }, { - "id":"constant31", + "id":"constant_rectangle_coordinates_wsenDegrees", "rectangle":{ "coordinates":{ "wsenDegrees":[ - 5,6,7,8 + 42,22,5,35 ] } } }, { - "id":"constant32", + "id":"constant_rectangle_material_solidColor_color", "rectangle":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.9490196078431372,0.9529411764705882,0.9568627450980393,0.9450980392156862 + 0.8980392156862745,0.8,0.9058823529411765,0.9529411764705882 ] } } @@ -2319,15 +2319,15 @@ "rectangle":{ "material":{ "image":{ - "image":"http://example.com/11", + "image":"http://example.com/18033", "repeat":{ "cartesian2":[ - 69,70 + 41461,31905 ] }, "color":{ "rgba":[ - 99,100,101,98 + 93,203,88,125 ] }, "transparent":true @@ -2342,23 +2342,23 @@ "grid":{ "color":{ "rgba":[ - 103,104,105,102 + 245,105,152,83 ] }, - "cellAlpha":105, + "cellAlpha":57393, "lineCount":{ "cartesian2":[ - 71,72 + 4947,4627 ] }, "lineThickness":{ "cartesian2":[ - 73,74 + 37424,19602 ] }, "lineOffset":{ "cartesian2":[ - 75,76 + 43685,31658 ] } } @@ -2373,28 +2373,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 107,108,109,106 + 196,12,53,2 ] }, "oddColor":{ "rgba":[ - 111,112,113,110 + 103,243,111,72 ] }, - "offset":106, - "repeat":107 + "offset":26578, + "repeat":52842 } } } }, { - "id":"material41", + "id":"constant_rectangle_material_image_color", "rectangle":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.9647058823529412,0.9686274509803922,0.9725490196078431,0.9607843137254902 + 0.24705882352941178,0.4980392156862745,0.7411764705882353,0.9686274509803922 ] } } @@ -2402,13 +2402,13 @@ } }, { - "id":"material42", + "id":"constant_rectangle_material_grid_color", "rectangle":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.9803921568627451,0.984313725490196,0.9882352941176471,0.9764705882352941 + 0.4588235294117647,0.06274509803921569,0.8862745098039215,0.8392156862745098 ] } } @@ -2416,13 +2416,13 @@ } }, { - "id":"material43", + "id":"constant_rectangle_material_stripe_evenColor", "rectangle":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.996078431372549,0,0.00392156862745098,0.9921568627450981 + 0.5764705882352941,0.3411764705882353,0.611764705882353,0.20784313725490197 ] } } @@ -2430,13 +2430,13 @@ } }, { - "id":"material44", + "id":"constant_rectangle_material_stripe_oddColor", "rectangle":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.011764705882352941,0.01568627450980392,0.0196078431372549,0.00784313725490196 + 0.8666666666666667,0.9490196078431372,0.06274509803921569,0.0196078431372549 ] } } @@ -2444,43 +2444,43 @@ } }, { - "id":"constant33", + "id":"constant_rectangle_outlineColor_rgbaf", "rectangle":{ "outlineColor":{ "rgbaf":[ - 0.027450980392156862,0.03137254901960784,0.03529411764705882,0.023529411764705882 + 0.30196078431372547,0.03529411764705882,0.9176470588235294,0.20784313725490197 ] } } }, { - "id":"constant34", + "id":"constant_wall_positions_cartographicRadians", "wall":{ "positions":{ "cartographicRadians":[ - 0.871684483717379,0.300888156922483,39,0.730091830127586,0.159295503332689,42 + 0.990822494752221,0.11729920547879,47975,1.22405890229697,1.46292679641256,13438 ] } } }, { - "id":"constant35", + "id":"constant_wall_positions_cartographicDegrees", "wall":{ "positions":{ "cartographicDegrees":[ - 43,44,45,1,2,48 + 30,24,27738,14,41,41667 ] } } }, { - "id":"constant36", + "id":"constant_wall_material_solidColor_color", "wall":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.043137254901960784,0.047058823529411764,0.050980392156862744,0.0392156862745098 + 0.6941176470588235,0.3176470588235294,0.9098039215686274,0.5019607843137255 ] } } @@ -2492,15 +2492,15 @@ "wall":{ "material":{ "image":{ - "image":"http://example.com/12", + "image":"http://example.com/58529", "repeat":{ "cartesian2":[ - 77,78 + 36340,47245 ] }, "color":{ "rgba":[ - 115,116,117,114 + 252,63,12,38 ] }, "transparent":true @@ -2515,23 +2515,23 @@ "grid":{ "color":{ "rgba":[ - 119,120,121,118 + 38,183,237,174 ] }, - "cellAlpha":108, + "cellAlpha":59606, "lineCount":{ "cartesian2":[ - 79,80 + 3079,31244 ] }, "lineThickness":{ "cartesian2":[ - 81,82 + 32099,44157 ] }, "lineOffset":{ "cartesian2":[ - 83,84 + 13529,1844 ] } } @@ -2546,28 +2546,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 123,124,125,122 + 202,190,37,215 ] }, "oddColor":{ "rgba":[ - 127,128,129,126 + 56,107,92,38 ] }, - "offset":109, - "repeat":110 + "offset":34142, + "repeat":33528 } } } }, { - "id":"material45", + "id":"constant_wall_material_image_color", "wall":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.058823529411764705,0.06274509803921569,0.06666666666666667,0.054901960784313725 + 0.34901960784313724,0.8431372549019608,0.2901960784313726,0.043137254901960784 ] } } @@ -2575,13 +2575,13 @@ } }, { - "id":"material46", + "id":"constant_wall_material_grid_color", "wall":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.07450980392156863,0.0784313725490196,0.08235294117647059,0.07058823529411765 + 0.7568627450980392,0.9921568627450981,0.9921568627450981,0.4627450980392157 ] } } @@ -2589,13 +2589,13 @@ } }, { - "id":"material47", + "id":"constant_wall_material_stripe_evenColor", "wall":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.09019607843137255,0.09411764705882353,0.09803921568627451,0.08627450980392157 + 0.6901960784313725,0.21176470588235294,0.615686274509804,0.6274509803921569 ] } } @@ -2603,13 +2603,13 @@ } }, { - "id":"material48", + "id":"constant_wall_material_stripe_oddColor", "wall":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.10588235294117647,0.10980392156862745,0.11372549019607843,0.10196078431372549 + 0.9686274509803922,0.3686274509803922,0.2196078431372549,0.00392156862745098 ] } } @@ -2617,33 +2617,33 @@ } }, { - "id":"constant37", + "id":"constant_wall_outlineColor_rgbaf", "wall":{ "outlineColor":{ "rgbaf":[ - 0.12156862745098039,0.12549019607843137,0.12941176470588237,0.11764705882352941 + 0.5647058823529412,0.6784313725490196,0.7647058823529411,0.8117647058823529 ] } } }, { - "id":"constant38", + "id":"constant_agi_conicSensor_intersectionColor_rgbaf", "agi_conicSensor":{ "intersectionColor":{ "rgbaf":[ - 0.13725490196078433,0.1411764705882353,0.1450980392156863,0.13333333333333333 + 0.9568627450980393,0.3333333333333333,0.6431372549019608,0.43137254901960786 ] } } }, { - "id":"constant39", + "id":"constant_conicSensor_lateralSurfaceMaterial_solidColor_color", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.15294117647058825,0.1568627450980392,0.1607843137254902,0.14901960784313725 + 0.6941176470588235,0.21176470588235294,0.3686274509803922,0.24705882352941178 ] } } @@ -2655,15 +2655,15 @@ "agi_conicSensor":{ "lateralSurfaceMaterial":{ "image":{ - "image":"http://example.com/13", + "image":"http://example.com/21823", "repeat":{ "cartesian2":[ - 85,86 + 25181,35938 ] }, "color":{ "rgba":[ - 131,132,133,130 + 67,8,98,44 ] }, "transparent":true @@ -2678,23 +2678,23 @@ "grid":{ "color":{ "rgba":[ - 135,136,137,134 + 61,0,183,35 ] }, - "cellAlpha":111, + "cellAlpha":51635, "lineCount":{ "cartesian2":[ - 87,88 + 2156,25864 ] }, "lineThickness":{ "cartesian2":[ - 89,90 + 33546,23683 ] }, "lineOffset":{ "cartesian2":[ - 91,92 + 38184,24725 ] } } @@ -2709,28 +2709,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 139,140,141,138 + 15,60,203,52 ] }, "oddColor":{ "rgba":[ - 143,144,145,142 + 32,223,184,18 ] }, - "offset":112, - "repeat":113 + "offset":5179, + "repeat":19988 } } } }, { - "id":"material49", + "id":"constant_conicSensor_lateralSurfaceMaterial_image_color", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.16862745098039217,0.17254901960784313,0.17647058823529413,0.16470588235294117 + 0.6392156862745098,0.6039215686274509,0.596078431372549,0.5098039215686274 ] } } @@ -2738,13 +2738,13 @@ } }, { - "id":"material50", + "id":"constant_conicSensor_lateralSurfaceMaterial_grid_color", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.1843137254901961,0.18823529411764706,0.19215686274509805,0.1803921568627451 + 0.5686274509803921,0.12941176470588237,0.2196078431372549,0.0784313725490196 ] } } @@ -2752,13 +2752,13 @@ } }, { - "id":"material51", + "id":"constant_conicSensor_lateralSurfaceMaterial_stripe_evenColor", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.2,0.20392156862745098,0.20784313725490197,0.19607843137254902 + 0.44313725490196076,0.4980392156862745,0.596078431372549,0.7058823529411765 ] } } @@ -2766,13 +2766,13 @@ } }, { - "id":"material52", + "id":"constant_conicSensor_lateralSurfaceMaterial_stripe_oddColor", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.21568627450980393,0.2196078431372549,0.2235294117647059,0.21176470588235294 + 0.12549019607843137,0.45098039215686275,0.6078431372549019,0.5686274509803921 ] } } @@ -2780,13 +2780,13 @@ } }, { - "id":"constant40", + "id":"constant_conicSensor_ellipsoidSurfaceMaterial_solidColor_color", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.23137254901960785,0.23529411764705882,0.23921568627450981,0.22745098039215686 + 0.07450980392156863,0.23921568627450981,0.3607843137254902,0.788235294117647 ] } } @@ -2798,15 +2798,15 @@ "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ - "image":"http://example.com/14", + "image":"http://example.com/3660", "repeat":{ "cartesian2":[ - 93,94 + 21421,10579 ] }, "color":{ "rgba":[ - 147,148,149,146 + 6,107,206,126 ] }, "transparent":true @@ -2821,23 +2821,23 @@ "grid":{ "color":{ "rgba":[ - 151,152,153,150 + 4,151,187,61 ] }, - "cellAlpha":114, + "cellAlpha":59779, "lineCount":{ "cartesian2":[ - 95,96 + 10702,63785 ] }, "lineThickness":{ "cartesian2":[ - 97,98 + 38065,47764 ] }, "lineOffset":{ "cartesian2":[ - 99,100 + 49821,31938 ] } } @@ -2852,28 +2852,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 155,156,157,154 + 86,123,192,5 ] }, "oddColor":{ "rgba":[ - 159,160,161,158 + 7,238,130,191 ] }, - "offset":115, - "repeat":116 + "offset":4651, + "repeat":23937 } } } }, { - "id":"material53", + "id":"constant_conicSensor_ellipsoidSurfaceMaterial_image_color", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.24705882352941178,0.25098039215686274,0.2549019607843137,0.24313725490196078 + 0.6470588235294118,0.49019607843137253,0.7019607843137254,0.00784313725490196 ] } } @@ -2881,13 +2881,13 @@ } }, { - "id":"material54", + "id":"constant_conicSensor_ellipsoidSurfaceMaterial_grid_color", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.2627450980392157,0.26666666666666666,0.27058823529411763,0.25882352941176473 + 0.1411764705882353,0.3058823529411765,0.1450980392156863,0.12549019607843137 ] } } @@ -2895,13 +2895,13 @@ } }, { - "id":"material55", + "id":"constant_conicSensor_ellipsoidSurfaceMaterial_stripe_evenColor", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.2784313725490196,0.2823529411764706,0.28627450980392155,0.27450980392156865 + 0.17647058823529413,0.8784313725490196,0.13725490196078433,0.6901960784313725 ] } } @@ -2909,13 +2909,13 @@ } }, { - "id":"material56", + "id":"constant_conicSensor_ellipsoidSurfaceMaterial_stripe_oddColor", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.29411764705882354,0.2980392156862745,0.30196078431372547,0.2901960784313726 + 0.4549019607843137,0.6196078431372549,0.11372549019607843,0.8588235294117647 ] } } @@ -2923,13 +2923,13 @@ } }, { - "id":"constant41", + "id":"constant_conicSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.30980392156862746,0.3137254901960784,0.3176470588235294,0.3058823529411765 + 0.13725490196078433,0.9058823529411765,0.8274509803921568,0.2980392156862745 ] } } @@ -2941,15 +2941,15 @@ "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ - "image":"http://example.com/15", + "image":"http://example.com/42334", "repeat":{ "cartesian2":[ - 101,102 + 35010,3208 ] }, "color":{ "rgba":[ - 163,164,165,162 + 139,142,32,175 ] }, "transparent":true @@ -2964,23 +2964,23 @@ "grid":{ "color":{ "rgba":[ - 167,168,169,166 + 13,160,236,34 ] }, - "cellAlpha":117, + "cellAlpha":16915, "lineCount":{ "cartesian2":[ - 103,104 + 55175,19927 ] }, "lineThickness":{ "cartesian2":[ - 105,106 + 19695,1356 ] }, "lineOffset":{ "cartesian2":[ - 107,108 + 20937,31057 ] } } @@ -2995,28 +2995,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 171,172,173,170 + 55,198,189,25 ] }, "oddColor":{ "rgba":[ - 175,176,177,174 + 228,141,11,198 ] }, - "offset":118, - "repeat":119 + "offset":5749, + "repeat":65092 } } } }, { - "id":"material57", + "id":"constant_conicSensor_ellipsoidHorizonSurfaceMaterial_image_color", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.3254901960784314,0.32941176470588235,0.3333333333333333,0.3215686274509804 + 0.34901960784313724,0.7490196078431373,0.25098039215686274,0.8470588235294118 ] } } @@ -3024,13 +3024,13 @@ } }, { - "id":"material58", + "id":"constant_conicSensor_ellipsoidHorizonSurfaceMaterial_grid_color", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.3411764705882353,0.34509803921568627,0.34901960784313724,0.33725490196078434 + 0.19215686274509805,0.11764705882352941,0.1411764705882353,0.8627450980392157 ] } } @@ -3038,13 +3038,13 @@ } }, { - "id":"material59", + "id":"constant_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.3568627450980392,0.3607843137254902,0.36470588235294116,0.35294117647058826 + 0.8823529411764706,0.6862745098039216,0.7803921568627451,0.11372549019607843 ] } } @@ -3052,13 +3052,13 @@ } }, { - "id":"material60", + "id":"constant_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.37254901960784315,0.3764705882352941,0.3803921568627451,0.3686274509803922 + 0.39215686274509803,0.8627450980392157,0.8470588235294118,0.3333333333333333 ] } } @@ -3066,13 +3066,13 @@ } }, { - "id":"constant42", + "id":"constant_conicSensor_domeSurfaceMaterial_solidColor_color", "agi_conicSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.38823529411764707,0.39215686274509803,0.396078431372549,0.3843137254901961 + 0.10980392156862745,0.9254901960784314,0.1803921568627451,0.3137254901960784 ] } } @@ -3084,15 +3084,15 @@ "agi_conicSensor":{ "domeSurfaceMaterial":{ "image":{ - "image":"http://example.com/16", + "image":"http://example.com/32043", "repeat":{ "cartesian2":[ - 109,110 + 47952,25019 ] }, "color":{ "rgba":[ - 179,180,181,178 + 116,1,117,93 ] }, "transparent":true @@ -3107,23 +3107,23 @@ "grid":{ "color":{ "rgba":[ - 183,184,185,182 + 85,86,101,143 ] }, - "cellAlpha":120, + "cellAlpha":15766, "lineCount":{ "cartesian2":[ - 111,112 + 60249,20459 ] }, "lineThickness":{ "cartesian2":[ - 113,114 + 14212,1847 ] }, "lineOffset":{ "cartesian2":[ - 115,116 + 47595,2489 ] } } @@ -3138,28 +3138,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 187,188,189,186 + 99,63,25,77 ] }, "oddColor":{ "rgba":[ - 191,192,193,190 + 196,159,121,70 ] }, - "offset":121, - "repeat":122 + "offset":3098, + "repeat":62080 } } } }, { - "id":"material61", + "id":"constant_conicSensor_domeSurfaceMaterial_image_color", "agi_conicSensor":{ "domeSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.403921568627451,0.40784313725490196,0.4117647058823529,0.4 + 0.5843137254901961,0.18823529411764706,0.5882352941176471,0.011764705882352941 ] } } @@ -3167,13 +3167,13 @@ } }, { - "id":"material62", + "id":"constant_conicSensor_domeSurfaceMaterial_grid_color", "agi_conicSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.4196078431372549,0.4235294117647059,0.42745098039215684,0.41568627450980394 + 0.23921568627450981,0.4980392156862745,0.4117647058823529,0.803921568627451 ] } } @@ -3181,13 +3181,13 @@ } }, { - "id":"material63", + "id":"constant_conicSensor_domeSurfaceMaterial_stripe_evenColor", "agi_conicSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.43529411764705883,0.4392156862745098,0.44313725490196076,0.43137254901960786 + 0.5176470588235295,0.20784313725490197,0.4745098039215686,0.9764705882352941 ] } } @@ -3195,13 +3195,13 @@ } }, { - "id":"material64", + "id":"constant_conicSensor_domeSurfaceMaterial_stripe_oddColor", "agi_conicSensor":{ "domeSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.45098039215686275,0.4549019607843137,0.4588235294117647,0.4470588235294118 + 0.8823529411764706,0.2235294117647059,0.9411764705882353,0.6509803921568628 ] } } @@ -3209,13 +3209,13 @@ } }, { - "id":"constant43", + "id":"constant_conicSensor_environmentOcclusionMaterial_solidColor_color", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.4666666666666667,0.47058823529411764,0.4745098039215686,0.4627450980392157 + 0.5137254901960784,0.17647058823529413,0.8431372549019608,0.011764705882352941 ] } } @@ -3227,15 +3227,15 @@ "agi_conicSensor":{ "environmentOcclusionMaterial":{ "image":{ - "image":"http://example.com/17", + "image":"http://example.com/37360", "repeat":{ "cartesian2":[ - 117,118 + 9889,48166 ] }, "color":{ "rgba":[ - 195,196,197,194 + 154,113,32,175 ] }, "transparent":true @@ -3250,23 +3250,23 @@ "grid":{ "color":{ "rgba":[ - 199,200,201,198 + 133,84,224,205 ] }, - "cellAlpha":123, + "cellAlpha":34722, "lineCount":{ "cartesian2":[ - 119,120 + 3975,47375 ] }, "lineThickness":{ "cartesian2":[ - 121,122 + 39364,37529 ] }, "lineOffset":{ "cartesian2":[ - 123,124 + 3660,28430 ] } } @@ -3281,28 +3281,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 203,204,205,202 + 63,231,182,22 ] }, "oddColor":{ "rgba":[ - 207,208,209,206 + 145,64,200,90 ] }, - "offset":124, - "repeat":125 + "offset":30686, + "repeat":53567 } } } }, { - "id":"material65", + "id":"constant_conicSensor_environmentOcclusionMaterial_image_color", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.4823529411764706,0.48627450980392156,0.49019607843137253,0.47843137254901963 + 0.8823529411764706,0.9490196078431372,0.47843137254901963,0.15294117647058825 ] } } @@ -3310,13 +3310,13 @@ } }, { - "id":"material66", + "id":"constant_conicSensor_environmentOcclusionMaterial_grid_color", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.4980392156862745,0.5019607843137255,0.5058823529411764,0.49411764705882355 + 0.4823529411764706,0.054901960784313725,0.2549019607843137,0.9450980392156862 ] } } @@ -3324,13 +3324,13 @@ } }, { - "id":"material67", + "id":"constant_conicSensor_environmentOcclusionMaterial_stripe_evenColor", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.5137254901960784,0.5176470588235295,0.5215686274509804,0.5098039215686274 + 0.07058823529411765,0.2627450980392157,0.8392156862745098,0.24313725490196078 ] } } @@ -3338,13 +3338,13 @@ } }, { - "id":"material68", + "id":"constant_conicSensor_environmentOcclusionMaterial_stripe_oddColor", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.5294117647058824,0.5333333333333333,0.5372549019607843,0.5254901960784314 + 0.0784313725490196,0.5450980392156862,0.5254901960784314,0.592156862745098 ] } } @@ -3352,63 +3352,63 @@ } }, { - "id":"constant44", + "id":"constant_agi_conicSensor_environmentIntersectionColor_rgbaf", "agi_conicSensor":{ "environmentIntersectionColor":{ "rgbaf":[ - 0.5450980392156862,0.5490196078431373,0.5529411764705883,0.5411764705882353 + 0.9372549019607843,0.5098039215686274,0.23529411764705882,0.38823529411764707 ] } } }, { - "id":"constant45", + "id":"constant_agi_customPatternSensor_directions_unitSpherical", "agi_customPatternSensor":{ "directions":{ "unitSpherical":[ - 1,2,3,4 + 47421,31161,31609,11387 ] } } }, { - "id":"constant46", + "id":"constant_agi_customPatternSensor_directions_cartesian", "agi_customPatternSensor":{ "directions":{ "cartesian":[ - 25,26,27,28,29,30 + 22239,54614,35029,5768,61974,38386 ] } } }, { - "id":"constant47", + "id":"constant_agi_customPatternSensor_directions_unitCartesian", "agi_customPatternSensor":{ "directions":{ "unitCartesian":[ - 0.26726124191242406,0.5345224838248491,0.8017837257372731,0.4558423058385518,0.5698028822981898,0.6837634587578276 + 0.4878261102190049,0.8708200715109468,0.06081191694285649,0.532391171359761,0.837660156389704,0.122004520634927 ] } } }, { - "id":"constant48", + "id":"constant_agi_customPatternSensor_intersectionColor_rgbaf", "agi_customPatternSensor":{ "intersectionColor":{ "rgbaf":[ - 0.5607843137254902,0.5647058823529412,0.5686274509803921,0.5568627450980392 + 0.5215686274509804,0.37254901960784315,0.2980392156862745,0.9490196078431372 ] } } }, { - "id":"constant49", + "id":"constant_customPatternSensor_lateralSurfaceMaterial_solidColor_color", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.5764705882352941,0.5803921568627451,0.5843137254901961,0.5725490196078431 + 0.9333333333333333,0.792156862745098,0.1450980392156863,0.8862745098039215 ] } } @@ -3420,15 +3420,15 @@ "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "image":{ - "image":"http://example.com/18", + "image":"http://example.com/43097", "repeat":{ "cartesian2":[ - 125,126 + 52089,65227 ] }, "color":{ "rgba":[ - 211,212,213,210 + 43,75,177,17 ] }, "transparent":true @@ -3443,23 +3443,23 @@ "grid":{ "color":{ "rgba":[ - 215,216,217,214 + 31,237,211,220 ] }, - "cellAlpha":126, + "cellAlpha":54409, "lineCount":{ "cartesian2":[ - 127,128 + 60604,52716 ] }, "lineThickness":{ "cartesian2":[ - 129,130 + 35445,54154 ] }, "lineOffset":{ "cartesian2":[ - 131,132 + 60273,55787 ] } } @@ -3474,28 +3474,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 219,220,221,218 + 126,117,233,95 ] }, "oddColor":{ "rgba":[ - 223,224,225,222 + 156,140,249,65 ] }, - "offset":127, - "repeat":128 + "offset":63167, + "repeat":18519 } } } }, { - "id":"material69", + "id":"constant_customPatternSensor_lateralSurfaceMaterial_image_color", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.592156862745098,0.596078431372549,0.6,0.5882352941176471 + 0.34509803921568627,0.6705882352941176,0.6588235294117647,0.5176470588235295 ] } } @@ -3503,13 +3503,13 @@ } }, { - "id":"material70", + "id":"constant_customPatternSensor_lateralSurfaceMaterial_grid_color", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.6078431372549019,0.611764705882353,0.615686274509804,0.6039215686274509 + 0.047058823529411764,0.3254901960784314,0.9254901960784314,0.20784313725490197 ] } } @@ -3517,13 +3517,13 @@ } }, { - "id":"material71", + "id":"constant_customPatternSensor_lateralSurfaceMaterial_stripe_evenColor", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.6235294117647059,0.6274509803921569,0.6313725490196078,0.6196078431372549 + 0.21568627450980393,0.7411764705882353,0.8823529411764706,0.12941176470588237 ] } } @@ -3531,13 +3531,13 @@ } }, { - "id":"material72", + "id":"constant_customPatternSensor_lateralSurfaceMaterial_stripe_oddColor", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.6392156862745098,0.6431372549019608,0.6470588235294118,0.6352941176470588 + 0.7294117647058823,0.5372549019607843,0.6941176470588235,0.12549019607843137 ] } } @@ -3545,13 +3545,13 @@ } }, { - "id":"constant50", + "id":"constant_customPatternSensor_ellipsoidSurfaceMaterial_solidColor_color", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.6549019607843137,0.6588235294117647,0.6627450980392157,0.6509803921568628 + 0.1803921568627451,0.8392156862745098,0.2196078431372549,0.10980392156862745 ] } } @@ -3563,15 +3563,15 @@ "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ - "image":"http://example.com/19", + "image":"http://example.com/53957", "repeat":{ "cartesian2":[ - 133,134 + 54128,19667 ] }, "color":{ "rgba":[ - 227,228,229,226 + 197,165,19,139 ] }, "transparent":true @@ -3586,23 +3586,23 @@ "grid":{ "color":{ "rgba":[ - 231,232,233,230 + 112,146,248,160 ] }, - "cellAlpha":129, + "cellAlpha":44766, "lineCount":{ "cartesian2":[ - 135,136 + 30524,42103 ] }, "lineThickness":{ "cartesian2":[ - 137,138 + 11464,16684 ] }, "lineOffset":{ "cartesian2":[ - 139,140 + 23594,33884 ] } } @@ -3617,28 +3617,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 235,236,237,234 + 252,48,62,0 ] }, "oddColor":{ "rgba":[ - 239,240,241,238 + 34,219,166,59 ] }, - "offset":130, - "repeat":131 + "offset":14619, + "repeat":31654 } } } }, { - "id":"material73", + "id":"constant_customPatternSensor_ellipsoidSurfaceMaterial_image_color", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.6705882352941176,0.6745098039215687,0.6784313725490196,0.6666666666666666 + 0.10196078431372549,0.9333333333333333,0.2901960784313726,0.8352941176470589 ] } } @@ -3646,13 +3646,13 @@ } }, { - "id":"material74", + "id":"constant_customPatternSensor_ellipsoidSurfaceMaterial_grid_color", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.6862745098039216,0.6901960784313725,0.6941176470588235,0.6823529411764706 + 0.3686274509803922,0.03529411764705882,0.4627450980392157,0.4196078431372549 ] } } @@ -3660,13 +3660,13 @@ } }, { - "id":"material75", + "id":"constant_customPatternSensor_ellipsoidSurfaceMaterial_stripe_evenColor", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.7019607843137254,0.7058823529411765,0.7098039215686275,0.6980392156862745 + 0.2784313725490196,0.792156862745098,0.6313725490196078,0.43529411764705883 ] } } @@ -3674,13 +3674,13 @@ } }, { - "id":"material76", + "id":"constant_customPatternSensor_ellipsoidSurfaceMaterial_stripe_oddColor", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.7176470588235294,0.7215686274509804,0.7254901960784313,0.7137254901960784 + 0.27058823529411763,0.2196078431372549,0.8196078431372549,0.13725490196078433 ] } } @@ -3688,13 +3688,13 @@ } }, { - "id":"constant51", + "id":"constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.7333333333333333,0.7372549019607844,0.7411764705882353,0.7294117647058823 + 0.1843137254901961,0.6941176470588235,0.9372549019607843,0.023529411764705882 ] } } @@ -3706,15 +3706,15 @@ "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ - "image":"http://example.com/20", + "image":"http://example.com/17353", "repeat":{ "cartesian2":[ - 141,142 + 55611,32217 ] }, "color":{ "rgba":[ - 243,244,245,242 + 86,76,232,146 ] }, "transparent":true @@ -3729,23 +3729,23 @@ "grid":{ "color":{ "rgba":[ - 247,248,249,246 + 196,96,175,103 ] }, - "cellAlpha":132, + "cellAlpha":37213, "lineCount":{ "cartesian2":[ - 143,144 + 44500,4781 ] }, "lineThickness":{ "cartesian2":[ - 145,146 + 30042,49013 ] }, "lineOffset":{ "cartesian2":[ - 147,148 + 37409,34962 ] } } @@ -3760,28 +3760,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 251,252,253,250 + 73,110,9,101 ] }, "oddColor":{ "rgba":[ - 0,1,2,254 + 249,200,205,202 ] }, - "offset":133, - "repeat":134 + "offset":28340, + "repeat":34666 } } } }, { - "id":"material77", + "id":"constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image_color", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.7490196078431373,0.7529411764705882,0.7568627450980392,0.7450980392156863 + 0.21176470588235294,0.12941176470588237,0.5764705882352941,0.3843137254901961 ] } } @@ -3789,13 +3789,13 @@ } }, { - "id":"material78", + "id":"constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid_color", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.7647058823529411,0.7686274509803922,0.7725490196078432,0.7607843137254902 + 0.12549019607843137,0.7450980392156863,0.21176470588235294,0.4745098039215686 ] } } @@ -3803,13 +3803,13 @@ } }, { - "id":"material79", + "id":"constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.7803921568627451,0.7843137254901961,0.788235294117647,0.7764705882352941 + 0.2784313725490196,0.1568627450980392,0.047058823529411764,0.9882352941176471 ] } } @@ -3817,13 +3817,13 @@ } }, { - "id":"material80", + "id":"constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.796078431372549,0.8,0.803921568627451,0.792156862745098 + 0.788235294117647,0.6392156862745098,0.8862745098039215,0.12941176470588237 ] } } @@ -3831,13 +3831,13 @@ } }, { - "id":"constant52", + "id":"constant_customPatternSensor_domeSurfaceMaterial_solidColor_color", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.8117647058823529,0.8156862745098039,0.8196078431372549,0.807843137254902 + 0.1803921568627451,0.30196078431372547,0.22745098039215686,0.16862745098039217 ] } } @@ -3849,15 +3849,15 @@ "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "image":{ - "image":"http://example.com/21", + "image":"http://example.com/30161", "repeat":{ "cartesian2":[ - 149,150 + 35321,31113 ] }, "color":{ "rgba":[ - 4,5,6,3 + 65,246,253,233 ] }, "transparent":true @@ -3872,23 +3872,23 @@ "grid":{ "color":{ "rgba":[ - 8,9,10,7 + 77,194,210,132 ] }, - "cellAlpha":135, + "cellAlpha":54307, "lineCount":{ "cartesian2":[ - 151,152 + 24794,1120 ] }, "lineThickness":{ "cartesian2":[ - 153,154 + 63618,58104 ] }, "lineOffset":{ "cartesian2":[ - 155,156 + 58084,43234 ] } } @@ -3903,28 +3903,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 12,13,14,11 + 48,139,176,154 ] }, "oddColor":{ "rgba":[ - 16,17,18,15 + 237,89,130,61 ] }, - "offset":136, - "repeat":137 + "offset":64570, + "repeat":64333 } } } }, { - "id":"material81", + "id":"constant_customPatternSensor_domeSurfaceMaterial_image_color", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.8274509803921568,0.8313725490196079,0.8352941176470589,0.8235294117647058 + 0.4823529411764706,0.4980392156862745,0.8117647058823529,0.9647058823529412 ] } } @@ -3932,13 +3932,13 @@ } }, { - "id":"material82", + "id":"constant_customPatternSensor_domeSurfaceMaterial_grid_color", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.8431372549019608,0.8470588235294118,0.8509803921568627,0.8392156862745098 + 0.5372549019607843,0.30196078431372547,0.07450980392156863,0.17647058823529413 ] } } @@ -3946,13 +3946,13 @@ } }, { - "id":"material83", + "id":"constant_customPatternSensor_domeSurfaceMaterial_stripe_evenColor", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.8588235294117647,0.8627450980392157,0.8666666666666667,0.8549019607843137 + 0.4,0.09411764705882353,0.4823529411764706,0.792156862745098 ] } } @@ -3960,13 +3960,13 @@ } }, { - "id":"material84", + "id":"constant_customPatternSensor_domeSurfaceMaterial_stripe_oddColor", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.8745098039215686,0.8784313725490196,0.8823529411764706,0.8705882352941177 + 0.8627450980392157,0.44313725490196076,0.6509803921568628,0.34901960784313724 ] } } @@ -3974,13 +3974,13 @@ } }, { - "id":"constant53", + "id":"constant_customPatternSensor_environmentOcclusionMaterial_solidColor_color", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.8901960784313725,0.8941176470588236,0.8980392156862745,0.8862745098039215 + 0.6470588235294118,0.9882352941176471,0.4470588235294118,0.1803921568627451 ] } } @@ -3992,15 +3992,15 @@ "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "image":{ - "image":"http://example.com/22", + "image":"http://example.com/43990", "repeat":{ "cartesian2":[ - 157,158 + 15786,37437 ] }, "color":{ "rgba":[ - 20,21,22,19 + 194,23,148,35 ] }, "transparent":true @@ -4015,23 +4015,23 @@ "grid":{ "color":{ "rgba":[ - 24,25,26,23 + 53,92,100,103 ] }, - "cellAlpha":138, + "cellAlpha":61818, "lineCount":{ "cartesian2":[ - 159,160 + 16838,19777 ] }, "lineThickness":{ "cartesian2":[ - 161,162 + 18042,19782 ] }, "lineOffset":{ "cartesian2":[ - 163,164 + 63892,17401 ] } } @@ -4046,28 +4046,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 28,29,30,27 + 240,118,45,44 ] }, "oddColor":{ "rgba":[ - 32,33,34,31 + 73,99,195,45 ] }, - "offset":139, - "repeat":140 + "offset":48052, + "repeat":39502 } } } }, { - "id":"material85", + "id":"constant_customPatternSensor_environmentOcclusionMaterial_image_color", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.9058823529411765,0.9098039215686274,0.9137254901960784,0.9019607843137255 + 0.054901960784313725,0.6901960784313725,0.3333333333333333,0.792156862745098 ] } } @@ -4075,13 +4075,13 @@ } }, { - "id":"material86", + "id":"constant_customPatternSensor_environmentOcclusionMaterial_grid_color", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.9215686274509803,0.9254901960784314,0.9294117647058824,0.9176470588235294 + 0.4196078431372549,0.596078431372549,0.2,0.16862745098039217 ] } } @@ -4089,13 +4089,13 @@ } }, { - "id":"material87", + "id":"constant_customPatternSensor_environmentOcclusionMaterial_stripe_evenColor", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.9372549019607843,0.9411764705882353,0.9450980392156862,0.9333333333333333 + 0.5019607843137255,0.8784313725490196,0.984313725490196,0.1568627450980392 ] } } @@ -4103,13 +4103,13 @@ } }, { - "id":"material88", + "id":"constant_customPatternSensor_environmentOcclusionMaterial_stripe_oddColor", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.9529411764705882,0.9568627450980393,0.9607843137254902,0.9490196078431372 + 0.1803921568627451,0.7215686274509804,0.10196078431372549,0.7058823529411765 ] } } @@ -4117,33 +4117,33 @@ } }, { - "id":"constant54", + "id":"constant_agi_customPatternSensor_environmentIntersectionColor_rgbaf", "agi_customPatternSensor":{ "environmentIntersectionColor":{ "rgbaf":[ - 0.9686274509803922,0.9725490196078431,0.9764705882352941,0.9647058823529412 + 0.36470588235294116,0.8823529411764706,0.4666666666666667,0.9137254901960784 ] } } }, { - "id":"constant55", + "id":"constant_agi_rectangularSensor_intersectionColor_rgbaf", "agi_rectangularSensor":{ "intersectionColor":{ "rgbaf":[ - 0.984313725490196,0.9882352941176471,0.9921568627450981,0.9803921568627451 + 0.10588235294117647,0.4627450980392157,0.4392156862745098,0.20392156862745098 ] } } }, { - "id":"constant56", + "id":"constant_rectangularSensor_lateralSurfaceMaterial_solidColor_color", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0,0.00392156862745098,0.00784313725490196,0.996078431372549 + 0.8823529411764706,0.8980392156862745,0.47058823529411764,0.6666666666666666 ] } } @@ -4155,15 +4155,15 @@ "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "image":{ - "image":"http://example.com/23", + "image":"http://example.com/43004", "repeat":{ "cartesian2":[ - 165,166 + 62347,2291 ] }, "color":{ "rgba":[ - 36,37,38,35 + 117,86,172,66 ] }, "transparent":true @@ -4178,23 +4178,23 @@ "grid":{ "color":{ "rgba":[ - 40,41,42,39 + 137,21,181,20 ] }, - "cellAlpha":141, + "cellAlpha":7977, "lineCount":{ "cartesian2":[ - 167,168 + 38214,27541 ] }, "lineThickness":{ "cartesian2":[ - 169,170 + 15407,35132 ] }, "lineOffset":{ "cartesian2":[ - 171,172 + 15638,41789 ] } } @@ -4209,28 +4209,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 44,45,46,43 + 32,87,110,222 ] }, "oddColor":{ "rgba":[ - 48,49,50,47 + 90,108,154,48 ] }, - "offset":142, - "repeat":143 + "offset":1333, + "repeat":28338 } } } }, { - "id":"material89", + "id":"constant_rectangularSensor_lateralSurfaceMaterial_image_color", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.01568627450980392,0.0196078431372549,0.023529411764705882,0.011764705882352941 + 0.6666666666666666,0.1843137254901961,0.8470588235294118,0.7803921568627451 ] } } @@ -4238,13 +4238,13 @@ } }, { - "id":"material90", + "id":"constant_rectangularSensor_lateralSurfaceMaterial_grid_color", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.03137254901960784,0.03529411764705882,0.0392156862745098,0.027450980392156862 + 0.6980392156862745,0.4823529411764706,0.803921568627451,0.8784313725490196 ] } } @@ -4252,13 +4252,13 @@ } }, { - "id":"material91", + "id":"constant_rectangularSensor_lateralSurfaceMaterial_stripe_evenColor", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.047058823529411764,0.050980392156862744,0.054901960784313725,0.043137254901960784 + 0.21176470588235294,0.8,0.5254901960784314,0.47843137254901963 ] } } @@ -4266,13 +4266,13 @@ } }, { - "id":"material92", + "id":"constant_rectangularSensor_lateralSurfaceMaterial_stripe_oddColor", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.06274509803921569,0.06666666666666667,0.07058823529411765,0.058823529411764705 + 0.2627450980392157,0.21176470588235294,0.8196078431372549,0.4666666666666667 ] } } @@ -4280,13 +4280,13 @@ } }, { - "id":"constant57", + "id":"constant_rectangularSensor_ellipsoidSurfaceMaterial_solidColor_color", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.0784313725490196,0.08235294117647059,0.08627450980392157,0.07450980392156863 + 0.13725490196078433,0.6039215686274509,0.9803921568627451,0.2 ] } } @@ -4298,15 +4298,15 @@ "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ - "image":"http://example.com/24", + "image":"http://example.com/9645", "repeat":{ "cartesian2":[ - 173,174 + 32574,59007 ] }, "color":{ "rgba":[ - 52,53,54,51 + 45,73,29,164 ] }, "transparent":true @@ -4321,23 +4321,23 @@ "grid":{ "color":{ "rgba":[ - 56,57,58,55 + 20,238,183,85 ] }, - "cellAlpha":144, + "cellAlpha":9816, "lineCount":{ "cartesian2":[ - 175,176 + 638,49922 ] }, "lineThickness":{ "cartesian2":[ - 177,178 + 33475,32898 ] }, "lineOffset":{ "cartesian2":[ - 179,180 + 27656,20076 ] } } @@ -4352,28 +4352,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 60,61,62,59 + 24,90,119,189 ] }, "oddColor":{ "rgba":[ - 64,65,66,63 + 205,98,105,209 ] }, - "offset":145, - "repeat":146 + "offset":37589, + "repeat":65125 } } } }, { - "id":"material93", + "id":"constant_rectangularSensor_ellipsoidSurfaceMaterial_image_color", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.09411764705882353,0.09803921568627451,0.10196078431372549,0.09019607843137255 + 0.2901960784313726,0.10196078431372549,0.4627450980392157,0.9607843137254902 ] } } @@ -4381,13 +4381,13 @@ } }, { - "id":"material94", + "id":"constant_rectangularSensor_ellipsoidSurfaceMaterial_grid_color", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.10980392156862745,0.11372549019607843,0.11764705882352941,0.10588235294117647 + 0.6549019607843137,0.2627450980392157,0.6235294117647059,0.0196078431372549 ] } } @@ -4395,13 +4395,13 @@ } }, { - "id":"material95", + "id":"constant_rectangularSensor_ellipsoidSurfaceMaterial_stripe_evenColor", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.12549019607843137,0.12941176470588237,0.13333333333333333,0.12156862745098039 + 0.7176470588235294,0.8901960784313725,0,0.30196078431372547 ] } } @@ -4409,13 +4409,13 @@ } }, { - "id":"material96", + "id":"constant_rectangularSensor_ellipsoidSurfaceMaterial_stripe_oddColor", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.1411764705882353,0.1450980392156863,0.14901960784313725,0.13725490196078433 + 0.10196078431372549,0.611764705882353,0.8235294117647058,0.00784313725490196 ] } } @@ -4423,13 +4423,13 @@ } }, { - "id":"constant58", + "id":"constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.1568627450980392,0.1607843137254902,0.16470588235294117,0.15294117647058825 + 0.023529411764705882,0.6313725490196078,0.30980392156862746,0.6705882352941176 ] } } @@ -4441,15 +4441,15 @@ "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ - "image":"http://example.com/25", + "image":"http://example.com/24029", "repeat":{ "cartesian2":[ - 181,182 + 25949,5221 ] }, "color":{ "rgba":[ - 68,69,70,67 + 250,150,27,141 ] }, "transparent":true @@ -4464,23 +4464,23 @@ "grid":{ "color":{ "rgba":[ - 72,73,74,71 + 72,123,65,214 ] }, - "cellAlpha":147, + "cellAlpha":64262, "lineCount":{ "cartesian2":[ - 183,184 + 55649,41177 ] }, "lineThickness":{ "cartesian2":[ - 185,186 + 9279,32036 ] }, "lineOffset":{ "cartesian2":[ - 187,188 + 22057,32854 ] } } @@ -4495,28 +4495,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 76,77,78,75 + 232,205,141,211 ] }, "oddColor":{ "rgba":[ - 80,81,82,79 + 213,74,9,194 ] }, - "offset":148, - "repeat":149 + "offset":27981, + "repeat":35510 } } } }, { - "id":"material97", + "id":"constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image_color", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.17254901960784313,0.17647058823529413,0.1803921568627451,0.16862745098039217 + 0.7254901960784313,0.8666666666666667,0.49019607843137253,0.8352941176470589 ] } } @@ -4524,13 +4524,13 @@ } }, { - "id":"material98", + "id":"constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid_color", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.18823529411764706,0.19215686274509805,0.19607843137254902,0.1843137254901961 + 0.49411764705882355,0.2784313725490196,0.7490196078431373,0.9647058823529412 ] } } @@ -4538,13 +4538,13 @@ } }, { - "id":"material99", + "id":"constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.20392156862745098,0.20784313725490197,0.21176470588235294,0.2 + 0.7176470588235294,0.6392156862745098,0.7019607843137254,0.3764705882352941 ] } } @@ -4552,13 +4552,13 @@ } }, { - "id":"material100", + "id":"constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.2196078431372549,0.2235294117647059,0.22745098039215686,0.21568627450980393 + 0.788235294117647,0.5372549019607843,0.1568627450980392,0.20392156862745098 ] } } @@ -4566,13 +4566,13 @@ } }, { - "id":"constant59", + "id":"constant_rectangularSensor_domeSurfaceMaterial_solidColor_color", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.23529411764705882,0.23921568627450981,0.24313725490196078,0.23137254901960785 + 0.15294117647058825,0.9450980392156862,0.5254901960784314,0.5764705882352941 ] } } @@ -4584,15 +4584,15 @@ "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "image":{ - "image":"http://example.com/26", + "image":"http://example.com/39720", "repeat":{ "cartesian2":[ - 189,190 + 36759,34959 ] }, "color":{ "rgba":[ - 84,85,86,83 + 93,221,12,137 ] }, "transparent":true @@ -4607,23 +4607,23 @@ "grid":{ "color":{ "rgba":[ - 88,89,90,87 + 117,242,182,185 ] }, - "cellAlpha":150, + "cellAlpha":58215, "lineCount":{ "cartesian2":[ - 191,192 + 12463,42544 ] }, "lineThickness":{ "cartesian2":[ - 193,194 + 56378,63452 ] }, "lineOffset":{ "cartesian2":[ - 195,196 + 33185,51585 ] } } @@ -4638,28 +4638,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 92,93,94,91 + 99,109,104,142 ] }, "oddColor":{ "rgba":[ - 96,97,98,95 + 144,89,171,94 ] }, - "offset":151, - "repeat":152 + "offset":55592, + "repeat":20225 } } } }, { - "id":"material101", + "id":"constant_rectangularSensor_domeSurfaceMaterial_image_color", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.25098039215686274,0.2549019607843137,0.25882352941176473,0.24705882352941178 + 0.0784313725490196,0.8666666666666667,0.7058823529411765,0.4117647058823529 ] } } @@ -4667,13 +4667,13 @@ } }, { - "id":"material102", + "id":"constant_rectangularSensor_domeSurfaceMaterial_grid_color", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.26666666666666666,0.27058823529411763,0.27450980392156865,0.2627450980392157 + 0.7294117647058823,0.6431372549019608,0.6392156862745098,0.4392156862745098 ] } } @@ -4681,13 +4681,13 @@ } }, { - "id":"material103", + "id":"constant_rectangularSensor_domeSurfaceMaterial_stripe_evenColor", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.2823529411764706,0.28627450980392155,0.2901960784313726,0.2784313725490196 + 0.6431372549019608,0.8470588235294118,0.19607843137254902,0.3137254901960784 ] } } @@ -4695,13 +4695,13 @@ } }, { - "id":"material104", + "id":"constant_rectangularSensor_domeSurfaceMaterial_stripe_oddColor", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.2980392156862745,0.30196078431372547,0.3058823529411765,0.29411764705882354 + 0.9411764705882353,0.6313725490196078,0.7058823529411765,0.49411764705882355 ] } } @@ -4709,13 +4709,13 @@ } }, { - "id":"constant60", + "id":"constant_rectangularSensor_environmentOcclusionMaterial_solidColor_color", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.3137254901960784,0.3176470588235294,0.3215686274509804,0.30980392156862746 + 0.2823529411764706,0.18823529411764706,0.7843137254901961,0.7215686274509804 ] } } @@ -4727,15 +4727,15 @@ "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "image":{ - "image":"http://example.com/27", + "image":"http://example.com/22276", "repeat":{ "cartesian2":[ - 197,198 + 24100,51550 ] }, "color":{ "rgba":[ - 100,101,102,99 + 11,6,155,54 ] }, "transparent":true @@ -4750,23 +4750,23 @@ "grid":{ "color":{ "rgba":[ - 104,105,106,103 + 212,195,41,10 ] }, - "cellAlpha":153, + "cellAlpha":36411, "lineCount":{ "cartesian2":[ - 199,200 + 46422,32693 ] }, "lineThickness":{ "cartesian2":[ - 201,202 + 48390,49341 ] }, "lineOffset":{ "cartesian2":[ - 203,204 + 8359,23584 ] } } @@ -4781,28 +4781,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 108,109,110,107 + 249,180,43,229 ] }, "oddColor":{ "rgba":[ - 112,113,114,111 + 192,184,121,71 ] }, - "offset":154, - "repeat":155 + "offset":38358, + "repeat":12111 } } } }, { - "id":"material105", + "id":"constant_rectangularSensor_environmentOcclusionMaterial_image_color", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.32941176470588235,0.3333333333333333,0.33725490196078434,0.3254901960784314 + 0.7686274509803922,0.4196078431372549,0.5294117647058824,0.43137254901960786 ] } } @@ -4810,13 +4810,13 @@ } }, { - "id":"material106", + "id":"constant_rectangularSensor_environmentOcclusionMaterial_grid_color", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.34509803921568627,0.34901960784313724,0.35294117647058826,0.3411764705882353 + 0.2,0.21568627450980393,0.6549019607843137,0.396078431372549 ] } } @@ -4824,13 +4824,13 @@ } }, { - "id":"material107", + "id":"constant_rectangularSensor_environmentOcclusionMaterial_stripe_evenColor", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.3607843137254902,0.36470588235294116,0.3686274509803922,0.3568627450980392 + 0.06666666666666667,0.1803921568627451,0.6039215686274509,0.6196078431372549 ] } } @@ -4838,13 +4838,13 @@ } }, { - "id":"material108", + "id":"constant_rectangularSensor_environmentOcclusionMaterial_stripe_oddColor", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.3764705882352941,0.3803921568627451,0.3843137254901961,0.37254901960784315 + 0.21568627450980393,0.6941176470588235,0.38823529411764707,0.4470588235294118 ] } } @@ -4852,53 +4852,53 @@ } }, { - "id":"constant61", + "id":"constant_agi_rectangularSensor_environmentIntersectionColor_rgbaf", "agi_rectangularSensor":{ "environmentIntersectionColor":{ "rgbaf":[ - 0.39215686274509803,0.396078431372549,0.4,0.38823529411764707 + 0.1607843137254902,0.16862745098039217,0.30196078431372547,0.11764705882352941 ] } } }, { - "id":"constant62", + "id":"constant_agi_fan_directions_unitSpherical", "agi_fan":{ "directions":{ "unitSpherical":[ - 5,6,7,8 + 58733,12261,59695,54505 ] } } }, { - "id":"constant63", + "id":"constant_agi_fan_directions_cartesian", "agi_fan":{ "directions":{ "cartesian":[ - 31,32,33,34,35,36 + 26610,54119,64979,9469,6948,56091 ] } } }, { - "id":"constant64", + "id":"constant_agi_fan_directions_unitCartesian", "agi_fan":{ "directions":{ "unitCartesian":[ - 0.5025707110324169,0.5743665268941909,0.6461623427559638,0.5234239225902138,0.5757663148492348,0.6281087071082566 + 0.5116366868952748,0.8586182289997567,0.03166445092130639,0.121216354583563,0.632759881014748,0.76480162680245 ] } } }, { - "id":"constant65", + "id":"constant_fan_material_solidColor_color", "agi_fan":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.40784313725490196,0.4117647058823529,0.41568627450980394,0.403921568627451 + 0.26666666666666666,0.5764705882352941,0.23529411764705882,0.592156862745098 ] } } @@ -4910,15 +4910,15 @@ "agi_fan":{ "material":{ "image":{ - "image":"http://example.com/28", + "image":"http://example.com/11768", "repeat":{ "cartesian2":[ - 205,206 + 24583,56160 ] }, "color":{ "rgba":[ - 116,117,118,115 + 173,42,118,148 ] }, "transparent":true @@ -4933,23 +4933,23 @@ "grid":{ "color":{ "rgba":[ - 120,121,122,119 + 41,240,181,146 ] }, - "cellAlpha":156, + "cellAlpha":25319, "lineCount":{ "cartesian2":[ - 207,208 + 32075,36477 ] }, "lineThickness":{ "cartesian2":[ - 209,210 + 10654,41513 ] }, "lineOffset":{ "cartesian2":[ - 211,212 + 16605,57664 ] } } @@ -4964,28 +4964,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 124,125,126,123 + 166,47,64,156 ] }, "oddColor":{ "rgba":[ - 128,129,130,127 + 245,22,105,253 ] }, - "offset":157, - "repeat":158 + "offset":40932, + "repeat":32181 } } } }, { - "id":"material109", + "id":"constant_fan_material_image_color", "agi_fan":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.4235294117647059,0.42745098039215684,0.43137254901960786,0.4196078431372549 + 0.8901960784313725,0.49019607843137253,0.8705882352941177,0.8352941176470589 ] } } @@ -4993,13 +4993,13 @@ } }, { - "id":"material110", + "id":"constant_fan_material_grid_color", "agi_fan":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.4392156862745098,0.44313725490196076,0.4470588235294118,0.43529411764705883 + 0.5607843137254902,0.403921568627451,0.27450980392156865,0.7215686274509804 ] } } @@ -5007,13 +5007,13 @@ } }, { - "id":"material111", + "id":"constant_fan_material_stripe_evenColor", "agi_fan":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.4549019607843137,0.4588235294117647,0.4627450980392157,0.45098039215686275 + 0.12549019607843137,0.8235294117647058,0.34509803921568627,0.9058823529411765 ] } } @@ -5021,13 +5021,13 @@ } }, { - "id":"material112", + "id":"constant_fan_material_stripe_oddColor", "agi_fan":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.47058823529411764,0.4745098039215686,0.47843137254901963,0.4666666666666667 + 0.9568627450980393,0.5372549019607843,0.9882352941176471,0.7411764705882353 ] } } @@ -5035,51 +5035,51 @@ } }, { - "id":"constant66", + "id":"constant_agi_fan_outlineColor_rgbaf", "agi_fan":{ "outlineColor":{ "rgbaf":[ - 0.48627450980392156,0.49019607843137253,0.49411764705882355,0.4823529411764706 + 0.1607843137254902,0.592156862745098,0.21176470588235294,0.8588235294117647 ] } } }, { - "id":"constant67", + "id":"constant_agi_vector_color_rgbaf", "agi_vector":{ "color":{ "rgbaf":[ - 0.5019607843137255,0.5058823529411764,0.5098039215686274,0.4980392156862745 + 0.36470588235294116,0.8,0.7490196078431373,0.6745098039215687 ] } } }, { - "id":"constant68", + "id":"constant_agi_vector_direction_unitSpherical", "agi_vector":{ "direction":{ "unitSpherical":[ - 3,4 + 34609,391 ] } } }, { - "id":"constant69", + "id":"constant_agi_vector_direction_cartesian", "agi_vector":{ "direction":{ "cartesian":[ - 25,26,27 + 42919,34215,55429 ] } } }, { - "id":"constant70", + "id":"constant_agi_vector_direction_unitCartesian", "agi_vector":{ "direction":{ "unitCartesian":[ - 0.4558423058385518,0.5698028822981898,0.6837634587578276 + 0.408369179119112,0.647772264783761,0.643137393192543 ] } } @@ -5088,28 +5088,28 @@ "id":"ConstantPosition1", "position":{ "cartesian":[ - 28,29,30 + 48370,3260,44044 ] } }, { "id":"ConstantDouble1", "billboard":{ - "scale":159 + "scale":1155 } }, { "id":"ConstantPosition2", "position":{ "cartesian":[ - 31,32,33 + 2599,10,39168 ] } }, { "id":"ConstantDouble2", "billboard":{ - "scale":160 + "scale":16451 } }, { @@ -6003,7 +6003,7 @@ } }, { - "id":"reference1", + "id":"reference_box_material_image", "box":{ "material":{ "image":{ @@ -6024,7 +6024,7 @@ } }, { - "id":"reference2", + "id":"reference_box_material_grid", "box":{ "material":{ "grid":{ @@ -6048,7 +6048,7 @@ } }, { - "id":"reference3", + "id":"reference_box_material_stripe", "box":{ "material":{ "stripe":{ @@ -6072,7 +6072,7 @@ } }, { - "id":"reference4", + "id":"reference_corridor_material_image", "corridor":{ "material":{ "image":{ @@ -6093,7 +6093,7 @@ } }, { - "id":"reference5", + "id":"reference_corridor_material_grid", "corridor":{ "material":{ "grid":{ @@ -6117,7 +6117,7 @@ } }, { - "id":"reference6", + "id":"reference_corridor_material_stripe", "corridor":{ "material":{ "stripe":{ @@ -6141,7 +6141,7 @@ } }, { - "id":"reference7", + "id":"reference_cylinder_material_image", "cylinder":{ "material":{ "image":{ @@ -6162,7 +6162,7 @@ } }, { - "id":"reference8", + "id":"reference_cylinder_material_grid", "cylinder":{ "material":{ "grid":{ @@ -6186,7 +6186,7 @@ } }, { - "id":"reference9", + "id":"reference_cylinder_material_stripe", "cylinder":{ "material":{ "stripe":{ @@ -6210,7 +6210,7 @@ } }, { - "id":"reference10", + "id":"reference_ellipse_material_image", "ellipse":{ "material":{ "image":{ @@ -6231,7 +6231,7 @@ } }, { - "id":"reference11", + "id":"reference_ellipse_material_grid", "ellipse":{ "material":{ "grid":{ @@ -6255,7 +6255,7 @@ } }, { - "id":"reference12", + "id":"reference_ellipse_material_stripe", "ellipse":{ "material":{ "stripe":{ @@ -6279,7 +6279,7 @@ } }, { - "id":"reference13", + "id":"reference_ellipsoid_material_image", "ellipsoid":{ "material":{ "image":{ @@ -6300,7 +6300,7 @@ } }, { - "id":"reference14", + "id":"reference_ellipsoid_material_grid", "ellipsoid":{ "material":{ "grid":{ @@ -6324,7 +6324,7 @@ } }, { - "id":"reference15", + "id":"reference_ellipsoid_material_stripe", "ellipsoid":{ "material":{ "stripe":{ @@ -6348,7 +6348,7 @@ } }, { - "id":"reference16", + "id":"reference_path_material_polylineOutline", "path":{ "material":{ "polylineOutline":{ @@ -6366,7 +6366,7 @@ } }, { - "id":"reference17", + "id":"reference_path_material_polylineArrow", "path":{ "material":{ "polylineArrow":{ @@ -6378,7 +6378,7 @@ } }, { - "id":"reference18", + "id":"reference_path_material_polylineGlow", "path":{ "material":{ "polylineGlow":{ @@ -6393,7 +6393,7 @@ } }, { - "id":"reference19", + "id":"reference_path_material_image", "path":{ "material":{ "image":{ @@ -6414,7 +6414,7 @@ } }, { - "id":"reference20", + "id":"reference_path_material_grid", "path":{ "material":{ "grid":{ @@ -6438,7 +6438,7 @@ } }, { - "id":"reference21", + "id":"reference_path_material_stripe", "path":{ "material":{ "stripe":{ @@ -6462,7 +6462,7 @@ } }, { - "id":"reference22", + "id":"reference_polygon_material_image", "polygon":{ "material":{ "image":{ @@ -6483,7 +6483,7 @@ } }, { - "id":"reference23", + "id":"reference_polygon_material_grid", "polygon":{ "material":{ "grid":{ @@ -6507,7 +6507,7 @@ } }, { - "id":"reference24", + "id":"reference_polygon_material_stripe", "polygon":{ "material":{ "stripe":{ @@ -6531,7 +6531,7 @@ } }, { - "id":"reference25", + "id":"reference_polyline_material_polylineOutline", "polyline":{ "material":{ "polylineOutline":{ @@ -6549,7 +6549,7 @@ } }, { - "id":"reference26", + "id":"reference_polyline_material_polylineArrow", "polyline":{ "material":{ "polylineArrow":{ @@ -6561,7 +6561,7 @@ } }, { - "id":"reference27", + "id":"reference_polyline_material_polylineGlow", "polyline":{ "material":{ "polylineGlow":{ @@ -6576,7 +6576,7 @@ } }, { - "id":"reference28", + "id":"reference_polyline_material_image", "polyline":{ "material":{ "image":{ @@ -6597,7 +6597,7 @@ } }, { - "id":"reference29", + "id":"reference_polyline_material_grid", "polyline":{ "material":{ "grid":{ @@ -6621,7 +6621,7 @@ } }, { - "id":"reference30", + "id":"reference_polyline_material_stripe", "polyline":{ "material":{ "stripe":{ @@ -6645,7 +6645,7 @@ } }, { - "id":"reference31", + "id":"reference_rectangle_material_image", "rectangle":{ "material":{ "image":{ @@ -6666,7 +6666,7 @@ } }, { - "id":"reference32", + "id":"reference_rectangle_material_grid", "rectangle":{ "material":{ "grid":{ @@ -6690,7 +6690,7 @@ } }, { - "id":"reference33", + "id":"reference_rectangle_material_stripe", "rectangle":{ "material":{ "stripe":{ @@ -6714,7 +6714,7 @@ } }, { - "id":"reference34", + "id":"reference_wall_material_image", "wall":{ "material":{ "image":{ @@ -6735,7 +6735,7 @@ } }, { - "id":"reference35", + "id":"reference_wall_material_grid", "wall":{ "material":{ "grid":{ @@ -6759,7 +6759,7 @@ } }, { - "id":"reference36", + "id":"reference_wall_material_stripe", "wall":{ "material":{ "stripe":{ @@ -6783,7 +6783,7 @@ } }, { - "id":"reference37", + "id":"reference_conicSensor_lateralSurfaceMaterial_image", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "image":{ @@ -6804,7 +6804,7 @@ } }, { - "id":"reference38", + "id":"reference_conicSensor_lateralSurfaceMaterial_grid", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "grid":{ @@ -6828,7 +6828,7 @@ } }, { - "id":"reference39", + "id":"reference_conicSensor_lateralSurfaceMaterial_stripe", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "stripe":{ @@ -6852,7 +6852,7 @@ } }, { - "id":"reference40", + "id":"reference_conicSensor_ellipsoidSurfaceMaterial_image", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ @@ -6873,7 +6873,7 @@ } }, { - "id":"reference41", + "id":"reference_conicSensor_ellipsoidSurfaceMaterial_grid", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ @@ -6897,7 +6897,7 @@ } }, { - "id":"reference42", + "id":"reference_conicSensor_ellipsoidSurfaceMaterial_stripe", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ @@ -6921,7 +6921,7 @@ } }, { - "id":"reference43", + "id":"reference_conicSensor_ellipsoidHorizonSurfaceMaterial_image", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ @@ -6942,7 +6942,7 @@ } }, { - "id":"reference44", + "id":"reference_conicSensor_ellipsoidHorizonSurfaceMaterial_grid", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ @@ -6966,7 +6966,7 @@ } }, { - "id":"reference45", + "id":"reference_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ @@ -6990,7 +6990,7 @@ } }, { - "id":"reference46", + "id":"reference_conicSensor_domeSurfaceMaterial_image", "agi_conicSensor":{ "domeSurfaceMaterial":{ "image":{ @@ -7011,7 +7011,7 @@ } }, { - "id":"reference47", + "id":"reference_conicSensor_domeSurfaceMaterial_grid", "agi_conicSensor":{ "domeSurfaceMaterial":{ "grid":{ @@ -7035,7 +7035,7 @@ } }, { - "id":"reference48", + "id":"reference_conicSensor_domeSurfaceMaterial_stripe", "agi_conicSensor":{ "domeSurfaceMaterial":{ "stripe":{ @@ -7059,7 +7059,7 @@ } }, { - "id":"reference49", + "id":"reference_conicSensor_environmentOcclusionMaterial_image", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "image":{ @@ -7080,7 +7080,7 @@ } }, { - "id":"reference50", + "id":"reference_conicSensor_environmentOcclusionMaterial_grid", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "grid":{ @@ -7104,7 +7104,7 @@ } }, { - "id":"reference51", + "id":"reference_conicSensor_environmentOcclusionMaterial_stripe", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "stripe":{ @@ -7128,7 +7128,7 @@ } }, { - "id":"reference52", + "id":"reference_customPatternSensor_lateralSurfaceMaterial_image", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "image":{ @@ -7149,7 +7149,7 @@ } }, { - "id":"reference53", + "id":"reference_customPatternSensor_lateralSurfaceMaterial_grid", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "grid":{ @@ -7173,7 +7173,7 @@ } }, { - "id":"reference54", + "id":"reference_customPatternSensor_lateralSurfaceMaterial_stripe", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "stripe":{ @@ -7197,7 +7197,7 @@ } }, { - "id":"reference55", + "id":"reference_customPatternSensor_ellipsoidSurfaceMaterial_image", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ @@ -7218,7 +7218,7 @@ } }, { - "id":"reference56", + "id":"reference_customPatternSensor_ellipsoidSurfaceMaterial_grid", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ @@ -7242,7 +7242,7 @@ } }, { - "id":"reference57", + "id":"reference_customPatternSensor_ellipsoidSurfaceMaterial_stripe", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ @@ -7266,7 +7266,7 @@ } }, { - "id":"reference58", + "id":"reference_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ @@ -7287,7 +7287,7 @@ } }, { - "id":"reference59", + "id":"reference_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ @@ -7311,7 +7311,7 @@ } }, { - "id":"reference60", + "id":"reference_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ @@ -7335,7 +7335,7 @@ } }, { - "id":"reference61", + "id":"reference_customPatternSensor_domeSurfaceMaterial_image", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "image":{ @@ -7356,7 +7356,7 @@ } }, { - "id":"reference62", + "id":"reference_customPatternSensor_domeSurfaceMaterial_grid", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "grid":{ @@ -7380,7 +7380,7 @@ } }, { - "id":"reference63", + "id":"reference_customPatternSensor_domeSurfaceMaterial_stripe", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "stripe":{ @@ -7404,7 +7404,7 @@ } }, { - "id":"reference64", + "id":"reference_customPatternSensor_environmentOcclusionMaterial_image", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "image":{ @@ -7425,7 +7425,7 @@ } }, { - "id":"reference65", + "id":"reference_customPatternSensor_environmentOcclusionMaterial_grid", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "grid":{ @@ -7449,7 +7449,7 @@ } }, { - "id":"reference66", + "id":"reference_customPatternSensor_environmentOcclusionMaterial_stripe", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "stripe":{ @@ -7473,7 +7473,7 @@ } }, { - "id":"reference67", + "id":"reference_rectangularSensor_lateralSurfaceMaterial_image", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "image":{ @@ -7494,7 +7494,7 @@ } }, { - "id":"reference68", + "id":"reference_rectangularSensor_lateralSurfaceMaterial_grid", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "grid":{ @@ -7518,7 +7518,7 @@ } }, { - "id":"reference69", + "id":"reference_rectangularSensor_lateralSurfaceMaterial_stripe", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "stripe":{ @@ -7542,7 +7542,7 @@ } }, { - "id":"reference70", + "id":"reference_rectangularSensor_ellipsoidSurfaceMaterial_image", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ @@ -7563,7 +7563,7 @@ } }, { - "id":"reference71", + "id":"reference_rectangularSensor_ellipsoidSurfaceMaterial_grid", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ @@ -7587,7 +7587,7 @@ } }, { - "id":"reference72", + "id":"reference_rectangularSensor_ellipsoidSurfaceMaterial_stripe", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ @@ -7611,7 +7611,7 @@ } }, { - "id":"reference73", + "id":"reference_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ @@ -7632,7 +7632,7 @@ } }, { - "id":"reference74", + "id":"reference_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ @@ -7656,7 +7656,7 @@ } }, { - "id":"reference75", + "id":"reference_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ @@ -7680,7 +7680,7 @@ } }, { - "id":"reference76", + "id":"reference_rectangularSensor_domeSurfaceMaterial_image", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "image":{ @@ -7701,7 +7701,7 @@ } }, { - "id":"reference77", + "id":"reference_rectangularSensor_domeSurfaceMaterial_grid", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "grid":{ @@ -7725,7 +7725,7 @@ } }, { - "id":"reference78", + "id":"reference_rectangularSensor_domeSurfaceMaterial_stripe", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "stripe":{ @@ -7749,7 +7749,7 @@ } }, { - "id":"reference79", + "id":"reference_rectangularSensor_environmentOcclusionMaterial_image", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "image":{ @@ -7770,7 +7770,7 @@ } }, { - "id":"reference80", + "id":"reference_rectangularSensor_environmentOcclusionMaterial_grid", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "grid":{ @@ -7794,7 +7794,7 @@ } }, { - "id":"reference81", + "id":"reference_rectangularSensor_environmentOcclusionMaterial_stripe", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "stripe":{ @@ -7818,7 +7818,7 @@ } }, { - "id":"reference82", + "id":"reference_fan_material_image", "agi_fan":{ "material":{ "image":{ @@ -7839,7 +7839,7 @@ } }, { - "id":"reference83", + "id":"reference_fan_material_grid", "agi_fan":{ "material":{ "grid":{ @@ -7863,7 +7863,7 @@ } }, { - "id":"reference84", + "id":"reference_fan_material_stripe", "agi_fan":{ "material":{ "stripe":{ @@ -7897,7 +7897,7 @@ } }, { - "id":"velocityReference1", + "id":"velocityReference_billboard_alignedAxis", "billboard":{ "alignedAxis":{ "velocityReference":"VelocityPosition#position" @@ -7909,107 +7909,107 @@ "position":{ "epoch":"2016-06-17T12:00:00Z", "cartesian":[ - 0,34,35,36, - 3600,37,38,39 + 0,14893,22330,50775, + 3600,44952,52911,45006 ] }, "orientation":{ "epoch":"2016-06-17T12:00:00Z", "unitQuaternion":[ - 0,0.4735137238103781,0.5208650961914161,0.5682164685724541,0.4261623514293411, - 3600,0.48132991492077,0.515710623129397,0.550091331338023,0.446949206712144 + 0,0.63382030572505,0.114406464045845,0.748788933003267,0.156518736408648, + 3600,0.6707789298754215,0.6087904034756936,0.3200138287815148,0.27752661360612185 ] }, "viewFrom":{ "epoch":"2016-06-17T12:00:00Z", "cartesian":[ - 0,40,41,42, - 3600,43,44,45 + 0,36965,47504,12985, + 3600,16155,2367,57353 ] }, "billboard":{ "scale":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,161, - 3600,162 + 0,5763, + 3600,31607 ] }, "pixelOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,213,214, - 3600,215,216 + 0,2029,62215, + 3600,30658,12919 ] }, "eyeOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian":[ - 0,46,47,48, - 3600,49,50,51 + 0,3553,23821,42589, + 3600,3059,48139,28860 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,132,133,134,131, - 3600,136,137,138,135 + 0,85,19,239,63, + 3600,160,189,87,99 ] }, "rotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,163, - 3600,164 + 0,4554, + 3600,21210 ] }, "alignedAxis":{ "epoch":"2016-06-17T12:00:00Z", "unitCartesian":[ - 0,0.5025707110324169,0.5743665268941909,0.6461623427559638, - 3600,0.5234239225902138,0.5757663148492348,0.6281087071082566 + 0,0.9715593944537291,0.23009485437483201,0.055934792740548404, + 3600,0.3848107755162362,0.8228733250893204,0.41809108804546224 ] }, "width":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,165, - 3600,166 + 0,21333, + 3600,51893 ] }, "height":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,167, - 3600,168 + 0,48314, + 3600,61118 ] }, "scaleByDistance":{ "epoch":"2016-06-17T12:00:00Z", "nearFarScalar":[ - 0,29,30,31,32, - 3600,33,34,35,36 + 0,46842,10678,46377,15029, + 3600,20642,43600,7082,11291 ] }, "translucencyByDistance":{ "epoch":"2016-06-17T12:00:00Z", "nearFarScalar":[ - 0,37,38,39,40, - 3600,41,42,43,44 + 0,64366,52219,8139,10015, + 3600,10918,18986,49738,60610 ] }, "pixelOffsetScaleByDistance":{ "epoch":"2016-06-17T12:00:00Z", "nearFarScalar":[ - 0,45,46,47,48, - 3600,49,50,51,52 + 0,54503,26068,41061,59552, + 3600,37417,4754,19986,15182 ] }, "imageSubRegion":{ "epoch":"2016-06-17T12:00:00Z", "boundingRectangle":[ - 0,5,6,7,8, - 3600,9,10,11,12 + 0,26590,12135,16431,56640, + 3600,43063,42664,60326,52715 ] } }, @@ -8017,8 +8017,8 @@ "dimensions":{ "epoch":"2016-06-17T12:00:00Z", "cartesian":[ - 0,52,53,54, - 3600,55,56,57 + 0,37525,42898,18087, + 3600,49399,59584,63976 ] }, "material":{ @@ -8026,8 +8026,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,140,141,142,139, - 3600,144,145,146,143 + 0,172,28,222,165, + 3600,16,192,121,150 ] } } @@ -8035,15 +8035,15 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,148,149,150,147, - 3600,152,153,154,151 + 0,53,66,217,237, + 3600,163,75,228,48 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,169, - 3600,170 + 0,45211, + 3600,20490 ] } }, @@ -8051,29 +8051,29 @@ "width":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,171, - 3600,172 + 0,62443, + 3600,13988 ] }, "height":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,173, - 3600,174 + 0,20585, + 3600,63872 ] }, "extrudedHeight":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,175, - 3600,176 + 0,63407, + 3600,42397 ] }, "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,177, - 3600,178 + 0,43027, + 3600,55912 ] }, "material":{ @@ -8081,8 +8081,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,156,157,158,155, - 3600,160,161,162,159 + 0,35,213,31,79, + 3600,87,126,23,40 ] } } @@ -8090,15 +8090,15 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,164,165,166,163, - 3600,168,169,170,167 + 0,137,114,57,34, + 3600,93,178,74,64 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,179, - 3600,180 + 0,14678, + 3600,57820 ] } }, @@ -8106,22 +8106,22 @@ "length":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,181, - 3600,182 + 0,30241, + 3600,48364 ] }, "topRadius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,183, - 3600,184 + 0,62881, + 3600,16270 ] }, "bottomRadius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,185, - 3600,186 + 0,61925, + 3600,21514 ] }, "material":{ @@ -8129,8 +8129,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,172,173,174,171, - 3600,176,177,178,175 + 0,133,36,52,121, + 3600,7,13,34,201 ] } } @@ -8138,29 +8138,29 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,180,181,182,179, - 3600,184,185,186,183 + 0,112,241,40,103, + 3600,237,75,59,51 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,187, - 3600,188 + 0,36483, + 3600,32586 ] }, "numberOfVerticalLines":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,189, - 3600,190 + 0,45816, + 3600,42247 ] }, "slices":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,191, - 3600,192 + 0,46140, + 3600,53530 ] } }, @@ -8168,50 +8168,50 @@ "semiMajorAxis":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,193, - 3600,194 + 0,13136, + 3600,55507 ] }, "semiMinorAxis":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,195, - 3600,196 + 0,41580, + 3600,60905 ] }, "height":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,197, - 3600,198 + 0,5567, + 3600,45588 ] }, "extrudedHeight":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,199, - 3600,200 + 0,16542, + 3600,13545 ] }, "rotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,201, - 3600,202 + 0,5797, + 3600,24542 ] }, "stRotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,203, - 3600,204 + 0,20596, + 3600,58204 ] }, "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,205, - 3600,206 + 0,2228, + 3600,43731 ] }, "material":{ @@ -8219,8 +8219,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,188,189,190,187, - 3600,192,193,194,191 + 0,174,250,78,96, + 3600,63,102,221,174 ] } } @@ -8228,22 +8228,22 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,196,197,198,195, - 3600,200,201,202,199 + 0,243,123,194,31, + 3600,236,100,22,203 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,207, - 3600,208 + 0,60636, + 3600,24194 ] }, "numberOfVerticalLines":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,209, - 3600,210 + 0,52822, + 3600,45768 ] } }, @@ -8251,8 +8251,8 @@ "radii":{ "epoch":"2016-06-17T12:00:00Z", "cartesian":[ - 0,58,59,60, - 3600,61,62,63 + 0,5183,10004,13863, + 3600,39497,12186,45103 ] }, "material":{ @@ -8260,8 +8260,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,204,205,206,203, - 3600,208,209,210,207 + 0,137,128,194,84, + 3600,50,122,190,247 ] } } @@ -8269,36 +8269,36 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,212,213,214,211, - 3600,216,217,218,215 + 0,247,210,180,171, + 3600,239,35,237,247 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,211, - 3600,212 + 0,10713, + 3600,10444 ] }, "stackPartitions":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,213, - 3600,214 + 0,5841, + 3600,39170 ] }, "slicePartitions":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,215, - 3600,216 + 0,50327, + 3600,4672 ] }, "subdivisions":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,217, - 3600,218 + 0,10225, + 3600,53957 ] } }, @@ -8306,57 +8306,57 @@ "scale":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,219, - 3600,220 + 0,40153, + 3600,42123 ] }, "pixelOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,217,218, - 3600,219,220 + 0,8539,9761, + 3600,10537,54569 ] }, "eyeOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian":[ - 0,64,65,66, - 3600,67,68,69 + 0,5984,34327,59014, + 3600,1931,5127,18964 ] }, "fillColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,220,221,222,219, - 3600,224,225,226,223 + 0,17,212,62,58, + 3600,214,69,90,116 ] }, "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,228,229,230,227, - 3600,232,233,234,231 + 0,205,14,169,70, + 3600,143,73,168,17 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,221, - 3600,222 + 0,53305, + 3600,43838 ] }, "translucencyByDistance":{ "epoch":"2016-06-17T12:00:00Z", "nearFarScalar":[ - 0,53,54,55,56, - 3600,57,58,59,60 + 0,25055,32865,32128,29309, + 3600,58875,9189,20515,15696 ] }, "pixelOffsetScaleByDistance":{ "epoch":"2016-06-17T12:00:00Z", "nearFarScalar":[ - 0,61,62,63,64, - 3600,65,66,67,68 + 0,45296,62896,38133,40084, + 3600,28657,25711,9316,62756 ] } }, @@ -8364,36 +8364,36 @@ "scale":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,223, - 3600,224 + 0,63647, + 3600,53878 ] }, "minimumPixelSize":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,225, - 3600,226 + 0,16357, + 3600,40522 ] }, "maximumScale":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,227, - 3600,228 + 0,8290, + 3600,25558 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,236,237,238,235, - 3600,240,241,242,239 + 0,74,69,164,116, + 3600,127,30,46,170 ] }, "colorBlendAmount":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,229, - 3600,230 + 0,64130, + 3600,21967 ] } }, @@ -8401,29 +8401,29 @@ "width":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,231, - 3600,232 + 0,32449, + 3600,33819 ] }, "resolution":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,233, - 3600,234 + 0,8399, + 3600,19400 ] }, "leadTime":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,235, - 3600,236 + 0,40222, + 3600,33294 ] }, "trailTime":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,237, - 3600,238 + 0,34052, + 3600,57713 ] }, "material":{ @@ -8431,8 +8431,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,244,245,246,243, - 3600,248,249,250,247 + 0,97,239,22,105, + 3600,242,157,215,125 ] } } @@ -8442,43 +8442,43 @@ "pixelSize":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,239, - 3600,240 + 0,39714, + 3600,3313 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,252,253,254,251, - 3600,1,2,3,0 + 0,137,151,128,95, + 3600,99,157,124,108 ] }, "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,5,6,7,4, - 3600,9,10,11,8 + 0,225,246,102,195, + 3600,248,38,75,222 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,241, - 3600,242 + 0,48323, + 3600,50914 ] }, "scaleByDistance":{ "epoch":"2016-06-17T12:00:00Z", "nearFarScalar":[ - 0,69,70,71,72, - 3600,73,74,75,76 + 0,39727,50843,56262,15579, + 3600,60522,63980,30201,25205 ] }, "translucencyByDistance":{ "epoch":"2016-06-17T12:00:00Z", "nearFarScalar":[ - 0,77,78,79,80, - 3600,81,82,83,84 + 0,61190,16879,16449,10048, + 3600,46491,47541,35769,13707 ] } }, @@ -8486,29 +8486,29 @@ "height":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,243, - 3600,244 + 0,64265, + 3600,19257 ] }, "extrudedHeight":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,245, - 3600,246 + 0,12315, + 3600,4797 ] }, "stRotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,247, - 3600,248 + 0,24959, + 3600,32341 ] }, "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,249, - 3600,250 + 0,51922, + 3600,9185 ] }, "material":{ @@ -8516,8 +8516,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,13,14,15,12, - 3600,17,18,19,16 + 0,19,40,12,31, + 3600,179,204,8,194 ] } } @@ -8525,15 +8525,15 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,21,22,23,20, - 3600,25,26,27,24 + 0,187,223,120,26, + 3600,20,135,105,81 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,251, - 3600,252 + 0,48428, + 3600,41508 ] } }, @@ -8541,15 +8541,15 @@ "width":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,253, - 3600,254 + 0,60367, + 3600,31077 ] }, "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,255, - 3600,256 + 0,62537, + 3600,14676 ] }, "material":{ @@ -8557,8 +8557,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,29,30,31,28, - 3600,33,34,35,32 + 0,90,30,195,220, + 3600,39,17,221,74 ] } } @@ -8568,43 +8568,43 @@ "coordinates":{ "epoch":"2016-06-17T12:00:00Z", "wsen":[ - 0,1.14601836602552,0.575222039230621,0.00442571243572409,1.00442571243572, - 3600,0.433629385640828,1.43362938564083,0.862833058845931,0.292036732051034 + 0,0.392205830501108,1.04907471338688,0.00211010473645246,0.064281089310235, + 3600,0.523469985903937,0.229690388867811,0.399550037703662,0.48478405941078 ] }, "height":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,257, - 3600,258 + 0,56388, + 3600,59991 ] }, "extrudedHeight":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,259, - 3600,260 + 0,39796, + 3600,33335 ] }, "rotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,261, - 3600,262 + 0,26921, + 3600,46937 ] }, "stRotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,263, - 3600,264 + 0,65255, + 3600,12220 ] }, "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,265, - 3600,266 + 0,6948, + 3600,2204 ] }, "material":{ @@ -8612,8 +8612,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,37,38,39,36, - 3600,41,42,43,40 + 0,106,81,64,152, + 3600,94,108,96,154 ] } } @@ -8621,15 +8621,15 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,45,46,47,44, - 3600,49,50,51,48 + 0,6,244,49,131, + 3600,87,190,148,55 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,267, - 3600,268 + 0,41576, + 3600,33933 ] } }, @@ -8637,8 +8637,8 @@ "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,269, - 3600,270 + 0,64428, + 3600,25333 ] }, "material":{ @@ -8646,8 +8646,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,53,54,55,52, - 3600,57,58,59,56 + 0,31,188,250,46, + 3600,78,91,199,227 ] } } @@ -8655,15 +8655,15 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,61,62,63,60, - 3600,65,66,67,64 + 0,241,39,105,205, + 3600,184,17,208,44 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,271, - 3600,272 + 0,6.2e4, + 3600,40549 ] } }, @@ -8671,50 +8671,50 @@ "innerHalfAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,273, - 3600,274 + 0,16886, + 3600,9960 ] }, "outerHalfAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,275, - 3600,276 + 0,19166, + 3600,1511 ] }, "minimumClockAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,277, - 3600,278 + 0,47420, + 3600,40115 ] }, "maximumClockAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,279, - 3600,280 + 0,42591, + 3600,2115 ] }, "radius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,281, - 3600,282 + 0,37448, + 3600,5744 ] }, "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,69,70,71,68, - 3600,73,74,75,72 + 0,32,200,181,86, + 3600,212,15,7,176 ] }, "intersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,283, - 3600,284 + 0,15969, + 3600,33925 ] }, "lateralSurfaceMaterial":{ @@ -8722,8 +8722,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,77,78,79,76, - 3600,81,82,83,80 + 0,206,145,134,201, + 3600,38,167,50,18 ] } } @@ -8733,8 +8733,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,85,86,87,84, - 3600,89,90,91,88 + 0,198,112,61,75, + 3600,102,141,218,229 ] } } @@ -8744,8 +8744,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,93,94,95,92, - 3600,97,98,99,96 + 0,18,35,91,20, + 3600,162,212,131,214 ] } } @@ -8755,8 +8755,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,101,102,103,100, - 3600,105,106,107,104 + 0,254,199,146,19, + 3600,221,70,233,225 ] } } @@ -8766,8 +8766,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,109,110,111,108, - 3600,113,114,115,112 + 0,251,80,120,192, + 3600,138,101,244,185 ] } } @@ -8775,15 +8775,15 @@ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,117,118,119,116, - 3600,121,122,123,120 + 0,117,84,113,65, + 3600,24,241,104,132 ] }, "environmentIntersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,285, - 3600,286 + 0,54383, + 3600,48814 ] } }, @@ -8791,22 +8791,22 @@ "radius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,287, - 3600,288 + 0,51649, + 3600,47224 ] }, "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,125,126,127,124, - 3600,129,130,131,128 + 0,234,156,105,180, + 3600,181,97,242,62 ] }, "intersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,289, - 3600,290 + 0,54947, + 3600,32744 ] }, "lateralSurfaceMaterial":{ @@ -8814,8 +8814,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,133,134,135,132, - 3600,137,138,139,136 + 0,23,46,232,9, + 3600,119,104,98,121 ] } } @@ -8825,8 +8825,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,141,142,143,140, - 3600,145,146,147,144 + 0,3,198,203,85, + 3600,16,212,3,28 ] } } @@ -8836,8 +8836,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,149,150,151,148, - 3600,153,154,155,152 + 0,152,99,18,216, + 3600,89,151,205,251 ] } } @@ -8847,8 +8847,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,157,158,159,156, - 3600,161,162,163,160 + 0,231,234,144,228, + 3600,185,26,16,169 ] } } @@ -8858,8 +8858,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,165,166,167,164, - 3600,169,170,171,168 + 0,214,222,56,37, + 3600,132,87,218,73 ] } } @@ -8867,15 +8867,15 @@ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,173,174,175,172, - 3600,177,178,179,176 + 0,182,99,116,67, + 3600,101,186,29,220 ] }, "environmentIntersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,291, - 3600,292 + 0,15461, + 3600,8e3 ] } }, @@ -8883,36 +8883,36 @@ "xHalfAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,293, - 3600,294 + 0,58366, + 3600,22538 ] }, "yHalfAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,295, - 3600,296 + 0,50294, + 3600,14328 ] }, "radius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,297, - 3600,298 + 0,35659, + 3600,22080 ] }, "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,181,182,183,180, - 3600,185,186,187,184 + 0,115,140,110,208, + 3600,107,143,73,68 ] }, "intersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,299, - 3600,300 + 0,28687, + 3600,9820 ] }, "lateralSurfaceMaterial":{ @@ -8920,8 +8920,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,189,190,191,188, - 3600,193,194,195,192 + 0,78,198,201,229, + 3600,66,187,189,91 ] } } @@ -8931,8 +8931,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,197,198,199,196, - 3600,201,202,203,200 + 0,110,214,130,40, + 3600,57,28,75,170 ] } } @@ -8942,8 +8942,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,205,206,207,204, - 3600,209,210,211,208 + 0,250,52,250,191, + 3600,26,38,17,69 ] } } @@ -8953,8 +8953,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,213,214,215,212, - 3600,217,218,219,216 + 0,90,167,164,121, + 3600,179,244,230,18 ] } } @@ -8964,8 +8964,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,221,222,223,220, - 3600,225,226,227,224 + 0,38,90,83,20, + 3600,53,203,240,55 ] } } @@ -8973,15 +8973,15 @@ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,229,230,231,228, - 3600,233,234,235,232 + 0,247,228,88,199, + 3600,34,163,220,250 ] }, "environmentIntersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,301, - 3600,302 + 0,637, + 3600,10677 ] } }, @@ -8989,8 +8989,8 @@ "radius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,303, - 3600,304 + 0,48400, + 3600,13510 ] }, "material":{ @@ -8998,8 +8998,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,237,238,239,236, - 3600,241,242,243,240 + 0,169,16,250,136, + 3600,211,131,53,139 ] } } @@ -9007,22 +9007,22 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,245,246,247,244, - 3600,249,250,251,248 + 0,112,11,118,88, + 3600,31,167,62,4 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,305, - 3600,306 + 0,42860, + 3600,62479 ] }, "numberOfRings":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,307, - 3600,308 + 0,30719, + 3600,44188 ] } }, @@ -9030,97 +9030,97 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,253,254,0,252, - 3600,2,3,4,1 + 0,150,8,197,98, + 3600,71,74,62,207 ] }, "direction":{ "epoch":"2016-06-17T12:00:00Z", "spherical":[ - 0,4,5,6, - 3600,7,8,9 + 0,31576,24187,52062, + 3600,31098,2937,4107 ] }, "length":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,309, - 3600,310 + 0,37352, + 3600,28352 ] }, "minimumLengthInPixels":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,311, - 3600,312 + 0,194, + 3600,54242 ] } } }, { - "id":"sampled1", + "id":"sampled_position_cartographicRadians", "position":{ "epoch":"2016-06-17T12:00:00Z", "cartographicRadians":[ - 0,0.716814692820414,0.146018366025517,9, - 3600,0.575222039230621,0.00442571243572409,12 + 0,1.00319530145806,0.889718921347432,16911, + 3600,0.828301545608097,0.517994728610812,62937 ] } }, { - "id":"sampled2", + "id":"sampled_position_cartographicDegrees", "position":{ "epoch":"2016-06-17T12:00:00Z", "cartographicDegrees":[ - 0,13,14,15, - 3600,16,17,18 + 0,43,23,63733, + 3600,28,12,9806 ] } }, { - "id":"sampled3", + "id":"sampled_position_cartesianVelocity", "position":{ "epoch":"2016-06-17T12:00:00Z", "cartesianVelocity":[ - 0,7,8,9,10,11,12, - 3600,13,14,15,16,17,18 + 0,40342,23709,14940,12602,34609,44423, + 3600,25648,55396,53208,60367,62699,54004 ] } }, { - "id":"sampled4", + "id":"sampled_billboard_color_rgbaf", "billboard":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5176470588235295,0.5215686274509804,0.5254901960784314,0.5137254901960784, - 3600,0.5333333333333333,0.5372549019607843,0.5411764705882353,0.5294117647058824 + 0,0.023529411764705882,0.42745098039215684,0.6588235294117647,0.09803921568627451, + 3600,0.9686274509803922,0.7529411764705882,0.8431372549019608,0.16470588235294117 ] } } }, { - "id":"sampled5", + "id":"sampled_billboard_alignedAxis_unitSpherical", "billboard":{ "alignedAxis":{ "epoch":"2016-06-17T12:00:00Z", "unitSpherical":[ - 0,5,6, - 3600,7,8 + 0,57328,53471, + 3600,51360,27848 ] } } }, { - "id":"sampled6", + "id":"sampled_box_material_solidColor_color", "box":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5490196078431373,0.5529411764705883,0.5568627450980392,0.5450980392156862, - 3600,0.5647058823529412,0.5686274509803921,0.5725490196078431,0.5607843137254902 + 0,0.5568627450980392,0.5411764705882353,0.9568627450980393,0.3176470588235294, + 3600,0.792156862745098,0.9215686274509803,0.12549019607843137,0.7843137254901961 ] } } @@ -9128,22 +9128,22 @@ } }, { - "id":"sampled7", + "id":"sampled_box_material_image", "box":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,221,222, - 3600,223,224 + 0,21562,11604, + 3600,56719,11741 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,6,7,8,5, - 3600,10,11,12,9 + 0,146,124,215,53, + 3600,229,219,61,100 ] } } @@ -9151,43 +9151,43 @@ } }, { - "id":"sampled8", + "id":"sampled_box_material_grid", "box":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,14,15,16,13, - 3600,18,19,20,17 + 0,111,151,56,118, + 3600,178,77,41,86 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,313, - 3600,314 + 0,10400, + 3600,10941 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,225,226, - 3600,227,228 + 0,3433,28173, + 3600,53350,6864 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,229,230, - 3600,231,232 + 0,36990,37264, + 3600,38412,45974 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,233,234, - 3600,235,236 + 0,38761,46487, + 3600,62553,37876 ] } } @@ -9195,36 +9195,36 @@ } }, { - "id":"sampled9", + "id":"sampled_box_material_stripe", "box":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,22,23,24,21, - 3600,26,27,28,25 + 0,251,59,84,41, + 3600,20,214,81,152 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,30,31,32,29, - 3600,34,35,36,33 + 0,233,71,17,115, + 3600,20,178,40,30 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,315, - 3600,316 + 0,46979, + 3600,1457 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,317, - 3600,318 + 0,10283, + 3600,63419 ] } } @@ -9232,15 +9232,15 @@ } }, { - "id":"sampled10", + "id":"sampled_box_material_image_color", "box":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5803921568627451,0.5843137254901961,0.5882352941176471,0.5764705882352941, - 3600,0.596078431372549,0.6,0.6039215686274509,0.592156862745098 + 0,0.14901960784313725,0.9294117647058824,0.4627450980392157,0.7647058823529411, + 3600,0.8901960784313725,0.2627450980392157,0.8666666666666667,0.792156862745098 ] } } @@ -9248,15 +9248,15 @@ } }, { - "id":"sampled11", + "id":"sampled_box_material_grid_color", "box":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.611764705882353,0.615686274509804,0.6196078431372549,0.6078431372549019, - 3600,0.6274509803921569,0.6313725490196078,0.6352941176470588,0.6235294117647059 + 0,0.5019607843137255,0.4470588235294118,0.7215686274509804,0.39215686274509803, + 3600,0.8901960784313725,0.5058823529411764,0.5607843137254902,0.6745098039215687 ] } } @@ -9264,15 +9264,15 @@ } }, { - "id":"sampled12", + "id":"sampled_box_material_stripe_evenColor", "box":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6431372549019608,0.6470588235294118,0.6509803921568628,0.6392156862745098, - 3600,0.6588235294117647,0.6627450980392157,0.6666666666666666,0.6549019607843137 + 0,0.9803921568627451,0.34509803921568627,0.9294117647058824,0.5333333333333333, + 3600,0.9882352941176471,0.37254901960784315,0.7137254901960784,0.4666666666666667 ] } } @@ -9280,15 +9280,15 @@ } }, { - "id":"sampled13", + "id":"sampled_box_material_stripe_oddColor", "box":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6745098039215687,0.6784313725490196,0.6823529411764706,0.6705882352941176, - 3600,0.6901960784313725,0.6941176470588235,0.6980392156862745,0.6862745098039216 + 0,0.5450980392156862,0.16862745098039217,0.6549019607843137,0.19607843137254902, + 3600,0.40784313725490196,0.45098039215686275,0.8745098039215686,0.6039215686274509 ] } } @@ -9296,27 +9296,27 @@ } }, { - "id":"sampled14", + "id":"sampled_box_outlineColor_rgbaf", "box":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7058823529411765,0.7098039215686275,0.7137254901960784,0.7019607843137254, - 3600,0.7215686274509804,0.7254901960784313,0.7294117647058823,0.7176470588235294 + 0,0.21568627450980393,0.4980392156862745,0.27450980392156865,0.12941176470588237, + 3600,0.8549019607843137,0.7294117647058823,0.17254901960784313,0.9568627450980393 ] } } }, { - "id":"sampled15", + "id":"sampled_corridor_material_solidColor_color", "corridor":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7372549019607844,0.7411764705882353,0.7450980392156863,0.7333333333333333, - 3600,0.7529411764705882,0.7568627450980392,0.7607843137254902,0.7490196078431373 + 0,0.8588235294117647,0.9882352941176471,0.7333333333333333,0.6901960784313725, + 3600,0.5490196078431373,0.3686274509803922,0.9647058823529412,0.13333333333333333 ] } } @@ -9324,22 +9324,22 @@ } }, { - "id":"sampled16", + "id":"sampled_corridor_material_image", "corridor":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,237,238, - 3600,239,240 + 0,14885,62522, + 3600,45129,25776 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,38,39,40,37, - 3600,42,43,44,41 + 0,57,37,208,54, + 3600,24,80,140,151 ] } } @@ -9347,43 +9347,43 @@ } }, { - "id":"sampled17", + "id":"sampled_corridor_material_grid", "corridor":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,46,47,48,45, - 3600,50,51,52,49 + 0,130,99,15,168, + 3600,246,60,236,5 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,319, - 3600,320 + 0,22161, + 3600,55997 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,241,242, - 3600,243,244 + 0,7285,25116, + 3600,18095,8262 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,245,246, - 3600,247,248 + 0,31150,55929, + 3600,40043,22428 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,249,250, - 3600,251,252 + 0,41105,52128, + 3600,2387,32009 ] } } @@ -9391,36 +9391,36 @@ } }, { - "id":"sampled18", + "id":"sampled_corridor_material_stripe", "corridor":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,54,55,56,53, - 3600,58,59,60,57 + 0,8,64,254,66, + 3600,47,28,112,168 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,62,63,64,61, - 3600,66,67,68,65 + 0,17,233,150,181, + 3600,171,148,181,68 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,321, - 3600,322 + 0,21351, + 3600,20709 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,323, - 3600,324 + 0,25188, + 3600,19705 ] } } @@ -9428,15 +9428,15 @@ } }, { - "id":"sampled19", + "id":"sampled_corridor_material_image_color", "corridor":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7686274509803922,0.7725490196078432,0.7764705882352941,0.7647058823529411, - 3600,0.7843137254901961,0.788235294117647,0.792156862745098,0.7803921568627451 + 0,0.9490196078431372,0.6666666666666666,0.058823529411764705,0.7843137254901961, + 3600,0.38823529411764707,0.2627450980392157,0.7647058823529411,0.8823529411764706 ] } } @@ -9444,15 +9444,15 @@ } }, { - "id":"sampled20", + "id":"sampled_corridor_material_grid_color", "corridor":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8,0.803921568627451,0.807843137254902,0.796078431372549, - 3600,0.8156862745098039,0.8196078431372549,0.8235294117647058,0.8117647058823529 + 0,0.2901960784313726,0.8392156862745098,0.5882352941176471,0.5254901960784314, + 3600,0.26666666666666666,0.00392156862745098,0.1803921568627451,0.7019607843137254 ] } } @@ -9460,15 +9460,15 @@ } }, { - "id":"sampled21", + "id":"sampled_corridor_material_stripe_evenColor", "corridor":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8313725490196079,0.8352941176470589,0.8392156862745098,0.8274509803921568, - 3600,0.8470588235294118,0.8509803921568627,0.8549019607843137,0.8431372549019608 + 0,0.5176470588235295,0.2823529411764706,0.7098039215686275,0.7372549019607844, + 3600,0.5647058823529412,0.40784313725490196,0.9450980392156862,0.6666666666666666 ] } } @@ -9476,15 +9476,15 @@ } }, { - "id":"sampled22", + "id":"sampled_corridor_material_stripe_oddColor", "corridor":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8627450980392157,0.8666666666666667,0.8705882352941177,0.8588235294117647, - 3600,0.8784313725490196,0.8823529411764706,0.8862745098039215,0.8745098039215686 + 0,0.13725490196078433,0.4,0.3568627450980392,0.5019607843137255, + 3600,0.9921568627450981,0.43137254901960786,0.30196078431372547,0.2549019607843137 ] } } @@ -9492,27 +9492,27 @@ } }, { - "id":"sampled23", + "id":"sampled_corridor_outlineColor_rgbaf", "corridor":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8941176470588236,0.8980392156862745,0.9019607843137255,0.8901960784313725, - 3600,0.9098039215686274,0.9137254901960784,0.9176470588235294,0.9058823529411765 + 0,0.8823529411764706,0.2627450980392157,0.24705882352941178,0.9372549019607843, + 3600,0.7019607843137254,0.2627450980392157,0.06274509803921569,0.6274509803921569 ] } } }, { - "id":"sampled24", + "id":"sampled_cylinder_material_solidColor_color", "cylinder":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9254901960784314,0.9294117647058824,0.9333333333333333,0.9215686274509803, - 3600,0.9411764705882353,0.9450980392156862,0.9490196078431372,0.9372549019607843 + 0,0.11764705882352941,0.34901960784313724,0.4117647058823529,0.10588235294117647, + 3600,0.5137254901960784,0.5137254901960784,0.6666666666666666,0.596078431372549 ] } } @@ -9520,22 +9520,22 @@ } }, { - "id":"sampled25", + "id":"sampled_cylinder_material_image", "cylinder":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,253,254, - 3600,255,256 + 0,42846,26023, + 3600,19184,35658 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,70,71,72,69, - 3600,74,75,76,73 + 0,59,239,245,44, + 3600,77,93,176,39 ] } } @@ -9543,43 +9543,43 @@ } }, { - "id":"sampled26", + "id":"sampled_cylinder_material_grid", "cylinder":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,78,79,80,77, - 3600,82,83,84,81 + 0,211,199,71,148, + 3600,142,126,167,247 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,325, - 3600,326 + 0,12751, + 3600,16373 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,257,258, - 3600,259,260 + 0,11469,5164, + 3600,8167,36383 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,261,262, - 3600,263,264 + 0,22021,38742, + 3600,45350,43441 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,265,266, - 3600,267,268 + 0,23237,58970, + 3600,62223,62963 ] } } @@ -9587,36 +9587,36 @@ } }, { - "id":"sampled27", + "id":"sampled_cylinder_material_stripe", "cylinder":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,86,87,88,85, - 3600,90,91,92,89 + 0,131,133,216,18, + 3600,78,238,32,231 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,94,95,96,93, - 3600,98,99,100,97 + 0,209,149,133,207, + 3600,53,207,16,210 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,327, - 3600,328 + 0,49593, + 3600,25216 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,329, - 3600,330 + 0,16819, + 3600,12539 ] } } @@ -9624,15 +9624,15 @@ } }, { - "id":"sampled28", + "id":"sampled_cylinder_material_image_color", "cylinder":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9568627450980393,0.9607843137254902,0.9647058823529412,0.9529411764705882, - 3600,0.9725490196078431,0.9764705882352941,0.9803921568627451,0.9686274509803922 + 0,0.7607843137254902,0.13333333333333333,0.23137254901960785,0.6313725490196078, + 3600,0.8823529411764706,0.08235294117647059,0.8,0.08235294117647059 ] } } @@ -9640,15 +9640,15 @@ } }, { - "id":"sampled29", + "id":"sampled_cylinder_material_grid_color", "cylinder":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9882352941176471,0.9921568627450981,0.996078431372549,0.984313725490196, - 3600,0.00392156862745098,0.00784313725490196,0.011764705882352941,0 + 0,0.17647058823529413,0.40784313725490196,0.6235294117647059,0.7294117647058823, + 3600,0.4392156862745098,0.07450980392156863,0.6039215686274509,0.7137254901960784 ] } } @@ -9656,15 +9656,15 @@ } }, { - "id":"sampled30", + "id":"sampled_cylinder_material_stripe_evenColor", "cylinder":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.0196078431372549,0.023529411764705882,0.027450980392156862,0.01568627450980392, - 3600,0.03529411764705882,0.0392156862745098,0.043137254901960784,0.03137254901960784 + 0,0.3803921568627451,0.14901960784313725,0.8,0.6588235294117647, + 3600,0.4627450980392157,0.17254901960784313,0.3254901960784314,0.8549019607843137 ] } } @@ -9672,15 +9672,15 @@ } }, { - "id":"sampled31", + "id":"sampled_cylinder_material_stripe_oddColor", "cylinder":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.050980392156862744,0.054901960784313725,0.058823529411764705,0.047058823529411764, - 3600,0.06666666666666667,0.07058823529411765,0.07450980392156863,0.06274509803921569 + 0,0.20784313725490197,0.4666666666666667,0.42745098039215684,0.10980392156862745, + 3600,0.3137254901960784,0.4980392156862745,0.2,0.4235294117647059 ] } } @@ -9688,27 +9688,27 @@ } }, { - "id":"sampled32", + "id":"sampled_cylinder_outlineColor_rgbaf", "cylinder":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.08235294117647059,0.08627450980392157,0.09019607843137255,0.0784313725490196, - 3600,0.09803921568627451,0.10196078431372549,0.10588235294117647,0.09411764705882353 + 0,0.7803921568627451,0.6588235294117647,0.23529411764705882,0.07058823529411765, + 3600,0.6431372549019608,0.37254901960784315,0.1607843137254902,0.5882352941176471 ] } } }, { - "id":"sampled33", + "id":"sampled_ellipse_material_solidColor_color", "ellipse":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.11372549019607843,0.11764705882352941,0.12156862745098039,0.10980392156862745, - 3600,0.12941176470588237,0.13333333333333333,0.13725490196078433,0.12549019607843137 + 0,0.6784313725490196,0.807843137254902,0.5411764705882353,0.2901960784313726, + 3600,0.7490196078431373,0.25882352941176473,0.7333333333333333,0.24705882352941178 ] } } @@ -9716,22 +9716,22 @@ } }, { - "id":"sampled34", + "id":"sampled_ellipse_material_image", "ellipse":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,269,270, - 3600,271,272 + 0,41027,32928, + 3600,30513,54647 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,102,103,104,101, - 3600,106,107,108,105 + 0,243,25,233,224, + 3600,230,62,9,20 ] } } @@ -9739,43 +9739,43 @@ } }, { - "id":"sampled35", + "id":"sampled_ellipse_material_grid", "ellipse":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,110,111,112,109, - 3600,114,115,116,113 + 0,103,140,88,233, + 3600,224,133,210,4 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,331, - 3600,332 + 0,39159, + 3600,47494 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,273,274, - 3600,275,276 + 0,40987,3488, + 3600,5066,58131 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,277,278, - 3600,279,280 + 0,11466,25388, + 3600,17761,21317 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,281,282, - 3600,283,284 + 0,478,18945, + 3600,25914,29541 ] } } @@ -9783,36 +9783,36 @@ } }, { - "id":"sampled36", + "id":"sampled_ellipse_material_stripe", "ellipse":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,118,119,120,117, - 3600,122,123,124,121 + 0,218,225,186,34, + 3600,109,193,18,44 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,126,127,128,125, - 3600,130,131,132,129 + 0,119,198,180,58, + 3600,79,137,65,31 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,333, - 3600,334 + 0,16964, + 3600,16523 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,335, - 3600,336 + 0,50015, + 3600,64942 ] } } @@ -9820,15 +9820,15 @@ } }, { - "id":"sampled37", + "id":"sampled_ellipse_material_image_color", "ellipse":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.1450980392156863,0.14901960784313725,0.15294117647058825,0.1411764705882353, - 3600,0.1607843137254902,0.16470588235294117,0.16862745098039217,0.1568627450980392 + 0,0.20784313725490197,0.0392156862745098,0.12156862745098039,0.611764705882353, + 3600,0.611764705882353,0.011764705882352941,0.6941176470588235,0.5764705882352941 ] } } @@ -9836,15 +9836,15 @@ } }, { - "id":"sampled38", + "id":"sampled_ellipse_material_grid_color", "ellipse":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.17647058823529413,0.1803921568627451,0.1843137254901961,0.17254901960784313, - 3600,0.19215686274509805,0.19607843137254902,0.2,0.18823529411764706 + 0,0.5803921568627451,0.03137254901960784,0.2784313725490196,0.20392156862745098, + 3600,0.050980392156862744,0.8705882352941177,0.11764705882352941,0.5882352941176471 ] } } @@ -9852,15 +9852,15 @@ } }, { - "id":"sampled39", + "id":"sampled_ellipse_material_stripe_evenColor", "ellipse":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.20784313725490197,0.21176470588235294,0.21568627450980393,0.20392156862745098, - 3600,0.2235294117647059,0.22745098039215686,0.23137254901960785,0.2196078431372549 + 0,0.054901960784313725,0.11764705882352941,0.6235294117647059,0.9294117647058824, + 3600,0.26666666666666666,0.11372549019607843,0.9372549019607843,0.16862745098039217 ] } } @@ -9868,15 +9868,15 @@ } }, { - "id":"sampled40", + "id":"sampled_ellipse_material_stripe_oddColor", "ellipse":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.23921568627450981,0.24313725490196078,0.24705882352941178,0.23529411764705882, - 3600,0.2549019607843137,0.25882352941176473,0.2627450980392157,0.25098039215686274 + 0,0.2627450980392157,0.17254901960784313,0.2823529411764706,0.12941176470588237, + 3600,0.9686274509803922,0.6352941176470588,0.5254901960784314,0.8313725490196079 ] } } @@ -9884,27 +9884,27 @@ } }, { - "id":"sampled41", + "id":"sampled_ellipse_outlineColor_rgbaf", "ellipse":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.27058823529411763,0.27450980392156865,0.2784313725490196,0.26666666666666666, - 3600,0.28627450980392155,0.2901960784313726,0.29411764705882354,0.2823529411764706 + 0,0.7607843137254902,0.3607843137254902,0.2235294117647059,0.611764705882353, + 3600,0.1607843137254902,0.8392156862745098,0.7529411764705882,0.6470588235294118 ] } } }, { - "id":"sampled42", + "id":"sampled_ellipsoid_material_solidColor_color", "ellipsoid":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.30196078431372547,0.3058823529411765,0.30980392156862746,0.2980392156862745, - 3600,0.3176470588235294,0.3215686274509804,0.3254901960784314,0.3137254901960784 + 0,0.592156862745098,0.9764705882352941,0.20784313725490197,0.5019607843137255, + 3600,0.09019607843137255,0.6627450980392157,0.8196078431372549,0.23529411764705882 ] } } @@ -9912,22 +9912,22 @@ } }, { - "id":"sampled43", + "id":"sampled_ellipsoid_material_image", "ellipsoid":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,285,286, - 3600,287,288 + 0,63583,15096, + 3600,48977,60351 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,134,135,136,133, - 3600,138,139,140,137 + 0,49,50,177,104, + 3600,131,27,208,157 ] } } @@ -9935,43 +9935,43 @@ } }, { - "id":"sampled44", + "id":"sampled_ellipsoid_material_grid", "ellipsoid":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,142,143,144,141, - 3600,146,147,148,145 + 0,121,105,70,72, + 3600,204,122,157,57 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,337, - 3600,338 + 0,39442, + 3600,463 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,289,290, - 3600,291,292 + 0,33778,30083, + 3600,5202,18708 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,293,294, - 3600,295,296 + 0,44058,37804, + 3600,34449,3718 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,297,298, - 3600,299,300 + 0,33149,21889, + 3600,35482,10122 ] } } @@ -9979,36 +9979,36 @@ } }, { - "id":"sampled45", + "id":"sampled_ellipsoid_material_stripe", "ellipsoid":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,150,151,152,149, - 3600,154,155,156,153 + 0,153,245,201,196, + 3600,245,113,5,131 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,158,159,160,157, - 3600,162,163,164,161 + 0,99,151,174,111, + 3600,188,89,18,1 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,339, - 3600,340 + 0,44961, + 3600,5690 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,341, - 3600,342 + 0,3351, + 3600,44332 ] } } @@ -10016,15 +10016,15 @@ } }, { - "id":"sampled46", + "id":"sampled_ellipsoid_material_image_color", "ellipsoid":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3333333333333333,0.33725490196078434,0.3411764705882353,0.32941176470588235, - 3600,0.34901960784313724,0.35294117647058826,0.3568627450980392,0.34509803921568627 + 0,0.6549019607843137,0.5176470588235295,0.8588235294117647,0.48627450980392156, + 3600,0.8627450980392157,0.7137254901960784,0.5647058823529412,0.09019607843137255 ] } } @@ -10032,15 +10032,15 @@ } }, { - "id":"sampled47", + "id":"sampled_ellipsoid_material_grid_color", "ellipsoid":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.36470588235294116,0.3686274509803922,0.37254901960784315,0.3607843137254902, - 3600,0.3803921568627451,0.3843137254901961,0.38823529411764707,0.3764705882352941 + 0,0.6,0.42745098039215684,0.20392156862745098,0.2235294117647059, + 3600,0.5254901960784314,0.3058823529411765,0.1607843137254902,0.8196078431372549 ] } } @@ -10048,15 +10048,15 @@ } }, { - "id":"sampled48", + "id":"sampled_ellipsoid_material_stripe_evenColor", "ellipsoid":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.396078431372549,0.4,0.403921568627451,0.39215686274509803, - 3600,0.4117647058823529,0.41568627450980394,0.4196078431372549,0.40784313725490196 + 0,0.30196078431372547,0.5725490196078431,0.8784313725490196,0.2196078431372549, + 3600,0.33725490196078434,0.8352941176470589,0.9647058823529412,0.9098039215686274 ] } } @@ -10064,15 +10064,15 @@ } }, { - "id":"sampled49", + "id":"sampled_ellipsoid_material_stripe_oddColor", "ellipsoid":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.42745098039215684,0.43137254901960786,0.43529411764705883,0.4235294117647059, - 3600,0.44313725490196076,0.4470588235294118,0.45098039215686275,0.4392156862745098 + 0,0.6470588235294118,0.6352941176470588,0.25882352941176473,0.25098039215686274, + 3600,0.9176470588235294,0.2627450980392157,0.6666666666666666,0.9803921568627451 ] } } @@ -10080,63 +10080,63 @@ } }, { - "id":"sampled50", + "id":"sampled_ellipsoid_outlineColor_rgbaf", "ellipsoid":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4588235294117647,0.4627450980392157,0.4666666666666667,0.4549019607843137, - 3600,0.4745098039215686,0.47843137254901963,0.4823529411764706,0.47058823529411764 + 0,0.5529411764705883,0.5490196078431373,0.43137254901960786,0.5686274509803921, + 3600,0.43529411764705883,0.6980392156862745,0.396078431372549,0.7725490196078432 ] } } }, { - "id":"sampled51", + "id":"sampled_label_fillColor_rgbaf", "label":{ "fillColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.49019607843137253,0.49411764705882355,0.4980392156862745,0.48627450980392156, - 3600,0.5058823529411764,0.5098039215686274,0.5137254901960784,0.5019607843137255 + 0,0.7098039215686275,0.5568627450980392,0.33725490196078434,0.24705882352941178, + 3600,0.4392156862745098,0.6941176470588235,0.9019607843137255,0.08235294117647059 ] } } }, { - "id":"sampled52", + "id":"sampled_label_outlineColor_rgbaf", "label":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5215686274509804,0.5254901960784314,0.5294117647058824,0.5176470588235295, - 3600,0.5372549019607843,0.5411764705882353,0.5450980392156862,0.5333333333333333 + 0,0.6313725490196078,0.7098039215686275,0.27058823529411763,0.792156862745098, + 3600,0.43529411764705883,0.17647058823529413,0.23529411764705882,0.6313725490196078 ] } } }, { - "id":"sampled53", + "id":"sampled_model_color_rgbaf", "model":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5529411764705883,0.5568627450980392,0.5607843137254902,0.5490196078431373, - 3600,0.5686274509803921,0.5725490196078431,0.5764705882352941,0.5647058823529412 + 0,0.050980392156862744,0.8392156862745098,0.47058823529411764,0.9568627450980393, + 3600,0.43529411764705883,0.9450980392156862,0.43137254901960786,0.6196078431372549 ] } } }, { - "id":"sampled54", + "id":"sampled_path_material_solidColor_color", "path":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5843137254901961,0.5882352941176471,0.592156862745098,0.5803921568627451, - 3600,0.6,0.6039215686274509,0.6078431372549019,0.596078431372549 + 0,0.5176470588235295,0.5607843137254902,0.2549019607843137,0.49411764705882355, + 3600,0.9058823529411765,0.15294117647058825,0.8549019607843137,0.8901960784313725 ] } } @@ -10144,29 +10144,29 @@ } }, { - "id":"sampled55", + "id":"sampled_path_material_polylineOutline", "path":{ "material":{ "polylineOutline":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,166,167,168,165, - 3600,170,171,172,169 + 0,209,154,35,76, + 3600,186,25,242,140 ] }, "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,174,175,176,173, - 3600,178,179,180,177 + 0,218,241,216,157, + 3600,70,200,183,199 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,343, - 3600,344 + 0,2699, + 3600,1320 ] } } @@ -10174,15 +10174,15 @@ } }, { - "id":"sampled56", + "id":"sampled_path_material_polylineArrow", "path":{ "material":{ "polylineArrow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,182,183,184,181, - 3600,186,187,188,185 + 0,150,221,161,136, + 3600,19,231,68,117 ] } } @@ -10190,22 +10190,22 @@ } }, { - "id":"sampled57", + "id":"sampled_path_material_polylineGlow", "path":{ "material":{ "polylineGlow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,190,191,192,189, - 3600,194,195,196,193 + 0,197,117,196,254, + 3600,18,17,195,230 ] }, "glowPower":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,345, - 3600,346 + 0,5579, + 3600,59951 ] } } @@ -10213,22 +10213,22 @@ } }, { - "id":"sampled58", + "id":"sampled_path_material_image", "path":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,301,302, - 3600,303,304 + 0,25033,47457, + 3600,30413,15734 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,198,199,200,197, - 3600,202,203,204,201 + 0,225,149,237,92, + 3600,234,146,229,9 ] } } @@ -10236,43 +10236,43 @@ } }, { - "id":"sampled59", + "id":"sampled_path_material_grid", "path":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,206,207,208,205, - 3600,210,211,212,209 + 0,99,177,19,203, + 3600,231,169,202,127 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,347, - 3600,348 + 0,63572, + 3600,26232 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,305,306, - 3600,307,308 + 0,34101,5509, + 3600,11991,23086 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,309,310, - 3600,311,312 + 0,39225,58265, + 3600,60443,36332 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,313,314, - 3600,315,316 + 0,25536,59747, + 3600,43164,57256 ] } } @@ -10280,36 +10280,36 @@ } }, { - "id":"sampled60", + "id":"sampled_path_material_stripe", "path":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,214,215,216,213, - 3600,218,219,220,217 + 0,252,51,215,123, + 3600,164,66,75,80 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,222,223,224,221, - 3600,226,227,228,225 + 0,192,190,37,99, + 3600,196,81,62,248 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,349, - 3600,350 + 0,45320, + 3600,41173 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,351, - 3600,352 + 0,42078, + 3600,11633 ] } } @@ -10317,15 +10317,15 @@ } }, { - "id":"sampled61", + "id":"sampled_path_material_polylineOutline_color", "path":{ "material":{ "polylineOutline":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.615686274509804,0.6196078431372549,0.6235294117647059,0.611764705882353, - 3600,0.6313725490196078,0.6352941176470588,0.6392156862745098,0.6274509803921569 + 0,0.49019607843137253,0.4980392156862745,0.8196078431372549,0.7215686274509804, + 3600,0.30980392156862746,0.32941176470588235,0.807843137254902,0.3686274509803922 ] } } @@ -10333,15 +10333,15 @@ } }, { - "id":"sampled62", + "id":"sampled_path_material_polylineOutline_outlineColor", "path":{ "material":{ "polylineOutline":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6470588235294118,0.6509803921568628,0.6549019607843137,0.6431372549019608, - 3600,0.6627450980392157,0.6666666666666666,0.6705882352941176,0.6588235294117647 + 0,0.42745098039215684,0.9607843137254902,0.996078431372549,0.6627450980392157, + 3600,0.9176470588235294,0.6352941176470588,0.6745098039215687,0.2980392156862745 ] } } @@ -10349,15 +10349,15 @@ } }, { - "id":"sampled63", + "id":"sampled_path_material_polylineArrow_color", "path":{ "material":{ "polylineArrow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6784313725490196,0.6823529411764706,0.6862745098039216,0.6745098039215687, - 3600,0.6941176470588235,0.6980392156862745,0.7019607843137254,0.6901960784313725 + 0,0.06666666666666667,0.9725490196078431,0.6862745098039216,0.3254901960784314, + 3600,0.2,0.4823529411764706,0.4980392156862745,0.2196078431372549 ] } } @@ -10365,15 +10365,15 @@ } }, { - "id":"sampled64", + "id":"sampled_path_material_polylineGlow_color", "path":{ "material":{ "polylineGlow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7098039215686275,0.7137254901960784,0.7176470588235294,0.7058823529411765, - 3600,0.7254901960784313,0.7294117647058823,0.7333333333333333,0.7215686274509804 + 0,0.6392156862745098,0.2,0.0196078431372549,0.984313725490196, + 3600,0.3764705882352941,0.8156862745098039,0.9333333333333333,0.023529411764705882 ] } } @@ -10381,15 +10381,15 @@ } }, { - "id":"sampled65", + "id":"sampled_path_material_image_color", "path":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7411764705882353,0.7450980392156863,0.7490196078431373,0.7372549019607844, - 3600,0.7568627450980392,0.7607843137254902,0.7647058823529411,0.7529411764705882 + 0,0.8980392156862745,0.7725490196078432,0.29411764705882354,0.043137254901960784, + 3600,0.8156862745098039,0.09019607843137255,0.8980392156862745,0.30980392156862746 ] } } @@ -10397,15 +10397,15 @@ } }, { - "id":"sampled66", + "id":"sampled_path_material_grid_color", "path":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7725490196078432,0.7764705882352941,0.7803921568627451,0.7686274509803922, - 3600,0.788235294117647,0.792156862745098,0.796078431372549,0.7843137254901961 + 0,0.8901960784313725,0,0.7176470588235294,0.32941176470588235, + 3600,0.4745098039215686,0.6901960784313725,0.043137254901960784,0.25882352941176473 ] } } @@ -10413,15 +10413,15 @@ } }, { - "id":"sampled67", + "id":"sampled_path_material_stripe_evenColor", "path":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.803921568627451,0.807843137254902,0.8117647058823529,0.8, - 3600,0.8196078431372549,0.8235294117647058,0.8274509803921568,0.8156862745098039 + 0,0.3686274509803922,0.5843137254901961,0.8313725490196079,0.5411764705882353, + 3600,0.3176470588235294,0.4,0.8392156862745098,0.5372549019607843 ] } } @@ -10429,15 +10429,15 @@ } }, { - "id":"sampled68", + "id":"sampled_path_material_stripe_oddColor", "path":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8352941176470589,0.8392156862745098,0.8431372549019608,0.8313725490196079, - 3600,0.8509803921568627,0.8549019607843137,0.8588235294117647,0.8470588235294118 + 0,0.1450980392156863,0.5882352941176471,0.9176470588235294,0.6078431372549019, + 3600,0.11764705882352941,0.07058823529411765,0.9019607843137255,0.5254901960784314 ] } } @@ -10445,39 +10445,39 @@ } }, { - "id":"sampled69", + "id":"sampled_point_color_rgbaf", "point":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8666666666666667,0.8705882352941177,0.8745098039215686,0.8627450980392157, - 3600,0.8823529411764706,0.8862745098039215,0.8901960784313725,0.8784313725490196 + 0,0.6784313725490196,0.3568627450980392,0.5882352941176471,0.796078431372549, + 3600,0.9686274509803922,0.2980392156862745,0.5137254901960784,0.6313725490196078 ] } } }, { - "id":"sampled70", + "id":"sampled_point_outlineColor_rgbaf", "point":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8980392156862745,0.9019607843137255,0.9058823529411765,0.8941176470588236, - 3600,0.9137254901960784,0.9176470588235294,0.9215686274509803,0.9098039215686274 + 0,0.42745098039215684,0.8941176470588236,0.16862745098039217,0.7686274509803922, + 3600,0.4588235294117647,0.4666666666666667,0.38823529411764707,0.792156862745098 ] } } }, { - "id":"sampled71", + "id":"sampled_polygon_material_solidColor_color", "polygon":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9294117647058824,0.9333333333333333,0.9372549019607843,0.9254901960784314, - 3600,0.9450980392156862,0.9490196078431372,0.9529411764705882,0.9411764705882353 + 0,0.3058823529411765,0.615686274509804,0.33725490196078434,0.8941176470588236, + 3600,0.1843137254901961,0.6196078431372549,0.35294117647058826,0.03137254901960784 ] } } @@ -10485,22 +10485,22 @@ } }, { - "id":"sampled72", + "id":"sampled_polygon_material_image", "polygon":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,317,318, - 3600,319,320 + 0,19536,17484, + 3600,46291,28852 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,230,231,232,229, - 3600,234,235,236,233 + 0,157,5,231,29, + 3600,53,2,148,36 ] } } @@ -10508,43 +10508,43 @@ } }, { - "id":"sampled73", + "id":"sampled_polygon_material_grid", "polygon":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,238,239,240,237, - 3600,242,243,244,241 + 0,179,243,247,124, + 3600,15,128,159,42 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,353, - 3600,354 + 0,11565, + 3600,42611 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,321,322, - 3600,323,324 + 0,47065,65463, + 3600,29170,16497 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,325,326, - 3600,327,328 + 0,62674,26868, + 3600,22008,39509 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,329,330, - 3600,331,332 + 0,28793,1648, + 3600,44991,42159 ] } } @@ -10552,36 +10552,36 @@ } }, { - "id":"sampled74", + "id":"sampled_polygon_material_stripe", "polygon":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,246,247,248,245, - 3600,250,251,252,249 + 0,113,233,143,146, + 3600,106,138,115,44 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,254,0,1,253, - 3600,3,4,5,2 + 0,104,146,138,244, + 3600,161,95,25,36 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,355, - 3600,356 + 0,4711, + 3600,65087 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,357, - 3600,358 + 0,44013, + 3600,7595 ] } } @@ -10589,15 +10589,15 @@ } }, { - "id":"sampled75", + "id":"sampled_polygon_material_image_color", "polygon":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9607843137254902,0.9647058823529412,0.9686274509803922,0.9568627450980393, - 3600,0.9764705882352941,0.9803921568627451,0.984313725490196,0.9725490196078431 + 0,0.5019607843137255,0.08235294117647059,0.2823529411764706,0.3058823529411765, + 3600,0.07450980392156863,0.6549019607843137,0.6,0.8862745098039215 ] } } @@ -10605,15 +10605,15 @@ } }, { - "id":"sampled76", + "id":"sampled_polygon_material_grid_color", "polygon":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9921568627450981,0.996078431372549,0,0.9882352941176471, - 3600,0.00784313725490196,0.011764705882352941,0.01568627450980392,0.00392156862745098 + 0,0.19215686274509805,0.7098039215686275,0.807843137254902,0.7372549019607844, + 3600,0.6745098039215687,0.023529411764705882,0.7647058823529411,0.9764705882352941 ] } } @@ -10621,15 +10621,15 @@ } }, { - "id":"sampled77", + "id":"sampled_polygon_material_stripe_evenColor", "polygon":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.023529411764705882,0.027450980392156862,0.03137254901960784,0.0196078431372549, - 3600,0.0392156862745098,0.043137254901960784,0.047058823529411764,0.03529411764705882 + 0,0.5686274509803921,0.35294117647058826,0.396078431372549,0.43529411764705883, + 3600,0.27450980392156865,0.4392156862745098,0.6862745098039216,0.4196078431372549 ] } } @@ -10637,15 +10637,15 @@ } }, { - "id":"sampled78", + "id":"sampled_polygon_material_stripe_oddColor", "polygon":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.054901960784313725,0.058823529411764705,0.06274509803921569,0.050980392156862744, - 3600,0.07058823529411765,0.07450980392156863,0.0784313725490196,0.06666666666666667 + 0,0.3254901960784314,0.34901960784313724,0.5803921568627451,0.7254901960784313, + 3600,0.5686274509803921,0.6901960784313725,0.00392156862745098,0.8588235294117647 ] } } @@ -10653,27 +10653,27 @@ } }, { - "id":"sampled79", + "id":"sampled_polygon_outlineColor_rgbaf", "polygon":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.08627450980392157,0.09019607843137255,0.09411764705882353,0.08235294117647059, - 3600,0.10196078431372549,0.10588235294117647,0.10980392156862745,0.09803921568627451 + 0,0.6745098039215687,0.5568627450980392,0.11372549019607843,0.6, + 3600,0.6509803921568628,0.8274509803921568,0.5372549019607843,0.7137254901960784 ] } } }, { - "id":"sampled80", + "id":"sampled_polyline_material_solidColor_color", "polyline":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.11764705882352941,0.12156862745098039,0.12549019607843137,0.11372549019607843, - 3600,0.13333333333333333,0.13725490196078433,0.1411764705882353,0.12941176470588237 + 0,0.9764705882352941,0.9490196078431372,0.45098039215686275,0.4666666666666667, + 3600,0.2627450980392157,0.5098039215686274,0.5372549019607843,0.8509803921568627 ] } } @@ -10681,29 +10681,29 @@ } }, { - "id":"sampled81", + "id":"sampled_polyline_material_polylineOutline", "polyline":{ "material":{ "polylineOutline":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,7,8,9,6, - 3600,11,12,13,10 + 0,245,92,109,218, + 3600,241,96,196,167 ] }, "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,15,16,17,14, - 3600,19,20,21,18 + 0,174,2,11,244, + 3600,31,126,140,138 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,359, - 3600,360 + 0,33279, + 3600,26855 ] } } @@ -10711,15 +10711,15 @@ } }, { - "id":"sampled82", + "id":"sampled_polyline_material_polylineArrow", "polyline":{ "material":{ "polylineArrow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,23,24,25,22, - 3600,27,28,29,26 + 0,141,137,252,157, + 3600,8,236,198,57 ] } } @@ -10727,22 +10727,22 @@ } }, { - "id":"sampled83", + "id":"sampled_polyline_material_polylineGlow", "polyline":{ "material":{ "polylineGlow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,31,32,33,30, - 3600,35,36,37,34 + 0,174,178,78,176, + 3600,79,191,38,195 ] }, "glowPower":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,361, - 3600,362 + 0,55378, + 3600,60643 ] } } @@ -10750,22 +10750,22 @@ } }, { - "id":"sampled84", + "id":"sampled_polyline_material_image", "polyline":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,333,334, - 3600,335,336 + 0,50957,35783, + 3600,59533,6.5e4 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,39,40,41,38, - 3600,43,44,45,42 + 0,174,154,113,185, + 3600,123,236,118,155 ] } } @@ -10773,43 +10773,43 @@ } }, { - "id":"sampled85", + "id":"sampled_polyline_material_grid", "polyline":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,47,48,49,46, - 3600,51,52,53,50 + 0,26,89,33,224, + 3600,215,131,203,1 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,363, - 3600,364 + 0,34343, + 3600,63863 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,337,338, - 3600,339,340 + 0,52308,51660, + 3600,45338,51633 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,341,342, - 3600,343,344 + 0,47738,52154, + 3600,42674,38822 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,345,346, - 3600,347,348 + 0,29194,52338, + 3600,25319,28514 ] } } @@ -10817,36 +10817,36 @@ } }, { - "id":"sampled86", + "id":"sampled_polyline_material_stripe", "polyline":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,55,56,57,54, - 3600,59,60,61,58 + 0,141,205,78,73, + 3600,107,159,97,34 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,63,64,65,62, - 3600,67,68,69,66 + 0,19,76,127,197, + 3600,214,222,19,168 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,365, - 3600,366 + 0,51126, + 3600,10891 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,367, - 3600,368 + 0,25313, + 3600,22020 ] } } @@ -10854,15 +10854,15 @@ } }, { - "id":"sampled87", + "id":"sampled_polyline_material_polylineOutline_color", "polyline":{ "material":{ "polylineOutline":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.14901960784313725,0.15294117647058825,0.1568627450980392,0.1450980392156863, - 3600,0.16470588235294117,0.16862745098039217,0.17254901960784313,0.1607843137254902 + 0,0.3843137254901961,0.16862745098039217,0.44313725490196076,0.6588235294117647, + 3600,0.027450980392156862,0.6470588235294118,0.396078431372549,0.10588235294117647 ] } } @@ -10870,15 +10870,15 @@ } }, { - "id":"sampled88", + "id":"sampled_polyline_material_polylineOutline_outlineColor", "polyline":{ "material":{ "polylineOutline":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.1803921568627451,0.1843137254901961,0.18823529411764706,0.17647058823529413, - 3600,0.19607843137254902,0.2,0.20392156862745098,0.19215686274509805 + 0,0.08235294117647059,0.054901960784313725,0.14901960784313725,0.5803921568627451, + 3600,0.7333333333333333,0.792156862745098,0.6392156862745098,0.5647058823529412 ] } } @@ -10886,15 +10886,15 @@ } }, { - "id":"sampled89", + "id":"sampled_polyline_material_polylineArrow_color", "polyline":{ "material":{ "polylineArrow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.21176470588235294,0.21568627450980393,0.2196078431372549,0.20784313725490197, - 3600,0.22745098039215686,0.23137254901960785,0.23529411764705882,0.2235294117647059 + 0,0.5215686274509804,0.7254901960784313,0.8784313725490196,0.8235294117647058, + 3600,0.7725490196078432,0.8627450980392157,0.3254901960784314,0 ] } } @@ -10902,15 +10902,15 @@ } }, { - "id":"sampled90", + "id":"sampled_polyline_material_polylineGlow_color", "polyline":{ "material":{ "polylineGlow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.24313725490196078,0.24705882352941178,0.25098039215686274,0.23921568627450981, - 3600,0.25882352941176473,0.2627450980392157,0.26666666666666666,0.2549019607843137 + 0,0.7058823529411765,0.9019607843137255,0.0784313725490196,0.3568627450980392, + 3600,0.5176470588235295,0.20784313725490197,0.7019607843137254,0.10588235294117647 ] } } @@ -10918,15 +10918,15 @@ } }, { - "id":"sampled91", + "id":"sampled_polyline_material_image_color", "polyline":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.27450980392156865,0.2784313725490196,0.2823529411764706,0.27058823529411763, - 3600,0.2901960784313726,0.29411764705882354,0.2980392156862745,0.28627450980392155 + 0,0.796078431372549,0.7411764705882353,0.7411764705882353,0.34901960784313724, + 3600,0.9254901960784314,0.26666666666666666,0.09411764705882353,0.5568627450980392 ] } } @@ -10934,15 +10934,15 @@ } }, { - "id":"sampled92", + "id":"sampled_polyline_material_grid_color", "polyline":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3058823529411765,0.30980392156862746,0.3137254901960784,0.30196078431372547, - 3600,0.3215686274509804,0.3254901960784314,0.32941176470588235,0.3176470588235294 + 0,0.5450980392156862,0.8470588235294118,0.3411764705882353,0.10196078431372549, + 3600,0.43137254901960786,0.9529411764705882,0.1843137254901961,0.1843137254901961 ] } } @@ -10950,15 +10950,15 @@ } }, { - "id":"sampled93", + "id":"sampled_polyline_material_stripe_evenColor", "polyline":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.33725490196078434,0.3411764705882353,0.34509803921568627,0.3333333333333333, - 3600,0.35294117647058826,0.3568627450980392,0.3607843137254902,0.34901960784313724 + 0,0.807843137254902,0.2627450980392157,0.8980392156862745,0.8117647058823529, + 3600,0.41568627450980394,0.9686274509803922,0.09803921568627451,0.4235294117647059 ] } } @@ -10966,15 +10966,15 @@ } }, { - "id":"sampled94", + "id":"sampled_polyline_material_stripe_oddColor", "polyline":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3686274509803922,0.37254901960784315,0.3764705882352941,0.36470588235294116, - 3600,0.3843137254901961,0.38823529411764707,0.39215686274509803,0.3803921568627451 + 0,0.42745098039215684,0.40784313725490196,0.47058823529411764,0.8745098039215686, + 3600,0.5098039215686274,0.42745098039215684,0.9764705882352941,0 ] } } @@ -10982,27 +10982,27 @@ } }, { - "id":"sampled95", + "id":"sampled_rectangle_coordinates_wsenDegrees", "rectangle":{ "coordinates":{ "epoch":"2016-06-17T12:00:00Z", "wsenDegrees":[ - 0,17,18,19,20, - 3600,21,22,23,24 + 0,35,18,38,15, + 3600,38,1,12,30 ] } } }, { - "id":"sampled96", + "id":"sampled_rectangle_material_solidColor_color", "rectangle":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4,0.403921568627451,0.40784313725490196,0.396078431372549, - 3600,0.41568627450980394,0.4196078431372549,0.4235294117647059,0.4117647058823529 + 0,0.20392156862745098,0.24313725490196078,0.5764705882352941,0.09803921568627451, + 3600,0.9137254901960784,0.8313725490196079,0.7607843137254902,0.9529411764705882 ] } } @@ -11010,22 +11010,22 @@ } }, { - "id":"sampled97", + "id":"sampled_rectangle_material_image", "rectangle":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,349,350, - 3600,351,352 + 0,3711,44302, + 3600,52318,60108 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,71,72,73,70, - 3600,75,76,77,74 + 0,49,142,97,190, + 3600,189,250,238,118 ] } } @@ -11033,43 +11033,43 @@ } }, { - "id":"sampled98", + "id":"sampled_rectangle_material_grid", "rectangle":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,79,80,81,78, - 3600,83,84,85,82 + 0,95,53,115,82, + 3600,204,71,209,187 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,369, - 3600,370 + 0,48813, + 3600,21269 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,353,354, - 3600,355,356 + 0,22945,32857, + 3600,55972,34522 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,357,358, - 3600,359,360 + 0,37146,39825, + 3600,64636,13052 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,361,362, - 3600,363,364 + 0,8882,38690, + 3600,8857,21794 ] } } @@ -11077,36 +11077,36 @@ } }, { - "id":"sampled99", + "id":"sampled_rectangle_material_stripe", "rectangle":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,87,88,89,86, - 3600,91,92,93,90 + 0,243,96,246,5, + 3600,74,28,207,87 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,95,96,97,94, - 3600,99,100,101,98 + 0,147,18,134,10, + 3600,59,151,72,114 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,371, - 3600,372 + 0,57328, + 3600,2602 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,373, - 3600,374 + 0,29729, + 3600,30206 ] } } @@ -11114,15 +11114,15 @@ } }, { - "id":"sampled100", + "id":"sampled_rectangle_material_image_color", "rectangle":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.43137254901960786,0.43529411764705883,0.4392156862745098,0.42745098039215684, - 3600,0.4470588235294118,0.45098039215686275,0.4549019607843137,0.44313725490196076 + 0,0.5529411764705883,0.10196078431372549,0.7725490196078432,0.00392156862745098, + 3600,0.01568627450980392,0.9647058823529412,0.592156862745098,0.396078431372549 ] } } @@ -11130,15 +11130,15 @@ } }, { - "id":"sampled101", + "id":"sampled_rectangle_material_grid_color", "rectangle":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4627450980392157,0.4666666666666667,0.47058823529411764,0.4588235294117647, - 3600,0.47843137254901963,0.4823529411764706,0.48627450980392156,0.4745098039215686 + 0,0.49019607843137253,0.3843137254901961,0.9372549019607843,0.16862745098039217, + 3600,0.39215686274509803,0.7568627450980392,0.4549019607843137,0.5294117647058824 ] } } @@ -11146,15 +11146,15 @@ } }, { - "id":"sampled102", + "id":"sampled_rectangle_material_stripe_evenColor", "rectangle":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.49411764705882355,0.4980392156862745,0.5019607843137255,0.49019607843137253, - 3600,0.5098039215686274,0.5137254901960784,0.5176470588235295,0.5058823529411764 + 0,0.3215686274509804,0.7764705882352941,0.22745098039215686,0.08235294117647059, + 3600,0.9294117647058824,0.7254901960784313,0.00392156862745098,0.36470588235294116 ] } } @@ -11162,15 +11162,15 @@ } }, { - "id":"sampled103", + "id":"sampled_rectangle_material_stripe_oddColor", "rectangle":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5254901960784314,0.5294117647058824,0.5333333333333333,0.5215686274509804, - 3600,0.5411764705882353,0.5450980392156862,0.5490196078431373,0.5372549019607843 + 0,0.984313725490196,0.8313725490196079,0.8274509803921568,0.9254901960784314, + 3600,0.1450980392156863,0.01568627450980392,0.3803921568627451,0.49019607843137253 ] } } @@ -11178,27 +11178,27 @@ } }, { - "id":"sampled104", + "id":"sampled_rectangle_outlineColor_rgbaf", "rectangle":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5568627450980392,0.5607843137254902,0.5647058823529412,0.5529411764705883, - 3600,0.5725490196078431,0.5764705882352941,0.5803921568627451,0.5686274509803921 + 0,0.9803921568627451,0.4666666666666667,0.7529411764705882,0.7098039215686275, + 3600,0.5490196078431373,0.9490196078431372,0.5450980392156862,0.3803921568627451 ] } } }, { - "id":"sampled105", + "id":"sampled_wall_material_solidColor_color", "wall":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5882352941176471,0.592156862745098,0.596078431372549,0.5843137254901961, - 3600,0.6039215686274509,0.6078431372549019,0.611764705882353,0.6 + 0,0.3843137254901961,0.9647058823529412,0.8274509803921568,0.8156862745098039, + 3600,0.00784313725490196,0.3254901960784314,0.9529411764705882,0.054901960784313725 ] } } @@ -11206,22 +11206,22 @@ } }, { - "id":"sampled106", + "id":"sampled_wall_material_image", "wall":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,365,366, - 3600,367,368 + 0,13369,38196, + 3600,36874,55696 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,103,104,105,102, - 3600,107,108,109,106 + 0,1,152,139,83, + 3600,127,110,56,69 ] } } @@ -11229,43 +11229,43 @@ } }, { - "id":"sampled107", + "id":"sampled_wall_material_grid", "wall":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,111,112,113,110, - 3600,115,116,117,114 + 0,243,153,88,43, + 3600,169,159,82,75 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,375, - 3600,376 + 0,32179, + 3600,55901 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,369,370, - 3600,371,372 + 0,46941,30391, + 3600,51565,6089 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,373,374, - 3600,375,376 + 0,35543,16778, + 3600,32904,18048 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,377,378, - 3600,379,380 + 0,2955,19723, + 3600,58723,15333 ] } } @@ -11273,36 +11273,36 @@ } }, { - "id":"sampled108", + "id":"sampled_wall_material_stripe", "wall":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,119,120,121,118, - 3600,123,124,125,122 + 0,204,233,122,70, + 3600,215,44,132,84 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,127,128,129,126, - 3600,131,132,133,130 + 0,20,6,10,253, + 3600,96,118,90,117 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,377, - 3600,378 + 0,63629, + 3600,38486 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,379, - 3600,380 + 0,41791, + 3600,56258 ] } } @@ -11310,15 +11310,15 @@ } }, { - "id":"sampled109", + "id":"sampled_wall_material_image_color", "wall":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6196078431372549,0.6235294117647059,0.6274509803921569,0.615686274509804, - 3600,0.6352941176470588,0.6392156862745098,0.6431372549019608,0.6313725490196078 + 0,0.5843137254901961,0.7529411764705882,0.5882352941176471,0.7333333333333333, + 3600,0.30980392156862746,0.9882352941176471,0.0784313725490196,0.4588235294117647 ] } } @@ -11326,15 +11326,15 @@ } }, { - "id":"sampled110", + "id":"sampled_wall_material_grid_color", "wall":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6509803921568628,0.6549019607843137,0.6588235294117647,0.6470588235294118, - 3600,0.6666666666666666,0.6705882352941176,0.6745098039215687,0.6627450980392157 + 0,0.2784313725490196,0.5490196078431373,0.9647058823529412,0.9607843137254902, + 3600,0.7098039215686275,0.8313725490196079,0.6784313725490196,0.40784313725490196 ] } } @@ -11342,15 +11342,15 @@ } }, { - "id":"sampled111", + "id":"sampled_wall_material_stripe_evenColor", "wall":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6823529411764706,0.6862745098039216,0.6901960784313725,0.6784313725490196, - 3600,0.6980392156862745,0.7019607843137254,0.7058823529411765,0.6941176470588235 + 0,0.09019607843137255,0.24313725490196078,0.5372549019607843,0.16862745098039217, + 3600,0.38823529411764707,0.8470588235294118,0.25882352941176473,0.11372549019607843 ] } } @@ -11358,15 +11358,15 @@ } }, { - "id":"sampled112", + "id":"sampled_wall_material_stripe_oddColor", "wall":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7137254901960784,0.7176470588235294,0.7215686274509804,0.7098039215686275, - 3600,0.7294117647058823,0.7333333333333333,0.7372549019607844,0.7254901960784313 + 0,0.34509803921568627,0.0196078431372549,0.054901960784313725,0.6627450980392157, + 3600,0.6941176470588235,0.8901960784313725,0.3803921568627451,0.3176470588235294 ] } } @@ -11374,39 +11374,39 @@ } }, { - "id":"sampled113", + "id":"sampled_wall_outlineColor_rgbaf", "wall":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7450980392156863,0.7490196078431373,0.7529411764705882,0.7411764705882353, - 3600,0.7607843137254902,0.7647058823529411,0.7686274509803922,0.7568627450980392 + 0,0.9333333333333333,0.10588235294117647,0.06274509803921569,0.396078431372549, + 3600,0.9019607843137255,0.43529411764705883,0.35294117647058826,0.7137254901960784 ] } } }, { - "id":"sampled114", + "id":"sampled_conicSensor_intersectionColor_rgbaf", "agi_conicSensor":{ "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7764705882352941,0.7803921568627451,0.7843137254901961,0.7725490196078432, - 3600,0.792156862745098,0.796078431372549,0.8,0.788235294117647 + 0,0.6784313725490196,0.2901960784313726,0.6666666666666666,0.21568627450980393, + 3600,0.32941176470588235,0.38823529411764707,0.23529411764705882,0.26666666666666666 ] } } }, { - "id":"sampled115", + "id":"sampled_conicSensor_lateralSurfaceMaterial_solidColor_color", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.807843137254902,0.8117647058823529,0.8156862745098039,0.803921568627451, - 3600,0.8235294117647058,0.8274509803921568,0.8313725490196079,0.8196078431372549 + 0,0.40784313725490196,0.7843137254901961,0.8784313725490196,0.9803921568627451, + 3600,0.6470588235294118,0.9176470588235294,0.12156862745098039,0.29411764705882354 ] } } @@ -11414,22 +11414,22 @@ } }, { - "id":"sampled116", + "id":"sampled_conicSensor_lateralSurfaceMaterial_image", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,381,382, - 3600,383,384 + 0,26885,9577, + 3600,43369,23209 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,135,136,137,134, - 3600,139,140,141,138 + 0,190,252,218,221, + 3600,110,253,27,68 ] } } @@ -11437,43 +11437,43 @@ } }, { - "id":"sampled117", + "id":"sampled_conicSensor_lateralSurfaceMaterial_grid", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,143,144,145,142, - 3600,147,148,149,146 + 0,78,27,189,149, + 3600,17,205,226,252 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,381, - 3600,382 + 0,3298, + 3600,62899 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,385,386, - 3600,387,388 + 0,29248,29298, + 3600,10801,50474 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,389,390, - 3600,391,392 + 0,29571,1651, + 3600,24960,22113 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,393,394, - 3600,395,396 + 0,55103,11223, + 3600,45946,59571 ] } } @@ -11481,36 +11481,36 @@ } }, { - "id":"sampled118", + "id":"sampled_conicSensor_lateralSurfaceMaterial_stripe", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,151,152,153,150, - 3600,155,156,157,154 + 0,5,144,249,28, + 3600,83,107,130,252 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,159,160,161,158, - 3600,163,164,165,162 + 0,228,116,212,245, + 3600,59,44,249,118 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,383, - 3600,384 + 0,51637, + 3600,63711 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,385, - 3600,386 + 0,48031, + 3600,63777 ] } } @@ -11518,15 +11518,15 @@ } }, { - "id":"sampled119", + "id":"sampled_conicSensor_lateralSurfaceMaterial_image_color", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8392156862745098,0.8431372549019608,0.8470588235294118,0.8352941176470589, - 3600,0.8549019607843137,0.8588235294117647,0.8627450980392157,0.8509803921568627 + 0,0.6470588235294118,0.2980392156862745,0.403921568627451,0.1843137254901961, + 3600,0.42745098039215684,0.47843137254901963,0.26666666666666666,0.2980392156862745 ] } } @@ -11534,15 +11534,15 @@ } }, { - "id":"sampled120", + "id":"sampled_conicSensor_lateralSurfaceMaterial_grid_color", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8705882352941177,0.8745098039215686,0.8784313725490196,0.8666666666666667, - 3600,0.8862745098039215,0.8901960784313725,0.8941176470588236,0.8823529411764706 + 0,0.9568627450980393,0.1450980392156863,0.2627450980392157,0.10980392156862745, + 3600,0.25882352941176473,0.00784313725490196,0.9019607843137255,0.23529411764705882 ] } } @@ -11550,15 +11550,15 @@ } }, { - "id":"sampled121", + "id":"sampled_conicSensor_lateralSurfaceMaterial_stripe_evenColor", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9019607843137255,0.9058823529411765,0.9098039215686274,0.8980392156862745, - 3600,0.9176470588235294,0.9215686274509803,0.9254901960784314,0.9137254901960784 + 0,0.6627450980392157,0.28627450980392155,0.06666666666666667,0.20392156862745098, + 3600,0.023529411764705882,0.5254901960784314,0.2980392156862745,0.6588235294117647 ] } } @@ -11566,15 +11566,15 @@ } }, { - "id":"sampled122", + "id":"sampled_conicSensor_lateralSurfaceMaterial_stripe_oddColor", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9333333333333333,0.9372549019607843,0.9411764705882353,0.9294117647058824, - 3600,0.9490196078431372,0.9529411764705882,0.9568627450980393,0.9450980392156862 + 0,0.7568627450980392,0.09411764705882353,0.8666666666666667,0.9921568627450981, + 3600,0.058823529411764705,0.1411764705882353,0.6470588235294118,0.3803921568627451 ] } } @@ -11582,15 +11582,15 @@ } }, { - "id":"sampled123", + "id":"sampled_conicSensor_ellipsoidSurfaceMaterial_solidColor_color", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9647058823529412,0.9686274509803922,0.9725490196078431,0.9607843137254902, - 3600,0.9803921568627451,0.984313725490196,0.9882352941176471,0.9764705882352941 + 0,0.2,0.08235294117647059,0.5098039215686274,0.2549019607843137, + 3600,0.9019607843137255,0.592156862745098,0.8352941176470589,0.5725490196078431 ] } } @@ -11598,22 +11598,22 @@ } }, { - "id":"sampled124", + "id":"sampled_conicSensor_ellipsoidSurfaceMaterial_image", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,397,398, - 3600,399,400 + 0,15751,40509, + 3600,35728,34187 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,167,168,169,166, - 3600,171,172,173,170 + 0,146,78,244,4, + 3600,29,181,189,242 ] } } @@ -11621,43 +11621,43 @@ } }, { - "id":"sampled125", + "id":"sampled_conicSensor_ellipsoidSurfaceMaterial_grid", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,175,176,177,174, - 3600,179,180,181,178 + 0,73,204,84,240, + 3600,52,49,65,80 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,387, - 3600,388 + 0,24247, + 3600,16802 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,401,402, - 3600,403,404 + 0,27080,64105, + 3600,2556,11273 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,405,406, - 3600,407,408 + 0,56653,64989, + 3600,16857,36929 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,409,410, - 3600,411,412 + 0,44206,26796, + 3600,38284,28309 ] } } @@ -11665,36 +11665,36 @@ } }, { - "id":"sampled126", + "id":"sampled_conicSensor_ellipsoidSurfaceMaterial_stripe", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,183,184,185,182, - 3600,187,188,189,186 + 0,166,158,42,119, + 3600,52,206,201,181 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,191,192,193,190, - 3600,195,196,197,194 + 0,103,139,237,102, + 3600,35,89,140,235 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,389, - 3600,390 + 0,50863, + 3600,48603 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,391, - 3600,392 + 0,52624, + 3600,10786 ] } } @@ -11702,15 +11702,15 @@ } }, { - "id":"sampled127", + "id":"sampled_conicSensor_ellipsoidSurfaceMaterial_image_color", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.996078431372549,0,0.00392156862745098,0.9921568627450981, - 3600,0.011764705882352941,0.01568627450980392,0.0196078431372549,0.00784313725490196 + 0,0.8745098039215686,0.24705882352941178,0.5137254901960784,0.5529411764705883, + 3600,0,0.4745098039215686,0.1607843137254902,0.7098039215686275 ] } } @@ -11718,15 +11718,15 @@ } }, { - "id":"sampled128", + "id":"sampled_conicSensor_ellipsoidSurfaceMaterial_grid_color", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.027450980392156862,0.03137254901960784,0.03529411764705882,0.023529411764705882, - 3600,0.043137254901960784,0.047058823529411764,0.050980392156862744,0.0392156862745098 + 0,0.5725490196078431,0.34901960784313724,0.35294117647058826,0.5607843137254902, + 3600,0.9725490196078431,0.34901960784313724,0.5450980392156862,0.4588235294117647 ] } } @@ -11734,15 +11734,15 @@ } }, { - "id":"sampled129", + "id":"sampled_conicSensor_ellipsoidSurfaceMaterial_stripe_evenColor", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.058823529411764705,0.06274509803921569,0.06666666666666667,0.054901960784313725, - 3600,0.07450980392156863,0.0784313725490196,0.08235294117647059,0.07058823529411765 + 0,0.8235294117647058,0.8745098039215686,0.7803921568627451,0.2901960784313726, + 3600,0.2980392156862745,0.5568627450980392,0.03529411764705882,0.47843137254901963 ] } } @@ -11750,15 +11750,15 @@ } }, { - "id":"sampled130", + "id":"sampled_conicSensor_ellipsoidSurfaceMaterial_stripe_oddColor", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.09019607843137255,0.09411764705882353,0.09803921568627451,0.08627450980392157, - 3600,0.10588235294117647,0.10980392156862745,0.11372549019607843,0.10196078431372549 + 0,0.40784313725490196,0.4588235294117647,0.5647058823529412,0.7647058823529411, + 3600,0.1803921568627451,0.49411764705882355,0.47843137254901963,0.7372549019607844 ] } } @@ -11766,15 +11766,15 @@ } }, { - "id":"sampled131", + "id":"sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.12156862745098039,0.12549019607843137,0.12941176470588237,0.11764705882352941, - 3600,0.13725490196078433,0.1411764705882353,0.1450980392156863,0.13333333333333333 + 0,0.07450980392156863,0.9411764705882353,0.5568627450980392,0.8901960784313725, + 3600,0.2901960784313726,0.3803921568627451,0.7607843137254902,0.4117647058823529 ] } } @@ -11782,22 +11782,22 @@ } }, { - "id":"sampled132", + "id":"sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_image", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,413,414, - 3600,415,416 + 0,60426,50668, + 3600,37349,39057 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,199,200,201,198, - 3600,203,204,205,202 + 0,219,106,121,33, + 3600,231,17,163,9 ] } } @@ -11805,43 +11805,43 @@ } }, { - "id":"sampled133", + "id":"sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_grid", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,207,208,209,206, - 3600,211,212,213,210 + 0,95,6,140,189, + 3600,8,141,87,20 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,393, - 3600,394 + 0,22274, + 3600,42079 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,417,418, - 3600,419,420 + 0,1497,17669, + 3600,52287,29644 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,421,422, - 3600,423,424 + 0,49813,39106, + 3600,56035,42714 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,425,426, - 3600,427,428 + 0,1548,39430, + 3600,20317,63823 ] } } @@ -11849,36 +11849,36 @@ } }, { - "id":"sampled134", + "id":"sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,215,216,217,214, - 3600,219,220,221,218 + 0,82,72,9,165, + 3600,19,34,239,152 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,223,224,225,222, - 3600,227,228,229,226 + 0,69,252,0,171, + 3600,156,96,221,7 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,395, - 3600,396 + 0,50512, + 3600,37692 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,397, - 3600,398 + 0,10637, + 3600,26810 ] } } @@ -11886,15 +11886,15 @@ } }, { - "id":"sampled135", + "id":"sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_image_color", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.15294117647058825,0.1568627450980392,0.1607843137254902,0.14901960784313725, - 3600,0.16862745098039217,0.17254901960784313,0.17647058823529413,0.16470588235294117 + 0,0.7764705882352941,0.796078431372549,0.9019607843137255,0.19215686274509805, + 3600,0.26666666666666666,0.34901960784313724,0.5882352941176471,0.7019607843137254 ] } } @@ -11902,15 +11902,15 @@ } }, { - "id":"sampled136", + "id":"sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_grid_color", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.1843137254901961,0.18823529411764706,0.19215686274509805,0.1803921568627451, - 3600,0.2,0.20392156862745098,0.20784313725490197,0.19607843137254902 + 0,0.00784313725490196,0.5215686274509804,0.14901960784313725,0.3568627450980392, + 3600,0.6235294117647059,0.2823529411764706,0.01568627450980392,0.18823529411764706 ] } } @@ -11918,15 +11918,15 @@ } }, { - "id":"sampled137", + "id":"sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.21568627450980393,0.2196078431372549,0.2235294117647059,0.21176470588235294, - 3600,0.23137254901960785,0.23529411764705882,0.23921568627450981,0.22745098039215686 + 0,0.14901960784313725,0.596078431372549,0.36470588235294116,0.13333333333333333, + 3600,0.9333333333333333,0.8823529411764706,0.8549019607843137,0.33725490196078434 ] } } @@ -11934,15 +11934,15 @@ } }, { - "id":"sampled138", + "id":"sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.24705882352941178,0.25098039215686274,0.2549019607843137,0.24313725490196078, - 3600,0.2627450980392157,0.26666666666666666,0.27058823529411763,0.25882352941176473 + 0,0.3764705882352941,0.050980392156862744,0.7215686274509804,0.027450980392156862, + 3600,0.21568627450980393,0.9529411764705882,0.17254901960784313,0.9254901960784314 ] } } @@ -11950,15 +11950,15 @@ } }, { - "id":"sampled139", + "id":"sampled_conicSensor_domeSurfaceMaterial_solidColor_color", "agi_conicSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.2784313725490196,0.2823529411764706,0.28627450980392155,0.27450980392156865, - 3600,0.29411764705882354,0.2980392156862745,0.30196078431372547,0.2901960784313726 + 0,0.3333333333333333,0.7254901960784313,0.9686274509803922,0.8470588235294118, + 3600,0.27058823529411763,0.47058823529411764,0.054901960784313725,0.7372549019607844 ] } } @@ -11966,22 +11966,22 @@ } }, { - "id":"sampled140", + "id":"sampled_conicSensor_domeSurfaceMaterial_image", "agi_conicSensor":{ "domeSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,429,430, - 3600,431,432 + 0,15155,54843, + 3600,23043,52314 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,231,232,233,230, - 3600,235,236,237,234 + 0,227,216,30,201, + 3600,178,83,144,162 ] } } @@ -11989,43 +11989,43 @@ } }, { - "id":"sampled141", + "id":"sampled_conicSensor_domeSurfaceMaterial_grid", "agi_conicSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,239,240,241,238, - 3600,243,244,245,242 + 0,129,93,151,96, + 3600,162,106,178,82 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,399, - 3600,400 + 0,39199, + 3600,13647 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,433,434, - 3600,435,436 + 0,36585,398, + 3600,55649,1753 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,437,438, - 3600,439,440 + 0,46298,48052, + 3600,2425,23049 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,441,442, - 3600,443,444 + 0,32050,28285, + 3600,28995,12145 ] } } @@ -12033,36 +12033,36 @@ } }, { - "id":"sampled142", + "id":"sampled_conicSensor_domeSurfaceMaterial_stripe", "agi_conicSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,247,248,249,246, - 3600,251,252,253,250 + 0,216,215,206,248, + 3600,42,243,185,48 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,0,1,2,254, - 3600,4,5,6,3 + 0,207,180,175,154, + 3600,243,210,191,196 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,401, - 3600,402 + 0,63301, + 3600,2332 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,403, - 3600,404 + 0,5736, + 3600,39376 ] } } @@ -12070,15 +12070,15 @@ } }, { - "id":"sampled143", + "id":"sampled_conicSensor_domeSurfaceMaterial_image_color", "agi_conicSensor":{ "domeSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.30980392156862746,0.3137254901960784,0.3176470588235294,0.3058823529411765, - 3600,0.3254901960784314,0.32941176470588235,0.3333333333333333,0.3215686274509804 + 0,0.7450980392156863,0.5294117647058824,0.8,0.047058823529411764, + 3600,0.21176470588235294,0.1411764705882353,0.8549019607843137,0.19607843137254902 ] } } @@ -12086,15 +12086,15 @@ } }, { - "id":"sampled144", + "id":"sampled_conicSensor_domeSurfaceMaterial_grid_color", "agi_conicSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3411764705882353,0.34509803921568627,0.34901960784313724,0.33725490196078434, - 3600,0.3568627450980392,0.3607843137254902,0.36470588235294116,0.35294117647058826 + 0,0.4980392156862745,0.23137254901960785,0.4392156862745098,0.8705882352941177, + 3600,0.6980392156862745,0.2235294117647059,0.803921568627451,0.5607843137254902 ] } } @@ -12102,15 +12102,15 @@ } }, { - "id":"sampled145", + "id":"sampled_conicSensor_domeSurfaceMaterial_stripe_evenColor", "agi_conicSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.37254901960784315,0.3764705882352941,0.3803921568627451,0.3686274509803922, - 3600,0.38823529411764707,0.39215686274509803,0.396078431372549,0.3843137254901961 + 0,0.1568627450980392,0.6980392156862745,0.3176470588235294,0.18823529411764706, + 3600,0.5450980392156862,0.00784313725490196,0.6313725490196078,0.6392156862745098 ] } } @@ -12118,15 +12118,15 @@ } }, { - "id":"sampled146", + "id":"sampled_conicSensor_domeSurfaceMaterial_stripe_oddColor", "agi_conicSensor":{ "domeSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.403921568627451,0.40784313725490196,0.4117647058823529,0.4, - 3600,0.4196078431372549,0.4235294117647059,0.42745098039215684,0.41568627450980394 + 0,0.7607843137254902,0.9450980392156862,0.9647058823529412,0.4666666666666667, + 3600,0.4980392156862745,0.24705882352941178,0.26666666666666666,0.5372549019607843 ] } } @@ -12134,15 +12134,15 @@ } }, { - "id":"sampled147", + "id":"sampled_conicSensor_environmentOcclusionMaterial_solidColor_color", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.43529411764705883,0.4392156862745098,0.44313725490196076,0.43137254901960786, - 3600,0.45098039215686275,0.4549019607843137,0.4588235294117647,0.4470588235294118 + 0,0.9607843137254902,0.3176470588235294,0.9882352941176471,0.9176470588235294, + 3600,0.7215686274509804,0.5294117647058824,0.8,0.9686274509803922 ] } } @@ -12150,22 +12150,22 @@ } }, { - "id":"sampled148", + "id":"sampled_conicSensor_environmentOcclusionMaterial_image", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,445,446, - 3600,447,448 + 0,9595,10789, + 3600,18969,45642 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,8,9,10,7, - 3600,12,13,14,11 + 0,25,152,209,110, + 3600,0,177,98,21 ] } } @@ -12173,43 +12173,43 @@ } }, { - "id":"sampled149", + "id":"sampled_conicSensor_environmentOcclusionMaterial_grid", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,16,17,18,15, - 3600,20,21,22,19 + 0,30,179,241,183, + 3600,238,22,9,76 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,405, - 3600,406 + 0,60897, + 3600,28396 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,449,450, - 3600,451,452 + 0,36175,49549, + 3600,25282,43362 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,453,454, - 3600,455,456 + 0,3202,31500, + 3600,31331,9594 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,457,458, - 3600,459,460 + 0,26878,19048, + 3600,14809,8505 ] } } @@ -12217,36 +12217,36 @@ } }, { - "id":"sampled150", + "id":"sampled_conicSensor_environmentOcclusionMaterial_stripe", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,24,25,26,23, - 3600,28,29,30,27 + 0,21,240,212,151, + 3600,170,35,91,106 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,32,33,34,31, - 3600,36,37,38,35 + 0,245,81,159,72, + 3600,191,198,205,36 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,407, - 3600,408 + 0,48703, + 3600,42572 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,409, - 3600,410 + 0,60568, + 3600,43395 ] } } @@ -12254,15 +12254,15 @@ } }, { - "id":"sampled151", + "id":"sampled_conicSensor_environmentOcclusionMaterial_image_color", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4666666666666667,0.47058823529411764,0.4745098039215686,0.4627450980392157, - 3600,0.4823529411764706,0.48627450980392156,0.49019607843137253,0.47843137254901963 + 0,0.7764705882352941,0.1450980392156863,0.07450980392156863,0.1411764705882353, + 3600,0.9411764705882353,0.6745098039215687,0.1411764705882353,0.7529411764705882 ] } } @@ -12270,15 +12270,15 @@ } }, { - "id":"sampled152", + "id":"sampled_conicSensor_environmentOcclusionMaterial_grid_color", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4980392156862745,0.5019607843137255,0.5058823529411764,0.49411764705882355, - 3600,0.5137254901960784,0.5176470588235295,0.5215686274509804,0.5098039215686274 + 0,0.9607843137254902,0.27450980392156865,0.2,0.6352941176470588, + 3600,0.23529411764705882,0.3176470588235294,0.8588235294117647,0.3764705882352941 ] } } @@ -12286,15 +12286,15 @@ } }, { - "id":"sampled153", + "id":"sampled_conicSensor_environmentOcclusionMaterial_stripe_evenColor", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5294117647058824,0.5333333333333333,0.5372549019607843,0.5254901960784314, - 3600,0.5450980392156862,0.5490196078431373,0.5529411764705883,0.5411764705882353 + 0,0.8352941176470589,0.3686274509803922,0.9450980392156862,0.21568627450980393, + 3600,0.3333333333333333,0.10588235294117647,0.9764705882352941,0.10196078431372549 ] } } @@ -12302,15 +12302,15 @@ } }, { - "id":"sampled154", + "id":"sampled_conicSensor_environmentOcclusionMaterial_stripe_oddColor", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5607843137254902,0.5647058823529412,0.5686274509803921,0.5568627450980392, - 3600,0.5764705882352941,0.5803921568627451,0.5843137254901961,0.5725490196078431 + 0,0.4823529411764706,0.21176470588235294,0.054901960784313725,0.7450980392156863, + 3600,0.30196078431372547,0.5882352941176471,0.5058823529411764,0.4 ] } } @@ -12318,39 +12318,39 @@ } }, { - "id":"sampled155", + "id":"sampled_conicSensor_environmentIntersectionColor_rgbaf", "agi_conicSensor":{ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.592156862745098,0.596078431372549,0.6,0.5882352941176471, - 3600,0.6078431372549019,0.611764705882353,0.615686274509804,0.6039215686274509 + 0,0.23921568627450981,0.5647058823529412,0.3843137254901961,0.9490196078431372, + 3600,0.6705882352941176,0.7019607843137254,0.7176470588235294,0.4823529411764706 ] } } }, { - "id":"sampled156", + "id":"sampled_customPatternSensor_intersectionColor_rgbaf", "agi_customPatternSensor":{ "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6235294117647059,0.6274509803921569,0.6313725490196078,0.6196078431372549, - 3600,0.6392156862745098,0.6431372549019608,0.6470588235294118,0.6352941176470588 + 0,0.5294117647058824,0.6431372549019608,0.00392156862745098,0.6823529411764706, + 3600,0.44313725490196076,0.7372549019607844,0.9411764705882353,0.25098039215686274 ] } } }, { - "id":"sampled157", + "id":"sampled_customPatternSensor_lateralSurfaceMaterial_solidColor_color", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6549019607843137,0.6588235294117647,0.6627450980392157,0.6509803921568628, - 3600,0.6705882352941176,0.6745098039215687,0.6784313725490196,0.6666666666666666 + 0,0.7450980392156863,0.9098039215686274,0.9176470588235294,0.9137254901960784, + 3600,0.8980392156862745,0.9803921568627451,0.9254901960784314,0.21176470588235294 ] } } @@ -12358,22 +12358,22 @@ } }, { - "id":"sampled158", + "id":"sampled_customPatternSensor_lateralSurfaceMaterial_image", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,461,462, - 3600,463,464 + 0,63029,3574, + 3600,55389,39128 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,40,41,42,39, - 3600,44,45,46,43 + 0,16,191,200,176, + 3600,37,9,107,51 ] } } @@ -12381,43 +12381,43 @@ } }, { - "id":"sampled159", + "id":"sampled_customPatternSensor_lateralSurfaceMaterial_grid", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,48,49,50,47, - 3600,52,53,54,51 + 0,153,234,93,240, + 3600,137,26,245,109 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,411, - 3600,412 + 0,30588, + 3600,50527 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,465,466, - 3600,467,468 + 0,32706,60287, + 3600,9849,57894 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,469,470, - 3600,471,472 + 0,52801,55758, + 3600,21243,12882 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,473,474, - 3600,475,476 + 0,32497,63102, + 3600,872,8963 ] } } @@ -12425,36 +12425,36 @@ } }, { - "id":"sampled160", + "id":"sampled_customPatternSensor_lateralSurfaceMaterial_stripe", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,56,57,58,55, - 3600,60,61,62,59 + 0,178,77,10,254, + 3600,25,134,53,12 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,64,65,66,63, - 3600,68,69,70,67 + 0,106,116,1,164, + 3600,84,10,153,15 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,413, - 3600,414 + 0,21926, + 3600,50927 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,415, - 3600,416 + 0,53175, + 3600,3927 ] } } @@ -12462,15 +12462,15 @@ } }, { - "id":"sampled161", + "id":"sampled_customPatternSensor_lateralSurfaceMaterial_image_color", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6862745098039216,0.6901960784313725,0.6941176470588235,0.6823529411764706, - 3600,0.7019607843137254,0.7058823529411765,0.7098039215686275,0.6980392156862745 + 0,0.4666666666666667,0.6823529411764706,0.4117647058823529,0.40784313725490196, + 3600,0.19607843137254902,0.9294117647058824,0.9294117647058824,0.8 ] } } @@ -12478,15 +12478,15 @@ } }, { - "id":"sampled162", + "id":"sampled_customPatternSensor_lateralSurfaceMaterial_grid_color", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7176470588235294,0.7215686274509804,0.7254901960784313,0.7137254901960784, - 3600,0.7333333333333333,0.7372549019607844,0.7411764705882353,0.7294117647058823 + 0,0.9294117647058824,0.4627450980392157,0.5803921568627451,0.9568627450980393, + 3600,0.1607843137254902,0.2784313725490196,0.49019607843137253,0.13333333333333333 ] } } @@ -12494,15 +12494,15 @@ } }, { - "id":"sampled163", + "id":"sampled_customPatternSensor_lateralSurfaceMaterial_stripe_evenColor", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7490196078431373,0.7529411764705882,0.7568627450980392,0.7450980392156863, - 3600,0.7647058823529411,0.7686274509803922,0.7725490196078432,0.7607843137254902 + 0,0.08235294117647059,0.8549019607843137,0.2,0.11764705882352941, + 3600,0.09411764705882353,0.023529411764705882,0.6313725490196078,0.9294117647058824 ] } } @@ -12510,15 +12510,15 @@ } }, { - "id":"sampled164", + "id":"sampled_customPatternSensor_lateralSurfaceMaterial_stripe_oddColor", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7803921568627451,0.7843137254901961,0.788235294117647,0.7764705882352941, - 3600,0.796078431372549,0.8,0.803921568627451,0.792156862745098 + 0,0.43529411764705883,0.6235294117647059,0.09019607843137255,0.403921568627451, + 3600,0.9764705882352941,0.4980392156862745,0.9372549019607843,0.15294117647058825 ] } } @@ -12526,15 +12526,15 @@ } }, { - "id":"sampled165", + "id":"sampled_customPatternSensor_ellipsoidSurfaceMaterial_solidColor_color", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8117647058823529,0.8156862745098039,0.8196078431372549,0.807843137254902, - 3600,0.8274509803921568,0.8313725490196079,0.8352941176470589,0.8235294117647058 + 0,0.5137254901960784,0.29411764705882354,0.2823529411764706,0.13725490196078433, + 3600,0.3764705882352941,0.1411764705882353,0.8784313725490196,0.21568627450980393 ] } } @@ -12542,22 +12542,22 @@ } }, { - "id":"sampled166", + "id":"sampled_customPatternSensor_ellipsoidSurfaceMaterial_image", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,477,478, - 3600,479,480 + 0,58698,40933, + 3600,41986,11428 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,72,73,74,71, - 3600,76,77,78,75 + 0,215,165,21,133, + 3600,242,52,43,231 ] } } @@ -12565,43 +12565,43 @@ } }, { - "id":"sampled167", + "id":"sampled_customPatternSensor_ellipsoidSurfaceMaterial_grid", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,80,81,82,79, - 3600,84,85,86,83 + 0,145,51,29,30, + 3600,232,196,204,59 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,417, - 3600,418 + 0,41972, + 3600,5785 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,481,482, - 3600,483,484 + 0,53003,15055, + 3600,54783,43989 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,485,486, - 3600,487,488 + 0,20747,61009, + 3600,44483,19885 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,489,490, - 3600,491,492 + 0,4601,33809, + 3600,5562,9237 ] } } @@ -12609,36 +12609,36 @@ } }, { - "id":"sampled168", + "id":"sampled_customPatternSensor_ellipsoidSurfaceMaterial_stripe", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,88,89,90,87, - 3600,92,93,94,91 + 0,22,135,242,53, + 3600,125,39,146,95 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,96,97,98,95, - 3600,100,101,102,99 + 0,78,145,160,107, + 3600,20,221,2,55 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,419, - 3600,420 + 0,56324, + 3600,23443 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,421, - 3600,422 + 0,60008, + 3600,19240 ] } } @@ -12646,15 +12646,15 @@ } }, { - "id":"sampled169", + "id":"sampled_customPatternSensor_ellipsoidSurfaceMaterial_image_color", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8431372549019608,0.8470588235294118,0.8509803921568627,0.8392156862745098, - 3600,0.8588235294117647,0.8627450980392157,0.8666666666666667,0.8549019607843137 + 0,0.14901960784313725,0.07450980392156863,0.047058823529411764,0.26666666666666666, + 3600,0.37254901960784315,0.8588235294117647,0.07450980392156863,0.6392156862745098 ] } } @@ -12662,15 +12662,15 @@ } }, { - "id":"sampled170", + "id":"sampled_customPatternSensor_ellipsoidSurfaceMaterial_grid_color", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8745098039215686,0.8784313725490196,0.8823529411764706,0.8705882352941177, - 3600,0.8901960784313725,0.8941176470588236,0.8980392156862745,0.8862745098039215 + 0,0.2235294117647059,0.6039215686274509,0.5372549019607843,0.4392156862745098, + 3600,0.2901960784313726,0.30980392156862746,0.7058823529411765,0.050980392156862744 ] } } @@ -12678,15 +12678,15 @@ } }, { - "id":"sampled171", + "id":"sampled_customPatternSensor_ellipsoidSurfaceMaterial_stripe_evenColor", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9058823529411765,0.9098039215686274,0.9137254901960784,0.9019607843137255, - 3600,0.9215686274509803,0.9254901960784314,0.9294117647058824,0.9176470588235294 + 0,0.5098039215686274,0.8705882352941177,0.08235294117647059,0.7843137254901961, + 3600,0.9725490196078431,0.396078431372549,0.7137254901960784,0.16862745098039217 ] } } @@ -12694,15 +12694,15 @@ } }, { - "id":"sampled172", + "id":"sampled_customPatternSensor_ellipsoidSurfaceMaterial_stripe_oddColor", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9372549019607843,0.9411764705882353,0.9450980392156862,0.9333333333333333, - 3600,0.9529411764705882,0.9568627450980393,0.9607843137254902,0.9490196078431372 + 0,0.7411764705882353,0.3254901960784314,0.9607843137254902,0.5490196078431373, + 3600,0.49411764705882355,0.8980392156862745,0.30980392156862746,0.9333333333333333 ] } } @@ -12710,15 +12710,15 @@ } }, { - "id":"sampled173", + "id":"sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9686274509803922,0.9725490196078431,0.9764705882352941,0.9647058823529412, - 3600,0.984313725490196,0.9882352941176471,0.9921568627450981,0.9803921568627451 + 0,0.7137254901960784,0.4745098039215686,0.6941176470588235,0.9490196078431372, + 3600,0.5254901960784314,0.39215686274509803,0.4196078431372549,0.48627450980392156 ] } } @@ -12726,22 +12726,22 @@ } }, { - "id":"sampled174", + "id":"sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,493,494, - 3600,495,496 + 0,21969,13397, + 3600,39494,53658 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,104,105,106,103, - 3600,108,109,110,107 + 0,53,192,208,251, + 3600,37,130,111,72 ] } } @@ -12749,43 +12749,43 @@ } }, { - "id":"sampled175", + "id":"sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,112,113,114,111, - 3600,116,117,118,115 + 0,93,214,17,148, + 3600,128,142,221,86 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,423, - 3600,424 + 0,44108, + 3600,54524 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,497,498, - 3600,499,500 + 0,50481,2245, + 3600,37420,18578 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,501,502, - 3600,503,504 + 0,12996,37682, + 3600,52906,32974 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,505,506, - 3600,507,508 + 0,1153,65284, + 3600,20666,28496 ] } } @@ -12793,36 +12793,36 @@ } }, { - "id":"sampled176", + "id":"sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,120,121,122,119, - 3600,124,125,126,123 + 0,26,41,223,127, + 3600,73,101,144,40 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,128,129,130,127, - 3600,132,133,134,131 + 0,61,131,101,136, + 3600,156,76,210,101 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,425, - 3600,426 + 0,43262, + 3600,4288 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,427, - 3600,428 + 0,56775, + 3600,18120 ] } } @@ -12830,15 +12830,15 @@ } }, { - "id":"sampled177", + "id":"sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image_color", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0,0.00392156862745098,0.00784313725490196,0.996078431372549, - 3600,0.01568627450980392,0.0196078431372549,0.023529411764705882,0.011764705882352941 + 0,0.984313725490196,0.19215686274509805,0.47843137254901963,0.8392156862745098, + 3600,0.6,0.6745098039215687,0.3176470588235294,0.24705882352941178 ] } } @@ -12846,15 +12846,15 @@ } }, { - "id":"sampled178", + "id":"sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid_color", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.03137254901960784,0.03529411764705882,0.0392156862745098,0.027450980392156862, - 3600,0.047058823529411764,0.050980392156862744,0.054901960784313725,0.043137254901960784 + 0,0.3058823529411765,0.35294117647058826,0.9098039215686274,0.49411764705882355, + 3600,0.1411764705882353,0.7764705882352941,0.37254901960784315,0.8196078431372549 ] } } @@ -12862,15 +12862,15 @@ } }, { - "id":"sampled179", + "id":"sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.06274509803921569,0.06666666666666667,0.07058823529411765,0.058823529411764705, - 3600,0.0784313725490196,0.08235294117647059,0.08627450980392157,0.07450980392156863 + 0,0.2196078431372549,0.36470588235294116,0.8862745098039215,0.2549019607843137, + 3600,0.21176470588235294,0.12156862745098039,0.42745098039215684,0.4588235294117647 ] } } @@ -12878,15 +12878,15 @@ } }, { - "id":"sampled180", + "id":"sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.09411764705882353,0.09803921568627451,0.10196078431372549,0.09019607843137255, - 3600,0.10980392156862745,0.11372549019607843,0.11764705882352941,0.10588235294117647 + 0,0.054901960784313725,0.403921568627451,0.023529411764705882,0.29411764705882354, + 3600,0.43529411764705883,0.4117647058823529,0.20392156862745098,0.12156862745098039 ] } } @@ -12894,15 +12894,15 @@ } }, { - "id":"sampled181", + "id":"sampled_customPatternSensor_domeSurfaceMaterial_solidColor_color", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.12549019607843137,0.12941176470588237,0.13333333333333333,0.12156862745098039, - 3600,0.1411764705882353,0.1450980392156863,0.14901960784313725,0.13725490196078433 + 0,0.43137254901960786,0.6901960784313725,0.4117647058823529,0.2, + 3600,0.16862745098039217,0.07450980392156863,0.027450980392156862,0.5411764705882353 ] } } @@ -12910,22 +12910,22 @@ } }, { - "id":"sampled182", + "id":"sampled_customPatternSensor_domeSurfaceMaterial_image", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,509,510, - 3600,511,512 + 0,60682,27373, + 3600,52685,47309 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,136,137,138,135, - 3600,140,141,142,139 + 0,22,127,40,32, + 3600,189,75,228,77 ] } } @@ -12933,43 +12933,43 @@ } }, { - "id":"sampled183", + "id":"sampled_customPatternSensor_domeSurfaceMaterial_grid", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,144,145,146,143, - 3600,148,149,150,147 + 0,162,99,20,206, + 3600,195,98,58,1 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,429, - 3600,430 + 0,3954, + 3600,6671 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,513,514, - 3600,515,516 + 0,62334,24819, + 3600,21928,49237 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,517,518, - 3600,519,520 + 0,20309,29263, + 3600,37015,21392 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,521,522, - 3600,523,524 + 0,25094,25442, + 3600,627,60674 ] } } @@ -12977,36 +12977,36 @@ } }, { - "id":"sampled184", + "id":"sampled_customPatternSensor_domeSurfaceMaterial_stripe", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,152,153,154,151, - 3600,156,157,158,155 + 0,131,24,117,197, + 3600,174,167,243,249 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,160,161,162,159, - 3600,164,165,166,163 + 0,56,97,210,44, + 3600,241,167,104,188 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,431, - 3600,432 + 0,36642, + 3600,59203 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,433, - 3600,434 + 0,22486, + 3600,32253 ] } } @@ -13014,15 +13014,15 @@ } }, { - "id":"sampled185", + "id":"sampled_customPatternSensor_domeSurfaceMaterial_image_color", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.1568627450980392,0.1607843137254902,0.16470588235294117,0.15294117647058825, - 3600,0.17254901960784313,0.17647058823529413,0.1803921568627451,0.16862745098039217 + 0,0.47058823529411764,0.12549019607843137,0.22745098039215686,0.5686274509803921, + 3600,0.792156862745098,0.054901960784313725,0.8627450980392157,0.6823529411764706 ] } } @@ -13030,15 +13030,15 @@ } }, { - "id":"sampled186", + "id":"sampled_customPatternSensor_domeSurfaceMaterial_grid_color", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.18823529411764706,0.19215686274509805,0.19607843137254902,0.1843137254901961, - 3600,0.20392156862745098,0.20784313725490197,0.21176470588235294,0.2 + 0,0.8117647058823529,0.8588235294117647,0.9019607843137255,0.3607843137254902, + 3600,0.047058823529411764,0.9529411764705882,0.13333333333333333,0.2235294117647059 ] } } @@ -13046,15 +13046,15 @@ } }, { - "id":"sampled187", + "id":"sampled_customPatternSensor_domeSurfaceMaterial_stripe_evenColor", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.2196078431372549,0.2235294117647059,0.22745098039215686,0.21568627450980393, - 3600,0.23529411764705882,0.23921568627450981,0.24313725490196078,0.23137254901960785 + 0,0.5254901960784314,0.8313725490196079,0.43529411764705883,0.13333333333333333, + 3600,0.047058823529411764,0.9098039215686274,0.8666666666666667,0.00784313725490196 ] } } @@ -13062,15 +13062,15 @@ } }, { - "id":"sampled188", + "id":"sampled_customPatternSensor_domeSurfaceMaterial_stripe_oddColor", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.25098039215686274,0.2549019607843137,0.25882352941176473,0.24705882352941178, - 3600,0.26666666666666666,0.27058823529411763,0.27450980392156865,0.2627450980392157 + 0,0.7450980392156863,0.6823529411764706,0.6862745098039216,0.592156862745098, + 3600,0.8156862745098039,0.20392156862745098,0.7372549019607844,0.01568627450980392 ] } } @@ -13078,15 +13078,15 @@ } }, { - "id":"sampled189", + "id":"sampled_customPatternSensor_environmentOcclusionMaterial_solidColor_color", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.2823529411764706,0.28627450980392155,0.2901960784313726,0.2784313725490196, - 3600,0.2980392156862745,0.30196078431372547,0.3058823529411765,0.29411764705882354 + 0,0.18823529411764706,0.13725490196078433,0.34901960784313724,0.12549019607843137, + 3600,0.5372549019607843,0.050980392156862744,0.39215686274509803,0.5411764705882353 ] } } @@ -13094,22 +13094,22 @@ } }, { - "id":"sampled190", + "id":"sampled_customPatternSensor_environmentOcclusionMaterial_image", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,525,526, - 3600,527,528 + 0,62312,48883, + 3600,57031,8414 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,168,169,170,167, - 3600,172,173,174,171 + 0,27,82,30,220, + 3600,239,104,2,127 ] } } @@ -13117,43 +13117,43 @@ } }, { - "id":"sampled191", + "id":"sampled_customPatternSensor_environmentOcclusionMaterial_grid", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,176,177,178,175, - 3600,180,181,182,179 + 0,201,18,142,140, + 3600,172,191,241,52 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,435, - 3600,436 + 0,47281, + 3600,32249 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,529,530, - 3600,531,532 + 0,39465,33434, + 3600,34009,23428 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,533,534, - 3600,535,536 + 0,12138,31535, + 3600,21340,63571 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,537,538, - 3600,539,540 + 0,41772,53923, + 3600,38657,39063 ] } } @@ -13161,36 +13161,36 @@ } }, { - "id":"sampled192", + "id":"sampled_customPatternSensor_environmentOcclusionMaterial_stripe", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,184,185,186,183, - 3600,188,189,190,187 + 0,102,16,35,158, + 3600,144,113,131,165 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,192,193,194,191, - 3600,196,197,198,195 + 0,127,174,171,80, + 3600,188,244,211,154 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,437, - 3600,438 + 0,45459, + 3600,39807 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,439, - 3600,440 + 0,3015, + 3600,44396 ] } } @@ -13198,15 +13198,15 @@ } }, { - "id":"sampled193", + "id":"sampled_customPatternSensor_environmentOcclusionMaterial_image_color", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3137254901960784,0.3176470588235294,0.3215686274509804,0.30980392156862746, - 3600,0.32941176470588235,0.3333333333333333,0.33725490196078434,0.3254901960784314 + 0,0.6980392156862745,0.7176470588235294,0.34901960784313724,0.8901960784313725, + 3600,0.26666666666666666,0.9921568627450981,0,0.9215686274509803 ] } } @@ -13214,15 +13214,15 @@ } }, { - "id":"sampled194", + "id":"sampled_customPatternSensor_environmentOcclusionMaterial_grid_color", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.34509803921568627,0.34901960784313724,0.35294117647058826,0.3411764705882353, - 3600,0.3607843137254902,0.36470588235294116,0.3686274509803922,0.3568627450980392 + 0,0.45098039215686275,0.6509803921568628,0.788235294117647,0.6352941176470588, + 3600,0.8784313725490196,0.011764705882352941,0.7058823529411765,0.37254901960784315 ] } } @@ -13230,15 +13230,15 @@ } }, { - "id":"sampled195", + "id":"sampled_customPatternSensor_environmentOcclusionMaterial_stripe_evenColor", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3764705882352941,0.3803921568627451,0.3843137254901961,0.37254901960784315, - 3600,0.39215686274509803,0.396078431372549,0.4,0.38823529411764707 + 0,0.7294117647058823,0.047058823529411764,0.996078431372549,0.9294117647058824, + 3600,0.24705882352941178,0.38823529411764707,0.33725490196078434,0.13333333333333333 ] } } @@ -13246,15 +13246,15 @@ } }, { - "id":"sampled196", + "id":"sampled_customPatternSensor_environmentOcclusionMaterial_stripe_oddColor", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.40784313725490196,0.4117647058823529,0.41568627450980394,0.403921568627451, - 3600,0.4235294117647059,0.42745098039215684,0.43137254901960786,0.4196078431372549 + 0,0.49019607843137253,0.47843137254901963,0.21176470588235294,0.8784313725490196, + 3600,0.25882352941176473,0.4117647058823529,0.2549019607843137,0.8705882352941177 ] } } @@ -13262,39 +13262,39 @@ } }, { - "id":"sampled197", + "id":"sampled_customPatternSensor_environmentIntersectionColor_rgbaf", "agi_customPatternSensor":{ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4392156862745098,0.44313725490196076,0.4470588235294118,0.43529411764705883, - 3600,0.4549019607843137,0.4588235294117647,0.4627450980392157,0.45098039215686275 + 0,0.7137254901960784,0.6666666666666666,0.6313725490196078,0.6039215686274509, + 3600,0.19607843137254902,0.03137254901960784,0.4588235294117647,0.12941176470588237 ] } } }, { - "id":"sampled198", + "id":"sampled_rectangularSensor_intersectionColor_rgbaf", "agi_rectangularSensor":{ "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.47058823529411764,0.4745098039215686,0.47843137254901963,0.4666666666666667, - 3600,0.48627450980392156,0.49019607843137253,0.49411764705882355,0.4823529411764706 + 0,0.611764705882353,0.6235294117647059,0.615686274509804,0.2980392156862745, + 3600,0.47058823529411764,0.792156862745098,0.4470588235294118,0.3411764705882353 ] } } }, { - "id":"sampled199", + "id":"sampled_rectangularSensor_lateralSurfaceMaterial_solidColor_color", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5019607843137255,0.5058823529411764,0.5098039215686274,0.4980392156862745, - 3600,0.5176470588235295,0.5215686274509804,0.5254901960784314,0.5137254901960784 + 0,0.11372549019607843,0.8235294117647058,0.054901960784313725,0.8274509803921568, + 3600,0.25882352941176473,0.20784313725490197,0.6235294117647059,0.3843137254901961 ] } } @@ -13302,22 +13302,22 @@ } }, { - "id":"sampled200", + "id":"sampled_rectangularSensor_lateralSurfaceMaterial_image", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,541,542, - 3600,543,544 + 0,52010,29131, + 3600,37742,39315 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,200,201,202,199, - 3600,204,205,206,203 + 0,87,76,78,224, + 3600,112,228,110,174 ] } } @@ -13325,43 +13325,43 @@ } }, { - "id":"sampled201", + "id":"sampled_rectangularSensor_lateralSurfaceMaterial_grid", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,208,209,210,207, - 3600,212,213,214,211 + 0,195,212,244,21, + 3600,42,102,1,242 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,441, - 3600,442 + 0,48728, + 3600,1546 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,545,546, - 3600,547,548 + 0,50687,36037, + 3600,13907,20534 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,549,550, - 3600,551,552 + 0,54144,36307, + 3600,51987,20683 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,553,554, - 3600,555,556 + 0,44547,50094, + 3600,41657,39586 ] } } @@ -13369,36 +13369,36 @@ } }, { - "id":"sampled202", + "id":"sampled_rectangularSensor_lateralSurfaceMaterial_stripe", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,216,217,218,215, - 3600,220,221,222,219 + 0,30,217,21,42, + 3600,44,19,54,180 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,224,225,226,223, - 3600,228,229,230,227 + 0,3,65,14,125, + 3600,91,20,83,43 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,443, - 3600,444 + 0,18254, + 3600,54296 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,445, - 3600,446 + 0,43781, + 3600,10453 ] } } @@ -13406,15 +13406,15 @@ } }, { - "id":"sampled203", + "id":"sampled_rectangularSensor_lateralSurfaceMaterial_image_color", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5333333333333333,0.5372549019607843,0.5411764705882353,0.5294117647058824, - 3600,0.5490196078431373,0.5529411764705883,0.5568627450980392,0.5450980392156862 + 0,0.4196078431372549,0.25882352941176473,0.8,0.3254901960784314, + 3600,0.29411764705882354,0.34509803921568627,0.6313725490196078,0.17254901960784313 ] } } @@ -13422,15 +13422,15 @@ } }, { - "id":"sampled204", + "id":"sampled_rectangularSensor_lateralSurfaceMaterial_grid_color", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5647058823529412,0.5686274509803921,0.5725490196078431,0.5607843137254902, - 3600,0.5803921568627451,0.5843137254901961,0.5882352941176471,0.5764705882352941 + 0,0.9294117647058824,0.32941176470588235,0.9058823529411765,0.17647058823529413, + 3600,0.13333333333333333,0.9921568627450981,0.4980392156862745,0.6823529411764706 ] } } @@ -13438,15 +13438,15 @@ } }, { - "id":"sampled205", + "id":"sampled_rectangularSensor_lateralSurfaceMaterial_stripe_evenColor", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.596078431372549,0.6,0.6039215686274509,0.592156862745098, - 3600,0.611764705882353,0.615686274509804,0.6196078431372549,0.6078431372549019 + 0,0.49019607843137253,0.10588235294117647,0.7411764705882353,0.9254901960784314, + 3600,0.39215686274509803,0.3803921568627451,0.9568627450980393,0.42745098039215684 ] } } @@ -13454,15 +13454,15 @@ } }, { - "id":"sampled206", + "id":"sampled_rectangularSensor_lateralSurfaceMaterial_stripe_oddColor", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6274509803921569,0.6313725490196078,0.6352941176470588,0.6235294117647059, - 3600,0.6431372549019608,0.6470588235294118,0.6509803921568628,0.6392156862745098 + 0,0.6392156862745098,0.6470588235294118,0.7764705882352941,0.03529411764705882, + 3600,0.20784313725490197,0.7843137254901961,0.41568627450980394,0.23137254901960785 ] } } @@ -13470,15 +13470,15 @@ } }, { - "id":"sampled207", + "id":"sampled_rectangularSensor_ellipsoidSurfaceMaterial_solidColor_color", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6588235294117647,0.6627450980392157,0.6666666666666666,0.6549019607843137, - 3600,0.6745098039215687,0.6784313725490196,0.6823529411764706,0.6705882352941176 + 0,0.34509803921568627,0.6235294117647059,0.7411764705882353,0.788235294117647, + 3600,0.9921568627450981,0.8823529411764706,0.5843137254901961,0.3254901960784314 ] } } @@ -13486,22 +13486,22 @@ } }, { - "id":"sampled208", + "id":"sampled_rectangularSensor_ellipsoidSurfaceMaterial_image", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,557,558, - 3600,559,560 + 0,19293,30027, + 3600,53447,40400 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,232,233,234,231, - 3600,236,237,238,235 + 0,169,234,204,34, + 3600,206,171,37,176 ] } } @@ -13509,43 +13509,43 @@ } }, { - "id":"sampled209", + "id":"sampled_rectangularSensor_ellipsoidSurfaceMaterial_grid", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,240,241,242,239, - 3600,244,245,246,243 + 0,64,198,223,2, + 3600,158,10,217,142 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,447, - 3600,448 + 0,25939, + 3600,4058 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,561,562, - 3600,563,564 + 0,3767,19214, + 3600,25536,29283 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,565,566, - 3600,567,568 + 0,46435,13749, + 3600,59883,59113 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,569,570, - 3600,571,572 + 0,3470,23821, + 3600,21415,22355 ] } } @@ -13553,36 +13553,36 @@ } }, { - "id":"sampled210", + "id":"sampled_rectangularSensor_ellipsoidSurfaceMaterial_stripe", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,248,249,250,247, - 3600,252,253,254,251 + 0,15,225,249,111, + 3600,137,66,192,72 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,1,2,3,0, - 3600,5,6,7,4 + 0,43,126,128,44, + 3600,224,158,234,137 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,449, - 3600,450 + 0,13161, + 3600,16735 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,451, - 3600,452 + 0,61379, + 3600,24898 ] } } @@ -13590,15 +13590,15 @@ } }, { - "id":"sampled211", + "id":"sampled_rectangularSensor_ellipsoidSurfaceMaterial_image_color", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6901960784313725,0.6941176470588235,0.6980392156862745,0.6862745098039216, - 3600,0.7058823529411765,0.7098039215686275,0.7137254901960784,0.7019607843137254 + 0,0.7411764705882353,0.7843137254901961,0.33725490196078434,0.49019607843137253, + 3600,0.2235294117647059,0.4470588235294118,0.47843137254901963,0.9490196078431372 ] } } @@ -13606,15 +13606,15 @@ } }, { - "id":"sampled212", + "id":"sampled_rectangularSensor_ellipsoidSurfaceMaterial_grid_color", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7215686274509804,0.7254901960784313,0.7294117647058823,0.7176470588235294, - 3600,0.7372549019607844,0.7411764705882353,0.7450980392156863,0.7333333333333333 + 0,0.7647058823529411,0.6901960784313725,0.7843137254901961,0.6196078431372549, + 3600,0.5058823529411764,0.7411764705882353,0.3764705882352941,0.7019607843137254 ] } } @@ -13622,15 +13622,15 @@ } }, { - "id":"sampled213", + "id":"sampled_rectangularSensor_ellipsoidSurfaceMaterial_stripe_evenColor", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7529411764705882,0.7568627450980392,0.7607843137254902,0.7490196078431373, - 3600,0.7686274509803922,0.7725490196078432,0.7764705882352941,0.7647058823529411 + 0,0.8745098039215686,0.1803921568627451,0.6745098039215687,0.3176470588235294, + 3600,0.2980392156862745,0.5647058823529412,0.9686274509803922,0.06666666666666667 ] } } @@ -13638,15 +13638,15 @@ } }, { - "id":"sampled214", + "id":"sampled_rectangularSensor_ellipsoidSurfaceMaterial_stripe_oddColor", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7843137254901961,0.788235294117647,0.792156862745098,0.7803921568627451, - 3600,0.8,0.803921568627451,0.807843137254902,0.796078431372549 + 0,0.07450980392156863,0.23137254901960785,0.7803921568627451,0.8745098039215686, + 3600,0.011764705882352941,0.27058823529411763,0.8980392156862745,0.8235294117647058 ] } } @@ -13654,15 +13654,15 @@ } }, { - "id":"sampled215", + "id":"sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8156862745098039,0.8196078431372549,0.8235294117647058,0.8117647058823529, - 3600,0.8313725490196079,0.8352941176470589,0.8392156862745098,0.8274509803921568 + 0,0.3411764705882353,0.00392156862745098,0.3764705882352941,0.10196078431372549, + 3600,0.7764705882352941,0.21176470588235294,0.49019607843137253,0.9803921568627451 ] } } @@ -13670,22 +13670,22 @@ } }, { - "id":"sampled216", + "id":"sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,573,574, - 3600,575,576 + 0,23214,39258, + 3600,2670,15370 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,9,10,11,8, - 3600,13,14,15,12 + 0,153,182,217,31, + 3600,62,102,70,94 ] } } @@ -13693,43 +13693,43 @@ } }, { - "id":"sampled217", + "id":"sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,17,18,19,16, - 3600,21,22,23,20 + 0,48,105,98,196, + 3600,130,147,68,208 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,453, - 3600,454 + 0,41629, + 3600,11517 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,577,578, - 3600,579,580 + 0,47204,22456, + 3600,26036,49253 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,581,582, - 3600,583,584 + 0,49429,31425, + 3600,12054,27951 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,585,586, - 3600,587,588 + 0,22478,51031, + 3600,53335,18640 ] } } @@ -13737,36 +13737,36 @@ } }, { - "id":"sampled218", + "id":"sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,25,26,27,24, - 3600,29,30,31,28 + 0,78,72,114,131, + 3600,53,121,5,189 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,33,34,35,32, - 3600,37,38,39,36 + 0,171,248,41,119, + 3600,246,179,239,251 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,455, - 3600,456 + 0,22252, + 3600,63736 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,457, - 3600,458 + 0,53120, + 3600,53949 ] } } @@ -13774,15 +13774,15 @@ } }, { - "id":"sampled219", + "id":"sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image_color", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8470588235294118,0.8509803921568627,0.8549019607843137,0.8431372549019608, - 3600,0.8627450980392157,0.8666666666666667,0.8705882352941177,0.8588235294117647 + 0,0.7372549019607844,0.3137254901960784,0.5333333333333333,0.44313725490196076, + 3600,0.5372549019607843,0.9647058823529412,0.21568627450980393,0.6588235294117647 ] } } @@ -13790,15 +13790,15 @@ } }, { - "id":"sampled220", + "id":"sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid_color", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8784313725490196,0.8823529411764706,0.8862745098039215,0.8745098039215686, - 3600,0.8941176470588236,0.8980392156862745,0.9019607843137255,0.8901960784313725 + 0,0.7490196078431373,0.7607843137254902,0.7333333333333333,0.4823529411764706, + 3600,0.2235294117647059,0.5882352941176471,0.39215686274509803,0.5098039215686274 ] } } @@ -13806,15 +13806,15 @@ } }, { - "id":"sampled221", + "id":"sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9098039215686274,0.9137254901960784,0.9176470588235294,0.9058823529411765, - 3600,0.9254901960784314,0.9294117647058824,0.9333333333333333,0.9215686274509803 + 0,0.5647058823529412,0.34901960784313724,0.1450980392156863,0.44313725490196076, + 3600,0.023529411764705882,0.596078431372549,0.8588235294117647,0.047058823529411764 ] } } @@ -13822,15 +13822,15 @@ } }, { - "id":"sampled222", + "id":"sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9411764705882353,0.9450980392156862,0.9490196078431372,0.9372549019607843, - 3600,0.9568627450980393,0.9607843137254902,0.9647058823529412,0.9529411764705882 + 0,0.9137254901960784,0.7294117647058823,0.7137254901960784,0.7254901960784313, + 3600,0.592156862745098,0.9529411764705882,0.4745098039215686,0.8 ] } } @@ -13838,15 +13838,15 @@ } }, { - "id":"sampled223", + "id":"sampled_rectangularSensor_domeSurfaceMaterial_solidColor_color", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9725490196078431,0.9764705882352941,0.9803921568627451,0.9686274509803922, - 3600,0.9882352941176471,0.9921568627450981,0.996078431372549,0.984313725490196 + 0,0.10980392156862745,0.7058823529411765,0.6980392156862745,0.7333333333333333, + 3600,0.7254901960784313,0.6274509803921569,0.596078431372549,0.06274509803921569 ] } } @@ -13854,22 +13854,22 @@ } }, { - "id":"sampled224", + "id":"sampled_rectangularSensor_domeSurfaceMaterial_image", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,589,590, - 3600,591,592 + 0,32842,39552, + 3600,1658,6662 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,41,42,43,40, - 3600,45,46,47,44 + 0,23,109,70,110, + 3600,145,162,148,145 ] } } @@ -13877,43 +13877,43 @@ } }, { - "id":"sampled225", + "id":"sampled_rectangularSensor_domeSurfaceMaterial_grid", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,49,50,51,48, - 3600,53,54,55,52 + 0,228,38,182,37, + 3600,90,71,163,159 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,459, - 3600,460 + 0,46557, + 3600,63381 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,593,594, - 3600,595,596 + 0,28334,23918, + 3600,33281,50050 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,597,598, - 3600,599,600 + 0,63911,12025, + 3600,39352,60313 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,601,602, - 3600,603,604 + 0,27723,47724, + 3600,25108,20066 ] } } @@ -13921,36 +13921,36 @@ } }, { - "id":"sampled226", + "id":"sampled_rectangularSensor_domeSurfaceMaterial_stripe", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,57,58,59,56, - 3600,61,62,63,60 + 0,239,63,112,19, + 3600,203,111,250,39 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,65,66,67,64, - 3600,69,70,71,68 + 0,221,185,121,189, + 3600,17,205,57,29 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,461, - 3600,462 + 0,12138, + 3600,63703 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,463, - 3600,464 + 0,43570, + 3600,2074 ] } } @@ -13958,15 +13958,15 @@ } }, { - "id":"sampled227", + "id":"sampled_rectangularSensor_domeSurfaceMaterial_image_color", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.00392156862745098,0.00784313725490196,0.011764705882352941,0, - 3600,0.0196078431372549,0.023529411764705882,0.027450980392156862,0.01568627450980392 + 0,0.07450980392156863,0.5568627450980392,0.9450980392156862,0.11372549019607843, + 3600,0.4117647058823529,0.5058823529411764,0.6549019607843137,0.3764705882352941 ] } } @@ -13974,15 +13974,15 @@ } }, { - "id":"sampled228", + "id":"sampled_rectangularSensor_domeSurfaceMaterial_grid_color", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.03529411764705882,0.0392156862745098,0.043137254901960784,0.03137254901960784, - 3600,0.050980392156862744,0.054901960784313725,0.058823529411764705,0.047058823529411764 + 0,0.25098039215686274,0.0196078431372549,0.4,0.24313725490196078, + 3600,0.12941176470588237,0.6,0.7490196078431373,0.2784313725490196 ] } } @@ -13990,15 +13990,15 @@ } }, { - "id":"sampled229", + "id":"sampled_rectangularSensor_domeSurfaceMaterial_stripe_evenColor", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.06666666666666667,0.07058823529411765,0.07450980392156863,0.06274509803921569, - 3600,0.08235294117647059,0.08627450980392157,0.09019607843137255,0.0784313725490196 + 0,0.7019607843137254,0.6196078431372549,0.34509803921568627,0.050980392156862744, + 3600,0.8549019607843137,0.5019607843137255,0.9058823529411765,0.25882352941176473 ] } } @@ -14006,15 +14006,15 @@ } }, { - "id":"sampled230", + "id":"sampled_rectangularSensor_domeSurfaceMaterial_stripe_oddColor", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.09803921568627451,0.10196078431372549,0.10588235294117647,0.09411764705882353, - 3600,0.11372549019607843,0.11764705882352941,0.12156862745098039,0.10980392156862745 + 0,0.01568627450980392,0.592156862745098,0.5725490196078431,0.9882352941176471, + 3600,0.9647058823529412,0.27450980392156865,0.07450980392156863,0.3137254901960784 ] } } @@ -14022,15 +14022,15 @@ } }, { - "id":"sampled231", + "id":"sampled_rectangularSensor_environmentOcclusionMaterial_solidColor_color", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.12941176470588237,0.13333333333333333,0.13725490196078433,0.12549019607843137, - 3600,0.1450980392156863,0.14901960784313725,0.15294117647058825,0.1411764705882353 + 0,0.06666666666666667,0.26666666666666666,0.5843137254901961,0.9294117647058824, + 3600,0.7019607843137254,0.1803921568627451,0.9019607843137255,0.7529411764705882 ] } } @@ -14038,22 +14038,22 @@ } }, { - "id":"sampled232", + "id":"sampled_rectangularSensor_environmentOcclusionMaterial_image", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,605,606, - 3600,607,608 + 0,19700,62796, + 3600,47399,44729 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,73,74,75,72, - 3600,77,78,79,76 + 0,109,139,89,7, + 3600,44,196,205,58 ] } } @@ -14061,43 +14061,43 @@ } }, { - "id":"sampled233", + "id":"sampled_rectangularSensor_environmentOcclusionMaterial_grid", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,81,82,83,80, - 3600,85,86,87,84 + 0,184,7,85,40, + 3600,113,30,153,94 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,465, - 3600,466 + 0,31388, + 3600,50246 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,609,610, - 3600,611,612 + 0,47281,7864, + 3600,39095,25240 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,613,614, - 3600,615,616 + 0,3327,5644, + 3600,25573,63843 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,617,618, - 3600,619,620 + 0,38263,47765, + 3600,65149,50686 ] } } @@ -14105,36 +14105,36 @@ } }, { - "id":"sampled234", + "id":"sampled_rectangularSensor_environmentOcclusionMaterial_stripe", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,89,90,91,88, - 3600,93,94,95,92 + 0,7,198,5,254, + 3600,58,1,207,7 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,97,98,99,96, - 3600,101,102,103,100 + 0,132,103,81,252, + 3600,132,126,121,50 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,467, - 3600,468 + 0,25002, + 3600,49962 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,469, - 3600,470 + 0,42274, + 3600,48798 ] } } @@ -14142,15 +14142,15 @@ } }, { - "id":"sampled235", + "id":"sampled_rectangularSensor_environmentOcclusionMaterial_image_color", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.1607843137254902,0.16470588235294117,0.16862745098039217,0.1568627450980392, - 3600,0.17647058823529413,0.1803921568627451,0.1843137254901961,0.17254901960784313 + 0,0.22745098039215686,0.4549019607843137,0.5176470588235295,0.11372549019607843, + 3600,0.29411764705882354,0.4745098039215686,0.6509803921568628,0.07058823529411765 ] } } @@ -14158,15 +14158,15 @@ } }, { - "id":"sampled236", + "id":"sampled_rectangularSensor_environmentOcclusionMaterial_grid_color", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.19215686274509805,0.19607843137254902,0.2,0.18823529411764706, - 3600,0.20784313725490197,0.21176470588235294,0.21568627450980393,0.20392156862745098 + 0,0.8509803921568627,0.6588235294117647,0.7529411764705882,0.24705882352941178, + 3600,0.10980392156862745,0.43529411764705883,0.6745098039215687,0.7490196078431373 ] } } @@ -14174,15 +14174,15 @@ } }, { - "id":"sampled237", + "id":"sampled_rectangularSensor_environmentOcclusionMaterial_stripe_evenColor", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.2235294117647059,0.22745098039215686,0.23137254901960785,0.2196078431372549, - 3600,0.23921568627450981,0.24313725490196078,0.24705882352941178,0.23529411764705882 + 0,0.4392156862745098,0.4470588235294118,0.4549019607843137,0.6431372549019608, + 3600,0.00392156862745098,0.8470588235294118,0.7294117647058823,0.7450980392156863 ] } } @@ -14190,15 +14190,15 @@ } }, { - "id":"sampled238", + "id":"sampled_rectangularSensor_environmentOcclusionMaterial_stripe_oddColor", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.2549019607843137,0.25882352941176473,0.2627450980392157,0.25098039215686274, - 3600,0.27058823529411763,0.27450980392156865,0.2784313725490196,0.26666666666666666 + 0,0.33725490196078434,0.4588235294117647,0.2901960784313726,0.26666666666666666, + 3600,0.4666666666666667,0.592156862745098,0.7490196078431373,0.1411764705882353 ] } } @@ -14206,27 +14206,27 @@ } }, { - "id":"sampled239", + "id":"sampled_rectangularSensor_environmentIntersectionColor_rgbaf", "agi_rectangularSensor":{ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.28627450980392155,0.2901960784313726,0.29411764705882354,0.2823529411764706, - 3600,0.30196078431372547,0.3058823529411765,0.30980392156862746,0.2980392156862745 + 0,0.788235294117647,0.8156862745098039,0.3568627450980392,0.08235294117647059, + 3600,0.5098039215686274,0.49411764705882355,0.984313725490196,0.5490196078431373 ] } } }, { - "id":"sampled240", + "id":"sampled_fan_material_solidColor_color", "agi_fan":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3176470588235294,0.3215686274509804,0.3254901960784314,0.3137254901960784, - 3600,0.3333333333333333,0.33725490196078434,0.3411764705882353,0.32941176470588235 + 0,0.9372549019607843,0.24705882352941178,0.43137254901960786,0.6705882352941176, + 3600,0.33725490196078434,0.25098039215686274,0.8901960784313725,0.30196078431372547 ] } } @@ -14234,22 +14234,22 @@ } }, { - "id":"sampled241", + "id":"sampled_fan_material_image", "agi_fan":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,621,622, - 3600,623,624 + 0,58726,59621, + 3600,46654,63670 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,105,106,107,104, - 3600,109,110,111,108 + 0,216,94,86,115, + 3600,82,234,215,175 ] } } @@ -14257,43 +14257,43 @@ } }, { - "id":"sampled242", + "id":"sampled_fan_material_grid", "agi_fan":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,113,114,115,112, - 3600,117,118,119,116 + 0,200,56,170,12, + 3600,168,225,32,247 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,471, - 3600,472 + 0,190, + 3600,41775 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,625,626, - 3600,627,628 + 0,10435,52008, + 3600,35404,57482 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,629,630, - 3600,631,632 + 0,44794,63406, + 3600,17262,1347 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,633,634, - 3600,635,636 + 0,35392,13706, + 3600,21580,53844 ] } } @@ -14301,36 +14301,36 @@ } }, { - "id":"sampled243", + "id":"sampled_fan_material_stripe", "agi_fan":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,121,122,123,120, - 3600,125,126,127,124 + 0,84,13,181,112, + 3600,149,17,180,191 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,129,130,131,128, - 3600,133,134,135,132 + 0,233,177,162,91, + 3600,130,61,125,114 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,473, - 3600,474 + 0,51679, + 3600,59208 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,475, - 3600,476 + 0,19977, + 3600,19954 ] } } @@ -14338,15 +14338,15 @@ } }, { - "id":"sampled244", + "id":"sampled_fan_material_image_color", "agi_fan":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.34901960784313724,0.35294117647058826,0.3568627450980392,0.34509803921568627, - 3600,0.36470588235294116,0.3686274509803922,0.37254901960784315,0.3607843137254902 + 0,0.9490196078431372,0.6941176470588235,0.9098039215686274,0.3176470588235294, + 3600,0.8784313725490196,0.08235294117647059,0.7529411764705882,0.2235294117647059 ] } } @@ -14354,15 +14354,15 @@ } }, { - "id":"sampled245", + "id":"sampled_fan_material_grid_color", "agi_fan":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3803921568627451,0.3843137254901961,0.38823529411764707,0.3764705882352941, - 3600,0.396078431372549,0.4,0.403921568627451,0.39215686274509803 + 0,0.4117647058823529,0.4235294117647059,0.3764705882352941,0.5019607843137255, + 3600,0.8823529411764706,0.03137254901960784,0.13725490196078433,0.9490196078431372 ] } } @@ -14370,15 +14370,15 @@ } }, { - "id":"sampled246", + "id":"sampled_fan_material_stripe_evenColor", "agi_fan":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4117647058823529,0.41568627450980394,0.4196078431372549,0.40784313725490196, - 3600,0.42745098039215684,0.43137254901960786,0.43529411764705883,0.4235294117647059 + 0,0.00392156862745098,0.16470588235294117,0.9019607843137255,0.9215686274509803, + 3600,0.33725490196078434,0.27450980392156865,0.6,0.6941176470588235 ] } } @@ -14386,15 +14386,15 @@ } }, { - "id":"sampled247", + "id":"sampled_fan_material_stripe_oddColor", "agi_fan":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.44313725490196076,0.4470588235294118,0.45098039215686275,0.4392156862745098, - 3600,0.4588235294117647,0.4627450980392157,0.4666666666666667,0.4549019607843137 + 0,0.0392156862745098,0.611764705882353,0.8,0.3254901960784314, + 3600,0.17647058823529413,0.8470588235294118,0.8784313725490196,0.023529411764705882 ] } } @@ -14402,61 +14402,61 @@ } }, { - "id":"sampled248", + "id":"sampled_fan_outlineColor_rgbaf", "agi_fan":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4745098039215686,0.47843137254901963,0.4823529411764706,0.47058823529411764, - 3600,0.49019607843137253,0.49411764705882355,0.4980392156862745,0.48627450980392156 + 0,0.1411764705882353,0.6784313725490196,0.6705882352941176,0.9254901960784314, + 3600,0.5411764705882353,0.7607843137254902,0.38823529411764707,0.12941176470588237 ] } } }, { - "id":"sampled249", + "id":"sampled_vector_color_rgbaf", "agi_vector":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5058823529411764,0.5098039215686274,0.5137254901960784,0.5019607843137255, - 3600,0.5215686274509804,0.5254901960784314,0.5294117647058824,0.5176470588235295 + 0,0.3058823529411765,0.9803921568627451,0.796078431372549,0.24313725490196078, + 3600,0.5686274509803921,0.6352941176470588,0.6588235294117647,0.0196078431372549 ] } } }, { - "id":"sampled250", + "id":"sampled_vector_direction_unitSpherical", "agi_vector":{ "direction":{ "epoch":"2016-06-17T12:00:00Z", "unitSpherical":[ - 0,9,10, - 3600,11,12 + 0,42298,7077, + 3600,35027,44936 ] } } }, { - "id":"sampled251", + "id":"sampled_vector_direction_cartesian", "agi_vector":{ "direction":{ "epoch":"2016-06-17T12:00:00Z", "cartesian":[ - 0,70,71,72, - 3600,73,74,75 + 0,23178,55642,4825, + 3600,11195,57387,64992 ] } } }, { - "id":"sampled252", + "id":"sampled_vector_direction_unitCartesian", "agi_vector":{ "direction":{ "epoch":"2016-06-17T12:00:00Z", "unitCartesian":[ - 0,0.5352015302352019,0.5763708787148328,0.6175402271944639, - 3600,0.542762825242207,0.576685501819845,0.610608178397482 + 0,0.5532827915003591,0.6961099100967651,0.4575031646826541, + 3600,0.7546657014303162,0.11520131359926604,0.6459166636878882 ] } } diff --git a/Specs/DataSources/CzmlDataSourceSpec.js b/Specs/DataSources/CzmlDataSourceSpec.js index 3e3d8cf9da4a..321dced1255d 100644 --- a/Specs/DataSources/CzmlDataSourceSpec.js +++ b/Specs/DataSources/CzmlDataSourceSpec.js @@ -2833,680 +2833,680 @@ defineSuite([ var constant = e = dataSource.entities.getById('Constant'); expect(e).toBeDefined(); date = JulianDate.now(); - expect(e.description.getValue(date)).toEqual('string1'); - expect(e.position.getValue(date)).toEqual(new Cartesian3(1, 2, 3)); - expect(e.orientation.getValue(date)).toEqualEpsilon(new Quaternion(0.365148371670111, 0.547722557505166, 0.730296743340221, 0.182574185835055), 1e-14); - expect(e.viewFrom.getValue(date)).toEqual(new Cartesian3(4, 5, 6)); + expect(e.description.getValue(date)).toEqual('string31449'); + expect(e.position.getValue(date)).toEqual(new Cartesian3(24944, 16481, 24896)); + expect(e.orientation.getValue(date)).toEqualEpsilon(new Quaternion(0.431493311977589, 0.560811914509339, 0.423522822587574, 0.565625261998114), 1e-14); + expect(e.viewFrom.getValue(date)).toEqual(new Cartesian3(17794, 13381, 18228)); expect(e.billboard.show.getValue(date)).toEqual(true); - expect(e.billboard.image.getValue(date)).toEqual('http://example.com/1'); - expect(e.billboard.scale.getValue(date)).toEqual(1.0); - expect(e.billboard.pixelOffset.getValue(date)).toEqual(new Cartesian2(1, 2)); - expect(e.billboard.eyeOffset.getValue(date)).toEqual(new Cartesian3(7, 8, 9)); + expect(e.billboard.image.getValue(date)).toEqual('http://example.com/3792'); + expect(e.billboard.scale.getValue(date)).toEqual(27514.0); + expect(e.billboard.pixelOffset.getValue(date)).toEqual(new Cartesian2(16996, 51010)); + expect(e.billboard.eyeOffset.getValue(date)).toEqual(new Cartesian3(64633, 11516, 17196)); expect(e.billboard.horizontalOrigin.getValue(date)).toEqual(HorizontalOrigin.LEFT); expect(e.billboard.verticalOrigin.getValue(date)).toEqual(VerticalOrigin.BOTTOM); expect(e.billboard.heightReference.getValue(date)).toEqual(HeightReference.CLAMP_TO_GROUND); - expect(e.billboard.color.getValue(date)).toEqual(Color.fromBytes(2, 3, 4, 1)); - expect(e.billboard.rotation.getValue(date)).toEqual(2.0); - expect(e.billboard.alignedAxis.getValue(date)).toEqualEpsilon(new Cartesian3(0.267261241912424, 0.534522483824849, 0.801783725737273), 1e-14); + expect(e.billboard.color.getValue(date)).toEqual(Color.fromBytes(87, 118, 167, 140)); + expect(e.billboard.rotation.getValue(date)).toEqual(57379.0); + expect(e.billboard.alignedAxis.getValue(date)).toEqualEpsilon(new Cartesian3(0.205062091895724, 0.975768213485699, 0.0763277932228903), 1e-14); expect(e.billboard.sizeInMeters.getValue(date)).toEqual(true); - expect(e.billboard.width.getValue(date)).toEqual(3.0); - expect(e.billboard.height.getValue(date)).toEqual(4.0); - expect(e.billboard.scaleByDistance.getValue(date)).toEqual(new NearFarScalar(1, 2, 3, 4)); - expect(e.billboard.translucencyByDistance.getValue(date)).toEqual(new NearFarScalar(5, 6, 7, 8)); - expect(e.billboard.pixelOffsetScaleByDistance.getValue(date)).toEqual(new NearFarScalar(9, 10, 11, 12)); - expect(e.billboard.imageSubRegion.getValue(date)).toEqual(new BoundingRectangle(1, 2, 3, 4)); + expect(e.billboard.width.getValue(date)).toEqual(25197.0); + expect(e.billboard.height.getValue(date)).toEqual(53328.0); + expect(e.billboard.scaleByDistance.getValue(date)).toEqual(new NearFarScalar(59318, 31207, 63353, 55287)); + expect(e.billboard.translucencyByDistance.getValue(date)).toEqual(new NearFarScalar(43707, 31146, 12921, 57138)); + expect(e.billboard.pixelOffsetScaleByDistance.getValue(date)).toEqual(new NearFarScalar(11873, 40494, 29598, 27507)); + expect(e.billboard.imageSubRegion.getValue(date)).toEqual(new BoundingRectangle(62620, 63220, 23030, 63321)); expect(e.box.show.getValue(date)).toEqual(true); - expect(e.box.dimensions.getValue(date)).toEqual(new Cartesian3(10, 11, 12)); + expect(e.box.dimensions.getValue(date)).toEqual(new Cartesian3(57494, 62432, 42995)); expect(e.box.fill.getValue(date)).toEqual(true); - expect(e.box.material.color.getValue(date)).toEqual(Color.fromBytes(6, 7, 8, 5)); + expect(e.box.material.color.getValue(date)).toEqual(Color.fromBytes(88, 226, 91, 144)); expect(e.box.outline.getValue(date)).toEqual(true); - expect(e.box.outlineColor.getValue(date)).toEqual(Color.fromBytes(10, 11, 12, 9)); - expect(e.box.outlineWidth.getValue(date)).toEqual(5.0); + expect(e.box.outlineColor.getValue(date)).toEqual(Color.fromBytes(121, 42, 244, 168)); + expect(e.box.outlineWidth.getValue(date)).toEqual(15323.0); expect(e.corridor.show.getValue(date)).toEqual(true); - expect(e.corridor.positions.getValue(date)).toEqual([ new Cartesian3(1, 2, 3), new Cartesian3(4, 5, 6) ]); - expect(e.corridor.width.getValue(date)).toEqual(6.0); - expect(e.corridor.height.getValue(date)).toEqual(7.0); - expect(e.corridor.extrudedHeight.getValue(date)).toEqual(8.0); + expect(e.corridor.positions.getValue(date)).toEqual([ new Cartesian3(36415, 2702, 36618), new Cartesian3(47759, 11706, 63277) ]); + expect(e.corridor.width.getValue(date)).toEqual(20413.0); + expect(e.corridor.height.getValue(date)).toEqual(8062.0); + expect(e.corridor.extrudedHeight.getValue(date)).toEqual(22846.0); expect(e.corridor.cornerType.getValue(date)).toEqual(CornerType.BEVELED); - expect(e.corridor.granularity.getValue(date)).toEqual(9.0); + expect(e.corridor.granularity.getValue(date)).toEqual(44105.0); expect(e.corridor.fill.getValue(date)).toEqual(true); - expect(e.corridor.material.color.getValue(date)).toEqual(Color.fromBytes(14, 15, 16, 13)); + expect(e.corridor.material.color.getValue(date)).toEqual(Color.fromBytes(230, 252, 22, 236)); expect(e.corridor.outline.getValue(date)).toEqual(true); - expect(e.corridor.outlineColor.getValue(date)).toEqual(Color.fromBytes(18, 19, 20, 17)); - expect(e.corridor.outlineWidth.getValue(date)).toEqual(10.0); + expect(e.corridor.outlineColor.getValue(date)).toEqual(Color.fromBytes(198, 25, 134, 60)); + expect(e.corridor.outlineWidth.getValue(date)).toEqual(9132.0); expect(e.cylinder.show.getValue(date)).toEqual(true); - expect(e.cylinder.length.getValue(date)).toEqual(11.0); - expect(e.cylinder.topRadius.getValue(date)).toEqual(12.0); - expect(e.cylinder.bottomRadius.getValue(date)).toEqual(13.0); + expect(e.cylinder.length.getValue(date)).toEqual(33298.0); + expect(e.cylinder.topRadius.getValue(date)).toEqual(16245.0); + expect(e.cylinder.bottomRadius.getValue(date)).toEqual(59378.0); expect(e.cylinder.fill.getValue(date)).toEqual(true); - expect(e.cylinder.material.color.getValue(date)).toEqual(Color.fromBytes(22, 23, 24, 21)); + expect(e.cylinder.material.color.getValue(date)).toEqual(Color.fromBytes(216, 68, 53, 64)); expect(e.cylinder.outline.getValue(date)).toEqual(true); - expect(e.cylinder.outlineColor.getValue(date)).toEqual(Color.fromBytes(26, 27, 28, 25)); - expect(e.cylinder.outlineWidth.getValue(date)).toEqual(14.0); - expect(e.cylinder.numberOfVerticalLines.getValue(date)).toEqual(15.0); - expect(e.cylinder.slices.getValue(date)).toEqual(16.0); + expect(e.cylinder.outlineColor.getValue(date)).toEqual(Color.fromBytes(4, 90, 209, 96)); + expect(e.cylinder.outlineWidth.getValue(date)).toEqual(64018.0); + expect(e.cylinder.numberOfVerticalLines.getValue(date)).toEqual(38567.0); + expect(e.cylinder.slices.getValue(date)).toEqual(39979.0); expect(e.ellipse.show.getValue(date)).toEqual(true); - expect(e.ellipse.semiMajorAxis.getValue(date)).toEqual(17.0); - expect(e.ellipse.semiMinorAxis.getValue(date)).toEqual(18.0); - expect(e.ellipse.height.getValue(date)).toEqual(19.0); - expect(e.ellipse.extrudedHeight.getValue(date)).toEqual(20.0); - expect(e.ellipse.rotation.getValue(date)).toEqual(21.0); - expect(e.ellipse.stRotation.getValue(date)).toEqual(22.0); - expect(e.ellipse.granularity.getValue(date)).toEqual(23.0); + expect(e.ellipse.semiMajorAxis.getValue(date)).toEqual(60072.0); + expect(e.ellipse.semiMinorAxis.getValue(date)).toEqual(38653.0); + expect(e.ellipse.height.getValue(date)).toEqual(15549.0); + expect(e.ellipse.extrudedHeight.getValue(date)).toEqual(55640.0); + expect(e.ellipse.rotation.getValue(date)).toEqual(27722.0); + expect(e.ellipse.stRotation.getValue(date)).toEqual(4692.0); + expect(e.ellipse.granularity.getValue(date)).toEqual(62192.0); expect(e.ellipse.fill.getValue(date)).toEqual(true); - expect(e.ellipse.material.color.getValue(date)).toEqual(Color.fromBytes(30, 31, 32, 29)); + expect(e.ellipse.material.color.getValue(date)).toEqual(Color.fromBytes(116, 186, 200, 40)); expect(e.ellipse.outline.getValue(date)).toEqual(true); - expect(e.ellipse.outlineColor.getValue(date)).toEqual(Color.fromBytes(34, 35, 36, 33)); - expect(e.ellipse.outlineWidth.getValue(date)).toEqual(24.0); - expect(e.ellipse.numberOfVerticalLines.getValue(date)).toEqual(25.0); + expect(e.ellipse.outlineColor.getValue(date)).toEqual(Color.fromBytes(160, 82, 145, 104)); + expect(e.ellipse.outlineWidth.getValue(date)).toEqual(8839.0); + expect(e.ellipse.numberOfVerticalLines.getValue(date)).toEqual(38878.0); expect(e.ellipsoid.show.getValue(date)).toEqual(true); - expect(e.ellipsoid.radii.getValue(date)).toEqual(new Cartesian3(13, 14, 15)); + expect(e.ellipsoid.radii.getValue(date)).toEqual(new Cartesian3(15638, 24381, 37983)); expect(e.ellipsoid.fill.getValue(date)).toEqual(true); - expect(e.ellipsoid.material.color.getValue(date)).toEqual(Color.fromBytes(38, 39, 40, 37)); + expect(e.ellipsoid.material.color.getValue(date)).toEqual(Color.fromBytes(202, 67, 110, 69)); expect(e.ellipsoid.outline.getValue(date)).toEqual(true); - expect(e.ellipsoid.outlineColor.getValue(date)).toEqual(Color.fromBytes(42, 43, 44, 41)); - expect(e.ellipsoid.outlineWidth.getValue(date)).toEqual(26.0); - expect(e.ellipsoid.stackPartitions.getValue(date)).toEqual(27.0); - expect(e.ellipsoid.slicePartitions.getValue(date)).toEqual(28.0); - expect(e.ellipsoid.subdivisions.getValue(date)).toEqual(29.0); + expect(e.ellipsoid.outlineColor.getValue(date)).toEqual(Color.fromBytes(55, 23, 226, 7)); + expect(e.ellipsoid.outlineWidth.getValue(date)).toEqual(47507.0); + expect(e.ellipsoid.stackPartitions.getValue(date)).toEqual(54278.0); + expect(e.ellipsoid.slicePartitions.getValue(date)).toEqual(28562.0); + expect(e.ellipsoid.subdivisions.getValue(date)).toEqual(14008.0); expect(e.label.show.getValue(date)).toEqual(true); - expect(e.label.text.getValue(date)).toEqual('string2'); - expect(e.label.font.getValue(date)).toEqual('6px sans-serif'); + expect(e.label.text.getValue(date)).toEqual('string36641'); + expect(e.label.font.getValue(date)).toEqual('14px sans-serif'); expect(e.label.style.getValue(date)).toEqual(LabelStyle.FILL_AND_OUTLINE); - expect(e.label.scale.getValue(date)).toEqual(30.0); - expect(e.label.pixelOffset.getValue(date)).toEqual(new Cartesian2(3, 4)); - expect(e.label.eyeOffset.getValue(date)).toEqual(new Cartesian3(16, 17, 18)); + expect(e.label.scale.getValue(date)).toEqual(6510.0); + expect(e.label.pixelOffset.getValue(date)).toEqual(new Cartesian2(25913, 30821)); + expect(e.label.eyeOffset.getValue(date)).toEqual(new Cartesian3(30502, 29047, 25457)); expect(e.label.horizontalOrigin.getValue(date)).toEqual(HorizontalOrigin.LEFT); expect(e.label.verticalOrigin.getValue(date)).toEqual(VerticalOrigin.BOTTOM); expect(e.label.heightReference.getValue(date)).toEqual(HeightReference.CLAMP_TO_GROUND); - expect(e.label.fillColor.getValue(date)).toEqual(Color.fromBytes(46, 47, 48, 45)); - expect(e.label.outlineColor.getValue(date)).toEqual(Color.fromBytes(50, 51, 52, 49)); - expect(e.label.outlineWidth.getValue(date)).toEqual(31.0); - expect(e.label.translucencyByDistance.getValue(date)).toEqual(new NearFarScalar(13, 14, 15, 16)); - expect(e.label.pixelOffsetScaleByDistance.getValue(date)).toEqual(new NearFarScalar(17, 18, 19, 20)); + expect(e.label.fillColor.getValue(date)).toEqual(Color.fromBytes(88, 197, 147, 137)); + expect(e.label.outlineColor.getValue(date)).toEqual(Color.fromBytes(171, 128, 159, 223)); + expect(e.label.outlineWidth.getValue(date)).toEqual(36637.0); + expect(e.label.translucencyByDistance.getValue(date)).toEqual(new NearFarScalar(34067, 16517, 11328, 13612)); + expect(e.label.pixelOffsetScaleByDistance.getValue(date)).toEqual(new NearFarScalar(21220, 35154, 33161, 36737)); expect(e.model.show.getValue(date)).toEqual(true); - expect(e.model.uri.getValue(date)).toEqual('http://example.com/2'); - expect(e.model.scale.getValue(date)).toEqual(32.0); - expect(e.model.minimumPixelSize.getValue(date)).toEqual(33.0); - expect(e.model.maximumScale.getValue(date)).toEqual(34.0); + expect(e.model.uri.getValue(date)).toEqual('http://example.com/60043'); + expect(e.model.scale.getValue(date)).toEqual(44278.0); + expect(e.model.minimumPixelSize.getValue(date)).toEqual(35888.0); + expect(e.model.maximumScale.getValue(date)).toEqual(64305.0); expect(e.model.incrementallyLoadTextures.getValue(date)).toEqual(true); expect(e.model.runAnimations.getValue(date)).toEqual(true); expect(e.model.heightReference.getValue(date)).toEqual(HeightReference.CLAMP_TO_GROUND); - expect(e.model.color.getValue(date)).toEqual(Color.fromBytes(54, 55, 56, 53)); + expect(e.model.color.getValue(date)).toEqual(Color.fromBytes(0, 52, 75, 73)); expect(e.model.colorBlendMode.getValue(date)).toEqual(ColorBlendMode.REPLACE); - expect(e.model.colorBlendAmount.getValue(date)).toEqual(35.0); - expect(e.model.nodeTransformations.prop.translation.getValue(date)).toEqual(new Cartesian3(19, 20, 21)); - expect(e.model.nodeTransformations.prop.rotation.getValue(date)).toEqualEpsilon(new Quaternion(0.454858826147342, 0.530668630505232, 0.606478434863123, 0.379049021789452), 1e-14); - expect(e.model.nodeTransformations.prop.scale.getValue(date)).toEqual(new Cartesian3(22, 23, 24)); + expect(e.model.colorBlendAmount.getValue(date)).toEqual(7475.0); + expect(e.model.nodeTransformations.prop.translation.getValue(date)).toEqual(new Cartesian3(18548, 48456, 21181)); + expect(e.model.nodeTransformations.prop.rotation.getValue(date)).toEqualEpsilon(new Quaternion(0.527960606328925, 0.567156704919186, 0.624812964569899, 0.0959146992664751), 1e-14); + expect(e.model.nodeTransformations.prop.scale.getValue(date)).toEqual(new Cartesian3(53739, 37841, 41107)); expect(e.path.show.getValue(date)).toEqual(true); - expect(e.path.width.getValue(date)).toEqual(36.0); - expect(e.path.resolution.getValue(date)).toEqual(37.0); - expect(e.path.leadTime.getValue(date)).toEqual(38.0); - expect(e.path.trailTime.getValue(date)).toEqual(39.0); - expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(58, 59, 60, 57)); + expect(e.path.width.getValue(date)).toEqual(56040.0); + expect(e.path.resolution.getValue(date)).toEqual(31563.0); + expect(e.path.leadTime.getValue(date)).toEqual(5997.0); + expect(e.path.trailTime.getValue(date)).toEqual(52915.0); + expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(10, 78, 168, 13)); expect(e.point.show.getValue(date)).toEqual(true); - expect(e.point.pixelSize.getValue(date)).toEqual(40.0); + expect(e.point.pixelSize.getValue(date)).toEqual(53869.0); expect(e.point.heightReference.getValue(date)).toEqual(HeightReference.CLAMP_TO_GROUND); - expect(e.point.color.getValue(date)).toEqual(Color.fromBytes(62, 63, 64, 61)); - expect(e.point.outlineColor.getValue(date)).toEqual(Color.fromBytes(66, 67, 68, 65)); - expect(e.point.outlineWidth.getValue(date)).toEqual(41.0); - expect(e.point.scaleByDistance.getValue(date)).toEqual(new NearFarScalar(21, 22, 23, 24)); - expect(e.point.translucencyByDistance.getValue(date)).toEqual(new NearFarScalar(25, 26, 27, 28)); + expect(e.point.color.getValue(date)).toEqual(Color.fromBytes(3, 147, 219, 77)); + expect(e.point.outlineColor.getValue(date)).toEqual(Color.fromBytes(254, 106, 11, 94)); + expect(e.point.outlineWidth.getValue(date)).toEqual(27922.0); + expect(e.point.scaleByDistance.getValue(date)).toEqual(new NearFarScalar(20128, 16462, 49728, 18882)); + expect(e.point.translucencyByDistance.getValue(date)).toEqual(new NearFarScalar(52796, 43982, 61099, 50158)); expect(e.polygon.show.getValue(date)).toEqual(true); - expect(e.polygon.hierarchy.getValue(date)).toEqual([ new Cartesian3(7, 8, 9), new Cartesian3(10, 11, 12) ]); - expect(e.polygon.height.getValue(date)).toEqual(42.0); - expect(e.polygon.extrudedHeight.getValue(date)).toEqual(43.0); - expect(e.polygon.stRotation.getValue(date)).toEqual(44.0); - expect(e.polygon.granularity.getValue(date)).toEqual(45.0); + expect(e.polygon.hierarchy.getValue(date)).toEqual([ new Cartesian3(39143, 2200, 6408), new Cartesian3(27161, 33386, 62338) ]); + expect(e.polygon.height.getValue(date)).toEqual(26391.0); + expect(e.polygon.extrudedHeight.getValue(date)).toEqual(15922.0); + expect(e.polygon.stRotation.getValue(date)).toEqual(2555.0); + expect(e.polygon.granularity.getValue(date)).toEqual(17060.0); expect(e.polygon.fill.getValue(date)).toEqual(true); - expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(70, 71, 72, 69)); + expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(216, 139, 124, 253)); expect(e.polygon.outline.getValue(date)).toEqual(true); - expect(e.polygon.outlineColor.getValue(date)).toEqual(Color.fromBytes(74, 75, 76, 73)); - expect(e.polygon.outlineWidth.getValue(date)).toEqual(46.0); + expect(e.polygon.outlineColor.getValue(date)).toEqual(Color.fromBytes(172, 48, 134, 87)); + expect(e.polygon.outlineWidth.getValue(date)).toEqual(62220.0); expect(e.polygon.perPositionHeight.getValue(date)).toEqual(true); expect(e.polygon.closeTop.getValue(date)).toEqual(true); expect(e.polygon.closeBottom.getValue(date)).toEqual(true); expect(e.polyline.show.getValue(date)).toEqual(true); - expect(e.polyline.positions.getValue(date)).toEqual([ new Cartesian3(13, 14, 15), new Cartesian3(16, 17, 18) ]); - expect(e.polyline.width.getValue(date)).toEqual(47.0); - expect(e.polyline.granularity.getValue(date)).toEqual(48.0); - expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(78, 79, 80, 77)); + expect(e.polyline.positions.getValue(date)).toEqual([ new Cartesian3(23333, 31067, 17529), new Cartesian3(57924, 41186, 31648) ]); + expect(e.polyline.width.getValue(date)).toEqual(14667.0); + expect(e.polyline.granularity.getValue(date)).toEqual(53395.0); + expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(88, 0, 232, 230)); expect(e.polyline.followSurface.getValue(date)).toEqual(true); expect(e.rectangle.show.getValue(date)).toEqual(true); - expect(e.rectangle.coordinates.getValue(date)).toEqual(new Rectangle(1, 0.429203673205103, 1.4292036732051, 0.858407346410207)); - expect(e.rectangle.height.getValue(date)).toEqual(49.0); - expect(e.rectangle.extrudedHeight.getValue(date)).toEqual(50.0); - expect(e.rectangle.rotation.getValue(date)).toEqual(51.0); - expect(e.rectangle.stRotation.getValue(date)).toEqual(52.0); - expect(e.rectangle.granularity.getValue(date)).toEqual(53.0); + expect(e.rectangle.coordinates.getValue(date)).toEqual(new Rectangle(1.13325368272577, 0.703573207377445, 0.756676249095309, 0.339217858685931)); + expect(e.rectangle.height.getValue(date)).toEqual(20608.0); + expect(e.rectangle.extrudedHeight.getValue(date)).toEqual(23002.0); + expect(e.rectangle.rotation.getValue(date)).toEqual(54979.0); + expect(e.rectangle.stRotation.getValue(date)).toEqual(8079.0); + expect(e.rectangle.granularity.getValue(date)).toEqual(60343.0); expect(e.rectangle.fill.getValue(date)).toEqual(true); - expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(82, 83, 84, 81)); + expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(160, 249, 70, 249)); expect(e.rectangle.outline.getValue(date)).toEqual(true); - expect(e.rectangle.outlineColor.getValue(date)).toEqual(Color.fromBytes(86, 87, 88, 85)); - expect(e.rectangle.outlineWidth.getValue(date)).toEqual(54.0); + expect(e.rectangle.outlineColor.getValue(date)).toEqual(Color.fromBytes(196, 59, 142, 36)); + expect(e.rectangle.outlineWidth.getValue(date)).toEqual(59794.0); expect(e.rectangle.closeTop.getValue(date)).toEqual(true); expect(e.rectangle.closeBottom.getValue(date)).toEqual(true); expect(e.wall.show.getValue(date)).toEqual(true); - expect(e.wall.positions.getValue(date)).toEqual([ new Cartesian3(19, 20, 21), new Cartesian3(22, 23, 24) ]); - expect(e.wall.minimumHeights.getValue(date)).toEqual([ 1, 2 ]); - expect(e.wall.maximumHeights.getValue(date)).toEqual([ 3, 4 ]); - expect(e.wall.granularity.getValue(date)).toEqual(55.0); + expect(e.wall.positions.getValue(date)).toEqual([ new Cartesian3(21681, 40276, 30621), new Cartesian3(3959, 61967, 19442) ]); + expect(e.wall.minimumHeights.getValue(date)).toEqual([ 49466, 44737 ]); + expect(e.wall.maximumHeights.getValue(date)).toEqual([ 59672, 62697 ]); + expect(e.wall.granularity.getValue(date)).toEqual(47652.0); expect(e.wall.fill.getValue(date)).toEqual(true); - expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(90, 91, 92, 89)); + expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(64, 176, 190, 65)); expect(e.wall.outline.getValue(date)).toEqual(true); - expect(e.wall.outlineColor.getValue(date)).toEqual(Color.fromBytes(94, 95, 96, 93)); - expect(e.wall.outlineWidth.getValue(date)).toEqual(56.0); - expect(e = dataSource.entities.getById('constant1')).toBeDefined(); - expect(e.position.getValue(date)).toEqual(Cartesian3.fromRadians(1, 0.429203673205103, 3)); - expect(e = dataSource.entities.getById('constant2')).toBeDefined(); - expect(e.position.getValue(date)).toEqual(Cartesian3.fromDegrees(4, 5, 6)); - expect(e = dataSource.entities.getById('constant3')).toBeDefined(); - expect(e.position.getValue(date)).toEqual(new Cartesian3(1, 2, 3)); - expect(e = dataSource.entities.getById('constant4')).toBeDefined(); - expect(e.billboard.color.getValue(date)).toEqualEpsilon(new Color(0.00784313725490196, 0.0117647058823529, 0.0156862745098039, 0.00392156862745098), 1e-14); - expect(e = dataSource.entities.getById('constant5')).toBeDefined(); - expect(e.billboard.alignedAxis.getValue(date)).toEqual(Cartesian3.fromSpherical(new Spherical(1, 2))); - expect(e = dataSource.entities.getById('constant6')).toBeDefined(); - expect(e.box.material.color.getValue(date)).toEqualEpsilon(new Color(0.0235294117647059, 0.0274509803921569, 0.0313725490196078, 0.0196078431372549), 1e-14); + expect(e.wall.outlineColor.getValue(date)).toEqual(Color.fromBytes(107, 196, 96, 198)); + expect(e.wall.outlineWidth.getValue(date)).toEqual(50458.0); + expect(e = dataSource.entities.getById('constant_position_cartographicRadians')).toBeDefined(); + expect(e.position.getValue(date)).toEqual(Cartesian3.fromRadians(0.368123392863751, 0.678098621973879, 32050)); + expect(e = dataSource.entities.getById('constant_position_cartographicDegrees')).toBeDefined(); + expect(e.position.getValue(date)).toEqual(Cartesian3.fromDegrees(14, 14, 24697)); + expect(e = dataSource.entities.getById('constant_position_cartesianVelocity')).toBeDefined(); + expect(e.position.getValue(date)).toEqual(new Cartesian3(15776, 23613, 14940)); + expect(e = dataSource.entities.getById('constant_billboard_color_rgbaf')).toBeDefined(); + expect(e.billboard.color.getValue(date)).toEqualEpsilon(new Color(0.674509803921569, 0.866666666666667, 0.6, 0.650980392156863), 1e-14); + expect(e = dataSource.entities.getById('constant_billboard_alignedAxis_unitSpherical')).toBeDefined(); + expect(e.billboard.alignedAxis.getValue(date)).toEqual(Cartesian3.fromSpherical(new Spherical(20514, 39760))); + expect(e = dataSource.entities.getById('constant_box_material_solidColor_color')).toBeDefined(); + expect(e.box.material.color.getValue(date)).toEqualEpsilon(new Color(0.996078431372549, 0.0823529411764706, 0.494117647058824, 0.101960784313725), 1e-14); expect(e = dataSource.entities.getById('material_box_material_image')).toBeDefined(); - expect(e.box.material.image.getValue(date)).toEqual('http://example.com/3'); - expect(e.box.material.repeat.getValue(date)).toEqual(new Cartesian2(5, 6)); - expect(e.box.material.color.getValue(date)).toEqual(Color.fromBytes(194, 195, 196, 193)); + expect(e.box.material.image.getValue(date)).toEqual('http://example.com/50881'); + expect(e.box.material.repeat.getValue(date)).toEqual(new Cartesian2(58955, 45286)); + expect(e.box.material.color.getValue(date)).toEqual(Color.fromBytes(98, 97, 133, 129)); expect(e.box.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_box_material_grid')).toBeDefined(); - expect(e.box.material.color.getValue(date)).toEqual(Color.fromBytes(198, 199, 200, 197)); - expect(e.box.material.cellAlpha.getValue(date)).toEqual(77.0); - expect(e.box.material.lineCount.getValue(date)).toEqual(new Cartesian2(7, 8)); - expect(e.box.material.lineThickness.getValue(date)).toEqual(new Cartesian2(9, 10)); - expect(e.box.material.lineOffset.getValue(date)).toEqual(new Cartesian2(11, 12)); + expect(e.box.material.color.getValue(date)).toEqual(Color.fromBytes(178, 10, 106, 226)); + expect(e.box.material.cellAlpha.getValue(date)).toEqual(47180.0); + expect(e.box.material.lineCount.getValue(date)).toEqual(new Cartesian2(24659, 13408)); + expect(e.box.material.lineThickness.getValue(date)).toEqual(new Cartesian2(13897, 25654)); + expect(e.box.material.lineOffset.getValue(date)).toEqual(new Cartesian2(14153, 49207)); expect(e = dataSource.entities.getById('material_box_material_stripe')).toBeDefined(); expect(e.box.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.box.material.evenColor.getValue(date)).toEqual(Color.fromBytes(202, 203, 204, 201)); - expect(e.box.material.oddColor.getValue(date)).toEqual(Color.fromBytes(206, 207, 208, 205)); - expect(e.box.material.offset.getValue(date)).toEqual(78.0); - expect(e.box.material.repeat.getValue(date)).toEqual(79.0); - expect(e = dataSource.entities.getById('material1')).toBeDefined(); - expect(e.box.material.color.getValue(date)).toEqualEpsilon(new Color(0.0392156862745098, 0.0431372549019608, 0.0470588235294118, 0.0352941176470588), 1e-14); - expect(e = dataSource.entities.getById('material2')).toBeDefined(); - expect(e.box.material.color.getValue(date)).toEqualEpsilon(new Color(0.0549019607843137, 0.0588235294117647, 0.0627450980392157, 0.0509803921568627), 1e-14); - expect(e = dataSource.entities.getById('material3')).toBeDefined(); - expect(e.box.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.0705882352941176, 0.0745098039215686, 0.0784313725490196, 0.0666666666666667), 1e-14); - expect(e = dataSource.entities.getById('material4')).toBeDefined(); - expect(e.box.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.0862745098039216, 0.0901960784313725, 0.0941176470588235, 0.0823529411764706), 1e-14); - expect(e = dataSource.entities.getById('constant7')).toBeDefined(); - expect(e.box.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.101960784313725, 0.105882352941176, 0.109803921568627, 0.0980392156862745), 1e-14); - expect(e = dataSource.entities.getById('constant8')).toBeDefined(); - expect(e.corridor.positions.getValue(date)).toEqual([ Cartesian3.fromRadians(1, 0.429203673205103, 3), Cartesian3.fromRadians(0.858407346410207, 0.28761101961531, 6) ]); - expect(e = dataSource.entities.getById('constant9')).toBeDefined(); - expect(e.corridor.positions.getValue(date)).toEqual([ Cartesian3.fromDegrees(7, 8, 9), Cartesian3.fromDegrees(10, 11, 12) ]); - expect(e = dataSource.entities.getById('constant10')).toBeDefined(); - expect(e.corridor.material.color.getValue(date)).toEqualEpsilon(new Color(0.117647058823529, 0.12156862745098, 0.125490196078431, 0.113725490196078), 1e-14); + expect(e.box.material.evenColor.getValue(date)).toEqual(Color.fromBytes(18, 147, 177, 80)); + expect(e.box.material.oddColor.getValue(date)).toEqual(Color.fromBytes(189, 226, 187, 107)); + expect(e.box.material.offset.getValue(date)).toEqual(43563.0); + expect(e.box.material.repeat.getValue(date)).toEqual(24480.0); + expect(e = dataSource.entities.getById('constant_box_material_image_color')).toBeDefined(); + expect(e.box.material.color.getValue(date)).toEqualEpsilon(new Color(0.733333333333333, 0.474509803921569, 0.56078431372549, 0.349019607843137), 1e-14); + expect(e = dataSource.entities.getById('constant_box_material_grid_color')).toBeDefined(); + expect(e.box.material.color.getValue(date)).toEqualEpsilon(new Color(0.847058823529412, 0.392156862745098, 0.352941176470588, 0.898039215686275), 1e-14); + expect(e = dataSource.entities.getById('constant_box_material_stripe_evenColor')).toBeDefined(); + expect(e.box.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.666666666666667, 0.976470588235294, 0.83921568627451, 0.643137254901961), 1e-14); + expect(e = dataSource.entities.getById('constant_box_material_stripe_oddColor')).toBeDefined(); + expect(e.box.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.258823529411765, 0.796078431372549, 0.717647058823529, 0.749019607843137), 1e-14); + expect(e = dataSource.entities.getById('constant_box_outlineColor_rgbaf')).toBeDefined(); + expect(e.box.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.835294117647059, 0.0313725490196078, 0.282352941176471, 0.337254901960784), 1e-14); + expect(e = dataSource.entities.getById('constant_corridor_positions_cartographicRadians')).toBeDefined(); + expect(e.corridor.positions.getValue(date)).toEqual([ Cartesian3.fromRadians(0.220356654342316, 0.879184920197648, 64909), Cartesian3.fromRadians(0.175978952571564, 1.00316515710468, 913) ]); + expect(e = dataSource.entities.getById('constant_corridor_positions_cartographicDegrees')).toBeDefined(); + expect(e.corridor.positions.getValue(date)).toEqual([ Cartesian3.fromDegrees(28, 14, 63058), Cartesian3.fromDegrees(15, 37, 26381) ]); + expect(e = dataSource.entities.getById('constant_corridor_material_solidColor_color')).toBeDefined(); + expect(e.corridor.material.color.getValue(date)).toEqualEpsilon(new Color(0.333333333333333, 0.87843137254902, 0.356862745098039, 0.435294117647059), 1e-14); expect(e = dataSource.entities.getById('material_corridor_material_image')).toBeDefined(); - expect(e.corridor.material.image.getValue(date)).toEqual('http://example.com/4'); - expect(e.corridor.material.repeat.getValue(date)).toEqual(new Cartesian2(13, 14)); - expect(e.corridor.material.color.getValue(date)).toEqual(Color.fromBytes(210, 211, 212, 209)); + expect(e.corridor.material.image.getValue(date)).toEqual('http://example.com/8903'); + expect(e.corridor.material.repeat.getValue(date)).toEqual(new Cartesian2(41660, 35234)); + expect(e.corridor.material.color.getValue(date)).toEqual(Color.fromBytes(213, 25, 147, 247)); expect(e.corridor.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_corridor_material_grid')).toBeDefined(); - expect(e.corridor.material.color.getValue(date)).toEqual(Color.fromBytes(214, 215, 216, 213)); - expect(e.corridor.material.cellAlpha.getValue(date)).toEqual(80.0); - expect(e.corridor.material.lineCount.getValue(date)).toEqual(new Cartesian2(15, 16)); - expect(e.corridor.material.lineThickness.getValue(date)).toEqual(new Cartesian2(17, 18)); - expect(e.corridor.material.lineOffset.getValue(date)).toEqual(new Cartesian2(19, 20)); + expect(e.corridor.material.color.getValue(date)).toEqual(Color.fromBytes(236, 51, 112, 235)); + expect(e.corridor.material.cellAlpha.getValue(date)).toEqual(11472.0); + expect(e.corridor.material.lineCount.getValue(date)).toEqual(new Cartesian2(1254, 38404)); + expect(e.corridor.material.lineThickness.getValue(date)).toEqual(new Cartesian2(48962, 63679)); + expect(e.corridor.material.lineOffset.getValue(date)).toEqual(new Cartesian2(39061, 47000)); expect(e = dataSource.entities.getById('material_corridor_material_stripe')).toBeDefined(); expect(e.corridor.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.corridor.material.evenColor.getValue(date)).toEqual(Color.fromBytes(218, 219, 220, 217)); - expect(e.corridor.material.oddColor.getValue(date)).toEqual(Color.fromBytes(222, 223, 224, 221)); - expect(e.corridor.material.offset.getValue(date)).toEqual(81.0); - expect(e.corridor.material.repeat.getValue(date)).toEqual(82.0); - expect(e = dataSource.entities.getById('material5')).toBeDefined(); - expect(e.corridor.material.color.getValue(date)).toEqualEpsilon(new Color(0.133333333333333, 0.137254901960784, 0.141176470588235, 0.129411764705882), 1e-14); - expect(e = dataSource.entities.getById('material6')).toBeDefined(); - expect(e.corridor.material.color.getValue(date)).toEqualEpsilon(new Color(0.149019607843137, 0.152941176470588, 0.156862745098039, 0.145098039215686), 1e-14); - expect(e = dataSource.entities.getById('material7')).toBeDefined(); - expect(e.corridor.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.164705882352941, 0.168627450980392, 0.172549019607843, 0.16078431372549), 1e-14); - expect(e = dataSource.entities.getById('material8')).toBeDefined(); - expect(e.corridor.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.180392156862745, 0.184313725490196, 0.188235294117647, 0.176470588235294), 1e-14); - expect(e = dataSource.entities.getById('constant11')).toBeDefined(); - expect(e.corridor.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.196078431372549, 0.2, 0.203921568627451, 0.192156862745098), 1e-14); - expect(e = dataSource.entities.getById('constant12')).toBeDefined(); - expect(e.cylinder.material.color.getValue(date)).toEqualEpsilon(new Color(0.211764705882353, 0.215686274509804, 0.219607843137255, 0.207843137254902), 1e-14); + expect(e.corridor.material.evenColor.getValue(date)).toEqual(Color.fromBytes(245, 61, 208, 138)); + expect(e.corridor.material.oddColor.getValue(date)).toEqual(Color.fromBytes(114, 73, 91, 165)); + expect(e.corridor.material.offset.getValue(date)).toEqual(12788.0); + expect(e.corridor.material.repeat.getValue(date)).toEqual(33136.0); + expect(e = dataSource.entities.getById('constant_corridor_material_image_color')).toBeDefined(); + expect(e.corridor.material.color.getValue(date)).toEqualEpsilon(new Color(0.0156862745098039, 0.0941176470588235, 0.4, 0.529411764705882), 1e-14); + expect(e = dataSource.entities.getById('constant_corridor_material_grid_color')).toBeDefined(); + expect(e.corridor.material.color.getValue(date)).toEqualEpsilon(new Color(0.576470588235294, 0.76078431372549, 0.152941176470588, 0.00392156862745098), 1e-14); + expect(e = dataSource.entities.getById('constant_corridor_material_stripe_evenColor')).toBeDefined(); + expect(e.corridor.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.913725490196078, 0.63921568627451, 0.631372549019608, 0.890196078431373), 1e-14); + expect(e = dataSource.entities.getById('constant_corridor_material_stripe_oddColor')).toBeDefined(); + expect(e.corridor.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.2, 0.137254901960784, 0.792156862745098, 0.301960784313725), 1e-14); + expect(e = dataSource.entities.getById('constant_corridor_outlineColor_rgbaf')).toBeDefined(); + expect(e.corridor.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.690196078431373, 0.0549019607843137, 0.247058823529412, 0.298039215686275), 1e-14); + expect(e = dataSource.entities.getById('constant_cylinder_material_solidColor_color')).toBeDefined(); + expect(e.cylinder.material.color.getValue(date)).toEqualEpsilon(new Color(0.47843137254902, 0.0509803921568627, 0.450980392156863, 0.87843137254902), 1e-14); expect(e = dataSource.entities.getById('material_cylinder_material_image')).toBeDefined(); - expect(e.cylinder.material.image.getValue(date)).toEqual('http://example.com/5'); - expect(e.cylinder.material.repeat.getValue(date)).toEqual(new Cartesian2(21, 22)); - expect(e.cylinder.material.color.getValue(date)).toEqual(Color.fromBytes(226, 227, 228, 225)); + expect(e.cylinder.material.image.getValue(date)).toEqual('http://example.com/27447'); + expect(e.cylinder.material.repeat.getValue(date)).toEqual(new Cartesian2(65243, 41470)); + expect(e.cylinder.material.color.getValue(date)).toEqual(Color.fromBytes(200, 175, 107, 217)); expect(e.cylinder.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_cylinder_material_grid')).toBeDefined(); - expect(e.cylinder.material.color.getValue(date)).toEqual(Color.fromBytes(230, 231, 232, 229)); - expect(e.cylinder.material.cellAlpha.getValue(date)).toEqual(83.0); - expect(e.cylinder.material.lineCount.getValue(date)).toEqual(new Cartesian2(23, 24)); - expect(e.cylinder.material.lineThickness.getValue(date)).toEqual(new Cartesian2(25, 26)); - expect(e.cylinder.material.lineOffset.getValue(date)).toEqual(new Cartesian2(27, 28)); + expect(e.cylinder.material.color.getValue(date)).toEqual(Color.fromBytes(173, 210, 231, 62)); + expect(e.cylinder.material.cellAlpha.getValue(date)).toEqual(9555.0); + expect(e.cylinder.material.lineCount.getValue(date)).toEqual(new Cartesian2(58545, 26852)); + expect(e.cylinder.material.lineThickness.getValue(date)).toEqual(new Cartesian2(58520, 44260)); + expect(e.cylinder.material.lineOffset.getValue(date)).toEqual(new Cartesian2(61513, 28656)); expect(e = dataSource.entities.getById('material_cylinder_material_stripe')).toBeDefined(); expect(e.cylinder.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.cylinder.material.evenColor.getValue(date)).toEqual(Color.fromBytes(234, 235, 236, 233)); - expect(e.cylinder.material.oddColor.getValue(date)).toEqual(Color.fromBytes(238, 239, 240, 237)); - expect(e.cylinder.material.offset.getValue(date)).toEqual(84.0); - expect(e.cylinder.material.repeat.getValue(date)).toEqual(85.0); - expect(e = dataSource.entities.getById('material9')).toBeDefined(); - expect(e.cylinder.material.color.getValue(date)).toEqualEpsilon(new Color(0.227450980392157, 0.231372549019608, 0.235294117647059, 0.223529411764706), 1e-14); - expect(e = dataSource.entities.getById('material10')).toBeDefined(); - expect(e.cylinder.material.color.getValue(date)).toEqualEpsilon(new Color(0.243137254901961, 0.247058823529412, 0.250980392156863, 0.23921568627451), 1e-14); - expect(e = dataSource.entities.getById('material11')).toBeDefined(); - expect(e.cylinder.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.258823529411765, 0.262745098039216, 0.266666666666667, 0.254901960784314), 1e-14); - expect(e = dataSource.entities.getById('material12')).toBeDefined(); - expect(e.cylinder.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.274509803921569, 0.27843137254902, 0.282352941176471, 0.270588235294118), 1e-14); - expect(e = dataSource.entities.getById('constant13')).toBeDefined(); - expect(e.cylinder.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.290196078431373, 0.294117647058824, 0.298039215686275, 0.286274509803922), 1e-14); - expect(e = dataSource.entities.getById('constant14')).toBeDefined(); - expect(e.ellipse.material.color.getValue(date)).toEqualEpsilon(new Color(0.305882352941176, 0.309803921568627, 0.313725490196078, 0.301960784313725), 1e-14); + expect(e.cylinder.material.evenColor.getValue(date)).toEqual(Color.fromBytes(158, 155, 154, 86)); + expect(e.cylinder.material.oddColor.getValue(date)).toEqual(Color.fromBytes(191, 226, 188, 74)); + expect(e.cylinder.material.offset.getValue(date)).toEqual(55018.0); + expect(e.cylinder.material.repeat.getValue(date)).toEqual(33073.0); + expect(e = dataSource.entities.getById('constant_cylinder_material_image_color')).toBeDefined(); + expect(e.cylinder.material.color.getValue(date)).toEqualEpsilon(new Color(0.654901960784314, 0.0627450980392157, 0.517647058823529, 0.537254901960784), 1e-14); + expect(e = dataSource.entities.getById('constant_cylinder_material_grid_color')).toBeDefined(); + expect(e.cylinder.material.color.getValue(date)).toEqualEpsilon(new Color(0.901960784313726, 0.364705882352941, 0.305882352941176, 0.945098039215686), 1e-14); + expect(e = dataSource.entities.getById('constant_cylinder_material_stripe_evenColor')).toBeDefined(); + expect(e.cylinder.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.0901960784313725, 0.133333333333333, 0.372549019607843, 0.498039215686275), 1e-14); + expect(e = dataSource.entities.getById('constant_cylinder_material_stripe_oddColor')).toBeDefined(); + expect(e.cylinder.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.905882352941176, 0.564705882352941, 0.486274509803922, 0.67843137254902), 1e-14); + expect(e = dataSource.entities.getById('constant_cylinder_outlineColor_rgbaf')).toBeDefined(); + expect(e.cylinder.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.647058823529412, 0.564705882352941, 0.4, 0.0862745098039216), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipse_material_solidColor_color')).toBeDefined(); + expect(e.ellipse.material.color.getValue(date)).toEqualEpsilon(new Color(0.0980392156862745, 0.913725490196078, 0.811764705882353, 0.2), 1e-14); expect(e = dataSource.entities.getById('material_ellipse_material_image')).toBeDefined(); - expect(e.ellipse.material.image.getValue(date)).toEqual('http://example.com/6'); - expect(e.ellipse.material.repeat.getValue(date)).toEqual(new Cartesian2(29, 30)); - expect(e.ellipse.material.color.getValue(date)).toEqual(Color.fromBytes(242, 243, 244, 241)); + expect(e.ellipse.material.image.getValue(date)).toEqual('http://example.com/2481'); + expect(e.ellipse.material.repeat.getValue(date)).toEqual(new Cartesian2(45447, 53937)); + expect(e.ellipse.material.color.getValue(date)).toEqual(Color.fromBytes(45, 86, 136, 120)); expect(e.ellipse.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_ellipse_material_grid')).toBeDefined(); - expect(e.ellipse.material.color.getValue(date)).toEqual(Color.fromBytes(246, 247, 248, 245)); - expect(e.ellipse.material.cellAlpha.getValue(date)).toEqual(86.0); - expect(e.ellipse.material.lineCount.getValue(date)).toEqual(new Cartesian2(31, 32)); - expect(e.ellipse.material.lineThickness.getValue(date)).toEqual(new Cartesian2(33, 34)); - expect(e.ellipse.material.lineOffset.getValue(date)).toEqual(new Cartesian2(35, 36)); + expect(e.ellipse.material.color.getValue(date)).toEqual(Color.fromBytes(217, 159, 32, 60)); + expect(e.ellipse.material.cellAlpha.getValue(date)).toEqual(24764.0); + expect(e.ellipse.material.lineCount.getValue(date)).toEqual(new Cartesian2(25721, 6500)); + expect(e.ellipse.material.lineThickness.getValue(date)).toEqual(new Cartesian2(57205, 63455)); + expect(e.ellipse.material.lineOffset.getValue(date)).toEqual(new Cartesian2(49829, 3778)); expect(e = dataSource.entities.getById('material_ellipse_material_stripe')).toBeDefined(); expect(e.ellipse.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.ellipse.material.evenColor.getValue(date)).toEqual(Color.fromBytes(250, 251, 252, 249)); - expect(e.ellipse.material.oddColor.getValue(date)).toEqual(Color.fromBytes(254, 0, 1, 253)); - expect(e.ellipse.material.offset.getValue(date)).toEqual(87.0); - expect(e.ellipse.material.repeat.getValue(date)).toEqual(88.0); - expect(e = dataSource.entities.getById('material13')).toBeDefined(); - expect(e.ellipse.material.color.getValue(date)).toEqualEpsilon(new Color(0.32156862745098, 0.325490196078431, 0.329411764705882, 0.317647058823529), 1e-14); - expect(e = dataSource.entities.getById('material14')).toBeDefined(); - expect(e.ellipse.material.color.getValue(date)).toEqualEpsilon(new Color(0.337254901960784, 0.341176470588235, 0.345098039215686, 0.333333333333333), 1e-14); - expect(e = dataSource.entities.getById('material15')).toBeDefined(); - expect(e.ellipse.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.352941176470588, 0.356862745098039, 0.36078431372549, 0.349019607843137), 1e-14); - expect(e = dataSource.entities.getById('material16')).toBeDefined(); - expect(e.ellipse.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.368627450980392, 0.372549019607843, 0.376470588235294, 0.364705882352941), 1e-14); - expect(e = dataSource.entities.getById('constant15')).toBeDefined(); - expect(e.ellipse.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.384313725490196, 0.388235294117647, 0.392156862745098, 0.380392156862745), 1e-14); - expect(e = dataSource.entities.getById('constant16')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(date)).toEqualEpsilon(new Color(0.4, 0.403921568627451, 0.407843137254902, 0.396078431372549), 1e-14); + expect(e.ellipse.material.evenColor.getValue(date)).toEqual(Color.fromBytes(7, 152, 58, 224)); + expect(e.ellipse.material.oddColor.getValue(date)).toEqual(Color.fromBytes(4, 228, 224, 57)); + expect(e.ellipse.material.offset.getValue(date)).toEqual(26719.0); + expect(e.ellipse.material.repeat.getValue(date)).toEqual(15097.0); + expect(e = dataSource.entities.getById('constant_ellipse_material_image_color')).toBeDefined(); + expect(e.ellipse.material.color.getValue(date)).toEqualEpsilon(new Color(0.364705882352941, 0.698039215686274, 0.803921568627451, 0.843137254901961), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipse_material_grid_color')).toBeDefined(); + expect(e.ellipse.material.color.getValue(date)).toEqualEpsilon(new Color(0.67843137254902, 0.580392156862745, 0.823529411764706, 0.627450980392157), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipse_material_stripe_evenColor')).toBeDefined(); + expect(e.ellipse.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.313725490196078, 0.768627450980392, 0.674509803921569, 0.705882352941177), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipse_material_stripe_oddColor')).toBeDefined(); + expect(e.ellipse.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.682352941176471, 0.658823529411765, 0.952941176470588, 0.0823529411764706), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipse_outlineColor_rgbaf')).toBeDefined(); + expect(e.ellipse.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.572549019607843, 0.956862745098039, 0.968627450980392, 0.674509803921569), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipsoid_material_solidColor_color')).toBeDefined(); + expect(e.ellipsoid.material.color.getValue(date)).toEqualEpsilon(new Color(0.572549019607843, 0.533333333333333, 0.384313725490196, 0.2), 1e-14); expect(e = dataSource.entities.getById('material_ellipsoid_material_image')).toBeDefined(); - expect(e.ellipsoid.material.image.getValue(date)).toEqual('http://example.com/7'); - expect(e.ellipsoid.material.repeat.getValue(date)).toEqual(new Cartesian2(37, 38)); - expect(e.ellipsoid.material.color.getValue(date)).toEqual(Color.fromBytes(3, 4, 5, 2)); + expect(e.ellipsoid.material.image.getValue(date)).toEqual('http://example.com/47428'); + expect(e.ellipsoid.material.repeat.getValue(date)).toEqual(new Cartesian2(53733, 35793)); + expect(e.ellipsoid.material.color.getValue(date)).toEqual(Color.fromBytes(125, 49, 160, 165)); expect(e.ellipsoid.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_ellipsoid_material_grid')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(date)).toEqual(Color.fromBytes(7, 8, 9, 6)); - expect(e.ellipsoid.material.cellAlpha.getValue(date)).toEqual(89.0); - expect(e.ellipsoid.material.lineCount.getValue(date)).toEqual(new Cartesian2(39, 40)); - expect(e.ellipsoid.material.lineThickness.getValue(date)).toEqual(new Cartesian2(41, 42)); - expect(e.ellipsoid.material.lineOffset.getValue(date)).toEqual(new Cartesian2(43, 44)); + expect(e.ellipsoid.material.color.getValue(date)).toEqual(Color.fromBytes(95, 212, 218, 57)); + expect(e.ellipsoid.material.cellAlpha.getValue(date)).toEqual(53044.0); + expect(e.ellipsoid.material.lineCount.getValue(date)).toEqual(new Cartesian2(7763, 58654)); + expect(e.ellipsoid.material.lineThickness.getValue(date)).toEqual(new Cartesian2(25480, 4707)); + expect(e.ellipsoid.material.lineOffset.getValue(date)).toEqual(new Cartesian2(38422, 44182)); expect(e = dataSource.entities.getById('material_ellipsoid_material_stripe')).toBeDefined(); expect(e.ellipsoid.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.ellipsoid.material.evenColor.getValue(date)).toEqual(Color.fromBytes(11, 12, 13, 10)); - expect(e.ellipsoid.material.oddColor.getValue(date)).toEqual(Color.fromBytes(15, 16, 17, 14)); - expect(e.ellipsoid.material.offset.getValue(date)).toEqual(90.0); - expect(e.ellipsoid.material.repeat.getValue(date)).toEqual(91.0); - expect(e = dataSource.entities.getById('material17')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(date)).toEqualEpsilon(new Color(0.415686274509804, 0.419607843137255, 0.423529411764706, 0.411764705882353), 1e-14); - expect(e = dataSource.entities.getById('material18')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(date)).toEqualEpsilon(new Color(0.431372549019608, 0.435294117647059, 0.43921568627451, 0.427450980392157), 1e-14); - expect(e = dataSource.entities.getById('material19')).toBeDefined(); - expect(e.ellipsoid.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.447058823529412, 0.450980392156863, 0.454901960784314, 0.443137254901961), 1e-14); - expect(e = dataSource.entities.getById('material20')).toBeDefined(); - expect(e.ellipsoid.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.462745098039216, 0.466666666666667, 0.470588235294118, 0.458823529411765), 1e-14); - expect(e = dataSource.entities.getById('constant17')).toBeDefined(); - expect(e.ellipsoid.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.47843137254902, 0.482352941176471, 0.486274509803922, 0.474509803921569), 1e-14); - expect(e = dataSource.entities.getById('constant18')).toBeDefined(); - expect(e.label.fillColor.getValue(date)).toEqualEpsilon(new Color(0.494117647058824, 0.498039215686275, 0.501960784313725, 0.490196078431373), 1e-14); - expect(e = dataSource.entities.getById('constant19')).toBeDefined(); - expect(e.label.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.509803921568627, 0.513725490196078, 0.517647058823529, 0.505882352941176), 1e-14); - expect(e = dataSource.entities.getById('constant20')).toBeDefined(); - expect(e.model.color.getValue(date)).toEqualEpsilon(new Color(0.525490196078431, 0.529411764705882, 0.533333333333333, 0.52156862745098), 1e-14); - expect(e = dataSource.entities.getById('constant21')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.541176470588235, 0.545098039215686, 0.549019607843137, 0.537254901960784), 1e-14); + expect(e.ellipsoid.material.evenColor.getValue(date)).toEqual(Color.fromBytes(174, 241, 84, 24)); + expect(e.ellipsoid.material.oddColor.getValue(date)).toEqual(Color.fromBytes(134, 51, 175, 154)); + expect(e.ellipsoid.material.offset.getValue(date)).toEqual(24796.0); + expect(e.ellipsoid.material.repeat.getValue(date)).toEqual(2913.0); + expect(e = dataSource.entities.getById('constant_ellipsoid_material_image_color')).toBeDefined(); + expect(e.ellipsoid.material.color.getValue(date)).toEqualEpsilon(new Color(0.247058823529412, 0.403921568627451, 0.145098039215686, 0.47843137254902), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipsoid_material_grid_color')).toBeDefined(); + expect(e.ellipsoid.material.color.getValue(date)).toEqualEpsilon(new Color(0.270588235294118, 0.784313725490196, 0.172549019607843, 0.835294117647059), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipsoid_material_stripe_evenColor')).toBeDefined(); + expect(e.ellipsoid.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.415686274509804, 0.192156862745098, 0.368627450980392, 0.129411764705882), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipsoid_material_stripe_oddColor')).toBeDefined(); + expect(e.ellipsoid.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.580392156862745, 0.164705882352941, 0.741176470588235, 0.0941176470588235), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipsoid_outlineColor_rgbaf')).toBeDefined(); + expect(e.ellipsoid.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.494117647058824, 0.0823529411764706, 0.274509803921569, 0.823529411764706), 1e-14); + expect(e = dataSource.entities.getById('constant_label_fillColor_rgbaf')).toBeDefined(); + expect(e.label.fillColor.getValue(date)).toEqualEpsilon(new Color(0.16078431372549, 0.568627450980392, 0.776470588235294, 0.505882352941176), 1e-14); + expect(e = dataSource.entities.getById('constant_label_outlineColor_rgbaf')).toBeDefined(); + expect(e.label.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.458823529411765, 0.325490196078431, 0.909803921568627, 0.67843137254902), 1e-14); + expect(e = dataSource.entities.getById('constant_model_color_rgbaf')).toBeDefined(); + expect(e.model.color.getValue(date)).toEqualEpsilon(new Color(0.568627450980392, 0.333333333333333, 0.141176470588235, 0.572549019607843), 1e-14); + expect(e = dataSource.entities.getById('constant_path_material_solidColor_color')).toBeDefined(); + expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.458823529411765, 0.517647058823529, 0.52156862745098, 0.925490196078431), 1e-14); expect(e = dataSource.entities.getById('material_path_material_polylineOutline')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(19, 20, 21, 18)); - expect(e.path.material.outlineColor.getValue(date)).toEqual(Color.fromBytes(23, 24, 25, 22)); - expect(e.path.material.outlineWidth.getValue(date)).toEqual(92.0); + expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(158, 14, 3, 86)); + expect(e.path.material.outlineColor.getValue(date)).toEqual(Color.fromBytes(137, 101, 236, 136)); + expect(e.path.material.outlineWidth.getValue(date)).toEqual(11017.0); expect(e = dataSource.entities.getById('material_path_material_polylineArrow')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(27, 28, 29, 26)); + expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(166, 131, 155, 102)); expect(e = dataSource.entities.getById('material_path_material_polylineGlow')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(31, 32, 33, 30)); - expect(e.path.material.glowPower.getValue(date)).toEqual(93.0); + expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(72, 114, 200, 147)); + expect(e.path.material.glowPower.getValue(date)).toEqual(42344.0); expect(e = dataSource.entities.getById('material_path_material_image')).toBeDefined(); - expect(e.path.material.image.getValue(date)).toEqual('http://example.com/8'); - expect(e.path.material.repeat.getValue(date)).toEqual(new Cartesian2(45, 46)); - expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(35, 36, 37, 34)); + expect(e.path.material.image.getValue(date)).toEqual('http://example.com/31068'); + expect(e.path.material.repeat.getValue(date)).toEqual(new Cartesian2(48351, 63420)); + expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(105, 166, 133, 7)); expect(e.path.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_path_material_grid')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(39, 40, 41, 38)); - expect(e.path.material.cellAlpha.getValue(date)).toEqual(94.0); - expect(e.path.material.lineCount.getValue(date)).toEqual(new Cartesian2(47, 48)); - expect(e.path.material.lineThickness.getValue(date)).toEqual(new Cartesian2(49, 50)); - expect(e.path.material.lineOffset.getValue(date)).toEqual(new Cartesian2(51, 52)); + expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(120, 196, 99, 165)); + expect(e.path.material.cellAlpha.getValue(date)).toEqual(41317.0); + expect(e.path.material.lineCount.getValue(date)).toEqual(new Cartesian2(52557, 7629)); + expect(e.path.material.lineThickness.getValue(date)).toEqual(new Cartesian2(21845, 52309)); + expect(e.path.material.lineOffset.getValue(date)).toEqual(new Cartesian2(48700, 4542)); expect(e = dataSource.entities.getById('material_path_material_stripe')).toBeDefined(); expect(e.path.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.path.material.evenColor.getValue(date)).toEqual(Color.fromBytes(43, 44, 45, 42)); - expect(e.path.material.oddColor.getValue(date)).toEqual(Color.fromBytes(47, 48, 49, 46)); - expect(e.path.material.offset.getValue(date)).toEqual(95.0); - expect(e.path.material.repeat.getValue(date)).toEqual(96.0); - expect(e = dataSource.entities.getById('material21')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.556862745098039, 0.56078431372549, 0.564705882352941, 0.552941176470588), 1e-14); - expect(e = dataSource.entities.getById('material22')).toBeDefined(); - expect(e.path.material.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.572549019607843, 0.576470588235294, 0.580392156862745, 0.568627450980392), 1e-14); - expect(e = dataSource.entities.getById('material23')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.588235294117647, 0.592156862745098, 0.596078431372549, 0.584313725490196), 1e-14); - expect(e = dataSource.entities.getById('material24')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.603921568627451, 0.607843137254902, 0.611764705882353, 0.6), 1e-14); - expect(e = dataSource.entities.getById('material25')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.619607843137255, 0.623529411764706, 0.627450980392157, 0.615686274509804), 1e-14); - expect(e = dataSource.entities.getById('material26')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.635294117647059, 0.63921568627451, 0.643137254901961, 0.631372549019608), 1e-14); - expect(e = dataSource.entities.getById('material27')).toBeDefined(); - expect(e.path.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.650980392156863, 0.654901960784314, 0.658823529411765, 0.647058823529412), 1e-14); - expect(e = dataSource.entities.getById('material28')).toBeDefined(); - expect(e.path.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.666666666666667, 0.670588235294118, 0.674509803921569, 0.662745098039216), 1e-14); - expect(e = dataSource.entities.getById('constant22')).toBeDefined(); - expect(e.point.color.getValue(date)).toEqualEpsilon(new Color(0.682352941176471, 0.686274509803922, 0.690196078431373, 0.67843137254902), 1e-14); - expect(e = dataSource.entities.getById('constant23')).toBeDefined(); - expect(e.point.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.698039215686274, 0.701960784313725, 0.705882352941177, 0.694117647058824), 1e-14); - expect(e = dataSource.entities.getById('constant24')).toBeDefined(); - expect(e.polygon.hierarchy.getValue(date)).toEqual([ Cartesian3.fromRadians(0.433629385640828, 1.43362938564083, 15), Cartesian3.fromRadians(0.292036732051034, 1.29203673205103, 18) ]); - expect(e = dataSource.entities.getById('constant25')).toBeDefined(); - expect(e.polygon.hierarchy.getValue(date)).toEqual([ Cartesian3.fromDegrees(19, 20, 21), Cartesian3.fromDegrees(22, 23, 24) ]); - expect(e = dataSource.entities.getById('constant26')).toBeDefined(); - expect(e.polygon.material.color.getValue(date)).toEqualEpsilon(new Color(0.713725490196078, 0.717647058823529, 0.72156862745098, 0.709803921568627), 1e-14); + expect(e.path.material.evenColor.getValue(date)).toEqual(Color.fromBytes(20, 43, 77, 229)); + expect(e.path.material.oddColor.getValue(date)).toEqual(Color.fromBytes(157, 171, 93, 187)); + expect(e.path.material.offset.getValue(date)).toEqual(41305.0); + expect(e.path.material.repeat.getValue(date)).toEqual(43637.0); + expect(e = dataSource.entities.getById('constant_path_material_polylineOutline_color')).toBeDefined(); + expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.0588235294117647, 0.0823529411764706, 0.964705882352941, 0.317647058823529), 1e-14); + expect(e = dataSource.entities.getById('constant_path_material_polylineOutline_outlineColor')).toBeDefined(); + expect(e.path.material.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.266666666666667, 0.556862745098039, 0.352941176470588, 0.76078431372549), 1e-14); + expect(e = dataSource.entities.getById('constant_path_material_polylineArrow_color')).toBeDefined(); + expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.627450980392157, 0.27843137254902, 0.972549019607843, 0.92156862745098), 1e-14); + expect(e = dataSource.entities.getById('constant_path_material_polylineGlow_color')).toBeDefined(); + expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.584313725490196, 0.0156862745098039, 0.329411764705882, 0.270588235294118), 1e-14); + expect(e = dataSource.entities.getById('constant_path_material_image_color')).toBeDefined(); + expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.443137254901961, 0.450980392156863, 0.63921568627451, 0.415686274509804), 1e-14); + expect(e = dataSource.entities.getById('constant_path_material_grid_color')).toBeDefined(); + expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.984313725490196, 0.945098039215686, 0.764705882352941, 0.933333333333333), 1e-14); + expect(e = dataSource.entities.getById('constant_path_material_stripe_evenColor')).toBeDefined(); + expect(e.path.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.584313725490196, 0.631372549019608, 0.0196078431372549, 0.349019607843137), 1e-14); + expect(e = dataSource.entities.getById('constant_path_material_stripe_oddColor')).toBeDefined(); + expect(e.path.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.231372549019608, 0.211764705882353, 0.941176470588235, 0.501960784313725), 1e-14); + expect(e = dataSource.entities.getById('constant_point_color_rgbaf')).toBeDefined(); + expect(e.point.color.getValue(date)).toEqualEpsilon(new Color(0.662745098039216, 0.317647058823529, 0.643137254901961, 0.705882352941177), 1e-14); + expect(e = dataSource.entities.getById('constant_point_outlineColor_rgbaf')).toBeDefined(); + expect(e.point.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.00392156862745098, 0.388235294117647, 0.101960784313725, 0.16078431372549), 1e-14); + expect(e = dataSource.entities.getById('constant_polygon_hierarchy_cartographicRadians')).toBeDefined(); + expect(e.polygon.hierarchy.getValue(date)).toEqual([ Cartesian3.fromRadians(0.612948853926511, 1.3346715688367, 54401), Cartesian3.fromRadians(1.1867596160592, 0.345663242797974, 35811) ]); + expect(e = dataSource.entities.getById('constant_polygon_hierarchy_cartographicDegrees')).toBeDefined(); + expect(e.polygon.hierarchy.getValue(date)).toEqual([ Cartesian3.fromDegrees(19, 41, 50907), Cartesian3.fromDegrees(28, 40, 24937) ]); + expect(e = dataSource.entities.getById('constant_polygon_material_solidColor_color')).toBeDefined(); + expect(e.polygon.material.color.getValue(date)).toEqualEpsilon(new Color(0.980392156862745, 0.905882352941176, 0.274509803921569, 0.972549019607843), 1e-14); expect(e = dataSource.entities.getById('material_polygon_material_image')).toBeDefined(); - expect(e.polygon.material.image.getValue(date)).toEqual('http://example.com/9'); - expect(e.polygon.material.repeat.getValue(date)).toEqual(new Cartesian2(53, 54)); - expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(51, 52, 53, 50)); + expect(e.polygon.material.image.getValue(date)).toEqual('http://example.com/3481'); + expect(e.polygon.material.repeat.getValue(date)).toEqual(new Cartesian2(29381, 10354)); + expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(36, 184, 236, 209)); expect(e.polygon.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_polygon_material_grid')).toBeDefined(); - expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(55, 56, 57, 54)); - expect(e.polygon.material.cellAlpha.getValue(date)).toEqual(97.0); - expect(e.polygon.material.lineCount.getValue(date)).toEqual(new Cartesian2(55, 56)); - expect(e.polygon.material.lineThickness.getValue(date)).toEqual(new Cartesian2(57, 58)); - expect(e.polygon.material.lineOffset.getValue(date)).toEqual(new Cartesian2(59, 60)); + expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(246, 64, 141, 13)); + expect(e.polygon.material.cellAlpha.getValue(date)).toEqual(986.0); + expect(e.polygon.material.lineCount.getValue(date)).toEqual(new Cartesian2(26094, 44645)); + expect(e.polygon.material.lineThickness.getValue(date)).toEqual(new Cartesian2(30775, 17784)); + expect(e.polygon.material.lineOffset.getValue(date)).toEqual(new Cartesian2(58344, 3555)); expect(e = dataSource.entities.getById('material_polygon_material_stripe')).toBeDefined(); expect(e.polygon.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.polygon.material.evenColor.getValue(date)).toEqual(Color.fromBytes(59, 60, 61, 58)); - expect(e.polygon.material.oddColor.getValue(date)).toEqual(Color.fromBytes(63, 64, 65, 62)); - expect(e.polygon.material.offset.getValue(date)).toEqual(98.0); - expect(e.polygon.material.repeat.getValue(date)).toEqual(99.0); - expect(e = dataSource.entities.getById('material29')).toBeDefined(); - expect(e.polygon.material.color.getValue(date)).toEqualEpsilon(new Color(0.729411764705882, 0.733333333333333, 0.737254901960784, 0.725490196078431), 1e-14); - expect(e = dataSource.entities.getById('material30')).toBeDefined(); - expect(e.polygon.material.color.getValue(date)).toEqualEpsilon(new Color(0.745098039215686, 0.749019607843137, 0.752941176470588, 0.741176470588235), 1e-14); - expect(e = dataSource.entities.getById('material31')).toBeDefined(); - expect(e.polygon.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.76078431372549, 0.764705882352941, 0.768627450980392, 0.756862745098039), 1e-14); - expect(e = dataSource.entities.getById('material32')).toBeDefined(); - expect(e.polygon.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.776470588235294, 0.780392156862745, 0.784313725490196, 0.772549019607843), 1e-14); - expect(e = dataSource.entities.getById('constant27')).toBeDefined(); - expect(e.polygon.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.792156862745098, 0.796078431372549, 0.8, 0.788235294117647), 1e-14); - expect(e = dataSource.entities.getById('constant28')).toBeDefined(); - expect(e.polyline.positions.getValue(date)).toEqual([ Cartesian3.fromRadians(1.43805509807655, 0.867258771281655, 27), Cartesian3.fromRadians(1.29646244448676, 0.725666117691862, 30) ]); - expect(e = dataSource.entities.getById('constant29')).toBeDefined(); - expect(e.polyline.positions.getValue(date)).toEqual([ Cartesian3.fromDegrees(31, 32, 33), Cartesian3.fromDegrees(34, 35, 36) ]); - expect(e = dataSource.entities.getById('constant30')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.807843137254902, 0.811764705882353, 0.815686274509804, 0.803921568627451), 1e-14); + expect(e.polygon.material.evenColor.getValue(date)).toEqual(Color.fromBytes(98, 184, 45, 52)); + expect(e.polygon.material.oddColor.getValue(date)).toEqual(Color.fromBytes(164, 123, 182, 228)); + expect(e.polygon.material.offset.getValue(date)).toEqual(12114.0); + expect(e.polygon.material.repeat.getValue(date)).toEqual(60350.0); + expect(e = dataSource.entities.getById('constant_polygon_material_image_color')).toBeDefined(); + expect(e.polygon.material.color.getValue(date)).toEqualEpsilon(new Color(0.674509803921569, 0.8, 0.411764705882353, 0.207843137254902), 1e-14); + expect(e = dataSource.entities.getById('constant_polygon_material_grid_color')).toBeDefined(); + expect(e.polygon.material.color.getValue(date)).toEqualEpsilon(new Color(0.603921568627451, 0.0941176470588235, 0.00784313725490196, 0.0862745098039216), 1e-14); + expect(e = dataSource.entities.getById('constant_polygon_material_stripe_evenColor')).toBeDefined(); + expect(e.polygon.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.772549019607843, 0.866666666666667, 0.964705882352941, 0.862745098039216), 1e-14); + expect(e = dataSource.entities.getById('constant_polygon_material_stripe_oddColor')).toBeDefined(); + expect(e.polygon.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.862745098039216, 0.0392156862745098, 0.458823529411765, 0.596078431372549), 1e-14); + expect(e = dataSource.entities.getById('constant_polygon_outlineColor_rgbaf')).toBeDefined(); + expect(e.polygon.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.105882352941176, 0.423529411764706, 0.619607843137255, 0.956862745098039), 1e-14); + expect(e = dataSource.entities.getById('constant_polyline_positions_cartographicRadians')).toBeDefined(); + expect(e.polyline.positions.getValue(date)).toEqual([ Cartesian3.fromRadians(0.23083587429617, 0.738315731088925, 41390), Cartesian3.fromRadians(0.537259577218533, 0.25389340391868, 10573) ]); + expect(e = dataSource.entities.getById('constant_polyline_positions_cartographicDegrees')).toBeDefined(); + expect(e.polyline.positions.getValue(date)).toEqual([ Cartesian3.fromDegrees(19, 5, 11802), Cartesian3.fromDegrees(15, 40, 39495) ]); + expect(e = dataSource.entities.getById('constant_polyline_material_solidColor_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.764705882352941, 0.894117647058824, 0.874509803921569, 0.105882352941176), 1e-14); expect(e = dataSource.entities.getById('material_polyline_material_polylineOutline')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(67, 68, 69, 66)); - expect(e.polyline.material.outlineColor.getValue(date)).toEqual(Color.fromBytes(71, 72, 73, 70)); - expect(e.polyline.material.outlineWidth.getValue(date)).toEqual(100.0); + expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(152, 14, 11, 33)); + expect(e.polyline.material.outlineColor.getValue(date)).toEqual(Color.fromBytes(222, 51, 202, 92)); + expect(e.polyline.material.outlineWidth.getValue(date)).toEqual(6879.0); expect(e = dataSource.entities.getById('material_polyline_material_polylineArrow')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(75, 76, 77, 74)); + expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(82, 169, 80, 107)); expect(e = dataSource.entities.getById('material_polyline_material_polylineGlow')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(79, 80, 81, 78)); - expect(e.polyline.material.glowPower.getValue(date)).toEqual(101.0); + expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(59, 125, 181, 171)); + expect(e.polyline.material.glowPower.getValue(date)).toEqual(41345.0); expect(e = dataSource.entities.getById('material_polyline_material_image')).toBeDefined(); - expect(e.polyline.material.image.getValue(date)).toEqual('http://example.com/10'); - expect(e.polyline.material.repeat.getValue(date)).toEqual(new Cartesian2(61, 62)); - expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(83, 84, 85, 82)); + expect(e.polyline.material.image.getValue(date)).toEqual('http://example.com/29020'); + expect(e.polyline.material.repeat.getValue(date)).toEqual(new Cartesian2(8980, 60451)); + expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(46, 136, 39, 94)); expect(e.polyline.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_polyline_material_grid')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(87, 88, 89, 86)); - expect(e.polyline.material.cellAlpha.getValue(date)).toEqual(102.0); - expect(e.polyline.material.lineCount.getValue(date)).toEqual(new Cartesian2(63, 64)); - expect(e.polyline.material.lineThickness.getValue(date)).toEqual(new Cartesian2(65, 66)); - expect(e.polyline.material.lineOffset.getValue(date)).toEqual(new Cartesian2(67, 68)); + expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(157, 57, 26, 26)); + expect(e.polyline.material.cellAlpha.getValue(date)).toEqual(27197.0); + expect(e.polyline.material.lineCount.getValue(date)).toEqual(new Cartesian2(17878, 15173)); + expect(e.polyline.material.lineThickness.getValue(date)).toEqual(new Cartesian2(64504, 24571)); + expect(e.polyline.material.lineOffset.getValue(date)).toEqual(new Cartesian2(51933, 9674)); expect(e = dataSource.entities.getById('material_polyline_material_stripe')).toBeDefined(); expect(e.polyline.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.polyline.material.evenColor.getValue(date)).toEqual(Color.fromBytes(91, 92, 93, 90)); - expect(e.polyline.material.oddColor.getValue(date)).toEqual(Color.fromBytes(95, 96, 97, 94)); - expect(e.polyline.material.offset.getValue(date)).toEqual(103.0); - expect(e.polyline.material.repeat.getValue(date)).toEqual(104.0); - expect(e = dataSource.entities.getById('material33')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.823529411764706, 0.827450980392157, 0.831372549019608, 0.819607843137255), 1e-14); - expect(e = dataSource.entities.getById('material34')).toBeDefined(); - expect(e.polyline.material.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.83921568627451, 0.843137254901961, 0.847058823529412, 0.835294117647059), 1e-14); - expect(e = dataSource.entities.getById('material35')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.854901960784314, 0.858823529411765, 0.862745098039216, 0.850980392156863), 1e-14); - expect(e = dataSource.entities.getById('material36')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.870588235294118, 0.874509803921569, 0.87843137254902, 0.866666666666667), 1e-14); - expect(e = dataSource.entities.getById('material37')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.886274509803922, 0.890196078431373, 0.894117647058824, 0.882352941176471), 1e-14); - expect(e = dataSource.entities.getById('material38')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.901960784313726, 0.905882352941176, 0.909803921568627, 0.898039215686275), 1e-14); - expect(e = dataSource.entities.getById('material39')).toBeDefined(); - expect(e.polyline.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.917647058823529, 0.92156862745098, 0.925490196078431, 0.913725490196078), 1e-14); - expect(e = dataSource.entities.getById('material40')).toBeDefined(); - expect(e.polyline.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.933333333333333, 0.937254901960784, 0.941176470588235, 0.929411764705882), 1e-14); - expect(e = dataSource.entities.getById('constant31')).toBeDefined(); - expect(e.rectangle.coordinates.getValue(date)).toEqual(Rectangle.fromDegrees(5, 6, 7, 8)); - expect(e = dataSource.entities.getById('constant32')).toBeDefined(); - expect(e.rectangle.material.color.getValue(date)).toEqualEpsilon(new Color(0.949019607843137, 0.952941176470588, 0.956862745098039, 0.945098039215686), 1e-14); + expect(e.polyline.material.evenColor.getValue(date)).toEqual(Color.fromBytes(98, 239, 47, 132)); + expect(e.polyline.material.oddColor.getValue(date)).toEqual(Color.fromBytes(41, 198, 29, 144)); + expect(e.polyline.material.offset.getValue(date)).toEqual(10077.0); + expect(e.polyline.material.repeat.getValue(date)).toEqual(31817.0); + expect(e = dataSource.entities.getById('constant_polyline_material_polylineOutline_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.450980392156863, 0.890196078431373, 0.403921568627451, 0.16078431372549), 1e-14); + expect(e = dataSource.entities.getById('constant_polyline_material_polylineOutline_outlineColor')).toBeDefined(); + expect(e.polyline.material.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.815686274509804, 0.545098039215686, 0.529411764705882, 0.317647058823529), 1e-14); + expect(e = dataSource.entities.getById('constant_polyline_material_polylineArrow_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.831372549019608, 0.823529411764706, 0.631372549019608, 0.443137254901961), 1e-14); + expect(e = dataSource.entities.getById('constant_polyline_material_polylineGlow_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.411764705882353, 0.313725490196078, 0.858823529411765, 0.380392156862745), 1e-14); + expect(e = dataSource.entities.getById('constant_polyline_material_image_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.133333333333333, 0.552941176470588, 0.0431372549019608, 0.184313725490196), 1e-14); + expect(e = dataSource.entities.getById('constant_polyline_material_grid_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.141176470588235, 0.823529411764706, 0.588235294117647, 0.56078431372549), 1e-14); + expect(e = dataSource.entities.getById('constant_polyline_material_stripe_evenColor')).toBeDefined(); + expect(e.polyline.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.647058823529412, 0.862745098039216, 0.129411764705882, 0.780392156862745), 1e-14); + expect(e = dataSource.entities.getById('constant_polyline_material_stripe_oddColor')).toBeDefined(); + expect(e.polyline.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.290196078431373, 0.780392156862745, 0.0705882352941176, 0.27843137254902), 1e-14); + expect(e = dataSource.entities.getById('constant_rectangle_coordinates_wsenDegrees')).toBeDefined(); + expect(e.rectangle.coordinates.getValue(date)).toEqual(Rectangle.fromDegrees(42, 22, 5, 35)); + expect(e = dataSource.entities.getById('constant_rectangle_material_solidColor_color')).toBeDefined(); + expect(e.rectangle.material.color.getValue(date)).toEqualEpsilon(new Color(0.898039215686275, 0.8, 0.905882352941176, 0.952941176470588), 1e-14); expect(e = dataSource.entities.getById('material_rectangle_material_image')).toBeDefined(); - expect(e.rectangle.material.image.getValue(date)).toEqual('http://example.com/11'); - expect(e.rectangle.material.repeat.getValue(date)).toEqual(new Cartesian2(69, 70)); - expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(99, 100, 101, 98)); + expect(e.rectangle.material.image.getValue(date)).toEqual('http://example.com/18033'); + expect(e.rectangle.material.repeat.getValue(date)).toEqual(new Cartesian2(41461, 31905)); + expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(93, 203, 88, 125)); expect(e.rectangle.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_rectangle_material_grid')).toBeDefined(); - expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(103, 104, 105, 102)); - expect(e.rectangle.material.cellAlpha.getValue(date)).toEqual(105.0); - expect(e.rectangle.material.lineCount.getValue(date)).toEqual(new Cartesian2(71, 72)); - expect(e.rectangle.material.lineThickness.getValue(date)).toEqual(new Cartesian2(73, 74)); - expect(e.rectangle.material.lineOffset.getValue(date)).toEqual(new Cartesian2(75, 76)); + expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(245, 105, 152, 83)); + expect(e.rectangle.material.cellAlpha.getValue(date)).toEqual(57393.0); + expect(e.rectangle.material.lineCount.getValue(date)).toEqual(new Cartesian2(4947, 4627)); + expect(e.rectangle.material.lineThickness.getValue(date)).toEqual(new Cartesian2(37424, 19602)); + expect(e.rectangle.material.lineOffset.getValue(date)).toEqual(new Cartesian2(43685, 31658)); expect(e = dataSource.entities.getById('material_rectangle_material_stripe')).toBeDefined(); expect(e.rectangle.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.rectangle.material.evenColor.getValue(date)).toEqual(Color.fromBytes(107, 108, 109, 106)); - expect(e.rectangle.material.oddColor.getValue(date)).toEqual(Color.fromBytes(111, 112, 113, 110)); - expect(e.rectangle.material.offset.getValue(date)).toEqual(106.0); - expect(e.rectangle.material.repeat.getValue(date)).toEqual(107.0); - expect(e = dataSource.entities.getById('material41')).toBeDefined(); - expect(e.rectangle.material.color.getValue(date)).toEqualEpsilon(new Color(0.964705882352941, 0.968627450980392, 0.972549019607843, 0.96078431372549), 1e-14); - expect(e = dataSource.entities.getById('material42')).toBeDefined(); - expect(e.rectangle.material.color.getValue(date)).toEqualEpsilon(new Color(0.980392156862745, 0.984313725490196, 0.988235294117647, 0.976470588235294), 1e-14); - expect(e = dataSource.entities.getById('material43')).toBeDefined(); - expect(e.rectangle.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.996078431372549, 0, 0.00392156862745098, 0.992156862745098), 1e-14); - expect(e = dataSource.entities.getById('material44')).toBeDefined(); - expect(e.rectangle.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.0117647058823529, 0.0156862745098039, 0.0196078431372549, 0.00784313725490196), 1e-14); - expect(e = dataSource.entities.getById('constant33')).toBeDefined(); - expect(e.rectangle.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.0274509803921569, 0.0313725490196078, 0.0352941176470588, 0.0235294117647059), 1e-14); - expect(e = dataSource.entities.getById('constant34')).toBeDefined(); - expect(e.wall.positions.getValue(date)).toEqual([ Cartesian3.fromRadians(0.871684483717379, 0.300888156922483, 39), Cartesian3.fromRadians(0.730091830127586, 0.159295503332689, 42) ]); - expect(e = dataSource.entities.getById('constant35')).toBeDefined(); - expect(e.wall.positions.getValue(date)).toEqual([ Cartesian3.fromDegrees(43, 44, 45), Cartesian3.fromDegrees(1, 2, 48) ]); - expect(e = dataSource.entities.getById('constant36')).toBeDefined(); - expect(e.wall.material.color.getValue(date)).toEqualEpsilon(new Color(0.0431372549019608, 0.0470588235294118, 0.0509803921568627, 0.0392156862745098), 1e-14); + expect(e.rectangle.material.evenColor.getValue(date)).toEqual(Color.fromBytes(196, 12, 53, 2)); + expect(e.rectangle.material.oddColor.getValue(date)).toEqual(Color.fromBytes(103, 243, 111, 72)); + expect(e.rectangle.material.offset.getValue(date)).toEqual(26578.0); + expect(e.rectangle.material.repeat.getValue(date)).toEqual(52842.0); + expect(e = dataSource.entities.getById('constant_rectangle_material_image_color')).toBeDefined(); + expect(e.rectangle.material.color.getValue(date)).toEqualEpsilon(new Color(0.247058823529412, 0.498039215686275, 0.741176470588235, 0.968627450980392), 1e-14); + expect(e = dataSource.entities.getById('constant_rectangle_material_grid_color')).toBeDefined(); + expect(e.rectangle.material.color.getValue(date)).toEqualEpsilon(new Color(0.458823529411765, 0.0627450980392157, 0.886274509803922, 0.83921568627451), 1e-14); + expect(e = dataSource.entities.getById('constant_rectangle_material_stripe_evenColor')).toBeDefined(); + expect(e.rectangle.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.576470588235294, 0.341176470588235, 0.611764705882353, 0.207843137254902), 1e-14); + expect(e = dataSource.entities.getById('constant_rectangle_material_stripe_oddColor')).toBeDefined(); + expect(e.rectangle.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.866666666666667, 0.949019607843137, 0.0627450980392157, 0.0196078431372549), 1e-14); + expect(e = dataSource.entities.getById('constant_rectangle_outlineColor_rgbaf')).toBeDefined(); + expect(e.rectangle.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.301960784313725, 0.0352941176470588, 0.917647058823529, 0.207843137254902), 1e-14); + expect(e = dataSource.entities.getById('constant_wall_positions_cartographicRadians')).toBeDefined(); + expect(e.wall.positions.getValue(date)).toEqual([ Cartesian3.fromRadians(0.990822494752221, 0.11729920547879, 47975), Cartesian3.fromRadians(1.22405890229697, 1.46292679641256, 13438) ]); + expect(e = dataSource.entities.getById('constant_wall_positions_cartographicDegrees')).toBeDefined(); + expect(e.wall.positions.getValue(date)).toEqual([ Cartesian3.fromDegrees(30, 24, 27738), Cartesian3.fromDegrees(14, 41, 41667) ]); + expect(e = dataSource.entities.getById('constant_wall_material_solidColor_color')).toBeDefined(); + expect(e.wall.material.color.getValue(date)).toEqualEpsilon(new Color(0.694117647058824, 0.317647058823529, 0.909803921568627, 0.501960784313725), 1e-14); expect(e = dataSource.entities.getById('material_wall_material_image')).toBeDefined(); - expect(e.wall.material.image.getValue(date)).toEqual('http://example.com/12'); - expect(e.wall.material.repeat.getValue(date)).toEqual(new Cartesian2(77, 78)); - expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(115, 116, 117, 114)); + expect(e.wall.material.image.getValue(date)).toEqual('http://example.com/58529'); + expect(e.wall.material.repeat.getValue(date)).toEqual(new Cartesian2(36340, 47245)); + expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(252, 63, 12, 38)); expect(e.wall.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_wall_material_grid')).toBeDefined(); - expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(119, 120, 121, 118)); - expect(e.wall.material.cellAlpha.getValue(date)).toEqual(108.0); - expect(e.wall.material.lineCount.getValue(date)).toEqual(new Cartesian2(79, 80)); - expect(e.wall.material.lineThickness.getValue(date)).toEqual(new Cartesian2(81, 82)); - expect(e.wall.material.lineOffset.getValue(date)).toEqual(new Cartesian2(83, 84)); + expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(38, 183, 237, 174)); + expect(e.wall.material.cellAlpha.getValue(date)).toEqual(59606.0); + expect(e.wall.material.lineCount.getValue(date)).toEqual(new Cartesian2(3079, 31244)); + expect(e.wall.material.lineThickness.getValue(date)).toEqual(new Cartesian2(32099, 44157)); + expect(e.wall.material.lineOffset.getValue(date)).toEqual(new Cartesian2(13529, 1844)); expect(e = dataSource.entities.getById('material_wall_material_stripe')).toBeDefined(); expect(e.wall.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.wall.material.evenColor.getValue(date)).toEqual(Color.fromBytes(123, 124, 125, 122)); - expect(e.wall.material.oddColor.getValue(date)).toEqual(Color.fromBytes(127, 128, 129, 126)); - expect(e.wall.material.offset.getValue(date)).toEqual(109.0); - expect(e.wall.material.repeat.getValue(date)).toEqual(110.0); - expect(e = dataSource.entities.getById('material45')).toBeDefined(); - expect(e.wall.material.color.getValue(date)).toEqualEpsilon(new Color(0.0588235294117647, 0.0627450980392157, 0.0666666666666667, 0.0549019607843137), 1e-14); - expect(e = dataSource.entities.getById('material46')).toBeDefined(); - expect(e.wall.material.color.getValue(date)).toEqualEpsilon(new Color(0.0745098039215686, 0.0784313725490196, 0.0823529411764706, 0.0705882352941176), 1e-14); - expect(e = dataSource.entities.getById('material47')).toBeDefined(); - expect(e.wall.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.0901960784313725, 0.0941176470588235, 0.0980392156862745, 0.0862745098039216), 1e-14); - expect(e = dataSource.entities.getById('material48')).toBeDefined(); - expect(e.wall.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.105882352941176, 0.109803921568627, 0.113725490196078, 0.101960784313725), 1e-14); - expect(e = dataSource.entities.getById('constant37')).toBeDefined(); - expect(e.wall.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.12156862745098, 0.125490196078431, 0.129411764705882, 0.117647058823529), 1e-14); - expect(e = dataSource.entities.getById('constant38')).toBeDefined(); - expect(e = dataSource.entities.getById('constant39')).toBeDefined(); + expect(e.wall.material.evenColor.getValue(date)).toEqual(Color.fromBytes(202, 190, 37, 215)); + expect(e.wall.material.oddColor.getValue(date)).toEqual(Color.fromBytes(56, 107, 92, 38)); + expect(e.wall.material.offset.getValue(date)).toEqual(34142.0); + expect(e.wall.material.repeat.getValue(date)).toEqual(33528.0); + expect(e = dataSource.entities.getById('constant_wall_material_image_color')).toBeDefined(); + expect(e.wall.material.color.getValue(date)).toEqualEpsilon(new Color(0.349019607843137, 0.843137254901961, 0.290196078431373, 0.0431372549019608), 1e-14); + expect(e = dataSource.entities.getById('constant_wall_material_grid_color')).toBeDefined(); + expect(e.wall.material.color.getValue(date)).toEqualEpsilon(new Color(0.756862745098039, 0.992156862745098, 0.992156862745098, 0.462745098039216), 1e-14); + expect(e = dataSource.entities.getById('constant_wall_material_stripe_evenColor')).toBeDefined(); + expect(e.wall.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.690196078431373, 0.211764705882353, 0.615686274509804, 0.627450980392157), 1e-14); + expect(e = dataSource.entities.getById('constant_wall_material_stripe_oddColor')).toBeDefined(); + expect(e.wall.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.968627450980392, 0.368627450980392, 0.219607843137255, 0.00392156862745098), 1e-14); + expect(e = dataSource.entities.getById('constant_wall_outlineColor_rgbaf')).toBeDefined(); + expect(e.wall.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.564705882352941, 0.67843137254902, 0.764705882352941, 0.811764705882353), 1e-14); + expect(e = dataSource.entities.getById('constant_agi_conicSensor_intersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_lateralSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_lateralSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_lateralSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material49')).toBeDefined(); - expect(e = dataSource.entities.getById('material50')).toBeDefined(); - expect(e = dataSource.entities.getById('material51')).toBeDefined(); - expect(e = dataSource.entities.getById('material52')).toBeDefined(); - expect(e = dataSource.entities.getById('constant40')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_lateralSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_lateralSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_lateralSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_lateralSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material53')).toBeDefined(); - expect(e = dataSource.entities.getById('material54')).toBeDefined(); - expect(e = dataSource.entities.getById('material55')).toBeDefined(); - expect(e = dataSource.entities.getById('material56')).toBeDefined(); - expect(e = dataSource.entities.getById('constant41')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material57')).toBeDefined(); - expect(e = dataSource.entities.getById('material58')).toBeDefined(); - expect(e = dataSource.entities.getById('material59')).toBeDefined(); - expect(e = dataSource.entities.getById('material60')).toBeDefined(); - expect(e = dataSource.entities.getById('constant42')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidHorizonSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidHorizonSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_domeSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_domeSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_domeSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_domeSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material61')).toBeDefined(); - expect(e = dataSource.entities.getById('material62')).toBeDefined(); - expect(e = dataSource.entities.getById('material63')).toBeDefined(); - expect(e = dataSource.entities.getById('material64')).toBeDefined(); - expect(e = dataSource.entities.getById('constant43')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_domeSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_domeSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_domeSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_domeSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_environmentOcclusionMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_environmentOcclusionMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_environmentOcclusionMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material65')).toBeDefined(); - expect(e = dataSource.entities.getById('material66')).toBeDefined(); - expect(e = dataSource.entities.getById('material67')).toBeDefined(); - expect(e = dataSource.entities.getById('material68')).toBeDefined(); - expect(e = dataSource.entities.getById('constant44')).toBeDefined(); - expect(e = dataSource.entities.getById('constant45')).toBeDefined(); - expect(e = dataSource.entities.getById('constant46')).toBeDefined(); - expect(e = dataSource.entities.getById('constant47')).toBeDefined(); - expect(e = dataSource.entities.getById('constant48')).toBeDefined(); - expect(e = dataSource.entities.getById('constant49')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_environmentOcclusionMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_environmentOcclusionMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_environmentOcclusionMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_environmentOcclusionMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_conicSensor_environmentIntersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_customPatternSensor_directions_unitSpherical')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_customPatternSensor_directions_cartesian')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_customPatternSensor_directions_unitCartesian')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_customPatternSensor_intersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_lateralSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_lateralSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_lateralSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material69')).toBeDefined(); - expect(e = dataSource.entities.getById('material70')).toBeDefined(); - expect(e = dataSource.entities.getById('material71')).toBeDefined(); - expect(e = dataSource.entities.getById('material72')).toBeDefined(); - expect(e = dataSource.entities.getById('constant50')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_lateralSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_lateralSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_lateralSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_lateralSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material73')).toBeDefined(); - expect(e = dataSource.entities.getById('material74')).toBeDefined(); - expect(e = dataSource.entities.getById('material75')).toBeDefined(); - expect(e = dataSource.entities.getById('material76')).toBeDefined(); - expect(e = dataSource.entities.getById('constant51')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material77')).toBeDefined(); - expect(e = dataSource.entities.getById('material78')).toBeDefined(); - expect(e = dataSource.entities.getById('material79')).toBeDefined(); - expect(e = dataSource.entities.getById('material80')).toBeDefined(); - expect(e = dataSource.entities.getById('constant52')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_domeSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_domeSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_domeSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_domeSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material81')).toBeDefined(); - expect(e = dataSource.entities.getById('material82')).toBeDefined(); - expect(e = dataSource.entities.getById('material83')).toBeDefined(); - expect(e = dataSource.entities.getById('material84')).toBeDefined(); - expect(e = dataSource.entities.getById('constant53')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_domeSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_domeSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_domeSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_domeSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_environmentOcclusionMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_environmentOcclusionMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_environmentOcclusionMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material85')).toBeDefined(); - expect(e = dataSource.entities.getById('material86')).toBeDefined(); - expect(e = dataSource.entities.getById('material87')).toBeDefined(); - expect(e = dataSource.entities.getById('material88')).toBeDefined(); - expect(e = dataSource.entities.getById('constant54')).toBeDefined(); - expect(e = dataSource.entities.getById('constant55')).toBeDefined(); - expect(e = dataSource.entities.getById('constant56')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_environmentOcclusionMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_environmentOcclusionMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_environmentOcclusionMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_environmentOcclusionMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_customPatternSensor_environmentIntersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_rectangularSensor_intersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_lateralSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_lateralSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_lateralSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material89')).toBeDefined(); - expect(e = dataSource.entities.getById('material90')).toBeDefined(); - expect(e = dataSource.entities.getById('material91')).toBeDefined(); - expect(e = dataSource.entities.getById('material92')).toBeDefined(); - expect(e = dataSource.entities.getById('constant57')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_lateralSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_lateralSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_lateralSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_lateralSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material93')).toBeDefined(); - expect(e = dataSource.entities.getById('material94')).toBeDefined(); - expect(e = dataSource.entities.getById('material95')).toBeDefined(); - expect(e = dataSource.entities.getById('material96')).toBeDefined(); - expect(e = dataSource.entities.getById('constant58')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material97')).toBeDefined(); - expect(e = dataSource.entities.getById('material98')).toBeDefined(); - expect(e = dataSource.entities.getById('material99')).toBeDefined(); - expect(e = dataSource.entities.getById('material100')).toBeDefined(); - expect(e = dataSource.entities.getById('constant59')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_domeSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_domeSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_domeSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_domeSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material101')).toBeDefined(); - expect(e = dataSource.entities.getById('material102')).toBeDefined(); - expect(e = dataSource.entities.getById('material103')).toBeDefined(); - expect(e = dataSource.entities.getById('material104')).toBeDefined(); - expect(e = dataSource.entities.getById('constant60')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_domeSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_domeSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_domeSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_domeSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_environmentOcclusionMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_environmentOcclusionMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_environmentOcclusionMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material105')).toBeDefined(); - expect(e = dataSource.entities.getById('material106')).toBeDefined(); - expect(e = dataSource.entities.getById('material107')).toBeDefined(); - expect(e = dataSource.entities.getById('material108')).toBeDefined(); - expect(e = dataSource.entities.getById('constant61')).toBeDefined(); - expect(e = dataSource.entities.getById('constant62')).toBeDefined(); - expect(e = dataSource.entities.getById('constant63')).toBeDefined(); - expect(e = dataSource.entities.getById('constant64')).toBeDefined(); - expect(e = dataSource.entities.getById('constant65')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_environmentOcclusionMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_environmentOcclusionMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_environmentOcclusionMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_environmentOcclusionMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_rectangularSensor_environmentIntersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_fan_directions_unitSpherical')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_fan_directions_cartesian')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_fan_directions_unitCartesian')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_fan_material_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_fan_material_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_fan_material_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_fan_material_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material109')).toBeDefined(); - expect(e = dataSource.entities.getById('material110')).toBeDefined(); - expect(e = dataSource.entities.getById('material111')).toBeDefined(); - expect(e = dataSource.entities.getById('material112')).toBeDefined(); - expect(e = dataSource.entities.getById('constant66')).toBeDefined(); - expect(e = dataSource.entities.getById('constant67')).toBeDefined(); - expect(e = dataSource.entities.getById('constant68')).toBeDefined(); - expect(e = dataSource.entities.getById('constant69')).toBeDefined(); - expect(e = dataSource.entities.getById('constant70')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_fan_material_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_fan_material_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_fan_material_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_fan_material_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_fan_outlineColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_vector_color_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_vector_direction_unitSpherical')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_vector_direction_cartesian')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_vector_direction_unitCartesian')).toBeDefined(); expect(e = dataSource.entities.getById('ConstantPosition1')).toBeDefined(); - expect(e.position.getValue(date)).toEqual(new Cartesian3(28, 29, 30)); + expect(e.position.getValue(date)).toEqual(new Cartesian3(48370, 3260, 44044)); expect(e = dataSource.entities.getById('ConstantDouble1')).toBeDefined(); - expect(e.billboard.scale.getValue(date)).toEqual(159.0); + expect(e.billboard.scale.getValue(date)).toEqual(1155.0); expect(e = dataSource.entities.getById('ConstantPosition2')).toBeDefined(); - expect(e.position.getValue(date)).toEqual(new Cartesian3(31, 32, 33)); + expect(e.position.getValue(date)).toEqual(new Cartesian3(2599, 10, 39168)); expect(e = dataSource.entities.getById('ConstantDouble2')).toBeDefined(); - expect(e.billboard.scale.getValue(date)).toEqual(160.0); + expect(e.billboard.scale.getValue(date)).toEqual(16451.0); expect(e = dataSource.entities.getById('Reference')).toBeDefined(); expect(e.description.getValue(date)).toEqual(constant.description.getValue(date)); expect(e.position.getValue(date)).toEqual(constant.position.getValue(date)); @@ -3671,1096 +3671,1096 @@ defineSuite([ expect(e.wall.outline.getValue(date)).toEqual(constant.wall.outline.getValue(date)); expect(e.wall.outlineColor.getValue(date)).toEqual(constant.wall.outlineColor.getValue(date)); expect(e.wall.outlineWidth.getValue(date)).toEqual(constant.wall.outlineWidth.getValue(date)); - expect(e = dataSource.entities.getById('reference1')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_box_material_image')).toBeDefined(); expect(e.box.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_image').box.material.image.getValue(date)); expect(e.box.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_image').box.material.repeat.getValue(date)); expect(e.box.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_image').box.material.color.getValue(date)); expect(e.box.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_image').box.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference2')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_box_material_grid')).toBeDefined(); expect(e.box.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_grid').box.material.color.getValue(date)); expect(e.box.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_grid').box.material.cellAlpha.getValue(date)); expect(e.box.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_grid').box.material.lineCount.getValue(date)); expect(e.box.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_grid').box.material.lineThickness.getValue(date)); expect(e.box.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_grid').box.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference3')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_box_material_stripe')).toBeDefined(); expect(e.box.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_stripe').box.material.orientation.getValue(date)); expect(e.box.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_stripe').box.material.evenColor.getValue(date)); expect(e.box.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_stripe').box.material.oddColor.getValue(date)); expect(e.box.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_stripe').box.material.offset.getValue(date)); expect(e.box.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_stripe').box.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference4')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_corridor_material_image')).toBeDefined(); expect(e.corridor.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_image').corridor.material.image.getValue(date)); expect(e.corridor.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_image').corridor.material.repeat.getValue(date)); expect(e.corridor.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_image').corridor.material.color.getValue(date)); expect(e.corridor.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_image').corridor.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference5')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_corridor_material_grid')).toBeDefined(); expect(e.corridor.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_grid').corridor.material.color.getValue(date)); expect(e.corridor.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_grid').corridor.material.cellAlpha.getValue(date)); expect(e.corridor.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_grid').corridor.material.lineCount.getValue(date)); expect(e.corridor.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_grid').corridor.material.lineThickness.getValue(date)); expect(e.corridor.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_grid').corridor.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference6')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_corridor_material_stripe')).toBeDefined(); expect(e.corridor.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_stripe').corridor.material.orientation.getValue(date)); expect(e.corridor.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_stripe').corridor.material.evenColor.getValue(date)); expect(e.corridor.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_stripe').corridor.material.oddColor.getValue(date)); expect(e.corridor.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_stripe').corridor.material.offset.getValue(date)); expect(e.corridor.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_stripe').corridor.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference7')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_cylinder_material_image')).toBeDefined(); expect(e.cylinder.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_image').cylinder.material.image.getValue(date)); expect(e.cylinder.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_image').cylinder.material.repeat.getValue(date)); expect(e.cylinder.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_image').cylinder.material.color.getValue(date)); expect(e.cylinder.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_image').cylinder.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference8')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_cylinder_material_grid')).toBeDefined(); expect(e.cylinder.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_grid').cylinder.material.color.getValue(date)); expect(e.cylinder.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_grid').cylinder.material.cellAlpha.getValue(date)); expect(e.cylinder.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_grid').cylinder.material.lineCount.getValue(date)); expect(e.cylinder.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_grid').cylinder.material.lineThickness.getValue(date)); expect(e.cylinder.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_grid').cylinder.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference9')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_cylinder_material_stripe')).toBeDefined(); expect(e.cylinder.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_stripe').cylinder.material.orientation.getValue(date)); expect(e.cylinder.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_stripe').cylinder.material.evenColor.getValue(date)); expect(e.cylinder.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_stripe').cylinder.material.oddColor.getValue(date)); expect(e.cylinder.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_stripe').cylinder.material.offset.getValue(date)); expect(e.cylinder.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_stripe').cylinder.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference10')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_ellipse_material_image')).toBeDefined(); expect(e.ellipse.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_image').ellipse.material.image.getValue(date)); expect(e.ellipse.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_image').ellipse.material.repeat.getValue(date)); expect(e.ellipse.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_image').ellipse.material.color.getValue(date)); expect(e.ellipse.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_image').ellipse.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference11')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_ellipse_material_grid')).toBeDefined(); expect(e.ellipse.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_grid').ellipse.material.color.getValue(date)); expect(e.ellipse.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_grid').ellipse.material.cellAlpha.getValue(date)); expect(e.ellipse.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_grid').ellipse.material.lineCount.getValue(date)); expect(e.ellipse.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_grid').ellipse.material.lineThickness.getValue(date)); expect(e.ellipse.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_grid').ellipse.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference12')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_ellipse_material_stripe')).toBeDefined(); expect(e.ellipse.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_stripe').ellipse.material.orientation.getValue(date)); expect(e.ellipse.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_stripe').ellipse.material.evenColor.getValue(date)); expect(e.ellipse.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_stripe').ellipse.material.oddColor.getValue(date)); expect(e.ellipse.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_stripe').ellipse.material.offset.getValue(date)); expect(e.ellipse.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_stripe').ellipse.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference13')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_ellipsoid_material_image')).toBeDefined(); expect(e.ellipsoid.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_image').ellipsoid.material.image.getValue(date)); expect(e.ellipsoid.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_image').ellipsoid.material.repeat.getValue(date)); expect(e.ellipsoid.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_image').ellipsoid.material.color.getValue(date)); expect(e.ellipsoid.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_image').ellipsoid.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference14')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_ellipsoid_material_grid')).toBeDefined(); expect(e.ellipsoid.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_grid').ellipsoid.material.color.getValue(date)); expect(e.ellipsoid.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_grid').ellipsoid.material.cellAlpha.getValue(date)); expect(e.ellipsoid.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_grid').ellipsoid.material.lineCount.getValue(date)); expect(e.ellipsoid.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_grid').ellipsoid.material.lineThickness.getValue(date)); expect(e.ellipsoid.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_grid').ellipsoid.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference15')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_ellipsoid_material_stripe')).toBeDefined(); expect(e.ellipsoid.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_stripe').ellipsoid.material.orientation.getValue(date)); expect(e.ellipsoid.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_stripe').ellipsoid.material.evenColor.getValue(date)); expect(e.ellipsoid.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_stripe').ellipsoid.material.oddColor.getValue(date)); expect(e.ellipsoid.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_stripe').ellipsoid.material.offset.getValue(date)); expect(e.ellipsoid.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_stripe').ellipsoid.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference16')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_path_material_polylineOutline')).toBeDefined(); expect(e.path.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_polylineOutline').path.material.color.getValue(date)); expect(e.path.material.outlineColor.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_polylineOutline').path.material.outlineColor.getValue(date)); expect(e.path.material.outlineWidth.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_polylineOutline').path.material.outlineWidth.getValue(date)); - expect(e = dataSource.entities.getById('reference17')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_path_material_polylineArrow')).toBeDefined(); expect(e.path.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_polylineArrow').path.material.color.getValue(date)); - expect(e = dataSource.entities.getById('reference18')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_path_material_polylineGlow')).toBeDefined(); expect(e.path.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_polylineGlow').path.material.color.getValue(date)); expect(e.path.material.glowPower.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_polylineGlow').path.material.glowPower.getValue(date)); - expect(e = dataSource.entities.getById('reference19')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_path_material_image')).toBeDefined(); expect(e.path.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_image').path.material.image.getValue(date)); expect(e.path.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_image').path.material.repeat.getValue(date)); expect(e.path.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_image').path.material.color.getValue(date)); expect(e.path.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_image').path.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference20')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_path_material_grid')).toBeDefined(); expect(e.path.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_grid').path.material.color.getValue(date)); expect(e.path.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_grid').path.material.cellAlpha.getValue(date)); expect(e.path.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_grid').path.material.lineCount.getValue(date)); expect(e.path.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_grid').path.material.lineThickness.getValue(date)); expect(e.path.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_grid').path.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference21')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_path_material_stripe')).toBeDefined(); expect(e.path.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_stripe').path.material.orientation.getValue(date)); expect(e.path.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_stripe').path.material.evenColor.getValue(date)); expect(e.path.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_stripe').path.material.oddColor.getValue(date)); expect(e.path.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_stripe').path.material.offset.getValue(date)); expect(e.path.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_stripe').path.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference22')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polygon_material_image')).toBeDefined(); expect(e.polygon.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_image').polygon.material.image.getValue(date)); expect(e.polygon.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_image').polygon.material.repeat.getValue(date)); expect(e.polygon.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_image').polygon.material.color.getValue(date)); expect(e.polygon.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_image').polygon.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference23')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polygon_material_grid')).toBeDefined(); expect(e.polygon.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_grid').polygon.material.color.getValue(date)); expect(e.polygon.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_grid').polygon.material.cellAlpha.getValue(date)); expect(e.polygon.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_grid').polygon.material.lineCount.getValue(date)); expect(e.polygon.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_grid').polygon.material.lineThickness.getValue(date)); expect(e.polygon.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_grid').polygon.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference24')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polygon_material_stripe')).toBeDefined(); expect(e.polygon.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_stripe').polygon.material.orientation.getValue(date)); expect(e.polygon.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_stripe').polygon.material.evenColor.getValue(date)); expect(e.polygon.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_stripe').polygon.material.oddColor.getValue(date)); expect(e.polygon.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_stripe').polygon.material.offset.getValue(date)); expect(e.polygon.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_stripe').polygon.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference25')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polyline_material_polylineOutline')).toBeDefined(); expect(e.polyline.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_polylineOutline').polyline.material.color.getValue(date)); expect(e.polyline.material.outlineColor.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_polylineOutline').polyline.material.outlineColor.getValue(date)); expect(e.polyline.material.outlineWidth.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_polylineOutline').polyline.material.outlineWidth.getValue(date)); - expect(e = dataSource.entities.getById('reference26')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polyline_material_polylineArrow')).toBeDefined(); expect(e.polyline.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_polylineArrow').polyline.material.color.getValue(date)); - expect(e = dataSource.entities.getById('reference27')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polyline_material_polylineGlow')).toBeDefined(); expect(e.polyline.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_polylineGlow').polyline.material.color.getValue(date)); expect(e.polyline.material.glowPower.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_polylineGlow').polyline.material.glowPower.getValue(date)); - expect(e = dataSource.entities.getById('reference28')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polyline_material_image')).toBeDefined(); expect(e.polyline.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_image').polyline.material.image.getValue(date)); expect(e.polyline.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_image').polyline.material.repeat.getValue(date)); expect(e.polyline.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_image').polyline.material.color.getValue(date)); expect(e.polyline.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_image').polyline.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference29')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polyline_material_grid')).toBeDefined(); expect(e.polyline.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_grid').polyline.material.color.getValue(date)); expect(e.polyline.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_grid').polyline.material.cellAlpha.getValue(date)); expect(e.polyline.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_grid').polyline.material.lineCount.getValue(date)); expect(e.polyline.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_grid').polyline.material.lineThickness.getValue(date)); expect(e.polyline.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_grid').polyline.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference30')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polyline_material_stripe')).toBeDefined(); expect(e.polyline.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_stripe').polyline.material.orientation.getValue(date)); expect(e.polyline.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_stripe').polyline.material.evenColor.getValue(date)); expect(e.polyline.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_stripe').polyline.material.oddColor.getValue(date)); expect(e.polyline.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_stripe').polyline.material.offset.getValue(date)); expect(e.polyline.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_stripe').polyline.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference31')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangle_material_image')).toBeDefined(); expect(e.rectangle.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_image').rectangle.material.image.getValue(date)); expect(e.rectangle.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_image').rectangle.material.repeat.getValue(date)); expect(e.rectangle.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_image').rectangle.material.color.getValue(date)); expect(e.rectangle.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_image').rectangle.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference32')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangle_material_grid')).toBeDefined(); expect(e.rectangle.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_grid').rectangle.material.color.getValue(date)); expect(e.rectangle.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_grid').rectangle.material.cellAlpha.getValue(date)); expect(e.rectangle.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_grid').rectangle.material.lineCount.getValue(date)); expect(e.rectangle.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_grid').rectangle.material.lineThickness.getValue(date)); expect(e.rectangle.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_grid').rectangle.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference33')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangle_material_stripe')).toBeDefined(); expect(e.rectangle.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_stripe').rectangle.material.orientation.getValue(date)); expect(e.rectangle.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_stripe').rectangle.material.evenColor.getValue(date)); expect(e.rectangle.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_stripe').rectangle.material.oddColor.getValue(date)); expect(e.rectangle.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_stripe').rectangle.material.offset.getValue(date)); expect(e.rectangle.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_stripe').rectangle.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference34')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_wall_material_image')).toBeDefined(); expect(e.wall.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_image').wall.material.image.getValue(date)); expect(e.wall.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_image').wall.material.repeat.getValue(date)); expect(e.wall.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_image').wall.material.color.getValue(date)); expect(e.wall.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_image').wall.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference35')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_wall_material_grid')).toBeDefined(); expect(e.wall.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_grid').wall.material.color.getValue(date)); expect(e.wall.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_grid').wall.material.cellAlpha.getValue(date)); expect(e.wall.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_grid').wall.material.lineCount.getValue(date)); expect(e.wall.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_grid').wall.material.lineThickness.getValue(date)); expect(e.wall.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_grid').wall.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference36')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_wall_material_stripe')).toBeDefined(); expect(e.wall.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_stripe').wall.material.orientation.getValue(date)); expect(e.wall.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_stripe').wall.material.evenColor.getValue(date)); expect(e.wall.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_stripe').wall.material.oddColor.getValue(date)); expect(e.wall.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_stripe').wall.material.offset.getValue(date)); expect(e.wall.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_stripe').wall.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference37')).toBeDefined(); - expect(e = dataSource.entities.getById('reference38')).toBeDefined(); - expect(e = dataSource.entities.getById('reference39')).toBeDefined(); - expect(e = dataSource.entities.getById('reference40')).toBeDefined(); - expect(e = dataSource.entities.getById('reference41')).toBeDefined(); - expect(e = dataSource.entities.getById('reference42')).toBeDefined(); - expect(e = dataSource.entities.getById('reference43')).toBeDefined(); - expect(e = dataSource.entities.getById('reference44')).toBeDefined(); - expect(e = dataSource.entities.getById('reference45')).toBeDefined(); - expect(e = dataSource.entities.getById('reference46')).toBeDefined(); - expect(e = dataSource.entities.getById('reference47')).toBeDefined(); - expect(e = dataSource.entities.getById('reference48')).toBeDefined(); - expect(e = dataSource.entities.getById('reference49')).toBeDefined(); - expect(e = dataSource.entities.getById('reference50')).toBeDefined(); - expect(e = dataSource.entities.getById('reference51')).toBeDefined(); - expect(e = dataSource.entities.getById('reference52')).toBeDefined(); - expect(e = dataSource.entities.getById('reference53')).toBeDefined(); - expect(e = dataSource.entities.getById('reference54')).toBeDefined(); - expect(e = dataSource.entities.getById('reference55')).toBeDefined(); - expect(e = dataSource.entities.getById('reference56')).toBeDefined(); - expect(e = dataSource.entities.getById('reference57')).toBeDefined(); - expect(e = dataSource.entities.getById('reference58')).toBeDefined(); - expect(e = dataSource.entities.getById('reference59')).toBeDefined(); - expect(e = dataSource.entities.getById('reference60')).toBeDefined(); - expect(e = dataSource.entities.getById('reference61')).toBeDefined(); - expect(e = dataSource.entities.getById('reference62')).toBeDefined(); - expect(e = dataSource.entities.getById('reference63')).toBeDefined(); - expect(e = dataSource.entities.getById('reference64')).toBeDefined(); - expect(e = dataSource.entities.getById('reference65')).toBeDefined(); - expect(e = dataSource.entities.getById('reference66')).toBeDefined(); - expect(e = dataSource.entities.getById('reference67')).toBeDefined(); - expect(e = dataSource.entities.getById('reference68')).toBeDefined(); - expect(e = dataSource.entities.getById('reference69')).toBeDefined(); - expect(e = dataSource.entities.getById('reference70')).toBeDefined(); - expect(e = dataSource.entities.getById('reference71')).toBeDefined(); - expect(e = dataSource.entities.getById('reference72')).toBeDefined(); - expect(e = dataSource.entities.getById('reference73')).toBeDefined(); - expect(e = dataSource.entities.getById('reference74')).toBeDefined(); - expect(e = dataSource.entities.getById('reference75')).toBeDefined(); - expect(e = dataSource.entities.getById('reference76')).toBeDefined(); - expect(e = dataSource.entities.getById('reference77')).toBeDefined(); - expect(e = dataSource.entities.getById('reference78')).toBeDefined(); - expect(e = dataSource.entities.getById('reference79')).toBeDefined(); - expect(e = dataSource.entities.getById('reference80')).toBeDefined(); - expect(e = dataSource.entities.getById('reference81')).toBeDefined(); - expect(e = dataSource.entities.getById('reference82')).toBeDefined(); - expect(e = dataSource.entities.getById('reference83')).toBeDefined(); - expect(e = dataSource.entities.getById('reference84')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_lateralSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_lateralSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_domeSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_domeSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_domeSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_environmentOcclusionMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_environmentOcclusionMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_lateralSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_lateralSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_domeSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_domeSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_domeSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_environmentOcclusionMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_environmentOcclusionMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_lateralSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_lateralSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_domeSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_domeSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_domeSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_environmentOcclusionMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_environmentOcclusionMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_fan_material_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_fan_material_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_fan_material_stripe')).toBeDefined(); expect(e = dataSource.entities.getById('VelocityPosition')).toBeDefined(); expect(e.position.getValue(documentStartDate)).toEqual(new Cartesian3(1, 2, 3)); expect(e.position.getValue(JulianDate.addSeconds(documentStartDate, 60, new JulianDate()))).toEqual(new Cartesian3(61, 122, 183)); - expect(e = dataSource.entities.getById('velocityReference1')).toBeDefined(); + expect(e = dataSource.entities.getById('velocityReference_billboard_alignedAxis')).toBeDefined(); expect(e.billboard.alignedAxis.getValue(JulianDate.addSeconds(documentStartDate, 50, new JulianDate()))).toEqualEpsilon(new Cartesian3(0.267261241912424, 0.534522483824849, 0.801783725737273), 1e-13); expect(e = dataSource.entities.getById('Sampled')).toBeDefined(); - expect(e.position.getValue(documentStartDate)).toEqual(new Cartesian3(34, 35, 36)); - expect(e.position.getValue(documentStopDate)).toEqual(new Cartesian3(37, 38, 39)); - expect(e.orientation.getValue(documentStartDate)).toEqualEpsilon(new Quaternion(0.473513723810378, 0.520865096191416, 0.568216468572454, 0.426162351429341), 1e-14); - expect(e.orientation.getValue(documentStopDate)).toEqualEpsilon(new Quaternion(0.48132991492077, 0.515710623129397, 0.550091331338023, 0.446949206712144), 1e-14); - expect(e.viewFrom.getValue(documentStartDate)).toEqual(new Cartesian3(40, 41, 42)); - expect(e.viewFrom.getValue(documentStopDate)).toEqual(new Cartesian3(43, 44, 45)); - expect(e.billboard.scale.getValue(documentStartDate)).toEqual(161.0); - expect(e.billboard.scale.getValue(documentStopDate)).toEqual(162.0); - expect(e.billboard.pixelOffset.getValue(documentStartDate)).toEqual(new Cartesian2(213, 214)); - expect(e.billboard.pixelOffset.getValue(documentStopDate)).toEqual(new Cartesian2(215, 216)); - expect(e.billboard.eyeOffset.getValue(documentStartDate)).toEqual(new Cartesian3(46, 47, 48)); - expect(e.billboard.eyeOffset.getValue(documentStopDate)).toEqual(new Cartesian3(49, 50, 51)); - expect(e.billboard.color.getValue(documentStartDate)).toEqual(Color.fromBytes(132, 133, 134, 131)); - expect(e.billboard.color.getValue(documentStopDate)).toEqual(Color.fromBytes(136, 137, 138, 135)); - expect(e.billboard.rotation.getValue(documentStartDate)).toEqual(163.0); - expect(e.billboard.rotation.getValue(documentStopDate)).toEqual(164.0); - expect(e.billboard.alignedAxis.getValue(documentStartDate)).toEqualEpsilon(new Cartesian3(0.502570711032417, 0.574366526894191, 0.646162342755964), 1e-14); - expect(e.billboard.alignedAxis.getValue(documentStopDate)).toEqualEpsilon(new Cartesian3(0.523423922590214, 0.575766314849235, 0.628108707108257), 1e-14); - expect(e.billboard.width.getValue(documentStartDate)).toEqual(165.0); - expect(e.billboard.width.getValue(documentStopDate)).toEqual(166.0); - expect(e.billboard.height.getValue(documentStartDate)).toEqual(167.0); - expect(e.billboard.height.getValue(documentStopDate)).toEqual(168.0); - expect(e.billboard.scaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(29, 30, 31, 32)); - expect(e.billboard.scaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(33, 34, 35, 36)); - expect(e.billboard.translucencyByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(37, 38, 39, 40)); - expect(e.billboard.translucencyByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(41, 42, 43, 44)); - expect(e.billboard.pixelOffsetScaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(45, 46, 47, 48)); - expect(e.billboard.pixelOffsetScaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(49, 50, 51, 52)); - expect(e.billboard.imageSubRegion.getValue(documentStartDate)).toEqual(new BoundingRectangle(5, 6, 7, 8)); - expect(e.billboard.imageSubRegion.getValue(documentStopDate)).toEqual(new BoundingRectangle(9, 10, 11, 12)); - expect(e.box.dimensions.getValue(documentStartDate)).toEqual(new Cartesian3(52, 53, 54)); - expect(e.box.dimensions.getValue(documentStopDate)).toEqual(new Cartesian3(55, 56, 57)); - expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(140, 141, 142, 139)); - expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(144, 145, 146, 143)); - expect(e.box.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(148, 149, 150, 147)); - expect(e.box.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(152, 153, 154, 151)); - expect(e.box.outlineWidth.getValue(documentStartDate)).toEqual(169.0); - expect(e.box.outlineWidth.getValue(documentStopDate)).toEqual(170.0); - expect(e.corridor.width.getValue(documentStartDate)).toEqual(171.0); - expect(e.corridor.width.getValue(documentStopDate)).toEqual(172.0); - expect(e.corridor.height.getValue(documentStartDate)).toEqual(173.0); - expect(e.corridor.height.getValue(documentStopDate)).toEqual(174.0); - expect(e.corridor.extrudedHeight.getValue(documentStartDate)).toEqual(175.0); - expect(e.corridor.extrudedHeight.getValue(documentStopDate)).toEqual(176.0); - expect(e.corridor.granularity.getValue(documentStartDate)).toEqual(177.0); - expect(e.corridor.granularity.getValue(documentStopDate)).toEqual(178.0); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(156, 157, 158, 155)); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(160, 161, 162, 159)); - expect(e.corridor.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(164, 165, 166, 163)); - expect(e.corridor.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(168, 169, 170, 167)); - expect(e.corridor.outlineWidth.getValue(documentStartDate)).toEqual(179.0); - expect(e.corridor.outlineWidth.getValue(documentStopDate)).toEqual(180.0); - expect(e.cylinder.length.getValue(documentStartDate)).toEqual(181.0); - expect(e.cylinder.length.getValue(documentStopDate)).toEqual(182.0); - expect(e.cylinder.topRadius.getValue(documentStartDate)).toEqual(183.0); - expect(e.cylinder.topRadius.getValue(documentStopDate)).toEqual(184.0); - expect(e.cylinder.bottomRadius.getValue(documentStartDate)).toEqual(185.0); - expect(e.cylinder.bottomRadius.getValue(documentStopDate)).toEqual(186.0); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(172, 173, 174, 171)); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(176, 177, 178, 175)); - expect(e.cylinder.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(180, 181, 182, 179)); - expect(e.cylinder.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(184, 185, 186, 183)); - expect(e.cylinder.outlineWidth.getValue(documentStartDate)).toEqual(187.0); - expect(e.cylinder.outlineWidth.getValue(documentStopDate)).toEqual(188.0); - expect(e.cylinder.numberOfVerticalLines.getValue(documentStartDate)).toEqual(189.0); - expect(e.cylinder.numberOfVerticalLines.getValue(documentStopDate)).toEqual(190.0); - expect(e.cylinder.slices.getValue(documentStartDate)).toEqual(191.0); - expect(e.cylinder.slices.getValue(documentStopDate)).toEqual(192.0); - expect(e.ellipse.semiMajorAxis.getValue(documentStartDate)).toEqual(193.0); - expect(e.ellipse.semiMajorAxis.getValue(documentStopDate)).toEqual(194.0); - expect(e.ellipse.semiMinorAxis.getValue(documentStartDate)).toEqual(195.0); - expect(e.ellipse.semiMinorAxis.getValue(documentStopDate)).toEqual(196.0); - expect(e.ellipse.height.getValue(documentStartDate)).toEqual(197.0); - expect(e.ellipse.height.getValue(documentStopDate)).toEqual(198.0); - expect(e.ellipse.extrudedHeight.getValue(documentStartDate)).toEqual(199.0); - expect(e.ellipse.extrudedHeight.getValue(documentStopDate)).toEqual(200.0); - expect(e.ellipse.rotation.getValue(documentStartDate)).toEqual(201.0); - expect(e.ellipse.rotation.getValue(documentStopDate)).toEqual(202.0); - expect(e.ellipse.stRotation.getValue(documentStartDate)).toEqual(203.0); - expect(e.ellipse.stRotation.getValue(documentStopDate)).toEqual(204.0); - expect(e.ellipse.granularity.getValue(documentStartDate)).toEqual(205.0); - expect(e.ellipse.granularity.getValue(documentStopDate)).toEqual(206.0); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(188, 189, 190, 187)); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(192, 193, 194, 191)); - expect(e.ellipse.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(196, 197, 198, 195)); - expect(e.ellipse.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(200, 201, 202, 199)); - expect(e.ellipse.outlineWidth.getValue(documentStartDate)).toEqual(207.0); - expect(e.ellipse.outlineWidth.getValue(documentStopDate)).toEqual(208.0); - expect(e.ellipse.numberOfVerticalLines.getValue(documentStartDate)).toEqual(209.0); - expect(e.ellipse.numberOfVerticalLines.getValue(documentStopDate)).toEqual(210.0); - expect(e.ellipsoid.radii.getValue(documentStartDate)).toEqual(new Cartesian3(58, 59, 60)); - expect(e.ellipsoid.radii.getValue(documentStopDate)).toEqual(new Cartesian3(61, 62, 63)); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(204, 205, 206, 203)); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(208, 209, 210, 207)); - expect(e.ellipsoid.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(212, 213, 214, 211)); - expect(e.ellipsoid.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(216, 217, 218, 215)); - expect(e.ellipsoid.outlineWidth.getValue(documentStartDate)).toEqual(211.0); - expect(e.ellipsoid.outlineWidth.getValue(documentStopDate)).toEqual(212.0); - expect(e.ellipsoid.stackPartitions.getValue(documentStartDate)).toEqual(213.0); - expect(e.ellipsoid.stackPartitions.getValue(documentStopDate)).toEqual(214.0); - expect(e.ellipsoid.slicePartitions.getValue(documentStartDate)).toEqual(215.0); - expect(e.ellipsoid.slicePartitions.getValue(documentStopDate)).toEqual(216.0); - expect(e.ellipsoid.subdivisions.getValue(documentStartDate)).toEqual(217.0); - expect(e.ellipsoid.subdivisions.getValue(documentStopDate)).toEqual(218.0); - expect(e.label.scale.getValue(documentStartDate)).toEqual(219.0); - expect(e.label.scale.getValue(documentStopDate)).toEqual(220.0); - expect(e.label.pixelOffset.getValue(documentStartDate)).toEqual(new Cartesian2(217, 218)); - expect(e.label.pixelOffset.getValue(documentStopDate)).toEqual(new Cartesian2(219, 220)); - expect(e.label.eyeOffset.getValue(documentStartDate)).toEqual(new Cartesian3(64, 65, 66)); - expect(e.label.eyeOffset.getValue(documentStopDate)).toEqual(new Cartesian3(67, 68, 69)); - expect(e.label.fillColor.getValue(documentStartDate)).toEqual(Color.fromBytes(220, 221, 222, 219)); - expect(e.label.fillColor.getValue(documentStopDate)).toEqual(Color.fromBytes(224, 225, 226, 223)); - expect(e.label.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(228, 229, 230, 227)); - expect(e.label.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(232, 233, 234, 231)); - expect(e.label.outlineWidth.getValue(documentStartDate)).toEqual(221.0); - expect(e.label.outlineWidth.getValue(documentStopDate)).toEqual(222.0); - expect(e.label.translucencyByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(53, 54, 55, 56)); - expect(e.label.translucencyByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(57, 58, 59, 60)); - expect(e.label.pixelOffsetScaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(61, 62, 63, 64)); - expect(e.label.pixelOffsetScaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(65, 66, 67, 68)); - expect(e.model.scale.getValue(documentStartDate)).toEqual(223.0); - expect(e.model.scale.getValue(documentStopDate)).toEqual(224.0); - expect(e.model.minimumPixelSize.getValue(documentStartDate)).toEqual(225.0); - expect(e.model.minimumPixelSize.getValue(documentStopDate)).toEqual(226.0); - expect(e.model.maximumScale.getValue(documentStartDate)).toEqual(227.0); - expect(e.model.maximumScale.getValue(documentStopDate)).toEqual(228.0); - expect(e.model.color.getValue(documentStartDate)).toEqual(Color.fromBytes(236, 237, 238, 235)); - expect(e.model.color.getValue(documentStopDate)).toEqual(Color.fromBytes(240, 241, 242, 239)); - expect(e.model.colorBlendAmount.getValue(documentStartDate)).toEqual(229.0); - expect(e.model.colorBlendAmount.getValue(documentStopDate)).toEqual(230.0); - expect(e.path.width.getValue(documentStartDate)).toEqual(231.0); - expect(e.path.width.getValue(documentStopDate)).toEqual(232.0); - expect(e.path.resolution.getValue(documentStartDate)).toEqual(233.0); - expect(e.path.resolution.getValue(documentStopDate)).toEqual(234.0); - expect(e.path.leadTime.getValue(documentStartDate)).toEqual(235.0); - expect(e.path.leadTime.getValue(documentStopDate)).toEqual(236.0); - expect(e.path.trailTime.getValue(documentStartDate)).toEqual(237.0); - expect(e.path.trailTime.getValue(documentStopDate)).toEqual(238.0); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(244, 245, 246, 243)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(248, 249, 250, 247)); - expect(e.point.pixelSize.getValue(documentStartDate)).toEqual(239.0); - expect(e.point.pixelSize.getValue(documentStopDate)).toEqual(240.0); - expect(e.point.color.getValue(documentStartDate)).toEqual(Color.fromBytes(252, 253, 254, 251)); - expect(e.point.color.getValue(documentStopDate)).toEqual(Color.fromBytes(1, 2, 3, 0)); - expect(e.point.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(5, 6, 7, 4)); - expect(e.point.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(9, 10, 11, 8)); - expect(e.point.outlineWidth.getValue(documentStartDate)).toEqual(241.0); - expect(e.point.outlineWidth.getValue(documentStopDate)).toEqual(242.0); - expect(e.point.scaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(69, 70, 71, 72)); - expect(e.point.scaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(73, 74, 75, 76)); - expect(e.point.translucencyByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(77, 78, 79, 80)); - expect(e.point.translucencyByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(81, 82, 83, 84)); - expect(e.polygon.height.getValue(documentStartDate)).toEqual(243.0); - expect(e.polygon.height.getValue(documentStopDate)).toEqual(244.0); - expect(e.polygon.extrudedHeight.getValue(documentStartDate)).toEqual(245.0); - expect(e.polygon.extrudedHeight.getValue(documentStopDate)).toEqual(246.0); - expect(e.polygon.stRotation.getValue(documentStartDate)).toEqual(247.0); - expect(e.polygon.stRotation.getValue(documentStopDate)).toEqual(248.0); - expect(e.polygon.granularity.getValue(documentStartDate)).toEqual(249.0); - expect(e.polygon.granularity.getValue(documentStopDate)).toEqual(250.0); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(13, 14, 15, 12)); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(17, 18, 19, 16)); - expect(e.polygon.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(21, 22, 23, 20)); - expect(e.polygon.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(25, 26, 27, 24)); - expect(e.polygon.outlineWidth.getValue(documentStartDate)).toEqual(251.0); - expect(e.polygon.outlineWidth.getValue(documentStopDate)).toEqual(252.0); - expect(e.polyline.width.getValue(documentStartDate)).toEqual(253.0); - expect(e.polyline.width.getValue(documentStopDate)).toEqual(254.0); - expect(e.polyline.granularity.getValue(documentStartDate)).toEqual(255.0); - expect(e.polyline.granularity.getValue(documentStopDate)).toEqual(256.0); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(29, 30, 31, 28)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(33, 34, 35, 32)); - expect(e.rectangle.coordinates.getValue(documentStartDate)).toEqual(new Rectangle(1.14601836602552, 0.575222039230621, 0.00442571243572409, 1.00442571243572)); - expect(e.rectangle.coordinates.getValue(documentStopDate)).toEqual(new Rectangle(0.433629385640828, 1.43362938564083, 0.862833058845931, 0.292036732051034)); - expect(e.rectangle.height.getValue(documentStartDate)).toEqual(257.0); - expect(e.rectangle.height.getValue(documentStopDate)).toEqual(258.0); - expect(e.rectangle.extrudedHeight.getValue(documentStartDate)).toEqual(259.0); - expect(e.rectangle.extrudedHeight.getValue(documentStopDate)).toEqual(260.0); - expect(e.rectangle.rotation.getValue(documentStartDate)).toEqual(261.0); - expect(e.rectangle.rotation.getValue(documentStopDate)).toEqual(262.0); - expect(e.rectangle.stRotation.getValue(documentStartDate)).toEqual(263.0); - expect(e.rectangle.stRotation.getValue(documentStopDate)).toEqual(264.0); - expect(e.rectangle.granularity.getValue(documentStartDate)).toEqual(265.0); - expect(e.rectangle.granularity.getValue(documentStopDate)).toEqual(266.0); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(37, 38, 39, 36)); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(41, 42, 43, 40)); - expect(e.rectangle.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(45, 46, 47, 44)); - expect(e.rectangle.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(49, 50, 51, 48)); - expect(e.rectangle.outlineWidth.getValue(documentStartDate)).toEqual(267.0); - expect(e.rectangle.outlineWidth.getValue(documentStopDate)).toEqual(268.0); - expect(e.wall.granularity.getValue(documentStartDate)).toEqual(269.0); - expect(e.wall.granularity.getValue(documentStopDate)).toEqual(270.0); - expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(53, 54, 55, 52)); - expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(57, 58, 59, 56)); - expect(e.wall.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(61, 62, 63, 60)); - expect(e.wall.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(65, 66, 67, 64)); - expect(e.wall.outlineWidth.getValue(documentStartDate)).toEqual(271.0); - expect(e.wall.outlineWidth.getValue(documentStopDate)).toEqual(272.0); - expect(e = dataSource.entities.getById('sampled1')).toBeDefined(); - expect(e.position.getValue(documentStartDate)).toEqual(Cartesian3.fromRadians(0.716814692820414, 0.146018366025517, 9)); - expect(e.position.getValue(documentStopDate)).toEqual(Cartesian3.fromRadians(0.575222039230621, 0.00442571243572409, 12)); - expect(e = dataSource.entities.getById('sampled2')).toBeDefined(); - expect(e.position.getValue(documentStartDate)).toEqual(Cartesian3.fromDegrees(13, 14, 15)); - expect(e.position.getValue(documentStopDate)).toEqual(Cartesian3.fromDegrees(16, 17, 18)); - expect(e = dataSource.entities.getById('sampled3')).toBeDefined(); - expect(e.position.getValue(documentStartDate)).toEqual(new Cartesian3(7, 8, 9)); - expect(e.position.getValue(documentStopDate)).toEqual(new Cartesian3(13, 14, 15)); - expect(e = dataSource.entities.getById('sampled4')).toBeDefined(); - expect(e.billboard.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.517647058823529, 0.52156862745098, 0.525490196078431, 0.513725490196078), 1e-14); - expect(e.billboard.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.533333333333333, 0.537254901960784, 0.541176470588235, 0.529411764705882), 1e-14); - expect(e = dataSource.entities.getById('sampled5')).toBeDefined(); - expect(e.billboard.alignedAxis.getValue(documentStartDate)).toEqual(Cartesian3.fromSpherical(new Spherical(5, 6))); - expect(e.billboard.alignedAxis.getValue(documentStopDate)).toEqual(Cartesian3.fromSpherical(new Spherical(7, 8))); - expect(e = dataSource.entities.getById('sampled6')).toBeDefined(); - expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.549019607843137, 0.552941176470588, 0.556862745098039, 0.545098039215686), 1e-14); - expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.564705882352941, 0.568627450980392, 0.572549019607843, 0.56078431372549), 1e-14); - expect(e = dataSource.entities.getById('sampled7')).toBeDefined(); - expect(e.box.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(221, 222)); - expect(e.box.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(223, 224)); - expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(6, 7, 8, 5)); - expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(10, 11, 12, 9)); - expect(e = dataSource.entities.getById('sampled8')).toBeDefined(); - expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(14, 15, 16, 13)); - expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(18, 19, 20, 17)); - expect(e.box.material.cellAlpha.getValue(documentStartDate)).toEqual(313.0); - expect(e.box.material.cellAlpha.getValue(documentStopDate)).toEqual(314.0); - expect(e.box.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(225, 226)); - expect(e.box.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(227, 228)); - expect(e.box.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(229, 230)); - expect(e.box.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(231, 232)); - expect(e.box.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(233, 234)); - expect(e.box.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(235, 236)); - expect(e = dataSource.entities.getById('sampled9')).toBeDefined(); - expect(e.box.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(22, 23, 24, 21)); - expect(e.box.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(26, 27, 28, 25)); - expect(e.box.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(30, 31, 32, 29)); - expect(e.box.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(34, 35, 36, 33)); - expect(e.box.material.offset.getValue(documentStartDate)).toEqual(315.0); - expect(e.box.material.offset.getValue(documentStopDate)).toEqual(316.0); - expect(e.box.material.repeat.getValue(documentStartDate)).toEqual(317.0); - expect(e.box.material.repeat.getValue(documentStopDate)).toEqual(318.0); - expect(e = dataSource.entities.getById('sampled10')).toBeDefined(); - expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.580392156862745, 0.584313725490196, 0.588235294117647, 0.576470588235294), 1e-14); - expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.596078431372549, 0.6, 0.603921568627451, 0.592156862745098), 1e-14); - expect(e = dataSource.entities.getById('sampled11')).toBeDefined(); - expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.611764705882353, 0.615686274509804, 0.619607843137255, 0.607843137254902), 1e-14); - expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.627450980392157, 0.631372549019608, 0.635294117647059, 0.623529411764706), 1e-14); - expect(e = dataSource.entities.getById('sampled12')).toBeDefined(); - expect(e.box.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.643137254901961, 0.647058823529412, 0.650980392156863, 0.63921568627451), 1e-14); - expect(e.box.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.658823529411765, 0.662745098039216, 0.666666666666667, 0.654901960784314), 1e-14); - expect(e = dataSource.entities.getById('sampled13')).toBeDefined(); - expect(e.box.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.674509803921569, 0.67843137254902, 0.682352941176471, 0.670588235294118), 1e-14); - expect(e.box.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.690196078431373, 0.694117647058824, 0.698039215686274, 0.686274509803922), 1e-14); - expect(e = dataSource.entities.getById('sampled14')).toBeDefined(); - expect(e.box.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.705882352941177, 0.709803921568627, 0.713725490196078, 0.701960784313725), 1e-14); - expect(e.box.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.72156862745098, 0.725490196078431, 0.729411764705882, 0.717647058823529), 1e-14); - expect(e = dataSource.entities.getById('sampled15')).toBeDefined(); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.737254901960784, 0.741176470588235, 0.745098039215686, 0.733333333333333), 1e-14); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.752941176470588, 0.756862745098039, 0.76078431372549, 0.749019607843137), 1e-14); - expect(e = dataSource.entities.getById('sampled16')).toBeDefined(); - expect(e.corridor.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(237, 238)); - expect(e.corridor.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(239, 240)); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(38, 39, 40, 37)); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(42, 43, 44, 41)); - expect(e = dataSource.entities.getById('sampled17')).toBeDefined(); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(46, 47, 48, 45)); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(50, 51, 52, 49)); - expect(e.corridor.material.cellAlpha.getValue(documentStartDate)).toEqual(319.0); - expect(e.corridor.material.cellAlpha.getValue(documentStopDate)).toEqual(320.0); - expect(e.corridor.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(241, 242)); - expect(e.corridor.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(243, 244)); - expect(e.corridor.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(245, 246)); - expect(e.corridor.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(247, 248)); - expect(e.corridor.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(249, 250)); - expect(e.corridor.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(251, 252)); - expect(e = dataSource.entities.getById('sampled18')).toBeDefined(); - expect(e.corridor.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(54, 55, 56, 53)); - expect(e.corridor.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(58, 59, 60, 57)); - expect(e.corridor.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(62, 63, 64, 61)); - expect(e.corridor.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(66, 67, 68, 65)); - expect(e.corridor.material.offset.getValue(documentStartDate)).toEqual(321.0); - expect(e.corridor.material.offset.getValue(documentStopDate)).toEqual(322.0); - expect(e.corridor.material.repeat.getValue(documentStartDate)).toEqual(323.0); - expect(e.corridor.material.repeat.getValue(documentStopDate)).toEqual(324.0); - expect(e = dataSource.entities.getById('sampled19')).toBeDefined(); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.768627450980392, 0.772549019607843, 0.776470588235294, 0.764705882352941), 1e-14); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.784313725490196, 0.788235294117647, 0.792156862745098, 0.780392156862745), 1e-14); - expect(e = dataSource.entities.getById('sampled20')).toBeDefined(); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.8, 0.803921568627451, 0.807843137254902, 0.796078431372549), 1e-14); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.815686274509804, 0.819607843137255, 0.823529411764706, 0.811764705882353), 1e-14); - expect(e = dataSource.entities.getById('sampled21')).toBeDefined(); - expect(e.corridor.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.831372549019608, 0.835294117647059, 0.83921568627451, 0.827450980392157), 1e-14); - expect(e.corridor.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.847058823529412, 0.850980392156863, 0.854901960784314, 0.843137254901961), 1e-14); - expect(e = dataSource.entities.getById('sampled22')).toBeDefined(); - expect(e.corridor.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.862745098039216, 0.866666666666667, 0.870588235294118, 0.858823529411765), 1e-14); - expect(e.corridor.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.87843137254902, 0.882352941176471, 0.886274509803922, 0.874509803921569), 1e-14); - expect(e = dataSource.entities.getById('sampled23')).toBeDefined(); - expect(e.corridor.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.894117647058824, 0.898039215686275, 0.901960784313726, 0.890196078431373), 1e-14); - expect(e.corridor.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.909803921568627, 0.913725490196078, 0.917647058823529, 0.905882352941176), 1e-14); - expect(e = dataSource.entities.getById('sampled24')).toBeDefined(); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.925490196078431, 0.929411764705882, 0.933333333333333, 0.92156862745098), 1e-14); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.941176470588235, 0.945098039215686, 0.949019607843137, 0.937254901960784), 1e-14); - expect(e = dataSource.entities.getById('sampled25')).toBeDefined(); - expect(e.cylinder.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(253, 254)); - expect(e.cylinder.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(255, 256)); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(70, 71, 72, 69)); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(74, 75, 76, 73)); - expect(e = dataSource.entities.getById('sampled26')).toBeDefined(); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(78, 79, 80, 77)); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(82, 83, 84, 81)); - expect(e.cylinder.material.cellAlpha.getValue(documentStartDate)).toEqual(325.0); - expect(e.cylinder.material.cellAlpha.getValue(documentStopDate)).toEqual(326.0); - expect(e.cylinder.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(257, 258)); - expect(e.cylinder.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(259, 260)); - expect(e.cylinder.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(261, 262)); - expect(e.cylinder.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(263, 264)); - expect(e.cylinder.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(265, 266)); - expect(e.cylinder.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(267, 268)); - expect(e = dataSource.entities.getById('sampled27')).toBeDefined(); - expect(e.cylinder.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(86, 87, 88, 85)); - expect(e.cylinder.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(90, 91, 92, 89)); - expect(e.cylinder.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(94, 95, 96, 93)); - expect(e.cylinder.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(98, 99, 100, 97)); - expect(e.cylinder.material.offset.getValue(documentStartDate)).toEqual(327.0); - expect(e.cylinder.material.offset.getValue(documentStopDate)).toEqual(328.0); - expect(e.cylinder.material.repeat.getValue(documentStartDate)).toEqual(329.0); - expect(e.cylinder.material.repeat.getValue(documentStopDate)).toEqual(330.0); - expect(e = dataSource.entities.getById('sampled28')).toBeDefined(); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.956862745098039, 0.96078431372549, 0.964705882352941, 0.952941176470588), 1e-14); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.972549019607843, 0.976470588235294, 0.980392156862745, 0.968627450980392), 1e-14); - expect(e = dataSource.entities.getById('sampled29')).toBeDefined(); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.988235294117647, 0.992156862745098, 0.996078431372549, 0.984313725490196), 1e-14); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.00392156862745098, 0.00784313725490196, 0.0117647058823529, 0), 1e-14); - expect(e = dataSource.entities.getById('sampled30')).toBeDefined(); - expect(e.cylinder.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0196078431372549, 0.0235294117647059, 0.0274509803921569, 0.0156862745098039), 1e-14); - expect(e.cylinder.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0352941176470588, 0.0392156862745098, 0.0431372549019608, 0.0313725490196078), 1e-14); - expect(e = dataSource.entities.getById('sampled31')).toBeDefined(); - expect(e.cylinder.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0509803921568627, 0.0549019607843137, 0.0588235294117647, 0.0470588235294118), 1e-14); - expect(e.cylinder.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0666666666666667, 0.0705882352941176, 0.0745098039215686, 0.0627450980392157), 1e-14); - expect(e = dataSource.entities.getById('sampled32')).toBeDefined(); - expect(e.cylinder.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0823529411764706, 0.0862745098039216, 0.0901960784313725, 0.0784313725490196), 1e-14); - expect(e.cylinder.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0980392156862745, 0.101960784313725, 0.105882352941176, 0.0941176470588235), 1e-14); - expect(e = dataSource.entities.getById('sampled33')).toBeDefined(); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.113725490196078, 0.117647058823529, 0.12156862745098, 0.109803921568627), 1e-14); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.129411764705882, 0.133333333333333, 0.137254901960784, 0.125490196078431), 1e-14); - expect(e = dataSource.entities.getById('sampled34')).toBeDefined(); - expect(e.ellipse.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(269, 270)); - expect(e.ellipse.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(271, 272)); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(102, 103, 104, 101)); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(106, 107, 108, 105)); - expect(e = dataSource.entities.getById('sampled35')).toBeDefined(); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(110, 111, 112, 109)); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(114, 115, 116, 113)); - expect(e.ellipse.material.cellAlpha.getValue(documentStartDate)).toEqual(331.0); - expect(e.ellipse.material.cellAlpha.getValue(documentStopDate)).toEqual(332.0); - expect(e.ellipse.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(273, 274)); - expect(e.ellipse.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(275, 276)); - expect(e.ellipse.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(277, 278)); - expect(e.ellipse.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(279, 280)); - expect(e.ellipse.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(281, 282)); - expect(e.ellipse.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(283, 284)); - expect(e = dataSource.entities.getById('sampled36')).toBeDefined(); - expect(e.ellipse.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(118, 119, 120, 117)); - expect(e.ellipse.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(122, 123, 124, 121)); - expect(e.ellipse.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(126, 127, 128, 125)); - expect(e.ellipse.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(130, 131, 132, 129)); - expect(e.ellipse.material.offset.getValue(documentStartDate)).toEqual(333.0); - expect(e.ellipse.material.offset.getValue(documentStopDate)).toEqual(334.0); - expect(e.ellipse.material.repeat.getValue(documentStartDate)).toEqual(335.0); - expect(e.ellipse.material.repeat.getValue(documentStopDate)).toEqual(336.0); - expect(e = dataSource.entities.getById('sampled37')).toBeDefined(); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.145098039215686, 0.149019607843137, 0.152941176470588, 0.141176470588235), 1e-14); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.16078431372549, 0.164705882352941, 0.168627450980392, 0.156862745098039), 1e-14); - expect(e = dataSource.entities.getById('sampled38')).toBeDefined(); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.176470588235294, 0.180392156862745, 0.184313725490196, 0.172549019607843), 1e-14); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.192156862745098, 0.196078431372549, 0.2, 0.188235294117647), 1e-14); - expect(e = dataSource.entities.getById('sampled39')).toBeDefined(); - expect(e.ellipse.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.207843137254902, 0.211764705882353, 0.215686274509804, 0.203921568627451), 1e-14); - expect(e.ellipse.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.223529411764706, 0.227450980392157, 0.231372549019608, 0.219607843137255), 1e-14); - expect(e = dataSource.entities.getById('sampled40')).toBeDefined(); - expect(e.ellipse.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.23921568627451, 0.243137254901961, 0.247058823529412, 0.235294117647059), 1e-14); - expect(e.ellipse.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.254901960784314, 0.258823529411765, 0.262745098039216, 0.250980392156863), 1e-14); - expect(e = dataSource.entities.getById('sampled41')).toBeDefined(); - expect(e.ellipse.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.270588235294118, 0.274509803921569, 0.27843137254902, 0.266666666666667), 1e-14); - expect(e.ellipse.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.286274509803922, 0.290196078431373, 0.294117647058824, 0.282352941176471), 1e-14); - expect(e = dataSource.entities.getById('sampled42')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.301960784313725, 0.305882352941176, 0.309803921568627, 0.298039215686275), 1e-14); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.317647058823529, 0.32156862745098, 0.325490196078431, 0.313725490196078), 1e-14); - expect(e = dataSource.entities.getById('sampled43')).toBeDefined(); - expect(e.ellipsoid.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(285, 286)); - expect(e.ellipsoid.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(287, 288)); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(134, 135, 136, 133)); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(138, 139, 140, 137)); - expect(e = dataSource.entities.getById('sampled44')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(142, 143, 144, 141)); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(146, 147, 148, 145)); - expect(e.ellipsoid.material.cellAlpha.getValue(documentStartDate)).toEqual(337.0); - expect(e.ellipsoid.material.cellAlpha.getValue(documentStopDate)).toEqual(338.0); - expect(e.ellipsoid.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(289, 290)); - expect(e.ellipsoid.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(291, 292)); - expect(e.ellipsoid.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(293, 294)); - expect(e.ellipsoid.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(295, 296)); - expect(e.ellipsoid.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(297, 298)); - expect(e.ellipsoid.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(299, 300)); - expect(e = dataSource.entities.getById('sampled45')).toBeDefined(); - expect(e.ellipsoid.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(150, 151, 152, 149)); - expect(e.ellipsoid.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(154, 155, 156, 153)); - expect(e.ellipsoid.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(158, 159, 160, 157)); - expect(e.ellipsoid.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(162, 163, 164, 161)); - expect(e.ellipsoid.material.offset.getValue(documentStartDate)).toEqual(339.0); - expect(e.ellipsoid.material.offset.getValue(documentStopDate)).toEqual(340.0); - expect(e.ellipsoid.material.repeat.getValue(documentStartDate)).toEqual(341.0); - expect(e.ellipsoid.material.repeat.getValue(documentStopDate)).toEqual(342.0); - expect(e = dataSource.entities.getById('sampled46')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.333333333333333, 0.337254901960784, 0.341176470588235, 0.329411764705882), 1e-14); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.349019607843137, 0.352941176470588, 0.356862745098039, 0.345098039215686), 1e-14); - expect(e = dataSource.entities.getById('sampled47')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.364705882352941, 0.368627450980392, 0.372549019607843, 0.36078431372549), 1e-14); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.380392156862745, 0.384313725490196, 0.388235294117647, 0.376470588235294), 1e-14); - expect(e = dataSource.entities.getById('sampled48')).toBeDefined(); - expect(e.ellipsoid.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.396078431372549, 0.4, 0.403921568627451, 0.392156862745098), 1e-14); - expect(e.ellipsoid.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.411764705882353, 0.415686274509804, 0.419607843137255, 0.407843137254902), 1e-14); - expect(e = dataSource.entities.getById('sampled49')).toBeDefined(); - expect(e.ellipsoid.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.427450980392157, 0.431372549019608, 0.435294117647059, 0.423529411764706), 1e-14); - expect(e.ellipsoid.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.443137254901961, 0.447058823529412, 0.450980392156863, 0.43921568627451), 1e-14); - expect(e = dataSource.entities.getById('sampled50')).toBeDefined(); - expect(e.ellipsoid.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.458823529411765, 0.462745098039216, 0.466666666666667, 0.454901960784314), 1e-14); - expect(e.ellipsoid.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.474509803921569, 0.47843137254902, 0.482352941176471, 0.470588235294118), 1e-14); - expect(e = dataSource.entities.getById('sampled51')).toBeDefined(); - expect(e.label.fillColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.490196078431373, 0.494117647058824, 0.498039215686275, 0.486274509803922), 1e-14); - expect(e.label.fillColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.505882352941176, 0.509803921568627, 0.513725490196078, 0.501960784313725), 1e-14); - expect(e = dataSource.entities.getById('sampled52')).toBeDefined(); - expect(e.label.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.52156862745098, 0.525490196078431, 0.529411764705882, 0.517647058823529), 1e-14); - expect(e.label.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.537254901960784, 0.541176470588235, 0.545098039215686, 0.533333333333333), 1e-14); - expect(e = dataSource.entities.getById('sampled53')).toBeDefined(); - expect(e.model.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.552941176470588, 0.556862745098039, 0.56078431372549, 0.549019607843137), 1e-14); - expect(e.model.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.568627450980392, 0.572549019607843, 0.576470588235294, 0.564705882352941), 1e-14); - expect(e = dataSource.entities.getById('sampled54')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.584313725490196, 0.588235294117647, 0.592156862745098, 0.580392156862745), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.6, 0.603921568627451, 0.607843137254902, 0.596078431372549), 1e-14); - expect(e = dataSource.entities.getById('sampled55')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(166, 167, 168, 165)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(170, 171, 172, 169)); - expect(e.path.material.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(174, 175, 176, 173)); - expect(e.path.material.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(178, 179, 180, 177)); - expect(e.path.material.outlineWidth.getValue(documentStartDate)).toEqual(343.0); - expect(e.path.material.outlineWidth.getValue(documentStopDate)).toEqual(344.0); - expect(e = dataSource.entities.getById('sampled56')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(182, 183, 184, 181)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(186, 187, 188, 185)); - expect(e = dataSource.entities.getById('sampled57')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(190, 191, 192, 189)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(194, 195, 196, 193)); - expect(e.path.material.glowPower.getValue(documentStartDate)).toEqual(345.0); - expect(e.path.material.glowPower.getValue(documentStopDate)).toEqual(346.0); - expect(e = dataSource.entities.getById('sampled58')).toBeDefined(); - expect(e.path.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(301, 302)); - expect(e.path.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(303, 304)); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(198, 199, 200, 197)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(202, 203, 204, 201)); - expect(e = dataSource.entities.getById('sampled59')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(206, 207, 208, 205)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(210, 211, 212, 209)); - expect(e.path.material.cellAlpha.getValue(documentStartDate)).toEqual(347.0); - expect(e.path.material.cellAlpha.getValue(documentStopDate)).toEqual(348.0); - expect(e.path.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(305, 306)); - expect(e.path.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(307, 308)); - expect(e.path.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(309, 310)); - expect(e.path.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(311, 312)); - expect(e.path.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(313, 314)); - expect(e.path.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(315, 316)); - expect(e = dataSource.entities.getById('sampled60')).toBeDefined(); - expect(e.path.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(214, 215, 216, 213)); - expect(e.path.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(218, 219, 220, 217)); - expect(e.path.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(222, 223, 224, 221)); - expect(e.path.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(226, 227, 228, 225)); - expect(e.path.material.offset.getValue(documentStartDate)).toEqual(349.0); - expect(e.path.material.offset.getValue(documentStopDate)).toEqual(350.0); - expect(e.path.material.repeat.getValue(documentStartDate)).toEqual(351.0); - expect(e.path.material.repeat.getValue(documentStopDate)).toEqual(352.0); - expect(e = dataSource.entities.getById('sampled61')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.615686274509804, 0.619607843137255, 0.623529411764706, 0.611764705882353), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.631372549019608, 0.635294117647059, 0.63921568627451, 0.627450980392157), 1e-14); - expect(e = dataSource.entities.getById('sampled62')).toBeDefined(); - expect(e.path.material.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.647058823529412, 0.650980392156863, 0.654901960784314, 0.643137254901961), 1e-14); - expect(e.path.material.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.662745098039216, 0.666666666666667, 0.670588235294118, 0.658823529411765), 1e-14); - expect(e = dataSource.entities.getById('sampled63')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.67843137254902, 0.682352941176471, 0.686274509803922, 0.674509803921569), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.694117647058824, 0.698039215686274, 0.701960784313725, 0.690196078431373), 1e-14); - expect(e = dataSource.entities.getById('sampled64')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.709803921568627, 0.713725490196078, 0.717647058823529, 0.705882352941177), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.725490196078431, 0.729411764705882, 0.733333333333333, 0.72156862745098), 1e-14); - expect(e = dataSource.entities.getById('sampled65')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.741176470588235, 0.745098039215686, 0.749019607843137, 0.737254901960784), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.756862745098039, 0.76078431372549, 0.764705882352941, 0.752941176470588), 1e-14); - expect(e = dataSource.entities.getById('sampled66')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.772549019607843, 0.776470588235294, 0.780392156862745, 0.768627450980392), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.788235294117647, 0.792156862745098, 0.796078431372549, 0.784313725490196), 1e-14); - expect(e = dataSource.entities.getById('sampled67')).toBeDefined(); - expect(e.path.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.803921568627451, 0.807843137254902, 0.811764705882353, 0.8), 1e-14); - expect(e.path.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.819607843137255, 0.823529411764706, 0.827450980392157, 0.815686274509804), 1e-14); - expect(e = dataSource.entities.getById('sampled68')).toBeDefined(); - expect(e.path.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.835294117647059, 0.83921568627451, 0.843137254901961, 0.831372549019608), 1e-14); - expect(e.path.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.850980392156863, 0.854901960784314, 0.858823529411765, 0.847058823529412), 1e-14); - expect(e = dataSource.entities.getById('sampled69')).toBeDefined(); - expect(e.point.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.866666666666667, 0.870588235294118, 0.874509803921569, 0.862745098039216), 1e-14); - expect(e.point.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.882352941176471, 0.886274509803922, 0.890196078431373, 0.87843137254902), 1e-14); - expect(e = dataSource.entities.getById('sampled70')).toBeDefined(); - expect(e.point.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.898039215686275, 0.901960784313726, 0.905882352941176, 0.894117647058824), 1e-14); - expect(e.point.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.913725490196078, 0.917647058823529, 0.92156862745098, 0.909803921568627), 1e-14); - expect(e = dataSource.entities.getById('sampled71')).toBeDefined(); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.929411764705882, 0.933333333333333, 0.937254901960784, 0.925490196078431), 1e-14); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.945098039215686, 0.949019607843137, 0.952941176470588, 0.941176470588235), 1e-14); - expect(e = dataSource.entities.getById('sampled72')).toBeDefined(); - expect(e.polygon.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(317, 318)); - expect(e.polygon.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(319, 320)); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(230, 231, 232, 229)); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(234, 235, 236, 233)); - expect(e = dataSource.entities.getById('sampled73')).toBeDefined(); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(238, 239, 240, 237)); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(242, 243, 244, 241)); - expect(e.polygon.material.cellAlpha.getValue(documentStartDate)).toEqual(353.0); - expect(e.polygon.material.cellAlpha.getValue(documentStopDate)).toEqual(354.0); - expect(e.polygon.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(321, 322)); - expect(e.polygon.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(323, 324)); - expect(e.polygon.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(325, 326)); - expect(e.polygon.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(327, 328)); - expect(e.polygon.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(329, 330)); - expect(e.polygon.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(331, 332)); - expect(e = dataSource.entities.getById('sampled74')).toBeDefined(); - expect(e.polygon.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(246, 247, 248, 245)); - expect(e.polygon.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(250, 251, 252, 249)); - expect(e.polygon.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(254, 0, 1, 253)); - expect(e.polygon.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(3, 4, 5, 2)); - expect(e.polygon.material.offset.getValue(documentStartDate)).toEqual(355.0); - expect(e.polygon.material.offset.getValue(documentStopDate)).toEqual(356.0); - expect(e.polygon.material.repeat.getValue(documentStartDate)).toEqual(357.0); - expect(e.polygon.material.repeat.getValue(documentStopDate)).toEqual(358.0); - expect(e = dataSource.entities.getById('sampled75')).toBeDefined(); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.96078431372549, 0.964705882352941, 0.968627450980392, 0.956862745098039), 1e-14); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.976470588235294, 0.980392156862745, 0.984313725490196, 0.972549019607843), 1e-14); - expect(e = dataSource.entities.getById('sampled76')).toBeDefined(); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.992156862745098, 0.996078431372549, 0, 0.988235294117647), 1e-14); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.00784313725490196, 0.0117647058823529, 0.0156862745098039, 0.00392156862745098), 1e-14); - expect(e = dataSource.entities.getById('sampled77')).toBeDefined(); - expect(e.polygon.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0235294117647059, 0.0274509803921569, 0.0313725490196078, 0.0196078431372549), 1e-14); - expect(e.polygon.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0392156862745098, 0.0431372549019608, 0.0470588235294118, 0.0352941176470588), 1e-14); - expect(e = dataSource.entities.getById('sampled78')).toBeDefined(); - expect(e.polygon.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0549019607843137, 0.0588235294117647, 0.0627450980392157, 0.0509803921568627), 1e-14); - expect(e.polygon.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0705882352941176, 0.0745098039215686, 0.0784313725490196, 0.0666666666666667), 1e-14); - expect(e = dataSource.entities.getById('sampled79')).toBeDefined(); - expect(e.polygon.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0862745098039216, 0.0901960784313725, 0.0941176470588235, 0.0823529411764706), 1e-14); - expect(e.polygon.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.101960784313725, 0.105882352941176, 0.109803921568627, 0.0980392156862745), 1e-14); - expect(e = dataSource.entities.getById('sampled80')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.117647058823529, 0.12156862745098, 0.125490196078431, 0.113725490196078), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.133333333333333, 0.137254901960784, 0.141176470588235, 0.129411764705882), 1e-14); - expect(e = dataSource.entities.getById('sampled81')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(7, 8, 9, 6)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(11, 12, 13, 10)); - expect(e.polyline.material.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(15, 16, 17, 14)); - expect(e.polyline.material.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(19, 20, 21, 18)); - expect(e.polyline.material.outlineWidth.getValue(documentStartDate)).toEqual(359.0); - expect(e.polyline.material.outlineWidth.getValue(documentStopDate)).toEqual(360.0); - expect(e = dataSource.entities.getById('sampled82')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(23, 24, 25, 22)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(27, 28, 29, 26)); - expect(e = dataSource.entities.getById('sampled83')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(31, 32, 33, 30)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(35, 36, 37, 34)); - expect(e.polyline.material.glowPower.getValue(documentStartDate)).toEqual(361.0); - expect(e.polyline.material.glowPower.getValue(documentStopDate)).toEqual(362.0); - expect(e = dataSource.entities.getById('sampled84')).toBeDefined(); - expect(e.polyline.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(333, 334)); - expect(e.polyline.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(335, 336)); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(39, 40, 41, 38)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(43, 44, 45, 42)); - expect(e = dataSource.entities.getById('sampled85')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(47, 48, 49, 46)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(51, 52, 53, 50)); - expect(e.polyline.material.cellAlpha.getValue(documentStartDate)).toEqual(363.0); - expect(e.polyline.material.cellAlpha.getValue(documentStopDate)).toEqual(364.0); - expect(e.polyline.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(337, 338)); - expect(e.polyline.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(339, 340)); - expect(e.polyline.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(341, 342)); - expect(e.polyline.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(343, 344)); - expect(e.polyline.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(345, 346)); - expect(e.polyline.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(347, 348)); - expect(e = dataSource.entities.getById('sampled86')).toBeDefined(); - expect(e.polyline.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(55, 56, 57, 54)); - expect(e.polyline.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(59, 60, 61, 58)); - expect(e.polyline.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(63, 64, 65, 62)); - expect(e.polyline.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(67, 68, 69, 66)); - expect(e.polyline.material.offset.getValue(documentStartDate)).toEqual(365.0); - expect(e.polyline.material.offset.getValue(documentStopDate)).toEqual(366.0); - expect(e.polyline.material.repeat.getValue(documentStartDate)).toEqual(367.0); - expect(e.polyline.material.repeat.getValue(documentStopDate)).toEqual(368.0); - expect(e = dataSource.entities.getById('sampled87')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.149019607843137, 0.152941176470588, 0.156862745098039, 0.145098039215686), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.164705882352941, 0.168627450980392, 0.172549019607843, 0.16078431372549), 1e-14); - expect(e = dataSource.entities.getById('sampled88')).toBeDefined(); - expect(e.polyline.material.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.180392156862745, 0.184313725490196, 0.188235294117647, 0.176470588235294), 1e-14); - expect(e.polyline.material.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.196078431372549, 0.2, 0.203921568627451, 0.192156862745098), 1e-14); - expect(e = dataSource.entities.getById('sampled89')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.211764705882353, 0.215686274509804, 0.219607843137255, 0.207843137254902), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.227450980392157, 0.231372549019608, 0.235294117647059, 0.223529411764706), 1e-14); - expect(e = dataSource.entities.getById('sampled90')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.243137254901961, 0.247058823529412, 0.250980392156863, 0.23921568627451), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.258823529411765, 0.262745098039216, 0.266666666666667, 0.254901960784314), 1e-14); - expect(e = dataSource.entities.getById('sampled91')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.274509803921569, 0.27843137254902, 0.282352941176471, 0.270588235294118), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.290196078431373, 0.294117647058824, 0.298039215686275, 0.286274509803922), 1e-14); - expect(e = dataSource.entities.getById('sampled92')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.305882352941176, 0.309803921568627, 0.313725490196078, 0.301960784313725), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.32156862745098, 0.325490196078431, 0.329411764705882, 0.317647058823529), 1e-14); - expect(e = dataSource.entities.getById('sampled93')).toBeDefined(); - expect(e.polyline.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.337254901960784, 0.341176470588235, 0.345098039215686, 0.333333333333333), 1e-14); - expect(e.polyline.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.352941176470588, 0.356862745098039, 0.36078431372549, 0.349019607843137), 1e-14); - expect(e = dataSource.entities.getById('sampled94')).toBeDefined(); - expect(e.polyline.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.368627450980392, 0.372549019607843, 0.376470588235294, 0.364705882352941), 1e-14); - expect(e.polyline.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.384313725490196, 0.388235294117647, 0.392156862745098, 0.380392156862745), 1e-14); - expect(e = dataSource.entities.getById('sampled95')).toBeDefined(); - expect(e.rectangle.coordinates.getValue(documentStartDate)).toEqual(Rectangle.fromDegrees(17, 18, 19, 20)); - expect(e.rectangle.coordinates.getValue(documentStopDate)).toEqual(Rectangle.fromDegrees(21, 22, 23, 24)); - expect(e = dataSource.entities.getById('sampled96')).toBeDefined(); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.4, 0.403921568627451, 0.407843137254902, 0.396078431372549), 1e-14); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.415686274509804, 0.419607843137255, 0.423529411764706, 0.411764705882353), 1e-14); - expect(e = dataSource.entities.getById('sampled97')).toBeDefined(); - expect(e.rectangle.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(349, 350)); - expect(e.rectangle.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(351, 352)); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(71, 72, 73, 70)); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(75, 76, 77, 74)); - expect(e = dataSource.entities.getById('sampled98')).toBeDefined(); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(79, 80, 81, 78)); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(83, 84, 85, 82)); - expect(e.rectangle.material.cellAlpha.getValue(documentStartDate)).toEqual(369.0); - expect(e.rectangle.material.cellAlpha.getValue(documentStopDate)).toEqual(370.0); - expect(e.rectangle.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(353, 354)); - expect(e.rectangle.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(355, 356)); - expect(e.rectangle.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(357, 358)); - expect(e.rectangle.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(359, 360)); - expect(e.rectangle.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(361, 362)); - expect(e.rectangle.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(363, 364)); - expect(e = dataSource.entities.getById('sampled99')).toBeDefined(); - expect(e.rectangle.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(87, 88, 89, 86)); - expect(e.rectangle.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(91, 92, 93, 90)); - expect(e.rectangle.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(95, 96, 97, 94)); - expect(e.rectangle.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(99, 100, 101, 98)); - expect(e.rectangle.material.offset.getValue(documentStartDate)).toEqual(371.0); - expect(e.rectangle.material.offset.getValue(documentStopDate)).toEqual(372.0); - expect(e.rectangle.material.repeat.getValue(documentStartDate)).toEqual(373.0); - expect(e.rectangle.material.repeat.getValue(documentStopDate)).toEqual(374.0); - expect(e = dataSource.entities.getById('sampled100')).toBeDefined(); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.431372549019608, 0.435294117647059, 0.43921568627451, 0.427450980392157), 1e-14); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.447058823529412, 0.450980392156863, 0.454901960784314, 0.443137254901961), 1e-14); - expect(e = dataSource.entities.getById('sampled101')).toBeDefined(); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.462745098039216, 0.466666666666667, 0.470588235294118, 0.458823529411765), 1e-14); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.47843137254902, 0.482352941176471, 0.486274509803922, 0.474509803921569), 1e-14); - expect(e = dataSource.entities.getById('sampled102')).toBeDefined(); - expect(e.rectangle.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.494117647058824, 0.498039215686275, 0.501960784313725, 0.490196078431373), 1e-14); - expect(e.rectangle.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.509803921568627, 0.513725490196078, 0.517647058823529, 0.505882352941176), 1e-14); - expect(e = dataSource.entities.getById('sampled103')).toBeDefined(); - expect(e.rectangle.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.525490196078431, 0.529411764705882, 0.533333333333333, 0.52156862745098), 1e-14); - expect(e.rectangle.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.541176470588235, 0.545098039215686, 0.549019607843137, 0.537254901960784), 1e-14); - expect(e = dataSource.entities.getById('sampled104')).toBeDefined(); - expect(e.rectangle.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.556862745098039, 0.56078431372549, 0.564705882352941, 0.552941176470588), 1e-14); - expect(e.rectangle.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.572549019607843, 0.576470588235294, 0.580392156862745, 0.568627450980392), 1e-14); - expect(e = dataSource.entities.getById('sampled105')).toBeDefined(); - expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.588235294117647, 0.592156862745098, 0.596078431372549, 0.584313725490196), 1e-14); - expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.603921568627451, 0.607843137254902, 0.611764705882353, 0.6), 1e-14); - expect(e = dataSource.entities.getById('sampled106')).toBeDefined(); - expect(e.wall.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(365, 366)); - expect(e.wall.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(367, 368)); - expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(103, 104, 105, 102)); - expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(107, 108, 109, 106)); - expect(e = dataSource.entities.getById('sampled107')).toBeDefined(); - expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(111, 112, 113, 110)); - expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(115, 116, 117, 114)); - expect(e.wall.material.cellAlpha.getValue(documentStartDate)).toEqual(375.0); - expect(e.wall.material.cellAlpha.getValue(documentStopDate)).toEqual(376.0); - expect(e.wall.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(369, 370)); - expect(e.wall.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(371, 372)); - expect(e.wall.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(373, 374)); - expect(e.wall.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(375, 376)); - expect(e.wall.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(377, 378)); - expect(e.wall.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(379, 380)); - expect(e = dataSource.entities.getById('sampled108')).toBeDefined(); - expect(e.wall.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(119, 120, 121, 118)); - expect(e.wall.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(123, 124, 125, 122)); - expect(e.wall.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(127, 128, 129, 126)); - expect(e.wall.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(131, 132, 133, 130)); - expect(e.wall.material.offset.getValue(documentStartDate)).toEqual(377.0); - expect(e.wall.material.offset.getValue(documentStopDate)).toEqual(378.0); - expect(e.wall.material.repeat.getValue(documentStartDate)).toEqual(379.0); - expect(e.wall.material.repeat.getValue(documentStopDate)).toEqual(380.0); - expect(e = dataSource.entities.getById('sampled109')).toBeDefined(); - expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.619607843137255, 0.623529411764706, 0.627450980392157, 0.615686274509804), 1e-14); - expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.635294117647059, 0.63921568627451, 0.643137254901961, 0.631372549019608), 1e-14); - expect(e = dataSource.entities.getById('sampled110')).toBeDefined(); - expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.650980392156863, 0.654901960784314, 0.658823529411765, 0.647058823529412), 1e-14); - expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.666666666666667, 0.670588235294118, 0.674509803921569, 0.662745098039216), 1e-14); - expect(e = dataSource.entities.getById('sampled111')).toBeDefined(); - expect(e.wall.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.682352941176471, 0.686274509803922, 0.690196078431373, 0.67843137254902), 1e-14); - expect(e.wall.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.698039215686274, 0.701960784313725, 0.705882352941177, 0.694117647058824), 1e-14); - expect(e = dataSource.entities.getById('sampled112')).toBeDefined(); - expect(e.wall.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.713725490196078, 0.717647058823529, 0.72156862745098, 0.709803921568627), 1e-14); - expect(e.wall.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.729411764705882, 0.733333333333333, 0.737254901960784, 0.725490196078431), 1e-14); - expect(e = dataSource.entities.getById('sampled113')).toBeDefined(); - expect(e.wall.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.745098039215686, 0.749019607843137, 0.752941176470588, 0.741176470588235), 1e-14); - expect(e.wall.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.76078431372549, 0.764705882352941, 0.768627450980392, 0.756862745098039), 1e-14); - expect(e = dataSource.entities.getById('sampled114')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled115')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled116')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled117')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled118')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled119')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled120')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled121')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled122')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled123')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled124')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled125')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled126')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled127')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled128')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled129')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled130')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled131')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled132')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled133')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled134')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled135')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled136')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled137')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled138')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled139')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled140')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled141')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled142')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled143')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled144')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled145')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled146')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled147')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled148')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled149')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled150')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled151')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled152')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled153')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled154')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled155')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled156')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled157')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled158')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled159')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled160')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled161')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled162')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled163')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled164')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled165')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled166')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled167')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled168')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled169')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled170')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled171')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled172')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled173')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled174')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled175')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled176')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled177')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled178')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled179')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled180')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled181')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled182')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled183')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled184')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled185')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled186')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled187')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled188')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled189')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled190')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled191')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled192')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled193')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled194')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled195')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled196')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled197')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled198')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled199')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled200')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled201')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled202')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled203')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled204')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled205')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled206')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled207')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled208')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled209')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled210')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled211')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled212')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled213')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled214')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled215')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled216')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled217')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled218')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled219')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled220')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled221')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled222')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled223')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled224')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled225')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled226')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled227')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled228')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled229')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled230')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled231')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled232')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled233')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled234')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled235')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled236')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled237')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled238')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled239')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled240')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled241')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled242')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled243')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled244')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled245')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled246')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled247')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled248')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled249')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled250')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled251')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled252')).toBeDefined(); + expect(e.position.getValue(documentStartDate)).toEqual(new Cartesian3(14893, 22330, 50775)); + expect(e.position.getValue(documentStopDate)).toEqual(new Cartesian3(44952, 52911, 45006)); + expect(e.orientation.getValue(documentStartDate)).toEqualEpsilon(new Quaternion(0.63382030572505, 0.114406464045845, 0.748788933003267, 0.156518736408648), 1e-14); + expect(e.orientation.getValue(documentStopDate)).toEqualEpsilon(new Quaternion(0.670778929875422, 0.608790403475694, 0.320013828781515, 0.277526613606122), 1e-14); + expect(e.viewFrom.getValue(documentStartDate)).toEqual(new Cartesian3(36965, 47504, 12985)); + expect(e.viewFrom.getValue(documentStopDate)).toEqual(new Cartesian3(16155, 2367, 57353)); + expect(e.billboard.scale.getValue(documentStartDate)).toEqual(5763.0); + expect(e.billboard.scale.getValue(documentStopDate)).toEqual(31607.0); + expect(e.billboard.pixelOffset.getValue(documentStartDate)).toEqual(new Cartesian2(2029, 62215)); + expect(e.billboard.pixelOffset.getValue(documentStopDate)).toEqual(new Cartesian2(30658, 12919)); + expect(e.billboard.eyeOffset.getValue(documentStartDate)).toEqual(new Cartesian3(3553, 23821, 42589)); + expect(e.billboard.eyeOffset.getValue(documentStopDate)).toEqual(new Cartesian3(3059, 48139, 28860)); + expect(e.billboard.color.getValue(documentStartDate)).toEqual(Color.fromBytes(85, 19, 239, 63)); + expect(e.billboard.color.getValue(documentStopDate)).toEqual(Color.fromBytes(160, 189, 87, 99)); + expect(e.billboard.rotation.getValue(documentStartDate)).toEqual(4554.0); + expect(e.billboard.rotation.getValue(documentStopDate)).toEqual(21210.0); + expect(e.billboard.alignedAxis.getValue(documentStartDate)).toEqualEpsilon(new Cartesian3(0.971559394453729, 0.230094854374832, 0.0559347927405484), 1e-14); + expect(e.billboard.alignedAxis.getValue(documentStopDate)).toEqualEpsilon(new Cartesian3(0.384810775516236, 0.82287332508932, 0.418091088045462), 1e-14); + expect(e.billboard.width.getValue(documentStartDate)).toEqual(21333.0); + expect(e.billboard.width.getValue(documentStopDate)).toEqual(51893.0); + expect(e.billboard.height.getValue(documentStartDate)).toEqual(48314.0); + expect(e.billboard.height.getValue(documentStopDate)).toEqual(61118.0); + expect(e.billboard.scaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(46842, 10678, 46377, 15029)); + expect(e.billboard.scaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(20642, 43600, 7082, 11291)); + expect(e.billboard.translucencyByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(64366, 52219, 8139, 10015)); + expect(e.billboard.translucencyByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(10918, 18986, 49738, 60610)); + expect(e.billboard.pixelOffsetScaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(54503, 26068, 41061, 59552)); + expect(e.billboard.pixelOffsetScaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(37417, 4754, 19986, 15182)); + expect(e.billboard.imageSubRegion.getValue(documentStartDate)).toEqual(new BoundingRectangle(26590, 12135, 16431, 56640)); + expect(e.billboard.imageSubRegion.getValue(documentStopDate)).toEqual(new BoundingRectangle(43063, 42664, 60326, 52715)); + expect(e.box.dimensions.getValue(documentStartDate)).toEqual(new Cartesian3(37525, 42898, 18087)); + expect(e.box.dimensions.getValue(documentStopDate)).toEqual(new Cartesian3(49399, 59584, 63976)); + expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(172, 28, 222, 165)); + expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(16, 192, 121, 150)); + expect(e.box.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(53, 66, 217, 237)); + expect(e.box.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(163, 75, 228, 48)); + expect(e.box.outlineWidth.getValue(documentStartDate)).toEqual(45211.0); + expect(e.box.outlineWidth.getValue(documentStopDate)).toEqual(20490.0); + expect(e.corridor.width.getValue(documentStartDate)).toEqual(62443.0); + expect(e.corridor.width.getValue(documentStopDate)).toEqual(13988.0); + expect(e.corridor.height.getValue(documentStartDate)).toEqual(20585.0); + expect(e.corridor.height.getValue(documentStopDate)).toEqual(63872.0); + expect(e.corridor.extrudedHeight.getValue(documentStartDate)).toEqual(63407.0); + expect(e.corridor.extrudedHeight.getValue(documentStopDate)).toEqual(42397.0); + expect(e.corridor.granularity.getValue(documentStartDate)).toEqual(43027.0); + expect(e.corridor.granularity.getValue(documentStopDate)).toEqual(55912.0); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(35, 213, 31, 79)); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(87, 126, 23, 40)); + expect(e.corridor.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(137, 114, 57, 34)); + expect(e.corridor.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(93, 178, 74, 64)); + expect(e.corridor.outlineWidth.getValue(documentStartDate)).toEqual(14678.0); + expect(e.corridor.outlineWidth.getValue(documentStopDate)).toEqual(57820.0); + expect(e.cylinder.length.getValue(documentStartDate)).toEqual(30241.0); + expect(e.cylinder.length.getValue(documentStopDate)).toEqual(48364.0); + expect(e.cylinder.topRadius.getValue(documentStartDate)).toEqual(62881.0); + expect(e.cylinder.topRadius.getValue(documentStopDate)).toEqual(16270.0); + expect(e.cylinder.bottomRadius.getValue(documentStartDate)).toEqual(61925.0); + expect(e.cylinder.bottomRadius.getValue(documentStopDate)).toEqual(21514.0); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(133, 36, 52, 121)); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(7, 13, 34, 201)); + expect(e.cylinder.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(112, 241, 40, 103)); + expect(e.cylinder.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(237, 75, 59, 51)); + expect(e.cylinder.outlineWidth.getValue(documentStartDate)).toEqual(36483.0); + expect(e.cylinder.outlineWidth.getValue(documentStopDate)).toEqual(32586.0); + expect(e.cylinder.numberOfVerticalLines.getValue(documentStartDate)).toEqual(45816.0); + expect(e.cylinder.numberOfVerticalLines.getValue(documentStopDate)).toEqual(42247.0); + expect(e.cylinder.slices.getValue(documentStartDate)).toEqual(46140.0); + expect(e.cylinder.slices.getValue(documentStopDate)).toEqual(53530.0); + expect(e.ellipse.semiMajorAxis.getValue(documentStartDate)).toEqual(13136.0); + expect(e.ellipse.semiMajorAxis.getValue(documentStopDate)).toEqual(55507.0); + expect(e.ellipse.semiMinorAxis.getValue(documentStartDate)).toEqual(41580.0); + expect(e.ellipse.semiMinorAxis.getValue(documentStopDate)).toEqual(60905.0); + expect(e.ellipse.height.getValue(documentStartDate)).toEqual(5567.0); + expect(e.ellipse.height.getValue(documentStopDate)).toEqual(45588.0); + expect(e.ellipse.extrudedHeight.getValue(documentStartDate)).toEqual(16542.0); + expect(e.ellipse.extrudedHeight.getValue(documentStopDate)).toEqual(13545.0); + expect(e.ellipse.rotation.getValue(documentStartDate)).toEqual(5797.0); + expect(e.ellipse.rotation.getValue(documentStopDate)).toEqual(24542.0); + expect(e.ellipse.stRotation.getValue(documentStartDate)).toEqual(20596.0); + expect(e.ellipse.stRotation.getValue(documentStopDate)).toEqual(58204.0); + expect(e.ellipse.granularity.getValue(documentStartDate)).toEqual(2228.0); + expect(e.ellipse.granularity.getValue(documentStopDate)).toEqual(43731.0); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(174, 250, 78, 96)); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(63, 102, 221, 174)); + expect(e.ellipse.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(243, 123, 194, 31)); + expect(e.ellipse.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(236, 100, 22, 203)); + expect(e.ellipse.outlineWidth.getValue(documentStartDate)).toEqual(60636.0); + expect(e.ellipse.outlineWidth.getValue(documentStopDate)).toEqual(24194.0); + expect(e.ellipse.numberOfVerticalLines.getValue(documentStartDate)).toEqual(52822.0); + expect(e.ellipse.numberOfVerticalLines.getValue(documentStopDate)).toEqual(45768.0); + expect(e.ellipsoid.radii.getValue(documentStartDate)).toEqual(new Cartesian3(5183, 10004, 13863)); + expect(e.ellipsoid.radii.getValue(documentStopDate)).toEqual(new Cartesian3(39497, 12186, 45103)); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(137, 128, 194, 84)); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(50, 122, 190, 247)); + expect(e.ellipsoid.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(247, 210, 180, 171)); + expect(e.ellipsoid.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(239, 35, 237, 247)); + expect(e.ellipsoid.outlineWidth.getValue(documentStartDate)).toEqual(10713.0); + expect(e.ellipsoid.outlineWidth.getValue(documentStopDate)).toEqual(10444.0); + expect(e.ellipsoid.stackPartitions.getValue(documentStartDate)).toEqual(5841.0); + expect(e.ellipsoid.stackPartitions.getValue(documentStopDate)).toEqual(39170.0); + expect(e.ellipsoid.slicePartitions.getValue(documentStartDate)).toEqual(50327.0); + expect(e.ellipsoid.slicePartitions.getValue(documentStopDate)).toEqual(4672.0); + expect(e.ellipsoid.subdivisions.getValue(documentStartDate)).toEqual(10225.0); + expect(e.ellipsoid.subdivisions.getValue(documentStopDate)).toEqual(53957.0); + expect(e.label.scale.getValue(documentStartDate)).toEqual(40153.0); + expect(e.label.scale.getValue(documentStopDate)).toEqual(42123.0); + expect(e.label.pixelOffset.getValue(documentStartDate)).toEqual(new Cartesian2(8539, 9761)); + expect(e.label.pixelOffset.getValue(documentStopDate)).toEqual(new Cartesian2(10537, 54569)); + expect(e.label.eyeOffset.getValue(documentStartDate)).toEqual(new Cartesian3(5984, 34327, 59014)); + expect(e.label.eyeOffset.getValue(documentStopDate)).toEqual(new Cartesian3(1931, 5127, 18964)); + expect(e.label.fillColor.getValue(documentStartDate)).toEqual(Color.fromBytes(17, 212, 62, 58)); + expect(e.label.fillColor.getValue(documentStopDate)).toEqual(Color.fromBytes(214, 69, 90, 116)); + expect(e.label.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(205, 14, 169, 70)); + expect(e.label.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(143, 73, 168, 17)); + expect(e.label.outlineWidth.getValue(documentStartDate)).toEqual(53305.0); + expect(e.label.outlineWidth.getValue(documentStopDate)).toEqual(43838.0); + expect(e.label.translucencyByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(25055, 32865, 32128, 29309)); + expect(e.label.translucencyByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(58875, 9189, 20515, 15696)); + expect(e.label.pixelOffsetScaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(45296, 62896, 38133, 40084)); + expect(e.label.pixelOffsetScaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(28657, 25711, 9316, 62756)); + expect(e.model.scale.getValue(documentStartDate)).toEqual(63647.0); + expect(e.model.scale.getValue(documentStopDate)).toEqual(53878.0); + expect(e.model.minimumPixelSize.getValue(documentStartDate)).toEqual(16357.0); + expect(e.model.minimumPixelSize.getValue(documentStopDate)).toEqual(40522.0); + expect(e.model.maximumScale.getValue(documentStartDate)).toEqual(8290.0); + expect(e.model.maximumScale.getValue(documentStopDate)).toEqual(25558.0); + expect(e.model.color.getValue(documentStartDate)).toEqual(Color.fromBytes(74, 69, 164, 116)); + expect(e.model.color.getValue(documentStopDate)).toEqual(Color.fromBytes(127, 30, 46, 170)); + expect(e.model.colorBlendAmount.getValue(documentStartDate)).toEqual(64130.0); + expect(e.model.colorBlendAmount.getValue(documentStopDate)).toEqual(21967.0); + expect(e.path.width.getValue(documentStartDate)).toEqual(32449.0); + expect(e.path.width.getValue(documentStopDate)).toEqual(33819.0); + expect(e.path.resolution.getValue(documentStartDate)).toEqual(8399.0); + expect(e.path.resolution.getValue(documentStopDate)).toEqual(19400.0); + expect(e.path.leadTime.getValue(documentStartDate)).toEqual(40222.0); + expect(e.path.leadTime.getValue(documentStopDate)).toEqual(33294.0); + expect(e.path.trailTime.getValue(documentStartDate)).toEqual(34052.0); + expect(e.path.trailTime.getValue(documentStopDate)).toEqual(57713.0); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(97, 239, 22, 105)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(242, 157, 215, 125)); + expect(e.point.pixelSize.getValue(documentStartDate)).toEqual(39714.0); + expect(e.point.pixelSize.getValue(documentStopDate)).toEqual(3313.0); + expect(e.point.color.getValue(documentStartDate)).toEqual(Color.fromBytes(137, 151, 128, 95)); + expect(e.point.color.getValue(documentStopDate)).toEqual(Color.fromBytes(99, 157, 124, 108)); + expect(e.point.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(225, 246, 102, 195)); + expect(e.point.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(248, 38, 75, 222)); + expect(e.point.outlineWidth.getValue(documentStartDate)).toEqual(48323.0); + expect(e.point.outlineWidth.getValue(documentStopDate)).toEqual(50914.0); + expect(e.point.scaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(39727, 50843, 56262, 15579)); + expect(e.point.scaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(60522, 63980, 30201, 25205)); + expect(e.point.translucencyByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(61190, 16879, 16449, 10048)); + expect(e.point.translucencyByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(46491, 47541, 35769, 13707)); + expect(e.polygon.height.getValue(documentStartDate)).toEqual(64265.0); + expect(e.polygon.height.getValue(documentStopDate)).toEqual(19257.0); + expect(e.polygon.extrudedHeight.getValue(documentStartDate)).toEqual(12315.0); + expect(e.polygon.extrudedHeight.getValue(documentStopDate)).toEqual(4797.0); + expect(e.polygon.stRotation.getValue(documentStartDate)).toEqual(24959.0); + expect(e.polygon.stRotation.getValue(documentStopDate)).toEqual(32341.0); + expect(e.polygon.granularity.getValue(documentStartDate)).toEqual(51922.0); + expect(e.polygon.granularity.getValue(documentStopDate)).toEqual(9185.0); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(19, 40, 12, 31)); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(179, 204, 8, 194)); + expect(e.polygon.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(187, 223, 120, 26)); + expect(e.polygon.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(20, 135, 105, 81)); + expect(e.polygon.outlineWidth.getValue(documentStartDate)).toEqual(48428.0); + expect(e.polygon.outlineWidth.getValue(documentStopDate)).toEqual(41508.0); + expect(e.polyline.width.getValue(documentStartDate)).toEqual(60367.0); + expect(e.polyline.width.getValue(documentStopDate)).toEqual(31077.0); + expect(e.polyline.granularity.getValue(documentStartDate)).toEqual(62537.0); + expect(e.polyline.granularity.getValue(documentStopDate)).toEqual(14676.0); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(90, 30, 195, 220)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(39, 17, 221, 74)); + expect(e.rectangle.coordinates.getValue(documentStartDate)).toEqual(new Rectangle(0.392205830501108, 1.04907471338688, 0.00211010473645246, 0.064281089310235)); + expect(e.rectangle.coordinates.getValue(documentStopDate)).toEqual(new Rectangle(0.523469985903937, 0.229690388867811, 0.399550037703662, 0.48478405941078)); + expect(e.rectangle.height.getValue(documentStartDate)).toEqual(56388.0); + expect(e.rectangle.height.getValue(documentStopDate)).toEqual(59991.0); + expect(e.rectangle.extrudedHeight.getValue(documentStartDate)).toEqual(39796.0); + expect(e.rectangle.extrudedHeight.getValue(documentStopDate)).toEqual(33335.0); + expect(e.rectangle.rotation.getValue(documentStartDate)).toEqual(26921.0); + expect(e.rectangle.rotation.getValue(documentStopDate)).toEqual(46937.0); + expect(e.rectangle.stRotation.getValue(documentStartDate)).toEqual(65255.0); + expect(e.rectangle.stRotation.getValue(documentStopDate)).toEqual(12220.0); + expect(e.rectangle.granularity.getValue(documentStartDate)).toEqual(6948.0); + expect(e.rectangle.granularity.getValue(documentStopDate)).toEqual(2204.0); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(106, 81, 64, 152)); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(94, 108, 96, 154)); + expect(e.rectangle.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(6, 244, 49, 131)); + expect(e.rectangle.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(87, 190, 148, 55)); + expect(e.rectangle.outlineWidth.getValue(documentStartDate)).toEqual(41576.0); + expect(e.rectangle.outlineWidth.getValue(documentStopDate)).toEqual(33933.0); + expect(e.wall.granularity.getValue(documentStartDate)).toEqual(64428.0); + expect(e.wall.granularity.getValue(documentStopDate)).toEqual(25333.0); + expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(31, 188, 250, 46)); + expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(78, 91, 199, 227)); + expect(e.wall.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(241, 39, 105, 205)); + expect(e.wall.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(184, 17, 208, 44)); + expect(e.wall.outlineWidth.getValue(documentStartDate)).toEqual(62000.0); + expect(e.wall.outlineWidth.getValue(documentStopDate)).toEqual(40549.0); + expect(e = dataSource.entities.getById('sampled_position_cartographicRadians')).toBeDefined(); + expect(e.position.getValue(documentStartDate)).toEqual(Cartesian3.fromRadians(1.00319530145806, 0.889718921347432, 16911)); + expect(e.position.getValue(documentStopDate)).toEqual(Cartesian3.fromRadians(0.828301545608097, 0.517994728610812, 62937)); + expect(e = dataSource.entities.getById('sampled_position_cartographicDegrees')).toBeDefined(); + expect(e.position.getValue(documentStartDate)).toEqual(Cartesian3.fromDegrees(43, 23, 63733)); + expect(e.position.getValue(documentStopDate)).toEqual(Cartesian3.fromDegrees(28, 12, 9806)); + expect(e = dataSource.entities.getById('sampled_position_cartesianVelocity')).toBeDefined(); + expect(e.position.getValue(documentStartDate)).toEqual(new Cartesian3(40342, 23709, 14940)); + expect(e.position.getValue(documentStopDate)).toEqual(new Cartesian3(25648, 55396, 53208)); + expect(e = dataSource.entities.getById('sampled_billboard_color_rgbaf')).toBeDefined(); + expect(e.billboard.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0235294117647059, 0.427450980392157, 0.658823529411765, 0.0980392156862745), 1e-14); + expect(e.billboard.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.968627450980392, 0.752941176470588, 0.843137254901961, 0.164705882352941), 1e-14); + expect(e = dataSource.entities.getById('sampled_billboard_alignedAxis_unitSpherical')).toBeDefined(); + expect(e.billboard.alignedAxis.getValue(documentStartDate)).toEqual(Cartesian3.fromSpherical(new Spherical(57328, 53471))); + expect(e.billboard.alignedAxis.getValue(documentStopDate)).toEqual(Cartesian3.fromSpherical(new Spherical(51360, 27848))); + expect(e = dataSource.entities.getById('sampled_box_material_solidColor_color')).toBeDefined(); + expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.556862745098039, 0.541176470588235, 0.956862745098039, 0.317647058823529), 1e-14); + expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.792156862745098, 0.92156862745098, 0.125490196078431, 0.784313725490196), 1e-14); + expect(e = dataSource.entities.getById('sampled_box_material_image')).toBeDefined(); + expect(e.box.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(21562, 11604)); + expect(e.box.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(56719, 11741)); + expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(146, 124, 215, 53)); + expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(229, 219, 61, 100)); + expect(e = dataSource.entities.getById('sampled_box_material_grid')).toBeDefined(); + expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(111, 151, 56, 118)); + expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(178, 77, 41, 86)); + expect(e.box.material.cellAlpha.getValue(documentStartDate)).toEqual(10400.0); + expect(e.box.material.cellAlpha.getValue(documentStopDate)).toEqual(10941.0); + expect(e.box.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(3433, 28173)); + expect(e.box.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(53350, 6864)); + expect(e.box.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(36990, 37264)); + expect(e.box.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(38412, 45974)); + expect(e.box.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(38761, 46487)); + expect(e.box.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(62553, 37876)); + expect(e = dataSource.entities.getById('sampled_box_material_stripe')).toBeDefined(); + expect(e.box.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(251, 59, 84, 41)); + expect(e.box.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(20, 214, 81, 152)); + expect(e.box.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(233, 71, 17, 115)); + expect(e.box.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(20, 178, 40, 30)); + expect(e.box.material.offset.getValue(documentStartDate)).toEqual(46979.0); + expect(e.box.material.offset.getValue(documentStopDate)).toEqual(1457.0); + expect(e.box.material.repeat.getValue(documentStartDate)).toEqual(10283.0); + expect(e.box.material.repeat.getValue(documentStopDate)).toEqual(63419.0); + expect(e = dataSource.entities.getById('sampled_box_material_image_color')).toBeDefined(); + expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.149019607843137, 0.929411764705882, 0.462745098039216, 0.764705882352941), 1e-14); + expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.890196078431373, 0.262745098039216, 0.866666666666667, 0.792156862745098), 1e-14); + expect(e = dataSource.entities.getById('sampled_box_material_grid_color')).toBeDefined(); + expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.501960784313725, 0.447058823529412, 0.72156862745098, 0.392156862745098), 1e-14); + expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.890196078431373, 0.505882352941176, 0.56078431372549, 0.674509803921569), 1e-14); + expect(e = dataSource.entities.getById('sampled_box_material_stripe_evenColor')).toBeDefined(); + expect(e.box.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.980392156862745, 0.345098039215686, 0.929411764705882, 0.533333333333333), 1e-14); + expect(e.box.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.988235294117647, 0.372549019607843, 0.713725490196078, 0.466666666666667), 1e-14); + expect(e = dataSource.entities.getById('sampled_box_material_stripe_oddColor')).toBeDefined(); + expect(e.box.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.545098039215686, 0.168627450980392, 0.654901960784314, 0.196078431372549), 1e-14); + expect(e.box.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.407843137254902, 0.450980392156863, 0.874509803921569, 0.603921568627451), 1e-14); + expect(e = dataSource.entities.getById('sampled_box_outlineColor_rgbaf')).toBeDefined(); + expect(e.box.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.215686274509804, 0.498039215686275, 0.274509803921569, 0.129411764705882), 1e-14); + expect(e.box.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.854901960784314, 0.729411764705882, 0.172549019607843, 0.956862745098039), 1e-14); + expect(e = dataSource.entities.getById('sampled_corridor_material_solidColor_color')).toBeDefined(); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.858823529411765, 0.988235294117647, 0.733333333333333, 0.690196078431373), 1e-14); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.549019607843137, 0.368627450980392, 0.964705882352941, 0.133333333333333), 1e-14); + expect(e = dataSource.entities.getById('sampled_corridor_material_image')).toBeDefined(); + expect(e.corridor.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(14885, 62522)); + expect(e.corridor.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(45129, 25776)); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(57, 37, 208, 54)); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(24, 80, 140, 151)); + expect(e = dataSource.entities.getById('sampled_corridor_material_grid')).toBeDefined(); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(130, 99, 15, 168)); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(246, 60, 236, 5)); + expect(e.corridor.material.cellAlpha.getValue(documentStartDate)).toEqual(22161.0); + expect(e.corridor.material.cellAlpha.getValue(documentStopDate)).toEqual(55997.0); + expect(e.corridor.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(7285, 25116)); + expect(e.corridor.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(18095, 8262)); + expect(e.corridor.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(31150, 55929)); + expect(e.corridor.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(40043, 22428)); + expect(e.corridor.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(41105, 52128)); + expect(e.corridor.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(2387, 32009)); + expect(e = dataSource.entities.getById('sampled_corridor_material_stripe')).toBeDefined(); + expect(e.corridor.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(8, 64, 254, 66)); + expect(e.corridor.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(47, 28, 112, 168)); + expect(e.corridor.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(17, 233, 150, 181)); + expect(e.corridor.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(171, 148, 181, 68)); + expect(e.corridor.material.offset.getValue(documentStartDate)).toEqual(21351.0); + expect(e.corridor.material.offset.getValue(documentStopDate)).toEqual(20709.0); + expect(e.corridor.material.repeat.getValue(documentStartDate)).toEqual(25188.0); + expect(e.corridor.material.repeat.getValue(documentStopDate)).toEqual(19705.0); + expect(e = dataSource.entities.getById('sampled_corridor_material_image_color')).toBeDefined(); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.949019607843137, 0.666666666666667, 0.0588235294117647, 0.784313725490196), 1e-14); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.388235294117647, 0.262745098039216, 0.764705882352941, 0.882352941176471), 1e-14); + expect(e = dataSource.entities.getById('sampled_corridor_material_grid_color')).toBeDefined(); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.290196078431373, 0.83921568627451, 0.588235294117647, 0.525490196078431), 1e-14); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.266666666666667, 0.00392156862745098, 0.180392156862745, 0.701960784313725), 1e-14); + expect(e = dataSource.entities.getById('sampled_corridor_material_stripe_evenColor')).toBeDefined(); + expect(e.corridor.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.517647058823529, 0.282352941176471, 0.709803921568627, 0.737254901960784), 1e-14); + expect(e.corridor.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.564705882352941, 0.407843137254902, 0.945098039215686, 0.666666666666667), 1e-14); + expect(e = dataSource.entities.getById('sampled_corridor_material_stripe_oddColor')).toBeDefined(); + expect(e.corridor.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.137254901960784, 0.4, 0.356862745098039, 0.501960784313725), 1e-14); + expect(e.corridor.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.992156862745098, 0.431372549019608, 0.301960784313725, 0.254901960784314), 1e-14); + expect(e = dataSource.entities.getById('sampled_corridor_outlineColor_rgbaf')).toBeDefined(); + expect(e.corridor.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.882352941176471, 0.262745098039216, 0.247058823529412, 0.937254901960784), 1e-14); + expect(e.corridor.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.701960784313725, 0.262745098039216, 0.0627450980392157, 0.627450980392157), 1e-14); + expect(e = dataSource.entities.getById('sampled_cylinder_material_solidColor_color')).toBeDefined(); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.117647058823529, 0.349019607843137, 0.411764705882353, 0.105882352941176), 1e-14); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.513725490196078, 0.513725490196078, 0.666666666666667, 0.596078431372549), 1e-14); + expect(e = dataSource.entities.getById('sampled_cylinder_material_image')).toBeDefined(); + expect(e.cylinder.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(42846, 26023)); + expect(e.cylinder.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(19184, 35658)); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(59, 239, 245, 44)); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(77, 93, 176, 39)); + expect(e = dataSource.entities.getById('sampled_cylinder_material_grid')).toBeDefined(); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(211, 199, 71, 148)); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(142, 126, 167, 247)); + expect(e.cylinder.material.cellAlpha.getValue(documentStartDate)).toEqual(12751.0); + expect(e.cylinder.material.cellAlpha.getValue(documentStopDate)).toEqual(16373.0); + expect(e.cylinder.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(11469, 5164)); + expect(e.cylinder.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(8167, 36383)); + expect(e.cylinder.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(22021, 38742)); + expect(e.cylinder.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(45350, 43441)); + expect(e.cylinder.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(23237, 58970)); + expect(e.cylinder.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(62223, 62963)); + expect(e = dataSource.entities.getById('sampled_cylinder_material_stripe')).toBeDefined(); + expect(e.cylinder.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(131, 133, 216, 18)); + expect(e.cylinder.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(78, 238, 32, 231)); + expect(e.cylinder.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(209, 149, 133, 207)); + expect(e.cylinder.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(53, 207, 16, 210)); + expect(e.cylinder.material.offset.getValue(documentStartDate)).toEqual(49593.0); + expect(e.cylinder.material.offset.getValue(documentStopDate)).toEqual(25216.0); + expect(e.cylinder.material.repeat.getValue(documentStartDate)).toEqual(16819.0); + expect(e.cylinder.material.repeat.getValue(documentStopDate)).toEqual(12539.0); + expect(e = dataSource.entities.getById('sampled_cylinder_material_image_color')).toBeDefined(); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.76078431372549, 0.133333333333333, 0.231372549019608, 0.631372549019608), 1e-14); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.882352941176471, 0.0823529411764706, 0.8, 0.0823529411764706), 1e-14); + expect(e = dataSource.entities.getById('sampled_cylinder_material_grid_color')).toBeDefined(); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.176470588235294, 0.407843137254902, 0.623529411764706, 0.729411764705882), 1e-14); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.43921568627451, 0.0745098039215686, 0.603921568627451, 0.713725490196078), 1e-14); + expect(e = dataSource.entities.getById('sampled_cylinder_material_stripe_evenColor')).toBeDefined(); + expect(e.cylinder.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.380392156862745, 0.149019607843137, 0.8, 0.658823529411765), 1e-14); + expect(e.cylinder.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.462745098039216, 0.172549019607843, 0.325490196078431, 0.854901960784314), 1e-14); + expect(e = dataSource.entities.getById('sampled_cylinder_material_stripe_oddColor')).toBeDefined(); + expect(e.cylinder.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.207843137254902, 0.466666666666667, 0.427450980392157, 0.109803921568627), 1e-14); + expect(e.cylinder.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.313725490196078, 0.498039215686275, 0.2, 0.423529411764706), 1e-14); + expect(e = dataSource.entities.getById('sampled_cylinder_outlineColor_rgbaf')).toBeDefined(); + expect(e.cylinder.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.780392156862745, 0.658823529411765, 0.235294117647059, 0.0705882352941176), 1e-14); + expect(e.cylinder.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.643137254901961, 0.372549019607843, 0.16078431372549, 0.588235294117647), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipse_material_solidColor_color')).toBeDefined(); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.67843137254902, 0.807843137254902, 0.541176470588235, 0.290196078431373), 1e-14); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.749019607843137, 0.258823529411765, 0.733333333333333, 0.247058823529412), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipse_material_image')).toBeDefined(); + expect(e.ellipse.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(41027, 32928)); + expect(e.ellipse.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(30513, 54647)); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(243, 25, 233, 224)); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(230, 62, 9, 20)); + expect(e = dataSource.entities.getById('sampled_ellipse_material_grid')).toBeDefined(); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(103, 140, 88, 233)); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(224, 133, 210, 4)); + expect(e.ellipse.material.cellAlpha.getValue(documentStartDate)).toEqual(39159.0); + expect(e.ellipse.material.cellAlpha.getValue(documentStopDate)).toEqual(47494.0); + expect(e.ellipse.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(40987, 3488)); + expect(e.ellipse.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(5066, 58131)); + expect(e.ellipse.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(11466, 25388)); + expect(e.ellipse.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(17761, 21317)); + expect(e.ellipse.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(478, 18945)); + expect(e.ellipse.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(25914, 29541)); + expect(e = dataSource.entities.getById('sampled_ellipse_material_stripe')).toBeDefined(); + expect(e.ellipse.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(218, 225, 186, 34)); + expect(e.ellipse.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(109, 193, 18, 44)); + expect(e.ellipse.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(119, 198, 180, 58)); + expect(e.ellipse.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(79, 137, 65, 31)); + expect(e.ellipse.material.offset.getValue(documentStartDate)).toEqual(16964.0); + expect(e.ellipse.material.offset.getValue(documentStopDate)).toEqual(16523.0); + expect(e.ellipse.material.repeat.getValue(documentStartDate)).toEqual(50015.0); + expect(e.ellipse.material.repeat.getValue(documentStopDate)).toEqual(64942.0); + expect(e = dataSource.entities.getById('sampled_ellipse_material_image_color')).toBeDefined(); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.207843137254902, 0.0392156862745098, 0.12156862745098, 0.611764705882353), 1e-14); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.611764705882353, 0.0117647058823529, 0.694117647058824, 0.576470588235294), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipse_material_grid_color')).toBeDefined(); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.580392156862745, 0.0313725490196078, 0.27843137254902, 0.203921568627451), 1e-14); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0509803921568627, 0.870588235294118, 0.117647058823529, 0.588235294117647), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipse_material_stripe_evenColor')).toBeDefined(); + expect(e.ellipse.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0549019607843137, 0.117647058823529, 0.623529411764706, 0.929411764705882), 1e-14); + expect(e.ellipse.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.266666666666667, 0.113725490196078, 0.937254901960784, 0.168627450980392), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipse_material_stripe_oddColor')).toBeDefined(); + expect(e.ellipse.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.262745098039216, 0.172549019607843, 0.282352941176471, 0.129411764705882), 1e-14); + expect(e.ellipse.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.968627450980392, 0.635294117647059, 0.525490196078431, 0.831372549019608), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipse_outlineColor_rgbaf')).toBeDefined(); + expect(e.ellipse.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.76078431372549, 0.36078431372549, 0.223529411764706, 0.611764705882353), 1e-14); + expect(e.ellipse.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.16078431372549, 0.83921568627451, 0.752941176470588, 0.647058823529412), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipsoid_material_solidColor_color')).toBeDefined(); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.592156862745098, 0.976470588235294, 0.207843137254902, 0.501960784313725), 1e-14); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0901960784313725, 0.662745098039216, 0.819607843137255, 0.235294117647059), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipsoid_material_image')).toBeDefined(); + expect(e.ellipsoid.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(63583, 15096)); + expect(e.ellipsoid.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(48977, 60351)); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(49, 50, 177, 104)); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(131, 27, 208, 157)); + expect(e = dataSource.entities.getById('sampled_ellipsoid_material_grid')).toBeDefined(); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(121, 105, 70, 72)); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(204, 122, 157, 57)); + expect(e.ellipsoid.material.cellAlpha.getValue(documentStartDate)).toEqual(39442.0); + expect(e.ellipsoid.material.cellAlpha.getValue(documentStopDate)).toEqual(463.0); + expect(e.ellipsoid.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(33778, 30083)); + expect(e.ellipsoid.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(5202, 18708)); + expect(e.ellipsoid.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(44058, 37804)); + expect(e.ellipsoid.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(34449, 3718)); + expect(e.ellipsoid.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(33149, 21889)); + expect(e.ellipsoid.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(35482, 10122)); + expect(e = dataSource.entities.getById('sampled_ellipsoid_material_stripe')).toBeDefined(); + expect(e.ellipsoid.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(153, 245, 201, 196)); + expect(e.ellipsoid.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(245, 113, 5, 131)); + expect(e.ellipsoid.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(99, 151, 174, 111)); + expect(e.ellipsoid.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(188, 89, 18, 1)); + expect(e.ellipsoid.material.offset.getValue(documentStartDate)).toEqual(44961.0); + expect(e.ellipsoid.material.offset.getValue(documentStopDate)).toEqual(5690.0); + expect(e.ellipsoid.material.repeat.getValue(documentStartDate)).toEqual(3351.0); + expect(e.ellipsoid.material.repeat.getValue(documentStopDate)).toEqual(44332.0); + expect(e = dataSource.entities.getById('sampled_ellipsoid_material_image_color')).toBeDefined(); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.654901960784314, 0.517647058823529, 0.858823529411765, 0.486274509803922), 1e-14); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.862745098039216, 0.713725490196078, 0.564705882352941, 0.0901960784313725), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipsoid_material_grid_color')).toBeDefined(); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.6, 0.427450980392157, 0.203921568627451, 0.223529411764706), 1e-14); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.525490196078431, 0.305882352941176, 0.16078431372549, 0.819607843137255), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipsoid_material_stripe_evenColor')).toBeDefined(); + expect(e.ellipsoid.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.301960784313725, 0.572549019607843, 0.87843137254902, 0.219607843137255), 1e-14); + expect(e.ellipsoid.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.337254901960784, 0.835294117647059, 0.964705882352941, 0.909803921568627), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipsoid_material_stripe_oddColor')).toBeDefined(); + expect(e.ellipsoid.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.647058823529412, 0.635294117647059, 0.258823529411765, 0.250980392156863), 1e-14); + expect(e.ellipsoid.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.917647058823529, 0.262745098039216, 0.666666666666667, 0.980392156862745), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipsoid_outlineColor_rgbaf')).toBeDefined(); + expect(e.ellipsoid.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.552941176470588, 0.549019607843137, 0.431372549019608, 0.568627450980392), 1e-14); + expect(e.ellipsoid.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.435294117647059, 0.698039215686274, 0.396078431372549, 0.772549019607843), 1e-14); + expect(e = dataSource.entities.getById('sampled_label_fillColor_rgbaf')).toBeDefined(); + expect(e.label.fillColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.709803921568627, 0.556862745098039, 0.337254901960784, 0.247058823529412), 1e-14); + expect(e.label.fillColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.43921568627451, 0.694117647058824, 0.901960784313726, 0.0823529411764706), 1e-14); + expect(e = dataSource.entities.getById('sampled_label_outlineColor_rgbaf')).toBeDefined(); + expect(e.label.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.631372549019608, 0.709803921568627, 0.270588235294118, 0.792156862745098), 1e-14); + expect(e.label.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.435294117647059, 0.176470588235294, 0.235294117647059, 0.631372549019608), 1e-14); + expect(e = dataSource.entities.getById('sampled_model_color_rgbaf')).toBeDefined(); + expect(e.model.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0509803921568627, 0.83921568627451, 0.470588235294118, 0.956862745098039), 1e-14); + expect(e.model.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.435294117647059, 0.945098039215686, 0.431372549019608, 0.619607843137255), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_solidColor_color')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.517647058823529, 0.56078431372549, 0.254901960784314, 0.494117647058824), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.905882352941176, 0.152941176470588, 0.854901960784314, 0.890196078431373), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_polylineOutline')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(209, 154, 35, 76)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(186, 25, 242, 140)); + expect(e.path.material.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(218, 241, 216, 157)); + expect(e.path.material.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(70, 200, 183, 199)); + expect(e.path.material.outlineWidth.getValue(documentStartDate)).toEqual(2699.0); + expect(e.path.material.outlineWidth.getValue(documentStopDate)).toEqual(1320.0); + expect(e = dataSource.entities.getById('sampled_path_material_polylineArrow')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(150, 221, 161, 136)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(19, 231, 68, 117)); + expect(e = dataSource.entities.getById('sampled_path_material_polylineGlow')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(197, 117, 196, 254)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(18, 17, 195, 230)); + expect(e.path.material.glowPower.getValue(documentStartDate)).toEqual(5579.0); + expect(e.path.material.glowPower.getValue(documentStopDate)).toEqual(59951.0); + expect(e = dataSource.entities.getById('sampled_path_material_image')).toBeDefined(); + expect(e.path.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(25033, 47457)); + expect(e.path.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(30413, 15734)); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(225, 149, 237, 92)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(234, 146, 229, 9)); + expect(e = dataSource.entities.getById('sampled_path_material_grid')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(99, 177, 19, 203)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(231, 169, 202, 127)); + expect(e.path.material.cellAlpha.getValue(documentStartDate)).toEqual(63572.0); + expect(e.path.material.cellAlpha.getValue(documentStopDate)).toEqual(26232.0); + expect(e.path.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(34101, 5509)); + expect(e.path.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(11991, 23086)); + expect(e.path.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(39225, 58265)); + expect(e.path.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(60443, 36332)); + expect(e.path.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(25536, 59747)); + expect(e.path.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(43164, 57256)); + expect(e = dataSource.entities.getById('sampled_path_material_stripe')).toBeDefined(); + expect(e.path.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(252, 51, 215, 123)); + expect(e.path.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(164, 66, 75, 80)); + expect(e.path.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(192, 190, 37, 99)); + expect(e.path.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(196, 81, 62, 248)); + expect(e.path.material.offset.getValue(documentStartDate)).toEqual(45320.0); + expect(e.path.material.offset.getValue(documentStopDate)).toEqual(41173.0); + expect(e.path.material.repeat.getValue(documentStartDate)).toEqual(42078.0); + expect(e.path.material.repeat.getValue(documentStopDate)).toEqual(11633.0); + expect(e = dataSource.entities.getById('sampled_path_material_polylineOutline_color')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.490196078431373, 0.498039215686275, 0.819607843137255, 0.72156862745098), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.309803921568627, 0.329411764705882, 0.807843137254902, 0.368627450980392), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_polylineOutline_outlineColor')).toBeDefined(); + expect(e.path.material.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.427450980392157, 0.96078431372549, 0.996078431372549, 0.662745098039216), 1e-14); + expect(e.path.material.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.917647058823529, 0.635294117647059, 0.674509803921569, 0.298039215686275), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_polylineArrow_color')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0666666666666667, 0.972549019607843, 0.686274509803922, 0.325490196078431), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.2, 0.482352941176471, 0.498039215686275, 0.219607843137255), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_polylineGlow_color')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.63921568627451, 0.2, 0.0196078431372549, 0.984313725490196), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.376470588235294, 0.815686274509804, 0.933333333333333, 0.0235294117647059), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_image_color')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.898039215686275, 0.772549019607843, 0.294117647058824, 0.0431372549019608), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.815686274509804, 0.0901960784313725, 0.898039215686275, 0.309803921568627), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_grid_color')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.890196078431373, 0, 0.717647058823529, 0.329411764705882), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.474509803921569, 0.690196078431373, 0.0431372549019608, 0.258823529411765), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_stripe_evenColor')).toBeDefined(); + expect(e.path.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.368627450980392, 0.584313725490196, 0.831372549019608, 0.541176470588235), 1e-14); + expect(e.path.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.317647058823529, 0.4, 0.83921568627451, 0.537254901960784), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_stripe_oddColor')).toBeDefined(); + expect(e.path.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.145098039215686, 0.588235294117647, 0.917647058823529, 0.607843137254902), 1e-14); + expect(e.path.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.117647058823529, 0.0705882352941176, 0.901960784313726, 0.525490196078431), 1e-14); + expect(e = dataSource.entities.getById('sampled_point_color_rgbaf')).toBeDefined(); + expect(e.point.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.67843137254902, 0.356862745098039, 0.588235294117647, 0.796078431372549), 1e-14); + expect(e.point.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.968627450980392, 0.298039215686275, 0.513725490196078, 0.631372549019608), 1e-14); + expect(e = dataSource.entities.getById('sampled_point_outlineColor_rgbaf')).toBeDefined(); + expect(e.point.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.427450980392157, 0.894117647058824, 0.168627450980392, 0.768627450980392), 1e-14); + expect(e.point.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.458823529411765, 0.466666666666667, 0.388235294117647, 0.792156862745098), 1e-14); + expect(e = dataSource.entities.getById('sampled_polygon_material_solidColor_color')).toBeDefined(); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.305882352941176, 0.615686274509804, 0.337254901960784, 0.894117647058824), 1e-14); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.184313725490196, 0.619607843137255, 0.352941176470588, 0.0313725490196078), 1e-14); + expect(e = dataSource.entities.getById('sampled_polygon_material_image')).toBeDefined(); + expect(e.polygon.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(19536, 17484)); + expect(e.polygon.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(46291, 28852)); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(157, 5, 231, 29)); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(53, 2, 148, 36)); + expect(e = dataSource.entities.getById('sampled_polygon_material_grid')).toBeDefined(); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(179, 243, 247, 124)); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(15, 128, 159, 42)); + expect(e.polygon.material.cellAlpha.getValue(documentStartDate)).toEqual(11565.0); + expect(e.polygon.material.cellAlpha.getValue(documentStopDate)).toEqual(42611.0); + expect(e.polygon.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(47065, 65463)); + expect(e.polygon.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(29170, 16497)); + expect(e.polygon.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(62674, 26868)); + expect(e.polygon.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(22008, 39509)); + expect(e.polygon.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(28793, 1648)); + expect(e.polygon.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(44991, 42159)); + expect(e = dataSource.entities.getById('sampled_polygon_material_stripe')).toBeDefined(); + expect(e.polygon.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(113, 233, 143, 146)); + expect(e.polygon.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(106, 138, 115, 44)); + expect(e.polygon.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(104, 146, 138, 244)); + expect(e.polygon.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(161, 95, 25, 36)); + expect(e.polygon.material.offset.getValue(documentStartDate)).toEqual(4711.0); + expect(e.polygon.material.offset.getValue(documentStopDate)).toEqual(65087.0); + expect(e.polygon.material.repeat.getValue(documentStartDate)).toEqual(44013.0); + expect(e.polygon.material.repeat.getValue(documentStopDate)).toEqual(7595.0); + expect(e = dataSource.entities.getById('sampled_polygon_material_image_color')).toBeDefined(); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.501960784313725, 0.0823529411764706, 0.282352941176471, 0.305882352941176), 1e-14); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0745098039215686, 0.654901960784314, 0.6, 0.886274509803922), 1e-14); + expect(e = dataSource.entities.getById('sampled_polygon_material_grid_color')).toBeDefined(); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.192156862745098, 0.709803921568627, 0.807843137254902, 0.737254901960784), 1e-14); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.674509803921569, 0.0235294117647059, 0.764705882352941, 0.976470588235294), 1e-14); + expect(e = dataSource.entities.getById('sampled_polygon_material_stripe_evenColor')).toBeDefined(); + expect(e.polygon.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.568627450980392, 0.352941176470588, 0.396078431372549, 0.435294117647059), 1e-14); + expect(e.polygon.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.274509803921569, 0.43921568627451, 0.686274509803922, 0.419607843137255), 1e-14); + expect(e = dataSource.entities.getById('sampled_polygon_material_stripe_oddColor')).toBeDefined(); + expect(e.polygon.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.325490196078431, 0.349019607843137, 0.580392156862745, 0.725490196078431), 1e-14); + expect(e.polygon.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.568627450980392, 0.690196078431373, 0.00392156862745098, 0.858823529411765), 1e-14); + expect(e = dataSource.entities.getById('sampled_polygon_outlineColor_rgbaf')).toBeDefined(); + expect(e.polygon.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.674509803921569, 0.556862745098039, 0.113725490196078, 0.6), 1e-14); + expect(e.polygon.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.650980392156863, 0.827450980392157, 0.537254901960784, 0.713725490196078), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_solidColor_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.976470588235294, 0.949019607843137, 0.450980392156863, 0.466666666666667), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.262745098039216, 0.509803921568627, 0.537254901960784, 0.850980392156863), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_polylineOutline')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(245, 92, 109, 218)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(241, 96, 196, 167)); + expect(e.polyline.material.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(174, 2, 11, 244)); + expect(e.polyline.material.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(31, 126, 140, 138)); + expect(e.polyline.material.outlineWidth.getValue(documentStartDate)).toEqual(33279.0); + expect(e.polyline.material.outlineWidth.getValue(documentStopDate)).toEqual(26855.0); + expect(e = dataSource.entities.getById('sampled_polyline_material_polylineArrow')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(141, 137, 252, 157)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(8, 236, 198, 57)); + expect(e = dataSource.entities.getById('sampled_polyline_material_polylineGlow')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(174, 178, 78, 176)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(79, 191, 38, 195)); + expect(e.polyline.material.glowPower.getValue(documentStartDate)).toEqual(55378.0); + expect(e.polyline.material.glowPower.getValue(documentStopDate)).toEqual(60643.0); + expect(e = dataSource.entities.getById('sampled_polyline_material_image')).toBeDefined(); + expect(e.polyline.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(50957, 35783)); + expect(e.polyline.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(59533, 65000)); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(174, 154, 113, 185)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(123, 236, 118, 155)); + expect(e = dataSource.entities.getById('sampled_polyline_material_grid')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(26, 89, 33, 224)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(215, 131, 203, 1)); + expect(e.polyline.material.cellAlpha.getValue(documentStartDate)).toEqual(34343.0); + expect(e.polyline.material.cellAlpha.getValue(documentStopDate)).toEqual(63863.0); + expect(e.polyline.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(52308, 51660)); + expect(e.polyline.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(45338, 51633)); + expect(e.polyline.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(47738, 52154)); + expect(e.polyline.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(42674, 38822)); + expect(e.polyline.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(29194, 52338)); + expect(e.polyline.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(25319, 28514)); + expect(e = dataSource.entities.getById('sampled_polyline_material_stripe')).toBeDefined(); + expect(e.polyline.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(141, 205, 78, 73)); + expect(e.polyline.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(107, 159, 97, 34)); + expect(e.polyline.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(19, 76, 127, 197)); + expect(e.polyline.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(214, 222, 19, 168)); + expect(e.polyline.material.offset.getValue(documentStartDate)).toEqual(51126.0); + expect(e.polyline.material.offset.getValue(documentStopDate)).toEqual(10891.0); + expect(e.polyline.material.repeat.getValue(documentStartDate)).toEqual(25313.0); + expect(e.polyline.material.repeat.getValue(documentStopDate)).toEqual(22020.0); + expect(e = dataSource.entities.getById('sampled_polyline_material_polylineOutline_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.384313725490196, 0.168627450980392, 0.443137254901961, 0.658823529411765), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0274509803921569, 0.647058823529412, 0.396078431372549, 0.105882352941176), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_polylineOutline_outlineColor')).toBeDefined(); + expect(e.polyline.material.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0823529411764706, 0.0549019607843137, 0.149019607843137, 0.580392156862745), 1e-14); + expect(e.polyline.material.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.733333333333333, 0.792156862745098, 0.63921568627451, 0.564705882352941), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_polylineArrow_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.52156862745098, 0.725490196078431, 0.87843137254902, 0.823529411764706), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.772549019607843, 0.862745098039216, 0.325490196078431, 0), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_polylineGlow_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.705882352941177, 0.901960784313726, 0.0784313725490196, 0.356862745098039), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.517647058823529, 0.207843137254902, 0.701960784313725, 0.105882352941176), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_image_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.796078431372549, 0.741176470588235, 0.741176470588235, 0.349019607843137), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.925490196078431, 0.266666666666667, 0.0941176470588235, 0.556862745098039), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_grid_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.545098039215686, 0.847058823529412, 0.341176470588235, 0.101960784313725), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.431372549019608, 0.952941176470588, 0.184313725490196, 0.184313725490196), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_stripe_evenColor')).toBeDefined(); + expect(e.polyline.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.807843137254902, 0.262745098039216, 0.898039215686275, 0.811764705882353), 1e-14); + expect(e.polyline.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.415686274509804, 0.968627450980392, 0.0980392156862745, 0.423529411764706), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_stripe_oddColor')).toBeDefined(); + expect(e.polyline.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.427450980392157, 0.407843137254902, 0.470588235294118, 0.874509803921569), 1e-14); + expect(e.polyline.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.509803921568627, 0.427450980392157, 0.976470588235294, 0), 1e-14); + expect(e = dataSource.entities.getById('sampled_rectangle_coordinates_wsenDegrees')).toBeDefined(); + expect(e.rectangle.coordinates.getValue(documentStartDate)).toEqual(Rectangle.fromDegrees(35, 18, 38, 15)); + expect(e.rectangle.coordinates.getValue(documentStopDate)).toEqual(Rectangle.fromDegrees(38, 1, 12, 30)); + expect(e = dataSource.entities.getById('sampled_rectangle_material_solidColor_color')).toBeDefined(); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.203921568627451, 0.243137254901961, 0.576470588235294, 0.0980392156862745), 1e-14); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.913725490196078, 0.831372549019608, 0.76078431372549, 0.952941176470588), 1e-14); + expect(e = dataSource.entities.getById('sampled_rectangle_material_image')).toBeDefined(); + expect(e.rectangle.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(3711, 44302)); + expect(e.rectangle.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(52318, 60108)); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(49, 142, 97, 190)); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(189, 250, 238, 118)); + expect(e = dataSource.entities.getById('sampled_rectangle_material_grid')).toBeDefined(); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(95, 53, 115, 82)); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(204, 71, 209, 187)); + expect(e.rectangle.material.cellAlpha.getValue(documentStartDate)).toEqual(48813.0); + expect(e.rectangle.material.cellAlpha.getValue(documentStopDate)).toEqual(21269.0); + expect(e.rectangle.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(22945, 32857)); + expect(e.rectangle.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(55972, 34522)); + expect(e.rectangle.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(37146, 39825)); + expect(e.rectangle.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(64636, 13052)); + expect(e.rectangle.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(8882, 38690)); + expect(e.rectangle.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(8857, 21794)); + expect(e = dataSource.entities.getById('sampled_rectangle_material_stripe')).toBeDefined(); + expect(e.rectangle.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(243, 96, 246, 5)); + expect(e.rectangle.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(74, 28, 207, 87)); + expect(e.rectangle.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(147, 18, 134, 10)); + expect(e.rectangle.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(59, 151, 72, 114)); + expect(e.rectangle.material.offset.getValue(documentStartDate)).toEqual(57328.0); + expect(e.rectangle.material.offset.getValue(documentStopDate)).toEqual(2602.0); + expect(e.rectangle.material.repeat.getValue(documentStartDate)).toEqual(29729.0); + expect(e.rectangle.material.repeat.getValue(documentStopDate)).toEqual(30206.0); + expect(e = dataSource.entities.getById('sampled_rectangle_material_image_color')).toBeDefined(); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.552941176470588, 0.101960784313725, 0.772549019607843, 0.00392156862745098), 1e-14); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0156862745098039, 0.964705882352941, 0.592156862745098, 0.396078431372549), 1e-14); + expect(e = dataSource.entities.getById('sampled_rectangle_material_grid_color')).toBeDefined(); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.490196078431373, 0.384313725490196, 0.937254901960784, 0.168627450980392), 1e-14); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.392156862745098, 0.756862745098039, 0.454901960784314, 0.529411764705882), 1e-14); + expect(e = dataSource.entities.getById('sampled_rectangle_material_stripe_evenColor')).toBeDefined(); + expect(e.rectangle.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.32156862745098, 0.776470588235294, 0.227450980392157, 0.0823529411764706), 1e-14); + expect(e.rectangle.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.929411764705882, 0.725490196078431, 0.00392156862745098, 0.364705882352941), 1e-14); + expect(e = dataSource.entities.getById('sampled_rectangle_material_stripe_oddColor')).toBeDefined(); + expect(e.rectangle.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.984313725490196, 0.831372549019608, 0.827450980392157, 0.925490196078431), 1e-14); + expect(e.rectangle.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.145098039215686, 0.0156862745098039, 0.380392156862745, 0.490196078431373), 1e-14); + expect(e = dataSource.entities.getById('sampled_rectangle_outlineColor_rgbaf')).toBeDefined(); + expect(e.rectangle.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.980392156862745, 0.466666666666667, 0.752941176470588, 0.709803921568627), 1e-14); + expect(e.rectangle.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.549019607843137, 0.949019607843137, 0.545098039215686, 0.380392156862745), 1e-14); + expect(e = dataSource.entities.getById('sampled_wall_material_solidColor_color')).toBeDefined(); + expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.384313725490196, 0.964705882352941, 0.827450980392157, 0.815686274509804), 1e-14); + expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.00784313725490196, 0.325490196078431, 0.952941176470588, 0.0549019607843137), 1e-14); + expect(e = dataSource.entities.getById('sampled_wall_material_image')).toBeDefined(); + expect(e.wall.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(13369, 38196)); + expect(e.wall.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(36874, 55696)); + expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(1, 152, 139, 83)); + expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(127, 110, 56, 69)); + expect(e = dataSource.entities.getById('sampled_wall_material_grid')).toBeDefined(); + expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(243, 153, 88, 43)); + expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(169, 159, 82, 75)); + expect(e.wall.material.cellAlpha.getValue(documentStartDate)).toEqual(32179.0); + expect(e.wall.material.cellAlpha.getValue(documentStopDate)).toEqual(55901.0); + expect(e.wall.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(46941, 30391)); + expect(e.wall.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(51565, 6089)); + expect(e.wall.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(35543, 16778)); + expect(e.wall.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(32904, 18048)); + expect(e.wall.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(2955, 19723)); + expect(e.wall.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(58723, 15333)); + expect(e = dataSource.entities.getById('sampled_wall_material_stripe')).toBeDefined(); + expect(e.wall.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(204, 233, 122, 70)); + expect(e.wall.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(215, 44, 132, 84)); + expect(e.wall.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(20, 6, 10, 253)); + expect(e.wall.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(96, 118, 90, 117)); + expect(e.wall.material.offset.getValue(documentStartDate)).toEqual(63629.0); + expect(e.wall.material.offset.getValue(documentStopDate)).toEqual(38486.0); + expect(e.wall.material.repeat.getValue(documentStartDate)).toEqual(41791.0); + expect(e.wall.material.repeat.getValue(documentStopDate)).toEqual(56258.0); + expect(e = dataSource.entities.getById('sampled_wall_material_image_color')).toBeDefined(); + expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.584313725490196, 0.752941176470588, 0.588235294117647, 0.733333333333333), 1e-14); + expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.309803921568627, 0.988235294117647, 0.0784313725490196, 0.458823529411765), 1e-14); + expect(e = dataSource.entities.getById('sampled_wall_material_grid_color')).toBeDefined(); + expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.27843137254902, 0.549019607843137, 0.964705882352941, 0.96078431372549), 1e-14); + expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.709803921568627, 0.831372549019608, 0.67843137254902, 0.407843137254902), 1e-14); + expect(e = dataSource.entities.getById('sampled_wall_material_stripe_evenColor')).toBeDefined(); + expect(e.wall.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0901960784313725, 0.243137254901961, 0.537254901960784, 0.168627450980392), 1e-14); + expect(e.wall.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.388235294117647, 0.847058823529412, 0.258823529411765, 0.113725490196078), 1e-14); + expect(e = dataSource.entities.getById('sampled_wall_material_stripe_oddColor')).toBeDefined(); + expect(e.wall.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.345098039215686, 0.0196078431372549, 0.0549019607843137, 0.662745098039216), 1e-14); + expect(e.wall.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.694117647058824, 0.890196078431373, 0.380392156862745, 0.317647058823529), 1e-14); + expect(e = dataSource.entities.getById('sampled_wall_outlineColor_rgbaf')).toBeDefined(); + expect(e.wall.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.933333333333333, 0.105882352941176, 0.0627450980392157, 0.396078431372549), 1e-14); + expect(e.wall.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.901960784313726, 0.435294117647059, 0.352941176470588, 0.713725490196078), 1e-14); + expect(e = dataSource.entities.getById('sampled_conicSensor_intersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_lateralSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_lateralSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_lateralSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_lateralSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_lateralSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_lateralSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_lateralSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_domeSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_domeSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_domeSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_domeSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_domeSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_domeSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_domeSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_domeSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentOcclusionMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentOcclusionMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentOcclusionMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentOcclusionMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentOcclusionMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentOcclusionMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentOcclusionMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentIntersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_intersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_lateralSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_lateralSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_lateralSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_lateralSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_lateralSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_lateralSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_lateralSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_domeSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_domeSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_domeSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_domeSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_domeSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_domeSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_domeSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_domeSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentOcclusionMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentOcclusionMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentOcclusionMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentOcclusionMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentOcclusionMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentOcclusionMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentOcclusionMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentIntersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_intersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_lateralSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_lateralSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_lateralSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_lateralSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_lateralSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_lateralSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_lateralSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_domeSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_domeSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_domeSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_domeSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_domeSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_domeSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_domeSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_domeSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentOcclusionMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentOcclusionMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentOcclusionMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentOcclusionMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentOcclusionMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentOcclusionMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentOcclusionMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentIntersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_material_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_material_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_material_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_material_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_material_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_material_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_material_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_material_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_outlineColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_vector_color_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_vector_direction_unitSpherical')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_vector_direction_cartesian')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_vector_direction_unitCartesian')).toBeDefined(); }); }); }); From 389cb1d3664536c53755b62a297bd96400abaff8 Mon Sep 17 00:00:00 2001 From: lasalvavida Date: Wed, 7 Dec 2016 12:09:48 -0500 Subject: [PATCH 143/396] Moved WebGLConstants from Renderer to Core and updated dependencies --- Source/Core/ComponentDatatype.js | 8 +- Source/Core/IndexDatatype.js | 8 +- Source/Core/PixelFormat.js | 8 +- Source/Core/PrimitiveType.js | 8 +- Source/{Renderer => Core}/WebGLConstants.js | 11 ++- Source/Core/WindingOrder.js | 8 +- Source/Renderer/AutomaticUniforms.js | 82 +++++++++---------- Source/Renderer/Buffer.js | 12 +-- Source/Renderer/BufferUsage.js | 2 +- Source/Renderer/Context.js | 12 +-- Source/Renderer/MipmapHint.js | 2 +- Source/Renderer/PixelDatatype.js | 2 +- Source/Renderer/RenderState.js | 10 +-- Source/Renderer/RenderbufferFormat.js | 2 +- Source/Renderer/Texture.js | 14 ++-- Source/Renderer/TextureMagnificationFilter.js | 2 +- Source/Renderer/TextureMinificationFilter.js | 2 +- Source/Renderer/TextureWrap.js | 2 +- Source/Scene/BillboardCollection.js | 4 +- Source/Scene/BlendEquation.js | 2 +- Source/Scene/BlendFunction.js | 2 +- Source/Scene/CullFace.js | 2 +- Source/Scene/DepthFunction.js | 2 +- Source/Scene/Model.js | 6 +- Source/Scene/ModelAnimationCache.js | 2 +- Source/Scene/OIT.js | 4 +- Source/Scene/PointPrimitiveCollection.js | 4 +- Source/Scene/ShadowMap.js | 4 +- Source/Scene/StencilFunction.js | 2 +- Source/Scene/StencilOperation.js | 2 +- Source/Scene/modelMaterialsCommon.js | 10 +-- Source/ThirdParty/gltfDefaults.js | 2 +- Specs/Renderer/DrawSpec.js | 4 +- Specs/Renderer/FramebufferSpec.js | 4 +- Specs/Renderer/RenderStateSpec.js | 8 +- Specs/Scene/AppearanceSpec.js | 4 +- Specs/Scene/ModelSpec.js | 6 +- Specs/Scene/SceneSpec.js | 4 +- Specs/Scene/ShadowMapSpec.js | 6 +- 39 files changed, 139 insertions(+), 140 deletions(-) rename Source/{Renderer => Core}/WebGLConstants.js (98%) diff --git a/Source/Core/ComponentDatatype.js b/Source/Core/ComponentDatatype.js index 3d45239ca815..bb1e7d533528 100644 --- a/Source/Core/ComponentDatatype.js +++ b/Source/Core/ComponentDatatype.js @@ -1,18 +1,18 @@ /*global define*/ define([ - '../Renderer/WebGLConstants', './defaultValue', './defined', './DeveloperError', './FeatureDetection', - './freezeObject' + './freezeObject', + './WebGLConstants' ], function( - WebGLConstants, defaultValue, defined, DeveloperError, FeatureDetection, - freezeObject) { + freezeObject, + WebGLConstants) { 'use strict'; // Bail out if the browser doesn't support typed arrays, to prevent the setup function diff --git a/Source/Core/IndexDatatype.js b/Source/Core/IndexDatatype.js index 7ffad3c9bc46..4aa9a3d73aad 100644 --- a/Source/Core/IndexDatatype.js +++ b/Source/Core/IndexDatatype.js @@ -1,16 +1,16 @@ /*global define*/ define([ - '../Renderer/WebGLConstants', './defined', './DeveloperError', './freezeObject', - './Math' + './Math', + './WebGLConstants' ], function( - WebGLConstants, defined, DeveloperError, freezeObject, - CesiumMath) { + CesiumMath, + WebGLConstants) { 'use strict'; /** diff --git a/Source/Core/PixelFormat.js b/Source/Core/PixelFormat.js index 327643e61c96..2b95611e7603 100644 --- a/Source/Core/PixelFormat.js +++ b/Source/Core/PixelFormat.js @@ -1,10 +1,10 @@ /*global define*/ define([ - '../Renderer/WebGLConstants', - './freezeObject' + './freezeObject', + './WebGLConstants' ], function( - WebGLConstants, - freezeObject) { + freezeObject, + WebGLConstants) { 'use strict'; /** diff --git a/Source/Core/PrimitiveType.js b/Source/Core/PrimitiveType.js index b32704562f3a..30d3174aa460 100644 --- a/Source/Core/PrimitiveType.js +++ b/Source/Core/PrimitiveType.js @@ -1,10 +1,10 @@ /*global define*/ define([ - '../Renderer/WebGLConstants', - './freezeObject' + './freezeObject', + './WebGLConstants' ], function( - WebGLConstants, - freezeObject) { + freezeObject, + WebGLConstants) { 'use strict'; /** diff --git a/Source/Renderer/WebGLConstants.js b/Source/Core/WebGLConstants.js similarity index 98% rename from Source/Renderer/WebGLConstants.js rename to Source/Core/WebGLConstants.js index 0ed4c4540891..06a0b41be191 100644 --- a/Source/Renderer/WebGLConstants.js +++ b/Source/Core/WebGLConstants.js @@ -1,17 +1,16 @@ /*global define*/ define([ - '../Core/freezeObject' + './freezeObject' ], function( freezeObject) { 'use strict'; /** - * WebGL constants. + * Enum containing WebGL Constant values by name + * for use without an active WebGL context. * - * This file provides a workaround for Safari 9 where WebGL constants can't be accessed - * through WebGLRenderingContext. See https://github.com/AnalyticalGraphicsInc/cesium/issues/2989 - * - * @private + * @readonly + * @enum {Number} */ var WebGLConstants = { DEPTH_BUFFER_BIT : 0x00000100, diff --git a/Source/Core/WindingOrder.js b/Source/Core/WindingOrder.js index b64d6463d357..06999e6a24c2 100644 --- a/Source/Core/WindingOrder.js +++ b/Source/Core/WindingOrder.js @@ -1,10 +1,10 @@ /*global define*/ define([ - '../Renderer/WebGLConstants', - './freezeObject' + './freezeObject', + './WebGLConstants' ], function( - WebGLConstants, - freezeObject) { + freezeObject, + WebGLConstants) { 'use strict'; /** diff --git a/Source/Renderer/AutomaticUniforms.js b/Source/Renderer/AutomaticUniforms.js index 59ee77626ce3..6957c7d16db3 100644 --- a/Source/Renderer/AutomaticUniforms.js +++ b/Source/Renderer/AutomaticUniforms.js @@ -2,7 +2,7 @@ define([ '../Core/Cartesian3', '../Core/Matrix4', - './WebGLConstants' + '../Core/WebGLConstants' ], function( Cartesian3, Matrix4, @@ -75,7 +75,7 @@ define([ * // Scale the window coordinate components to [0, 1] by dividing * // by the viewport's width and height. * vec2 v = gl_FragCoord.xy / czm_viewport.zw; - * + * * @see Context#getViewport */ czm_viewport : new AutomaticUniform({ @@ -108,7 +108,7 @@ define([ * * // Example * gl_Position = czm_viewportOrthographic * vec4(windowPosition, 0.0, 1.0); - * + * * @see UniformState#viewportOrthographic * @see czm_viewport * @see czm_viewportTransformation @@ -150,7 +150,7 @@ define([ * vec4 q = czm_modelViewProjection * positionMC; // model to clip coordinates * q.xyz /= q.w; // clip to normalized device coordinates (ndc) * q.xyz = (czm_viewportTransformation * vec4(q.xyz, 1.0)).xyz; // ndc to window coordinates - * + * * @see UniformState#viewportTransformation * @see czm_viewport * @see czm_viewportOrthographic @@ -204,7 +204,7 @@ define([ * * // Example * vec4 worldPosition = czm_model * modelPosition; - * + * * @see UniformState#model * @see czm_inverseModel * @see czm_modelView @@ -232,7 +232,7 @@ define([ * * // Example * vec4 modelPosition = czm_inverseModel * worldPosition; - * + * * @see UniformState#inverseModel * @see czm_model * @see czm_inverseModelView @@ -259,7 +259,7 @@ define([ * * // Example * vec4 eyePosition = czm_view * worldPosition; - * + * * @see UniformState#view * @see czm_viewRotation * @see czm_modelView @@ -292,7 +292,7 @@ define([ * * // Example * vec4 eyePosition3D = czm_view3D * worldPosition3D; - * + * * @see UniformState#view3D * @see czm_view */ @@ -318,7 +318,7 @@ define([ * * // Example * vec3 eyeVector = czm_viewRotation * worldVector; - * + * * @see UniformState#viewRotation * @see czm_view * @see czm_inverseView @@ -349,7 +349,7 @@ define([ * * // Example * vec3 eyeVector = czm_viewRotation3D * worldVector; - * + * * @see UniformState#viewRotation3D * @see czm_viewRotation */ @@ -375,7 +375,7 @@ define([ * * // Example * vec4 worldPosition = czm_inverseView * eyePosition; - * + * * @see UniformState#inverseView * @see czm_view * @see czm_inverseNormal @@ -405,7 +405,7 @@ define([ * * // Example * vec4 worldPosition = czm_inverseView3D * eyePosition; - * + * * @see UniformState#inverseView3D * @see czm_inverseView */ @@ -431,7 +431,7 @@ define([ * * // Example * vec4 worldVector = czm_inverseViewRotation * eyeVector; - * + * * @see UniformState#inverseView * @see czm_view * @see czm_viewRotation @@ -462,7 +462,7 @@ define([ * * // Example * vec4 worldVector = czm_inverseViewRotation3D * eyeVector; - * + * * @see UniformState#inverseView3D * @see czm_inverseViewRotation */ @@ -489,7 +489,7 @@ define([ * * // Example * gl_Position = czm_projection * eyePosition; - * + * * @see UniformState#projection * @see czm_viewProjection * @see czm_modelViewProjection @@ -518,7 +518,7 @@ define([ * * // Example * vec4 eyePosition = czm_inverseProjection * clipPosition; - * + * * @see UniformState#inverseProjection * @see czm_projection */ @@ -558,7 +558,7 @@ define([ * * // Example * gl_Position = czm_infiniteProjection * eyePosition; - * + * * @see UniformState#infiniteProjection * @see czm_projection * @see czm_modelViewInfiniteProjection @@ -591,7 +591,7 @@ define([ * * // The above is equivalent to, but more efficient than: * vec4 eyePosition = czm_view * czm_model * modelPosition; - * + * * @see UniformState#modelView * @see czm_model * @see czm_view @@ -629,7 +629,7 @@ define([ * * // The above is equivalent to, but more efficient than: * vec4 eyePosition = czm_view3D * czm_model * modelPosition; - * + * * @see UniformState#modelView3D * @see czm_modelView */ @@ -689,7 +689,7 @@ define([ * * // Example * vec4 modelPosition = czm_inverseModelView * eyePosition; - * + * * @see UniformState#inverseModelView * @see czm_modelView */ @@ -718,7 +718,7 @@ define([ * * // Example * vec4 modelPosition = czm_inverseModelView3D * eyePosition; - * + * * @see UniformState#inverseModelView * @see czm_inverseModelView * @see czm_modelView3D @@ -749,7 +749,7 @@ define([ * * // The above is equivalent to, but more efficient than: * gl_Position = czm_projection * czm_view * czm_model * modelPosition; - * + * * @see UniformState#viewProjection * @see czm_view * @see czm_projection @@ -779,7 +779,7 @@ define([ * * // Example * vec4 worldPosition = czm_inverseViewProjection * clipPosition; - * + * * @see UniformState#inverseViewProjection * @see czm_viewProjection */ @@ -809,7 +809,7 @@ define([ * * // The above is equivalent to, but more efficient than: * gl_Position = czm_projection * czm_view * czm_model * modelPosition; - * + * * @see UniformState#modelViewProjection * @see czm_model * @see czm_view @@ -842,7 +842,7 @@ define([ * * // Example * vec4 modelPosition = czm_inverseModelViewProjection * clipPosition; - * + * * @see UniformState#modelViewProjection * @see czm_modelViewProjection */ @@ -909,7 +909,7 @@ define([ * * // The above is equivalent to, but more efficient than: * gl_Position = czm_infiniteProjection * czm_view * czm_model * modelPosition; - * + * * @see UniformState#modelViewInfiniteProjection * @see czm_model * @see czm_view @@ -941,7 +941,7 @@ define([ * * // Example * vec3 eyeNormal = czm_normal * normal; - * + * * @see UniformState#normal * @see czm_inverseNormal * @see czm_modelView @@ -975,7 +975,7 @@ define([ * * // Example * vec3 eyeNormal = czm_normal3D * normal; - * + * * @see UniformState#normal3D * @see czm_normal */ @@ -1002,7 +1002,7 @@ define([ * * // Example * vec3 normalMC = czm_inverseNormal * normalEC; - * + * * @see UniformState#inverseNormal * @see czm_normal * @see czm_modelView @@ -1035,7 +1035,7 @@ define([ * * // Example * vec3 normalMC = czm_inverseNormal3D * normalEC; - * + * * @see UniformState#inverseNormal3D * @see czm_inverseNormal */ @@ -1079,7 +1079,7 @@ define([ * * // Example * float frustumLength = czm_entireFrustum.y - czm_entireFrustum.x; - * + * * @see UniformState#entireFrustum * @see czm_currentFrustum */ @@ -1106,7 +1106,7 @@ define([ * * // Example * float frustumLength = czm_currentFrustum.y - czm_currentFrustum.x; - * + * * @see UniformState#currentFrustum * @see czm_entireFrustum */ @@ -1143,7 +1143,7 @@ define([ * @example * // GLSL declaration * uniform vec3 czm_sunPositionWC; - * + * * @see UniformState#sunPositionWC * @see czm_sunPositionColumbusView * @see czm_sunDirectionWC @@ -1166,7 +1166,7 @@ define([ * @example * // GLSL declaration * uniform vec3 czm_sunPositionColumbusView; - * + * * @see UniformState#sunPositionColumbusView * @see czm_sunPositionWC */ @@ -1192,7 +1192,7 @@ define([ * * // Example * float diffuse = max(dot(czm_sunDirectionEC, normalEC), 0.0); - * + * * @see UniformState#sunDirectionEC * @see czm_moonDirectionEC * @see czm_sunDirectionWC @@ -1216,7 +1216,7 @@ define([ * @example * // GLSL declaration * uniform vec3 czm_sunDirectionWC; - * + * * @see UniformState#sunDirectionWC * @see czm_sunPositionWC * @see czm_sunDirectionEC @@ -1243,7 +1243,7 @@ define([ * * // Example * float diffuse = max(dot(czm_moonDirectionEC, normalEC), 0.0); - * + * * @see UniformState#moonDirectionEC * @see czm_sunDirectionEC */ @@ -1267,7 +1267,7 @@ define([ * @example * // GLSL declaration * uniform vec3 czm_encodedCameraPositionMCHigh; - * + * * @see czm_encodedCameraPositionMCLow * @see czm_modelViewRelativeToEye * @see czm_modelViewProjectionRelativeToEye @@ -1292,7 +1292,7 @@ define([ * @example * // GLSL declaration * uniform vec3 czm_encodedCameraPositionMCLow; - * + * * @see czm_encodedCameraPositionMCHigh * @see czm_modelViewRelativeToEye * @see czm_modelViewProjectionRelativeToEye @@ -1381,7 +1381,7 @@ define([ * { * eyeHeightSq = czm_eyeHeight2D.y; * } - * + * * @see czm_sceneMode2D * @see czm_sceneModeColumbusView * @see czm_sceneMode3D @@ -1433,7 +1433,7 @@ define([ * * // Example * vec3 pseudoFixed = czm_temeToPseudoFixed * teme; - * + * * @see UniformState#temeToPseudoFixedMatrix * @see Transforms.computeTemeToPseudoFixedMatrix */ diff --git a/Source/Renderer/Buffer.js b/Source/Renderer/Buffer.js index 3c67f1e9db12..fc4ee4b8bc8c 100644 --- a/Source/Renderer/Buffer.js +++ b/Source/Renderer/Buffer.js @@ -6,8 +6,8 @@ define([ '../Core/destroyObject', '../Core/DeveloperError', '../Core/IndexDatatype', - './BufferUsage', - './WebGLConstants' + '../Core/WebGLConstants', + './BufferUsage' ], function( defaultValue, defined, @@ -15,8 +15,8 @@ define([ destroyObject, DeveloperError, IndexDatatype, - BufferUsage, - WebGLConstants) { + WebGLConstants, + BufferUsage) { 'use strict'; /** @@ -112,7 +112,7 @@ define([ * typedArray : new Float32Array([0, 0, 0]), * usage : BufferUsage.STATIC_DRAW * }); - * + * * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGenBuffer.xml|glGenBuffer} * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glBindBuffer.xml|glBindBuffer} with ARRAY_BUFFER * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glBufferData.xml|glBufferData} with ARRAY_BUFFER @@ -173,7 +173,7 @@ define([ * usage : BufferUsage.STATIC_DRAW, * indexDatatype : IndexDatatype.UNSIGNED_SHORT * }); - * + * * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGenBuffer.xml|glGenBuffer} * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glBindBuffer.xml|glBindBuffer} with ELEMENT_ARRAY_BUFFER * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glBufferData.xml|glBufferData} with ELEMENT_ARRAY_BUFFER diff --git a/Source/Renderer/BufferUsage.js b/Source/Renderer/BufferUsage.js index ef07eba0c4db..c46034a91992 100644 --- a/Source/Renderer/BufferUsage.js +++ b/Source/Renderer/BufferUsage.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - './WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Renderer/Context.js b/Source/Renderer/Context.js index ca41b53f505f..8dca7c27c35f 100644 --- a/Source/Renderer/Context.js +++ b/Source/Renderer/Context.js @@ -14,6 +14,7 @@ define([ '../Core/Matrix4', '../Core/PrimitiveType', '../Core/RuntimeError', + '../Core/WebGLConstants', '../Shaders/ViewportQuadVS', './BufferUsage', './ClearCommand', @@ -27,8 +28,7 @@ define([ './ShaderProgram', './Texture', './UniformState', - './VertexArray', - './WebGLConstants' + './VertexArray' ], function( clone, Color, @@ -44,6 +44,7 @@ define([ Matrix4, PrimitiveType, RuntimeError, + WebGLConstants, ViewportQuadVS, BufferUsage, ClearCommand, @@ -57,8 +58,7 @@ define([ ShaderProgram, Texture, UniformState, - VertexArray, - WebGLConstants) { + VertexArray) { 'use strict'; /*global WebGLRenderingContext*/ /*global WebGL2RenderingContext*/ @@ -1100,7 +1100,7 @@ define([ * * @example * var object = context.getObjectByPickColor(pickColor); - * + * * @see Context#createPickId */ Context.prototype.getObjectByPickColor = function(pickColor) { @@ -1151,7 +1151,7 @@ define([ * primitive : this, * id : this.id * }); - * + * * @see Context#getObjectByPickColor */ Context.prototype.createPickId = function(object) { diff --git a/Source/Renderer/MipmapHint.js b/Source/Renderer/MipmapHint.js index 684525aa0b54..44a633894841 100644 --- a/Source/Renderer/MipmapHint.js +++ b/Source/Renderer/MipmapHint.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - './WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Renderer/PixelDatatype.js b/Source/Renderer/PixelDatatype.js index 02cf54badf07..96358380f8c9 100644 --- a/Source/Renderer/PixelDatatype.js +++ b/Source/Renderer/PixelDatatype.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - './WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Renderer/RenderState.js b/Source/Renderer/RenderState.js index 92aea5c35a45..9e7fb86af9bb 100644 --- a/Source/Renderer/RenderState.js +++ b/Source/Renderer/RenderState.js @@ -5,18 +5,18 @@ define([ '../Core/defaultValue', '../Core/defined', '../Core/DeveloperError', + '../Core/WebGLConstants', '../Core/WindingOrder', - './ContextLimits', - './WebGLConstants' + './ContextLimits' ], function( BoundingRectangle, Color, defaultValue, defined, DeveloperError, + WebGLConstants, WindingOrder, - ContextLimits, - WebGLConstants) { + ContextLimits) { 'use strict'; function validateBlendEquation(blendEquation) { @@ -393,7 +393,7 @@ define([ * * @see DrawCommand * @see ClearCommand - * + * * @private */ RenderState.fromCache = function(renderState) { diff --git a/Source/Renderer/RenderbufferFormat.js b/Source/Renderer/RenderbufferFormat.js index 337089c2607c..ce99580b7f02 100644 --- a/Source/Renderer/RenderbufferFormat.js +++ b/Source/Renderer/RenderbufferFormat.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - './WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Renderer/Texture.js b/Source/Renderer/Texture.js index bc2876a82f65..b1c80ee0d6c3 100644 --- a/Source/Renderer/Texture.js +++ b/Source/Renderer/Texture.js @@ -8,13 +8,13 @@ define([ '../Core/DeveloperError', '../Core/Math', '../Core/PixelFormat', + '../Core/WebGLConstants', './ContextLimits', './MipmapHint', './PixelDatatype', './Sampler', './TextureMagnificationFilter', - './TextureMinificationFilter', - './WebGLConstants' + './TextureMinificationFilter' ], function( Cartesian2, defaultValue, @@ -24,15 +24,15 @@ define([ DeveloperError, CesiumMath, PixelFormat, + WebGLConstants, ContextLimits, MipmapHint, PixelDatatype, Sampler, TextureMagnificationFilter, - TextureMinificationFilter, - WebGLConstants) { + TextureMinificationFilter) { 'use strict'; - + function Texture(options) { options = defaultValue(options, defaultValue.EMPTY_OBJECT); @@ -209,9 +209,9 @@ define([ * var t = Texture.fromFramebuffer({ * context : context * }); - * + * * @see Sampler - * + * * @private */ Texture.fromFramebuffer = function(options) { diff --git a/Source/Renderer/TextureMagnificationFilter.js b/Source/Renderer/TextureMagnificationFilter.js index a80d73f53bed..777ce3d93506 100644 --- a/Source/Renderer/TextureMagnificationFilter.js +++ b/Source/Renderer/TextureMagnificationFilter.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - './WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Renderer/TextureMinificationFilter.js b/Source/Renderer/TextureMinificationFilter.js index 1f8cc2ffae65..465816365200 100644 --- a/Source/Renderer/TextureMinificationFilter.js +++ b/Source/Renderer/TextureMinificationFilter.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - './WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Renderer/TextureWrap.js b/Source/Renderer/TextureWrap.js index a7c08bf83f27..295b45e453e8 100644 --- a/Source/Renderer/TextureWrap.js +++ b/Source/Renderer/TextureWrap.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - './WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Scene/BillboardCollection.js b/Source/Scene/BillboardCollection.js index 34370f8819de..b513919c59e5 100644 --- a/Source/Scene/BillboardCollection.js +++ b/Source/Scene/BillboardCollection.js @@ -15,6 +15,7 @@ define([ '../Core/IndexDatatype', '../Core/Math', '../Core/Matrix4', + '../Core/WebGLConstants', '../Renderer/Buffer', '../Renderer/BufferUsage', '../Renderer/DrawCommand', @@ -22,7 +23,6 @@ define([ '../Renderer/ShaderProgram', '../Renderer/ShaderSource', '../Renderer/VertexArrayFacade', - '../Renderer/WebGLConstants', '../Shaders/BillboardCollectionFS', '../Shaders/BillboardCollectionVS', './Billboard', @@ -49,6 +49,7 @@ define([ IndexDatatype, CesiumMath, Matrix4, + WebGLConstants, Buffer, BufferUsage, DrawCommand, @@ -56,7 +57,6 @@ define([ ShaderProgram, ShaderSource, VertexArrayFacade, - WebGLConstants, BillboardCollectionFS, BillboardCollectionVS, Billboard, diff --git a/Source/Scene/BlendEquation.js b/Source/Scene/BlendEquation.js index 1d71d9857cde..1f16c2fd86a0 100644 --- a/Source/Scene/BlendEquation.js +++ b/Source/Scene/BlendEquation.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - '../Renderer/WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Scene/BlendFunction.js b/Source/Scene/BlendFunction.js index 9276ca8b22ca..2da26a81bd02 100644 --- a/Source/Scene/BlendFunction.js +++ b/Source/Scene/BlendFunction.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - '../Renderer/WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Scene/CullFace.js b/Source/Scene/CullFace.js index 4026796e3238..25cf2ff2f1df 100644 --- a/Source/Scene/CullFace.js +++ b/Source/Scene/CullFace.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - '../Renderer/WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Scene/DepthFunction.js b/Source/Scene/DepthFunction.js index 2813f8b3b598..a8568c4b24cc 100644 --- a/Source/Scene/DepthFunction.js +++ b/Source/Scene/DepthFunction.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - '../Renderer/WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 703abe4e8708..a3b628394f6b 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -33,6 +33,7 @@ define([ '../Core/Queue', '../Core/RuntimeError', '../Core/Transforms', + '../Core/WebGLConstants', '../Renderer/Buffer', '../Renderer/BufferUsage', '../Renderer/DrawCommand', @@ -44,7 +45,6 @@ define([ '../Renderer/TextureMinificationFilter', '../Renderer/TextureWrap', '../Renderer/VertexArray', - '../Renderer/WebGLConstants', '../ThirdParty/gltfDefaults', '../ThirdParty/Uri', '../ThirdParty/when', @@ -95,6 +95,7 @@ define([ Queue, RuntimeError, Transforms, + WebGLConstants, Buffer, BufferUsage, DrawCommand, @@ -106,7 +107,6 @@ define([ TextureMinificationFilter, TextureWrap, VertexArray, - WebGLConstants, gltfDefaults, Uri, when, @@ -3028,7 +3028,7 @@ define([ var castShadows = ShadowMode.castShadows(model._shadows); var receiveShadows = ShadowMode.receiveShadows(model._shadows); - + var command = new DrawCommand({ boundingVolume : new BoundingSphere(), // updated in update() cull : model.cull, diff --git a/Source/Scene/ModelAnimationCache.js b/Source/Scene/ModelAnimationCache.js index d19ce82e4a52..d3848c381b67 100644 --- a/Source/Scene/ModelAnimationCache.js +++ b/Source/Scene/ModelAnimationCache.js @@ -7,7 +7,7 @@ define([ '../Core/Matrix4', '../Core/Quaternion', '../Core/QuaternionSpline', - '../Renderer/WebGLConstants', + '../Core/WebGLConstants', './getBinaryAccessor' ], function( Cartesian3, diff --git a/Source/Scene/OIT.js b/Source/Scene/OIT.js index c2f39b15fcbe..56634581365f 100644 --- a/Source/Scene/OIT.js +++ b/Source/Scene/OIT.js @@ -5,6 +5,7 @@ define([ '../Core/defined', '../Core/destroyObject', '../Core/PixelFormat', + '../Core/WebGLConstants', '../Renderer/ClearCommand', '../Renderer/DrawCommand', '../Renderer/Framebuffer', @@ -13,7 +14,6 @@ define([ '../Renderer/ShaderProgram', '../Renderer/ShaderSource', '../Renderer/Texture', - '../Renderer/WebGLConstants', '../Shaders/AdjustTranslucentFS', '../Shaders/CompositeOITFS', './BlendEquation', @@ -24,6 +24,7 @@ define([ defined, destroyObject, PixelFormat, + WebGLConstants, ClearCommand, DrawCommand, Framebuffer, @@ -32,7 +33,6 @@ define([ ShaderProgram, ShaderSource, Texture, - WebGLConstants, AdjustTranslucentFS, CompositeOITFS, BlendEquation, diff --git a/Source/Scene/PointPrimitiveCollection.js b/Source/Scene/PointPrimitiveCollection.js index 2c469a20ef22..78820c715716 100644 --- a/Source/Scene/PointPrimitiveCollection.js +++ b/Source/Scene/PointPrimitiveCollection.js @@ -12,6 +12,7 @@ define([ '../Core/Math', '../Core/Matrix4', '../Core/PrimitiveType', + '../Core/WebGLConstants', '../Renderer/BufferUsage', '../Renderer/ContextLimits', '../Renderer/DrawCommand', @@ -19,7 +20,6 @@ define([ '../Renderer/ShaderProgram', '../Renderer/ShaderSource', '../Renderer/VertexArrayFacade', - '../Renderer/WebGLConstants', '../Shaders/PointPrimitiveCollectionFS', '../Shaders/PointPrimitiveCollectionVS', './BlendingState', @@ -39,6 +39,7 @@ define([ CesiumMath, Matrix4, PrimitiveType, + WebGLConstants, BufferUsage, ContextLimits, DrawCommand, @@ -46,7 +47,6 @@ define([ ShaderProgram, ShaderSource, VertexArrayFacade, - WebGLConstants, PointPrimitiveCollectionFS, PointPrimitiveCollectionVS, BlendingState, diff --git a/Source/Scene/ShadowMap.js b/Source/Scene/ShadowMap.js index e9f35afb74cb..594bc3346381 100644 --- a/Source/Scene/ShadowMap.js +++ b/Source/Scene/ShadowMap.js @@ -24,6 +24,7 @@ define([ '../Core/PixelFormat', '../Core/Quaternion', '../Core/SphereOutlineGeometry', + '../Core/WebGLConstants', '../Renderer/ClearCommand', '../Renderer/ContextLimits', '../Renderer/CubeMap', @@ -40,7 +41,6 @@ define([ '../Renderer/TextureMagnificationFilter', '../Renderer/TextureMinificationFilter', '../Renderer/TextureWrap', - '../Renderer/WebGLConstants', './Camera', './CullFace', './CullingVolume', @@ -76,6 +76,7 @@ define([ PixelFormat, Quaternion, SphereOutlineGeometry, + WebGLConstants, ClearCommand, ContextLimits, CubeMap, @@ -92,7 +93,6 @@ define([ TextureMagnificationFilter, TextureMinificationFilter, TextureWrap, - WebGLConstants, Camera, CullFace, CullingVolume, diff --git a/Source/Scene/StencilFunction.js b/Source/Scene/StencilFunction.js index 244135f4de7f..0d8e8014e4df 100644 --- a/Source/Scene/StencilFunction.js +++ b/Source/Scene/StencilFunction.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - '../Renderer/WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Scene/StencilOperation.js b/Source/Scene/StencilOperation.js index a457136f2934..97b82b4f2b3d 100644 --- a/Source/Scene/StencilOperation.js +++ b/Source/Scene/StencilOperation.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - '../Renderer/WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Scene/modelMaterialsCommon.js b/Source/Scene/modelMaterialsCommon.js index b3293213ea30..92b997f8d000 100644 --- a/Source/Scene/modelMaterialsCommon.js +++ b/Source/Scene/modelMaterialsCommon.js @@ -2,7 +2,7 @@ define([ '../Core/defaultValue', '../Core/defined', - '../Renderer/WebGLConstants' + '../Core/WebGLConstants' ], function( defaultValue, defined, @@ -622,7 +622,7 @@ define([ } else { value = paramValue; } - + switch (paramName) { case 'ambient': return (value instanceof String || typeof value === 'string') ? WebGLConstants.SAMPLER_2D : WebGLConstants.FLOAT_VEC4; @@ -636,13 +636,13 @@ define([ return WebGLConstants.FLOAT; case 'transparency': return WebGLConstants.FLOAT; - + // these two are usually not used directly within shaders, // they are just added here for completeness case 'transparent': - return WebGLConstants.BOOL; + return WebGLConstants.BOOL; case 'doubleSided': - return WebGLConstants.BOOL; + return WebGLConstants.BOOL; } } diff --git a/Source/ThirdParty/gltfDefaults.js b/Source/ThirdParty/gltfDefaults.js index 31562cbd20fd..14cb12615d82 100644 --- a/Source/ThirdParty/gltfDefaults.js +++ b/Source/ThirdParty/gltfDefaults.js @@ -4,7 +4,7 @@ define([ '../Core/defaultValue', '../Core/defined', '../Core/Quaternion', - '../Renderer/WebGLConstants' + '../Core/WebGLConstants' ], function( Cartesian3, defaultValue, diff --git a/Specs/Renderer/DrawSpec.js b/Specs/Renderer/DrawSpec.js index 8d91008a1253..8ba91cdae046 100644 --- a/Specs/Renderer/DrawSpec.js +++ b/Specs/Renderer/DrawSpec.js @@ -5,6 +5,7 @@ defineSuite([ 'Core/ComponentDatatype', 'Core/IndexDatatype', 'Core/PrimitiveType', + 'Core/WebGLConstants', 'Core/WindingOrder', 'Renderer/Buffer', 'Renderer/BufferUsage', @@ -14,7 +15,6 @@ defineSuite([ 'Renderer/RenderState', 'Renderer/ShaderProgram', 'Renderer/VertexArray', - 'Renderer/WebGLConstants', 'Scene/BlendingState', 'Specs/createContext' ], 'Renderer/Draw', function( @@ -23,6 +23,7 @@ defineSuite([ ComponentDatatype, IndexDatatype, PrimitiveType, + WebGLConstants, WindingOrder, Buffer, BufferUsage, @@ -32,7 +33,6 @@ defineSuite([ RenderState, ShaderProgram, VertexArray, - WebGLConstants, BlendingState, createContext) { 'use strict'; diff --git a/Specs/Renderer/FramebufferSpec.js b/Specs/Renderer/FramebufferSpec.js index 8e20d3681773..950bbffcbcff 100644 --- a/Specs/Renderer/FramebufferSpec.js +++ b/Specs/Renderer/FramebufferSpec.js @@ -4,6 +4,7 @@ defineSuite([ 'Core/Color', 'Core/PixelFormat', 'Core/PrimitiveType', + 'Core/WebGLConstants', 'Renderer/Buffer', 'Renderer/BufferUsage', 'Renderer/ClearCommand', @@ -17,13 +18,13 @@ defineSuite([ 'Renderer/ShaderProgram', 'Renderer/Texture', 'Renderer/VertexArray', - 'Renderer/WebGLConstants', 'Specs/createContext' ], function( Framebuffer, Color, PixelFormat, PrimitiveType, + WebGLConstants, Buffer, BufferUsage, ClearCommand, @@ -37,7 +38,6 @@ defineSuite([ ShaderProgram, Texture, VertexArray, - WebGLConstants, createContext) { 'use strict'; diff --git a/Specs/Renderer/RenderStateSpec.js b/Specs/Renderer/RenderStateSpec.js index d437a77563f2..479618ad1ff0 100644 --- a/Specs/Renderer/RenderStateSpec.js +++ b/Specs/Renderer/RenderStateSpec.js @@ -1,15 +1,15 @@ /*global defineSuite*/ defineSuite([ - 'Renderer/RenderState', + 'Core/WebGLConstants', 'Core/WindingOrder', + 'Renderer/RenderState', 'Renderer/ContextLimits', - 'Renderer/WebGLConstants', 'Specs/createContext' ], function( - RenderState, + WebGLConstants, WindingOrder, + RenderState, ContextLimits, - WebGLConstants, createContext) { 'use strict'; diff --git a/Specs/Scene/AppearanceSpec.js b/Specs/Scene/AppearanceSpec.js index a6c09eee6a4d..8bf607b2f9ac 100644 --- a/Specs/Scene/AppearanceSpec.js +++ b/Specs/Scene/AppearanceSpec.js @@ -1,12 +1,12 @@ /*global defineSuite*/ defineSuite([ + 'Core/WebGLConstants', 'Scene/Appearance', - 'Renderer/WebGLConstants', 'Scene/BlendingState', 'Scene/Material' ], function( - Appearance, WebGLConstants, + Appearance, BlendingState, Material) { 'use strict'; diff --git a/Specs/Scene/ModelSpec.js b/Specs/Scene/ModelSpec.js index 3e4d240a34e1..c34501c6ec92 100644 --- a/Specs/Scene/ModelSpec.js +++ b/Specs/Scene/ModelSpec.js @@ -23,9 +23,9 @@ defineSuite([ 'Core/Matrix4', 'Core/PrimitiveType', 'Core/Transforms', + 'Core/WebGLConstants', 'Renderer/RenderState', 'Renderer/ShaderSource', - 'Renderer/WebGLConstants', 'Scene/ColorBlendMode', 'Scene/HeightReference', 'Scene/ModelAnimationLoop', @@ -56,9 +56,9 @@ defineSuite([ Matrix4, PrimitiveType, Transforms, + WebGLConstants, RenderState, ShaderSource, - WebGLConstants, ColorBlendMode, HeightReference, ModelAnimationLoop, @@ -2050,7 +2050,7 @@ defineSuite([ scene.renderForSpecs(); expect(scene.globe.removedCallback).toEqual(true); expect(scene.globe.callback).not.toBeDefined(); - + primitives.remove(model); }); }); diff --git a/Specs/Scene/SceneSpec.js b/Specs/Scene/SceneSpec.js index 58d0d78edcab..151b77c3c8b2 100644 --- a/Specs/Scene/SceneSpec.js +++ b/Specs/Scene/SceneSpec.js @@ -12,13 +12,13 @@ defineSuite([ 'Core/Rectangle', 'Core/RectangleGeometry', 'Core/RuntimeError', + 'Core/WebGLConstants', 'Core/WebMercatorProjection', 'Renderer/DrawCommand', 'Renderer/Framebuffer', 'Renderer/PixelDatatype', 'Renderer/ShaderProgram', 'Renderer/Texture', - 'Renderer/WebGLConstants', 'Scene/Camera', 'Scene/EllipsoidSurfaceAppearance', 'Scene/FrameState', @@ -47,13 +47,13 @@ defineSuite([ Rectangle, RectangleGeometry, RuntimeError, + WebGLConstants, WebMercatorProjection, DrawCommand, Framebuffer, PixelDatatype, ShaderProgram, Texture, - WebGLConstants, Camera, EllipsoidSurfaceAppearance, FrameState, diff --git a/Specs/Scene/ShadowMapSpec.js b/Specs/Scene/ShadowMapSpec.js index 5330c1c48417..95d3b828297c 100644 --- a/Specs/Scene/ShadowMapSpec.js +++ b/Specs/Scene/ShadowMapSpec.js @@ -17,11 +17,11 @@ defineSuite([ 'Core/Math', 'Core/PixelFormat', 'Core/Transforms', + 'Core/WebGLConstants', 'Renderer/Context', 'Renderer/Framebuffer', 'Renderer/PixelDatatype', 'Renderer/Texture', - 'Renderer/WebGLConstants', 'Scene/Camera', 'Scene/Globe', 'Scene/Model', @@ -50,11 +50,11 @@ defineSuite([ CesiumMath, PixelFormat, Transforms, + WebGLConstants, Context, Framebuffer, PixelDatatype, Texture, - WebGLConstants, Camera, Globe, Model, @@ -900,7 +900,7 @@ defineSuite([ render(); expect(scene.frameState.commandList.length).toBe(0); }); - + it('enable fitNearFar', function() { box.show = true; floor.show = true; From 5f93bf13640ce8d781633281bb4a86f5ccd95dcc Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Tue, 6 Dec 2016 17:35:55 -0500 Subject: [PATCH 144/396] Reorganized silhouetting --- .../gallery/3D Models Coloring.html | 64 ++- .../development/3D Models Outline.html | 184 -------- .../gallery/development/3D Models Outline.jpg | Bin 11892 -> 0 bytes Source/DataSources/CzmlDataSource.js | 2 + Source/DataSources/ModelGraphics.js | 46 +- Source/DataSources/ModelVisualizer.js | 10 +- Source/Renderer/Context.js | 13 + Source/Scene/ColorBlendMode.js | 3 + Source/Scene/GroundPrimitive.js | 2 +- Source/Scene/Model.js | 420 +++++++++++------- Specs/DataSources/CzmlDataSourceSpec.js | 16 +- Specs/DataSources/ModelGraphicsSpec.js | 55 +-- Specs/Scene/ModelSpec.js | 2 - 13 files changed, 388 insertions(+), 429 deletions(-) delete mode 100644 Apps/Sandcastle/gallery/development/3D Models Outline.html delete mode 100644 Apps/Sandcastle/gallery/development/3D Models Outline.jpg diff --git a/Apps/Sandcastle/gallery/3D Models Coloring.html b/Apps/Sandcastle/gallery/3D Models Coloring.html index e67783ba0e80..979c9a6f955a 100644 --- a/Apps/Sandcastle/gallery/3D Models Coloring.html +++ b/Apps/Sandcastle/gallery/3D Models Coloring.html @@ -29,11 +29,15 @@ padding-top: 2px; padding-bottom: 2px; } + #toolbar .header { + font-weight: bold; + }

Loading...

+ @@ -56,6 +60,25 @@ + + + + + + + + + + + + +
Model Color
Mode
Model Silhouette
Color
Alpha + + +
Size + + +
- - - - - -
-

Loading...

-
- - - - - - - - - - - -
Size - - -
Opacity - - -
-
- - - diff --git a/Apps/Sandcastle/gallery/development/3D Models Outline.jpg b/Apps/Sandcastle/gallery/development/3D Models Outline.jpg deleted file mode 100644 index 571d9866731e8ffdcfd69aad0b4944b0a76e964b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11892 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 BD^>si diff --git a/Source/DataSources/CzmlDataSource.js b/Source/DataSources/CzmlDataSource.js index 02b3b7ca4bd5..db63ab5830ef 100644 --- a/Source/DataSources/CzmlDataSource.js +++ b/Source/DataSources/CzmlDataSource.js @@ -1417,6 +1417,8 @@ define([ processPacketData(Boolean, model, 'runAnimations', modelData.runAnimations, interval, sourceUri, entityCollection); processPacketData(ShadowMode, model, 'shadows', modelData.shadows, interval, sourceUri, entityCollection); processPacketData(HeightReference, model, 'heightReference', modelData.heightReference, interval, sourceUri, entityCollection); + processPacketData(Color, model, 'silhouetteColor', modelData.silhouetteColor, interval, sourceUri, entityCollection); + processPacketData(Number, model, 'silhouetteSize', modelData.silhouetteSize, interval, sourceUri, entityCollection); processPacketData(Color, model, 'color', modelData.color, interval, sourceUri, entityCollection); processPacketData(ColorBlendMode, model, 'colorBlendMode', modelData.colorBlendMode, interval, sourceUri, entityCollection); processPacketData(Number, model, 'colorBlendAmount', modelData.colorBlendAmount, interval, sourceUri, entityCollection); diff --git a/Source/DataSources/ModelGraphics.js b/Source/DataSources/ModelGraphics.js index 4a520173fdff..766d60064855 100644 --- a/Source/DataSources/ModelGraphics.js +++ b/Source/DataSources/ModelGraphics.js @@ -49,10 +49,9 @@ define([ * @param {Property} [options.nodeTransformations] An object, where keys are names of nodes, and values are {@link TranslationRotationScale} Properties describing the transformation to apply to that node. * @param {Property} [options.shadows=ShadowMode.ENABLED] An enum Property specifying whether the model casts or receives shadows from each light source. * @param {Property} [options.heightReference=HeightReference.NONE] A Property specifying what the height is relative to. - * @param {Property} [options.highlight=false] Whether to highlight the model using an outline - * @param {Property} [options.highlightColor=new Color())] The highlight color for the outline. - * @param {Property} [options.highlightSize=2] The size of the highlight in pixels * @param {Property} [options.distanceDisplayCondition] A Property specifying at what distance from the camera that this model will be displayed. + * @param {Property} [options.silhouetteColor=Color.RED] A Property specifying the {@link Color} of the silhouette. + * @param {Property} [options.silhouetteSize=0.0] A numeric Property specifying the size of the silhouette in pixels. * @param {Property} [options.color=Color.WHITE] A Property specifying the {@link Color} that blends with the model's rendered color. * @param {Property} [options.colorBlendMode=ColorBlendMode.HIGHLIGHT] An enum Property specifying how the color blends with the model. * @param {Property} [options.colorBlendAmount=0.5] A numeric Property specifying the color strength when the colorBlendMode is MIX. A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with any value in-between resulting in a mix of the two. @@ -81,11 +80,12 @@ define([ this._nodeTransformationsSubscription = undefined; this._heightReference = undefined; this._heightReferenceSubscription = undefined; - this._highlight = undefined; - this._highlightColor = undefined; - this._highlightSize = undefined; this._distanceDisplayCondition = undefined; this._distanceDisplayConditionSubscription = undefined; + this._silhouetteColor = undefined; + this._silhouetteColorSubscription = undefined; + this._silhouetteSize = undefined; + this._silhouetteSizeSubscription = undefined; this._color = undefined; this._colorSubscription = undefined; this._colorBlendMode = undefined; @@ -197,35 +197,27 @@ define([ heightReference : createPropertyDescriptor('heightReference'), /** - * Gets or sets the boolean Property specifying whether this model should be highlighted or not. + * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this model will be displayed. * @memberof ModelGraphics.prototype * @type {Property} - * @default false */ - highlight: createPropertyDescriptor('highlight'), + distanceDisplayCondition : createPropertyDescriptor('distanceDisplayCondition'), /** - * Gets or sets the Color Property specifying the highlight color of this model. + * Gets or sets the Property specifying the {@link Color} of the silhouette. * @memberof ModelGraphics.prototype * @type {Property} - * @default Color() + * @default Color.RED */ - highlightColor: createPropertyDescriptor('highlightColor'), + silhouetteColor: createPropertyDescriptor('silhouetteColor'), /** - * Gets or sets the float Property specifying the size of the highlight of this model in pixels - * @memberof ModelGraphics.prototype - * @type {Property} - * @default 2.0 - */ - highlightSize: createPropertyDescriptor('highlightSize'), - - /* - * Gets or sets the {@link DistanceDisplayCondition} Property specifying at what distance from the camera that this model will be displayed. + * Gets or sets the numeric Property specifying the size of the silhouette in pixels. * @memberof ModelGraphics.prototype * @type {Property} + * @default 0.0 */ - distanceDisplayCondition : createPropertyDescriptor('distanceDisplayCondition'), + silhouetteSize : createPropertyDescriptor('silhouetteSize'), /** * Gets or sets the Property specifying the {@link Color} that blends with the model's rendered color. @@ -274,10 +266,9 @@ define([ result.runAnimations = this.runAnimations; result.nodeTransformations = this.nodeTransformations; result.heightReference = this._heightReference; - result.highlight = this.highlight; - result.highlightColor = this.highlightColor; - result.highlightSize = this.highlightSize; result.distanceDisplayCondition = this.distanceDisplayCondition; + result.silhouetteColor = this.silhouetteColor; + result.silhouetteSize = this.silhouetteSize; result.color = this.color; result.colorBlendMode = this.colorBlendMode; result.colorBlendAmount = this.colorBlendAmount; @@ -307,10 +298,9 @@ define([ this.uri = defaultValue(this.uri, source.uri); this.runAnimations = defaultValue(this.runAnimations, source.runAnimations); this.heightReference = defaultValue(this.heightReference, source.heightReference); - this.highlight = defaultValue(this.highlight, source.highlight); - this.highlightColor = defaultValue(this.highlightColor, source.highlightColor); - this.highlightSize = defaultValue(this.highlightSize, source.highlightSize); this.distanceDisplayCondition = defaultValue(this.distanceDisplayCondition, source.distanceDisplayCondition); + this.silhouetteColor = defaultValue(this.silhouetteColor, source.silhouetteColor); + this.silhouetteSize = defaultValue(this.silhouetteSize, source.silhouetteSize); this.color = defaultValue(this.color, source.color); this.colorBlendMode = defaultValue(this.colorBlendMode, source.colorBlendMode); this.colorBlendAmount = defaultValue(this.colorBlendAmount, source.colorBlendAmount); diff --git a/Source/DataSources/ModelVisualizer.js b/Source/DataSources/ModelVisualizer.js index fae1b8086542..bd00c0ae9829 100644 --- a/Source/DataSources/ModelVisualizer.js +++ b/Source/DataSources/ModelVisualizer.js @@ -36,9 +36,8 @@ define([ var defaultIncrementallyLoadTextures = true; var defaultShadows = ShadowMode.ENABLED; var defaultHeightReference = HeightReference.NONE; - var defaultHighlightColor = new Color(); - var defaultHighlightSize = 2.0; - var defaultHighlight = false; + var defaultSilhouetteColor = Color.RED; + var defaultSilhouetteSize = 0.0; var defaultColor = Color.WHITE; var defaultColorBlendMode = ColorBlendMode.HIGHLIGHT; var defaultColorBlendAmount = 0.5; @@ -149,10 +148,9 @@ define([ model.modelMatrix = Matrix4.clone(modelMatrix, model.modelMatrix); model.shadows = Property.getValueOrDefault(modelGraphics._shadows, time, defaultShadows); model.heightReference = Property.getValueOrDefault(modelGraphics._heightReference, time, defaultHeightReference); - model.highlight = Property.getValueOrDefault(modelGraphics.highlight, time, defaultHighlight); - model.highlightColor = Property.getValueOrDefault(modelGraphics.highlightColor, time, defaultHighlightColor); - model.highlightSize = Property.getValueOrDefault(modelGraphics.highlightSize, time, defaultHighlightSize); model.distanceDisplayCondition = Property.getValueOrUndefined(modelGraphics._distanceDisplayCondition, time); + model.silhouetteColor = Property.getValueOrDefault(modelGraphics.silhouetteColor, time, defaultSilhouetteColor); + model.silhouetteSize = Property.getValueOrDefault(modelGraphics.silhouetteSize, time, defaultSilhouetteSize); model.color = Property.getValueOrDefault(modelGraphics._color, time, defaultColor, color); model.colorBlendMode = Property.getValueOrDefault(modelGraphics._colorBlendMode, time, defaultColorBlendMode); model.colorBlendAmount = Property.getValueOrDefault(modelGraphics._colorBlendAmount, time, defaultColorBlendAmount); diff --git a/Source/Renderer/Context.js b/Source/Renderer/Context.js index ca41b53f505f..2d889140979f 100644 --- a/Source/Renderer/Context.js +++ b/Source/Renderer/Context.js @@ -193,6 +193,7 @@ define([ // Override select WebGL defaults webglOptions.alpha = defaultValue(webglOptions.alpha, false); // WebGL default is true + webglOptions.stencil = defaultValue(webglOptions.stencil, true); // WebGL default is false var defaultToWebgl2 = false; var webgl2Supported = (typeof WebGL2RenderingContext !== 'undefined'); @@ -507,6 +508,18 @@ define([ } }, + /** + * true if the WebGL context supports stencil buffers. + * Stencil buffers are not supported by all systems. + * @memberof Context.prototype + * @type {Boolean} + */ + stencilBuffer : { + get : function() { + return this._stencilBits >= 8; + } + }, + /** * true if the WebGL context supports antialiasing. By default * antialiasing is requested, but it is not supported by all systems. diff --git a/Source/Scene/ColorBlendMode.js b/Source/Scene/ColorBlendMode.js index 224acbb5284e..c020c1dd1248 100644 --- a/Source/Scene/ColorBlendMode.js +++ b/Source/Scene/ColorBlendMode.js @@ -24,6 +24,9 @@ define([ MIX : 2 }; + /** + * @private + */ ColorBlendMode.getColorBlend = function(colorBlendMode, colorBlendAmount) { if (colorBlendMode === ColorBlendMode.HIGHLIGHT) { return 0.0; diff --git a/Source/Scene/GroundPrimitive.js b/Source/Scene/GroundPrimitive.js index c35c4b1828c5..cfcea5ec94e3 100644 --- a/Source/Scene/GroundPrimitive.js +++ b/Source/Scene/GroundPrimitive.js @@ -396,7 +396,7 @@ define([ * @returns {Boolean} true if GroundPrimitives are supported; otherwise, returns false */ GroundPrimitive.isSupported = function(scene) { - return scene.context.fragmentDepth; + return scene.context.fragmentDepth && scene.context.stencilBuffer; }; GroundPrimitive._defaultMaxTerrainHeight = 9000.0; diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 2db592db4b6b..9966118b2ba1 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -324,10 +324,12 @@ define([ * @param {Boolean} [options.debugWireframe=false] For debugging only. Draws the model in wireframe. * @param {HeightReference} [options.heightReference] Determines how the model is drawn relative to terrain. * @param {Scene} [options.scene] Must be passed in for models that use the height reference property. - * @param {DistanceDisplayCondition} [options.istanceDisplayCondition] The condition specifying at what distance from the camera that this model will be displayed. + * @param {DistanceDisplayCondition} [options.distanceDisplayCondition] The condition specifying at what distance from the camera that this model will be displayed. * @param {Color} [options.color=Color.WHITE] A color that blends with the model's rendered color. * @param {ColorBlendMode} [options.colorBlendMode=ColorBlendMode.HIGHLIGHT] Defines how the color blends with the model. * @param {Number} [options.colorBlendAmount=0.5] Value used to determine the color strength when the colorBlendMode is MIX. A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with any value in-between resulting in a mix of the two. + * @param {Color} [options.silhouetteColor=Color.RED] The silhouette color. + * @param {Number} [options.silhouetteSize=0.0] The size of the silhouette in pixels. * * @exception {DeveloperError} bgltf is not a valid Binary glTF file. * @exception {DeveloperError} Only glTF Binary version 1 is supported. @@ -406,31 +408,23 @@ define([ this.show = defaultValue(options.show, true); /** - * Determines if the model will be highlighted. - * - * @type {Boolean} - * - * @default false - */ - this.highlight = defaultValue(options.highlight, false); - - /** - * The highlight color + * The silhouette color. * * @type {Color} * - * @default Color() + * @default Color.RED */ - this.highlightColor = defaultValue(options.highlightColor, new Color()); + this.silhouetteColor = defaultValue(options.silhouetteColor, Color.RED); + this._silhouetteColor = new Color(); /** - * The size of the highlight + * The size of the silhouette in pixels. * - * @type {Float} + * @type {Number} * - * @default 2.0 + * @default 0.0 */ - this.highlightSize = 2.0; + this.silhouetteSize = defaultValue(options.silhouetteSize, 0.0); /** * The 4x4 transformation matrix that transforms the model from model to world coordinates. @@ -558,6 +552,7 @@ define([ * @default Color.WHITE */ this.color = defaultValue(options.color, Color.WHITE); + this._color = new Color(); /** * Defines how the color blends with the model. @@ -658,7 +653,7 @@ define([ vertexArrays : {}, programs : {}, pickPrograms : {}, - highlightPrograms: {}, + silhouettePrograms: {}, textures : {}, samplers : {}, @@ -953,6 +948,20 @@ define([ var sizeOfUint32 = Uint32Array.BYTES_PER_ELEMENT; + function silhouetteSupported(context) { + return context.stencilBuffer; + } + + /** + * Determines if silhouettes are supported. + * + * @param {Scene} scene The scene. + * @returns {Boolean} true if silhouettes are supported; otherwise, returns false + */ + Model.silhouetteSupported = function(scene) { + return silhouetteSupported(scene.context); + }; + /** * This function differs from the normal subarray function * because it takes offset and length, rather than begin and end. @@ -1819,23 +1828,6 @@ define([ return shader; } - function createHighlightVertexShaderSource(vertexShaderSource) { - var renamedVS = ShaderSource.replaceMain(vertexShaderSource, 'czm_old_main'); - // Modified from http://forum.unity3d.com/threads/toon-outline-but-with-diffuse-surface.24668/ - var highlightMain = 'uniform float u_highlightSize;\n' + - 'void main() \n' + - '{ \n' + - ' czm_old_main(); \n' + - ' vec3 n = normalize(v_normal);\n' + - ' n.x *= czm_projection[0][0];\n' + - ' n.y *= czm_projection[1][1];\n' + - ' vec4 clip = gl_Position;\n' + - ' clip.xy += n.xy * clip.w * u_highlightSize / czm_viewport.z * 2.0;\n' + - ' gl_Position = clip;\n' + - '}'; - return renamedVS + '\n' + highlightMain; - } - function createProgram(id, model, context) { var programs = model.gltf.programs; var shaders = model._loadResources.shaders; @@ -1889,20 +1881,6 @@ define([ attributeLocations : attributeLocations }); } - - var highlightVS = createHighlightVertexShaderSource(vs); - var highlightFS = 'uniform vec4 u_highlightColor;\n' + - 'void main() \n' + - '{ \n' + - ' gl_FragColor = u_highlightColor;\n' + - '}'; - - model._rendererResources.highlightPrograms[id] = ShaderProgram.fromCache({ - context : context, - vertexShaderSource : highlightVS, - fragmentShaderSource : highlightFS, - attributeLocations : attributeLocations - }); } function createPrograms(model, context) { @@ -2880,7 +2858,6 @@ define([ u.jointMatrixUniformName = jointMatrixUniformName; } } - } function scaleFromMatrix5Array(matrix) { @@ -2979,15 +2956,15 @@ define([ }; } - function createHighlightColorFunction(model) { + function createSilhouetteColorFunction(model) { return function() { - return model.highlightColor; + return model.silhouetteColor; }; } - function createHighlightSizeFunction(model) { + function createSilhouetteSizeFunction(model) { return function() { - return model.highlightSize; + return model.silhouetteSize; }; } @@ -3014,7 +2991,6 @@ define([ var rendererPrograms = resources.programs; var rendererPickPrograms = resources.pickPrograms; var rendererRenderStates = resources.renderStates; - var rendererhighlightPrograms = resources.highlightPrograms; var uniformMaps = model._uniformMaps; var gltf = model.gltf; @@ -3102,27 +3078,6 @@ define([ var castShadows = ShadowMode.castShadows(model._shadows); var receiveShadows = ShadowMode.receiveShadows(model._shadows); - // Setup the stencil for the first pass - var drawRS = clone(rs); - drawRS.stencilTest = { - enabled : true, - frontFunction : WebGLConstants.ALWAYS, - backFunction : WebGLConstants.ALWAYS, - reference : 1, - mask : ~0, - frontOperation : { - fail : WebGLConstants.KEEP, - zFail : WebGLConstants.KEEP, - zPass : WebGLConstants.REPLACE - }, - backOperation : { - fail : WebGLConstants.KEEP, - zFail : WebGLConstants.KEEP, - zPass : WebGLConstants.REPLACE - } - }; - drawRS = RenderState.fromCache(drawRS); - var command = new DrawCommand({ boundingVolume : new BoundingSphere(), // updated in update() cull : model.cull, @@ -3135,53 +3090,7 @@ define([ castShadows : castShadows, receiveShadows : receiveShadows, uniformMap : uniformMap, - renderState : drawRS, - owner : owner, - pass : isTranslucent ? Pass.TRANSLUCENT : Pass.OPAQUE - }); - - // Setup the stencil command for the highlight - var highlightRS = clone(rs); - highlightRS.stencilTest = { - enabled : true, - frontFunction : WebGLConstants.NOTEQUAL, - backFunction : WebGLConstants.NOTEQUAL, - reference : 1, - mask : ~0, - frontOperation : { - fail : WebGLConstants.KEEP, - zFail : WebGLConstants.KEEP, - zPass : WebGLConstants.REPLACE - }, - backOperation : { - fail : WebGLConstants.KEEP, - zFail : WebGLConstants.KEEP, - zPass : WebGLConstants.REPLACE - } - }; - highlightRS.cull = { - enabled : false - }; - highlightRS.depthTest = false; - highlightRS.blending = BlendingState.ALPHA_BLEND; - - highlightRS = RenderState.fromCache(highlightRS); - - // Setup the highlight color and size uniforms. - uniformMap.u_highlightColor = createHighlightColorFunction(model); - uniformMap.u_highlightSize = createHighlightSizeFunction(model); - - var highlightCommand = new DrawCommand({ - boundingVolume : new BoundingSphere(), // updated in update() - cull : model.cull, - modelMatrix : new Matrix4(), // computed in update() - primitiveType : primitive.mode, - vertexArray : vertexArray, - count : count, - offset : offset, - shaderProgram : rendererhighlightPrograms[technique.program], - uniformMap : uniformMap, - renderState : highlightRS, + renderState : rs, owner : owner, pass : isTranslucent ? Pass.TRANSLUCENT : Pass.OPAQUE }); @@ -3228,21 +3137,16 @@ define([ var command2D; var pickCommand2D; - var highlightCommand2D; if (!scene3DOnly) { command2D = DrawCommand.shallowClone(command); - command2D.boundingVolume = new BoundingSphere(); - command2D.modelMatrix = new Matrix4(); + command2D.boundingVolume = new BoundingSphere(); // updated in update() + command2D.modelMatrix = new Matrix4(); // updated in update() if (allowPicking) { pickCommand2D = DrawCommand.shallowClone(pickCommand); - pickCommand2D.boundingVolume = new BoundingSphere(); - pickCommand2D.modelMatrix = new Matrix4(); + pickCommand2D.boundingVolume = new BoundingSphere(); // updated in update() + pickCommand2D.modelMatrix = new Matrix4(); // updated in update() } - - highlightCommand2D = DrawCommand.shallowClone(highlightCommand); - highlightCommand2D.boundingVolume = new BoundingSphere(); - highlightCommand2D.modelMatrix = new Matrix4(); } var nodeCommand = { @@ -3252,9 +3156,12 @@ define([ pickCommand : pickCommand, command2D : command2D, pickCommand2D : pickCommand2D, - highlightCommand: highlightCommand, - highlightCommand2D: highlightCommand2D, - // Generate on demand when color alpha is less than 1.0 + // Generated on demand when silhouette size is greater than 0.0 and silhouette alpha is greater than 0.0 + silhouetteModelCommand : undefined, + silhouetteModelCommand2D : undefined, + silhouetteColorCommand : undefined, + silhouetteColorCommand2D : undefined, + // Generated on demand when color alpha is less than 1.0 translucentCommand : undefined, translucentCommand2D : undefined }; @@ -3353,6 +3260,7 @@ define([ resources.vertexArrays = cachedResources.vertexArrays; resources.programs = cachedResources.programs; resources.pickPrograms = cachedResources.pickPrograms; + resources.silhouettePrograms = cachedResources.silhouettePrograms; resources.textures = cachedResources.textures; resources.samplers = cachedResources.samplers; resources.renderStates = cachedResources.renderStates; @@ -3453,10 +3361,6 @@ define([ BoundingSphere.clone(command.boundingVolume, pickCommand.boundingVolume); } - var highlightCommand = primitiveCommand.highlightCommand; - Matrix4.clone(command.modelMatrix, highlightCommand.modelMatrix); - BoundingSphere.clone(command.boundingVolume, highlightCommand.boundingVolume); - // If the model crosses the IDL in 2D, it will be drawn in one viewport, but part of it // will be clipped by the viewport. We create a second command that translates the model // model matrix to the opposite side of the map so the part that was clipped in one viewport @@ -3472,10 +3376,6 @@ define([ Matrix4.clone(command.modelMatrix, pickCommand2D.modelMatrix); BoundingSphere.clone(command.boundingVolume, pickCommand2D.boundingVolume); } - - var highlightCommand2D = primitiveCommand.highlightCommand2D; - Matrix4.clone(command.modelMatrix, highlightCommand2D.modelMatrix); - BoundingSphere.clone(command.boundingVolume, highlightCommand2D.boundingVolume); } } } @@ -3659,12 +3559,12 @@ define([ } function updateColor(model, frameState) { + // Generate translucent commands when the blend color has an alpha in the range (0.0, 1.0) exclusive var scene3DOnly = frameState.scene3DOnly; var alpha = model.color.alpha; if ((alpha > 0.0) && (alpha < 1.0)) { var nodeCommands = model._nodeCommands; var length = nodeCommands.length; - // Generate translucent commands when the blend color has an alpha less than 1.0 if (!defined(nodeCommands[0].translucentCommand)) { for (var i = 0; i < length; ++i) { var nodeCommand = nodeCommands[i]; @@ -3679,6 +3579,197 @@ define([ } } + function getProgramId(model, program) { + var programs = model._rendererResources.programs; + for (var id in programs) { + if (programs.hasOwnProperty(id)) { + if (programs[id] === program) { + return id; + } + } + } + } + + function createSilhouetteProgram(program, frameState) { + var vs = program.vertexShaderSource.sources[0]; + var attributeLocations = program._attributeLocations; + + // Modified from http://forum.unity3d.com/threads/toon-outline-but-with-diffuse-surface.24668/ + vs = ShaderSource.replaceMain(vs, 'gltf_silhouette_main'); + vs += + 'uniform float gltf_silhouetteSize;\n' + + 'void main() \n' + + '{ \n' + + ' gltf_silhouette_main(); \n' + + ' vec3 n = normalize(v_normal);\n' + + ' n.x *= czm_projection[0][0];\n' + + ' n.y *= czm_projection[1][1];\n' + + ' vec4 clip = gl_Position;\n' + + ' clip.xy += n.xy * clip.w * gltf_silhouetteSize / czm_viewport.z * 2.0;\n' + + ' gl_Position = clip;\n' + + '}'; + + var fs = + 'uniform vec4 gltf_silhouetteColor;\n' + + 'void main() \n' + + '{ \n' + + ' gl_FragColor = gltf_silhouetteColor;\n' + + '}'; + + return ShaderProgram.fromCache({ + context : frameState.context, + vertexShaderSource : vs, + fragmentShaderSource : fs, + attributeLocations : attributeLocations + }); + } + + function hasSilhouette(model, frameState) { + return silhouetteSupported(frameState.context) && (model.silhouetteSize > 0.0) && (model.silhouetteColor.alpha > 0.0); + } + + function isTranslucent(model) { + return (model.color.alpha > 0.0) && (model.color.alpha < 1.0); + } + + function isInvisible(model) { + return (model.color.alpha === 0.0); + } + + function alphaDirty(currAlpha, prevAlpha) { + // Returns whether the alpha state has changed between invisible, translucent, or opaque + return (Math.floor(currAlpha) !== Math.floor(prevAlpha)) || (Math.ceil(currAlpha) !== Math.ceil(prevAlpha)); + } + + function updateSilhouette(model, frameState) { + // Generate silhouette commands when the silhouette size is greater than 0.0 and the alpha is greater than 0.0 + // There are two silhouette commands: + // 1. silhouetteModelCommand : render model normally while enabling stencil mask + // 2. silhouetteColorCommand : render enlarged model with a solid color while enabling stencil tests + if (!hasSilhouette(model, frameState)) { + return; + } + + var nodeCommands = model._nodeCommands; + var dirty = alphaDirty(model.color.alpha, model._color.alpha) || + alphaDirty(model.silhouetteColor.alpha, model._silhouetteColor.alpha) || + !defined(nodeCommands[0].silhouetteModelCommand); + + Color.clone(model.color, model._color); + Color.clone(model.silhouetteColor, model._silhouetteColor); + + if (!dirty) { + return; + } + + var silhouettePrograms = model._rendererResources.silhouettePrograms; + var scene3DOnly = frameState.scene3DOnly; + var length = nodeCommands.length; + for (var i = 0; i < length; ++i) { + var nodeCommand = nodeCommands[i]; + var command = nodeCommand.command; + + // Create model command + var modelCommand = isTranslucent(model) ? nodeCommand.translucentCommand : command; + var silhouetteModelCommand = DrawCommand.shallowClone(modelCommand); + var renderState = clone(modelCommand.renderState); + renderState.stencilTest = { + enabled : true, + frontFunction : WebGLConstants.ALWAYS, + backFunction : WebGLConstants.ALWAYS, + reference : 1, + mask : ~0, + frontOperation : { + fail : WebGLConstants.KEEP, + zFail : WebGLConstants.KEEP, + zPass : WebGLConstants.REPLACE + }, + backOperation : { + fail : WebGLConstants.KEEP, + zFail : WebGLConstants.KEEP, + zPass : WebGLConstants.REPLACE + } + }; + + if (isInvisible(model)) { + // Disable color and depth writes but still write into the stencil buffer + renderState.colorMask = { + red : false, + green : false, + blue : false, + alpha : false + }; + renderState.depthMask = false; + } + renderState = RenderState.fromCache(renderState); + silhouetteModelCommand.renderState = renderState; + nodeCommand.silhouetteModelCommand = silhouetteModelCommand; + + // Create color command + var silhouetteColorCommand = DrawCommand.shallowClone(command); + renderState = clone(command.renderState, true); + if (model.silhouetteColor.alpha < 1.0) { + silhouetteColorCommand.pass = Pass.TRANSLUCENT; + renderState.depthMask = false; + renderState.blending = BlendingState.ALPHA_BLEND; + } + renderState.depthTest.enabled = true; + renderState.cull.enabled = false; + renderState.stencilTest = { + enabled : true, + frontFunction : WebGLConstants.NOTEQUAL, + backFunction : WebGLConstants.NOTEQUAL, + reference : 1, + mask : ~0, + frontOperation : { + fail : WebGLConstants.KEEP, + zFail : WebGLConstants.KEEP, + zPass : WebGLConstants.REPLACE + }, + backOperation : { + fail : WebGLConstants.KEEP, + zFail : WebGLConstants.KEEP, + zPass : WebGLConstants.REPLACE + } + }; + renderState = RenderState.fromCache(renderState); + + // If the silhouette program has already been cached use it + var program = command.shaderProgram; + var id = getProgramId(model, program); + var silhouetteProgram = silhouettePrograms[id]; + if (!defined(silhouetteProgram)) { + silhouetteProgram = createSilhouetteProgram(program, frameState); + silhouettePrograms[id] = silhouetteProgram; + } + + var silhouetteUniformMap = combine(command.uniformMap, { + gltf_silhouetteColor : createSilhouetteColorFunction(model), + gltf_silhouetteSize : createSilhouetteSizeFunction(model) + }); + + silhouetteColorCommand.renderState = renderState; + silhouetteColorCommand.shaderProgram = silhouetteProgram; + silhouetteColorCommand.uniformMap = silhouetteUniformMap; + silhouetteColorCommand.castShadows = false; + silhouetteColorCommand.receiveShadows = false; + nodeCommand.silhouetteColorCommand = silhouetteColorCommand; + + if (!scene3DOnly) { + var command2D = nodeCommand.command2D; + var silhouetteModelCommand2D = DrawCommand.shallowClone(silhouetteModelCommand); + silhouetteModelCommand2D.boundingVolume = command2D.boundingVolume; + silhouetteModelCommand2D.modelMatrix = command2D.modelMatrix; + nodeCommand.silhouetteModelCommand2D = silhouetteModelCommand2D; + + var silhouetteColorCommand2D = DrawCommand.shallowClone(silhouetteColorCommand); + silhouetteModelCommand2D.boundingVolume = command2D.boundingVolume; + silhouetteModelCommand2D.modelMatrix = command2D.modelMatrix; + nodeCommand.silhouetteColorCommand2D = silhouetteColorCommand2D; + } + } + } + var scratchBoundingSphere = new BoundingSphere(); function scaleInPixels(positionWC, radius, frameState) { @@ -3758,6 +3849,7 @@ define([ this.vertexArrays = undefined; this.programs = undefined; this.pickPrograms = undefined; + this.silhouettePrograms = undefined; this.textures = undefined; this.samplers = undefined; this.renderStates = undefined; @@ -3781,6 +3873,7 @@ define([ destroy(resources.vertexArrays); destroy(resources.programs); destroy(resources.pickPrograms); + destroy(resources.silhouettePrograms); destroy(resources.textures); } @@ -4013,9 +4106,11 @@ define([ } } - var alpha = this.color.alpha; + var silhouette = hasSilhouette(this, frameState); + var translucent = isTranslucent(this); + var invisible = isInvisible(this); var displayConditionPassed = defined(this.distanceDisplayCondition) ? distanceDisplayConditionVisible(this, frameState) : true; - var show = this.show && displayConditionPassed && (this.scale !== 0.0) && (alpha > 0.0); + var show = this.show && displayConditionPassed && (this.scale !== 0.0) && (!invisible || silhouette); if ((show && this._state === ModelState.LOADED) || justLoaded) { var animated = this.activeAnimations.update(frameState) || this._cesiumAnimationsDirty; @@ -4075,6 +4170,7 @@ define([ updateShowBoundingVolume(this); updateShadows(this); updateColor(this, frameState); + updateSilhouette(this, frameState); } if (justLoaded) { @@ -4103,43 +4199,35 @@ define([ var boundingVolume; if (passes.render) { - - // The actual render commands for (i = 0; i < length; ++i) { nc = nodeCommands[i]; if (nc.show) { - var translucent = (alpha < 1.0); var command = translucent ? nc.translucentCommand : nc.command; + command = silhouette ? nc.silhouetteModelCommand : command; commandList.push(command); boundingVolume = nc.command.boundingVolume; if (frameState.mode === SceneMode.SCENE2D && (boundingVolume.center.y + boundingVolume.radius > idl2D || boundingVolume.center.y - boundingVolume.radius < idl2D)) { var command2D = translucent ? nc.translucentCommand2D : nc.command2D; + command2D = silhouette ? nc.silhouetteModelCommand2D : command2D; commandList.push(command2D); } } } - if (this.highlight) { - - // Only render the highlight commands if we have sufficient stencil bits. - if (context.stencilBits > 0) { - // highlight commands second. - for (i = 0; i < length; ++i) { - nc = nodeCommands[i]; - if (nc.show) { - commandList.push(nc.highlightCommand); - boundingVolume = nc.command.boundingVolume; - if (frameState.mode === SceneMode.SCENE2D && - (boundingVolume.center.y + boundingVolume.radius > idl2D || boundingVolume.center.y - boundingVolume.radius < idl2D)) { - commandList.push(nc.highlightCommand2D); - } + if (silhouette) { + // Render second silhouette pass + for (i = 0; i < length; ++i) { + nc = nodeCommands[i]; + if (nc.show) { + commandList.push(nc.silhouetteColorCommand); + boundingVolume = nc.command.boundingVolume; + if (frameState.mode === SceneMode.SCENE2D && + (boundingVolume.center.y + boundingVolume.radius > idl2D || boundingVolume.center.y - boundingVolume.radius < idl2D)) { + commandList.push(nc.silhouetteColorCommand2D); } } } - else { - console.log("Model highlighting not supported, stencilBits = " + context.stencilBits + ". Request a stencil buffer when initializing the Viewer"); - } } } diff --git a/Specs/DataSources/CzmlDataSourceSpec.js b/Specs/DataSources/CzmlDataSourceSpec.js index b3be324ede7e..0c19ed092c3e 100644 --- a/Specs/DataSources/CzmlDataSourceSpec.js +++ b/Specs/DataSources/CzmlDataSourceSpec.js @@ -1839,7 +1839,11 @@ defineSuite([ gltf : './Data/Models/Box/CesiumBoxTest.gltf', incrementallyLoadTextures : true, shadows : 'ENABLED', - heightReference: 'CLAMP_TO_GROUND', + heightReference : 'CLAMP_TO_GROUND', + silhouetteColor : { + rgbaf : [1.0, 0.0, 0.0, 1.0] + }, + silhouetteSize : 2.0, color : { rgbaf : [0.0, 1.0, 0.0, 0.2] }, @@ -1874,6 +1878,8 @@ defineSuite([ expect(entity.model.incrementallyLoadTextures.getValue(Iso8601.MINIMUM_VALUE)).toEqual(true); expect(entity.model.shadows.getValue(Iso8601.MINIMUM_VALUE)).toEqual(ShadowMode.ENABLED); expect(entity.model.heightReference.getValue(Iso8601.MINIMUM_VALUE)).toEqual(HeightReference.CLAMP_TO_GROUND); + expect(entity.model.silhouetteColor.getValue(Iso8601.MINIMUM_VALUE)).toEqual(new Color(1.0, 0.0, 0.0, 1.0)); + expect(entity.model.silhouetteSize.getValue(Iso8601.MINIMUM_VALUE)).toEqual(2.0); expect(entity.model.color.getValue(Iso8601.MINIMUM_VALUE)).toEqual(new Color(0.0, 1.0, 0.0, 0.2)); expect(entity.model.colorBlendMode.getValue(Iso8601.MINIMUM_VALUE)).toEqual(ColorBlendMode.HIGHLIGHT); expect(entity.model.colorBlendAmount.getValue(Iso8601.MINIMUM_VALUE)).toEqual(0.5); @@ -1903,6 +1909,10 @@ defineSuite([ incrementallyLoadTextures : true, shadows : 'ENABLED', heightReference: 'CLAMP_TO_GROUND', + silhouetteColor : { + rgbaf : [1.0, 0.0, 0.0, 1.0] + }, + silhouetteSize : 2.0, color : { rgbaf : [0.0, 1.0, 0.0, 0.2] }, @@ -1941,6 +1951,8 @@ defineSuite([ expect(entity.model.incrementallyLoadTextures.getValue(validTime)).toEqual(true); expect(entity.model.shadows.getValue(validTime)).toEqual(ShadowMode.ENABLED); expect(entity.model.heightReference.getValue(validTime)).toEqual(HeightReference.CLAMP_TO_GROUND); + expect(entity.model.silhouetteColor.getValue(validTime)).toEqual(new Color(1.0, 0.0, 0.0, 1.0)); + expect(entity.model.silhouetteSize.getValue(validTime)).toEqual(2.0); expect(entity.model.color.getValue(validTime)).toEqual(new Color(0.0, 1.0, 0.0, 0.2)); expect(entity.model.colorBlendMode.getValue(validTime)).toEqual(ColorBlendMode.HIGHLIGHT); expect(entity.model.colorBlendAmount.getValue(validTime)).toEqual(0.5); @@ -1966,6 +1978,8 @@ defineSuite([ expect(entity.model.shadows.getValue(invalidTime)).toBeUndefined(); expect(entity.model.heightReference.getValue(invalidTime)).toBeUndefined(); expect(entity.model.color.getValue(invalidTime)).toBeUndefined(); + expect(entity.model.silhouetteColor.getValue(invalidTime)).toBeUndefined(); + expect(entity.model.silhouetteSize.getValue(invalidTime)).toBeUndefined(); expect(entity.model.colorBlendMode.getValue(invalidTime)).toBeUndefined(); expect(entity.model.colorBlendAmount.getValue(invalidTime)).toBeUndefined(); diff --git a/Specs/DataSources/ModelGraphicsSpec.js b/Specs/DataSources/ModelGraphicsSpec.js index a6d7bb074761..34fe22724987 100644 --- a/Specs/DataSources/ModelGraphicsSpec.js +++ b/Specs/DataSources/ModelGraphicsSpec.js @@ -39,9 +39,8 @@ defineSuite([ shadows : ShadowMode.DISABLED, heightReference : HeightReference.CLAMP_TO_GROUND, distanceDisplayCondition : new DistanceDisplayCondition(), - highlight: false, - highlightSize: 3.0, - highlightColor: new Color(1.0, 0.0, 0.0, 1.0), + silhouetteColor : new Color(1.0, 0.0, 0.0, 1.0), + silhouetteSize : 3.0, color : new Color(0.0, 1.0, 0.0, 0.2), colorBlendMode : ColorBlendMode.HIGHLIGHT, colorBlendAmount : 0.5, @@ -64,13 +63,12 @@ defineSuite([ expect(model.shadows).toBeInstanceOf(ConstantProperty); expect(model.heightReference).toBeInstanceOf(ConstantProperty); expect(model.distanceDisplayCondition).toBeInstanceOf(ConstantProperty); + expect(model.silhouetteColor).toBeInstanceOf(ConstantProperty); + expect(model.silhouetteSize).toBeInstanceOf(ConstantProperty); expect(model.color).toBeInstanceOf(ConstantProperty); expect(model.colorBlendMode).toBeInstanceOf(ConstantProperty); expect(model.colorBlendAmount).toBeInstanceOf(ConstantProperty); expect(model.runAnimations).toBeInstanceOf(ConstantProperty); - expect(model.highlight).toBeInstanceOf(ConstantProperty); - expect(model.highlightSize).toBeInstanceOf(ConstantProperty); - expect(model.highlightColor).toBeInstanceOf(ConstantProperty); expect(model.nodeTransformations).toBeInstanceOf(PropertyBag); @@ -83,13 +81,12 @@ defineSuite([ expect(model.shadows.getValue()).toEqual(options.shadows); expect(model.heightReference.getValue()).toEqual(options.heightReference); expect(model.distanceDisplayCondition.getValue()).toEqual(options.distanceDisplayCondition); + expect(model.silhouetteColor.getValue()).toEqual(options.silhouetteColor); + expect(model.silhouetteSize.getValue()).toEqual(options.silhouetteSize); expect(model.color.getValue()).toEqual(options.color); expect(model.colorBlendMode.getValue()).toEqual(options.colorBlendMode); expect(model.colorBlendAmount.getValue()).toEqual(options.colorBlendAmount); expect(model.runAnimations.getValue()).toEqual(options.runAnimations); - expect(model.highlight.getValue()).toEqual(options.highlight); - expect(model.highlightSize.getValue()).toEqual(options.highlightSize); - expect(model.highlightColor.getValue()).toEqual(options.highlightColor); var actualNodeTransformations = model.nodeTransformations.getValue(new JulianDate()); var expectedNodeTransformations = options.nodeTransformations; @@ -109,11 +106,10 @@ defineSuite([ source.maximumScale = new ConstantProperty(200.0); source.incrementallyLoadTextures = new ConstantProperty(true); source.shadows = new ConstantProperty(ShadowMode.ENABLED); - source.highlight = new ConstantProperty(true); - source.highlightSize = new ConstantProperty(3.0); - source.highlightColor = new ConstantProperty(new Color(1.0, 0.0, 0.0, 1.0)); source.heightReference = new ConstantProperty(HeightReference.CLAMP_TO_GROUND); source.distanceDisplayCondition = new ConstantProperty(new DistanceDisplayCondition()); + source.silhouetteColor = new ConstantProperty(new Color(1.0, 0.0, 0.0, 1.0)); + source.silhouetteSize = new ConstantProperty(3.0); source.color = new ConstantProperty(new Color(0.0, 1.0, 0.0, 0.2)); source.colorBlendMode = new ConstantProperty(ColorBlendMode.HIGHLIGHT); source.colorBlendAmount = new ConstantProperty(0.5); @@ -141,14 +137,13 @@ defineSuite([ expect(target.shadows).toBe(source.shadows); expect(target.heightReference).toBe(source.heightReference); expect(target.distanceDisplayCondition).toBe(source.distanceDisplayCondition); + expect(target.silhouetteColor).toEqual(source.silhouetteColor); + expect(target.silhouetteSize).toEqual(source.silhouetteSize); expect(target.color).toBe(source.color); expect(target.colorBlendMode).toBe(source.colorBlendMode); expect(target.colorBlendAmount).toBe(source.colorBlendAmount); expect(target.runAnimations).toBe(source.runAnimations); expect(target.nodeTransformations).toEqual(source.nodeTransformations); - expect(target.highlight).toEqual(source.highlight); - expect(target.highlightSize).toEqual(source.highlightSize); - expect(target.highlightColor).toEqual(source.highlightColor); }); it('merge does not assign assigned properties', function() { @@ -162,6 +157,8 @@ defineSuite([ source.shadows = new ConstantProperty(ShadowMode.ENABLED); source.heightReference = new ConstantProperty(HeightReference.CLAMP_TO_GROUND); source.distanceDisplayCondition = new ConstantProperty(new DistanceDisplayCondition()); + source.silhouetteColor = new ConstantProperty(new Color()); + source.silhouetteSize = new ConstantProperty(1.0); source.color = new ConstantProperty(new Color(0.0, 1.0, 0.0, 0.2)); source.colorBlendMode = new ConstantProperty(ColorBlendMode.HIGHLIGHT); source.colorBlendAmount = new ConstantProperty(0.5); @@ -169,9 +166,6 @@ defineSuite([ source.nodeTransformations = { transform : new NodeTransformationProperty() }; - source.highlight = new ConstantProperty(true); - source.highlightSize = new ConstantProperty(1.0); - source.highlightColor = new ConstantProperty(new Color()); var uri = new ConstantProperty(''); var show = new ConstantProperty(true); @@ -182,6 +176,8 @@ defineSuite([ var shadows = new ConstantProperty(ShadowMode.ENABLED); var heightReference = new ConstantProperty(HeightReference.CLAMP_TO_GROUND); var distanceDisplayCondition = new ConstantProperty(new DistanceDisplayCondition()); + var silhouetteColor = new ConstantProperty(new Color()); + var silhouetteSize = new ConstantProperty(1.0); var color = new ConstantProperty(new Color(0.0, 1.0, 0.0, 0.2)); var colorBlendMode = new ConstantProperty(ColorBlendMode.HIGHLIGHT); var colorBlendAmount = new ConstantProperty(0.5); @@ -189,9 +185,6 @@ defineSuite([ var nodeTransformations = new PropertyBag({ transform : new NodeTransformationProperty() }); - var highlight = new ConstantProperty(true); - var highlightSize = new ConstantProperty(1.0); - var highlightColor = new ConstantProperty(new Color()); var target = new ModelGraphics(); target.uri = uri; @@ -203,14 +196,13 @@ defineSuite([ target.shadows = shadows; target.heightReference = heightReference; target.distanceDisplayCondition = distanceDisplayCondition; + target.silhouetteColor = silhouetteColor; + target.silhouetteSize = silhouetteSize; target.color = color; target.colorBlendMode = colorBlendMode; target.colorBlendAmount = colorBlendAmount; target.runAnimations = runAnimations; target.nodeTransformations = nodeTransformations; - target.highlight = highlight; - target.highlightSize = highlightSize; - target.highlightColor = highlightColor; target.merge(source); @@ -223,14 +215,13 @@ defineSuite([ expect(target.shadows).toBe(shadows); expect(target.heightReference).toBe(heightReference); expect(target.distanceDisplayCondition).toBe(distanceDisplayCondition); + expect(target.silhouetteColor).toBe(silhouetteColor); + expect(target.silhouetteSize).toBe(silhouetteSize); expect(target.color).toBe(color); expect(target.colorBlendMode).toBe(colorBlendMode); expect(target.colorBlendAmount).toBe(colorBlendAmount); expect(target.runAnimations).toBe(runAnimations); expect(target.nodeTransformations).toBe(nodeTransformations); - expect(target.highlight).toBe(highlight); - expect(target.highlightSize).toBe(highlightSize); - expect(target.highlightColor).toBe(highlightColor); }); it('clone works', function() { @@ -244,6 +235,8 @@ defineSuite([ source.shadows = new ConstantProperty(ShadowMode.ENABLED); source.heightReference = new ConstantProperty(HeightReference.CLAMP_TO_GROUND); source.distanceDisplayCondition = new ConstantProperty(new DistanceDisplayCondition()); + source.silhouetteColor = new ConstantProperty(new Color()); + source.silhouetteSize = new ConstantProperty(2.0); source.color = new ConstantProperty(new Color(0.0, 1.0, 0.0, 0.2)); source.colorBlendMode = new ConstantProperty(ColorBlendMode.HIGHLIGHT); source.colorBlendAmount = new ConstantProperty(0.5); @@ -252,9 +245,6 @@ defineSuite([ node1 : new NodeTransformationProperty(), node2 : new NodeTransformationProperty() }; - source.highlight = new ConstantProperty(true); - source.highlightSize = new ConstantProperty(2.0); - source.highlightColor = new ConstantProperty(new Color()); var result = source.clone(); expect(result.uri).toBe(source.uri); @@ -266,14 +256,13 @@ defineSuite([ expect(result.shadows).toBe(source.shadows); expect(result.heightReference).toBe(source.heightReference); expect(result.distanceDisplayCondition).toBe(source.distanceDisplayCondition); + expect(result.silhouetteColor).toEqual(source.silhouetteColor); + expect(result.silhouetteSize).toEqual(source.silhouetteSize); expect(result.color).toBe(source.color); expect(result.colorBlendMode).toBe(source.colorBlendMode); expect(result.colorBlendAmount).toBe(source.colorBlendAmount); expect(result.runAnimations).toBe(source.runAnimations); expect(result.nodeTransformations).toEqual(source.nodeTransformations); - expect(result.highlight).toEqual(source.highlight); - expect(result.highlightSize).toEqual(source.highlightSize); - expect(result.highlightColor).toEqual(source.highlightColor); }); it('merge throws if source undefined', function() { diff --git a/Specs/Scene/ModelSpec.js b/Specs/Scene/ModelSpec.js index fcff616909c0..b23a5699a2e3 100644 --- a/Specs/Scene/ModelSpec.js +++ b/Specs/Scene/ModelSpec.js @@ -10,7 +10,6 @@ defineSuite([ 'Core/combine', 'Core/defined', 'Core/defineProperties', - 'Core/Color', 'Core/DistanceDisplayCondition', 'Core/Ellipsoid', 'Core/Event', @@ -44,7 +43,6 @@ defineSuite([ combine, defined, defineProperties, - Color, DistanceDisplayCondition, Ellipsoid, Event, From 93d4e684b1a63c85e6e1f88a249e2813a3895669 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Wed, 7 Dec 2016 13:48:22 -0500 Subject: [PATCH 145/396] Prevent divide-by-zero during unpremultiply --- Source/Scene/Model.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 9966118b2ba1..5cd6e1be4730 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -1807,8 +1807,17 @@ define([ ' gltf_blend_main(); \n'; // Un-premultiply the alpha so that blending is correct. + + // Avoid divide-by-zero. The code below is equivalent to: + // if (gl_FragColor.a > 0.0) + // { + // gl_FragColor.rgb /= gl_FragColor.a; + // } + if (premultipliedAlpha) { - shader += ' gl_FragColor.rgb /= gl_FragColor.a; \n'; + shader += + ' float alpha = 1.0 - ceil(gl_FragColor.a) + gl_FragColor.a; \n' + + ' gl_FragColor.rgb /= alpha; \n'; } shader += @@ -3601,7 +3610,7 @@ define([ 'void main() \n' + '{ \n' + ' gltf_silhouette_main(); \n' + - ' vec3 n = normalize(v_normal);\n' + + ' vec3 n = v_normal;\n' + ' n.x *= czm_projection[0][0];\n' + ' n.y *= czm_projection[1][1];\n' + ' vec4 clip = gl_Position;\n' + @@ -3692,7 +3701,7 @@ define([ }; if (isInvisible(model)) { - // Disable color and depth writes but still write into the stencil buffer + // When the model is invisible disable color and depth writes but still write into the stencil buffer renderState.colorMask = { red : false, green : false, From 766b21ee5b05d9038e0f6f63feb1bc609e0b7dd6 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Wed, 7 Dec 2016 13:48:43 -0500 Subject: [PATCH 146/396] handle sandcastle demo not found --- Apps/Sandcastle/CesiumSandcastle.js | 17 +++++++++++++++-- gulpfile.js | 9 +++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/Apps/Sandcastle/CesiumSandcastle.js b/Apps/Sandcastle/CesiumSandcastle.js index 59f2a02ba037..c57fec1254cb 100644 --- a/Apps/Sandcastle/CesiumSandcastle.js +++ b/Apps/Sandcastle/CesiumSandcastle.js @@ -1,5 +1,6 @@ /*global require,Blob,JSHINT*/ /*global gallery_demos*/// defined by gallery/gallery-index.js, created by build +/*global hello_world_index*/// defined in gallery/gallery-index.js, created by build /*global sandcastleJsHintOptions*/// defined by jsHintOptions.js, created by build require({ baseUrl : '../../Source', @@ -138,6 +139,7 @@ require({ var subtabs = {}; var docError = false; var galleryError = false; + var notFound = false; var galleryTooltipTimer; var activeGalleryTooltipDemo; var demoTileHeightRule = findCssStyle('.demoTileThumbnail'); @@ -693,6 +695,7 @@ require({ } function loadFromGallery(demo) { + notFound = false; document.getElementById('saveAsFile').download = demo.name + '.html'; registry.byId('description').set('value', decodeHTML(demo.description).replace(/\\n/g, '\n')); registry.byId('label').set('value', decodeHTML(demo.label).replace(/\\n/g, '\n')); @@ -803,6 +806,9 @@ require({ if (galleryError) { appendConsole('consoleError', 'Error loading gallery, please run the build script.', true); } + if (notFound) { + appendConsole('consoleLog', 'Demo at ' + queryObject.src + ' was not found\n', true); + } } } else if (Cesium.defined(e.data.log)) { // Console log messages from the iframe display in Sandcastle. @@ -1054,8 +1060,15 @@ require({ url : 'gallery/' + name + '.html', handleAs : 'text', error : function(error) { - appendConsole('consoleError', error, true); - galleryError = true; + if (error.status === 404) { + loadFromGallery(gallery_demos[hello_world_index]) + .then(function() { + notFound = true; + }); + } else { + galleryError = true; + appendConsole('consoleError', error, true); + } } }); } diff --git a/gulpfile.js b/gulpfile.js index 14c0e2327afc..300a3f27c74e 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1125,8 +1125,10 @@ function createGalleryList() { fileList.push('!Apps/Sandcastle/gallery/development/**/*.html'); } + var helloWorld; globby.sync(fileList).forEach(function(file) { var demo = filePathToModuleId(path.relative('Apps/Sandcastle/gallery', file)); + var demoObject = { name : demo, date : fs.statSync(file).mtime.getTime() @@ -1137,6 +1139,10 @@ function createGalleryList() { } demoObjects.push(demoObject); + + if (demo === 'Hello World') { + helloWorld = demoObject; + } }); demoObjects.sort(function(a, b) { @@ -1149,6 +1155,8 @@ function createGalleryList() { } }); + var helloWorldIndex = demoObjects.indexOf(helloWorld); + var i; for (i = 0; i < demoObjects.length; ++i) { demoJSONs[i] = JSON.stringify(demoObjects[i], null, 2); @@ -1156,6 +1164,7 @@ function createGalleryList() { var contents = '\ // This file is automatically rebuilt by the Cesium build process.\n\ +var hello_world_index = ' + helloWorldIndex + ';\n\ var gallery_demos = [' + demoJSONs.join(', ') + '];'; fs.writeFileSync(output, contents); From cc49261e4ec8d9f2b51b640d2734806b68382389 Mon Sep 17 00:00:00 2001 From: Dave Whipps Date: Wed, 7 Dec 2016 14:02:17 -0500 Subject: [PATCH 147/396] Fixed undefined. --- Source/Scene/LabelCollection.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 1263494df182..0288ec134c48 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -10,6 +10,7 @@ define([ '../Core/writeTextToCanvas', './BillboardCollection', './HorizontalOrigin', + './HeightReference', './Label', './LabelStyle', './TextureAtlas', @@ -25,6 +26,7 @@ define([ writeTextToCanvas, BillboardCollection, HorizontalOrigin, + HeightReference, Label, LabelStyle, TextureAtlas, From 9124a6bb48e750825170a180fe02442dc15c1625 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Wed, 7 Dec 2016 15:03:23 -0500 Subject: [PATCH 148/396] Add geocoder services --- Source/Core/BingMapsGeocoderService.js | 89 +++++++++++++++++++ Source/Core/LongLatGeocoderService.js | 51 +++++++++++ .../OpenStreetMapNominatimGeocoderService.js | 3 + 3 files changed, 143 insertions(+) create mode 100644 Source/Core/BingMapsGeocoderService.js create mode 100644 Source/Core/LongLatGeocoderService.js create mode 100644 Source/Core/OpenStreetMapNominatimGeocoderService.js diff --git a/Source/Core/BingMapsGeocoderService.js b/Source/Core/BingMapsGeocoderService.js new file mode 100644 index 000000000000..8ae8deb2a775 --- /dev/null +++ b/Source/Core/BingMapsGeocoderService.js @@ -0,0 +1,89 @@ +/*global define*/ +define([ + './BingMapsApi', + './defaultValue', + './loadJsonp', + './Rectangle', + '../ThirdParty/when', + './DeveloperError' +], function( + BingMapsApi, + defaultValue, + loadJsonp, + Rectangle, + when, + DeveloperError) { + 'use strict'; + + var url = 'https://dev.virtualearth.net/REST/v1/Locations'; + + /** + * Provides geocoding through Bing Maps. + * @alias BingMapsGeocoderService + * + */ + function BingMapsGeocoderService(options) { + options = defaultValue(options, defaultValue.EMPTY_OBJECT); + this._canceled = false; + this._key = options.key; + + this.autoComplete = defaultValue(options.autoComplete, false); + } + + BingMapsGeocoderService.prototype.cancel = function() { + this._canceled = true; + }; + + /** + * @function + * + * @param {String} query The query to be sent to the geocoder service + * @param {GeocoderCallback} callback Callback to be called with geocoder results + */ + BingMapsGeocoderService.prototype.geocode = function(query, callback) { + this._canceled = false; + + var key = BingMapsApi.getKey(this._key); + var promise = loadJsonp(url, { + parameters : { + query : query, + key : key + }, + callbackParameterName : 'jsonp' + }); + + var that = this; + + when(promise, function(result) { + if (that._canceled) { + return; + } + if (result.resourceSets.length === 0) { + callback(undefined, []); + return; + } + + var results = result.resourceSets[0].resources; + + callback(undefined, results.map(function (resource) { + var bbox = resource.bbox; + var south = bbox[0]; + var west = bbox[1]; + var north = bbox[2]; + var east = bbox[3]; + return { + displayName: resource.name, + rectangle: Rectangle.fromDegrees(west, south, east, north) + }; + })); + + }, function() { + if (that._canceled) { + return; + } + callback(new Error('unknown error when geocoding')); + }); + }; + + return BingMapsGeocoderService; +}); diff --git a/Source/Core/LongLatGeocoderService.js b/Source/Core/LongLatGeocoderService.js new file mode 100644 index 000000000000..b38cacc6b734 --- /dev/null +++ b/Source/Core/LongLatGeocoderService.js @@ -0,0 +1,51 @@ +/*global define*/ +define([ + './Cartesian3', + './defaultValue' +], function( + Cartesian3, + defaultValue) { + 'use strict'; + + /** + * Provides geocoding through Bing Maps. + * @alias LongLatGeocoderService + * + */ + function LongLatGeocoderService(options) { + options = defaultValue(options, defaultValue.EMPTY_OBJECT); + this.autoComplete = false; + } + + LongLatGeocoderService.prototype.cancel = function() { + }; + + /** + * @function + * + * @param {String} query The query to be sent to the geocoder service + * @param {GeocoderCallback} callback Callback to be called with geocoder results + */ + LongLatGeocoderService.prototype.geocode = function(query, callback) { + var splitQuery = query.match(/[^\s,\n]+/g); + if ((splitQuery.length === 2) || (splitQuery.length === 3)) { + var longitude = +splitQuery[0]; + var latitude = +splitQuery[1]; + var height = (splitQuery.length === 3) ? +splitQuery[2] : 300.0; + + if (!isNaN(longitude) && !isNaN(latitude) && !isNaN(height)) { + var result = { + displayName: query, + destination: Cartesian3.fromDegrees(longitude, latitude, height) + }; + callback(undefined, [result]); + return; + } + callback(new Error('invalid coordinates')); + } else { + callback(undefined, []); + } + }; + + return LongLatGeocoderService; +}); diff --git a/Source/Core/OpenStreetMapNominatimGeocoderService.js b/Source/Core/OpenStreetMapNominatimGeocoderService.js new file mode 100644 index 000000000000..7cc24170861d --- /dev/null +++ b/Source/Core/OpenStreetMapNominatimGeocoderService.js @@ -0,0 +1,3 @@ +/** + * Created by erik on 2016-12-07. + */ From ba111133d062a9f3bac44e1fac079abddd5810fb Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Wed, 7 Dec 2016 15:07:45 -0500 Subject: [PATCH 149/396] Add support for multiple geocoders --- Apps/Sandcastle/gallery/Custom Geocoder.html | 32 +-- Source/Core/BingMapsGeocoderService.js | 2 +- Source/Core/GeocoderService.js | 16 +- .../OpenStreetMapNominatimGeocoderService.js | 65 ++++- Source/Widgets/Geocoder/GeocoderViewModel.js | 230 ++++++++---------- Source/Widgets/Viewer/Viewer.js | 2 +- 6 files changed, 182 insertions(+), 165 deletions(-) diff --git a/Apps/Sandcastle/gallery/Custom Geocoder.html b/Apps/Sandcastle/gallery/Custom Geocoder.html index 1c818cbeb70b..c75b7329263e 100644 --- a/Apps/Sandcastle/gallery/Custom Geocoder.html +++ b/Apps/Sandcastle/gallery/Custom Geocoder.html @@ -36,36 +36,10 @@ function startup(Cesium) { 'use strict'; //Sandcastle_Begin -var options = { - geocoder: { - geocode: function (input, callback) { - var endpoint = 'http://nominatim.openstreetmap.org/search?'; - var query = 'format=json&q=' + input; - var requestString = endpoint + query; - Cesium.loadJson(requestString) - .then(function (results) { - var bboxDegrees; - callback(undefined, results.map(function (resultObject) { - bboxDegrees = resultObject.boundingbox; - return { - displayName: resultObject.display_name, - bbox: { - south: bboxDegrees[0], - north: bboxDegrees[1], - west: bboxDegrees[2], - east: bboxDegrees[3] - } - }; - })); - }) - .otherwise(function (err) { - callback(err); - }); - } - } -}; -var viewer = new Cesium.Viewer('cesiumContainer', options); +var viewer = new Cesium.Viewer('cesiumContainer', { + geocoder: new Cesium.OpenStreetMapNominatimGeocoderService() +}); //Sandcastle_End Sandcastle.finishedLoading(); diff --git a/Source/Core/BingMapsGeocoderService.js b/Source/Core/BingMapsGeocoderService.js index 8ae8deb2a775..38a6b3364557 100644 --- a/Source/Core/BingMapsGeocoderService.js +++ b/Source/Core/BingMapsGeocoderService.js @@ -73,7 +73,7 @@ define([ var east = bbox[3]; return { displayName: resource.name, - rectangle: Rectangle.fromDegrees(west, south, east, north) + destination: Rectangle.fromDegrees(west, south, east, north) }; })); diff --git a/Source/Core/GeocoderService.js b/Source/Core/GeocoderService.js index f0ca404d8eba..41e23b76678b 100644 --- a/Source/Core/GeocoderService.js +++ b/Source/Core/GeocoderService.js @@ -13,6 +13,12 @@ define([ * @property {Rectangle} rectangle The bounding box for a location */ + /** + * @typedef {Function} GeocoderCallback + * @param {Error | undefined} error The error that occurred during geocoding + * @param {GeocoderResult[]} [results] + */ + /** * Provides geocoding through an external service. This type describes an interface and * is not intended to be used. @@ -22,6 +28,13 @@ define([ * @see BingMapsGeocoderService */ function GeocoderService () { + /** + * Indicates whether this geocoding service is to be used for autocomplete. + * + * @type {boolean} + * @default false + */ + this.autoComplete = false; } defineProperties(GeocoderService.prototype, { @@ -40,8 +53,7 @@ define([ * @function * * @param {String} query The query to be sent to the geocoder service - * @returns {GeocoderResult[]} geocoderResults An array containing the results from the - * geocoder service + * @param {GeocoderCallback} callback Callback to be called with geocoder results */ GeocoderService.prototype.geocode = DeveloperError.throwInstantiationError; diff --git a/Source/Core/OpenStreetMapNominatimGeocoderService.js b/Source/Core/OpenStreetMapNominatimGeocoderService.js index 7cc24170861d..d08c904818a7 100644 --- a/Source/Core/OpenStreetMapNominatimGeocoderService.js +++ b/Source/Core/OpenStreetMapNominatimGeocoderService.js @@ -1,3 +1,62 @@ -/** - * Created by erik on 2016-12-07. - */ +/*global define*/ +define([ + './Cartesian3', + './defaultValue', + './loadJson', + './Rectangle' +], function( + Cartesian3, + defaultValue, + loadJson, + Rectangle) { + 'use strict'; + + /** + * Provides geocoding through OpenStreetMap Nominatim. + * @alias OpenStreetMapNominatimGeocoder + * + */ + function OpenStreetMapNominatimGeocoder(options) { + options = defaultValue(options, defaultValue.EMPTY_OBJECT); + this.displayName = defaultValue(options.displayName, 'Nominatim'); + this._canceled = false; + this.autoComplete = defaultValue(options.autoComplete, true); + } + + OpenStreetMapNominatimGeocoder.prototype.cancel = function() { + this._canceled = true; + }; + + /** + * @function + * + * @param {String} query The query to be sent to the geocoder service + * @param {GeocoderCallback} callback Callback to be called with geocoder results + */ + OpenStreetMapNominatimGeocoder.prototype.geocode = function (input, callback) { + var endpoint = 'http://nominatim.openstreetmap.org/search?'; + var query = 'format=json&q=' + input; + var requestString = endpoint + query; + loadJson(requestString) + .then(function (results) { + var bboxDegrees; + callback(undefined, results.map(function (resultObject) { + bboxDegrees = resultObject.boundingbox; + return { + displayName: resultObject.display_name, + destination: Rectangle.fromDegrees( + bboxDegrees[2], + bboxDegrees[0], + bboxDegrees[3], + bboxDegrees[1] + ) + }; + })); + }) + .otherwise(function (err) { + callback(err); + }); + }; + + return OpenStreetMapNominatimGeocoder; +}); \ No newline at end of file diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index dee1ec700ce3..7f6f28b43c6d 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -1,23 +1,27 @@ /*global define*/ define([ - '../../Core/BingMapsApi', - '../../Core/Cartesian3', - '../../Core/defaultValue', - '../../Core/defined', - '../../Core/defineProperties', - '../../Core/deprecationWarning', - '../../Core/DeveloperError', - '../../Core/Event', - '../../Core/loadJsonp', - '../../Core/Matrix4', - '../../Core/Rectangle', - '../../Scene/SceneMode', - '../../ThirdParty/knockout', - '../../ThirdParty/when', - '../createCommand', - '../getElement' + '../../Core/BingMapsApi', + '../../Core/BingMapsGeocoderService', + '../../Core/Cartesian3', + '../../Core/defaultValue', + '../../Core/defined', + '../../Core/defineProperties', + '../../Core/deprecationWarning', + '../../Core/DeveloperError', + '../../Core/Event', + '../../Core/LongLatGeocoderService', + '../../Core/loadJsonp', + '../../Core/Matrix4', + '../../Core/OpenStreetMapNominatimGeocoderService', + '../../Core/Rectangle', + '../../Scene/SceneMode', + '../../ThirdParty/knockout', + '../../ThirdParty/when', + '../createCommand', + '../getElement' ], function( BingMapsApi, + BingMapsGeocoderService, Cartesian3, defaultValue, defined, @@ -25,8 +29,10 @@ define([ deprecationWarning, DeveloperError, Event, + LongLatGeocoderService, loadJsonp, Matrix4, + OpenStreetMapNominatimGeocoderService, Rectangle, SceneMode, knockout, @@ -42,6 +48,9 @@ define([ * * @param {Object} options Object with the following properties: * @param {Scene} options.scene The Scene instance to use. + * @param {GeocoderService[]} [geocoderServices] Geocoder services to use for geocoding queries. + * If more than one are supplied, suggestions will be gathered for the geocoders that support it, + * and if no suggestion is selected the result from the first geocoder service wil be used. * @param {String} [options.url='https://dev.virtualearth.net'] The base URL of the Bing Maps API. * @param {String} [options.key] The Bing Maps key for your application, which can be * created at {@link https://www.bingmapsportal.com}. @@ -57,11 +66,17 @@ define([ if (!defined(options) || !defined(options.scene)) { throw new DeveloperError('options.scene is required.'); } - if (defined(options.geocoderService) && !defined(options.geocoderService.geocode)) { - throw new DeveloperError('options.geocoderService is available but missing a geocode method'); - } //>>includeEnd('debug'); + this._geocoderServices = options.geocoderServices; + if (!defined(options.geocoderServices)) { + this._geocoderServices = [ + new LongLatGeocoderService(), + new BingMapsGeocoderService(), + new OpenStreetMapNominatimGeocoderService() + ]; + } + var errorCredit; this._url = defaultValue(options.url, 'https://dev.virtualearth.net/'); if (this._url.length > 0 && this._url[this._url.length - 1] !== '/') { @@ -107,7 +122,7 @@ define([ if (that.isSearchInProgress) { cancelGeocode(that); } else { - geocode(that, options.geocoderService); + geocode(that, that._geocoderServices); } }); @@ -171,20 +186,21 @@ define([ return; } - var geocoderService = options.geocoderService; - if (defined(geocoderService)) { - geocoderService.geocode(query, function (err, results) { + that._suggestions.splice(0, that._suggestions().length); + var geocoderServices = that._geocoderServices.filter(function (service) { + return service.autoComplete === true; + }); + + geocoderServices.forEach(function (service) { + service.geocode(query, function (err, results) { if (defined(err)) { return; } - that._suggestions.splice(0, that._suggestions().length); - if (results.length > 0) { - results.slice(0, Math.min(results.length, 5)).forEach(function (result) { - that._suggestions.push(result); - }); - } + results.slice(0, 3).forEach(function (result) { + that._suggestions.push(result); + }); }); - } + }); }; this.handleKeyDown = function (data, event) { @@ -204,16 +220,16 @@ define([ } else if (key === 40) { that.handleArrowDown(); } else if (key === 13) { - that.activateSuggestion(that._selectedSuggestion()); + that._searchCommand(); } return true; }; this.activateSuggestion = function (data) { that._searchText = data.displayName; - var bbox = data.bbox; + var destination = data.destination; that._suggestions.splice(0, that._suggestions().length); - updateCamera(that, Rectangle.fromDegrees(bbox.west, bbox.south, bbox.east, bbox.north)); + updateCamera(that, destination); }; this.hideSuggestions = function () { @@ -415,122 +431,78 @@ define([ }); } - function geocode(viewModel, geocoderService) { + function createGeocodeCallback(geocodePromise) { + return function (err, results) { + if (defined(err)) { + geocodePromise.resolve(undefined); + return; + } + if (results.length === 0) { + geocodePromise.resolve(undefined); + return; + } + + var firstResult = results[0]; + //>>includeStart('debug', pragmas.debug); + if (!defined(firstResult.displayName)) { + throw new DeveloperError('each result must have a displayName'); + } + if (!defined(firstResult.destination)) { + throw new DeveloperError('each result must have a rectangle'); + } + //>>includeEnd('debug'); + + geocodePromise.resolve({ + displayName: firstResult.displayName, + destination: firstResult.destination + }); + }; + } + function geocode(viewModel, geocoderServices) { var query = viewModel.searchText; if (hasOnlyWhitespace(query)) { return; } - if (defined(geocoderService)) { - viewModel._isSearchInProgress = true; - viewModel._suggestions.splice(0, viewModel._suggestions().length); - geocoderService.geocode(query, function (err, results) { - if (defined(err)) { - viewModel._isSearchInProgress = false; - return; - } - if (results.length === 0) { - viewModel.searchText = query + ' (not found)'; - viewModel._isSearchInProgress = false; - return; - } - - var firstResult = results[0]; - //>>includeStart('debug', pragmas.debug); - if (!defined(firstResult.displayName)) { - throw new DeveloperError('each result must have a displayName'); - } - if (!defined(firstResult.bbox)) { - throw new DeveloperError('each result must have a bbox'); - } - if (!defined(firstResult.bbox.south) || !defined(firstResult.bbox.west) || !defined(firstResult.bbox.north) || !defined(firstResult.bbox.east)) { - throw new DeveloperError('each result must have a bbox where south, west, north and east are defined'); - } - //>>includeEnd('debug'); - - viewModel._searchText = firstResult.displayName; - var bbox = firstResult.bbox; - var south = bbox.south; - var west = bbox.west; - var north = bbox.north; - var east = bbox.east; - - updateCamera(viewModel, Rectangle.fromDegrees(west, south, east, north)); - viewModel._isSearchInProgress = false; - }); - } else { - defaultGeocode(viewModel, query); - } - } - - function defaultGeocode(viewModel, query) { - var defaultOptions = viewModel._defaultGeocoderOptions; + viewModel._geocodeInProgress = true; - // If the user entered (longitude, latitude, [height]) in degrees/meters, - // fly without calling the geocoder. - var splitQuery = query.match(/[^\s,\n]+/g); - if ((splitQuery.length === 2) || (splitQuery.length === 3)) { - var longitude = +splitQuery[0]; - var latitude = +splitQuery[1]; - var height = (splitQuery.length === 3) ? +splitQuery[2] : 300.0; + var resultPromises = []; + for (var i = 0; i < geocoderServices.length; i++) { + var geocoderService = geocoderServices[i]; - if (!isNaN(longitude) && !isNaN(latitude) && !isNaN(height)) { - updateCamera(viewModel, Cartesian3.fromDegrees(longitude, latitude, height)); - return; - } + viewModel._isSearchInProgress = true; + viewModel._suggestions.splice(0, viewModel._suggestions().length); + var geocodePromise = when.defer(); + resultPromises.push(geocodePromise); + geocoderService.geocode(query, createGeocodeCallback(geocodePromise)); } - viewModel._isSearchInProgress = true; - - var promise = loadJsonp(defaultOptions.url + 'REST/v1/Locations', { - parameters : { - query : query, - key : defaultOptions.key - }, - callbackParameterName : 'jsonp' - }); - - var geocodeInProgress = viewModel._geocodeInProgress = when(promise, function(result) { - if (geocodeInProgress.cancel) { - return; - } + var allReady = when.all(resultPromises); + allReady.then(function (results) { viewModel._isSearchInProgress = false; - - if (result.resourceSets.length === 0) { - viewModel.searchText = viewModel._searchText + ' (not found)'; - return; - } - - var resourceSet = result.resourceSets[0]; - if (resourceSet.resources.length === 0) { - viewModel.searchText = viewModel._searchText + ' (not found)'; + if (viewModel._cancelGeocode) { + viewModel._cancelGeocode = false; return; } - - var resource = resourceSet.resources[0]; - - viewModel._searchText = resource.name; - var bbox = resource.bbox; - var south = bbox[0]; - var west = bbox[1]; - var north = bbox[2]; - var east = bbox[3]; - - updateCamera(viewModel, Rectangle.fromDegrees(west, south, east, north)); - }, function() { - if (geocodeInProgress.cancel) { - return; + for (var j = 0; j < results.length; j++) { + if (defined(results[j])) { + viewModel._searchText = results[j].displayName; + updateCamera(viewModel, results[j].destination); + return; + } } - + viewModel._searchText = query + ' (not found)'; + }) + .otherwise(function (err) { viewModel._isSearchInProgress = false; - viewModel.searchText = viewModel._searchText + ' (error)'; + viewModel._searchText = query + ' (not found)'; }); } function cancelGeocode(viewModel) { viewModel._isSearchInProgress = false; if (defined(viewModel._geocodeInProgress)) { - viewModel._geocodeInProgress.cancel = true; + viewModel._cancelGeocode = true; viewModel._geocodeInProgress = undefined; } } diff --git a/Source/Widgets/Viewer/Viewer.js b/Source/Widgets/Viewer/Viewer.js index 67b21c1cf2aa..c2b7aac59014 100644 --- a/Source/Widgets/Viewer/Viewer.js +++ b/Source/Widgets/Viewer/Viewer.js @@ -473,7 +473,7 @@ Either specify options.terrainProvider instead or set options.baseLayerPicker to toolbar.appendChild(geocoderContainer); geocoder = new Geocoder({ container : geocoderContainer, - geocoderService: options.geocoder, + geocoderServices: defined(options.geocoder) ? [options.geocoder] : undefined, scene : cesiumWidget.scene }); // Subscribe to search so that we can clear the trackedEntity when it is clicked. From 7b7e262cca41c8d7e1d13806bfce43480f5578ff Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Wed, 7 Dec 2016 16:46:04 -0500 Subject: [PATCH 150/396] Fix typo. --- Source/Scene/Label.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Source/Scene/Label.js b/Source/Scene/Label.js index c743892f782d..ca1b68d2e8ef 100644 --- a/Source/Scene/Label.js +++ b/Source/Scene/Label.js @@ -909,14 +909,12 @@ define([ for (var i = 0, len = glyphs.length; i < len; i++) { var glyph = glyphs[i]; if (defined(glyph.billboard)) { - // Set all the private values here, because we already clamped to ground - // so we don't want to do it again for every glyph glyph.billboard.clusterShow = value; } } var backgroundBillboard = this._backgroundBillboard; if (defined(backgroundBillboard)) { - backgroundBillboard.cluserShow = value; + backgroundBillboard.clusterShow = value; } } } From 82391da93c54b1bfb3ceb22324de940c216f5fc5 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Wed, 7 Dec 2016 16:49:35 -0500 Subject: [PATCH 151/396] CHANGES.md --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index f7659ea2524a..04869b9c4c50 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,8 @@ Change Log ### 1.29 - 2017-01-02 * Added the ability to blend a `Model` with a color/translucency. Added `color`, `colorBlendMode`, and `colorBlendAmount` properties to `Model`, `ModelGraphics`, and CZML. Added `ColorBlendMode` enum. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) +* Added new `Label` properties `showBackground`, `backgroundColor`, and `backgroundPadding` to the primitive, Entity, and CZML layers. +* Added new enum `VerticalOrigin.BASELINE`. Previously, `VerticalOrigin.BOTTOM` would sometimes align to the baseline depending on the contents of a label. * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) * Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) From 48111c6fea1dccc17a6f8e914d1e84ccc0ba304f Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Wed, 7 Dec 2016 16:37:06 -0500 Subject: [PATCH 152/396] Update tests --- Source/Widgets/Viewer/Viewer.js | 2 +- Specs/Core/BingMapsGeocoderServiceSpec.js | 57 ++++++++++ Specs/Core/LongLatGeocoderServiceSpec.js | 47 ++++++++ ...enStreetMapNominatimGeocoderServiceSpec.js | 38 +++++++ .../Widgets/Geocoder/GeocoderViewModelSpec.js | 100 ++++++++++++------ 5 files changed, 209 insertions(+), 35 deletions(-) create mode 100644 Specs/Core/BingMapsGeocoderServiceSpec.js create mode 100644 Specs/Core/LongLatGeocoderServiceSpec.js create mode 100644 Specs/Core/OpenStreetMapNominatimGeocoderServiceSpec.js diff --git a/Source/Widgets/Viewer/Viewer.js b/Source/Widgets/Viewer/Viewer.js index c2b7aac59014..1d3413031ecd 100644 --- a/Source/Widgets/Viewer/Viewer.js +++ b/Source/Widgets/Viewer/Viewer.js @@ -473,7 +473,7 @@ Either specify options.terrainProvider instead or set options.baseLayerPicker to toolbar.appendChild(geocoderContainer); geocoder = new Geocoder({ container : geocoderContainer, - geocoderServices: defined(options.geocoder) ? [options.geocoder] : undefined, + geocoderServices: defined(options.geocoder) ? (isArray(options.geocoder) ? options.geocoder : [options.geocoder]) : undefined, scene : cesiumWidget.scene }); // Subscribe to search so that we can clear the trackedEntity when it is clicked. diff --git a/Specs/Core/BingMapsGeocoderServiceSpec.js b/Specs/Core/BingMapsGeocoderServiceSpec.js new file mode 100644 index 000000000000..5c68a7804d1c --- /dev/null +++ b/Specs/Core/BingMapsGeocoderServiceSpec.js @@ -0,0 +1,57 @@ +/*global defineSuite*/ +defineSuite([ + 'Core/BingMapsGeocoderService', + 'Core/Cartesian3', + 'Core/loadJsonp', + 'Core/Rectangle' +], function( + BingMapsGeocoderService, + Cartesian3, + loadJsonp, + Rectangle) { + 'use strict'; + + var service = new BingMapsGeocoderService(); + + it('returns geocoder results', function (done) { + var query = 'some query'; + jasmine.createSpy('testSpy', loadJsonp).and.returnValue({ + resourceSets: [{ + resources : [{ + name : 'a', + bbox : [32.0, 3.0, 3.0, 4.0] + }] + }] + }); + service.geocode(query, function(err, results) { + expect(results.length).toEqual(1); + expect(results[0].displayName).toEqual('a'); + expect(results[0].destination).toBeInstanceOf(Rectangle); + done(); + }); + }); + + it('returns no geocoder results if Bing has no results', function (done) { + var query = 'some query'; + jasmine.createSpy('testSpy', loadJsonp).and.returnValue({ + resourceSets: [] + }); + service.geocode(query, function(err, results) { + expect(results.length).toEqual(0); + done(); + }); + }); + + it('returns no geocoder results if Bing has results but no resources', function (done) { + var query = 'some query'; + jasmine.createSpy('testSpy', loadJsonp).and.returnValue({ + resourceSets: [{ + resources: [] + }] + }); + service.geocode(query, function(err, results) { + expect(results.length).toEqual(0); + done(); + }); + }); +}); diff --git a/Specs/Core/LongLatGeocoderServiceSpec.js b/Specs/Core/LongLatGeocoderServiceSpec.js new file mode 100644 index 000000000000..005603c4853b --- /dev/null +++ b/Specs/Core/LongLatGeocoderServiceSpec.js @@ -0,0 +1,47 @@ +/*global defineSuite*/ +defineSuite([ + 'Core/Cartesian3', + 'Core/LongLatGeocoderService' +], function( + Cartesian3, + LongLatGeocoderService) { + 'use strict'; + + var service = new LongLatGeocoderService(); + + it('returns cartesian with matching coordinates for long/lat/height input', function (done) { + var query = ' 1.0, 2.0, 3.0 '; + service.geocode(query, function(err, results) { + expect(results.length).toEqual(1); + expect(results[0]).toEqual(Cartesian3.fromDegrees(1.0, 2.0, 3.0)); + done(); + }); + }); + + it('returns cartesian with matching coordinates for long/lat input', function (done) { + var query = ' 1.0, 2.0 '; + var defaultHeight = 300.0; + service.geocode(query, function(err, results) { + expect(results.length).toEqual(1); + expect(results[0]).toEqual(Cartesian3.fromDegrees(1.0, 2.0, defaultHeight)); + done(); + }); + }); + + it('returns empty array for input with only one number', function (done) { + var query = ' 2.0 '; + service.geocode(query, function(err, results) { + expect(results.length).toEqual(0); + done(); + }); + }); + + it('returns empty array for with string', function (done) { + var query = ' aoeu '; + service.geocode(query, function(err, results) { + expect(results.length).toEqual(0); + done(); + }); + }); + +}); diff --git a/Specs/Core/OpenStreetMapNominatimGeocoderServiceSpec.js b/Specs/Core/OpenStreetMapNominatimGeocoderServiceSpec.js new file mode 100644 index 000000000000..f04086580be1 --- /dev/null +++ b/Specs/Core/OpenStreetMapNominatimGeocoderServiceSpec.js @@ -0,0 +1,38 @@ +/*global defineSuite*/ +defineSuite([ + 'Core/OpenStreetMapNominatimGeocoderService', + 'Core/Cartesian3', + 'Core/loadJsonp', + 'Core/Rectangle' +], function( + OpenStreetMapNominatimGeocoderService, + Cartesian3, + loadJsonp, + Rectangle) { + 'use strict'; + + var service = new OpenStreetMapNominatimGeocoderService(); + + it('returns geocoder results', function (done) { + var query = 'some query'; + jasmine.createSpy('testSpy', loadJsonp).and.returnValue([{ + displayName: 'a', + boundingbox: [10, 20, 0, 20] + }]); + service.geocode(query, function(err, results) { + expect(results.length).toEqual(1); + expect(results[0].displayName).toEqual('a'); + expect(results[0].destination).toBeInstanceOf(Rectangle); + done(); + }); + }); + + it('returns no geocoder results if OSM Nominatim has no results', function (done) { + var query = 'some query'; + jasmine.createSpy('testSpy', loadJsonp).and.returnValue([]); + service.geocode(query, function(err, results) { + expect(results.length).toEqual(0); + done(); + }); + }); +}); \ No newline at end of file diff --git a/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js b/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js index e252cc0cc1e5..4884916e9922 100644 --- a/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js +++ b/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js @@ -14,12 +14,40 @@ defineSuite([ 'use strict'; var scene; + var mockDestination = new Cartesian3(1.0, 2.0, 3.0); + + var geocoderResults1 = [{ + displayName: 'a', + destination: mockDestination + }, { + displayName: 'b', + destination: mockDestination + }]; var customGeocoderOptions = { - geocode : function (input, callback) { - callback(undefined, ['a', 'b', 'c']); - }, - getSuggestions : function (input) { - return ['a', 'b', 'c']; + autoComplete: true, + geocode: function (input, callback) { + callback(undefined, geocoderResults1); + } + }; + + var geocoderResults2 = [{ + displayName: '1', + destination: mockDestination + }, { + displayName: '2', + destination: mockDestination + }]; + var customGeocoderOptions2 = { + autoComplete: true, + geocode: function (input, callback) { + callback(undefined, geocoderResults2); + } + }; + + var noResultsGeocoder = { + autoComplete: true, + geocode: function (input, callback) { + callback(undefined, []); } }; @@ -87,27 +115,6 @@ defineSuite([ }); }); - it('Zooms to longitude, latitude, height', function() { - var viewModel = new GeocoderViewModel({ - scene : scene - }); - - spyOn(Camera.prototype, 'flyTo'); - - viewModel.searchText = ' 1.0, 2.0, 3.0 '; - viewModel.search(); - expect(Camera.prototype.flyTo).toHaveBeenCalled(); - expect(Camera.prototype.flyTo.calls.mostRecent().args[0].destination).toEqual(Cartesian3.fromDegrees(1.0, 2.0, 3.0)); - - viewModel.searchText = '1.0 2.0 3.0'; - viewModel.search(); - expect(Camera.prototype.flyTo.calls.mostRecent().args[0].destination).toEqual(Cartesian3.fromDegrees(1.0, 2.0, 3.0)); - - viewModel.searchText = '-1.0, -2.0'; - viewModel.search(); - expect(Camera.prototype.flyTo.calls.mostRecent().args[0].destination).toEqual(Cartesian3.fromDegrees(-1.0, -2.0, 300.0)); - }); - it('constructor throws without scene', function() { expect(function() { return new GeocoderViewModel(); @@ -117,7 +124,8 @@ defineSuite([ it('raises the complete event camera finished', function() { var viewModel = new GeocoderViewModel({ scene : scene, - flightDuration : 0 + flightDuration : 0, + geocoderServices : [customGeocoderOptions] }); var spyListener = jasmine.createSpy('listener'); @@ -129,7 +137,7 @@ defineSuite([ expect(spyListener.calls.count()).toBe(1); viewModel.flightDuration = 1.5; - viewModel.serachText = '2.0, 2.0'; + viewModel.searchText = '2.0, 2.0'; viewModel.search(); return pollToPromise(function() { @@ -142,7 +150,7 @@ defineSuite([ expect(function() { return new GeocoderViewModel({ scene : scene, - customGeocoder : customGeocoderOptions + geocoderServices : [customGeocoderOptions] }); }).not.toThrowDeveloperError(); }); @@ -150,17 +158,17 @@ defineSuite([ it('automatic suggestions can be retrieved', function() { var geocoder = new GeocoderViewModel({ scene : scene, - customGeocoder : customGeocoderOptions + geocoderServices : [customGeocoderOptions] }); geocoder._searchText = 'some_text'; geocoder.updateSearchSuggestions(); - expect(geocoder._suggestions().length).toEqual(3); + expect(geocoder._suggestions().length).toEqual(2); }); it('update search suggestions results in empty list if the query is empty', function() { var geocoder = new GeocoderViewModel({ scene : scene, - customGeocoder : customGeocoderOptions + geocoderServices : [customGeocoderOptions] }); geocoder._searchText = ''; spyOn(geocoder, '_adjustSuggestionsScroll'); @@ -171,15 +179,39 @@ defineSuite([ it('can activate selected search suggestion', function () { var geocoder = new GeocoderViewModel({ scene : scene, - customGeocoder : customGeocoderOptions + geocoderServices : [customGeocoderOptions] }); spyOn(geocoder, '_updateCamera'); spyOn(geocoder, '_adjustSuggestionsScroll'); - var suggestion = {displayName: 'a', bbox: {west: 0.0, east: 0.1, north: 0.1, south: -0.1}}; + var suggestion = {displayName: 'a', destination: {west: 0.0, east: 0.1, north: 0.1, south: -0.1}}; geocoder._selectedSuggestion(suggestion); geocoder.activateSuggestion(suggestion); expect(geocoder._searchText).toEqual('a'); }); + it('if more than one geocoder service is provided, use first result from first geocode in array order', function () { + var geocoder = new GeocoderViewModel({ + scene : scene, + geocoderServices : [noResultsGeocoder, customGeocoderOptions2] + }); + geocoder._searchText = 'sthsnth'; // an empty query will prevent geocoding + spyOn(geocoder, '_updateCamera'); + spyOn(geocoder, '_adjustSuggestionsScroll'); + geocoder.search(); + expect(geocoder._searchText).toEqual(geocoderResults2[0].displayName); + }); + + it('can update autoComplete suggestions list using multiple geocoders', function () { + var geocoder = new GeocoderViewModel({ + scene : scene, + geocoderServices : [customGeocoderOptions, customGeocoderOptions2] + }); + geocoder._searchText = 'sthsnth'; // an empty query will prevent geocoding + spyOn(geocoder, '_updateCamera'); + spyOn(geocoder, '_adjustSuggestionsScroll'); + geocoder.updateSearchSuggestions(); + expect(geocoder._suggestions().length).toEqual(geocoderResults1.length + geocoderResults2.length); + }); + }, 'WebGL'); From a36cf20b164937ac9a9550e0e829cf8066810272 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Wed, 7 Dec 2016 17:24:10 -0500 Subject: [PATCH 153/396] Don't test a function by copying its logic into the test. --- Specs/Scene/LabelCollectionSpec.js | 220 +++-------------------------- 1 file changed, 22 insertions(+), 198 deletions(-) diff --git a/Specs/Scene/LabelCollectionSpec.js b/Specs/Scene/LabelCollectionSpec.js index 5b5936314091..c7bb80f3310f 100644 --- a/Specs/Scene/LabelCollectionSpec.js +++ b/Specs/Scene/LabelCollectionSpec.js @@ -931,39 +931,13 @@ defineSuite([ }); scene.renderForSpecs(); - var x = Number.POSITIVE_INFINITY; - var y = Number.POSITIVE_INFINITY; - var maxX = 0; - var maxY = 0; - - var glyphs = label._glyphs; - var length = glyphs.length; - for (var i = 0; i < length; ++i) { - var glyph = glyphs[i]; - var billboard = glyph.billboard; - if (!defined(billboard)) { - continue; - } - - var glyphWidth = billboard.width * scale; - var glyphHeight = billboard.height * scale; - var glyphX = billboard._translate.x; - var glyphY = -(billboard._translate.y + glyphHeight); - - x = Math.min(x, glyphX); - y = Math.min(y, glyphY); - maxX = Math.max(maxX, glyphX + glyphWidth); - maxY = Math.max(maxY, glyphY + glyphHeight); - } - - var width = maxX - x; - var height = maxY - y; - var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); - expect(bbox.x).toEqual(x); - expect(bbox.y).toEqual(y); - expect(bbox.width).toEqual(width); - expect(bbox.height).toEqual(height); + expect(bbox.x).toBeDefined(); + expect(bbox.y).toBeDefined(); + expect(bbox.width).toBeGreaterThan(30); + expect(bbox.width).toBeLessThan(200); + expect(bbox.height).toBeGreaterThan(10); + expect(bbox.height).toBeLessThan(50); }); it('computes screen space bounding box with result', function() { @@ -975,40 +949,14 @@ defineSuite([ }); scene.renderForSpecs(); - var x = Number.POSITIVE_INFINITY; - var y = Number.POSITIVE_INFINITY; - var maxX = 0; - var maxY = 0; - - var glyphs = label._glyphs; - var length = glyphs.length; - for (var i = 0; i < length; ++i) { - var glyph = glyphs[i]; - var billboard = glyph.billboard; - if (!defined(billboard)) { - continue; - } - - var glyphWidth = billboard.width * scale; - var glyphHeight = billboard.height * scale; - var glyphX = billboard._translate.x; - var glyphY = -(billboard._translate.y + glyphHeight); - - x = Math.min(x, glyphX); - y = Math.min(y, glyphY); - maxX = Math.max(maxX, glyphX + glyphWidth); - maxY = Math.max(maxY, glyphY + glyphHeight); - } - - var width = maxX - x; - var height = maxY - y; - var result = new BoundingRectangle(); var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, result); - expect(bbox.x).toEqual(x); - expect(bbox.y).toEqual(y); - expect(bbox.width).toEqual(width); - expect(bbox.height).toEqual(height); + expect(bbox.x).toBeDefined(); + expect(bbox.y).toBeDefined(); + expect(bbox.width).toBeGreaterThan(30); + expect(bbox.width).toBeLessThan(200); + expect(bbox.height).toBeGreaterThan(10); + expect(bbox.height).toBeLessThan(50); expect(bbox).toBe(result); }); @@ -1022,39 +970,9 @@ defineSuite([ }); scene.renderForSpecs(); - var x = Number.POSITIVE_INFINITY; - var y = Number.POSITIVE_INFINITY; - var maxX = 0; - var maxY = 0; - - var glyphs = label._glyphs; - var length = glyphs.length; - for (var i = 0; i < length; ++i) { - var glyph = glyphs[i]; - var billboard = glyph.billboard; - if (!defined(billboard)) { - continue; - } - - var glyphWidth = billboard.width * scale; - var glyphHeight = billboard.height * scale; - var glyphX = billboard._translate.x; - var glyphY = -(billboard._translate.y + glyphHeight * 0.5); - - x = Math.min(x, glyphX); - y = Math.min(y, glyphY); - maxX = Math.max(maxX, glyphX + glyphWidth); - maxY = Math.max(maxY, glyphY + glyphHeight); - } - - var width = maxX - x; - var height = maxY - y; - var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); - expect(bbox.x).toEqual(x); - expect(bbox.y).toEqual(y); - expect(bbox.width).toEqual(width); - expect(bbox.height).toEqual(height); + expect(bbox.y).toBeGreaterThan(bbox.height * -1.0); + expect(bbox.y).toBeLessThan(bbox.height * -0.5); }); it('computes screen space bounding box with vertical origin top', function() { @@ -1067,39 +985,9 @@ defineSuite([ }); scene.renderForSpecs(); - var x = Number.POSITIVE_INFINITY; - var y = Number.POSITIVE_INFINITY; - var maxX = 0; - var maxY = 0; - - var glyphs = label._glyphs; - var length = glyphs.length; - for (var i = 0; i < length; ++i) { - var glyph = glyphs[i]; - var billboard = glyph.billboard; - if (!defined(billboard)) { - continue; - } - - var glyphWidth = billboard.width * scale; - var glyphHeight = billboard.height * scale; - var glyphX = billboard._translate.x; - var glyphY = -billboard._translate.y; - - x = Math.min(x, glyphX); - y = Math.min(y, glyphY); - maxX = Math.max(maxX, glyphX + glyphWidth); - maxY = Math.max(maxY, glyphY + glyphHeight); - } - - var width = maxX - x; - var height = maxY - y; - var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); - expect(bbox.x).toEqual(x); - expect(bbox.y).toEqual(y); - expect(bbox.width).toEqual(width); - expect(bbox.height).toEqual(height); + expect(bbox.y).toBeLessThan(5); + expect(bbox.y).toBeGreaterThan(-5); }); it('computes screen space bounding box with vertical origin baseline', function() { @@ -1112,39 +1000,9 @@ defineSuite([ }); scene.renderForSpecs(); - var x = Number.POSITIVE_INFINITY; - var y = Number.POSITIVE_INFINITY; - var maxX = 0; - var maxY = 0; - - var glyphs = label._glyphs; - var length = glyphs.length; - for (var i = 0; i < length; ++i) { - var glyph = glyphs[i]; - var billboard = glyph.billboard; - if (!defined(billboard)) { - continue; - } - - var glyphWidth = billboard.width * scale; - var glyphHeight = billboard.height * scale; - var glyphX = billboard._translate.x; - var glyphY = -(billboard._translate.y + glyphHeight); - - x = Math.min(x, glyphX); - y = Math.min(y, glyphY); - maxX = Math.max(maxX, glyphX + glyphWidth); - maxY = Math.max(maxY, glyphY + glyphHeight); - } - - var width = maxX - x; - var height = maxY - y; - var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); - expect(bbox.x).toEqual(x); - expect(bbox.y).toEqual(y); - expect(bbox.width).toEqual(width); - expect(bbox.height).toEqual(height); + expect(bbox.y).toBeLessThan(bbox.height * -0.8); + expect(bbox.y).toBeGreaterThan(bbox.height * -1.2); }); it('computes screen space bounding box with horizontal origin', function() { @@ -1157,49 +1015,15 @@ defineSuite([ }); scene.renderForSpecs(); - var x = Number.POSITIVE_INFINITY; - var y = Number.POSITIVE_INFINITY; - var maxX = 0; - var maxY = 0; - - var glyphs = label._glyphs; - var length = glyphs.length; - for (var i = 0; i < length; ++i) { - var glyph = glyphs[i]; - var billboard = glyph.billboard; - if (!defined(billboard)) { - continue; - } - - var glyphWidth = billboard.width * scale; - var glyphHeight = billboard.height * scale; - var glyphX = billboard._translate.x; - var glyphY = -(billboard._translate.y + glyphHeight); - - x = Math.min(x, glyphX); - y = Math.min(y, glyphY); - maxX = Math.max(maxX, glyphX + glyphWidth); - maxY = Math.max(maxY, glyphY + glyphHeight); - } - - var width = maxX - x; - var height = maxY - y; - - var halfWidth = width * 0.5; - var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); - expect(bbox.x).toEqual(-halfWidth); - expect(bbox.y).toEqual(y); - expect(bbox.width).toEqual(width); - expect(bbox.height).toEqual(height); + expect(bbox.x).toBeLessThan(bbox.width * -0.3); + expect(bbox.x).toBeGreaterThan(bbox.width * -0.7); label.horizontalOrigin = HorizontalOrigin.RIGHT; scene.renderForSpecs(); bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); - expect(bbox.x).toEqual(-width); - expect(bbox.y).toEqual(y); - expect(bbox.width).toEqual(width); - expect(bbox.height).toEqual(height); + expect(bbox.x).toBeLessThan(bbox.width * -0.8); + expect(bbox.x).toBeGreaterThan(bbox.width * -1.2); }); it('computes screen space bounding box with padded background', function() { From d7ae242b45b4b7a01dbf34916a5c8ebbd83e0955 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Wed, 7 Dec 2016 15:46:50 -0500 Subject: [PATCH 154/396] Issue clear command --- Source/Renderer/RenderState.js | 2 +- Source/Scene/Model.js | 33 ++++++++++++++++++++++----------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/Source/Renderer/RenderState.js b/Source/Renderer/RenderState.js index 92aea5c35a45..9966cc98daff 100644 --- a/Source/Renderer/RenderState.js +++ b/Source/Renderer/RenderState.js @@ -589,7 +589,7 @@ define([ // Section 6.8 of the WebGL spec requires the reference and masks to be the same for // front- and back-face tests. This call prevents invalid operation errors when calling // stencilFuncSeparate on Firefox. Perhaps they should delay validation to avoid requiring this. - gl.stencilFunc(stencilTest.frontFunction, stencilTest.reference, stencilTest.mask); + gl.stencilFunc(frontFunction, reference, mask); gl.stencilFuncSeparate(gl.BACK, backFunction, reference, mask); gl.stencilFuncSeparate(gl.FRONT, frontFunction, reference, mask); diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 5cd6e1be4730..f54d44689ebb 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -35,6 +35,7 @@ define([ '../Core/Transforms', '../Renderer/Buffer', '../Renderer/BufferUsage', + '../Renderer/ClearCommand', '../Renderer/DrawCommand', '../Renderer/RenderState', '../Renderer/Sampler', @@ -97,6 +98,7 @@ define([ Transforms, Buffer, BufferUsage, + ClearCommand, DrawCommand, RenderState, Sampler, @@ -3606,23 +3608,23 @@ define([ // Modified from http://forum.unity3d.com/threads/toon-outline-but-with-diffuse-surface.24668/ vs = ShaderSource.replaceMain(vs, 'gltf_silhouette_main'); vs += - 'uniform float gltf_silhouetteSize;\n' + + 'uniform float gltf_silhouetteSize; \n' + 'void main() \n' + '{ \n' + ' gltf_silhouette_main(); \n' + - ' vec3 n = v_normal;\n' + - ' n.x *= czm_projection[0][0];\n' + - ' n.y *= czm_projection[1][1];\n' + - ' vec4 clip = gl_Position;\n' + - ' clip.xy += n.xy * clip.w * gltf_silhouetteSize / czm_viewport.z * 2.0;\n' + - ' gl_Position = clip;\n' + + ' vec3 n = v_normal; \n' + + ' n.x *= czm_projection[0][0]; \n' + + ' n.y *= czm_projection[1][1]; \n' + + ' vec4 clip = gl_Position; \n' + + ' clip.xy += n.xy * clip.w * gltf_silhouetteSize / czm_viewport.z * 2.0; \n' + + ' gl_Position = clip; \n' + '}'; var fs = - 'uniform vec4 gltf_silhouetteColor;\n' + + 'uniform vec4 gltf_silhouetteColor; \n' + 'void main() \n' + '{ \n' + - ' gl_FragColor = gltf_silhouetteColor;\n' + + ' gl_FragColor = gltf_silhouetteColor; \n' + '}'; return ShaderProgram.fromCache({ @@ -3682,6 +3684,8 @@ define([ var modelCommand = isTranslucent(model) ? nodeCommand.translucentCommand : command; var silhouetteModelCommand = DrawCommand.shallowClone(modelCommand); var renderState = clone(modelCommand.renderState); + + // Write the value 1 into the stencil buffer renderState.stencilTest = { enabled : true, frontFunction : WebGLConstants.ALWAYS, @@ -3724,6 +3728,8 @@ define([ } renderState.depthTest.enabled = true; renderState.cull.enabled = false; + + // Only render if value of the stencil buffer is not 1. renderState.stencilTest = { enabled : true, frontFunction : WebGLConstants.NOTEQUAL, @@ -3733,12 +3739,12 @@ define([ frontOperation : { fail : WebGLConstants.KEEP, zFail : WebGLConstants.KEEP, - zPass : WebGLConstants.REPLACE + zPass : WebGLConstants.KEEP }, backOperation : { fail : WebGLConstants.KEEP, zFail : WebGLConstants.KEEP, - zPass : WebGLConstants.REPLACE + zPass : WebGLConstants.KEEP } }; renderState = RenderState.fromCache(renderState); @@ -4099,6 +4105,7 @@ define([ cachedResources.vertexArrays = resources.vertexArrays; cachedResources.programs = resources.programs; cachedResources.pickPrograms = resources.pickPrograms; + cachedResources.silhouettePrograms = resources.silhouettePrograms; cachedResources.textures = resources.textures; cachedResources.samplers = resources.samplers; cachedResources.renderStates = resources.renderStates; @@ -4238,6 +4245,10 @@ define([ } } } + + commandList.push(new ClearCommand({ + stencil : 0 + })); } if (passes.pick && this.allowPicking) { From 3d4071fd05ae5fd24aabe53309e4b202678751ed Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Wed, 7 Dec 2016 18:35:17 -0500 Subject: [PATCH 155/396] Use promises instead of callbacks in geocoder service API --- Source/Core/BingMapsGeocoderService.js | 55 ++++++++------ Source/Core/GeocoderService.js | 8 +-- Source/Core/LongLatGeocoderService.js | 15 ++-- .../OpenStreetMapNominatimGeocoderService.js | 13 ++-- Source/Widgets/Geocoder/GeocoderViewModel.js | 72 ++++++++++--------- Specs/Core/LongLatGeocoderServiceSpec.js | 8 +-- Specs/Widgets/Geocoder/GeocoderSpec.js | 41 +++++++---- .../Widgets/Geocoder/GeocoderViewModelSpec.js | 24 ++++--- 8 files changed, 131 insertions(+), 105 deletions(-) diff --git a/Source/Core/BingMapsGeocoderService.js b/Source/Core/BingMapsGeocoderService.js index 38a6b3364557..31785cc1c6a7 100644 --- a/Source/Core/BingMapsGeocoderService.js +++ b/Source/Core/BingMapsGeocoderService.js @@ -2,17 +2,15 @@ define([ './BingMapsApi', './defaultValue', + './defineProperties', './loadJsonp', './Rectangle', - '../ThirdParty/when', - './DeveloperError' ], function( BingMapsApi, defaultValue, + defineProperties, loadJsonp, - Rectangle, - when, - DeveloperError) { + Rectangle) { 'use strict'; var url = 'https://dev.virtualearth.net/REST/v1/Locations'; @@ -25,11 +23,35 @@ define([ function BingMapsGeocoderService(options) { options = defaultValue(options, defaultValue.EMPTY_OBJECT); this._canceled = false; - this._key = options.key; + + this._url = 'https://dev.virtualearth.net/REST/v1/Locations'; + this._key = BingMapsApi.getKey(options.key); this.autoComplete = defaultValue(options.autoComplete, false); } + defineProperties(BingMapsGeocoderService.prototype, { + /** + * The URL endpoint for the Bing geocoder service + * @type {String} + */ + url : { + get : function () { + return this._url; + } + }, + + /** + * The key for the Bing geocoder service + * @type {String} + */ + key : { + get : function () { + return this._key; + } + } + }); + BingMapsGeocoderService.prototype.cancel = function() { this._canceled = true; }; @@ -38,12 +60,12 @@ define([ * @function * * @param {String} query The query to be sent to the geocoder service - * @param {GeocoderCallback} callback Callback to be called with geocoder results + * @returns {Promise} */ - BingMapsGeocoderService.prototype.geocode = function(query, callback) { + BingMapsGeocoderService.prototype.geocode = function(query) { this._canceled = false; - var key = BingMapsApi.getKey(this._key); + var key = this.key; var promise = loadJsonp(url, { parameters : { query : query, @@ -54,18 +76,17 @@ define([ var that = this; - when(promise, function(result) { + return promise.then(function(result) { if (that._canceled) { return; } if (result.resourceSets.length === 0) { - callback(undefined, []); - return; + return []; } var results = result.resourceSets[0].resources; - callback(undefined, results.map(function (resource) { + return results.map(function (resource) { var bbox = resource.bbox; var south = bbox[0]; var west = bbox[1]; @@ -75,13 +96,7 @@ define([ displayName: resource.name, destination: Rectangle.fromDegrees(west, south, east, north) }; - })); - - }, function() { - if (that._canceled) { - return; - } - callback(new Error('unknown error when geocoding')); + }); }); }; diff --git a/Source/Core/GeocoderService.js b/Source/Core/GeocoderService.js index 41e23b76678b..ba96aae633c8 100644 --- a/Source/Core/GeocoderService.js +++ b/Source/Core/GeocoderService.js @@ -13,12 +13,6 @@ define([ * @property {Rectangle} rectangle The bounding box for a location */ - /** - * @typedef {Function} GeocoderCallback - * @param {Error | undefined} error The error that occurred during geocoding - * @param {GeocoderResult[]} [results] - */ - /** * Provides geocoding through an external service. This type describes an interface and * is not intended to be used. @@ -53,7 +47,7 @@ define([ * @function * * @param {String} query The query to be sent to the geocoder service - * @param {GeocoderCallback} callback Callback to be called with geocoder results + * @returns {Promise} */ GeocoderService.prototype.geocode = DeveloperError.throwInstantiationError; diff --git a/Source/Core/LongLatGeocoderService.js b/Source/Core/LongLatGeocoderService.js index b38cacc6b734..d46bd7a2bcfe 100644 --- a/Source/Core/LongLatGeocoderService.js +++ b/Source/Core/LongLatGeocoderService.js @@ -1,10 +1,12 @@ /*global define*/ define([ './Cartesian3', - './defaultValue' + './defaultValue', + '../ThirdParty/when' ], function( Cartesian3, - defaultValue) { + defaultValue, + when) { 'use strict'; /** @@ -24,7 +26,7 @@ define([ * @function * * @param {String} query The query to be sent to the geocoder service - * @param {GeocoderCallback} callback Callback to be called with geocoder results + * @returns {Promise} */ LongLatGeocoderService.prototype.geocode = function(query, callback) { var splitQuery = query.match(/[^\s,\n]+/g); @@ -38,13 +40,10 @@ define([ displayName: query, destination: Cartesian3.fromDegrees(longitude, latitude, height) }; - callback(undefined, [result]); - return; + return when.resolve([result]); } - callback(new Error('invalid coordinates')); - } else { - callback(undefined, []); } + return when.resolve([]); }; return LongLatGeocoderService; diff --git a/Source/Core/OpenStreetMapNominatimGeocoderService.js b/Source/Core/OpenStreetMapNominatimGeocoderService.js index d08c904818a7..749bc9aa8e0e 100644 --- a/Source/Core/OpenStreetMapNominatimGeocoderService.js +++ b/Source/Core/OpenStreetMapNominatimGeocoderService.js @@ -31,16 +31,16 @@ define([ * @function * * @param {String} query The query to be sent to the geocoder service - * @param {GeocoderCallback} callback Callback to be called with geocoder results + * @returns {Promise} */ - OpenStreetMapNominatimGeocoder.prototype.geocode = function (input, callback) { + OpenStreetMapNominatimGeocoder.prototype.geocode = function (input) { var endpoint = 'http://nominatim.openstreetmap.org/search?'; var query = 'format=json&q=' + input; var requestString = endpoint + query; - loadJson(requestString) + return loadJson(requestString) .then(function (results) { var bboxDegrees; - callback(undefined, results.map(function (resultObject) { + return results.map(function (resultObject) { bboxDegrees = resultObject.boundingbox; return { displayName: resultObject.display_name, @@ -51,11 +51,8 @@ define([ bboxDegrees[1] ) }; - })); + }); }) - .otherwise(function (err) { - callback(err); - }); }; return OpenStreetMapNominatimGeocoder; diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index 7f6f28b43c6d..003f7498e730 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -192,15 +192,13 @@ define([ }); geocoderServices.forEach(function (service) { - service.geocode(query, function (err, results) { - if (defined(err)) { - return; - } - results.slice(0, 3).forEach(function (result) { - that._suggestions.push(result); + service.geocode(query) + .then(function (results) { + results.slice(0, 3).forEach(function(result) { + that._suggestions.push(result); + }); }); }); - }); }; this.handleKeyDown = function (data, event) { @@ -431,33 +429,27 @@ define([ }); } - function createGeocodeCallback(geocodePromise) { - return function (err, results) { - if (defined(err)) { - geocodePromise.resolve(undefined); - return; - } - if (results.length === 0) { - geocodePromise.resolve(undefined); - return; - } + function getFirstResult(results) { + if (results.length === 0) { + return undefined; + } - var firstResult = results[0]; - //>>includeStart('debug', pragmas.debug); - if (!defined(firstResult.displayName)) { - throw new DeveloperError('each result must have a displayName'); - } - if (!defined(firstResult.destination)) { - throw new DeveloperError('each result must have a rectangle'); - } - //>>includeEnd('debug'); + var firstResult = results[0]; + //>>includeStart('debug', pragmas.debug); + if (!defined(firstResult.displayName)) { + throw new DeveloperError('each result must have a displayName'); + } + if (!defined(firstResult.destination)) { + throw new DeveloperError('each result must have a rectangle'); + } + //>>includeEnd('debug'); - geocodePromise.resolve({ - displayName: firstResult.displayName, - destination: firstResult.destination - }); + return { + displayName: firstResult.displayName, + destination: firstResult.destination }; } + function geocode(viewModel, geocoderServices) { var query = viewModel.searchText; @@ -473,9 +465,19 @@ define([ viewModel._isSearchInProgress = true; viewModel._suggestions.splice(0, viewModel._suggestions().length); - var geocodePromise = when.defer(); + var geocodePromise = geocoderService.geocode(query); resultPromises.push(geocodePromise); - geocoderService.geocode(query, createGeocodeCallback(geocodePromise)); + geocodePromise.then(getFirstResult); + + if (typeof geocodePromise.otherwise === 'function') { + geocodePromise.otherwise(function (err) { + console.log('otherwise err: ' + err); + }); + } else if (typeof geocodePromise.catch === 'function') { + geocodePromise.catch(function (err) { + console.log('catch err: ' + err); + }); + } } var allReady = when.all(resultPromises); allReady.then(function (results) { @@ -485,9 +487,9 @@ define([ return; } for (var j = 0; j < results.length; j++) { - if (defined(results[j])) { - viewModel._searchText = results[j].displayName; - updateCamera(viewModel, results[j].destination); + if (defined(results[j]) && results[j].length > 0) { + viewModel._searchText = results[j][0].displayName; + updateCamera(viewModel, results[j][0].destination); return; } } diff --git a/Specs/Core/LongLatGeocoderServiceSpec.js b/Specs/Core/LongLatGeocoderServiceSpec.js index 005603c4853b..c2cd515a2a6d 100644 --- a/Specs/Core/LongLatGeocoderServiceSpec.js +++ b/Specs/Core/LongLatGeocoderServiceSpec.js @@ -1,10 +1,10 @@ /*global defineSuite*/ defineSuite([ - 'Core/Cartesian3', - 'Core/LongLatGeocoderService' + 'Core/LongLatGeocoderService', + 'Core/Cartesian3' ], function( - Cartesian3, - LongLatGeocoderService) { + LongLatGeocoderService, + Cartesian3) { 'use strict'; var service = new LongLatGeocoderService(); diff --git a/Specs/Widgets/Geocoder/GeocoderSpec.js b/Specs/Widgets/Geocoder/GeocoderSpec.js index 0402dc6fe974..cbe522c08808 100644 --- a/Specs/Widgets/Geocoder/GeocoderSpec.js +++ b/Specs/Widgets/Geocoder/GeocoderSpec.js @@ -1,19 +1,34 @@ /*global defineSuite*/ defineSuite([ 'Widgets/Geocoder/Geocoder', - 'Specs/createScene' + 'Core/Cartesian3', + 'Specs/createScene', + 'ThirdParty/when' ], function( Geocoder, - createScene) { + Cartesian3, + createScene, + when) { 'use strict'; var scene; + + var mockDestination = new Cartesian3(1.0, 2.0, 3.0); + var geocoderResults = [{ + displayName: 'a', + destination: mockDestination + }, { + displayName: 'b', + destination: mockDestination + }, { + displayName: 'c', + destination: mockDestination + }]; + var customGeocoderOptions = { - geocode : function (input, callback) { - callback(undefined, ['a', 'b', 'c']); - }, - getSuggestions : function (input) { - return ['a', 'b', 'c']; + autoComplete : true, + geocode : function (input) { + return when.resolve(geocoderResults); } }; beforeEach(function() { @@ -96,7 +111,7 @@ defineSuite([ var geocoder = new Geocoder({ container : 'testContainer', scene : scene, - customGeocoder : customGeocoderOptions + geocoderServices : [customGeocoderOptions] }); var viewModel = geocoder._viewModel; viewModel._searchText = 'some_text'; @@ -104,16 +119,16 @@ defineSuite([ expect(viewModel._selectedSuggestion()).toEqual(undefined); viewModel.handleArrowDown(); - expect(viewModel._selectedSuggestion()).toEqual('a'); + expect(viewModel._selectedSuggestion().displayName).toEqual('a'); viewModel.handleArrowDown(); viewModel.handleArrowDown(); - expect(viewModel._selectedSuggestion()).toEqual('c'); + expect(viewModel._selectedSuggestion().displayName).toEqual('c'); viewModel.handleArrowDown(); - expect(viewModel._selectedSuggestion()).toEqual('a'); + expect(viewModel._selectedSuggestion().displayName).toEqual('a'); viewModel.handleArrowUp(); - expect(viewModel._selectedSuggestion()).toEqual('c'); + expect(viewModel._selectedSuggestion().displayName).toEqual('c'); viewModel.handleArrowUp(); - expect(viewModel._selectedSuggestion()).toEqual('b'); + expect(viewModel._selectedSuggestion().displayName).toEqual('b'); }); }, 'WebGL'); diff --git a/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js b/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js index 4884916e9922..d3a270f2d030 100644 --- a/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js +++ b/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js @@ -4,13 +4,15 @@ defineSuite([ 'Core/Cartesian3', 'Scene/Camera', 'Specs/createScene', - 'Specs/pollToPromise' + 'Specs/pollToPromise', + 'ThirdParty/when', ], function( GeocoderViewModel, Cartesian3, Camera, createScene, - pollToPromise) { + pollToPromise, + when) { 'use strict'; var scene; @@ -25,8 +27,8 @@ defineSuite([ }]; var customGeocoderOptions = { autoComplete: true, - geocode: function (input, callback) { - callback(undefined, geocoderResults1); + geocode: function (input) { + return when.resolve(geocoderResults1); } }; @@ -39,15 +41,15 @@ defineSuite([ }]; var customGeocoderOptions2 = { autoComplete: true, - geocode: function (input, callback) { - callback(undefined, geocoderResults2); + geocode: function (input) { + return when.resolve(geocoderResults2); } }; var noResultsGeocoder = { autoComplete: true, - geocode: function (input, callback) { - callback(undefined, []); + geocode: function (input) { + return when.resolve([]); } }; @@ -92,7 +94,8 @@ defineSuite([ it('throws is searchText is not a string', function() { var viewModel = new GeocoderViewModel({ - scene : scene + scene : scene, + geocoderServices : [customGeocoderOptions] }); expect(function() { viewModel.searchText = undefined; @@ -101,7 +104,8 @@ defineSuite([ it('moves camera when search command invoked', function() { var viewModel = new GeocoderViewModel({ - scene : scene + scene : scene, + geocoderServices : [customGeocoderOptions] }); var cameraPosition = Cartesian3.clone(scene.camera.position); From b94d7be278f42a5fba68bc115e1d69b5fcb33299 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Wed, 7 Dec 2016 18:51:23 -0500 Subject: [PATCH 156/396] Update geocoder interface to reflect that geocoders can send back results that destinations of type Rectangle or Cartesian3 --- Source/Core/GeocoderService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/GeocoderService.js b/Source/Core/GeocoderService.js index ba96aae633c8..3fa0664abc27 100644 --- a/Source/Core/GeocoderService.js +++ b/Source/Core/GeocoderService.js @@ -10,7 +10,7 @@ define([ /** * @typedef {Object} GeocoderResult * @property {String} displayName The display name for a location - * @property {Rectangle} rectangle The bounding box for a location + * @property {Rectangle|Cartesian3} destination The bounding box for a location */ /** From 4e58f4b2cae90253b2f9886c618567349f330b73 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Wed, 7 Dec 2016 19:44:04 -0500 Subject: [PATCH 157/396] Add deprecation/change notes --- CHANGES.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index f7659ea2524a..5dde6d39e540 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,7 +2,9 @@ Change Log ========== ### 1.29 - 2017-01-02 - +* Deprecated + * The properties `url` and `key` will be removed from `GeocoderViewModel` in 1.30. This properties will be available on geocoder services that support them, like `BingMapsGeocoderService`; +* Added support for custom geocoder services [4723](https://github.com/AnalyticalGraphicsInc/cesium/pull/4723). * Added the ability to blend a `Model` with a color/translucency. Added `color`, `colorBlendMode`, and `colorBlendAmount` properties to `Model`, `ModelGraphics`, and CZML. Added `ColorBlendMode` enum. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) * Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) From 0eb64e790bb342cfd25998f7478f6ea4d286de9f Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Wed, 7 Dec 2016 19:48:44 -0500 Subject: [PATCH 158/396] Make background color less harsh on clamping demo. --- Apps/Sandcastle/gallery/Ground Clamping.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Apps/Sandcastle/gallery/Ground Clamping.html b/Apps/Sandcastle/gallery/Ground Clamping.html index 6729403d358c..81c1d41a123b 100644 --- a/Apps/Sandcastle/gallery/Ground Clamping.html +++ b/Apps/Sandcastle/gallery/Ground Clamping.html @@ -61,7 +61,9 @@ heightReference : Cesium.HeightReference.CLAMP_TO_GROUND, horizontalOrigin : Cesium.HorizontalOrigin.LEFT, verticalOrigin : Cesium.VerticalOrigin.BASELINE, + fillColor : Cesium.Color.BLACK, showBackground : true, + backgroundColor : new Cesium.Color(1, 1, 1, 0.7), backgroundPadding : new Cesium.Cartesian2(8, 4) } }); From 5d6c88b47b5c8b8d2d26ba80ec6514ebe462df59 Mon Sep 17 00:00:00 2001 From: lasalvavida Date: Thu, 8 Dec 2016 00:59:25 -0500 Subject: [PATCH 159/396] Added WebGLConstants and add memberof in a few places to clean the global jsdoc page --- Source/Core/WebGLConstants.js | 503 +++++++++++++++++- Source/Renderer/DrawCommand.js | 23 +- .../Scene/ArcGisMapServerImageryProvider.js | 4 +- Source/Scene/QuadtreeTile.js | 4 + Source/Scene/UrlTemplateImageryProvider.js | 1 + Source/Scene/WebMapServiceImageryProvider.js | 1 + Source/Widgets/Viewer/Viewer.js | 1 + 7 files changed, 531 insertions(+), 6 deletions(-) diff --git a/Source/Core/WebGLConstants.js b/Source/Core/WebGLConstants.js index 06a0b41be191..d9bf73ffd9da 100644 --- a/Source/Core/WebGLConstants.js +++ b/Source/Core/WebGLConstants.js @@ -1,4 +1,7 @@ /*global define*/ +/** + * @module WebGLConstants + */ define([ './freezeObject' ], function( @@ -6,92 +9,447 @@ define([ 'use strict'; /** - * Enum containing WebGL Constant values by name - * for use without an active WebGL context. + * Enum containing WebGL Constant values by name. + * for use without an active WebGL context, or in cases where certain constants are unavailable using the WebGL context + * (For example, in [Safari 9]{@link https://github.com/AnalyticalGraphicsInc/cesium/issues/2989}). * * @readonly + * @alias WebGLConstants * @enum {Number} */ var WebGLConstants = { + /** + * Passed to [gl.clear]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/clear} + * to clear the current depth buffer. + */ DEPTH_BUFFER_BIT : 0x00000100, + /** + * Passed to [gl.clear]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/clear} + * to clear the current stencil buffer. + */ STENCIL_BUFFER_BIT : 0x00000400, + /** + * Passed to [gl.clear]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/clear} + * to clear the current color buffer. + */ COLOR_BUFFER_BIT : 0x00004000, + /** + * Passed to [gl.drawElements]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawElements} + * or [gl.drawArrays]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawArrays} + * to draw single points. + */ POINTS : 0x0000, + /** + * Passed to [gl.drawElements]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawElements} + * or [gl.drawArrays]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawArrays} + * to draw lines. Each vertex connects to the one after it. + */ LINES : 0x0001, + /** + * Passed to [gl.drawElements]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawElements} + * or [gl.drawArrays]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawArrays} + * to draw draw lines. Each set of two vertices is treated as a separate line segment. + */ LINE_LOOP : 0x0002, + /** + * Passed to [gl.drawElements]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawElements} + * or [gl.drawArrays]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawArrays} + * to draw a connected group of line segments from the first vertex to the last. + */ LINE_STRIP : 0x0003, + /** + * Passed to [gl.drawElements]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawElements} + * or [gl.drawArrays]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawArrays} + * to draw triangles. Each set of three vertices creates a separate triangle. + */ TRIANGLES : 0x0004, + /** + * Passed to [gl.drawElements]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawElements} + * or [gl.drawArrays]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawArrays} + * to draw a connected group of triangles. + */ TRIANGLE_STRIP : 0x0005, + /** + * Passed to [gl.drawElements]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawElements} + * or [gl.drawArrays]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawArrays} + * to draw a connected group of triangles. Each vertex connects to the previous and the first vertex in the fan. + */ TRIANGLE_FAN : 0x0006, + /** + * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} + * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} + * to turn off a component. + */ ZERO : 0, + /** + * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} + * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} + * to turn on a component. + */ ONE : 1, + /** + * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} + * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} + * to multiply a component by the source color. + */ SRC_COLOR : 0x0300, + /** + * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} + * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} + * to multiply a component by one minus the source color. + */ ONE_MINUS_SRC_COLOR : 0x0301, + /** + * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} + * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} + * to multiply a component by the source alpha. + */ SRC_ALPHA : 0x0302, + /** + * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} + * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} + * to multiply a component by one minus the source alpha. + */ ONE_MINUS_SRC_ALPHA : 0x0303, + /** + * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} + * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} + * to multiply a component by the destination alpha. + */ DST_ALPHA : 0x0304, + /** + * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} + * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} + * to multiply a component by one minus the destination alpha. + */ ONE_MINUS_DST_ALPHA : 0x0305, + /** + * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} + * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} + * to multiply a component by the destination color. + */ DST_COLOR : 0x0306, + /** + * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} + * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} + * to multiply a component by one minus the destination color. + */ ONE_MINUS_DST_COLOR : 0x0307, + /** + * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} + * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} + * to multiply a component by the minimum of the source alpha or one minus the destination alpha. + */ SRC_ALPHA_SATURATE : 0x0308, + /** + * Passed to [gl.blendEquation]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendEquation} + * or [gl.blendEquationSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendEquationSeparate} + * to set an addition blend function. + */ FUNC_ADD : 0x8006, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the current RGB blend function. + */ BLEND_EQUATION : 0x8009, - BLEND_EQUATION_RGB : 0x8009, // same as BLEND_EQUATION + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the current RGB blend function, same as BLEND_EQUATION. + */ + BLEND_EQUATION_RGB : 0x8009, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the current alpha blend function. + */ BLEND_EQUATION_ALPHA : 0x883D, + /** + * Passed to [gl.blendEquation]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendEquation} + * or [gl.blendEquationSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendEquationSeparate} + * to set a subtraction blend function (source - destination). + */ FUNC_SUBTRACT : 0x800A, + /** + * Passed to [gl.blendEquation]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendEquation} + * or [gl.blendEquationSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendEquationSeparate} + * to set a subtraction blend function (destination - source). + */ FUNC_REVERSE_SUBTRACT : 0x800B, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the current destination RGB blend function. + */ BLEND_DST_RGB : 0x80C8, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the current source RGB blend function. + */ BLEND_SRC_RGB : 0x80C9, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the current destination alpha blend function. + */ BLEND_DST_ALPHA : 0x80CA, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the current source alpha blend function. + */ BLEND_SRC_ALPHA : 0x80CB, + /** + * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} + * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} + * to specify a constant color blend function. + */ CONSTANT_COLOR : 0x8001, + /** + * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} + * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} + * to specify one minus a constant color blend function. + */ ONE_MINUS_CONSTANT_COLOR : 0x8002, + /** + * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} + * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} + * to specify a constant alpha blend function. + */ CONSTANT_ALPHA : 0x8003, + /** + * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} + * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} + * to specify one minus a constant alpha blend function. + */ ONE_MINUS_CONSTANT_ALPHA : 0x8004, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to return the current blend color. + */ BLEND_COLOR : 0x8005, + /** + * Passed to [gl.bindBuffer]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bindBuffer} + * or [gl.bufferData]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bufferData} + * to specify that the buffer is used for vertex attributes. + */ ARRAY_BUFFER : 0x8892, + /** + * Passed to [gl.bindBuffer]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bindBuffer} + * or [gl.bufferData]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bufferData} + * to specify that the buffer is used for element indices. + */ ELEMENT_ARRAY_BUFFER : 0x8893, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the array buffer binding. + */ ARRAY_BUFFER_BINDING : 0x8894, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the current element array buffer. + */ ELEMENT_ARRAY_BUFFER_BINDING : 0x8895, + /** + * Passed to [gl.bufferData]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bufferData} + * as a hint about whether the contents of the buffer are likely to not be used often. + */ STREAM_DRAW : 0x88E0, + /** + * Passed to [gl.bufferData]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bufferData} + * as a hint about whether the contents of the buffer are likely to be used often and not change often. + */ STATIC_DRAW : 0x88E4, + /** + * Passed to [gl.bufferData]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bufferData} + * as a hint about whether the contents of the buffer are likely to be used often and change often. + */ DYNAMIC_DRAW : 0x88E8, + /** + * Passed to [gl.getBufferParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getBufferParameter} + * to get a buffer's size. + */ BUFFER_SIZE : 0x8764, + /** + * Passed to [gl.getBufferParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getBufferParameter} + * to get the hint for the buffer passed in when it was created. + */ BUFFER_USAGE : 0x8765, + /** + * Passed to [gl.getVertexAttrib]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getVertexAttrib} + * to read back the current vertex attribute. + */ CURRENT_VERTEX_ATTRIB : 0x8626, + /** + * Passed to [gl.cullFace]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/cullFace} + * to specify that only front faces should be drawn. + */ FRONT : 0x0404, + /** + * Passed to [gl.cullFace]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/cullFace} + * to specify that only back faces should be drawn. + */ BACK : 0x0405, + /** + * Passed to [gl.cullFace]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/cullFace} + * to specify that front and back faces should be drawn. + */ FRONT_AND_BACK : 0x0408, + /** + * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} + * to turn on/off culling. Can also be used with [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to find the current culling method. + */ CULL_FACE : 0x0B44, + /** + * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} + * to turn on/off blending. Can also be used with [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to find the current blending method. + */ BLEND : 0x0BE2, + /** + * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} + * to turn on/off dithering. Can also be used with [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to find the current dithering method. + */ DITHER : 0x0BD0, + /** + * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} + * to turn on/off the stencil test. Can also be used with [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to query the stencil test. + */ STENCIL_TEST : 0x0B90, + /** + * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} + * to turn on/off the depth test. Can also be used with [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to query the depth test. + */ DEPTH_TEST : 0x0B71, + /** + * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} + * to turn on/off the scissor test. Can also be used with [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to query the scissor test. + */ SCISSOR_TEST : 0x0C11, + /** + * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} + * to turn on/off the polygon offset. Useful for rendering hidden-line images, decals, and or solids with highlighted edges. + */ POLYGON_OFFSET_FILL : 0x8037, + /** + * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} + * to turn on/off the alpha to coverage. Used in multi-sampling alpha channels. + */ SAMPLE_ALPHA_TO_COVERAGE : 0x809E, + /** + * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} + * to turn on/off the sample coverage. Used in multi-sampling. + */ SAMPLE_COVERAGE : 0x80A0, + /** + * Returned from [gl.getError]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError}. + * Indicates that no error has been recorded. + */ NO_ERROR : 0, + /** + * Returned from [gl.getError]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError}. + * Indicates that an unacceptable value has been specified for an enumerated argument. + */ INVALID_ENUM : 0x0500, + /** + * Returned from [gl.getError]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError}. + * Indicates that a numeric argument is out of range. + */ INVALID_VALUE : 0x0501, + /** + * Returned from [gl.getError]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError}. + * Indicates that the specified command is not allowed for the current state. + */ INVALID_OPERATION : 0x0502, + /** + * Returned from [gl.getError]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError}. + * Indicates that the not enough memory is left to execute the command. + */ OUT_OF_MEMORY : 0x0505, + /** + * Passed to [gl.frontFace]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/frontFace} + * to specify the front face of a polygon is drawn in the clockwise direction. + */ CW : 0x0900, + /** + * Passed to [gl.frontFace]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/frontFace} + * to specify the front face of a polygon is drawn in the counter-clockwise direction. + */ CCW : 0x0901, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the current lineWidth (set by [gl.lineWidth]{https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/lineWidth}). + */ LINE_WIDTH : 0x0B21, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the current size of a drawn point. + */ ALIASED_POINT_SIZE_RANGE : 0x846D, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the range of available widths for a line. Returns a length-2 array with the lo value at 0, and hight at 1. + */ ALIASED_LINE_WIDTH_RANGE : 0x846E, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the current value of cullFace. Should return FRONT, BACK, or FRONT_AND_BACK. + */ CULL_FACE_MODE : 0x0B45, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to determine the current value of [gl.frontFace]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/frontFace}. + */ FRONT_FACE : 0x0B46, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to return a length-2 array of floats giving the current depth range. + */ DEPTH_RANGE : 0x0B70, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to determine if the depth write mask is enabled. + */ DEPTH_WRITEMASK : 0x0B72, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to determine the current depth clear value. + */ DEPTH_CLEAR_VALUE : 0x0B73, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the current depth function. Returns NEVER, ALWAYS, LESS, EQUAL, LEQUAL, GREATER, GEQUAL, or NOTEQUAL. + */ DEPTH_FUNC : 0x0B74, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the value the stencil will be cleared to. + */ STENCIL_CLEAR_VALUE : 0x0B91, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the current stencil function. Returns NEVER, ALWAYS, LESS, EQUAL, LEQUAL, GREATER, GEQUAL, or NOTEQUAL. + */ STENCIL_FUNC : 0x0B92, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the current stencil fail function. Should return KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, or DECR_WRAP. + */ STENCIL_FAIL : 0x0B94, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the current stencil fail function should the depth buffer test fail. Should return KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, or DECR_WRAP. + */ STENCIL_PASS_DEPTH_FAIL : 0x0B95, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the current stencil fail function should the depth buffer test pass. Should return KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, or DECR_WRAP. + */ STENCIL_PASS_DEPTH_PASS : 0x0B96, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get the reference value used for stencil tests. + */ STENCIL_REF : 0x0B97, STENCIL_VALUE_MASK : 0x0B93, STENCIL_WRITEMASK : 0x0B98, @@ -102,7 +460,15 @@ define([ STENCIL_BACK_REF : 0x8CA3, STENCIL_BACK_VALUE_MASK : 0x8CA4, STENCIL_BACK_WRITEMASK : 0x8CA5, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get an Int32Array with four elements for the current viewport dimensions. + */ VIEWPORT : 0x0BA2, + /** + * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} + * to get an Int32Array with four elements for the current scissor box dimensions. + */ SCISSOR_BOX : 0x0C10, COLOR_CLEAR_VALUE : 0x0C22, COLOR_WRITEMASK : 0x0C23, @@ -125,9 +491,26 @@ define([ SAMPLE_COVERAGE_VALUE : 0x80AA, SAMPLE_COVERAGE_INVERT : 0x80AB, COMPRESSED_TEXTURE_FORMATS : 0x86A3, + /** + * Passed to [gl.hint]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/hint} + * There is no preference for this behavior. + */ DONT_CARE : 0x1100, + /** + * Passed to [gl.hint]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/hint} + * The most efficient behavior should be used. + */ FASTEST : 0x1101, + /** + * Passed to [gl.hint]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/hint} + * The most correct or the highest quality option should be used. + */ NICEST : 0x1102, + /** + * Passed to [gl.hint]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/hint} + * for the quality of filtering when generating mipmap images with + * [gl.generateMipmap]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/generateMipmap}. + */ GENERATE_MIPMAP_HINT : 0x8192, BYTE : 0x1400, UNSIGNED_BYTE : 0x1401, @@ -145,7 +528,15 @@ define([ UNSIGNED_SHORT_4_4_4_4 : 0x8033, UNSIGNED_SHORT_5_5_5_1 : 0x8034, UNSIGNED_SHORT_5_6_5 : 0x8363, + /** + * Passed to [gl.createShader]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/createShader} + * to define a fragment shader. + */ FRAGMENT_SHADER : 0x8B30, + /** + * Passed to [gl.createShader]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/createShader} + * to define a vertex shader. + */ VERTEX_SHADER : 0x8B31, MAX_VERTEX_ATTRIBS : 0x8869, MAX_VERTEX_UNIFORM_VECTORS : 0x8DFB, @@ -155,28 +546,125 @@ define([ MAX_TEXTURE_IMAGE_UNITS : 0x8872, MAX_FRAGMENT_UNIFORM_VECTORS : 0x8DFD, SHADER_TYPE : 0x8B4F, + /** + * Passed to [gl.getShaderParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getShaderParameter} + * to determine if a shader was deleted via [gl.deleteShader]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/deleteShader}. + */ DELETE_STATUS : 0x8B80, + /** + * Passed to [gl.getProgramParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getProgramParameter} + * after calling [gl.linkProgram]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/linkProgram} + * to determine if a program was linked correctly. + */ LINK_STATUS : 0x8B82, + /** + * Passed to [gl.getProgramParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getProgramParameter} + * after calling [gl.validateProgram]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/validateProgram} + * to determine if it is valid. + */ VALIDATE_STATUS : 0x8B83, + /** + * Passed to [gl.getProgramParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getProgramParameter} + * after calling [gl.attachShader]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/validateProgram} + * to determine if the shader was attached correctly. + */ ATTACHED_SHADERS : 0x8B85, + /** + * Passed to [gl.getProgramParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getProgramParameter} + * to get the number of uniforms active in a program. + */ ACTIVE_UNIFORMS : 0x8B86, + /** + * Passed to [gl.getProgramParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getProgramParameter} + * to get the number of attributes active in a program. + */ ACTIVE_ATTRIBUTES : 0x8B89, SHADING_LANGUAGE_VERSION : 0x8B8C, CURRENT_PROGRAM : 0x8B8D, + /** + * Passed to [gl.depthFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc} + * or [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} + * to specify depth or stencil tests will never pass. i.e. Nothing will be drawn. + */ NEVER : 0x0200, + /** + * Passed to [gl.depthFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc} + * or [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} + * to specify depth or stencil tests will pass if the new depth value is less than the stored value. + */ LESS : 0x0201, + /** + * Passed to [gl.depthFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc} + * or [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} + * to specify depth or stencil tests will pass if the new depth value is equals to the stored value. + */ EQUAL : 0x0202, + /** + * Passed to [gl.depthFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc} + * or [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} + * to specify depth or stencil tests will pass if the new depth value is less than or equal to the stored value. + */ LEQUAL : 0x0203, + /** + * Passed to [gl.depthFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc} + * or [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} + * to specify depth or stencil tests will pass if the new depth value is greater than the stored value. + */ GREATER : 0x0204, + /** + * Passed to [gl.depthFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc} + * or [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} + * to specify depth or stencil tests will pass if the new depth value is not equal to the stored value. + */ NOTEQUAL : 0x0205, + /** + * Passed to [gl.depthFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc} + * or [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} + * to specify depth or stencil tests will pass if the new depth value is greater than or equal to the stored value. + */ GEQUAL : 0x0206, + /** + * Passed to [gl.depthFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc} + * or [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} + * to specify depth or stencil tests will always pass. i.e. Pixels will be drawn in the order they are drawn. + */ ALWAYS : 0x0207, + /** + * Passed to [gl.stencilOp]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilOp} + * to keep the current value when the stencil test fails. + */ KEEP : 0x1E00, + /** + * Passed to [gl.stencilOp]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilOp} + * to set the stencil buffer value to the reference value as specified by + * [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} + * when the stencil test fails. + */ REPLACE : 0x1E01, + /** + * Passed to [gl.stencilOp]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilOp} + * to increment the current stencil buffer value when the stencil test fails. Clamps to the maximum representable unsigned value. + */ INCR : 0x1E02, + /** + * Passed to [gl.stencilOp]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilOp} + * to decrement the current stencil buffer value when the stencil test fails. Clamps to zero. + */ DECR : 0x1E03, + /** + * Passed to [gl.stencilOp]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilOp} + * to invert the current stencil buffer value bitwise when the stencil test fails. + */ INVERT : 0x150A, + /** + * Passed to [gl.stencilOp]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilOp} + * to increment the current stencil buffer value when the stencil test fails. Wraps stencil buffer value to zero when incrementing the maximum representable unsigned value. + */ INCR_WRAP : 0x8507, + /** + * Passed to [gl.stencilOp]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilOp} + * to decrement the current stencil buffer value when the stencil test fails. Wraps stencil buffer value to the maximum representable unsigned value when decrementing a stencil buffer value of zero. + */ DECR_WRAP : 0x8508, VENDOR : 0x1F00, RENDERER : 0x1F01, @@ -202,6 +690,9 @@ define([ TEXTURE_CUBE_MAP_POSITIVE_Z : 0x8519, TEXTURE_CUBE_MAP_NEGATIVE_Z : 0x851A, MAX_CUBE_MAP_TEXTURE_SIZE : 0x851C, + /** + * Used to address texture units. + */ TEXTURE0 : 0x84C0, TEXTURE1 : 0x84C1, TEXTURE2 : 0x84C2, @@ -234,6 +725,9 @@ define([ TEXTURE29 : 0x84DD, TEXTURE30 : 0x84DE, TEXTURE31 : 0x84DF, + /** + * Used to address the current active texture unit. + */ ACTIVE_TEXTURE : 0x84E0, REPEAT : 0x2901, CLAMP_TO_EDGE : 0x812F, @@ -471,6 +965,9 @@ define([ READ_FRAMEBUFFER_BINDING : 0x8CAA, RENDERBUFFER_SAMPLES : 0x8CAB, FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER : 0x8CD4, + /** + * Maximum number of framebuffer color attachment points. + */ MAX_COLOR_ATTACHMENTS : 0x8CDF, COLOR_ATTACHMENT1 : 0x8CE1, COLOR_ATTACHMENT2 : 0x8CE2, diff --git a/Source/Renderer/DrawCommand.js b/Source/Renderer/DrawCommand.js index 682f175a3983..e6d23b398b6f 100644 --- a/Source/Renderer/DrawCommand.js +++ b/Source/Renderer/DrawCommand.js @@ -39,7 +39,7 @@ define([ this._debugOverlappingFrustums = 0; this._castShadows = defaultValue(options.castShadows, false); this._receiveShadows = defaultValue(options.receiveShadows, false); - + this.dirty = true; this.lastDirtyTime = 0; @@ -59,6 +59,7 @@ define([ * minimize the number of frustums needed. *

* + * @memberof DrawCommand.prototype * @type {Object} * @default undefined * @@ -80,6 +81,7 @@ define([ * The oriented bounding box of the geometry in world space. If this is defined, it is used instead of * {@link DrawCommand#boundingVolume} for plane intersection testing. * + * @memberof DrawCommand.prototype * @type {OrientedBoundingBox} * @default undefined * @@ -101,6 +103,7 @@ define([ * When true, the renderer frustum and horizon culls the command based on its {@link DrawCommand#boundingVolume}. * If the command was already culled, set this to false for a performance improvement. * + * @memberof DrawCommand.prototype * @type {Boolean} * @default true */ @@ -122,6 +125,7 @@ define([ * When undefined, the geometry is assumed to be defined in world space. *

* + * @memberof DrawCommand.prototype * @type {Matrix4} * @default undefined */ @@ -140,6 +144,7 @@ define([ /** * The type of geometry in the vertex array. * + * @memberof DrawCommand.prototype * @type {PrimitiveType} * @default PrimitiveType.TRIANGLES */ @@ -158,6 +163,7 @@ define([ /** * The vertex array. * + * @memberof DrawCommand.prototype * @type {VertexArray} * @default undefined */ @@ -176,6 +182,7 @@ define([ /** * The number of vertices to draw in the vertex array. * + * @memberof DrawCommand.prototype * @type {Number} * @default undefined */ @@ -194,6 +201,7 @@ define([ /** * The offset to start drawing in the vertex array. * + * @memberof DrawCommand.prototype * @type {Number} * @default 0 */ @@ -212,6 +220,7 @@ define([ /** * The number of instances to draw. * + * @memberof DrawCommand.prototype * @type {Number} * @default 0 */ @@ -230,6 +239,7 @@ define([ /** * The shader program to apply. * + * @memberof DrawCommand.prototype * @type {ShaderProgram} * @default undefined */ @@ -248,6 +258,7 @@ define([ /** * Whether this command should cast shadows when shadowing is enabled. * + * @memberof DrawCommand.prototype * @type {Boolean} * @default false */ @@ -266,6 +277,7 @@ define([ /** * Whether this command should receive shadows when shadowing is enabled. * + * @memberof DrawCommand.prototype * @type {Boolean} * @default false */ @@ -285,6 +297,7 @@ define([ * An object with functions whose names match the uniforms in the shader program * and return values to set those uniforms. * + * @memberof DrawCommand.prototype * @type {Object} * @default undefined */ @@ -303,6 +316,7 @@ define([ /** * The render state. * + * @memberof DrawCommand.prototype * @type {RenderState} * @default undefined */ @@ -321,6 +335,7 @@ define([ /** * The framebuffer to draw to. * + * @memberof DrawCommand.prototype * @type {Framebuffer} * @default undefined */ @@ -339,6 +354,7 @@ define([ /** * The pass when to render. * + * @memberof DrawCommand.prototype * @type {Pass} * @default undefined */ @@ -358,6 +374,7 @@ define([ * Specifies if this command is only to be executed in the frustum closest * to the eye containing the bounding volume. Defaults to false. * + * @memberof DrawCommand.prototype * @type {Boolean} * @default false */ @@ -379,6 +396,7 @@ define([ * reference to the command, and can be used to selectively execute commands * with {@link Scene#debugCommandFilter}. * + * @memberof DrawCommand.prototype * @type {Object} * @default undefined * @@ -402,6 +420,7 @@ define([ * Draws the {@link DrawCommand#boundingVolume} for this command, assuming it is a sphere, when the command executes. *

* + * @memberof DrawCommand.prototype * @type {Boolean} * @default false * @@ -467,7 +486,7 @@ define([ result._debugOverlappingFrustums = command._debugOverlappingFrustums; result._castShadows = command._castShadows; result._receiveShadows = command._receiveShadows; - + result.dirty = true; result.lastDirtyTime = 0; diff --git a/Source/Scene/ArcGisMapServerImageryProvider.js b/Source/Scene/ArcGisMapServerImageryProvider.js index e8d4f067347e..7a9d4c328f9f 100644 --- a/Source/Scene/ArcGisMapServerImageryProvider.js +++ b/Source/Scene/ArcGisMapServerImageryProvider.js @@ -105,7 +105,7 @@ define([ * var esri = new Cesium.ArcGisMapServerImageryProvider({ * url : 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer' * }); - * + * * @see {@link http://resources.esri.com/help/9.3/arcgisserver/apis/rest/|ArcGIS Server REST API} * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} */ @@ -546,6 +546,8 @@ define([ /** * Gets the comma-separated list of layer IDs to show. + * @memberof ArcGisMapServerImageryProvider.prototype + * * @type {String} */ layers : { diff --git a/Source/Scene/QuadtreeTile.js b/Source/Scene/QuadtreeTile.js index 1609bf12dfe1..5ebea3fe0051 100644 --- a/Source/Scene/QuadtreeTile.js +++ b/Source/Scene/QuadtreeTile.js @@ -264,6 +264,7 @@ define([ /** * Gets the southwest child tile. + * @memberof QuadtreeTile.prototype * @type {QuadtreeTile} */ southwestChild : { @@ -283,6 +284,7 @@ define([ /** * Gets the southeast child tile. + * @memberof QuadtreeTile.prototype * @type {QuadtreeTile} */ southeastChild : { @@ -302,6 +304,7 @@ define([ /** * Gets the northwest child tile. + * @memberof QuadtreeTile.prototype * @type {QuadtreeTile} */ northwestChild : { @@ -321,6 +324,7 @@ define([ /** * Gets the northeast child tile. + * @memberof QuadtreeTile.prototype * @type {QuadtreeTile} */ northeastChild : { diff --git a/Source/Scene/UrlTemplateImageryProvider.js b/Source/Scene/UrlTemplateImageryProvider.js index 9e39944102c6..4ed3a72bb76a 100644 --- a/Source/Scene/UrlTemplateImageryProvider.js +++ b/Source/Scene/UrlTemplateImageryProvider.js @@ -282,6 +282,7 @@ define([ *
  • {latitudeProjected}: The latitude of the picked position in the projected coordinates of the tiling scheme.
  • *
  • {format}: The format in which to get feature information, as specified in the {@link GetFeatureInfoFormat}.
  • * + * @memberof UrlTemplateImageryProvider.prototype * @type {String} * @readonly */ diff --git a/Source/Scene/WebMapServiceImageryProvider.js b/Source/Scene/WebMapServiceImageryProvider.js index 4a0e90ae31c8..f7882cbb021d 100644 --- a/Source/Scene/WebMapServiceImageryProvider.js +++ b/Source/Scene/WebMapServiceImageryProvider.js @@ -386,6 +386,7 @@ define([ * {@link WebMapServiceImageryProvider#pickFeatures} will immediately return undefined (indicating no pickable * features) without communicating with the server. Set this property to false if you know your data * source does not support picking features or if you don't want this provider's features to be pickable. + * @memberof WebMapServiceImageryProvider.prototype * @type {Boolean} * @default true */ diff --git a/Source/Widgets/Viewer/Viewer.js b/Source/Widgets/Viewer/Viewer.js index aa66497dd207..0688f4ad8ad5 100644 --- a/Source/Widgets/Viewer/Viewer.js +++ b/Source/Widgets/Viewer/Viewer.js @@ -1204,6 +1204,7 @@ Either specify options.terrainProvider instead or set options.baseLayerPicker to }, /** * Gets or sets the data source to track with the viewer's clock. + * @memberof Viewer.prototype * @type {DataSource} */ clockTrackedDataSource : { From 613a12c143e4073ef0c9d9829c922e6e641385b8 Mon Sep 17 00:00:00 2001 From: lasalvavida Date: Thu, 8 Dec 2016 01:10:25 -0500 Subject: [PATCH 160/396] Updated CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index f7659ea2524a..474939b398df 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ Change Log * Added the ability to blend a `Model` with a color/translucency. Added `color`, `colorBlendMode`, and `colorBlendAmount` properties to `Model`, `ModelGraphics`, and CZML. Added `ColorBlendMode` enum. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) * Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) +* Moved `WebGLConstants` from Renderer to Core and exposed it as part of the Cesium API. [#4731](https://github.com/AnalyticalGraphicsInc/cesium/pull/4731) ### 1.28 - 2016-12-01 From a68cbc5f5bfd1fb8f11c427b51efbe3ea224424e Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Thu, 8 Dec 2016 10:35:22 -0500 Subject: [PATCH 161/396] Reject promises when geocoding fails --- Source/Core/LongLatGeocoderService.js | 28 ++++---- Source/Widgets/Geocoder/GeocoderViewModel.js | 76 ++++++++++++-------- 2 files changed, 64 insertions(+), 40 deletions(-) diff --git a/Source/Core/LongLatGeocoderService.js b/Source/Core/LongLatGeocoderService.js index d46bd7a2bcfe..c07c682a90a3 100644 --- a/Source/Core/LongLatGeocoderService.js +++ b/Source/Core/LongLatGeocoderService.js @@ -29,21 +29,25 @@ define([ * @returns {Promise} */ LongLatGeocoderService.prototype.geocode = function(query, callback) { - var splitQuery = query.match(/[^\s,\n]+/g); - if ((splitQuery.length === 2) || (splitQuery.length === 3)) { - var longitude = +splitQuery[0]; - var latitude = +splitQuery[1]; - var height = (splitQuery.length === 3) ? +splitQuery[2] : 300.0; + try { + var splitQuery = query.match(/[^\s,\n]+/g); + if ((splitQuery.length === 2) || (splitQuery.length === 3)) { + var longitude = +splitQuery[0]; + var latitude = +splitQuery[1]; + var height = (splitQuery.length === 3) ? +splitQuery[2] : 300.0; - if (!isNaN(longitude) && !isNaN(latitude) && !isNaN(height)) { - var result = { - displayName: query, - destination: Cartesian3.fromDegrees(longitude, latitude, height) - }; - return when.resolve([result]); + if (!isNaN(longitude) && !isNaN(latitude) && !isNaN(height)) { + var result = { + displayName: query, + destination: Cartesian3.fromDegrees(longitude, latitude, height) + }; + return when.resolve([result]); + } } + return when.resolve([]); + } catch (e) { + when.reject(e); } - return when.resolve([]); }; return LongLatGeocoderService; diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index 759106889eb1..b8440ba086a0 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -448,6 +448,29 @@ define([ }; } + function promisesSettled(promises) { + var settledPromises = []; + promises.forEach(function (promise) { + var settled = when.defer(); + settledPromises.push(settled); + promise.then(function (result) { + return settled.resolve({state: 'fulfilled', value: result}); + }); + + if (defined(promise.otherwise)) { + promise.otherwise(function (err) { + return settled.resolve({state: 'rejected', reason: err}); + }); + return; + } + promise.catch(function (err) { + return settled.resolve({state: 'rejected', reason: err}); + }); + }); + + return when.all(settledPromises); + } + function geocode(viewModel, geocoderServices) { var query = viewModel.searchText; @@ -466,37 +489,34 @@ define([ var geocodePromise = geocoderService.geocode(query); resultPromises.push(geocodePromise); geocodePromise.then(getFirstResult); - - if (typeof geocodePromise.otherwise === 'function') { - geocodePromise.otherwise(function (err) { - console.log('otherwise err: ' + err); - }); - } else if (typeof geocodePromise.catch === 'function') { - geocodePromise.catch(function (err) { - console.log('catch err: ' + err); - }); - } } - var allReady = when.all(resultPromises); - allReady.then(function (results) { - viewModel._isSearchInProgress = false; - if (viewModel._cancelGeocode) { - viewModel._cancelGeocode = false; - return; - } - for (var j = 0; j < results.length; j++) { - if (defined(results[j]) && results[j].length > 0) { - viewModel._searchText = results[j][0].displayName; - updateCamera(viewModel, results[j][0].destination); + + promisesSettled(resultPromises) + .then(function (descriptors) { + viewModel._isSearchInProgress = false; + if (viewModel._cancelGeocode) { + viewModel._cancelGeocode = false; return; } - } - viewModel._searchText = query + ' (not found)'; - }) - .otherwise(function (err) { - viewModel._isSearchInProgress = false; - viewModel._searchText = query + ' (not found)'; - }); + var allFailed = true; + for (var j = 0; j < descriptors.length; j++) { + if (descriptors[j].state === 'rejected') { + continue; + } + allFailed = false; + var geocoderResults = descriptors[j].value; + if (defined(geocoderResults) && geocoderResults.length > 0) { + viewModel._searchText = geocoderResults[0].displayName; + updateCamera(viewModel, geocoderResults[0].destination); + return; + } + } + if (allFailed) { + viewModel._searchText = query + ' (geocoders failed)'; + return; + } + viewModel._searchText = query + ' (not found)'; + }); } function cancelGeocode(viewModel) { From 161e583591a3902e025c246c339bbab3730cf5e1 Mon Sep 17 00:00:00 2001 From: Tom Fili Date: Thu, 8 Dec 2016 10:36:35 -0500 Subject: [PATCH 162/396] Fixed Rectangle.union to take rectangles crossing the IDL into account. --- Source/Core/Rectangle.js | 25 +++++++++++++++++++++++-- Specs/Core/RectangleSpec.js | 28 ++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/Source/Core/Rectangle.js b/Source/Core/Rectangle.js index 025d7f9d7742..5417ae9f6336 100644 --- a/Source/Core/Rectangle.js +++ b/Source/Core/Rectangle.js @@ -723,9 +723,30 @@ define([ result = new Rectangle(); } - result.west = Math.min(rectangle.west, otherRectangle.west); + var rectangleEast = rectangle.east; + var rectangleWest = rectangle.west; + + var otherRectangleEast = otherRectangle.east; + var otherRectangleWest = otherRectangle.west; + + if (rectangleEast < rectangleWest && otherRectangleEast > 0.0) { + rectangleEast += CesiumMath.TWO_PI; + } else if (otherRectangleEast < otherRectangleWest && rectangleEast > 0.0) { + otherRectangleEast += CesiumMath.TWO_PI; + } + + if (rectangleEast < rectangleWest && otherRectangleWest < 0.0) { + otherRectangleWest += CesiumMath.TWO_PI; + } else if (otherRectangleEast < otherRectangleWest && rectangleWest < 0.0) { + rectangleWest += CesiumMath.TWO_PI; + } + + var west = CesiumMath.negativePiToPi(Math.min(rectangleWest, otherRectangleWest)); + var east = CesiumMath.negativePiToPi(Math.max(rectangleEast, otherRectangleEast)); + + result.west = west; result.south = Math.min(rectangle.south, otherRectangle.south); - result.east = Math.max(rectangle.east, otherRectangle.east); + result.east = east; result.north = Math.max(rectangle.north, otherRectangle.north); return result; diff --git a/Specs/Core/RectangleSpec.js b/Specs/Core/RectangleSpec.js index 2caa2aba0944..46735d03af9f 100644 --- a/Specs/Core/RectangleSpec.js +++ b/Specs/Core/RectangleSpec.js @@ -564,7 +564,7 @@ defineSuite([ var rectangle2 = new Rectangle(0.4, 0.0, 0.85, 0.8); var expected = new Rectangle(0.4, 0.0, 0.85, 0.9); var returnedResult = Rectangle.union(rectangle1, rectangle2); - expect(returnedResult).toEqual(expected); + expect(returnedResult).toEqualEpsilon(expected, CesiumMath.EPSILON15); }); it('union works with a result parameter', function() { @@ -574,7 +574,31 @@ defineSuite([ var result = new Rectangle(-1.0, -1.0, 10.0, 10.0); var returnedResult = Rectangle.union(rectangle1, rectangle2, result); expect(result).toBe(returnedResult); - expect(returnedResult).toEqual(expected); + expect(returnedResult).toEqualEpsilon(expected, CesiumMath.EPSILON15); + }); + + it('union works with first rectangle crossing the IDL', function() { + var rectangle1 = new Rectangle(0.5, 0.1, -0.5, 0.9); + var rectangle2 = new Rectangle(-0.85, 0.0, -0.4, 0.8); + var expected = new Rectangle(0.5, 0.0, -0.4, 0.9); + var returnedResult = Rectangle.union(rectangle1, rectangle2); + expect(returnedResult).toEqualEpsilon(expected, CesiumMath.EPSILON15); + }); + + it('union works with second rectangle crossing the IDL', function() { + var rectangle1 = new Rectangle(0.5, 0.1, 0.75, 0.9); + var rectangle2 = new Rectangle(0.6, 0.0, -0.2, 0.8); + var expected = new Rectangle(0.5, 0.0, -0.2, 0.9); + var returnedResult = Rectangle.union(rectangle1, rectangle2); + expect(returnedResult).toEqualEpsilon(expected, CesiumMath.EPSILON15); + }); + + it('union works with both rectangles crossing the IDL', function() { + var rectangle1 = new Rectangle(0.5, 0.1, -0.4, 0.9); + var rectangle2 = new Rectangle(0.4, 0.0, -0.5, 0.8); + var expected = new Rectangle(0.4, 0.0, -0.4, 0.9); + var returnedResult = Rectangle.union(rectangle1, rectangle2); + expect(returnedResult).toEqualEpsilon(expected, CesiumMath.EPSILON15); }); it('expand works if rectangle needs to grow right', function() { From 3f1bf5551a0bd23042b7ae9cf074cf28486a6a3b Mon Sep 17 00:00:00 2001 From: Tom Fili Date: Thu, 8 Dec 2016 10:53:58 -0500 Subject: [PATCH 163/396] Fixed rounding issue. --- Source/Core/Rectangle.js | 4 ++-- Specs/Core/RectangleSpec.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/Core/Rectangle.js b/Source/Core/Rectangle.js index 5417ae9f6336..57fae37e1001 100644 --- a/Source/Core/Rectangle.js +++ b/Source/Core/Rectangle.js @@ -741,8 +741,8 @@ define([ rectangleWest += CesiumMath.TWO_PI; } - var west = CesiumMath.negativePiToPi(Math.min(rectangleWest, otherRectangleWest)); - var east = CesiumMath.negativePiToPi(Math.max(rectangleEast, otherRectangleEast)); + var west = CesiumMath.convertLongitudeRange(Math.min(rectangleWest, otherRectangleWest)); + var east = CesiumMath.convertLongitudeRange(Math.max(rectangleEast, otherRectangleEast)); result.west = west; result.south = Math.min(rectangle.south, otherRectangle.south); diff --git a/Specs/Core/RectangleSpec.js b/Specs/Core/RectangleSpec.js index 46735d03af9f..b95c52202f1b 100644 --- a/Specs/Core/RectangleSpec.js +++ b/Specs/Core/RectangleSpec.js @@ -564,7 +564,7 @@ defineSuite([ var rectangle2 = new Rectangle(0.4, 0.0, 0.85, 0.8); var expected = new Rectangle(0.4, 0.0, 0.85, 0.9); var returnedResult = Rectangle.union(rectangle1, rectangle2); - expect(returnedResult).toEqualEpsilon(expected, CesiumMath.EPSILON15); + expect(returnedResult).toEqual(expected); }); it('union works with a result parameter', function() { @@ -574,7 +574,7 @@ defineSuite([ var result = new Rectangle(-1.0, -1.0, 10.0, 10.0); var returnedResult = Rectangle.union(rectangle1, rectangle2, result); expect(result).toBe(returnedResult); - expect(returnedResult).toEqualEpsilon(expected, CesiumMath.EPSILON15); + expect(returnedResult).toEqual(expected); }); it('union works with first rectangle crossing the IDL', function() { From 6e11d3dae970a9a69606419ef5dd5ce733431677 Mon Sep 17 00:00:00 2001 From: Tom Fili Date: Thu, 8 Dec 2016 11:09:46 -0500 Subject: [PATCH 164/396] Updated CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index f7659ea2524a..19d888aa92fb 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,7 @@ Change Log * Added the ability to blend a `Model` with a color/translucency. Added `color`, `colorBlendMode`, and `colorBlendAmount` properties to `Model`, `ModelGraphics`, and CZML. Added `ColorBlendMode` enum. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) +* Fixed `Rectangle.union` to correctly account for rectangles that cross the IDL [#4732](https://github.com/AnalyticalGraphicsInc/cesium/pull/4732). * Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) ### 1.28 - 2016-12-01 From e31fff11b123757a8f418daafb3a86a1a50766e1 Mon Sep 17 00:00:00 2001 From: lasalvavida Date: Thu, 8 Dec 2016 11:56:14 -0500 Subject: [PATCH 165/396] Fixed define path --- Source/Core/TerrainMesh.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/TerrainMesh.js b/Source/Core/TerrainMesh.js index d49c8c11c1a9..de2534d819c9 100644 --- a/Source/Core/TerrainMesh.js +++ b/Source/Core/TerrainMesh.js @@ -1,6 +1,6 @@ /*global define*/ define([ - '../Core/defaultValue' + './defaultValue' ], function( defaultValue) { 'use strict'; From 2f6d88de60d049713e2eaf778a7633692f80357d Mon Sep 17 00:00:00 2001 From: hpinkos Date: Thu, 8 Dec 2016 12:13:25 -0500 Subject: [PATCH 166/396] add isBottom attribute --- Source/Core/CorridorGeometry.js | 22 ++++++- Source/Core/EllipseGeometry.js | 33 ++++++++++ Source/Core/GeometryPipeline.js | 1 + Source/Core/PolygonGeometry.js | 16 ++++- Source/Core/PolygonGeometryLibrary.js | 26 +++++++- Source/Core/RectangleGeometry.js | 34 ++++++++++- Source/Renderer/AutomaticUniforms.js | 88 +++++++++++++++------------ Source/Scene/GroundPrimitive.js | 8 ++- Source/Shaders/ShadowVolumeVS.glsl | 12 +++- 9 files changed, 190 insertions(+), 50 deletions(-) diff --git a/Source/Core/CorridorGeometry.js b/Source/Core/CorridorGeometry.js index 4fd13ea735a9..4252c69d082d 100644 --- a/Source/Core/CorridorGeometry.js +++ b/Source/Core/CorridorGeometry.js @@ -561,7 +561,7 @@ define([ function computePositionsExtruded(params, vertexFormat) { var topVertexFormat = new VertexFormat({ - position : vertexFormat.positon, + position : vertexFormat.position, normal : (vertexFormat.normal || vertexFormat.binormal), tangent : vertexFormat.tangent, binormal : (vertexFormat.normal || vertexFormat.binormal), @@ -590,6 +590,26 @@ define([ newPositions.set(wallPositions, length * 2); attributes.position.values = newPositions; + var sectionLength = length / 3; + var isBottom = new Uint8Array(sectionLength * 6); + if (typeof Uint8Array.prototype.fill === 'function') { + isBottom.fill(1, sectionLength, sectionLength * 2); + isBottom.fill(1, sectionLength * 4); + } else { //IE doesn't support fill + for (i = sectionLength; i < sectionLength * 2; i++) { + isBottom[i] = 1; + } + for (i = sectionLength * 4; i < sectionLength * 6; i++) { + isBottom[i] = 1; + } + } + + attributes.isBottom = new GeometryAttribute({ + componentDatatype : ComponentDatatype.UNSIGNED_BYTE, + componentsPerAttribute : 1, + values : isBottom + }); + length /= 3; var i; var iLength = indices.length; diff --git a/Source/Core/EllipseGeometry.js b/Source/Core/EllipseGeometry.js index 59193cf043d3..bab539441f9a 100644 --- a/Source/Core/EllipseGeometry.js +++ b/Source/Core/EllipseGeometry.js @@ -229,6 +229,23 @@ define([ values : binormals }); } + + if (extrude) { + var isBottom = new Uint8Array(size); + if (typeof Uint8Array.prototype.fill === 'function') { + isBottom.fill(1, size / 2); + } else { //IE doesn't support fill + for (i = size / 2; i < size; i++) { + isBottom[i] = 1; + } + } + + attributes.isBottom = new GeometryAttribute({ + componentDatatype : ComponentDatatype.UNSIGNED_BYTE, + componentsPerAttribute : 1, + values : isBottom + }); + } return attributes; } @@ -527,6 +544,22 @@ define([ values : binormals }); } + + var isBottom = new Uint8Array(size); + if (typeof Uint8Array.prototype.fill === 'function') { + isBottom.fill(1, size / 2); + } else { //IE doesn't support fill + for (i = size / 2; i < size; i++) { + isBottom[i] = 1; + } + } + + attributes.isBottom = new GeometryAttribute({ + componentDatatype : ComponentDatatype.UNSIGNED_BYTE, + componentsPerAttribute : 1, + values : isBottom + }); + return attributes; } diff --git a/Source/Core/GeometryPipeline.js b/Source/Core/GeometryPipeline.js index c27a9dda80cd..adf740039b00 100644 --- a/Source/Core/GeometryPipeline.js +++ b/Source/Core/GeometryPipeline.js @@ -281,6 +281,7 @@ define([ 'st', 'binormal', 'tangent', + 'isBottom', // From compressing texture coordinates and normals 'compressedAttributes' diff --git a/Source/Core/PolygonGeometry.js b/Source/Core/PolygonGeometry.js index f8276fa5880b..73d76d2fcfcb 100644 --- a/Source/Core/PolygonGeometry.js +++ b/Source/Core/PolygonGeometry.js @@ -363,15 +363,24 @@ define([ var numPositions; var newIndices; + var isBottom; if (closeTop && closeBottom) { var topBottomPositions = edgePoints.concat(edgePoints); + isBottom = new Uint8Array(topBottomPositions.length / 3); + if (typeof Uint8Array.prototype.fill === 'function') { + isBottom.fill(1, isBottom.length / 2); + } else { //IE doesn't support fill + for (i = isBottom.length / 2; i < isBottom.length; i++) { + isBottom[i] = 1; + } + } + numPositions = topBottomPositions.length / 3; newIndices = IndexDatatype.createTypedArray(numPositions, indices.length * 2); newIndices.set(indices); var ilength = indices.length; - var length = numPositions / 2; for (i = 0; i < ilength; i += 3) { @@ -390,6 +399,11 @@ define([ topGeo.attributes.normal.values = new Float32Array(topBottomPositions.length); topGeo.attributes.normal.values.set(normals); } + topGeo.attributes.isBottom = new GeometryAttribute({ + componentDatatype : ComponentDatatype.UNSIGNED_BYTE, + componentsPerAttribute : 1, + values : isBottom + }); topGeo.indices = newIndices; } else if (closeBottom) { numPositions = edgePoints.length / 3; diff --git a/Source/Core/PolygonGeometryLibrary.js b/Source/Core/PolygonGeometryLibrary.js index f36e24764715..603cb215c0f3 100644 --- a/Source/Core/PolygonGeometryLibrary.js +++ b/Source/Core/PolygonGeometryLibrary.js @@ -346,6 +346,7 @@ define([ PolygonGeometryLibrary.computeWallGeometry = function(positions, ellipsoid, granularity, perPositionHeight) { var edgePositions; var topEdgeLength; + var positionLength; var i; var p1; var p2; @@ -353,6 +354,7 @@ define([ var length = positions.length; var index = 0; + var isBottom; if (!perPositionHeight) { var minDistance = CesiumMath.chordLength(granularity, ellipsoid.maximumRadius); @@ -361,7 +363,8 @@ define([ numVertices += PolygonGeometryLibrary.subdivideLineCount(positions[i], positions[(i + 1) % length], minDistance); } - topEdgeLength = (numVertices + length) * 3; + positionLength = numVertices + length; + topEdgeLength = positionLength * 3; edgePositions = new Array(topEdgeLength * 2); for (i = 0; i < length; i++) { p1 = positions[i]; @@ -387,7 +390,8 @@ define([ ++index; } } else { - topEdgeLength = length * 3 * 2; + positionLength = length * 2; + topEdgeLength = positionLength * 3; edgePositions = new Array(topEdgeLength * 2); for (i = 0; i < length; i++) { p1 = positions[i]; @@ -407,6 +411,15 @@ define([ } } + isBottom = new Uint8Array(positionLength * 2); + if (typeof Uint8Array.prototype.fill === 'function') { + isBottom.fill(1, positionLength); + } else { //IE doesn't support fill + for (i = positionLength; i < positionLength * 2; i++) { + isBottom[i] = 1; + } + } + length = edgePositions.length; var indices = IndexDatatype.createTypedArray(length / 3, length - positions.length * 6); var edgeIndex = 0; @@ -432,7 +445,7 @@ define([ indices[edgeIndex++] = LR; } - return new Geometry({ + var geometry = new Geometry({ attributes : new GeometryAttributes({ position : new GeometryAttribute({ componentDatatype : ComponentDatatype.DOUBLE, @@ -443,6 +456,13 @@ define([ indices : indices, primitiveType : PrimitiveType.TRIANGLES }); + geometry.attributes.isBottom = new GeometryAttribute({ + componentDatatype : ComponentDatatype.UNSIGNED_BYTE, + componentsPerAttribute : 1, + values : isBottom + }); + + return geometry; }; return PolygonGeometryLibrary; diff --git a/Source/Core/RectangleGeometry.js b/Source/Core/RectangleGeometry.js index 420b95cceeb4..e85033a88fa1 100644 --- a/Source/Core/RectangleGeometry.js +++ b/Source/Core/RectangleGeometry.js @@ -356,6 +356,21 @@ define([ positions.set(bottomPositions, length); topBottomGeo.attributes.position.values = positions; + var isBottom = new Uint8Array(newLength / 3); + if (typeof Uint8Array.prototype.fill === 'function') { + isBottom.fill(1, length / 3); + } else { //IE doesn't support fill + for (i = length / 3; i < newLength / 3; i++) { + isBottom[i] = 1; + } + } + + topBottomGeo.attributes.isBottom = new GeometryAttribute({ + componentDatatype : ComponentDatatype.UNSIGNED_BYTE, + componentsPerAttribute : 1, + values : isBottom + }); + var normals = (vertexFormat.normal) ? new Float32Array(newLength) : undefined; var tangents = (vertexFormat.tangent) ? new Float32Array(newLength) : undefined; var binormals = (vertexFormat.binormal) ? new Float32Array(newLength) : undefined; @@ -408,10 +423,12 @@ define([ var wallCount = (perimeterPositions + 4) * 2; var wallPositions = new Float64Array(wallCount * 3); + var wallisBottom = new Uint8Array(wallCount); var wallTextures = (vertexFormat.st) ? new Float32Array(wallCount * 2) : undefined; var posIndex = 0; var stIndex = 0; + var isBottomIndex = 0; var area = width * height; for (i = 0; i < area; i+=width) { wallPositions = addWallPositions(wallPositions, posIndex, i*3, topPositions, bottomPositions); @@ -420,6 +437,8 @@ define([ wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i*2, topSt); stIndex += 4; } + wallisBottom[isBottomIndex++] = 0; + wallisBottom[isBottomIndex++] = 1; } for (i = area-width; i < area; i++) { @@ -429,6 +448,8 @@ define([ wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i*2, topSt); stIndex += 4; } + wallisBottom[isBottomIndex++] = 0; + wallisBottom[isBottomIndex++] = 1; } for (i = area-1; i > 0; i-=width) { @@ -438,6 +459,8 @@ define([ wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i*2, topSt); stIndex += 4; } + wallisBottom[isBottomIndex++] = 0; + wallisBottom[isBottomIndex++] = 1; } for (i = width-1; i >= 0; i--) { @@ -447,6 +470,8 @@ define([ wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i*2, topSt); stIndex += 4; } + wallisBottom[isBottomIndex++] = 0; + wallisBottom[isBottomIndex++] = 1; } var geo = calculateAttributesWall(wallPositions, vertexFormat, ellipsoid); @@ -458,6 +483,11 @@ define([ values : wallTextures }); } + geo.attributes.isBottom = new GeometryAttribute({ + componentDatatype: ComponentDatatype.UNSIGNED_BYTE, + componentsPerAttribute: 1, + values: wallisBottom + }); var wallIndices = IndexDatatype.createTypedArray(wallCount, perimeterPositions * 6); @@ -819,7 +849,7 @@ define([ } return new Geometry({ - attributes : new GeometryAttributes(geometry.attributes), + attributes : geometry.attributes, indices : geometry.indices, primitiveType : geometry.primitiveType, boundingSphere : boundingSphere @@ -847,7 +877,7 @@ define([ height : minHeight, closeTop : true, closeBottom : true, - vertexFormat : VertexFormat.POSITION_ONLY + vertexFormat : VertexFormat.POSITION_AND_NORMAL }); }; diff --git a/Source/Renderer/AutomaticUniforms.js b/Source/Renderer/AutomaticUniforms.js index 59ee77626ce3..e347e63ffaaf 100644 --- a/Source/Renderer/AutomaticUniforms.js +++ b/Source/Renderer/AutomaticUniforms.js @@ -75,7 +75,7 @@ define([ * // Scale the window coordinate components to [0, 1] by dividing * // by the viewport's width and height. * vec2 v = gl_FragCoord.xy / czm_viewport.zw; - * + * * @see Context#getViewport */ czm_viewport : new AutomaticUniform({ @@ -108,7 +108,7 @@ define([ * * // Example * gl_Position = czm_viewportOrthographic * vec4(windowPosition, 0.0, 1.0); - * + * * @see UniformState#viewportOrthographic * @see czm_viewport * @see czm_viewportTransformation @@ -150,7 +150,7 @@ define([ * vec4 q = czm_modelViewProjection * positionMC; // model to clip coordinates * q.xyz /= q.w; // clip to normalized device coordinates (ndc) * q.xyz = (czm_viewportTransformation * vec4(q.xyz, 1.0)).xyz; // ndc to window coordinates - * + * * @see UniformState#viewportTransformation * @see czm_viewport * @see czm_viewportOrthographic @@ -204,7 +204,7 @@ define([ * * // Example * vec4 worldPosition = czm_model * modelPosition; - * + * * @see UniformState#model * @see czm_inverseModel * @see czm_modelView @@ -232,7 +232,7 @@ define([ * * // Example * vec4 modelPosition = czm_inverseModel * worldPosition; - * + * * @see UniformState#inverseModel * @see czm_model * @see czm_inverseModelView @@ -259,7 +259,7 @@ define([ * * // Example * vec4 eyePosition = czm_view * worldPosition; - * + * * @see UniformState#view * @see czm_viewRotation * @see czm_modelView @@ -292,7 +292,7 @@ define([ * * // Example * vec4 eyePosition3D = czm_view3D * worldPosition3D; - * + * * @see UniformState#view3D * @see czm_view */ @@ -318,7 +318,7 @@ define([ * * // Example * vec3 eyeVector = czm_viewRotation * worldVector; - * + * * @see UniformState#viewRotation * @see czm_view * @see czm_inverseView @@ -349,7 +349,7 @@ define([ * * // Example * vec3 eyeVector = czm_viewRotation3D * worldVector; - * + * * @see UniformState#viewRotation3D * @see czm_viewRotation */ @@ -375,7 +375,7 @@ define([ * * // Example * vec4 worldPosition = czm_inverseView * eyePosition; - * + * * @see UniformState#inverseView * @see czm_view * @see czm_inverseNormal @@ -405,7 +405,7 @@ define([ * * // Example * vec4 worldPosition = czm_inverseView3D * eyePosition; - * + * * @see UniformState#inverseView3D * @see czm_inverseView */ @@ -431,7 +431,7 @@ define([ * * // Example * vec4 worldVector = czm_inverseViewRotation * eyeVector; - * + * * @see UniformState#inverseView * @see czm_view * @see czm_viewRotation @@ -462,7 +462,7 @@ define([ * * // Example * vec4 worldVector = czm_inverseViewRotation3D * eyeVector; - * + * * @see UniformState#inverseView3D * @see czm_inverseViewRotation */ @@ -489,7 +489,7 @@ define([ * * // Example * gl_Position = czm_projection * eyePosition; - * + * * @see UniformState#projection * @see czm_viewProjection * @see czm_modelViewProjection @@ -518,7 +518,7 @@ define([ * * // Example * vec4 eyePosition = czm_inverseProjection * clipPosition; - * + * * @see UniformState#inverseProjection * @see czm_projection */ @@ -558,7 +558,7 @@ define([ * * // Example * gl_Position = czm_infiniteProjection * eyePosition; - * + * * @see UniformState#infiniteProjection * @see czm_projection * @see czm_modelViewInfiniteProjection @@ -591,7 +591,7 @@ define([ * * // The above is equivalent to, but more efficient than: * vec4 eyePosition = czm_view * czm_model * modelPosition; - * + * * @see UniformState#modelView * @see czm_model * @see czm_view @@ -629,7 +629,7 @@ define([ * * // The above is equivalent to, but more efficient than: * vec4 eyePosition = czm_view3D * czm_model * modelPosition; - * + * * @see UniformState#modelView3D * @see czm_modelView */ @@ -689,7 +689,7 @@ define([ * * // Example * vec4 modelPosition = czm_inverseModelView * eyePosition; - * + * * @see UniformState#inverseModelView * @see czm_modelView */ @@ -718,7 +718,7 @@ define([ * * // Example * vec4 modelPosition = czm_inverseModelView3D * eyePosition; - * + * * @see UniformState#inverseModelView * @see czm_inverseModelView * @see czm_modelView3D @@ -749,7 +749,7 @@ define([ * * // The above is equivalent to, but more efficient than: * gl_Position = czm_projection * czm_view * czm_model * modelPosition; - * + * * @see UniformState#viewProjection * @see czm_view * @see czm_projection @@ -779,7 +779,7 @@ define([ * * // Example * vec4 worldPosition = czm_inverseViewProjection * clipPosition; - * + * * @see UniformState#inverseViewProjection * @see czm_viewProjection */ @@ -809,7 +809,7 @@ define([ * * // The above is equivalent to, but more efficient than: * gl_Position = czm_projection * czm_view * czm_model * modelPosition; - * + * * @see UniformState#modelViewProjection * @see czm_model * @see czm_view @@ -842,7 +842,7 @@ define([ * * // Example * vec4 modelPosition = czm_inverseModelViewProjection * clipPosition; - * + * * @see UniformState#modelViewProjection * @see czm_modelViewProjection */ @@ -909,7 +909,7 @@ define([ * * // The above is equivalent to, but more efficient than: * gl_Position = czm_infiniteProjection * czm_view * czm_model * modelPosition; - * + * * @see UniformState#modelViewInfiniteProjection * @see czm_model * @see czm_view @@ -941,7 +941,7 @@ define([ * * // Example * vec3 eyeNormal = czm_normal * normal; - * + * * @see UniformState#normal * @see czm_inverseNormal * @see czm_modelView @@ -975,7 +975,7 @@ define([ * * // Example * vec3 eyeNormal = czm_normal3D * normal; - * + * * @see UniformState#normal3D * @see czm_normal */ @@ -1002,7 +1002,7 @@ define([ * * // Example * vec3 normalMC = czm_inverseNormal * normalEC; - * + * * @see UniformState#inverseNormal * @see czm_normal * @see czm_modelView @@ -1035,7 +1035,7 @@ define([ * * // Example * vec3 normalMC = czm_inverseNormal3D * normalEC; - * + * * @see UniformState#inverseNormal3D * @see czm_inverseNormal */ @@ -1079,7 +1079,7 @@ define([ * * // Example * float frustumLength = czm_entireFrustum.y - czm_entireFrustum.x; - * + * * @see UniformState#entireFrustum * @see czm_currentFrustum */ @@ -1106,7 +1106,7 @@ define([ * * // Example * float frustumLength = czm_currentFrustum.y - czm_currentFrustum.x; - * + * * @see UniformState#currentFrustum * @see czm_entireFrustum */ @@ -1143,7 +1143,7 @@ define([ * @example * // GLSL declaration * uniform vec3 czm_sunPositionWC; - * + * * @see UniformState#sunPositionWC * @see czm_sunPositionColumbusView * @see czm_sunDirectionWC @@ -1166,7 +1166,7 @@ define([ * @example * // GLSL declaration * uniform vec3 czm_sunPositionColumbusView; - * + * * @see UniformState#sunPositionColumbusView * @see czm_sunPositionWC */ @@ -1192,7 +1192,7 @@ define([ * * // Example * float diffuse = max(dot(czm_sunDirectionEC, normalEC), 0.0); - * + * * @see UniformState#sunDirectionEC * @see czm_moonDirectionEC * @see czm_sunDirectionWC @@ -1216,7 +1216,7 @@ define([ * @example * // GLSL declaration * uniform vec3 czm_sunDirectionWC; - * + * * @see UniformState#sunDirectionWC * @see czm_sunPositionWC * @see czm_sunDirectionEC @@ -1243,7 +1243,7 @@ define([ * * // Example * float diffuse = max(dot(czm_moonDirectionEC, normalEC), 0.0); - * + * * @see UniformState#moonDirectionEC * @see czm_sunDirectionEC */ @@ -1267,7 +1267,7 @@ define([ * @example * // GLSL declaration * uniform vec3 czm_encodedCameraPositionMCHigh; - * + * * @see czm_encodedCameraPositionMCLow * @see czm_modelViewRelativeToEye * @see czm_modelViewProjectionRelativeToEye @@ -1292,7 +1292,7 @@ define([ * @example * // GLSL declaration * uniform vec3 czm_encodedCameraPositionMCLow; - * + * * @see czm_encodedCameraPositionMCHigh * @see czm_modelViewRelativeToEye * @see czm_modelViewProjectionRelativeToEye @@ -1381,7 +1381,7 @@ define([ * { * eyeHeightSq = czm_eyeHeight2D.y; * } - * + * * @see czm_sceneMode2D * @see czm_sceneModeColumbusView * @see czm_sceneMode3D @@ -1433,7 +1433,7 @@ define([ * * // Example * vec3 pseudoFixed = czm_temeToPseudoFixed * teme; - * + * * @see UniformState#temeToPseudoFixedMatrix * @see Transforms.computeTemeToPseudoFixedMatrix */ @@ -1476,6 +1476,14 @@ define([ getValue : function(uniformState) { return uniformState.fogDensity; } + }), + + czm_LODNegativeGeometricToleranceOverDistance : new AutomaticUniform({ + size: 1, + datatype: WebGLConstants.FLOAT, + getValue: function(uniformState) { + return -10000; //TODO + } }) }; diff --git a/Source/Scene/GroundPrimitive.js b/Source/Scene/GroundPrimitive.js index c35c4b1828c5..0bbd7b85e3e5 100644 --- a/Source/Scene/GroundPrimitive.js +++ b/Source/Scene/GroundPrimitive.js @@ -215,7 +215,11 @@ define([ this._rsColorPass = undefined; this._rsPickPass = undefined; - this._uniformMap = {}; + this._uniformMap = { + u_globeMinimumAltitude: function() { + return -11000; //TODO verify + } + }; this._boundingVolumes = []; this._boundingVolumes2D = []; @@ -252,7 +256,7 @@ define([ releaseGeometryInstances : defaultValue(options.releaseGeometryInstances, true), allowPicking : defaultValue(options.allowPicking, true), asynchronous : defaultValue(options.asynchronous, true), - compressVertices : defaultValue(options.compressVertices, true), + compressVertices : false,//defaultValue(options.compressVertices, true), _readOnlyInstanceAttributes : readOnlyAttributes, _createRenderStatesFunction : undefined, _createShaderProgramFunction : undefined, diff --git a/Source/Shaders/ShadowVolumeVS.glsl b/Source/Shaders/ShadowVolumeVS.glsl index a97b96c1752b..0a2c4b59d2b6 100644 --- a/Source/Shaders/ShadowVolumeVS.glsl +++ b/Source/Shaders/ShadowVolumeVS.glsl @@ -1,5 +1,9 @@ +uniform float u_globeMinimumAltitude; + attribute vec3 position3DHigh; attribute vec3 position3DLow; +attribute vec3 normal; +attribute float isBottom; attribute vec4 color; attribute float batchId; @@ -17,7 +21,13 @@ vec4 depthClampFarPlane(vec4 vertexInClipCoordinates) void main() { v_color = color; - + vec4 position = czm_computePosition(); + float delta = min(u_globeMinimumAltitude, czm_LODNegativeGeometricToleranceOverDistance * length(position.xyz)); + + if (isBottom == 1.0) + { + position = position + vec4(normal.xyz * 40.0, 0); + } gl_Position = depthClampFarPlane(czm_modelViewProjectionRelativeToEye * position); } From b172977f511671c678d0e4957fecc09873c8fa4f Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 8 Dec 2016 12:17:43 -0500 Subject: [PATCH 167/396] Fix un-premultiply when alpha is 0 --- Source/Scene/Model.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 703abe4e8708..633cdd7e8c8e 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -1770,8 +1770,17 @@ define([ ' gltf_blend_main(); \n'; // Un-premultiply the alpha so that blending is correct. + + // Avoid divide-by-zero. The code below is equivalent to: + // if (gl_FragColor.a > 0.0) + // { + // gl_FragColor.rgb /= gl_FragColor.a; + // } + if (premultipliedAlpha) { - shader += ' gl_FragColor.rgb /= gl_FragColor.a; \n'; + shader += + ' float alpha = 1.0 - ceil(gl_FragColor.a) + gl_FragColor.a; \n' + + ' gl_FragColor.rgb /= alpha; \n'; } shader += From 5b3ebd07011072f6c30101e0ac4a7826fabcfd73 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Thu, 8 Dec 2016 12:17:43 -0500 Subject: [PATCH 168/396] Fix hello world index, reword error comment --- Apps/Sandcastle/CesiumSandcastle.js | 2 +- gulpfile.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Apps/Sandcastle/CesiumSandcastle.js b/Apps/Sandcastle/CesiumSandcastle.js index c57fec1254cb..92fdba14ffdd 100644 --- a/Apps/Sandcastle/CesiumSandcastle.js +++ b/Apps/Sandcastle/CesiumSandcastle.js @@ -807,7 +807,7 @@ require({ appendConsole('consoleError', 'Error loading gallery, please run the build script.', true); } if (notFound) { - appendConsole('consoleLog', 'Demo at ' + queryObject.src + ' was not found\n', true); + appendConsole('consoleLog', 'Unable to load demo named ' + queryObject.src.replace('.html', '') + '\n', true); } } } else if (Cesium.defined(e.data.log)) { diff --git a/gulpfile.js b/gulpfile.js index 300a3f27c74e..436aafaeeb11 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1155,7 +1155,7 @@ function createGalleryList() { } }); - var helloWorldIndex = demoObjects.indexOf(helloWorld); + var helloWorldIndex = Math.max(demoObjects.indexOf(helloWorld), 0); var i; for (i = 0; i < demoObjects.length; ++i) { From 396e4482d0145d4cbaee0dbb181e522f257ec6d5 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Thu, 8 Dec 2016 12:21:02 -0500 Subject: [PATCH 169/396] Tweak CHANGES.md --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 474939b398df..9b1de54edd7a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,7 +6,7 @@ Change Log * Added the ability to blend a `Model` with a color/translucency. Added `color`, `colorBlendMode`, and `colorBlendAmount` properties to `Model`, `ModelGraphics`, and CZML. Added `ColorBlendMode` enum. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) * Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) -* Moved `WebGLConstants` from Renderer to Core and exposed it as part of the Cesium API. [#4731](https://github.com/AnalyticalGraphicsInc/cesium/pull/4731) +* Added `WebGLConstants` enum. Previously, this was part of the private Renderer API. [#4731](https://github.com/AnalyticalGraphicsInc/cesium/pull/4731) ### 1.28 - 2016-12-01 From 9698bbf056dbb5b5182c2988603b018962652f7b Mon Sep 17 00:00:00 2001 From: lasalvavida Date: Thu, 8 Dec 2016 13:11:19 -0500 Subject: [PATCH 170/396] Removed redundant pathing --- Source/Core/Queue.js | 2 +- Source/Core/getMagic.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Core/Queue.js b/Source/Core/Queue.js index ffc238620ea2..a6e3caa3dc0c 100644 --- a/Source/Core/Queue.js +++ b/Source/Core/Queue.js @@ -1,6 +1,6 @@ /*global define*/ define([ - '../Core/defineProperties' + './defineProperties' ], function( defineProperties) { 'use strict'; diff --git a/Source/Core/getMagic.js b/Source/Core/getMagic.js index 1bb172764248..ca6905108e40 100644 --- a/Source/Core/getMagic.js +++ b/Source/Core/getMagic.js @@ -1,7 +1,7 @@ /*global define*/ define([ - '../Core/defaultValue', - '../Core/getStringFromTypedArray' + './defaultValue', + './getStringFromTypedArray' ], function( defaultValue, getStringFromTypedArray) { From d1449352b7c90e64f85c4833dd92c522de4ab625 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Thu, 8 Dec 2016 13:16:01 -0500 Subject: [PATCH 171/396] Break out parameter checking functionality into separate functions for different types of checks --- Source/Core/Cartesian3.js | 149 ++++++++++++------------- Source/Core/check.js | 136 +++++++++++++---------- Specs/Core/check.js | 131 ---------------------- Specs/Core/checkSpec.js | 226 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 377 insertions(+), 265 deletions(-) delete mode 100644 Specs/Core/check.js create mode 100644 Specs/Core/checkSpec.js diff --git a/Source/Core/Cartesian3.js b/Source/Core/Cartesian3.js index c7a0ceca1d92..034e0b6c71b6 100644 --- a/Source/Core/Cartesian3.js +++ b/Source/Core/Cartesian3.js @@ -7,7 +7,7 @@ define([ './freezeObject', './Math' ], function( - validation, + check, defaultValue, defined, DeveloperError, @@ -15,9 +15,6 @@ define([ CesiumMath) { 'use strict'; - var check = validation.check; - var Match = validation.Match; - /** * A 3D Cartesian point. * @alias Cartesian3 @@ -63,7 +60,7 @@ define([ */ Cartesian3.fromSpherical = function(spherical, result) { //>>includeStart('debug', pragmas.debug); - check(spherical, Object, 'spherical is required'); + check.type.object(spherical); //>>includeEnd('debug'); if (!defined(result)) { @@ -149,8 +146,8 @@ define([ */ Cartesian3.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - check(value, Object, 'value is required'); - check(array, [], 'array is required'); + check.type.object(value); + check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -172,7 +169,7 @@ define([ */ Cartesian3.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - check(array, [], 'array is required'); + check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -195,7 +192,7 @@ define([ */ Cartesian3.packArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - check(array, [], 'array is required'); + check.defined(array, 'array'); //>>includeEnd('debug'); var length = array.length; @@ -220,10 +217,8 @@ define([ */ Cartesian3.unpackArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - check(array, [], 'array is required'); - if (array.length < 3) { - throw new DeveloperError(); - } + check.defined(array, 'array'); + check.numeric.min(array.length, 3); if (array.length % 3 !== 0) { throw new DeveloperError('array length must be a multiple of 3.'); } @@ -271,9 +266,7 @@ define([ */ Cartesian3.maximumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + check.defined(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.max(cartesian.x, cartesian.y, cartesian.z); @@ -287,7 +280,7 @@ define([ */ Cartesian3.minimumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - check(cartesian, Object, 'cartesian is required'); + check.defined(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.min(cartesian.x, cartesian.y, cartesian.z); @@ -303,9 +296,9 @@ define([ */ Cartesian3.minimumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - check(first, Object, 'first is required.'); - check(second, Object, 'second is required.'); - check(result, Object, 'result is required.'); + check.defined(first,'first'); + check.defined(second, 'second'); + check.defined(result, 'result'); //>>includeEnd('debug'); result.x = Math.min(first.x, second.x); @@ -325,9 +318,9 @@ define([ */ Cartesian3.maximumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - check(first, Object, 'first is required.'); - check(second, Object, 'second is required.'); - check(result, Object, 'result is required.'); + check.defined(first, 'first'); + check.defined(second, 'second'); + check.defined(result, 'result'); //>>includeEnd('debug'); result.x = Math.max(first.x, second.x); @@ -344,7 +337,7 @@ define([ */ Cartesian3.magnitudeSquared = function(cartesian) { //>>includeStart('debug', pragmas.debug); - check(cartesian, Object, 'cartesian is required'); + check.defined(cartesian, 'cartesian'); //>>includeEnd('debug'); return cartesian.x * cartesian.x + cartesian.y * cartesian.y + cartesian.z * cartesian.z; @@ -416,8 +409,8 @@ define([ */ Cartesian3.normalize = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - check(cartesian, Object, 'cartesian is required'); - check(result, Object, 'result is required'); + check.defined(cartesian, 'cartesian'); + check.defined(result, 'result'); //>>includeEnd('debug'); var magnitude = Cartesian3.magnitude(cartesian); @@ -444,8 +437,8 @@ define([ */ Cartesian3.dot = function(left, right) { //>>includeStart('debug', pragmas.debug); - check(left, Object, 'left is required'); - check(right, Object, 'right is required'); + check.defined(left, 'left'); + check.defined(right, 'right'); //>>includeEnd('debug'); return left.x * right.x + left.y * right.y + left.z * right.z; @@ -461,9 +454,9 @@ define([ */ Cartesian3.multiplyComponents = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - check(left, Object, 'left is required'); - check(right, Object, 'right is required'); - check(result, Object, 'result is required'); + check.defined(left, 'left'); + check.defined(right, 'right'); + check.defined(result, 'result'); //>>includeEnd('debug'); result.x = left.x * right.x; @@ -482,9 +475,9 @@ define([ */ Cartesian3.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - check(left, Object, 'left is required'); - check(right, Object, 'right is required'); - check(result, Object, 'result is required'); + check.defined(left, 'left'); + check.defined(right, 'right'); + check.defined(result, 'result'); //>>includeEnd('debug'); result.x = left.x + right.x; @@ -503,9 +496,9 @@ define([ */ Cartesian3.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - check(left, Object, 'left is required'); - check(right, Object, 'right is required'); - check(result, Object, 'result is required'); + check.defined(left, 'left'); + check.defined(right, 'right'); + check.defined(result, 'result'); //>>includeEnd('debug'); result.x = left.x - right.x; @@ -524,9 +517,9 @@ define([ */ Cartesian3.multiplyByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - check(cartesian, Object, 'cartesian is required'); - check(scalar, Number, 'scalar is required'); - check(result, Object, 'result is required'); + check.defined(cartesian, 'cartesian'); + check.defined(scalar, 'scalar'); + check.defined(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x * scalar; @@ -545,9 +538,9 @@ define([ */ Cartesian3.divideByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - check(cartesian, Object, 'cartesian is required'); - check(scalar, Number, 'scalar is required'); - check(result, Object, 'result is required'); + check.defined(cartesian, 'cartesian'); + check.defined(scalar, 'scalar'); + check.defined(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x / scalar; @@ -565,8 +558,8 @@ define([ */ Cartesian3.negate = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - check(cartesian, Object, 'cartesian is required'); - check(result, Object, 'result is required'); + check.defined(cartesian, 'cartesian'); + check.defined(result, 'result'); //>>includeEnd('debug'); result.x = -cartesian.x; @@ -584,8 +577,8 @@ define([ */ Cartesian3.abs = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - check(cartesian, Object, 'cartesian is required'); - check(result, Object, 'result is required'); + check.defined(cartesian, 'cartesian'); + check.defined(result, 'result'); //>>includeEnd('debug'); result.x = Math.abs(cartesian.x); @@ -606,10 +599,10 @@ define([ */ Cartesian3.lerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - check(start, Object, 'start is required'); - check(end, Object, 'end is required'); - check(t, Number, 'number is required'); - check(result, Object, 'result is required'); + check.defined(start, 'start'); + check.defined(end, 'end'); + check.defined(t, 't'); + check.defined(result, 'result'); //>>includeEnd('debug'); Cartesian3.multiplyByScalar(end, t, lerpScratch); @@ -628,8 +621,8 @@ define([ */ Cartesian3.angleBetween = function(left, right) { //>>includeStart('debug', pragmas.debug); - check(left, Object, 'left is required'); - check(right, Object, 'right is required'); + check.defined(left, 'left'); + check.defined(right, 'right'); //>>includeEnd('debug'); Cartesian3.normalize(left, angleBetweenScratch); @@ -649,8 +642,8 @@ define([ */ Cartesian3.mostOrthogonalAxis = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - check(cartesian, Object, 'cartesian is required'); - check(result, Object, 'result is required'); + check.defined(cartesian, 'cartesian'); + check.defined(result, 'result'); //>>includeEnd('debug'); var f = Cartesian3.normalize(cartesian, mostOrthogonalAxisScratch); @@ -729,9 +722,9 @@ define([ */ Cartesian3.cross = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - check(left, Object, 'left is required'); - check(right, Object, 'right is required'); - check(result, Object, 'result is required'); + check.defined(left, 'left'); + check.defined(right, 'right'); + check.defined(result, 'result'); //>>includeEnd('debug'); var leftX = left.x; @@ -766,8 +759,8 @@ define([ */ Cartesian3.fromDegrees = function(longitude, latitude, height, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - check(longitude, Number, 'longitude is required'); - check(latitude, Number, 'latitude is required'); + check.defined(longitude, 'longitude'); + check.defined(latitude, 'latitude'); //>>includeEnd('debug'); longitude = CesiumMath.toRadians(longitude); @@ -794,8 +787,8 @@ define([ */ Cartesian3.fromRadians = function(longitude, latitude, height, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - check(longitude, Number, 'longitude is required'); - check(latitude, Number, 'latitude is required'); + check.defined(longitude, 'longitude'); + check.defined(latitude, 'latitude'); //>>includeEnd('debug'); height = defaultValue(height, 0.0); @@ -831,10 +824,10 @@ define([ */ Cartesian3.fromDegreesArray = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - check(coordinates, [], 'coordinates is required.'); - check(coordinates.length, Match.Where(function (length) { - return length >= 2 && length % 2 === 0; - }), 'the number of coordinates must be a multiple of 2 and at least 2'); + check.type.array(coordinates); + if (coordinates.length < 2 || coordinates.length % 2 !== 0) { + throw new DeveloperError('the number of coordinates must be a multiple of 2 and at least 2'); + } //>>includeEnd('debug'); var length = coordinates.length; @@ -867,10 +860,10 @@ define([ */ Cartesian3.fromRadiansArray = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - check(coordinates, [], 'coordinates is required.'); - check(coordinates.length, Match.Where(function (length) { - return length >= 2 && length % 2 === 0; - }), 'the number of coordinates must be a multiple of 2 and at least 2'); + check.type.array(coordinates); + if (coordinates.length < 2 || coordinates.length % 2 !== 0) { + throw new DeveloperError('the number of coordinates must be a multiple of 2 and at least 2'); + } //>>includeEnd('debug'); var length = coordinates.length; @@ -903,10 +896,10 @@ define([ */ Cartesian3.fromDegreesArrayHeights = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - check(coordinates, [], 'coordinates is required.'); - check(coordinates.length, Match.Where(function (length) { - return length >= 3 && length % 3 === 0; - }), 'the number of coordinates must be a multiple of 3 and at least 2'); + check.type.array(coordinates); + if (coordinates.length < 3 || coordinates.length % 3 !== 0) { + throw new DeveloperError('the number of coordinates must be a multiple of 3 and at least 3'); + } //>>includeEnd('debug'); var length = coordinates.length; @@ -940,10 +933,10 @@ define([ */ Cartesian3.fromRadiansArrayHeights = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - check(coordinates, [], 'coordinates is required.'); - check(coordinates.length, Match.Where(function (length) { - return length >= 3 && length % 3 === 0; - }), 'the number of coordinates must be a multiple of 3 and at least 2'); + check.defined(coordinates, 'coordinates'); + if (coordinates.length < 3 || coordinates.length % 3 !== 0) { + throw new DeveloperError('the number of coordinates must be a multiple of 3 and at least 3'); + } //>>includeEnd('debug'); var length = coordinates.length; diff --git a/Source/Core/check.js b/Source/Core/check.js index 8b9c24882f2c..a0bf158c40b7 100644 --- a/Source/Core/check.js +++ b/Source/Core/check.js @@ -8,80 +8,104 @@ define([ isArray) { 'use strict'; - var Where = function(condition) { - this.condition = condition; + var exports = { + defined: checkDefined, + numeric: { + min: checkMin, + minMax: checkMinMax, + max: checkMax + }, + type: { + array: checkArray, + boolean: checkBoolean, + function: checkFunction, + object: checkObject, + number: checkNumber, + string: checkString + } }; - var Match = { - Where: function(condition) { - return new Where(condition); - } + var errors = { + defined: getUndefinedErrorMessage, + failedType: getFailedTypeErrorMessage }; - function throwUnless(passed, message) { - if (!passed) { - throw new DeveloperError(message); + function getUndefinedErrorMessage(name) { + return name + ' is required but is undefined.'; + } + function getFailedTypeErrorMessage(actual, expected) { + return 'Expected ' + expected + ', got ' + actual; + } + + function checkMinMax(test, min, max) { + checkNumber(test); + checkNumber(max); + checkNumber(min); + if (min > max) { + throw new DeveloperError('Invalid condition: min (' + min + ') must be less than max (' + max + ')'); + } + if (test > max || test < min) { + throw new DeveloperError('Invalid argument: expected ' + test + ' to be in range [' + min + ', ' + max + ']'); } } - function makeErrorMessage(expectedType, seenType, optionalMessage) { - if (defined(optionalMessage)) { - return optionalMessage; + function checkMax(test, max) { + checkNumber(test); + checkNumber(max); + if (test > max) { + throw new DeveloperError('Expected ' + test + ' to be at most ' + max); } - return 'Expected ' + expectedType + ', got ' + seenType; } - var typeChecks = [ - [String, 'string'], - [Number, 'number'], - [Boolean, 'boolean'], - [Function, 'function'], - ]; + function checkMin(test, min) { + checkNumber(test); + checkNumber(min); + if (test < min) { + throw new DeveloperError('Expected ' + test + ' to be at least ' + min); + } + } - function check(arg, pattern, optionalMessage) { - var typeCheck; - var patternValid = false; - for (var i = 0; i < typeChecks.length; i++) { - typeCheck = typeChecks[i]; - if (typeCheck[0] === pattern) { - patternValid = true; - throwUnless(typeof arg === typeCheck[1], makeErrorMessage(typeCheck[1], typeof arg, optionalMessage)); - } + function checkDefined(test, name) { + if (test === undefined) { + throw new DeveloperError(errors.defined(name)); } + } - if (pattern === null) { - throwUnless(arg === null, makeErrorMessage('null', arg, optionalMessage)); - return true; + function checkFunction(test) { + if (typeof test !== 'function') { + throw new DeveloperError(errors.failedType(typeof test, 'function')); } - if (pattern instanceof Where) { - throwUnless(pattern.condition(arg), 'Failed Match.Where condition for arg: ' + typeof arg); - return true; + } + + function checkString(test) { + if (typeof test !== 'string') { + throw new DeveloperError(errors.failedType(typeof test, 'string')); } - if (pattern === Object) { - throwUnless(typeof arg === 'object' && !isArray(arg), makeErrorMessage('object', typeof arg, optionalMessage)); - return true; + } + + function checkNumber(test) { + if (typeof test !== 'number') { + throw new DeveloperError(errors.failedType(typeof test, 'number')); + } + } + + function checkObject(test) { + if (typeof test !== 'object' || isArray(test)) { + throw new DeveloperError(errors.failedType(typeof test, 'object')); } - if (isArray(pattern)) { - if (pattern.length !== 1 && pattern.length !== 0) { - throw new DeveloperError('invalid pattern: array pattern must contain 0 or 1 element'); - } - if (pattern.length === 1) { - for (var j = 0; j < arg.length; j++) { - check(arg[j], pattern[0], optionalMessage ? '(checking array elements) ' + optionalMessage : undefined); - } - } - var isArrayOrTypedArray = isArray(arg) || arg instanceof Float32Array || arg instanceof Float64Array || - arg instanceof Int8Array || arg instanceof Int16Array || arg instanceof Int32Array; - throwUnless(isArrayOrTypedArray, makeErrorMessage('array', typeof arg), optionalMessage); - return true; + } + + function checkArray(test) { + if (!isArray(test)) { + throw new DeveloperError(errors.failedType(typeof test, 'array')); } - if (!patternValid) { - throw new DeveloperError('unsupported pattern'); + } + + function checkBoolean(test) { + if (typeof test !== 'boolean') { + throw new DeveloperError(errors.failedType(typeof test, 'boolean')); } } - return { - Match: Match, - check: check - }; + return exports; }); diff --git a/Specs/Core/check.js b/Specs/Core/check.js deleted file mode 100644 index f7fb3779fe41..000000000000 --- a/Specs/Core/check.js +++ /dev/null @@ -1,131 +0,0 @@ -/*global defineSuite*/ -defineSuite([ - 'Core/check' - ], function( - validation) { - 'use strict'; - var check = validation.check; - var Match = validation.Match; - - it('does not throw on matching empty object against Object', function () { - expect(function () { - check({}, Object); - }).not.toThrowDeveloperError(); - }); - - it('does not throw on matching plain object against Object', function () { - var obj = { - a: 2, - b: 'snt' - }; - expect(function () { - check(obj, Object); - }).not.toThrowDeveloperError(); - }); - - it('throws on matching array against Object', function () { - expect(function () { - check([], Object); - }).toThrowDeveloperError(); - }); - - it('does not throw when matching array of any elements against []', function () { - expect(function () { - check([], []); - }).not.toThrowDeveloperError(); - expect(function () { - check([2], []); - }).not.toThrowDeveloperError(); - expect(function () { - check([34, 'snth'], []); - }).not.toThrowDeveloperError(); - }); - - it('throws when matching array with non-matching elements against [Type]', function () { - expect(function () { - check(['snth', 2], [Number]); - }).toThrowDeveloperError(); - expect(function () { - check([2, 'snth'], [String]); - }).toThrowDeveloperError(); - expect(function () { - check([34, 'snth'], [Boolean]); - }).toThrowDeveloperError(); - }); - - it('does not throw when matching array of matching elements against [Type]', function () { - expect(function () { - check([4, 2], [Number]); - }).not.toThrowDeveloperError(); - expect(function () { - check(['snth', 'snth'], [String]); - }).not.toThrowDeveloperError(); - expect(function () { - check([true, false], [Boolean]); - }).not.toThrowDeveloperError(); - }); - - it('throws on matching non-number with Number', function () { - expect(function () { - check('aeou', Number); - }).toThrowDeveloperError(); - expect(function () { - check(true, Number); - }).toThrowDeveloperError(); - expect(function () { - check(function() {}, Number); - }).toThrowDeveloperError(); - expect(function () { - check({}, Number); - }).toThrowDeveloperError(); - }); - - it('does not throw on matching number with Number', function () { - expect(function () { - check(3.39, Number); - }).not.toThrowDeveloperError(); - expect(function () { - check(3, Number); - }).not.toThrowDeveloperError(); - }); - - it('throws on matching non-string with String', function () { - expect(function () { - check(23, String); - }).toThrowDeveloperError(); - expect(function () { - check(true, String); - }).toThrowDeveloperError(); - expect(function () { - check(function() {}, String); - }).toThrowDeveloperError(); - expect(function () { - check({}, String); - }).toThrowDeveloperError(); - }); - - it('does not throw on matching string with String', function () { - expect(function () { - check('snt', String); - }).not.toThrowDeveloperError(); - }); - - it('throws for failing Match.Where condition', function () { - var condition = function (x) { - return x > 0.0; - }; - expect(function () { - check(-1, Match.Where(condition)); - }).toThrowDeveloperError(); - }); - - it('does not throw for valid Match.Where condition', function () { - var condition = function (x) { - return x > 0.0; - }; - expect(function () { - check(1, Match.Where(condition)); - }).not.toThrowDeveloperError(); - }); - -}); diff --git a/Specs/Core/checkSpec.js b/Specs/Core/checkSpec.js new file mode 100644 index 000000000000..04d0b8759017 --- /dev/null +++ b/Specs/Core/checkSpec.js @@ -0,0 +1,226 @@ +/*global defineSuite*/ +defineSuite([ + 'Core/check' + ], function( + check) { + 'use strict'; + + describe('type checks', function () { + it('check.type.array does not throw when passed an array', function () { + expect(function () { + check.type.array([]); + }).not.toThrowDeveloperError(); + }); + it('check.type.array does not throw when passed a typed array', function () { + expect(function () { + check.type.array([]); + }).not.toThrowDeveloperError(); + }); + + it('check.type.array throws when passed non-array', function () { + expect(function () { + check.type.array({}); + }).toThrowDeveloperError(); + expect(function () { + check.type.array(true); + }).toThrowDeveloperError(); + expect(function () { + check.type.array(1); + }).toThrowDeveloperError(); + expect(function () { + check.type.array('snth'); + }).toThrowDeveloperError(); + expect(function () { + check.type.array(function () {return true;}); + }).toThrowDeveloperError(); + }); + + it('check.type.boolean does not throw when passed a boolean', function () { + expect(function () { + check.type.boolean(true); + }).not.toThrowDeveloperError(); + }); + + it('check.type.boolean throws when passed a non-boolean', function () { + expect(function () { + check.type.boolean({}); + }).toThrowDeveloperError(); + expect(function () { + check.type.boolean([]); + }).toThrowDeveloperError(); + expect(function () { + check.type.boolean(1); + }).toThrowDeveloperError(); + expect(function () { + check.type.boolean('snth'); + }).toThrowDeveloperError(); + expect(function () { + check.type.boolean(function () {return true;}); + }).toThrowDeveloperError(); + }); + + it('check.type.function does not throw when passed a function', function () { + expect(function () { + check.type.function(function () {return true;}); + }).not.toThrowDeveloperError(); + }); + + it('check.type.function throws when passed a non-function', function () { + expect(function () { + check.type.function({}); + }).toThrowDeveloperError(); + expect(function () { + check.type.function([]); + }).toThrowDeveloperError(); + expect(function () { + check.type.function(1); + }).toThrowDeveloperError(); + expect(function () { + check.type.function('snth'); + }).toThrowDeveloperError(); + expect(function () { + check.type.function(true); + }).toThrowDeveloperError(); + }); + + it('check.type.object does not throw when passed object', function() { + expect(function () { + check.type.object({}); + }).not.toThrowDeveloperError(); + }); + + it('check.type.object throws when passed non-object', function() { + expect(function () { + check.type.object('snth'); + }).toThrowDeveloperError(); + expect(function () { + check.type.object(true); + }).toThrowDeveloperError(); + expect(function () { + check.type.object(1); + }).toThrowDeveloperError(); + expect(function () { + check.type.object([2]); + }).toThrowDeveloperError(); + expect(function () { + check.type.object(function () {return true;}); + }).toThrowDeveloperError(); + }); + + it('check.type.number does not throw when passed number', function() { + expect(function () { + check.type.number(2); + }).not.toThrowDeveloperError(); + }); + + it('check.type.number throws when passed non-number', function() { + expect(function () { + check.type.number('snth'); + }).toThrowDeveloperError(); + expect(function () { + check.type.number(true); + }).toThrowDeveloperError(); + expect(function () { + check.type.number({}); + }).toThrowDeveloperError(); + expect(function () { + check.type.number([2]); + }).toThrowDeveloperError(); + expect(function () { + check.type.number(function () {return true;}); + }).toThrowDeveloperError(); + }); + + it('check.type.string does not throw when passed a string', function () { + expect(function () { + check.type.string('s'); + }).not.toThrowDeveloperError(); + }); + + it('check.type.string throws on non-string', function () { + expect(function () { + check.type.string({}); + }).toThrowDeveloperError(); + expect(function () { + check.type.string(true); + }).toThrowDeveloperError(); + expect(function () { + check.type.string(1); + }).toThrowDeveloperError(); + expect(function () { + check.type.string([2]); + }).toThrowDeveloperError(); + expect(function () { + check.type.string(function () {return true;}); + }).toThrowDeveloperError(); + }); + }); + + describe('numeric tests: min/max/min-max', function () { + it('min throws on value less than min', function () { + expect(function () { + check.numeric.min(4, 5); + }).toThrowDeveloperError(); + }); + it('min does not throw on value at least as big as min', function () { + expect(function () { + check.numeric.min(4, 4); + check.numeric.min(4, 3); + }).not.toThrowDeveloperError(); + }); + + it('max throws on value greater than max', function () { + expect(function () { + check.numeric.max(6, 5); + }).toThrowDeveloperError(); + }); + it('max does not throw on value at most as big as max', function () { + expect(function () { + check.numeric.max(5, 5); + check.numeric.max(4, 5); + }).not.toThrowDeveloperError(); + }); + + it('minMax throws on value outside range', function () { + expect(function () { + check.numeric.minMax(-2, 3, 5); + check.numeric.minMax(6, 3, 5); + }).toThrowDeveloperError(); + }); + it('minMax does not throw on value inside range', function () { + expect(function () { + check.numeric.minMax(3, 3, 5); + check.numeric.minMax(5, 3, 5); + check.numeric.minMax(4, 3, 5); + }).not.toThrowDeveloperError(); + }); + }); + + it('check.defined does not throw when passed value that is not undefined', function () { + expect(function () { + check.defined({}); + }).not.toThrowDeveloperError(); + expect(function () { + check.defined([]); + }).not.toThrowDeveloperError(); + expect(function () { + check.defined(null); + }).not.toThrowDeveloperError(); + expect(function () { + check.defined(2); + }).not.toThrowDeveloperError(); + expect(function () { + check.defined(function() {return true;}); + }).not.toThrowDeveloperError(); + expect(function () { + check.defined('snt'); + }).not.toThrowDeveloperError(); + }); + + it('check.defined throws when passed undefined', function () { + expect(function () { + check.defined(undefined); + }).toThrowDeveloperError(); + }); + +}); From 93876bc69ec51d8a5369c62dc7c533664442de59 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Thu, 8 Dec 2016 14:11:19 -0500 Subject: [PATCH 172/396] Address review comments --- CHANGES.md | 2 +- Source/Core/BingMapsGeocoderService.js | 15 ++++++ Source/Core/GeocoderService.js | 10 ++++ Source/Core/LongLatGeocoderService.js | 12 +++-- .../OpenStreetMapNominatimGeocoderService.js | 14 ++++-- Source/Widgets/Geocoder/Geocoder.js | 1 + Source/Widgets/Geocoder/GeocoderViewModel.js | 46 +++++++++---------- 7 files changed, 69 insertions(+), 31 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 5dde6d39e540..fed3ac1f38d4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,7 +4,7 @@ Change Log ### 1.29 - 2017-01-02 * Deprecated * The properties `url` and `key` will be removed from `GeocoderViewModel` in 1.30. This properties will be available on geocoder services that support them, like `BingMapsGeocoderService`; -* Added support for custom geocoder services [4723](https://github.com/AnalyticalGraphicsInc/cesium/pull/4723). +* Added support for custom geocoder services [#4723](https://github.com/AnalyticalGraphicsInc/cesium/pull/4723). * Added the ability to blend a `Model` with a color/translucency. Added `color`, `colorBlendMode`, and `colorBlendAmount` properties to `Model`, `ModelGraphics`, and CZML. Added `ColorBlendMode` enum. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) * Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) diff --git a/Source/Core/BingMapsGeocoderService.js b/Source/Core/BingMapsGeocoderService.js index 31785cc1c6a7..2aec91277620 100644 --- a/Source/Core/BingMapsGeocoderService.js +++ b/Source/Core/BingMapsGeocoderService.js @@ -18,11 +18,16 @@ define([ /** * Provides geocoding through Bing Maps. * @alias BingMapsGeocoderService + * @constructor * + * @param {Object} options Object with the following properties: + * @param {String} [key] A key to use with the Bing Maps geocoding service + * @param {Boolean} autoComplete Indicates whether this service shall be used to fetch auto-complete suggestions */ function BingMapsGeocoderService(options) { options = defaultValue(options, defaultValue.EMPTY_OBJECT); this._canceled = false; + this._displayName = 'Bing Maps Geocoder Service'; this._url = 'https://dev.virtualearth.net/REST/v1/Locations'; this._key = BingMapsApi.getKey(options.key); @@ -31,6 +36,16 @@ define([ } defineProperties(BingMapsGeocoderService.prototype, { + /** + * The display name of the geocoder service + * @type {String} + */ + displayName : { + get : function () { + return this._displayName; + } + }, + /** * The URL endpoint for the Bing geocoder service * @type {String} diff --git a/Source/Core/GeocoderService.js b/Source/Core/GeocoderService.js index 3fa0664abc27..14965256fa01 100644 --- a/Source/Core/GeocoderService.js +++ b/Source/Core/GeocoderService.js @@ -20,6 +20,7 @@ define([ * @constructor * * @see BingMapsGeocoderService + * @see OpenStreetMapNominatimGeocoderService */ function GeocoderService () { /** @@ -51,5 +52,14 @@ define([ */ GeocoderService.prototype.geocode = DeveloperError.throwInstantiationError; + /** + * A function that is called when geocoding is canceled by the user, so that the + * geocoding service can stop processing current requests. + * @function + * + * @returns {undefined} + */ + GeocoderService.prototype.cancel = DeveloperError.throwInstantiationError; + return GeocoderService; }); diff --git a/Source/Core/LongLatGeocoderService.js b/Source/Core/LongLatGeocoderService.js index c07c682a90a3..be29f6f890be 100644 --- a/Source/Core/LongLatGeocoderService.js +++ b/Source/Core/LongLatGeocoderService.js @@ -11,14 +11,18 @@ define([ /** * Provides geocoding through Bing Maps. - * @alias LongLatGeocoderService * + * @alias LongLatGeocoderService + * @constructor */ - function LongLatGeocoderService(options) { - options = defaultValue(options, defaultValue.EMPTY_OBJECT); + function LongLatGeocoderService() { this.autoComplete = false; } + /** + * This service completes geocoding synchronously and therefore does not + * need to handle canceled requests that have not finished yet. + */ LongLatGeocoderService.prototype.cancel = function() { }; @@ -28,7 +32,7 @@ define([ * @param {String} query The query to be sent to the geocoder service * @returns {Promise} */ - LongLatGeocoderService.prototype.geocode = function(query, callback) { + LongLatGeocoderService.prototype.geocode = function(query) { try { var splitQuery = query.match(/[^\s,\n]+/g); if ((splitQuery.length === 2) || (splitQuery.length === 3)) { diff --git a/Source/Core/OpenStreetMapNominatimGeocoderService.js b/Source/Core/OpenStreetMapNominatimGeocoderService.js index 749bc9aa8e0e..9c5386fb3458 100644 --- a/Source/Core/OpenStreetMapNominatimGeocoderService.js +++ b/Source/Core/OpenStreetMapNominatimGeocoderService.js @@ -14,21 +14,29 @@ define([ /** * Provides geocoding through OpenStreetMap Nominatim. * @alias OpenStreetMapNominatimGeocoder + * @constructor * + * @param {Object} options Object with the following properties: + * @param {Boolean} autoComplete Indicates whether this service shall be used to fetch auto-complete suggestions */ function OpenStreetMapNominatimGeocoder(options) { options = defaultValue(options, defaultValue.EMPTY_OBJECT); - this.displayName = defaultValue(options.displayName, 'Nominatim'); + this.displayName = 'Nominatim'; this._canceled = false; this.autoComplete = defaultValue(options.autoComplete, true); } + /** + * The function called when a user cancels geocoding. + * + * @returns {undefined} + */ OpenStreetMapNominatimGeocoder.prototype.cancel = function() { this._canceled = true; }; /** - * @function + * The function called to geocode using this geocoder service. * * @param {String} query The query to be sent to the geocoder service * @returns {Promise} @@ -52,7 +60,7 @@ define([ ) }; }); - }) + }); }; return OpenStreetMapNominatimGeocoder; diff --git a/Source/Widgets/Geocoder/Geocoder.js b/Source/Widgets/Geocoder/Geocoder.js index 34f1761ff217..0d2ba2e53522 100644 --- a/Source/Widgets/Geocoder/Geocoder.js +++ b/Source/Widgets/Geocoder/Geocoder.js @@ -32,6 +32,7 @@ define([ * @param {Object} options Object with the following properties: * @param {Element|String} options.container The DOM element or ID that will contain the widget. * @param {Scene} options.scene The Scene instance to use. + * @param {Object} [options.geocoderServices] The geocoder services to be used * @param {String} [options.url='https://dev.virtualearth.net'] The base URL of the Bing Maps API. * @param {String} [options.key] The Bing Maps key for your application, which can be * created at {@link https://www.bingmapsportal.com}. diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index b8440ba086a0..ac884f5d6636 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -70,8 +70,7 @@ define([ if (!defined(options.geocoderServices)) { this._geocoderServices = [ new LongLatGeocoderService(), - new BingMapsGeocoderService(), - new OpenStreetMapNominatimGeocoderService() + new BingMapsGeocoderService() ]; } @@ -105,6 +104,7 @@ define([ this._selectedSuggestion = knockout.observable(); this._showSuggestions = knockout.observable(true); this._updateCamera = updateCamera; + this._adjustSuggestionsScroll = adjustSuggestionsScroll; var that = this; @@ -124,25 +124,6 @@ define([ } }); - this._adjustSuggestionsScroll = function (focusedItemIndex) { - var container = getElement(this._viewContainer); - var searchResults = container.getElementsByClassName('search-results')[0]; - var listItems = container.getElementsByTagName('li'); - var element = listItems[focusedItemIndex]; - - if (focusedItemIndex === 0) { - searchResults.scrollTop = 0; - return; - } - - var offsetTop = element.offsetTop; - if (offsetTop + element.clientHeight > searchResults.clientHeight) { - searchResults.scrollTop = offsetTop + element.clientHeight; - } else if (offsetTop < searchResults.scrollTop) { - searchResults.scrollTop = offsetTop; - } - }; - this.handleArrowDown = function () { if (that._suggestions().length === 0) { return; @@ -152,7 +133,7 @@ define([ var next = (currentIndex + 1) % numberOfSuggestions; that._selectedSuggestion(that._suggestions()[next]); - this._adjustSuggestionsScroll(next); + adjustSuggestionsScroll(this, next); }; this.handleArrowUp = function () { @@ -169,7 +150,7 @@ define([ } that._selectedSuggestion(that._suggestions()[next]); - this._adjustSuggestionsScroll(next); + adjustSuggestionsScroll(this, next); }; this.deselectSuggestion = function () { @@ -519,6 +500,25 @@ define([ }); } + function adjustSuggestionsScroll(viewModel, focusedItemIndex) { + var container = getElement(viewModel._viewContainer); + var searchResults = container.getElementsByClassName('search-results')[0]; + var listItems = container.getElementsByTagName('li'); + var element = listItems[focusedItemIndex]; + + if (focusedItemIndex === 0) { + searchResults.scrollTop = 0; + return; + } + + var offsetTop = element.offsetTop; + if (offsetTop + element.clientHeight > searchResults.clientHeight) { + searchResults.scrollTop = offsetTop + element.clientHeight; + } else if (offsetTop < searchResults.scrollTop) { + searchResults.scrollTop = offsetTop; + } + } + function cancelGeocode(viewModel) { viewModel._isSearchInProgress = false; if (defined(viewModel._geocodeInProgress)) { From 5e1e9cff682260033eddeae2a074e219e80097c8 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 8 Dec 2016 14:14:50 -0500 Subject: [PATCH 173/396] More accurate translucencly check --- Source/Scene/Model.js | 88 +++++++++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 33 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index f54d44689ebb..7af8f2d1995b 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -3612,11 +3612,11 @@ define([ 'void main() \n' + '{ \n' + ' gltf_silhouette_main(); \n' + - ' vec3 n = v_normal; \n' + + ' vec3 n = normalize(v_normal); \n' + ' n.x *= czm_projection[0][0]; \n' + ' n.y *= czm_projection[1][1]; \n' + ' vec4 clip = gl_Position; \n' + - ' clip.xy += n.xy * clip.w * gltf_silhouetteSize / czm_viewport.z * 2.0; \n' + + ' clip.xy += n.xy * clip.w * gltf_silhouetteSize / czm_viewport.z; \n' + ' gl_Position = clip; \n' + '}'; @@ -3639,6 +3639,19 @@ define([ return silhouetteSupported(frameState.context) && (model.silhouetteSize > 0.0) && (model.silhouetteColor.alpha > 0.0); } + function hasTranslucentCommands(model) { + var nodeCommands = model._nodeCommands; + var length = nodeCommands.length; + for (var i = 0; i < length; ++i) { + var nodeCommand = nodeCommands[i]; + var command = nodeCommand.command; + if (command.renderState.blending.enabled) { + return true; + } + } + return false; + } + function isTranslucent(model) { return (model.color.alpha > 0.0) && (model.color.alpha < 1.0); } @@ -3652,29 +3665,16 @@ define([ return (Math.floor(currAlpha) !== Math.floor(prevAlpha)) || (Math.ceil(currAlpha) !== Math.ceil(prevAlpha)); } - function updateSilhouette(model, frameState) { - // Generate silhouette commands when the silhouette size is greater than 0.0 and the alpha is greater than 0.0 - // There are two silhouette commands: - // 1. silhouetteModelCommand : render model normally while enabling stencil mask - // 2. silhouetteColorCommand : render enlarged model with a solid color while enabling stencil tests - if (!hasSilhouette(model, frameState)) { - return; - } - - var nodeCommands = model._nodeCommands; - var dirty = alphaDirty(model.color.alpha, model._color.alpha) || - alphaDirty(model.silhouetteColor.alpha, model._silhouetteColor.alpha) || - !defined(nodeCommands[0].silhouetteModelCommand); - - Color.clone(model.color, model._color); - Color.clone(model.silhouetteColor, model._silhouetteColor); - - if (!dirty) { - return; - } + // TODO : alternatively increment silhouette length as part of frame state and edit the model render states on the fly + var silhouettesLength = 0; + function createSilhouetteCommands(model, frameState) { + // If the model is translucent the silhouette needs to be in the translucent pass. + // Otherwise the silhouette would be rendered before the model. + var silhouetteTranslucent = hasTranslucentCommands(model) || isTranslucent(model) || (model.silhouetteColor.alpha < 1.0); var silhouettePrograms = model._rendererResources.silhouettePrograms; var scene3DOnly = frameState.scene3DOnly; + var nodeCommands = model._nodeCommands; var length = nodeCommands.length; for (var i = 0; i < length; ++i) { var nodeCommand = nodeCommands[i]; @@ -3685,12 +3685,16 @@ define([ var silhouetteModelCommand = DrawCommand.shallowClone(modelCommand); var renderState = clone(modelCommand.renderState); - // Write the value 1 into the stencil buffer + // Wrap around after exceeding the 8-bit stencil limit. + // The reference is unique to each model until this point. + var stencilReference = (++silhouettesLength) % 255; + + // Write the reference value into the stencil buffer. renderState.stencilTest = { enabled : true, frontFunction : WebGLConstants.ALWAYS, backFunction : WebGLConstants.ALWAYS, - reference : 1, + reference : stencilReference, mask : ~0, frontOperation : { fail : WebGLConstants.KEEP, @@ -3721,20 +3725,20 @@ define([ // Create color command var silhouetteColorCommand = DrawCommand.shallowClone(command); renderState = clone(command.renderState, true); - if (model.silhouetteColor.alpha < 1.0) { + renderState.depthTest.enabled = true; + renderState.cull.enabled = false; + if (silhouetteTranslucent) { silhouetteColorCommand.pass = Pass.TRANSLUCENT; renderState.depthMask = false; renderState.blending = BlendingState.ALPHA_BLEND; } - renderState.depthTest.enabled = true; - renderState.cull.enabled = false; - // Only render if value of the stencil buffer is not 1. + // Only render silhouette if the value in the stencil buffer equals the reference renderState.stencilTest = { enabled : true, frontFunction : WebGLConstants.NOTEQUAL, backFunction : WebGLConstants.NOTEQUAL, - reference : 1, + reference : stencilReference, mask : ~0, frontOperation : { fail : WebGLConstants.KEEP, @@ -3785,6 +3789,28 @@ define([ } } + function updateSilhouette(model, frameState) { + // Generate silhouette commands when the silhouette size is greater than 0.0 and the alpha is greater than 0.0 + // There are two silhouette commands: + // 1. silhouetteModelCommand : render model normally while enabling stencil mask + // 2. silhouetteColorCommand : render enlarged model with a solid color while enabling stencil tests + if (!hasSilhouette(model, frameState)) { + return; + } + + var nodeCommands = model._nodeCommands; + var dirty = alphaDirty(model.color.alpha, model._color.alpha) || + alphaDirty(model.silhouetteColor.alpha, model._silhouetteColor.alpha) || + !defined(nodeCommands[0].silhouetteModelCommand); + + Color.clone(model.color, model._color); + Color.clone(model.silhouetteColor, model._silhouetteColor); + + if (dirty) { + createSilhouetteCommands(model, frameState); + } + } + var scratchBoundingSphere = new BoundingSphere(); function scaleInPixels(positionWC, radius, frameState) { @@ -4245,10 +4271,6 @@ define([ } } } - - commandList.push(new ClearCommand({ - stencil : 0 - })); } if (passes.pick && this.allowPicking) { From e76e6930ab1ec43c76869df1229f73636fe8e8d4 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Thu, 8 Dec 2016 14:28:28 -0500 Subject: [PATCH 174/396] Make label tests more robust, fix vertical center test. --- Specs/Scene/LabelCollectionSpec.js | 33 ++++++++++++++++-------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/Specs/Scene/LabelCollectionSpec.js b/Specs/Scene/LabelCollectionSpec.js index c7bb80f3310f..8a87183fa3ab 100644 --- a/Specs/Scene/LabelCollectionSpec.js +++ b/Specs/Scene/LabelCollectionSpec.js @@ -48,6 +48,9 @@ defineSuite([ var labels; var labelsWithHeight; + // This Unicode square block will more reliably cover the center pixel than an 'x' or a 'w' char. + var solidBox = '\u25a0'; + beforeAll(function() { scene = createScene(); camera = scene.camera; @@ -343,19 +346,19 @@ defineSuite([ it('can render after adding a label', function() { labels.add({ position : Cartesian3.ZERO, - text : 'w', + text : solidBox, horizontalOrigin : HorizontalOrigin.CENTER, verticalOrigin : VerticalOrigin.CENTER }); var actual = scene.renderForSpecs(); - expect(actual[0]).toBeGreaterThan(10); - expect(actual[1]).toBeGreaterThan(10); - expect(actual[2]).toBeGreaterThan(10); + expect(actual[0]).toBeGreaterThan(200); + expect(actual[1]).toBeGreaterThan(200); + expect(actual[2]).toBeGreaterThan(200); labels.add({ position : new Cartesian3(1.0, 0.0, 0.0), // Closer to camera - text : 'x', + text : solidBox, fillColor : { red : 1.0, green : 0.0, @@ -367,7 +370,7 @@ defineSuite([ }); actual = scene.renderForSpecs(); - expect(actual[0]).toBeGreaterThan(10); + expect(actual[0]).toBeGreaterThan(200); expect(actual[1]).toBeLessThan(10); expect(actual[2]).toBeLessThan(10); }); @@ -543,7 +546,7 @@ defineSuite([ labels.add({ position : Cartesian3.ZERO, pixelOffset : new Cartesian2(1.0, 0.0), - text : 'x', + text : solidBox, horizontalOrigin : HorizontalOrigin.CENTER, verticalOrigin : VerticalOrigin.CENTER, pixelOffsetScaleByDistance: new NearFarScalar(2.0, 0.0, 4.0, 1000.0) @@ -559,7 +562,7 @@ defineSuite([ it('renders label with distanceDisplayCondition', function() { labels.add({ position : Cartesian3.ZERO, - text : 'm', + text : solidBox, distanceDisplayCondition : new DistanceDisplayCondition(10.0, 100.0), horizontalOrigin : HorizontalOrigin.CENTER, verticalOrigin : VerticalOrigin.CENTER @@ -597,7 +600,7 @@ defineSuite([ it('can pick a label', function() { var label = labels.add({ position : Cartesian3.ZERO, - text : 'x', + text : solidBox, horizontalOrigin : HorizontalOrigin.CENTER, verticalOrigin : VerticalOrigin.CENTER, id : 'id' @@ -611,7 +614,7 @@ defineSuite([ it('can change pick id', function() { var label = labels.add({ position : Cartesian3.ZERO, - text : 'x', + text : solidBox, horizontalOrigin : HorizontalOrigin.CENTER, verticalOrigin : VerticalOrigin.CENTER, id : 'id' @@ -632,7 +635,7 @@ defineSuite([ labels.add({ show : false, position : Cartesian3.ZERO, - text : 'x', + text : solidBox, horizontalOrigin : HorizontalOrigin.CENTER, verticalOrigin : VerticalOrigin.CENTER }); @@ -644,7 +647,7 @@ defineSuite([ it('picks a label using translucencyByDistance', function() { var label = labels.add({ position : Cartesian3.ZERO, - text : 'x', + text : solidBox, horizontalOrigin : HorizontalOrigin.CENTER, verticalOrigin : VerticalOrigin.CENTER }); @@ -667,7 +670,7 @@ defineSuite([ var label = labels.add({ position : Cartesian3.ZERO, pixelOffset : new Cartesian2(0.0, 100.0), - text : 'x', + text : solidBox, horizontalOrigin : HorizontalOrigin.CENTER, verticalOrigin : VerticalOrigin.CENTER }); @@ -971,8 +974,8 @@ defineSuite([ scene.renderForSpecs(); var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); - expect(bbox.y).toBeGreaterThan(bbox.height * -1.0); - expect(bbox.y).toBeLessThan(bbox.height * -0.5); + expect(bbox.y).toBeGreaterThan(bbox.height * -0.9); + expect(bbox.y).toBeLessThan(bbox.height * -0.3); }); it('computes screen space bounding box with vertical origin top', function() { From 246dc8348a57612d6b94177ab1b13b88ea34e0c6 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 8 Dec 2016 14:33:43 -0500 Subject: [PATCH 175/396] Fix spec --- Specs/Scene/ModelSpec.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Specs/Scene/ModelSpec.js b/Specs/Scene/ModelSpec.js index b23a5699a2e3..5c484eee2b8d 100644 --- a/Specs/Scene/ModelSpec.js +++ b/Specs/Scene/ModelSpec.js @@ -235,9 +235,8 @@ defineSuite([ expect(texturedBoxModel.debugShowBoundingVolume).toEqual(false); expect(texturedBoxModel.debugWireframe).toEqual(false); expect(texturedBoxModel.distanceDisplayCondition).toBeUndefined(); - expect(texturedBoxModel.highlight).toEqual(false); - expect(texturedBoxModel.highlightSize).toEqual(2.0); - expect(texturedBoxModel.highlightColor).toEqual(new Color()); + expect(texturedBoxModel.silhouetteColor).toEqual(Color.RED); + expect(texturedBoxModel.silhouetteSize).toEqual(0.0); }); From 60caefac64ddd3e3b20f3fd5fea295d403f1cab9 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 8 Dec 2016 14:39:05 -0500 Subject: [PATCH 176/396] Change order of stencilReference --- Source/Scene/Model.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 7af8f2d1995b..d7cd0e4f73f5 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -35,7 +35,6 @@ define([ '../Core/Transforms', '../Renderer/Buffer', '../Renderer/BufferUsage', - '../Renderer/ClearCommand', '../Renderer/DrawCommand', '../Renderer/RenderState', '../Renderer/Sampler', @@ -98,7 +97,6 @@ define([ Transforms, Buffer, BufferUsage, - ClearCommand, DrawCommand, RenderState, Sampler, @@ -3669,6 +3667,10 @@ define([ var silhouettesLength = 0; function createSilhouetteCommands(model, frameState) { + // Wrap around after exceeding the 8-bit stencil limit. + // The reference is unique to each model until this point. + var stencilReference = (++silhouettesLength) % 255; + // If the model is translucent the silhouette needs to be in the translucent pass. // Otherwise the silhouette would be rendered before the model. var silhouetteTranslucent = hasTranslucentCommands(model) || isTranslucent(model) || (model.silhouetteColor.alpha < 1.0); @@ -3685,10 +3687,6 @@ define([ var silhouetteModelCommand = DrawCommand.shallowClone(modelCommand); var renderState = clone(modelCommand.renderState); - // Wrap around after exceeding the 8-bit stencil limit. - // The reference is unique to each model until this point. - var stencilReference = (++silhouettesLength) % 255; - // Write the reference value into the stencil buffer. renderState.stencilTest = { enabled : true, From 2849a18227c6ab5a16393291395dd5f26c2571d9 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Thu, 8 Dec 2016 15:05:34 -0500 Subject: [PATCH 177/396] Fix CHANGES.md --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index fed3ac1f38d4..b98ea0837e15 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,7 +3,7 @@ Change Log ### 1.29 - 2017-01-02 * Deprecated - * The properties `url` and `key` will be removed from `GeocoderViewModel` in 1.30. This properties will be available on geocoder services that support them, like `BingMapsGeocoderService`; + * The properties `url` and `key` will be removed from `GeocoderViewModel` in 1.30. These properties will be available on geocoder services that support them, like `BingMapsGeocoderService`. * Added support for custom geocoder services [#4723](https://github.com/AnalyticalGraphicsInc/cesium/pull/4723). * Added the ability to blend a `Model` with a color/translucency. Added `color`, `colorBlendMode`, and `colorBlendAmount` properties to `Model`, `ModelGraphics`, and CZML. Added `ColorBlendMode` enum. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) From 23fc77164930e859fe96a1d536476054477fd1c1 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Thu, 8 Dec 2016 15:43:54 -0500 Subject: [PATCH 178/396] Fix issues brought up in review --- Source/Core/Cartesian3.js | 140 ++++++++++---------- Source/Core/Check.js | 154 ++++++++++++++++++++++ Source/Core/check.js | 111 ---------------- Specs/Core/{checkSpec.js => CheckSpec.js} | 144 ++++++++++---------- 4 files changed, 295 insertions(+), 254 deletions(-) create mode 100644 Source/Core/Check.js delete mode 100644 Source/Core/check.js rename Specs/Core/{checkSpec.js => CheckSpec.js} (58%) diff --git a/Source/Core/Cartesian3.js b/Source/Core/Cartesian3.js index 034e0b6c71b6..78aae859e51f 100644 --- a/Source/Core/Cartesian3.js +++ b/Source/Core/Cartesian3.js @@ -1,13 +1,13 @@ /*global define*/ define([ - './check', - './defaultValue', - './defined', - './DeveloperError', - './freezeObject', - './Math' + './Check', + './defaultValue', + './defined', + './DeveloperError', + './freezeObject', + './Math' ], function( - check, + Check, defaultValue, defined, DeveloperError, @@ -60,7 +60,7 @@ define([ */ Cartesian3.fromSpherical = function(spherical, result) { //>>includeStart('debug', pragmas.debug); - check.type.object(spherical); + Check.type.object(spherical); //>>includeEnd('debug'); if (!defined(result)) { @@ -146,8 +146,8 @@ define([ */ Cartesian3.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - check.type.object(value); - check.defined(array, 'array'); + Check.type.object(value); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -169,7 +169,7 @@ define([ */ Cartesian3.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - check.defined(array, 'array'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -192,7 +192,7 @@ define([ */ Cartesian3.packArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - check.defined(array, 'array'); + Check.defined(array, 'array'); //>>includeEnd('debug'); var length = array.length; @@ -217,8 +217,8 @@ define([ */ Cartesian3.unpackArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - check.defined(array, 'array'); - check.numeric.min(array.length, 3); + Check.defined(array, 'array'); + Check.numeric.minimum(array.length, 3); if (array.length % 3 !== 0) { throw new DeveloperError('array length must be a multiple of 3.'); } @@ -266,7 +266,7 @@ define([ */ Cartesian3.maximumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - check.defined(cartesian, 'cartesian'); + Check.defined(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.max(cartesian.x, cartesian.y, cartesian.z); @@ -280,7 +280,7 @@ define([ */ Cartesian3.minimumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - check.defined(cartesian, 'cartesian'); + Check.defined(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.min(cartesian.x, cartesian.y, cartesian.z); @@ -296,9 +296,9 @@ define([ */ Cartesian3.minimumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - check.defined(first,'first'); - check.defined(second, 'second'); - check.defined(result, 'result'); + Check.defined(first,'first'); + Check.defined(second, 'second'); + Check.defined(result, 'result'); //>>includeEnd('debug'); result.x = Math.min(first.x, second.x); @@ -318,9 +318,9 @@ define([ */ Cartesian3.maximumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - check.defined(first, 'first'); - check.defined(second, 'second'); - check.defined(result, 'result'); + Check.defined(first, 'first'); + Check.defined(second, 'second'); + Check.defined(result, 'result'); //>>includeEnd('debug'); result.x = Math.max(first.x, second.x); @@ -337,7 +337,7 @@ define([ */ Cartesian3.magnitudeSquared = function(cartesian) { //>>includeStart('debug', pragmas.debug); - check.defined(cartesian, 'cartesian'); + Check.defined(cartesian, 'cartesian'); //>>includeEnd('debug'); return cartesian.x * cartesian.x + cartesian.y * cartesian.y + cartesian.z * cartesian.z; @@ -368,9 +368,8 @@ define([ */ Cartesian3.distance = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left) || !defined(right)) { - throw new DeveloperError('left and right are required.'); - } + Check.defined(left, 'left'); + Check.defined(right, 'right'); //>>includeEnd('debug'); Cartesian3.subtract(left, right, distanceScratch); @@ -391,9 +390,8 @@ define([ */ Cartesian3.distanceSquared = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left) || !defined(right)) { - throw new DeveloperError('left and right are required.'); - } + Check.defined(left, 'left'); + Check.defined(right, 'right'); //>>includeEnd('debug'); Cartesian3.subtract(left, right, distanceScratch); @@ -409,8 +407,8 @@ define([ */ Cartesian3.normalize = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - check.defined(cartesian, 'cartesian'); - check.defined(result, 'result'); + Check.defined(cartesian, 'cartesian'); + Check.defined(result, 'result'); //>>includeEnd('debug'); var magnitude = Cartesian3.magnitude(cartesian); @@ -437,8 +435,8 @@ define([ */ Cartesian3.dot = function(left, right) { //>>includeStart('debug', pragmas.debug); - check.defined(left, 'left'); - check.defined(right, 'right'); + Check.defined(left, 'left'); + Check.defined(right, 'right'); //>>includeEnd('debug'); return left.x * right.x + left.y * right.y + left.z * right.z; @@ -454,9 +452,9 @@ define([ */ Cartesian3.multiplyComponents = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - check.defined(left, 'left'); - check.defined(right, 'right'); - check.defined(result, 'result'); + Check.defined(left, 'left'); + Check.defined(right, 'right'); + Check.defined(result, 'result'); //>>includeEnd('debug'); result.x = left.x * right.x; @@ -475,9 +473,9 @@ define([ */ Cartesian3.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - check.defined(left, 'left'); - check.defined(right, 'right'); - check.defined(result, 'result'); + Check.defined(left, 'left'); + Check.defined(right, 'right'); + Check.defined(result, 'result'); //>>includeEnd('debug'); result.x = left.x + right.x; @@ -496,9 +494,9 @@ define([ */ Cartesian3.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - check.defined(left, 'left'); - check.defined(right, 'right'); - check.defined(result, 'result'); + Check.defined(left, 'left'); + Check.defined(right, 'right'); + Check.defined(result, 'result'); //>>includeEnd('debug'); result.x = left.x - right.x; @@ -517,9 +515,9 @@ define([ */ Cartesian3.multiplyByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - check.defined(cartesian, 'cartesian'); - check.defined(scalar, 'scalar'); - check.defined(result, 'result'); + Check.defined(cartesian, 'cartesian'); + Check.defined(scalar, 'scalar'); + Check.defined(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x * scalar; @@ -538,9 +536,9 @@ define([ */ Cartesian3.divideByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - check.defined(cartesian, 'cartesian'); - check.defined(scalar, 'scalar'); - check.defined(result, 'result'); + Check.defined(cartesian, 'cartesian'); + Check.defined(scalar, 'scalar'); + Check.defined(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x / scalar; @@ -558,8 +556,8 @@ define([ */ Cartesian3.negate = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - check.defined(cartesian, 'cartesian'); - check.defined(result, 'result'); + Check.defined(cartesian, 'cartesian'); + Check.defined(result, 'result'); //>>includeEnd('debug'); result.x = -cartesian.x; @@ -577,8 +575,8 @@ define([ */ Cartesian3.abs = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - check.defined(cartesian, 'cartesian'); - check.defined(result, 'result'); + Check.defined(cartesian, 'cartesian'); + Check.defined(result, 'result'); //>>includeEnd('debug'); result.x = Math.abs(cartesian.x); @@ -599,10 +597,10 @@ define([ */ Cartesian3.lerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - check.defined(start, 'start'); - check.defined(end, 'end'); - check.defined(t, 't'); - check.defined(result, 'result'); + Check.defined(start, 'start'); + Check.defined(end, 'end'); + Check.defined(t, 't'); + Check.defined(result, 'result'); //>>includeEnd('debug'); Cartesian3.multiplyByScalar(end, t, lerpScratch); @@ -621,8 +619,8 @@ define([ */ Cartesian3.angleBetween = function(left, right) { //>>includeStart('debug', pragmas.debug); - check.defined(left, 'left'); - check.defined(right, 'right'); + Check.defined(left, 'left'); + Check.defined(right, 'right'); //>>includeEnd('debug'); Cartesian3.normalize(left, angleBetweenScratch); @@ -642,8 +640,8 @@ define([ */ Cartesian3.mostOrthogonalAxis = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - check.defined(cartesian, 'cartesian'); - check.defined(result, 'result'); + Check.defined(cartesian, 'cartesian'); + Check.defined(result, 'result'); //>>includeEnd('debug'); var f = Cartesian3.normalize(cartesian, mostOrthogonalAxisScratch); @@ -722,9 +720,9 @@ define([ */ Cartesian3.cross = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - check.defined(left, 'left'); - check.defined(right, 'right'); - check.defined(result, 'result'); + Check.defined(left, 'left'); + Check.defined(right, 'right'); + Check.defined(result, 'result'); //>>includeEnd('debug'); var leftX = left.x; @@ -759,8 +757,8 @@ define([ */ Cartesian3.fromDegrees = function(longitude, latitude, height, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - check.defined(longitude, 'longitude'); - check.defined(latitude, 'latitude'); + Check.defined(longitude, 'longitude'); + Check.defined(latitude, 'latitude'); //>>includeEnd('debug'); longitude = CesiumMath.toRadians(longitude); @@ -787,8 +785,8 @@ define([ */ Cartesian3.fromRadians = function(longitude, latitude, height, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - check.defined(longitude, 'longitude'); - check.defined(latitude, 'latitude'); + Check.defined(longitude, 'longitude'); + Check.defined(latitude, 'latitude'); //>>includeEnd('debug'); height = defaultValue(height, 0.0); @@ -824,7 +822,7 @@ define([ */ Cartesian3.fromDegreesArray = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - check.type.array(coordinates); + Check.type.array(coordinates); if (coordinates.length < 2 || coordinates.length % 2 !== 0) { throw new DeveloperError('the number of coordinates must be a multiple of 2 and at least 2'); } @@ -860,7 +858,7 @@ define([ */ Cartesian3.fromRadiansArray = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - check.type.array(coordinates); + Check.type.array(coordinates); if (coordinates.length < 2 || coordinates.length % 2 !== 0) { throw new DeveloperError('the number of coordinates must be a multiple of 2 and at least 2'); } @@ -896,7 +894,7 @@ define([ */ Cartesian3.fromDegreesArrayHeights = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - check.type.array(coordinates); + Check.type.array(coordinates); if (coordinates.length < 3 || coordinates.length % 3 !== 0) { throw new DeveloperError('the number of coordinates must be a multiple of 3 and at least 3'); } @@ -933,7 +931,7 @@ define([ */ Cartesian3.fromRadiansArrayHeights = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - check.defined(coordinates, 'coordinates'); + Check.defined(coordinates, 'coordinates'); if (coordinates.length < 3 || coordinates.length % 3 !== 0) { throw new DeveloperError('the number of coordinates must be a multiple of 3 and at least 3'); } diff --git a/Source/Core/Check.js b/Source/Core/Check.js new file mode 100644 index 000000000000..ec0ddbff42b6 --- /dev/null +++ b/Source/Core/Check.js @@ -0,0 +1,154 @@ +/*global define*/ +define([ + './defaultValue', + './defined', + './DeveloperError', + './isArray' + ], function( + defaultValue, + defined, + DeveloperError, + isArray) { + 'use strict'; + + /** + * Contains functions for checking that supplied arguments are of a specified type + * or meet specified conditions + * @private + * + * @exports Check + */ + var Check = {}; + + Check.type = {}; + Check.numeric = {}; + + var errors = { + defined: getUndefinedErrorMessage, + failedType: getFailedTypeErrorMessage + }; + + function getUndefinedErrorMessage(name) { + return defaultValue(name, 'variable') + ' is required but is undefined.'; + } + function getFailedTypeErrorMessage(actual, expected) { + return 'Expected ' + expected + ', got ' + actual; + } + + /** + * @param {} test The value that is to be checked + * @param {string} name The name of the variable being tested: makes + * @throws {DeveloperError} + */ + Check.defined = function (test, name) { + if (test === undefined) { + throw new DeveloperError(errors.defined(name)); + } + }; + + /** + * @param {} test The value to test + * @param {number} min The minimum allowed value + * @param {number} max The maximum allowed value + * @throws {DeveloperError} + */ + Check.numeric.withinRange = function (test, min, max) { + Check.type.number(test); + Check.type.number(max); + Check.type.number(min); + if (min > max) { + throw new DeveloperError('Invalid condition: min (' + min + ') must be less than max (' + max + ')'); + } + if (test > max || test < min) { + throw new DeveloperError('Invalid argument: expected ' + test + ' to be in range [' + min + ', ' + max + ']'); + } + }; + + /** + * @param {number} test The value to test + * @param {number} max The maximum allowed value + * @throws {DeveloperError} + */ + Check.numeric.maximum = function (test, max) { + Check.type.number(test); + Check.type.number(max); + if (test > max) { + throw new DeveloperError('Expected ' + test + ' to be at most ' + max); + } + }; + + /** + * @param {number} test The value to test + * @param {number} min The minimum allowed value + * @throws {DeveloperError} + */ + Check.numeric.minimum = function (test, min) { + Check.type.number(test); + Check.type.number(min); + if (test < min) { + throw new DeveloperError('Expected ' + test + ' to be at least ' + min); + } + }; + + /** + * @param {} test The value to test + * @throws {DeveloperError} + */ + Check.type.function = function (test) { + if (typeof test !== 'function') { + throw new DeveloperError(errors.failedType(typeof test, 'function')); + } + }; + + /** + * @param {} test The value to test + * @throws {DeveloperError} + */ + Check.type.string = function (test) { + if (typeof test !== 'string') { + throw new DeveloperError(errors.failedType(typeof test, 'string')); + } + }; + + /** + * @param {} test The value to test + * @throws {DeveloperError} + */ + Check.type.number = function (test) { + if (typeof test !== 'number') { + throw new DeveloperError(errors.failedType(typeof test, 'number')); + } + }; + + /** + * @param {} test The value to test + * @throws {DeveloperError} + */ + Check.type.object = function (test) { + if (typeof test !== 'object' || isArray(test)) { + throw new DeveloperError(errors.failedType(typeof test, 'object')); + } + }; + + /** + * @param {} test The value to test + * @throws {DeveloperError} + */ + Check.type.array = function (test) { + if (!isArray(test)) { + throw new DeveloperError(errors.failedType(typeof test, 'array')); + } + }; + + /** + * @param {} test The value to test + * @throws {DeveloperError} + */ + Check.type.boolean = function (test) { + if (typeof test !== 'boolean') { + throw new DeveloperError(errors.failedType(typeof test, 'boolean')); + } + }; + + return Check; +}); diff --git a/Source/Core/check.js b/Source/Core/check.js deleted file mode 100644 index a0bf158c40b7..000000000000 --- a/Source/Core/check.js +++ /dev/null @@ -1,111 +0,0 @@ -/*global define*/ -define([ - './defined', - './DeveloperError', - './isArray' -], function(defined, - DeveloperError, - isArray) { - 'use strict'; - - var exports = { - defined: checkDefined, - numeric: { - min: checkMin, - minMax: checkMinMax, - max: checkMax - }, - type: { - array: checkArray, - boolean: checkBoolean, - function: checkFunction, - object: checkObject, - number: checkNumber, - string: checkString - } - }; - - var errors = { - defined: getUndefinedErrorMessage, - failedType: getFailedTypeErrorMessage - }; - - function getUndefinedErrorMessage(name) { - return name + ' is required but is undefined.'; - } - function getFailedTypeErrorMessage(actual, expected) { - return 'Expected ' + expected + ', got ' + actual; - } - - function checkMinMax(test, min, max) { - checkNumber(test); - checkNumber(max); - checkNumber(min); - if (min > max) { - throw new DeveloperError('Invalid condition: min (' + min + ') must be less than max (' + max + ')'); - } - if (test > max || test < min) { - throw new DeveloperError('Invalid argument: expected ' + test + ' to be in range [' + min + ', ' + max + ']'); - } - } - - function checkMax(test, max) { - checkNumber(test); - checkNumber(max); - if (test > max) { - throw new DeveloperError('Expected ' + test + ' to be at most ' + max); - } - } - - function checkMin(test, min) { - checkNumber(test); - checkNumber(min); - if (test < min) { - throw new DeveloperError('Expected ' + test + ' to be at least ' + min); - } - } - - function checkDefined(test, name) { - if (test === undefined) { - throw new DeveloperError(errors.defined(name)); - } - } - - function checkFunction(test) { - if (typeof test !== 'function') { - throw new DeveloperError(errors.failedType(typeof test, 'function')); - } - } - - function checkString(test) { - if (typeof test !== 'string') { - throw new DeveloperError(errors.failedType(typeof test, 'string')); - } - } - - function checkNumber(test) { - if (typeof test !== 'number') { - throw new DeveloperError(errors.failedType(typeof test, 'number')); - } - } - - function checkObject(test) { - if (typeof test !== 'object' || isArray(test)) { - throw new DeveloperError(errors.failedType(typeof test, 'object')); - } - } - - function checkArray(test) { - if (!isArray(test)) { - throw new DeveloperError(errors.failedType(typeof test, 'array')); - } - } - - function checkBoolean(test) { - if (typeof test !== 'boolean') { - throw new DeveloperError(errors.failedType(typeof test, 'boolean')); - } - } - - return exports; -}); diff --git a/Specs/Core/checkSpec.js b/Specs/Core/CheckSpec.js similarity index 58% rename from Specs/Core/checkSpec.js rename to Specs/Core/CheckSpec.js index 04d0b8759017..43012472cae3 100644 --- a/Specs/Core/checkSpec.js +++ b/Specs/Core/CheckSpec.js @@ -1,157 +1,157 @@ /*global defineSuite*/ defineSuite([ - 'Core/check' + 'Core/Check' ], function( - check) { + Check) { 'use strict'; describe('type checks', function () { - it('check.type.array does not throw when passed an array', function () { + it('Check.type.array does not throw when passed an array', function () { expect(function () { - check.type.array([]); + Check.type.array([]); }).not.toThrowDeveloperError(); }); - it('check.type.array does not throw when passed a typed array', function () { + it('Check.type.array does not throw when passed a typed array', function () { expect(function () { - check.type.array([]); + Check.type.array([]); }).not.toThrowDeveloperError(); }); - it('check.type.array throws when passed non-array', function () { + it('Check.type.array throws when passed non-array', function () { expect(function () { - check.type.array({}); + Check.type.array({}); }).toThrowDeveloperError(); expect(function () { - check.type.array(true); + Check.type.array(true); }).toThrowDeveloperError(); expect(function () { - check.type.array(1); + Check.type.array(1); }).toThrowDeveloperError(); expect(function () { - check.type.array('snth'); + Check.type.array('snth'); }).toThrowDeveloperError(); expect(function () { - check.type.array(function () {return true;}); + Check.type.array(function () {return true;}); }).toThrowDeveloperError(); }); - it('check.type.boolean does not throw when passed a boolean', function () { + it('Check.type.boolean does not throw when passed a boolean', function () { expect(function () { - check.type.boolean(true); + Check.type.boolean(true); }).not.toThrowDeveloperError(); }); - it('check.type.boolean throws when passed a non-boolean', function () { + it('Check.type.boolean throws when passed a non-boolean', function () { expect(function () { - check.type.boolean({}); + Check.type.boolean({}); }).toThrowDeveloperError(); expect(function () { - check.type.boolean([]); + Check.type.boolean([]); }).toThrowDeveloperError(); expect(function () { - check.type.boolean(1); + Check.type.boolean(1); }).toThrowDeveloperError(); expect(function () { - check.type.boolean('snth'); + Check.type.boolean('snth'); }).toThrowDeveloperError(); expect(function () { - check.type.boolean(function () {return true;}); + Check.type.boolean(function () {return true;}); }).toThrowDeveloperError(); }); - it('check.type.function does not throw when passed a function', function () { + it('Check.type.function does not throw when passed a function', function () { expect(function () { - check.type.function(function () {return true;}); + Check.type.function(function () {return true;}); }).not.toThrowDeveloperError(); }); - it('check.type.function throws when passed a non-function', function () { + it('Check.type.function throws when passed a non-function', function () { expect(function () { - check.type.function({}); + Check.type.function({}); }).toThrowDeveloperError(); expect(function () { - check.type.function([]); + Check.type.function([]); }).toThrowDeveloperError(); expect(function () { - check.type.function(1); + Check.type.function(1); }).toThrowDeveloperError(); expect(function () { - check.type.function('snth'); + Check.type.function('snth'); }).toThrowDeveloperError(); expect(function () { - check.type.function(true); + Check.type.function(true); }).toThrowDeveloperError(); }); - it('check.type.object does not throw when passed object', function() { + it('Check.type.object does not throw when passed object', function() { expect(function () { - check.type.object({}); + Check.type.object({}); }).not.toThrowDeveloperError(); }); - it('check.type.object throws when passed non-object', function() { + it('Check.type.object throws when passed non-object', function() { expect(function () { - check.type.object('snth'); + Check.type.object('snth'); }).toThrowDeveloperError(); expect(function () { - check.type.object(true); + Check.type.object(true); }).toThrowDeveloperError(); expect(function () { - check.type.object(1); + Check.type.object(1); }).toThrowDeveloperError(); expect(function () { - check.type.object([2]); + Check.type.object([2]); }).toThrowDeveloperError(); expect(function () { - check.type.object(function () {return true;}); + Check.type.object(function () {return true;}); }).toThrowDeveloperError(); }); - it('check.type.number does not throw when passed number', function() { + it('Check.type.number does not throw when passed number', function() { expect(function () { - check.type.number(2); + Check.type.number(2); }).not.toThrowDeveloperError(); }); - it('check.type.number throws when passed non-number', function() { + it('Check.type.number throws when passed non-number', function() { expect(function () { - check.type.number('snth'); + Check.type.number('snth'); }).toThrowDeveloperError(); expect(function () { - check.type.number(true); + Check.type.number(true); }).toThrowDeveloperError(); expect(function () { - check.type.number({}); + Check.type.number({}); }).toThrowDeveloperError(); expect(function () { - check.type.number([2]); + Check.type.number([2]); }).toThrowDeveloperError(); expect(function () { - check.type.number(function () {return true;}); + Check.type.number(function () {return true;}); }).toThrowDeveloperError(); }); - it('check.type.string does not throw when passed a string', function () { + it('Check.type.string does not throw when passed a string', function () { expect(function () { - check.type.string('s'); + Check.type.string('s'); }).not.toThrowDeveloperError(); }); - it('check.type.string throws on non-string', function () { + it('Check.type.string throws on non-string', function () { expect(function () { - check.type.string({}); + Check.type.string({}); }).toThrowDeveloperError(); expect(function () { - check.type.string(true); + Check.type.string(true); }).toThrowDeveloperError(); expect(function () { - check.type.string(1); + Check.type.string(1); }).toThrowDeveloperError(); expect(function () { - check.type.string([2]); + Check.type.string([2]); }).toThrowDeveloperError(); expect(function () { - check.type.string(function () {return true;}); + Check.type.string(function () {return true;}); }).toThrowDeveloperError(); }); }); @@ -159,67 +159,67 @@ defineSuite([ describe('numeric tests: min/max/min-max', function () { it('min throws on value less than min', function () { expect(function () { - check.numeric.min(4, 5); + Check.numeric.minimum(4, 5); }).toThrowDeveloperError(); }); it('min does not throw on value at least as big as min', function () { expect(function () { - check.numeric.min(4, 4); - check.numeric.min(4, 3); + Check.numeric.minimum(4, 4); + Check.numeric.minimum(4, 3); }).not.toThrowDeveloperError(); }); it('max throws on value greater than max', function () { expect(function () { - check.numeric.max(6, 5); + Check.numeric.maximum(6, 5); }).toThrowDeveloperError(); }); it('max does not throw on value at most as big as max', function () { expect(function () { - check.numeric.max(5, 5); - check.numeric.max(4, 5); + Check.numeric.maximum(5, 5); + Check.numeric.maximum(4, 5); }).not.toThrowDeveloperError(); }); it('minMax throws on value outside range', function () { expect(function () { - check.numeric.minMax(-2, 3, 5); - check.numeric.minMax(6, 3, 5); + Check.numeric.withinRange(-2, 3, 5); + Check.numeric.withinRange(6, 3, 5); }).toThrowDeveloperError(); }); it('minMax does not throw on value inside range', function () { expect(function () { - check.numeric.minMax(3, 3, 5); - check.numeric.minMax(5, 3, 5); - check.numeric.minMax(4, 3, 5); + Check.numeric.withinRange(3, 3, 5); + Check.numeric.withinRange(5, 3, 5); + Check.numeric.withinRange(4, 3, 5); }).not.toThrowDeveloperError(); }); }); - it('check.defined does not throw when passed value that is not undefined', function () { + it('Check.defined does not throw when passed value that is not undefined', function () { expect(function () { - check.defined({}); + Check.defined({}); }).not.toThrowDeveloperError(); expect(function () { - check.defined([]); + Check.defined([]); }).not.toThrowDeveloperError(); expect(function () { - check.defined(null); + Check.defined(null); }).not.toThrowDeveloperError(); expect(function () { - check.defined(2); + Check.defined(2); }).not.toThrowDeveloperError(); expect(function () { - check.defined(function() {return true;}); + Check.defined(function() {return true;}); }).not.toThrowDeveloperError(); expect(function () { - check.defined('snt'); + Check.defined('snt'); }).not.toThrowDeveloperError(); }); - it('check.defined throws when passed undefined', function () { + it('Check.defined throws when passed undefined', function () { expect(function () { - check.defined(undefined); + Check.defined(undefined); }).toThrowDeveloperError(); }); From 9d900fc67b28ac75b88571ee04e7e19a5743ecc3 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Thu, 8 Dec 2016 16:01:41 -0500 Subject: [PATCH 179/396] Use Defined function, checking both undefined and null values --- Source/Core/Check.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/Check.js b/Source/Core/Check.js index ec0ddbff42b6..ae8febf9d26d 100644 --- a/Source/Core/Check.js +++ b/Source/Core/Check.js @@ -41,7 +41,7 @@ define([ * @throws {DeveloperError} */ Check.defined = function (test, name) { - if (test === undefined) { + if (!defined(test)) { throw new DeveloperError(errors.defined(name)); } }; From 73dfdd412bf8b8942de2dc1e0e4ad7cd675cad06 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Thu, 8 Dec 2016 16:04:01 -0500 Subject: [PATCH 180/396] pixelSizePerMeter, fix rectangle normals --- Source/Core/GeometryPipeline.js | 3 +- Source/Core/RectangleGeometry.js | 132 +++++++++++++++++++-------- Source/Renderer/AutomaticUniforms.js | 4 +- Source/Renderer/UniformState.js | 22 +++++ Source/Scene/FrameState.js | 2 + Source/Scene/GroundPrimitive.js | 2 +- Source/Scene/Scene.js | 5 + Source/Shaders/ShadowVolumeVS.glsl | 11 +-- 8 files changed, 130 insertions(+), 51 deletions(-) diff --git a/Source/Core/GeometryPipeline.js b/Source/Core/GeometryPipeline.js index adf740039b00..e681e1543112 100644 --- a/Source/Core/GeometryPipeline.js +++ b/Source/Core/GeometryPipeline.js @@ -281,7 +281,8 @@ define([ 'st', 'binormal', 'tangent', - 'isBottom', + + 'extrudeDirection', //TODO: do I need this? // From compressing texture coordinates and normals 'compressedAttributes' diff --git a/Source/Core/RectangleGeometry.js b/Source/Core/RectangleGeometry.js index e85033a88fa1..57f07a67f45b 100644 --- a/Source/Core/RectangleGeometry.js +++ b/Source/Core/RectangleGeometry.js @@ -330,7 +330,9 @@ define([ return wallTextures; } + var scratchVertexFormat = new VertexFormat(); function constructExtrudedRectangle(options) { + var shadowVolume = options.shadowVolume; var vertexFormat = options.vertexFormat; var surfaceHeight = options.surfaceHeight; var extrudedHeight = options.extrudedHeight; @@ -342,10 +344,15 @@ define([ var ellipsoid = options.ellipsoid; var i; + if (shadowVolume) { + options.vertexFormat = VertexFormat.clone(vertexFormat, scratchVertexFormat); + options.vertexFormat.normal = true; + } var topBottomGeo = constructRectangle(options); if (CesiumMath.equalsEpsilon(minHeight, maxHeight, CesiumMath.EPSILON10)) { return topBottomGeo; } + var topPositions = PolygonPipeline.scaleToGeodeticHeight(topBottomGeo.attributes.position.values, maxHeight, ellipsoid, false); topPositions = new Float64Array(topPositions); var length = topPositions.length; @@ -356,28 +363,14 @@ define([ positions.set(bottomPositions, length); topBottomGeo.attributes.position.values = positions; - var isBottom = new Uint8Array(newLength / 3); - if (typeof Uint8Array.prototype.fill === 'function') { - isBottom.fill(1, length / 3); - } else { //IE doesn't support fill - for (i = length / 3; i < newLength / 3; i++) { - isBottom[i] = 1; - } - } - - topBottomGeo.attributes.isBottom = new GeometryAttribute({ - componentDatatype : ComponentDatatype.UNSIGNED_BYTE, - componentsPerAttribute : 1, - values : isBottom - }); - var normals = (vertexFormat.normal) ? new Float32Array(newLength) : undefined; var tangents = (vertexFormat.tangent) ? new Float32Array(newLength) : undefined; var binormals = (vertexFormat.binormal) ? new Float32Array(newLength) : undefined; var textures = (vertexFormat.st) ? new Float32Array(newLength/3*2) : undefined; var topSt; + var topNormals; if (vertexFormat.normal) { - var topNormals = topBottomGeo.attributes.normal.values; + topNormals = topBottomGeo.attributes.normal.values; normals.set(topNormals); for (i = 0; i < length; i ++) { topNormals[i] = -topNormals[i]; @@ -385,6 +378,21 @@ define([ normals.set(topNormals, length); topBottomGeo.attributes.normal.values = normals; } + if (shadowVolume) { + topNormals = topBottomGeo.attributes.normal.values; + topBottomGeo.attributes.normal = undefined; + var extrudeNormals = new Float32Array(newLength); + for (i = 0; i < length; i ++) { + topNormals[i] = -topNormals[i]; + } + extrudeNormals.set(topNormals, length); //only get normals for bottom layer that's going to be pushed down + topBottomGeo.attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : extrudeNormals + }); + } + if (vertexFormat.tangent) { var topTangents = topBottomGeo.attributes.tangent.values; tangents.set(topTangents); @@ -423,55 +431,88 @@ define([ var wallCount = (perimeterPositions + 4) * 2; var wallPositions = new Float64Array(wallCount * 3); - var wallisBottom = new Uint8Array(wallCount); + var wallExtrudeNormals = shadowVolume ? new Float32Array(wallCount * 3) : undefined; var wallTextures = (vertexFormat.st) ? new Float32Array(wallCount * 2) : undefined; var posIndex = 0; var stIndex = 0; - var isBottomIndex = 0; + var extrudeNormalIndex = 0; var area = width * height; + var threeI; for (i = 0; i < area; i+=width) { - wallPositions = addWallPositions(wallPositions, posIndex, i*3, topPositions, bottomPositions); + threeI = i * 3; + wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions); posIndex += 6; if (vertexFormat.st) { wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i*2, topSt); stIndex += 4; } - wallisBottom[isBottomIndex++] = 0; - wallisBottom[isBottomIndex++] = 1; + if (shadowVolume) { + wallExtrudeNormals[extrudeNormalIndex++] = 0; + wallExtrudeNormals[extrudeNormalIndex++] = 0; + wallExtrudeNormals[extrudeNormalIndex++] = 0; + + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } } for (i = area-width; i < area; i++) { - wallPositions = addWallPositions(wallPositions, posIndex, i*3, topPositions, bottomPositions); + threeI = i * 3; + wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions); posIndex += 6; if (vertexFormat.st) { wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i*2, topSt); stIndex += 4; } - wallisBottom[isBottomIndex++] = 0; - wallisBottom[isBottomIndex++] = 1; + if (shadowVolume) { + wallExtrudeNormals[extrudeNormalIndex++] = 0; + wallExtrudeNormals[extrudeNormalIndex++] = 0; + wallExtrudeNormals[extrudeNormalIndex++] = 0; + + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } } for (i = area-1; i > 0; i-=width) { - wallPositions = addWallPositions(wallPositions, posIndex, i*3, topPositions, bottomPositions); + threeI = i * 3; + wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions); posIndex += 6; if (vertexFormat.st) { wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i*2, topSt); stIndex += 4; } - wallisBottom[isBottomIndex++] = 0; - wallisBottom[isBottomIndex++] = 1; + if (shadowVolume) { + wallExtrudeNormals[extrudeNormalIndex++] = 0; + wallExtrudeNormals[extrudeNormalIndex++] = 0; + wallExtrudeNormals[extrudeNormalIndex++] = 0; + + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } } for (i = width-1; i >= 0; i--) { - wallPositions = addWallPositions(wallPositions, posIndex, i*3, topPositions, bottomPositions); + threeI = i * 3; + wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions); posIndex += 6; if (vertexFormat.st) { wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i*2, topSt); stIndex += 4; } - wallisBottom[isBottomIndex++] = 0; - wallisBottom[isBottomIndex++] = 1; + if (shadowVolume) { + wallExtrudeNormals[extrudeNormalIndex++] = 0; + wallExtrudeNormals[extrudeNormalIndex++] = 0; + wallExtrudeNormals[extrudeNormalIndex++] = 0; + + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } } var geo = calculateAttributesWall(wallPositions, vertexFormat, ellipsoid); @@ -483,11 +524,13 @@ define([ values : wallTextures }); } - geo.attributes.isBottom = new GeometryAttribute({ - componentDatatype: ComponentDatatype.UNSIGNED_BYTE, - componentsPerAttribute: 1, - values: wallisBottom - }); + if (shadowVolume) { + geo.attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : wallExtrudeNormals + }); + } var wallIndices = IndexDatatype.createTypedArray(wallCount, perimeterPositions * 6); @@ -622,6 +665,7 @@ define([ var extrude = defined(extrudedHeight); var closeTop = defaultValue(options.closeTop, true); var closeBottom = defaultValue(options.closeBottom, true); + var shadowVolume = defaultValue(options.shadowVolume, false); //>>includeStart('debug', pragmas.debug); if (!defined(rectangle)) { @@ -646,13 +690,14 @@ define([ this._closeBottom = closeBottom; this._workerName = 'createRectangleGeometry'; this._rotatedRectangle = computeRectangle(this._rectangle, this._ellipsoid, rotation); + this._shadowVolume = shadowVolume; } /** * The number of elements used to pack the object into an array. * @type {Number} */ - RectangleGeometry.packedLength = Rectangle.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 8; + RectangleGeometry.packedLength = Rectangle.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 9; /** * Stores the provided instance into the provided array. @@ -695,7 +740,8 @@ define([ array[startingIndex++] = value._extrudedHeight; array[startingIndex++] = value._extrude ? 1.0 : 0.0; array[startingIndex++] = value._closeTop ? 1.0 : 0.0; - array[startingIndex] = value._closeBottom ? 1.0 : 0.0; + array[startingIndex++] = value._closeBottom ? 1.0 : 0.0; + array[startingIndex] = value._shadowVolume? 1.0 : 0.0; return array; }; @@ -714,7 +760,8 @@ define([ stRotation : undefined, extrudedHeight : undefined, closeTop : undefined, - closeBottom : undefined + closeBottom : undefined, + shadowVolume: undefined }; /** @@ -753,7 +800,8 @@ define([ var extrudedHeight = array[startingIndex++]; var extrude = array[startingIndex++] === 1.0; var closeTop = array[startingIndex++] === 1.0; - var closeBottom = array[startingIndex] === 1.0; + var closeBottom = array[startingIndex++] === 1.0; + var shadowVolume = array[startingIndex] === 1.0; if (!defined(result)) { scratchOptions.granularity = granularity; @@ -763,6 +811,7 @@ define([ scratchOptions.extrudedHeight = extrude ? extrudedHeight : undefined; scratchOptions.closeTop = closeTop; scratchOptions.closeBottom = closeBottom; + scratchOptions.shadowVolume = shadowVolume; return new RectangleGeometry(scratchOptions); } @@ -778,6 +827,7 @@ define([ result._closeTop = closeTop; result._closeBottom = closeBottom; result._rotatedRectangle = rotatedRectangle; + result._shadowVolume = shadowVolume; return result; }; @@ -829,6 +879,7 @@ define([ options.stRotation = stRotation; options.tangentRotationMatrix = tangentRotationMatrix; options.size = options.width * options.height; + options.shadowVolume = rectangleGeometry._shadowVolume; var geometry; var boundingSphere; @@ -877,7 +928,8 @@ define([ height : minHeight, closeTop : true, closeBottom : true, - vertexFormat : VertexFormat.POSITION_AND_NORMAL + vertexFormat : VertexFormat.POSITION_ONLY, + shadowVolume: true }); }; diff --git a/Source/Renderer/AutomaticUniforms.js b/Source/Renderer/AutomaticUniforms.js index e347e63ffaaf..d8144388cf34 100644 --- a/Source/Renderer/AutomaticUniforms.js +++ b/Source/Renderer/AutomaticUniforms.js @@ -1478,11 +1478,11 @@ define([ } }), - czm_LODNegativeGeometricToleranceOverDistance : new AutomaticUniform({ + czm_geometricToleranceOverDistance : new AutomaticUniform({ size: 1, datatype: WebGLConstants.FLOAT, getValue: function(uniformState) { - return -10000; //TODO + return uniformState.pixelSizePerMeter * uniformState.maximumScreenSpaceError; } }) }; diff --git a/Source/Renderer/UniformState.js b/Source/Renderer/UniformState.js index 49ddc5cd50dd..574a213744c5 100644 --- a/Source/Renderer/UniformState.js +++ b/Source/Renderer/UniformState.js @@ -149,6 +149,8 @@ define([ this._resolutionScale = 1.0; this._fogDensity = undefined; + + this._pixelSizePerMeter = undefined; } defineProperties(UniformState.prototype, { @@ -767,6 +769,18 @@ define([ } }, + maximumScreenSpaceError: { + get: function() { + return this._frameState.maximumScreenSpaceError; + } + }, + + pixelSizePerMeter: { + get: function() { + return this._pixelSizePerMeter; + } + }, + /** * @memberof UniformState.prototype * @type {Pass} @@ -935,6 +949,14 @@ define([ this._frameState = frameState; this._temeToPseudoFixed = Transforms.computeTemeToPseudoFixedMatrix(frameState.time, this._temeToPseudoFixed); + + var fov = camera.frustum.fov; + var viewport = this._viewport; + if (viewport.width > viewport.height * camera.frustum.aspectRatio) { + this._pixelSizePerMeter = Math.tan(0.5 * fov) * 2.0 / viewport.width; + } else { + this._pixelSizePerMeter = Math.tan(0.5 * fov) * 2.0 / viewport.height; + } }; function cleanViewport(uniformState) { diff --git a/Source/Scene/FrameState.js b/Source/Scene/FrameState.js index f64149f62758..29c163b357e2 100644 --- a/Source/Scene/FrameState.js +++ b/Source/Scene/FrameState.js @@ -95,6 +95,8 @@ define([ */ this.occluder = undefined; + this.maximumScreenSpaceError = undefined; + this.passes = { /** * true if the primitive should update for a render pass, false otherwise. diff --git a/Source/Scene/GroundPrimitive.js b/Source/Scene/GroundPrimitive.js index 0bbd7b85e3e5..278e5a2f1885 100644 --- a/Source/Scene/GroundPrimitive.js +++ b/Source/Scene/GroundPrimitive.js @@ -217,7 +217,7 @@ define([ this._uniformMap = { u_globeMinimumAltitude: function() { - return -11000; //TODO verify + return 1100.0; //TODO verify } }; diff --git a/Source/Scene/Scene.js b/Source/Scene/Scene.js index 439e70b1baef..07913b581f05 100644 --- a/Source/Scene/Scene.js +++ b/Source/Scene/Scene.js @@ -1173,6 +1173,11 @@ define([ frameState.cullingVolume = camera.frustum.computeCullingVolume(camera.positionWC, camera.directionWC, camera.upWC); frameState.occluder = getOccluder(scene); frameState.terrainExaggeration = scene._terrainExaggeration; + if (defined(scene.globe)) { + frameState.maximumScreenSpaceError = scene.globe.maximumScreenSpaceError; + } else { + frameState.maximumScreenSpaceError = 2; + } clearPasses(frameState.passes); } diff --git a/Source/Shaders/ShadowVolumeVS.glsl b/Source/Shaders/ShadowVolumeVS.glsl index 0a2c4b59d2b6..14f072145918 100644 --- a/Source/Shaders/ShadowVolumeVS.glsl +++ b/Source/Shaders/ShadowVolumeVS.glsl @@ -2,8 +2,7 @@ uniform float u_globeMinimumAltitude; attribute vec3 position3DHigh; attribute vec3 position3DLow; -attribute vec3 normal; -attribute float isBottom; +attribute vec3 extrudeDirection; attribute vec4 color; attribute float batchId; @@ -23,11 +22,9 @@ void main() v_color = color; vec4 position = czm_computePosition(); - float delta = min(u_globeMinimumAltitude, czm_LODNegativeGeometricToleranceOverDistance * length(position.xyz)); + float delta = min(u_globeMinimumAltitude, czm_geometricToleranceOverDistance * length(position.xyz)); - if (isBottom == 1.0) - { - position = position + vec4(normal.xyz * 40.0, 0); - } + //extrudeDirection is zero for the top layer + position = position + vec4(extrudeDirection.xyz * delta, 0); gl_Position = depthClampFarPlane(czm_modelViewProjectionRelativeToEye * position); } From 1a62c758e5dee566d40a12b6c6e4144abe4e7b79 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Thu, 8 Dec 2016 16:44:27 -0500 Subject: [PATCH 181/396] CHANGES.md --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 2be05ccb7005..8453ec7c1167 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ Change Log * Added the ability to blend a `Model` with a color/translucency. Added `color`, `colorBlendMode`, and `colorBlendAmount` properties to `Model`, `ModelGraphics`, and CZML. Added `ColorBlendMode` enum. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) * Added new `Label` properties `showBackground`, `backgroundColor`, and `backgroundPadding` to the primitive, Entity, and CZML layers. * Added new enum `VerticalOrigin.BASELINE`. Previously, `VerticalOrigin.BOTTOM` would sometimes align to the baseline depending on the contents of a label. +* Added support for newlines in `Label`s. [#2402](https://github.com/AnalyticalGraphicsInc/cesium/issues/2402) * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) * Fixed `Rectangle.union` to correctly account for rectangles that cross the IDL [#4732](https://github.com/AnalyticalGraphicsInc/cesium/pull/4732). * Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) @@ -84,7 +85,6 @@ Change Log * Fixed a bug that was incorrectly clamping Latitudes in KML (s) to the range -PI..PI. Now correctly clamps to -PI/2..PI/2. * Added `CesiumMath.clampToLatitudeRange`. A convenience function to clamp a passed radian angle to valid Latitudes. * Added `DebugCameraPrimitive` to visualize the view frustum of a camera. -* Added support for newlines in `Label`s. [#2402](https://github.com/AnalyticalGraphicsInc/cesium/issues/2402) ### 1.25 - 2016-09-01 From 84d0071119b5d0a4f034e5f8be8b69e7203bb582 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Thu, 8 Dec 2016 17:36:48 -0500 Subject: [PATCH 182/396] Integrate logic for newlines and background size/placement. --- Source/Scene/LabelCollection.js | 84 ++++++++++++++------------------- 1 file changed, 35 insertions(+), 49 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 40c695f9414d..904e5634ba9d 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -314,6 +314,7 @@ define([ var scale = label._scale; var horizontalOrigin = label._horizontalOrigin; + var verticalOrigin = label._verticalOrigin; var widthOffset = 0; if (horizontalOrigin === HorizontalOrigin.CENTER) { widthOffset -= maxLineWidth / 2 * scale; @@ -324,78 +325,63 @@ define([ } var LEADING = 0.2*maxLineHeight; // Traditionally, leading is %20 of the font size. - var totalTextHeight = (maxLineHeight * numberOfLines) + (LEADING * (numberOfLines-1)); - - var topOffset = 0; - var verticalOrigin = label._verticalOrigin; - /* - var heightReference = label._heightReference; - var verticalOrigin = (heightReference === HeightReference.NONE) ? label._verticalOrigin : VerticalOrigin.BOTTOM; - if (verticalOrigin === VerticalOrigin.CENTER) { - topOffset += ((totalTextHeight / 2) - (maxGlyphHeight/2)) * scale; - } else if (verticalOrigin === VerticalOrigin.BOTTOM) { - // Subtract maxGlyphHeight for backwards compatibility - topOffset += (totalTextHeight * scale) - maxGlyphHeight; - } - */ + var otherLinesHeight = (maxLineHeight + LEADING) * (numberOfLines - 1); glyphPixelOffset.x = widthOffset * resolutionScale; glyphPixelOffset.y = 0; - var glyphNewlineOffset = 0; for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { if (text.charAt(glyphIndex) === '\n') { - glyphNewlineOffset += (maxLineHeight + LEADING) * scale; + glyphNewlineOffset += (maxLineHeight + LEADING); glyphPixelOffset.x = widthOffset; - continue; - } - - glyph = glyphs[glyphIndex]; - dimensions = glyph.dimensions; - - if (verticalOrigin === VerticalOrigin.BASELINE) { - glyphPixelOffset.y = topOffset - dimensions.descent * scale; - } else if (verticalOrigin === VerticalOrigin.TOP) { - glyphPixelOffset.y = topOffset - (maxGlyphY - dimensions.height + dimensions.descent + backgroundPadding.y) * scale; - } else if (verticalOrigin === VerticalOrigin.CENTER) { - glyphPixelOffset.y = topOffset - (maxGlyphY - dimensions.height) / 2 * scale - dimensions.descent * scale; } else { - // VerticalOrigin.BOTTOM - glyphPixelOffset.y = topOffset + (maxGlyphDescent - dimensions.descent + backgroundPadding.y) * scale; - } + glyph = glyphs[glyphIndex]; + dimensions = glyph.dimensions; - glyphPixelOffset.y -= glyphNewlineOffset; - glyphPixelOffset.y *= resolutionScale; + if (verticalOrigin === VerticalOrigin.TOP) { + glyphPixelOffset.y = dimensions.height - maxGlyphY - backgroundPadding.y; + } else if (verticalOrigin === VerticalOrigin.CENTER) { + glyphPixelOffset.y = (otherLinesHeight + dimensions.height - maxGlyphY) / 2; + } else if (verticalOrigin === VerticalOrigin.BASELINE) { + glyphPixelOffset.y = otherLinesHeight; + } else { + // VerticalOrigin.BOTTOM + glyphPixelOffset.y = otherLinesHeight + maxGlyphDescent + backgroundPadding.y; + } + glyphPixelOffset.y = (glyphPixelOffset.y - dimensions.descent - glyphNewlineOffset) * scale * resolutionScale; - if (defined(glyph.billboard)) { - glyph.billboard._setTranslate(glyphPixelOffset); - } + if (defined(glyph.billboard)) { + glyph.billboard._setTranslate(glyphPixelOffset); + } - //Compute the next x offset taking into acocunt the kerning performed - //on both the current letter as well as the next letter to be drawn - //as well as any applied scale. - if (glyphIndex < glyphLength - 1) { - var nextGlyph = glyphs[glyphIndex + 1]; - glyphPixelOffset.x += ((dimensions.width - dimensions.bounds.minx) + nextGlyph.dimensions.bounds.minx) * scale * resolutionScale; + //Compute the next x offset taking into acocunt the kerning performed + //on both the current letter as well as the next letter to be drawn + //as well as any applied scale. + if (glyphIndex < glyphLength - 1) { + var nextGlyph = glyphs[glyphIndex + 1]; + glyphPixelOffset.x += ((dimensions.width - dimensions.bounds.minx) + nextGlyph.dimensions.bounds.minx) * scale * resolutionScale; + } } } if (defined(backgroundBillboard) && (glyphLength > 0)) { glyphPixelOffset.x = (widthOffset - backgroundPadding.x * scale) * resolutionScale; - if (verticalOrigin === VerticalOrigin.BASELINE) { - glyphPixelOffset.y = -backgroundPadding.y * scale - maxGlyphDescent * scale; - } else if (verticalOrigin === VerticalOrigin.TOP) { - glyphPixelOffset.y = -(maxGlyphY - maxLineHeight) * scale - maxGlyphDescent * scale; + + if (verticalOrigin === VerticalOrigin.TOP) { + glyphPixelOffset.y = maxLineHeight - maxGlyphY - maxGlyphDescent; } else if (verticalOrigin === VerticalOrigin.CENTER) { - glyphPixelOffset.y = -(maxGlyphY - maxLineHeight) / 2 * scale - maxGlyphDescent * scale; + glyphPixelOffset.y = (maxLineHeight - maxGlyphY) / 2 - maxGlyphDescent; + } else if (verticalOrigin === VerticalOrigin.BASELINE) { + glyphPixelOffset.y = -backgroundPadding.y - maxGlyphDescent; } else { // VerticalOrigin.BOTTOM glyphPixelOffset.y = 0; } - glyphPixelOffset.y *= resolutionScale; + glyphPixelOffset.y = glyphPixelOffset.y * scale * resolutionScale; + backgroundBillboard.width = maxLineWidth + (backgroundPadding.x * 2); - backgroundBillboard.height = maxLineHeight + (backgroundPadding.y * 2); + backgroundBillboard.height = maxLineHeight + otherLinesHeight + (backgroundPadding.y * 2); backgroundBillboard._setTranslate(glyphPixelOffset); } } From e17a393fd2d689cb80f5d167401c50084a3c8ae3 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Thu, 8 Dec 2016 18:44:02 -0500 Subject: [PATCH 183/396] Line spacing, shield against empty string with newlines. --- Source/Scene/LabelCollection.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 904e5634ba9d..7b2b54d48322 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -137,7 +137,7 @@ define([ // presize glyphs to match the new text length glyphs.length = textLength; - var showBackground = label._showBackground && (glyphs.length > 0); + var showBackground = label._showBackground && (text.split('\n').join('').length > 0); var backgroundBillboard = label._backgroundBillboard; var backgroundBillboardCollection = labelCollection._backgroundBillboardCollection; if (!showBackground) { @@ -324,8 +324,9 @@ define([ widthOffset += backgroundPadding.x * scale; } - var LEADING = 0.2*maxLineHeight; // Traditionally, leading is %20 of the font size. - var otherLinesHeight = (maxLineHeight + LEADING) * (numberOfLines - 1); + // TODO: New property Label.prototype.lineSpacing + var lineSpacing = 1.2 * maxLineHeight; // Traditionally, leading is %20 of the font size. + var otherLinesHeight = lineSpacing * (numberOfLines - 1); glyphPixelOffset.x = widthOffset * resolutionScale; glyphPixelOffset.y = 0; @@ -333,7 +334,7 @@ define([ var glyphNewlineOffset = 0; for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { if (text.charAt(glyphIndex) === '\n') { - glyphNewlineOffset += (maxLineHeight + LEADING); + glyphNewlineOffset += lineSpacing; glyphPixelOffset.x = widthOffset; } else { glyph = glyphs[glyphIndex]; @@ -365,7 +366,7 @@ define([ } } - if (defined(backgroundBillboard) && (glyphLength > 0)) { + if (defined(backgroundBillboard) && (text.split('\n').join('').length > 0)) { glyphPixelOffset.x = (widthOffset - backgroundPadding.x * scale) * resolutionScale; if (verticalOrigin === VerticalOrigin.TOP) { From 984af4f2da7d9804cf2509e92b659922617e4f84 Mon Sep 17 00:00:00 2001 From: greenkeeperio-bot Date: Fri, 9 Dec 2016 08:04:19 -0500 Subject: [PATCH 184/396] chore(package): update karma-jasmine to version 1.1.0 https://greenkeeper.io/ --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 705dc57c13a0..1bce15dbaa92 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "karma-electron": "^5.1.1", "karma-firefox-launcher": "^1.0.0", "karma-ie-launcher": "^1.0.0", - "karma-jasmine": "^1.0.2", + "karma-jasmine": "^1.1.0", "karma-requirejs": "^1.1.0", "karma-safari-launcher": "^1.0.0", "karma-spec-reporter": "^0.0.26", From 8fbfaa3504388736bf6a6b2ed21fd34a63b40c9a Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Fri, 9 Dec 2016 10:28:40 -0500 Subject: [PATCH 185/396] Line spacing --- Source/Scene/LabelCollection.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 7b2b54d48322..3a1f5c1b6577 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -12,7 +12,6 @@ define([ '../Core/writeTextToCanvas', './BillboardCollection', './HorizontalOrigin', - './HeightReference', './Label', './LabelStyle', './TextureAtlas', @@ -30,7 +29,6 @@ define([ writeTextToCanvas, BillboardCollection, HorizontalOrigin, - HeightReference, Label, LabelStyle, TextureAtlas, @@ -57,6 +55,9 @@ define([ this.dimensions = dimensions; } + // Traditionally, leading is %20 of the font size. + var defaultLineSpacingPercent = 1.2; + var whitePixelCanvasId = 'ID_WHITE_PIXEL'; var whitePixelSize = new Cartesian2(4, 4); var whitePixelBoundingRegion = new BoundingRectangle(1, 1, 1, 1); @@ -324,8 +325,7 @@ define([ widthOffset += backgroundPadding.x * scale; } - // TODO: New property Label.prototype.lineSpacing - var lineSpacing = 1.2 * maxLineHeight; // Traditionally, leading is %20 of the font size. + var lineSpacing = defaultLineSpacingPercent * maxLineHeight; var otherLinesHeight = lineSpacing * (numberOfLines - 1); glyphPixelOffset.x = widthOffset * resolutionScale; From 40737cbd9d798e088dc2f4b392bfa2260f2d3885 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Fri, 9 Dec 2016 13:31:25 -0500 Subject: [PATCH 186/396] Fix text justification to match horizontal origin choice. --- Source/Scene/LabelCollection.js | 57 +++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 3a1f5c1b6577..bf102a006a82 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -270,6 +270,16 @@ define([ label._repositionAllGlyphs = true; } + function calculateWidthOffset(lineWidth, horizontalOrigin, backgroundPadding) + { + if (horizontalOrigin === HorizontalOrigin.CENTER) { + return -lineWidth / 2; + } else if (horizontalOrigin === HorizontalOrigin.RIGHT) { + return -(lineWidth + backgroundPadding.x); + } + return backgroundPadding.x; + } + // reusable Cartesian2 instances var glyphPixelOffset = new Cartesian2(); var scratchBackgroundPadding = new Cartesian2(); @@ -279,8 +289,9 @@ define([ var text = label._text; var glyph; var dimensions; - var lineWidth = 0; + var lastLineWidth = 0; var maxLineWidth = 0; + var lineWidths = []; var maxGlyphDescent = Number.NEGATIVE_INFINITY; var maxGlyphY = 0; var numberOfLines = 1; @@ -295,8 +306,9 @@ define([ for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { if (text.charAt(glyphIndex) === '\n') { + lineWidths.push(lastLineWidth); ++numberOfLines; - lineWidth = 0; + lastLineWidth = 0; } else { glyph = glyphs[glyphIndex]; dimensions = glyph.dimensions; @@ -304,38 +316,36 @@ define([ maxGlyphDescent = Math.max(maxGlyphDescent, dimensions.descent); //Computing the line width must also account for the kerning that occurs between letters. - lineWidth += dimensions.width - dimensions.bounds.minx; + lastLineWidth += dimensions.width - dimensions.bounds.minx; if (glyphIndex < glyphLength - 1) { - lineWidth += glyphs[glyphIndex + 1].dimensions.bounds.minx; + lastLineWidth += glyphs[glyphIndex + 1].dimensions.bounds.minx; } - maxLineWidth = Math.max(maxLineWidth, lineWidth); + maxLineWidth = Math.max(maxLineWidth, lastLineWidth); } } + lineWidths.push(lastLineWidth); var maxLineHeight = maxGlyphY + maxGlyphDescent; var scale = label._scale; var horizontalOrigin = label._horizontalOrigin; var verticalOrigin = label._verticalOrigin; - var widthOffset = 0; - if (horizontalOrigin === HorizontalOrigin.CENTER) { - widthOffset -= maxLineWidth / 2 * scale; - } else if (horizontalOrigin === HorizontalOrigin.RIGHT) { - widthOffset -= (maxLineWidth + backgroundPadding.x) * scale; - } else { - widthOffset += backgroundPadding.x * scale; - } - + var lineIndex = 0; + var lineWidth = lineWidths[lineIndex]; + var widthOffset = calculateWidthOffset(lineWidth, horizontalOrigin, backgroundPadding); var lineSpacing = defaultLineSpacingPercent * maxLineHeight; var otherLinesHeight = lineSpacing * (numberOfLines - 1); - glyphPixelOffset.x = widthOffset * resolutionScale; + glyphPixelOffset.x = widthOffset * scale * resolutionScale; glyphPixelOffset.y = 0; - var glyphNewlineOffset = 0; + var lineOffsetY = 0; for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { if (text.charAt(glyphIndex) === '\n') { - glyphNewlineOffset += lineSpacing; - glyphPixelOffset.x = widthOffset; + ++lineIndex; + lineOffsetY += lineSpacing; + lineWidth = lineWidths[lineIndex]; + widthOffset = calculateWidthOffset(lineWidth, horizontalOrigin, backgroundPadding); + glyphPixelOffset.x = widthOffset * scale * resolutionScale; } else { glyph = glyphs[glyphIndex]; dimensions = glyph.dimensions; @@ -350,7 +360,7 @@ define([ // VerticalOrigin.BOTTOM glyphPixelOffset.y = otherLinesHeight + maxGlyphDescent + backgroundPadding.y; } - glyphPixelOffset.y = (glyphPixelOffset.y - dimensions.descent - glyphNewlineOffset) * scale * resolutionScale; + glyphPixelOffset.y = (glyphPixelOffset.y - dimensions.descent - lineOffsetY) * scale * resolutionScale; if (defined(glyph.billboard)) { glyph.billboard._setTranslate(glyphPixelOffset); @@ -367,7 +377,14 @@ define([ } if (defined(backgroundBillboard) && (text.split('\n').join('').length > 0)) { - glyphPixelOffset.x = (widthOffset - backgroundPadding.x * scale) * resolutionScale; + if (horizontalOrigin === HorizontalOrigin.CENTER) { + widthOffset = -maxLineWidth / 2 - backgroundPadding.x; + } else if (horizontalOrigin === HorizontalOrigin.RIGHT) { + widthOffset = -(maxLineWidth + backgroundPadding.x * 2); + } else { + widthOffset = 0; + } + glyphPixelOffset.x = widthOffset * scale * resolutionScale; if (verticalOrigin === VerticalOrigin.TOP) { glyphPixelOffset.y = maxLineHeight - maxGlyphY - maxGlyphDescent; From bcc1f8693d8adc9971c398dbcd02b47282e6c243 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Fri, 9 Dec 2016 14:47:04 -0500 Subject: [PATCH 187/396] Update tests --- Specs/Scene/LabelCollectionSpec.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Specs/Scene/LabelCollectionSpec.js b/Specs/Scene/LabelCollectionSpec.js index f8ca5ac9e6f4..1477b8a87b0f 100644 --- a/Specs/Scene/LabelCollectionSpec.js +++ b/Specs/Scene/LabelCollectionSpec.js @@ -1133,6 +1133,10 @@ defineSuite([ return Cartesian2.clone(label._glyphs[index].billboard._translate, new Cartesian2()); } + function getBackgroundBillboardVertexTranslate(label) { + return Cartesian2.clone(label._backgroundBillboard._translate, new Cartesian2()); + } + it('sets billboard properties properly when they change on the label', function() { var position1 = new Cartesian3(1.0, 2.0, 3.0); var position2 = new Cartesian3(4.0, 5.0, 6.0); @@ -1396,7 +1400,8 @@ defineSuite([ var label = labels.add({ text : 'apl', font : '90px "Open Sans"', - horizontalOrigin : HorizontalOrigin.CENTER + horizontalOrigin : HorizontalOrigin.CENTER, + showBackground : true }); scene.renderForSpecs(); @@ -1404,6 +1409,7 @@ defineSuite([ var offset0 = getGlyphBillboardVertexTranslate(label, 0); var offset1 = getGlyphBillboardVertexTranslate(label, 1); var offset2 = getGlyphBillboardVertexTranslate(label, 2); + var offsetBack = getBackgroundBillboardVertexTranslate(label); label.horizontalOrigin = HorizontalOrigin.LEFT; scene.renderForSpecs(); @@ -1412,11 +1418,13 @@ defineSuite([ expect(getGlyphBillboardVertexTranslate(label, 0).x).toBeGreaterThan(offset0.x); expect(getGlyphBillboardVertexTranslate(label, 1).x).toBeGreaterThan(offset1.x); expect(getGlyphBillboardVertexTranslate(label, 2).x).toBeGreaterThan(offset2.x); + expect(getBackgroundBillboardVertexTranslate(label).x).toBeGreaterThan(offsetBack.x); // Y offset should be unchanged expect(getGlyphBillboardVertexTranslate(label, 0).y).toEqual(offset0.y); expect(getGlyphBillboardVertexTranslate(label, 1).y).toEqual(offset1.y); expect(getGlyphBillboardVertexTranslate(label, 2).y).toEqual(offset2.y); + expect(getBackgroundBillboardVertexTranslate(label).y).toEqual(offsetBack.y); label.horizontalOrigin = HorizontalOrigin.RIGHT; scene.renderForSpecs(); @@ -1425,11 +1433,13 @@ defineSuite([ expect(getGlyphBillboardVertexTranslate(label, 0).x).toBeLessThan(offset0.x); expect(getGlyphBillboardVertexTranslate(label, 1).x).toBeLessThan(offset1.x); expect(getGlyphBillboardVertexTranslate(label, 2).x).toBeLessThan(offset2.x); + expect(getBackgroundBillboardVertexTranslate(label).x).toBeLessThan(offsetBack.x); // Y offset should be unchanged expect(getGlyphBillboardVertexTranslate(label, 0).y).toEqual(offset0.y); expect(getGlyphBillboardVertexTranslate(label, 1).y).toEqual(offset1.y); expect(getGlyphBillboardVertexTranslate(label, 2).y).toEqual(offset2.y); + expect(getBackgroundBillboardVertexTranslate(label).y).toEqual(offsetBack.y); }); it('should set vertexTranslate of billboards correctly when scale is changed', function() { From 72697cf4c7ae734e739b6297c73362ec189f4beb Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Fri, 9 Dec 2016 15:20:08 -0500 Subject: [PATCH 188/396] Update doc. --- .../Images/Billboard.setHorizontalOrigin.png | Bin 129500 -> 102078 bytes Source/Scene/Billboard.js | 2 +- Source/Scene/HorizontalOrigin.js | 2 +- Source/Scene/Label.js | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Documentation/Images/Billboard.setHorizontalOrigin.png b/Documentation/Images/Billboard.setHorizontalOrigin.png index 01ac63db3ccc4f65017b3327b804d540903d124e..77ce870e0a60367193bbf2c57f33009badac832e 100644 GIT binary patch literal 102078 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 N002ovPDHLkV1ilR$?O0C diff --git a/Source/Scene/Billboard.js b/Source/Scene/Billboard.js index f50cd4eca1ca..b51d5d8dc59c 100644 --- a/Source/Scene/Billboard.js +++ b/Source/Scene/Billboard.js @@ -472,7 +472,7 @@ define([ * to the left, center, or right of its anchor position. *

    *
    - *
    + *
    *
    * @memberof Billboard.prototype * @type {HorizontalOrigin} diff --git a/Source/Scene/HorizontalOrigin.js b/Source/Scene/HorizontalOrigin.js index db1737fcf688..87f5d981370e 100644 --- a/Source/Scene/HorizontalOrigin.js +++ b/Source/Scene/HorizontalOrigin.js @@ -12,7 +12,7 @@ define([ * of the anchor position. *

    *
    - *
    + *
    *
    * * @exports HorizontalOrigin diff --git a/Source/Scene/Label.js b/Source/Scene/Label.js index ca1b68d2e8ef..67502ac5d74c 100644 --- a/Source/Scene/Label.js +++ b/Source/Scene/Label.js @@ -671,7 +671,7 @@ define([ * to the left, center, or right of its anchor position. *

    *
    - *
    + *
    *
    * @memberof Label.prototype * @type {HorizontalOrigin} From 6539033966a84c569a17701c6a8f439ce66abb45 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Mon, 12 Dec 2016 10:14:31 -0500 Subject: [PATCH 189/396] Update Sandcastle picking demo. --- Apps/Sandcastle/gallery/Picking.html | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/Apps/Sandcastle/gallery/Picking.html b/Apps/Sandcastle/gallery/Picking.html index 22c7c73ff95a..6ae7162463fe 100644 --- a/Apps/Sandcastle/gallery/Picking.html +++ b/Apps/Sandcastle/gallery/Picking.html @@ -38,7 +38,12 @@ Sandcastle.addDefaultToolbarButton('Show Cartographic Position on Mouse Over', function() { var entity = viewer.entities.add({ label : { - show : false + show : false, + showBackground : true, + font : '14px monospace', + horizontalOrigin : Cesium.HorizontalOrigin.LEFT, + verticalOrigin : Cesium.VerticalOrigin.TOP, + pixelOffset : new Cesium.Cartesian2(15, 0) } }); @@ -53,7 +58,9 @@ entity.position = cartesian; entity.label.show = true; - entity.label.text = '(' + longitudeString + ', ' + latitudeString + ')'; + entity.label.text = + 'Lon: ' + (' ' + longitudeString).slice(-7) + '\u00B0' + + '\nLat: ' + (' ' + latitudeString).slice(-7) + '\u00B0'; } else { entity.label.show = false; } @@ -159,7 +166,11 @@ var labelEntity = viewer.entities.add({ label : { show : false, - horizontalOrigin : Cesium.HorizontalOrigin.LEFT + showBackground : true, + font : '14px monospace', + horizontalOrigin : Cesium.HorizontalOrigin.LEFT, + verticalOrigin : Cesium.VerticalOrigin.TOP, + pixelOffset : new Cesium.Cartesian2(15, 0) } }); @@ -181,8 +192,11 @@ labelEntity.position = cartesian; labelEntity.label.show = true; - labelEntity.label.text = '(' + longitudeString + ', ' + latitudeString + ', ' + heightString + ')'; - + labelEntity.label.text = + 'Lon: ' + (' ' + longitudeString).slice(-7) + '\u00B0' + + '\nLat: ' + (' ' + latitudeString).slice(-7) + '\u00B0' + + '\nAlt: ' + (' ' + heightString).slice(-7) + 'm'; + var camera = scene.camera; labelEntity.label.eyeOffset = new Cesium.Cartesian3(0.0, 0.0, camera.frustum.near * 1.5 - Cesium.Cartesian3.distance(cartesian, camera.position)); @@ -201,7 +215,7 @@ handler = handler && handler.destroy(); }; //Sandcastle_End -Sandcastle.finishedLoading(); + Sandcastle.finishedLoading(); } if (typeof Cesium !== "undefined") { startup(Cesium); From edfd68543db0bbc68c7c317273ba481fad506e75 Mon Sep 17 00:00:00 2001 From: "duvi.fn" Date: Mon, 12 Dec 2016 17:23:47 +0200 Subject: [PATCH 190/396] fix Ellipsoid.getSurfaceNormalIntersectionWithZAxis change Globe.js and QuadtreePrimitive.js to work with Ellipsoid.getSurfaceNormalIntersectionWithZAxis add tests --- Source/Core/Ellipsoid.js | 62 +++++++++-------------- Source/Scene/Globe.js | 30 +++-------- Source/Scene/QuadtreePrimitive.js | 29 +++-------- Specs/Core/EllipsoidSpec.js | 82 +++++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+), 83 deletions(-) diff --git a/Source/Core/Ellipsoid.js b/Source/Core/Ellipsoid.js index cd8f29868a0c..9e14e396e6e6 100644 --- a/Source/Core/Ellipsoid.js +++ b/Source/Core/Ellipsoid.js @@ -610,64 +610,50 @@ define([ return this._radii.toString(); }; - var vectorToZAxisScratch = new Cartesian3(); /** - * Computes a ray which its direction is the geodetic surface normal at a position and its - * origin is the intersection of this normal with the z-axis. - * - * There is no guarantee that the result would be inside the ellipsoid. - * - * @param {Cartesian3} position the position *on the surface of the ellipsoid* - * @param {Ellipsoid} [ellipsoid = Ellipsoid.WGS84] The ellipsoid for which to compute this ray - * @param {Ray} [result] The cartesian to which to copy the result, or undefined to create and + * Computes a point which is the intersection of the surface normal with the z-axis. + * + * @param {Cartesian3} position the position. must be on the surface of the ellipsoid. + * @param {Number} [buffer = 0.0] A buffer to subtract from the ellipsoid size when checking if the point is inside the ellipsoid. + * In earth case, with common earth datums, there is no need for this buffer since the intersection point is always (relatively) very close to the center. + * In WGS84 datum, intersection point is at max z = +-42841.31151331382 (0.673% of z-axis). + * Intersection point could be outside the ellipsoid if the ratio of MajorAxis / MinorAxis is bigger than the square root of 2 + * @param {Cartesian} [result] The cartesian to which to copy the result, or undefined to create and * return a new instance. - * @returns {Ray} the ray + * @returns {Cartesian | undefined} the intersection point if it's inside the ellipsoid, undefined otherwise * * @exception {DeveloperError} position is required. * @exception {DeveloperError} Ellipsoid must be an ellipsoid of revolution (radii.x == radii.y). - * @exception {DeveloperError} Result is not on the z-axis. Please ensure that your input data is valid. */ - Ellipsoid.prototype.getSurfaceNormalRayFromZAxis = function(position, ellipsoid, result) { + + Ellipsoid.prototype.getSurfaceNormalIntersectionWithZAxis = function(position, buffer, result) { + + var ellipsoid = this; + //>>includeStart('debug', pragmas.debug); if (!defined(position)) { throw new DeveloperError('position is required.'); } - if (defined(ellipsoid) && !CesiumMath.equalsEpsilon(ellipsoid.radii.x, ellipsoid.radii.y, CesiumMath.EPSILON15)) { + if (!CesiumMath.equalsEpsilon(ellipsoid.radii.x, ellipsoid.radii.y, CesiumMath.EPSILON15)) { throw new DeveloperError('Ellipsoid must be an ellipsoid of revolution (radii.x == radii.y)'); } //>>includeEnd('debug'); - ellipsoid = defaultValue(ellipsoid, Ellipsoid.WGS84); + buffer = defaultValue(buffer, 0.0); + + var sqauredAOverSquaredB = ellipsoid.radiiSquared.x / ellipsoid.radiiSquared.z; if (!defined(result)){ - result = new Ray(); + result = new Cartesian3(); } - var surfaceNormal = ellipsoid.geodeticSurfaceNormal(position, result.direction); - - // compute the magnitude required to bring surface normal to x=0, y=0, from position - var magnitude; - - // avoid dividing by zero - if (Math.abs(surfaceNormal.x) > CesiumMath.EPSILON16){ - magnitude = cartesian.x / surfaceNormal.x; - } else if (Math.abs(surfaceNormal.y) > CesiumMath.EPSILON16){ - magnitude = cartesian.y / surfaceNormal.y; - } else if (Math.abs(surfaceNormal.z) > CesiumMath.EPSILON16){ //surface normal is (0,0,1) | (0,0,-1) | (0,0,0) - magnitude = cartesian.z / surfaceNormal.z; - } else { //(0,0,0), just in case - magnitude = 0; + result.x = 0; + result.y = 0; + result.z = position.z * (1 - sqauredAOverSquaredB); + if (Math.abs(result.z) >= ellipsoid.radii.z - buffer){ + return undefined; } - var vectorToZAxis = Cartesian3.multiplyByScalar(surfaceNormal, magnitude, vectorToZAxisScratch); - Cartesian3.subtract(position, vectorToZAxis, result.origin); - - //>>includeStart('debug', pragmas.debug); - // sub millimeter accuracy - if (Math.abs(result.origin.x > CesiumMath.EPSILON4) || Math.abs(result.origin.y > CesiumMath.EPSILON4)){ - throw new DeveloperError('Result is not on the z-axis. Please ensure that your input data is valid.'); - } - //>>includeEnd('debug'); return result; }; diff --git a/Source/Scene/Globe.js b/Source/Scene/Globe.js index 5416ec721012..2c7e1ec18a78 100644 --- a/Source/Scene/Globe.js +++ b/Source/Scene/Globe.js @@ -433,35 +433,19 @@ define([ var ray = scratchGetHeightRay; var surfaceNormal = ellipsoid.geodeticSurfaceNormal(cartesian, ray.direction); - // compute origin point - // Try to find the intersection point between the surface normal and z-axis. - // Ellipsoid is a surface of revolution, so surface normal intersects the rotation axis (z-axis) - - // compute the magnitude required to bring surface normal to x=0, y=0, from cartesian - var magnitude; - - // avoid dividing by zero - if (Math.abs(surfaceNormal.x) > CesiumMath.EPSILON16){ - magnitude = cartesian.x / surfaceNormal.x; - } else if (Math.abs(surfaceNormal.y) > CesiumMath.EPSILON16){ - magnitude = cartesian.y / surfaceNormal.y; - } else if (Math.abs(surfaceNormal.z) > CesiumMath.EPSILON16){ //surface normal is (0,0,1) | (0,0,-1) | (0,0,0) - magnitude = cartesian.z / surfaceNormal.z; - } else { //(0,0,0), just for case - magnitude = 0; - } + // minimum height (-11500.0) for the terrain set, need to get this information from the terrain provider + var rayOrigin = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesian, 11500.0, ray.origin); - var vectorToMinimumPoint = Cartesian3.multiplyByScalar(surfaceNormal, magnitude, scratchGetHeightIntersection); - Cartesian3.subtract(cartesian, vectorToMinimumPoint, ray.origin); - // Theoretically, the intersection point can be outside the ellipsoid, so we have to check if the result's 'z' is inside the ellipsoid (with some buffer) - if (Math.abs(ray.origin.z) >= ellipsoid.radii.z -11500.0){ + // Theoretically, not with Earth datums, the intersection point can be outside the ellipsoid + if (!defined(rayOrigin)){ // intersection point is outside the ellipsoid, try other value - magnitude = Math.min(defaultValue(tile.data.minimumHeight, 0.0),-11500.0); + // minimum height (-11500.0) for the terrain set, need to get this information from the terrain provider + var magnitude = Math.min(defaultValue(tile.data.minimumHeight, 0.0),-11500.0); // multiply by the *positive* value of the magnitude - vectorToMinimumPoint = Cartesian3.multiplyByScalar(surfaceNormal, Math.abs(magnitude) + 1, scratchGetHeightIntersection); + var vectorToMinimumPoint = Cartesian3.multiplyByScalar(surfaceNormal, Math.abs(magnitude) + 1, scratchGetHeightIntersection); Cartesian3.subtract(cartesian, vectorToMinimumPoint, ray.origin); } diff --git a/Source/Scene/QuadtreePrimitive.js b/Source/Scene/QuadtreePrimitive.js index 07d572570f5a..cb48a48878d5 100644 --- a/Source/Scene/QuadtreePrimitive.js +++ b/Source/Scene/QuadtreePrimitive.js @@ -772,32 +772,17 @@ define([ // compute origin point // Try to find the intersection point between the surface normal and z-axis. - // Ellipsoid is a surface of revolution, so surface normal intersects the rotation axis (z-axis) - - // compute the magnitude required to bring surface normal to x=0, y=0, from data.position - var magnitude; - - // avoid dividing by zero - if (Math.abs(surfaceNormal.x) > CesiumMath.EPSILON16){ - magnitude = data.positionOnEllipsoidSurface.x / surfaceNormal.x; - } else if (Math.abs(surfaceNormal.y) > CesiumMath.EPSILON16){ - magnitude = data.positionOnEllipsoidSurface.y / surfaceNormal.y; - } else if (Math.abs(surfaceNormal.z) > CesiumMath.EPSILON16){ //surface normal is (0,0,1) | (0,0,-1) | (0,0,0) - magnitude = data.positionOnEllipsoidSurface.z / surfaceNormal.z; - } else { //(0,0,0), just for case - magnitude = 0; - } - - var vectorToMinimumPoint = Cartesian3.multiplyByScalar(surfaceNormal, magnitude, scratchPosition); - Cartesian3.subtract(data.positionOnEllipsoidSurface, vectorToMinimumPoint, scratchRay.origin); + // minimum height (-11500.0) for the terrain set, need to get this information from the terrain provider + var rayOrigin = ellipsoid.getSurfaceNormalIntersectionWithZAxis(data.positionOnEllipsoidSurface, 11500.0, scratchRay.origin); - // Theoretically, the intersection point can be outside the ellipsoid, so we have to check if the result's 'z' is inside the ellipsoid (with some buffer) - if (Math.abs(scratchRay.origin.z) >= ellipsoid.radii.z -11500.0){ + // Theoretically, not with Earth datums, the intersection point can be outside the ellipsoid + if (!defined(rayOrigin)){ // intersection point is outside the ellipsoid, try other value - magnitude = Math.min(defaultValue(tile.data.minimumHeight, 0.0),-11500.0); + // minimum height (-11500.0) for the terrain set, need to get this information from the terrain provider + var magnitude = Math.min(defaultValue(tile.data.minimumHeight, 0.0),-11500.0); // multiply by the *positive* value of the magnitude - vectorToMinimumPoint = Cartesian3.multiplyByScalar(surfaceNormal, Math.abs(magnitude) + 1, scratchPosition); + var vectorToMinimumPoint = Cartesian3.multiplyByScalar(surfaceNormal, Math.abs(magnitude) + 1, scratchPosition); Cartesian3.subtract(data.positionOnEllipsoidSurface, vectorToMinimumPoint, scratchRay.origin); } diff --git a/Specs/Core/EllipsoidSpec.js b/Specs/Core/EllipsoidSpec.js index d4dfa16d1092..d09cef50cd19 100644 --- a/Specs/Core/EllipsoidSpec.js +++ b/Specs/Core/EllipsoidSpec.js @@ -434,5 +434,87 @@ defineSuite([ expect(cloned).toEqual(myEllipsoid); }); + it('getSurfaceNormalIntersectionWithZAxis throws with no position', function() { + expect(function() { + Ellipsoid.WGS84.getSurfaceNormalIntersectionWithZAxis(undefined); + }).toThrowDeveloperError(); + }); + + it('getSurfaceNormalIntersectionWithZAxis throws if the ellipsoid is no ellipsoid of revolution', function() { + expect(function() { + var ellipsoid = new Ellipsoid(1,2,3); + var cartesian = new Cartesian3(); + ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesian); + }).toThrowDeveloperError(); + }); + + it('getSurfaceNormalIntersectionWithZAxis works without a result parameter', function() { + var ellipsoid = Ellipsoid.WGS84; + var cartographic = Cartographic.fromDegrees(35.23,33.23); + var cartesianOnTheSurface = ellipsoid.cartographicToCartesian(cartographic); + var returnedResult = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesianOnTheSurface); + expect(returnedResult instanceof Cartesian3).toBe(true); + }); + + it('getSurfaceNormalIntersectionWithZAxis works with a result parameter', function() { + var ellipsoid = Ellipsoid.WGS84; + var cartographic = Cartographic.fromDegrees(35.23,33.23); + var cartesianOnTheSurface = ellipsoid.cartographicToCartesian(cartographic); + var returnedResult = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesianOnTheSurface, undefined , cartesianOnTheSurface); + expect(returnedResult).toBe(cartesianOnTheSurface); + }); + + it('getSurfaceNormalIntersectionWithZAxis returns undefined if the result is outside the ellipsoid with buffer parameter', function() { + var ellipsoid = Ellipsoid.WGS84; + var cartographic = Cartographic.fromDegrees(35.23,33.23); + var cartesianOnTheSurface = ellipsoid.cartographicToCartesian(cartographic); + var returnedResult = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesianOnTheSurface, ellipsoid.radii.z); + expect(returnedResult).toBe(undefined); + }); + + it('getSurfaceNormalIntersectionWithZAxis returns undefined if the result is outside the ellipsoid without buffer parameter', function() { + var majorAxis = 10; + var minorAxis = 1; + var ellipsoid = new Ellipsoid(majorAxis,majorAxis,minorAxis); + var cartographic = Cartographic.fromDegrees(45.0,90.0); + var cartesianOnTheSurface = ellipsoid.cartographicToCartesian(cartographic); + var returnedResult = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesianOnTheSurface, undefined); + expect(returnedResult).toBe(undefined); + }); + + it('getSurfaceNormalIntersectionWithZAxis returns a result that is equal to the value which computed in a different way', function() { + var ellipsoid = Ellipsoid.WGS84; + var cartographic = Cartographic.fromDegrees(35.23,33.23); + var cartesianOnTheSurface = ellipsoid.cartographicToCartesian(cartographic); + var surfaceNormal = ellipsoid.geodeticSurfaceNormal(cartesianOnTheSurface); + var magnitude = cartesianOnTheSurface.x / surfaceNormal.x; + + var expected = new Cartesian3(); + expected.z = cartesianOnTheSurface.z - surfaceNormal.z * magnitude; + var result = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesianOnTheSurface, undefined); + expect(result).toEqualEpsilon(expected, CesiumMath.EPSILON8); + + // at the equator + cartesianOnTheSurface = new Cartesian3(ellipsoid.radii.x, 0 , 0); + result = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesianOnTheSurface, undefined); + expect(result).toEqualEpsilon(Cartesian3.ZERO, CesiumMath.EPSILON8); + }); + + it('getSurfaceNormalIntersectionWithZAxis returns a result that when a it\'s used as origin to a vector with the surface normal direction it produces an accurate cartographic', function() { + var ellipsoid = Ellipsoid.WGS84; + var cartographic = Cartographic.fromDegrees(35.23,33.23); + var cartesianOnTheSurface = ellipsoid.cartographicToCartesian(cartographic); + var surfaceNormal = ellipsoid.geodeticSurfaceNormal(cartesianOnTheSurface); + + var result = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesianOnTheSurface, undefined); + + var surfaceNormalWithLength = Cartesian3.multiplyByScalar(surfaceNormal, ellipsoid.maximumRadius, new Cartesian3()); + var position = Cartesian3.add(result,surfaceNormalWithLength,new Cartesian3()); + var resultCartographic = ellipsoid.cartesianToCartographic(position); + resultCartographic.height = 0.0; + expect(resultCartographic).toEqualEpsilon(cartographic, CesiumMath.EPSILON8); + + }); + createPackableSpecs(Ellipsoid, Ellipsoid.WGS84, [Ellipsoid.WGS84.radii.x, Ellipsoid.WGS84.radii.y, Ellipsoid.WGS84.radii.z]); }); From 8186d84212f7364a4af333fa6adb6c52bdac2cd1 Mon Sep 17 00:00:00 2001 From: Matthew Amato Date: Mon, 12 Dec 2016 10:27:24 -0500 Subject: [PATCH 191/396] Replace our existing mapbox key with a new one. --- Source/Core/MapboxApi.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/MapboxApi.js b/Source/Core/MapboxApi.js index d1c7f30f3260..b715e680aeec 100644 --- a/Source/Core/MapboxApi.js +++ b/Source/Core/MapboxApi.js @@ -33,7 +33,7 @@ define([ console.log('This application is using Cesium\'s default Mapbox access token. Please create a new access token for the application as soon as possible and prior to deployment by visiting https://www.mapbox.com/account/apps/, and provide your token to Cesium by setting the Cesium.MapboxApi.defaultAccessToken property before constructing the CesiumWidget or any other object that uses the Mapbox API.'); printedMpaboxWarning = true; } - return 'pk.eyJ1IjoiYW5hbHl0aWNhbGdyYXBoaWNzIiwiYSI6IjA2YzBjOTM3YzFlYzljYmQ5NDAxZWI1Y2ZjNzZlM2E1In0.vDZL2SPFEpi_f7ziAIP_yw'; + return 'pk.eyJ1IjoiYW5hbHl0aWNhbGdyYXBoaWNzIiwiYSI6ImNpd204Zm4wejAwNzYyeW5uNjYyZmFwdWEifQ.7i-VIZZWX8pd1bTfxIVj9g'; } return MapboxApi.defaultAccessToken; From 11fc0da3d6e73761e7e6c830097bcc14a6d2b9e2 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 12 Dec 2016 13:22:07 -0500 Subject: [PATCH 192/396] Doc and stencil clear after ground pass --- Source/Scene/Model.js | 3 +-- Source/Scene/Scene.js | 8 ++++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index d7cd0e4f73f5..a94e59ff3957 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -328,7 +328,7 @@ define([ * @param {Color} [options.color=Color.WHITE] A color that blends with the model's rendered color. * @param {ColorBlendMode} [options.colorBlendMode=ColorBlendMode.HIGHLIGHT] Defines how the color blends with the model. * @param {Number} [options.colorBlendAmount=0.5] Value used to determine the color strength when the colorBlendMode is MIX. A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with any value in-between resulting in a mix of the two. - * @param {Color} [options.silhouetteColor=Color.RED] The silhouette color. + * @param {Color} [options.silhouetteColor=Color.RED] The silhouette color. If more than 256 models have silhouettes enabled, there is a small chance that overlapping models will have minor artifacts. * @param {Number} [options.silhouetteSize=0.0] The size of the silhouette in pixels. * * @exception {DeveloperError} bgltf is not a valid Binary glTF file. @@ -3663,7 +3663,6 @@ define([ return (Math.floor(currAlpha) !== Math.floor(prevAlpha)) || (Math.ceil(currAlpha) !== Math.ceil(prevAlpha)); } - // TODO : alternatively increment silhouette length as part of frame state and edit the model render states on the fly var silhouettesLength = 0; function createSilhouetteCommands(model, frameState) { diff --git a/Source/Scene/Scene.js b/Source/Scene/Scene.js index 439e70b1baef..e8e5840d0464 100644 --- a/Source/Scene/Scene.js +++ b/Source/Scene/Scene.js @@ -285,6 +285,9 @@ define([ depth : 1.0, owner : this }); + this._stencilClearCommand = new ClearCommand({ + stencil : 0 + }); this._pickDepths = []; this._debugGlobeDepths = []; @@ -1755,6 +1758,11 @@ define([ executeCommand(commands[j], scene, context, passState); } + // Clear the stencil after the ground pass + if (length > 0 && context.stencilBuffer) { + scene._stencilClearCommand.execute(context, passState); + } + if (clearGlobeDepth) { clearDepth.execute(context, passState); if (useDepthPlane) { From 7810931c6be64502ac5cde4fb3f282fe8de1ec90 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Mon, 12 Dec 2016 13:52:46 -0500 Subject: [PATCH 193/396] Change to a modern method of constructing synthetic pointer events. --- Specs/DomEventSimulator.js | 58 +++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/Specs/DomEventSimulator.js b/Specs/DomEventSimulator.js index c5e9a11e5796..909db670a595 100644 --- a/Specs/DomEventSimulator.js +++ b/Specs/DomEventSimulator.js @@ -137,35 +137,35 @@ define([ function createPointerEvent(type, options) { options = defaultValue(options, defaultValue.EMPTY_OBJECT); - var canBubble = defaultValue(options.canBubble, true); - var cancelable = defaultValue(options.cancelable, true); - var view = defaultValue(options.view, window); - var detail = defaultValue(options.detail, 0); - var screenX = defaultValue(options.screenX, 0); - var screenY = defaultValue(options.screenY, 0); - var clientX = defaultValue(options.clientX, 0); - var clientY = defaultValue(options.clientY, 0); - var ctrlKey = defaultValue(options.ctrlKey, false); - var altKey = defaultValue(options.altKey, false); - var shiftKey = defaultValue(options.shiftKey, false); - var metaKey = defaultValue(options.metaKey, false); - var button = defaultValue(options.button, 0); - var relatedTarget = defaultValue(options.relatedTarget, null); - var offsetX = defaultValue(options.offsetX, 0); - var offsetY = defaultValue(options.offsetY, 0); - var width = defaultValue(options.width, 0); - var height = defaultValue(options.height, 0); - var pressure = defaultValue(options.pressure, 0); - var rotation = defaultValue(options.rotation, 0); - var tiltX = defaultValue(options.tiltX, 0); - var tiltY = defaultValue(options.tiltY, 0); - var pointerId = defaultValue(options.pointerId, 1); - var pointerType = defaultValue(options.pointerType, 0); - var hwTimestamp = defaultValue(options.hwTimestamp, 0); - var isPrimary = defaultValue(options.isPrimary, 0); - - var event = document.createEvent('PointerEvent'); - event.initPointerEvent(type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget, offsetX, offsetY, width, height, pressure, rotation, tiltX, tiltY, pointerId, pointerType, hwTimestamp, isPrimary); + + var event = new window.PointerEvent(type, { + canBubble : defaultValue(options.canBubble, true), + cancelable : defaultValue(options.cancelable, true), + view : defaultValue(options.view, window), + detail : defaultValue(options.detail, 0), + screenX : defaultValue(options.screenX, 0), + screenY : defaultValue(options.screenY, 0), + clientX : defaultValue(options.clientX, 0), + clientY : defaultValue(options.clientY, 0), + ctrlKey : defaultValue(options.ctrlKey, false), + altKey : defaultValue(options.altKey, false), + shiftKey : defaultValue(options.shiftKey, false), + metaKey : defaultValue(options.metaKey, false), + button : defaultValue(options.button, 0), + relatedTarget : defaultValue(options.relatedTarget, null), + offsetX : defaultValue(options.offsetX, 0), + offsetY : defaultValue(options.offsetY, 0), + width : defaultValue(options.width, 0), + height : defaultValue(options.height, 0), + pressure : defaultValue(options.pressure, 0), + rotation : defaultValue(options.rotation, 0), + tiltX : defaultValue(options.tiltX, 0), + tiltY : defaultValue(options.tiltY, 0), + pointerId : defaultValue(options.pointerId, 1), + pointerType : defaultValue(options.pointerType, 0), + hwTimestamp : defaultValue(options.hwTimestamp, 0), + isPrimary : defaultValue(options.isPrimary, 0) + }); return event; } From cb35414d9fc0f3cd6460acc3e6c1b25dd6032780 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 12 Dec 2016 14:09:24 -0500 Subject: [PATCH 194/396] No longer hardcoding v_normal --- Source/Scene/Model.js | 15 ++++++-- .../Scene/getAttributeOrUniformBySemantic.js | 38 +++++++++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 Source/Scene/getAttributeOrUniformBySemantic.js diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index a94e59ff3957..7fe5ccc1dd75 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -50,6 +50,7 @@ define([ '../ThirdParty/when', './BlendingState', './ColorBlendMode', + './getAttributeOrUniformBySemantic', './getBinaryAccessor', './HeightReference', './ModelAnimationCache', @@ -112,6 +113,7 @@ define([ when, BlendingState, ColorBlendMode, + getAttributeOrUniformBySemantic, getBinaryAccessor, HeightReference, ModelAnimationCache, @@ -416,6 +418,7 @@ define([ */ this.silhouetteColor = defaultValue(options.silhouetteColor, Color.RED); this._silhouetteColor = new Color(); + this._normalAttributeName = undefined; /** * The size of the silhouette in pixels. @@ -3599,9 +3602,10 @@ define([ } } - function createSilhouetteProgram(program, frameState) { + function createSilhouetteProgram(model, program, frameState) { var vs = program.vertexShaderSource.sources[0]; var attributeLocations = program._attributeLocations; + var normalAttributeName = model._normalAttributeName; // Modified from http://forum.unity3d.com/threads/toon-outline-but-with-diffuse-surface.24668/ vs = ShaderSource.replaceMain(vs, 'gltf_silhouette_main'); @@ -3610,7 +3614,7 @@ define([ 'void main() \n' + '{ \n' + ' gltf_silhouette_main(); \n' + - ' vec3 n = normalize(v_normal); \n' + + ' vec3 n = normalize(czm_normal * ' + normalAttributeName + '); \n' + ' n.x *= czm_projection[0][0]; \n' + ' n.y *= czm_projection[1][1]; \n' + ' vec4 clip = gl_Position; \n' + @@ -3634,7 +3638,7 @@ define([ } function hasSilhouette(model, frameState) { - return silhouetteSupported(frameState.context) && (model.silhouetteSize > 0.0) && (model.silhouetteColor.alpha > 0.0); + return silhouetteSupported(frameState.context) && (model.silhouetteSize > 0.0) && (model.silhouetteColor.alpha > 0.0) && defined(model._normalAttributeName); } function hasTranslucentCommands(model) { @@ -3755,7 +3759,7 @@ define([ var id = getProgramId(model, program); var silhouetteProgram = silhouettePrograms[id]; if (!defined(silhouetteProgram)) { - silhouetteProgram = createSilhouetteProgram(program, frameState); + silhouetteProgram = createSilhouetteProgram(model, program, frameState); silhouettePrograms[id] = silhouetteProgram; } @@ -4134,6 +4138,9 @@ define([ cachedResources.renderStates = resources.renderStates; cachedResources.ready = true; + // The normal attribute name is required for silhouettes, so get it before the gltf JSON is released + this._normalAttributeName = getAttributeOrUniformBySemantic(this.gltf, 'NORMAL'); + // Vertex arrays are unique to this model, do not store in cache. if (defined(this._precreatedAttributes)) { cachedResources.vertexArrays = {}; diff --git a/Source/Scene/getAttributeOrUniformBySemantic.js b/Source/Scene/getAttributeOrUniformBySemantic.js new file mode 100644 index 000000000000..41520014e123 --- /dev/null +++ b/Source/Scene/getAttributeOrUniformBySemantic.js @@ -0,0 +1,38 @@ +/*global define*/ +define([], function() { + 'use strict'; + + /** + * Return the uniform or attribute that has the given semantic. + * + * @private + */ + function getAttributeOrUniformBySemantic(gltf, semantic) { + var techniques = gltf.techniques; + for (var techniqueName in techniques) { + if (techniques.hasOwnProperty(techniqueName)) { + var technique = techniques[techniqueName]; + var parameters = technique.parameters; + var attributes = technique.attributes; + var uniforms = technique.uniforms; + for (var attributeName in attributes) { + if (attributes.hasOwnProperty(attributeName)) { + if (parameters[attributes[attributeName]].semantic === semantic) { + return attributeName; + } + } + } + for (var uniformName in uniforms) { + if (uniforms.hasOwnProperty(uniformName)) { + if (parameters[uniforms[uniformName]].semantic === semantic) { + return uniformName; + } + } + } + } + } + return undefined; + } + + return getAttributeOrUniformBySemantic; +}); From 95d024e30c4ef08cec01be3db915aa91e6ae2680 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 12 Dec 2016 14:11:58 -0500 Subject: [PATCH 195/396] Updated CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index f9eeb43dd66d..57a5b2f871f5 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ Change Log ### 1.29 - 2017-01-02 * Added the ability to blend a `Model` with a color/translucency. Added `color`, `colorBlendMode`, and `colorBlendAmount` properties to `Model`, `ModelGraphics`, and CZML. Added `ColorBlendMode` enum. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) +* Added the ability to render a `Model` with a silhouette. Added `silhouetteColor` and `silhouetteSize` properties to `Model`, `ModelGraphics`, and CZML. [#4314](https://github.com/AnalyticalGraphicsInc/cesium/pull/4314) ### 1.28 - 2016-12-01 From 6b06c0b2c3d9366a5a80ce066a01a93b21c77dbf Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Mon, 12 Dec 2016 15:31:17 -0500 Subject: [PATCH 196/396] Add back test support for IE 11. --- Specs/DomEventSimulator.js | 97 ++++++++++++++++++++++++++------------ 1 file changed, 67 insertions(+), 30 deletions(-) diff --git a/Specs/DomEventSimulator.js b/Specs/DomEventSimulator.js index 909db670a595..75c99d375db5 100644 --- a/Specs/DomEventSimulator.js +++ b/Specs/DomEventSimulator.js @@ -1,8 +1,10 @@ /*global define*/ define([ - 'Core/defaultValue' + 'Core/defaultValue', + 'Core/FeatureDetection' ], function( - defaultValue) { + defaultValue, + FeatureDetection) { 'use strict'; function createMouseEvent(type, options) { @@ -137,35 +139,70 @@ define([ function createPointerEvent(type, options) { options = defaultValue(options, defaultValue.EMPTY_OBJECT); + var event; - var event = new window.PointerEvent(type, { - canBubble : defaultValue(options.canBubble, true), - cancelable : defaultValue(options.cancelable, true), - view : defaultValue(options.view, window), - detail : defaultValue(options.detail, 0), - screenX : defaultValue(options.screenX, 0), - screenY : defaultValue(options.screenY, 0), - clientX : defaultValue(options.clientX, 0), - clientY : defaultValue(options.clientY, 0), - ctrlKey : defaultValue(options.ctrlKey, false), - altKey : defaultValue(options.altKey, false), - shiftKey : defaultValue(options.shiftKey, false), - metaKey : defaultValue(options.metaKey, false), - button : defaultValue(options.button, 0), - relatedTarget : defaultValue(options.relatedTarget, null), - offsetX : defaultValue(options.offsetX, 0), - offsetY : defaultValue(options.offsetY, 0), - width : defaultValue(options.width, 0), - height : defaultValue(options.height, 0), - pressure : defaultValue(options.pressure, 0), - rotation : defaultValue(options.rotation, 0), - tiltX : defaultValue(options.tiltX, 0), - tiltY : defaultValue(options.tiltY, 0), - pointerId : defaultValue(options.pointerId, 1), - pointerType : defaultValue(options.pointerType, 0), - hwTimestamp : defaultValue(options.hwTimestamp, 0), - isPrimary : defaultValue(options.isPrimary, 0) - }); + if (FeatureDetection.isInternetExplorer()) { + var canBubble = defaultValue(options.canBubble, true); + var cancelable = defaultValue(options.cancelable, true); + var view = defaultValue(options.view, window); + var detail = defaultValue(options.detail, 0); + var screenX = defaultValue(options.screenX, 0); + var screenY = defaultValue(options.screenY, 0); + var clientX = defaultValue(options.clientX, 0); + var clientY = defaultValue(options.clientY, 0); + var ctrlKey = defaultValue(options.ctrlKey, false); + var altKey = defaultValue(options.altKey, false); + var shiftKey = defaultValue(options.shiftKey, false); + var metaKey = defaultValue(options.metaKey, false); + var button = defaultValue(options.button, 0); + var relatedTarget = defaultValue(options.relatedTarget, null); + var offsetX = defaultValue(options.offsetX, 0); + var offsetY = defaultValue(options.offsetY, 0); + var width = defaultValue(options.width, 0); + var height = defaultValue(options.height, 0); + var pressure = defaultValue(options.pressure, 0); + var rotation = defaultValue(options.rotation, 0); + var tiltX = defaultValue(options.tiltX, 0); + var tiltY = defaultValue(options.tiltY, 0); + var pointerId = defaultValue(options.pointerId, 1); + var pointerType = defaultValue(options.pointerType, 0); + var hwTimestamp = defaultValue(options.hwTimestamp, 0); + var isPrimary = defaultValue(options.isPrimary, 0); + + event = document.createEvent('PointerEvent'); + event.initPointerEvent(type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, + ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget, offsetX, offsetY, width, height, + pressure, rotation, tiltX, tiltY, pointerId, pointerType, hwTimestamp, isPrimary); + } else { + event = new window.PointerEvent(type, { + canBubble : defaultValue(options.canBubble, true), + cancelable : defaultValue(options.cancelable, true), + view : defaultValue(options.view, window), + detail : defaultValue(options.detail, 0), + screenX : defaultValue(options.screenX, 0), + screenY : defaultValue(options.screenY, 0), + clientX : defaultValue(options.clientX, 0), + clientY : defaultValue(options.clientY, 0), + ctrlKey : defaultValue(options.ctrlKey, false), + altKey : defaultValue(options.altKey, false), + shiftKey : defaultValue(options.shiftKey, false), + metaKey : defaultValue(options.metaKey, false), + button : defaultValue(options.button, 0), + relatedTarget : defaultValue(options.relatedTarget, null), + offsetX : defaultValue(options.offsetX, 0), + offsetY : defaultValue(options.offsetY, 0), + width : defaultValue(options.width, 0), + height : defaultValue(options.height, 0), + pressure : defaultValue(options.pressure, 0), + rotation : defaultValue(options.rotation, 0), + tiltX : defaultValue(options.tiltX, 0), + tiltY : defaultValue(options.tiltY, 0), + pointerId : defaultValue(options.pointerId, 1), + pointerType : defaultValue(options.pointerType, 0), + hwTimestamp : defaultValue(options.hwTimestamp, 0), + isPrimary : defaultValue(options.isPrimary, 0) + }); + } return event; } From 1d759ca6c298980080905de8c69a746eeb4aa98a Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 12 Dec 2016 15:50:11 -0500 Subject: [PATCH 197/396] Code and Sandcastle updates --- ...ml => 3D Tiles Batch Table Hierarchy.html} | 77 +++++++++++++++--- ...jpg => 3D Tiles Batch Table Hierarchy.jpg} | Bin Source/Scene/Cesium3DTileBatchTable.js | 19 ++--- Source/Scene/Cesium3DTileFeature.js | 4 +- Source/Scene/Expression.js | 12 +-- Specs/Scene/Cesium3DTileBatchTableSpec.js | 23 +++--- Specs/Scene/ExpressionSpec.js | 14 ++-- 7 files changed, 98 insertions(+), 51 deletions(-) rename Apps/Sandcastle/gallery/{3D Tiles Hierarchy.html => 3D Tiles Batch Table Hierarchy.html} (81%) rename Apps/Sandcastle/gallery/{3D Tiles Hierarchy.jpg => 3D Tiles Batch Table Hierarchy.jpg} (100%) diff --git a/Apps/Sandcastle/gallery/3D Tiles Hierarchy.html b/Apps/Sandcastle/gallery/3D Tiles Batch Table Hierarchy.html similarity index 81% rename from Apps/Sandcastle/gallery/3D Tiles Hierarchy.html rename to Apps/Sandcastle/gallery/3D Tiles Batch Table Hierarchy.html index b02b7bcbb18b..592c3f1f3615 100644 --- a/Apps/Sandcastle/gallery/3D Tiles Hierarchy.html +++ b/Apps/Sandcastle/gallery/3D Tiles Batch Table Hierarchy.html @@ -29,12 +29,64 @@ 'use strict'; //Sandcastle_Begin +// In this demo doorknobs, doors, roofs, and walls are styled via the batch table hierarchy. +// Since buildings and zones are not backed by geometry they are not styled directly. However +// styles may be written that take building and zone properties into account. +// +// Hierarchy layout (doorknobs are children of doors): +// +// zone0 +// building0 +// roof0 +// wall0 +// door0 - doorknob0 +// door1 - doorknob1 +// door2 - doorknob2 +// door3 - doorknob3 +// building1 +// roof1 +// wall1 +// door4 - doorknob4 +// door5 - doorknob5 +// door6 - doorknob6 +// door7 - doorknob7 +// building2 +// roof2 +// wall2 +// door8 - doorknob8 +// door9 - doorknob9 +// door10 - doorknob10 +// door11 - doorknob11 +// +// Class properties: +// +// zone: +// * zone_building +// * zone_name +// building: +// * building_area +// * building_name +// wall: +// * wall_paint +// * wall_windows +// * wall_name +// roof: +// * roof_paint +// * roof_name +// door: +// * door_mass +// * door_width +// * door_name +// doorknob: +// * doorknob_size +// * doorknob_name + var viewer = new Cesium.Viewer('cesiumContainer', { scene3DOnly : true }); var scene = viewer.scene; -var tilesetUrl = '../../../Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents'; +var tilesetUrl = '../../../Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy'; var tileset = scene.primitives.add(new Cesium.Cesium3DTileset({ url : tilesetUrl })); @@ -84,24 +136,25 @@ } }); -addStyle('Style by height', { +addStyle('Color features by class name', { "color" : { + "expression" : "regExp('door(.*)').exec(getExactClassName())", "conditions" : [ - ["${height} >= 10", "color('purple')"], - ["${height} >= 6", "color('red')"], - ["${height} >= 5", "color('orange')"], - ["true", "color('blue')"] + ["${expression} === 'knob'", "color('yellow')"], + ["${expression} === ''", "color('lime')"], + ["${expression} === null", "color('gray')"], + ["true", "color('blue'"] ] } }); -addStyle('Style by classifier', { +addStyle('Style by height', { "color" : { "conditions" : [ - ["isClass('classifier_new') && isClass('classifier_old')", "color('purple')"], - ["isClass('classifier_new')", "color('red')"], - ["isClass('classifier_old')", "color('blue')"], - ["true", "color()"] + ["${height} >= 10", "color('purple')"], + ["${height} >= 6", "color('red')"], + ["${height} >= 5", "color('orange')"], + ["true", "color('blue')"] ] } }); @@ -212,7 +265,7 @@ var feature = current.feature; if (Cesium.defined(feature)) { - console.log('Class: ' + feature.getClassName()); + console.log('Class: ' + feature.getExactClassName()); console.log('Properties:'); var propertyNames = feature.getPropertyNames(); var length = propertyNames.length; diff --git a/Apps/Sandcastle/gallery/3D Tiles Hierarchy.jpg b/Apps/Sandcastle/gallery/3D Tiles Batch Table Hierarchy.jpg similarity index 100% rename from Apps/Sandcastle/gallery/3D Tiles Hierarchy.jpg rename to Apps/Sandcastle/gallery/3D Tiles Batch Table Hierarchy.jpg diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index 273c99ab63d9..07cefc3d035d 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -206,8 +206,9 @@ define([ } //>>includeStart('debug', pragmas.debug); + var scratchValidateStack = []; function validateHierarchy(hierarchy) { - var stack = scratchStack; + var stack = scratchValidateStack; stack.length = 0; var classIds = hierarchy.classIds; @@ -657,10 +658,10 @@ define([ } //>>includeEnd('debug'); - return (this.getClassName(batchId) === className); + return (this.getExactClassName(batchId) === className); }; - Cesium3DTileBatchTable.prototype.getClassName = function(batchId) { + Cesium3DTileBatchTable.prototype.getExactClassName = function(batchId) { var featuresLength = this.featuresLength; //>>includeStart('debug', pragmas.debug); if (!defined(batchId) || (batchId < 0) || (batchId > featuresLength)) { @@ -689,17 +690,7 @@ define([ //>>includeEnd('debug'); var json = this.batchTableJson; - if (defined(json) && defined(json[name])) { - return true; - } - - if (defined(this._batchTableHierarchy)) { - if (hasPropertyInHierarchy(this, batchId, name)) { - return true; - } - } - - return false; + return (defined(json) && defined(json[name])) || (defined(this._batchTableHierarchy) && hasPropertyInHierarchy(this, batchId, name)); }; Cesium3DTileBatchTable.prototype.getPropertyNames = function(batchId) { diff --git a/Source/Scene/Cesium3DTileFeature.js b/Source/Scene/Cesium3DTileFeature.js index 5baf678066ee..c82894b8353a 100644 --- a/Source/Scene/Cesium3DTileFeature.js +++ b/Source/Scene/Cesium3DTileFeature.js @@ -240,8 +240,8 @@ define([ * * @private */ - Cesium3DTileFeature.prototype.getClassName = function() { - return this._batchTable.getClassName(this._batchId); + Cesium3DTileFeature.prototype.getExactClassName = function() { + return this._batchTable.getExactClassName(this._batchId); }; return Cesium3DTileFeature; diff --git a/Source/Scene/Expression.js b/Source/Scene/Expression.js index e710fe62f853..ab38082abf2d 100644 --- a/Source/Scene/Expression.js +++ b/Source/Scene/Expression.js @@ -363,7 +363,7 @@ define([ //>>includeEnd('debug'); val = createRuntimeAst(expression, args[0]); return new Node(ExpressionNodeType.UNARY, call, val); - } else if (call === 'getClassName') { + } else if (call === 'getExactClassName') { //>>includeStart('debug', pragmas.debug); if (args.length > 0) { throw new DeveloperError('Error: ' + call + ' does not take any argument.'); @@ -617,8 +617,8 @@ define([ node.evaluate = node._evaluateIsExactClass; } else if (node._value === 'isClass') { node.evaluate = node._evaluateIsClass; - } else if (node._value === 'getClassName') { - node.evaluate = node._evaluateGetClassName; + } else if (node._value === 'getExactClassName') { + node.evaluate = node._evaluategetExactClassName; } else if (defined(unaryFunctions[node._value])) { node.evaluate = getEvaluateUnaryFunction(node._value); } else if (node._value === 'Boolean') { @@ -971,8 +971,8 @@ define([ return feature.isClass(this._left.evaluate(frameState, feature)); }; - Node.prototype._evaluateGetClassName = function(frameState, feature) { - return feature.getClassName(); + Node.prototype._evaluategetExactClassName = function(frameState, feature) { + return feature.getExactClassName(); }; Node.prototype._evaluateBooleanConversion = function(frameState, feature) { @@ -1202,7 +1202,7 @@ define([ return 'sqrt(' + left + ')'; } //>>includeStart('debug', pragmas.debug); - else if ((value === 'isNaN') || (value === 'isFinite') || (value === 'String') || (value === 'isExactClass') || (value === 'isClass') || (value === 'getClassName')) { + else if ((value === 'isNaN') || (value === 'isFinite') || (value === 'String') || (value === 'isExactClass') || (value === 'isClass') || (value === 'getExactClassName')) { throw new DeveloperError('Error generating style shader: "' + value + '" is not supported.'); } //>>includeEnd('debug'); diff --git a/Specs/Scene/Cesium3DTileBatchTableSpec.js b/Specs/Scene/Cesium3DTileBatchTableSpec.js index 6c41cb5d2970..b09ebe910e3b 100644 --- a/Specs/Scene/Cesium3DTileBatchTableSpec.js +++ b/Specs/Scene/Cesium3DTileBatchTableSpec.js @@ -697,16 +697,16 @@ defineSuite([ }).toThrowDeveloperError(); }); - it('getClassName throws with invalid batchId', function() { + it('getExactClassName throws with invalid batchId', function() { var batchTable = new Cesium3DTileBatchTable(mockContent, 1); expect(function() { - batchTable.getClassName(); + batchTable.getExactClassName(); }).toThrowDeveloperError(); expect(function() { - batchTable.getClassName(1000); + batchTable.getExactClassName(1000); }).toThrowDeveloperError(); expect(function() { - batchTable.getClassName(-1); + batchTable.getExactClassName(-1); }).toThrowDeveloperError(); }); @@ -735,15 +735,15 @@ defineSuite([ tileset.style = new Cesium3DTileStyle({color : "isClass('zone') ? color('red') : color('green')"}); expect(scene.renderForSpecs()[0]).toBeGreaterThan(0); // Expect red - // Check getClassName - tileset.style = new Cesium3DTileStyle({color : "getClassName() === 'roof' ? color('red') : color('green')"}); + // Check getExactClassName + tileset.style = new Cesium3DTileStyle({color : "getExactClassName() === 'roof' ? color('red') : color('green')"}); expect(scene.renderForSpecs()[0]).toBeGreaterThan(0); // Expect red - tileset.style = new Cesium3DTileStyle({color : "getClassName() === 'zone' ? color('red') : color('green')"}); + tileset.style = new Cesium3DTileStyle({color : "getExactClassName() === 'zone' ? color('red') : color('green')"}); expect(scene.renderForSpecs()[1]).toBeGreaterThan(0); // Expect green } function checkHierarchyProperties(tileset, multipleParents) { - // Check isExactClass, isClass, and getClassName in Cesium3DTileFeature + // Check isExactClass, isClass, and getExactClassName in Cesium3DTileFeature var content = tileset._root.content; var batchTable = content.batchTable; var hierarchy = batchTable._batchTableHierarchy; @@ -755,7 +755,7 @@ defineSuite([ expect(doorFeature.isClass('door')).toBe(true); expect(doorFeature.isClass('doorknob')).toBe(false); expect(doorFeature.isClass('building')).toBe(true); - expect(doorFeature.getClassName()).toBe('door'); + expect(doorFeature.getExactClassName()).toBe('door'); expect(doorFeature.hasProperty('door_name')).toBe(true); expect(doorFeature.hasProperty('height')).toBe(true); @@ -794,7 +794,7 @@ defineSuite([ batchTable._batchTableHierarchy = undefined; expect(doorFeature.isExactClass('door')).toBe(false); expect(doorFeature.isClass('door')).toBe(false); - expect(doorFeature.getClassName()).toBeUndefined(); + expect(doorFeature.getExactClassName()).toBeUndefined(); expect(doorFeature.hasProperty('door_name')).toBe(false); expect(doorFeature.hasProperty('height')).toBe(true); expect(doorFeature.getPropertyNames()).toEqual(['height', 'area']); @@ -907,6 +907,8 @@ defineSuite([ expect(batchTable.hasProperty(2, 'zone_name')).toEqual(true); // check door1 }); + //>>includeStart('debug', pragmas.debug); + // Circular dependencies are only caught in debug builds. it('throws if hierarchy has a circular dependency', function() { // window0 -> door0 -> building0 -> window0 var batchTableJson = { @@ -972,6 +974,7 @@ defineSuite([ return new Cesium3DTileBatchTable(mockContent, 4, batchTableJson); }).toThrowDeveloperError(); }); + //>>includeEnd('debug'); it('throws if an instance\'s parentId exceeds instancesLength', function() { var batchTableJson = { diff --git a/Specs/Scene/ExpressionSpec.js b/Specs/Scene/ExpressionSpec.js index bcbb8908a6b6..4e9da5f70935 100644 --- a/Specs/Scene/ExpressionSpec.js +++ b/Specs/Scene/ExpressionSpec.js @@ -48,7 +48,7 @@ defineSuite([ return (this._className === className) || (this._inheritedClassName === className); }; - MockFeature.prototype.getClassName = function() { + MockFeature.prototype.getExactClassName = function() { return this._className; }; @@ -892,16 +892,16 @@ defineSuite([ }).toThrowDeveloperError(); }); - it('evaluates getClassName function', function() { + it('evaluates getExactClassName function', function() { var feature = new MockFeature(); feature.setClass('door'); - var expression = new Expression('getClassName()'); + var expression = new Expression('getExactClassName()'); expect(expression.evaluate(frameState, feature)).toEqual('door'); }); - it('throws if getClassName takes an invalid number of arguments', function() { + it('throws if getExactClassName takes an invalid number of arguments', function() { expect(function() { - return new Expression('getClassName("door")'); + return new Expression('getExactClassName("door")'); }).toThrowDeveloperError(); }); @@ -1989,8 +1989,8 @@ defineSuite([ }).toThrowDeveloperError(); }); - it('throws when getting shader expression for getClassName', function() { - var expression = new Expression('getClassName()'); + it('throws when getting shader expression for getExactClassName', function() { + var expression = new Expression('getExactClassName()'); expect(function() { return expression.getShaderExpression('', {}); }).toThrowDeveloperError(); From 989957114285697dd03639a67fb972e2cca3d956 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 12 Dec 2016 16:38:08 -0500 Subject: [PATCH 198/396] Remove comma --- Source/Scene/Expression.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Scene/Expression.js b/Source/Scene/Expression.js index a67b1c50b192..7edb2d791ee2 100644 --- a/Source/Scene/Expression.js +++ b/Source/Scene/Expression.js @@ -62,7 +62,7 @@ define([ asin : Math.asin, atan : Math.atan, radians : CesiumMath.toRadians, - degrees : CesiumMath.toDegrees, + degrees : CesiumMath.toDegrees }; /** From 77fd93ccc23907350b008e15e66a93aa631d6cd4 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Mon, 12 Dec 2016 16:46:09 -0500 Subject: [PATCH 199/396] update other ground geometry for extrude normals --- Source/Core/CorridorGeometry.js | 74 ++++++++------ Source/Core/EllipseGeometry.js | 134 +++++++++++++------------- Source/Core/PolygonGeometry.js | 45 +++++---- Source/Core/PolygonGeometryLibrary.js | 19 +--- Source/Core/RectangleGeometry.js | 41 +++----- 5 files changed, 155 insertions(+), 158 deletions(-) diff --git a/Source/Core/CorridorGeometry.js b/Source/Core/CorridorGeometry.js index 4252c69d082d..7ab047cfa002 100644 --- a/Source/Core/CorridorGeometry.js +++ b/Source/Core/CorridorGeometry.js @@ -562,7 +562,7 @@ define([ function computePositionsExtruded(params, vertexFormat) { var topVertexFormat = new VertexFormat({ position : vertexFormat.position, - normal : (vertexFormat.normal || vertexFormat.binormal), + normal : (vertexFormat.normal || vertexFormat.binormal || params.shadowVolume), tangent : vertexFormat.tangent, binormal : (vertexFormat.normal || vertexFormat.binormal), st : vertexFormat.st @@ -590,48 +590,50 @@ define([ newPositions.set(wallPositions, length * 2); attributes.position.values = newPositions; - var sectionLength = length / 3; - var isBottom = new Uint8Array(sectionLength * 6); - if (typeof Uint8Array.prototype.fill === 'function') { - isBottom.fill(1, sectionLength, sectionLength * 2); - isBottom.fill(1, sectionLength * 4); - } else { //IE doesn't support fill - for (i = sectionLength; i < sectionLength * 2; i++) { - isBottom[i] = 1; + attributes = extrudedAttributes(attributes, vertexFormat); + var size = length / 3; + if (params.shadowVolume) { + var topNormals = attributes.normal.values; + length = topNormals.length; + + var extrudeNormals = new Float32Array(length * 6); + for (i = 0; i < length; i ++) { + topNormals[i] = -topNormals[i]; } - for (i = sectionLength * 4; i < sectionLength * 6; i++) { - isBottom[i] = 1; + //only get normals for bottom layer that's going to be pushed down + extrudeNormals.set(topNormals, length); //bottom face + extrudeNormals.set(topNormals, length * 4); //bottom wall positions + extrudeNormals.set(topNormals, length * 5); //duplicate bottom wall positions + attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : extrudeNormals + }); + if (!vertexFormat.normal) { + attributes.normal = undefined; } } - attributes.isBottom = new GeometryAttribute({ - componentDatatype : ComponentDatatype.UNSIGNED_BYTE, - componentsPerAttribute : 1, - values : isBottom - }); - - length /= 3; var i; var iLength = indices.length; - var twoLength = length + length; - var newIndices = IndexDatatype.createTypedArray(newPositions.length / 3, iLength * 2 + twoLength * 3); + var twoSize = size + size; + var newIndices = IndexDatatype.createTypedArray(newPositions.length / 3, iLength * 2 + twoSize * 3); newIndices.set(indices); var index = iLength; for (i = 0; i < iLength; i += 3) { // bottom indices var v0 = indices[i]; var v1 = indices[i + 1]; var v2 = indices[i + 2]; - newIndices[index++] = v2 + length; - newIndices[index++] = v1 + length; - newIndices[index++] = v0 + length; + newIndices[index++] = v2 + size; + newIndices[index++] = v1 + size; + newIndices[index++] = v0 + size; } - attributes = extrudedAttributes(attributes, vertexFormat); var UL, LL, UR, LR; - for (i = 0; i < twoLength; i += 2) { //wall indices - UL = i + twoLength; - LL = UL + twoLength; + for (i = 0; i < twoSize; i += 2) { //wall indices + UL = i + twoSize; + LL = UL + twoSize; UR = UL + 1; LR = LL + 1; newIndices[index++] = UL; @@ -813,6 +815,7 @@ define([ this._extrudedHeight = defaultValue(options.extrudedHeight, this._height); this._cornerType = defaultValue(options.cornerType, CornerType.ROUNDED); this._granularity = defaultValue(options.granularity, CesiumMath.RADIANS_PER_DEGREE); + this._shadowVolume = defaultValue(options.shadowVolume, false); this._workerName = 'createCorridorGeometry'; this._rectangle = computeRectangle(positions, this._ellipsoid, width, this._cornerType); @@ -820,7 +823,7 @@ define([ * The number of elements used to pack the object into an array. * @type {Number} */ - this.packedLength = 1 + positions.length * Cartesian3.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 5; + this.packedLength = 1 + positions.length * Cartesian3.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 6; } /** @@ -865,7 +868,8 @@ define([ array[startingIndex++] = value._height; array[startingIndex++] = value._extrudedHeight; array[startingIndex++] = value._cornerType; - array[startingIndex] = value._granularity; + array[startingIndex++] = value._granularity; + array[startingIndex] = value._shadowVolume ? 1.0 : 0.0; return array; }; @@ -881,7 +885,8 @@ define([ height : undefined, extrudedHeight : undefined, cornerType : undefined, - granularity : undefined + granularity : undefined, + shadowVolume: undefined }; /** @@ -921,7 +926,8 @@ define([ var height = array[startingIndex++]; var extrudedHeight = array[startingIndex++]; var cornerType = array[startingIndex++]; - var granularity = array[startingIndex]; + var granularity = array[startingIndex++]; + var shadowVolume = array[startingIndex] === 1.0; if (!defined(result)) { scratchOptions.positions = positions; @@ -930,6 +936,7 @@ define([ scratchOptions.extrudedHeight = extrudedHeight; scratchOptions.cornerType = cornerType; scratchOptions.granularity = granularity; + scratchOptions.shadowVolume = shadowVolume; return new CorridorGeometry(scratchOptions); } @@ -942,6 +949,7 @@ define([ result._cornerType = cornerType; result._granularity = granularity; result._rectangle = Rectangle.clone(rectangle); + result._shadowVolume = shadowVolume; return result; }; @@ -982,6 +990,7 @@ define([ height = h; params.height = height; params.extrudedHeight = extrudedHeight; + params.shadowVolume = corridorGeometry._shadowVolume; attr = computePositionsExtruded(params, vertexFormat); } else { var computedPositions = CorridorGeometryLibrary.computePositions(params); @@ -1020,7 +1029,8 @@ define([ granularity : granularity, extrudedHeight : minHeight, height : maxHeight, - vertexFormat : VertexFormat.POSITION_ONLY + vertexFormat : VertexFormat.POSITION_ONLY, + shadowVolume: true }); }; diff --git a/Source/Core/EllipseGeometry.js b/Source/Core/EllipseGeometry.js index bab539441f9a..3020da7a2cc0 100644 --- a/Source/Core/EllipseGeometry.js +++ b/Source/Core/EllipseGeometry.js @@ -81,12 +81,15 @@ define([ var ellipsoid = options.ellipsoid; var stRotation = options.stRotation; var size = (extrude) ? positions.length / 3 * 2 : positions.length / 3; + var shadowVolume = options.shadowVolume; var textureCoordinates = (vertexFormat.st) ? new Float32Array(size * 2) : undefined; var normals = (vertexFormat.normal) ? new Float32Array(size * 3) : undefined; var tangents = (vertexFormat.tangent) ? new Float32Array(size * 3) : undefined; var binormals = (vertexFormat.binormal) ? new Float32Array(size * 3) : undefined; + var extrudeNormals = (shadowVolume) ? new Float32Array(size * 3) : undefined; + var textureCoordIndex = 0; // Raise positions to a height above the ellipsoid and compute the @@ -136,44 +139,52 @@ define([ textureCoordinates[textureCoordIndex++] = texCoordScratch.y; } - normal = ellipsoid.geodeticSurfaceNormal(position, normal); + if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal || shadowVolume) { + normal = ellipsoid.geodeticSurfaceNormal(position, normal); - if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal) { - if (vertexFormat.tangent || vertexFormat.binormal) { - tangent = Cartesian3.normalize(Cartesian3.cross(Cartesian3.UNIT_Z, normal, tangent), tangent); - Matrix3.multiplyByVector(textureMatrix, tangent, tangent); + if (shadowVolume) { + extrudeNormals[i + bottomOffset] = -normal.x; + extrudeNormals[i1 + bottomOffset] = -normal.y; + extrudeNormals[i2 + bottomOffset] = -normal.z; } - if (vertexFormat.normal) { - normals[i] = normal.x; - normals[i1] = normal.y; - normals[i2] = normal.z; - if (extrude) { - normals[i + bottomOffset] = -normal.x; - normals[i1 + bottomOffset] = -normal.y; - normals[i2 + bottomOffset] = -normal.z; + + if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal) { + if (vertexFormat.tangent || vertexFormat.binormal) { + tangent = Cartesian3.normalize(Cartesian3.cross(Cartesian3.UNIT_Z, normal, tangent), tangent); + Matrix3.multiplyByVector(textureMatrix, tangent, tangent); + } + if (vertexFormat.normal) { + normals[i] = normal.x; + normals[i1] = normal.y; + normals[i2] = normal.z; + if (extrude) { + normals[i + bottomOffset] = -normal.x; + normals[i1 + bottomOffset] = -normal.y; + normals[i2 + bottomOffset] = -normal.z; + } } - } - if (vertexFormat.tangent) { - tangents[i] = tangent.x; - tangents[i1] = tangent.y; - tangents[i2] = tangent.z; - if (extrude) { - tangents[i + bottomOffset] = -tangent.x; - tangents[i1 + bottomOffset] = -tangent.y; - tangents[i2 + bottomOffset] = -tangent.z; + if (vertexFormat.tangent) { + tangents[i] = tangent.x; + tangents[i1] = tangent.y; + tangents[i2] = tangent.z; + if (extrude) { + tangents[i + bottomOffset] = -tangent.x; + tangents[i1 + bottomOffset] = -tangent.y; + tangents[i2 + bottomOffset] = -tangent.z; + } } - } - if (vertexFormat.binormal) { - binormal = Cartesian3.normalize(Cartesian3.cross(normal, tangent, binormal), binormal); - binormals[i] = binormal.x; - binormals[i1] = binormal.y; - binormals[i2] = binormal.z; - if (extrude) { - binormals[i + bottomOffset] = binormal.x; - binormals[i1 + bottomOffset] = binormal.y; - binormals[i2 + bottomOffset] = binormal.z; + if (vertexFormat.binormal) { + binormal = Cartesian3.normalize(Cartesian3.cross(normal, tangent, binormal), binormal); + binormals[i] = binormal.x; + binormals[i1] = binormal.y; + binormals[i2] = binormal.z; + if (extrude) { + binormals[i + bottomOffset] = binormal.x; + binormals[i1 + bottomOffset] = binormal.y; + binormals[i2 + bottomOffset] = binormal.z; + } } } } @@ -230,20 +241,11 @@ define([ }); } - if (extrude) { - var isBottom = new Uint8Array(size); - if (typeof Uint8Array.prototype.fill === 'function') { - isBottom.fill(1, size / 2); - } else { //IE doesn't support fill - for (i = size / 2; i < size; i++) { - isBottom[i] = 1; - } - } - - attributes.isBottom = new GeometryAttribute({ - componentDatatype : ComponentDatatype.UNSIGNED_BYTE, - componentsPerAttribute : 1, - values : isBottom + if (shadowVolume) { + attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : extrudeNormals }); } return attributes; @@ -545,21 +547,6 @@ define([ }); } - var isBottom = new Uint8Array(size); - if (typeof Uint8Array.prototype.fill === 'function') { - isBottom.fill(1, size / 2); - } else { //IE doesn't support fill - for (i = size / 2; i < size; i++) { - isBottom[i] = 1; - } - } - - attributes.isBottom = new GeometryAttribute({ - componentDatatype : ComponentDatatype.UNSIGNED_BYTE, - componentsPerAttribute : 1, - values : isBottom - }); - return attributes; } @@ -623,6 +610,13 @@ define([ }); var wallAttributes = computeWallAttributes(outerPositions, options); + if (options.shadowVolume) { + wallAttributes.extrudeDirection = new GeometryAttribute({ + componentDatatype: ComponentDatatype.FLOAT, + componentsPerAttribute: 3, + values: topBottomAttributes.extrudeDirection.slice() + }); + } indices = computeWallIndices(outerPositions); var wallIndices = IndexDatatype.createTypedArray(outerPositions.length * 2 / 3, indices); @@ -757,6 +751,7 @@ define([ this._vertexFormat = VertexFormat.clone(vertexFormat); this._extrudedHeight = defaultValue(extrudedHeight, height); this._extrude = extrude; + this._shadowVolume = defaultValue(options.shadowVolume, false); this._workerName = 'createEllipseGeometry'; this._rectangle = computeRectangle(this._center, this._ellipsoid, semiMajorAxis, semiMinorAxis, this._rotation); @@ -766,7 +761,7 @@ define([ * The number of elements used to pack the object into an array. * @type {Number} */ - EllipseGeometry.packedLength = Cartesian3.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 8; + EllipseGeometry.packedLength = Cartesian3.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 9; /** * Stores the provided instance into the provided array. @@ -808,7 +803,8 @@ define([ array[startingIndex++] = value._height; array[startingIndex++] = value._granularity; array[startingIndex++] = value._extrudedHeight; - array[startingIndex] = value._extrude ? 1.0 : 0.0; + array[startingIndex++] = value._extrude ? 1.0 : 0.0; + array[startingIndex] = value._shadowVolume ? 1.0 : 0.0; return array; }; @@ -827,7 +823,8 @@ define([ stRotation : undefined, height : undefined, granularity : undefined, - extrudedHeight : undefined + extrudedHeight : undefined, + shadowVolume: undefined }; /** @@ -866,7 +863,8 @@ define([ var height = array[startingIndex++]; var granularity = array[startingIndex++]; var extrudedHeight = array[startingIndex++]; - var extrude = array[startingIndex] === 1.0; + var extrude = array[startingIndex++] === 1.0; + var shadowVolume = array[startingIndex] === 1.0; if (!defined(result)) { scratchOptions.height = height; @@ -876,6 +874,7 @@ define([ scratchOptions.rotation = rotation; scratchOptions.semiMajorAxis = semiMajorAxis; scratchOptions.semiMinorAxis = semiMinorAxis; + scratchOptions.shadowVolume = shadowVolume; return new EllipseGeometry(scratchOptions); } @@ -890,6 +889,7 @@ define([ result._granularity = granularity; result._extrudedHeight = extrudedHeight; result._extrude = extrude; + result._shadowVoluem = shadowVolume; result._rectangle = Rectangle.clone(rectangle); return result; @@ -923,6 +923,7 @@ define([ if (ellipseGeometry._extrude) { options.extrudedHeight = Math.min(ellipseGeometry._extrudedHeight, ellipseGeometry._height); options.height = Math.max(ellipseGeometry._extrudedHeight, ellipseGeometry._height); + options.shadowVolume = ellipseGeometry._shadowVolume; geometry = computeExtrudedEllipse(options); } else { geometry = computeEllipse(options); @@ -956,7 +957,8 @@ define([ granularity : granularity, extrudedHeight : minHeight, height : maxHeight, - vertexFormat : VertexFormat.POSITION_ONLY + vertexFormat : VertexFormat.POSITION_ONLY, + shadowVolume: true }); }; diff --git a/Source/Core/PolygonGeometry.js b/Source/Core/PolygonGeometry.js index 73d76d2fcfcb..d1bb0a542c4b 100644 --- a/Source/Core/PolygonGeometry.js +++ b/Source/Core/PolygonGeometry.js @@ -134,6 +134,7 @@ define([ var top = options.top || wall; var bottom = options.bottom || wall; var perPositionHeight = options.perPositionHeight; + var shadowVolume = options.shadowVolume; var origin = appendTextureCoordinatesOrigin; origin.x = boundingRectangle.x; @@ -153,6 +154,7 @@ define([ } var tangents = vertexFormat.tangent ? new Float32Array(length) : undefined; var binormals = vertexFormat.binormal ? new Float32Array(length) : undefined; + var extrudeNormals = shadowVolume ? new Float32Array(length) : undefined; var textureCoordIndex = 0; var attrIndex = 0; @@ -198,7 +200,7 @@ define([ textureCoordIndex += 2; } - if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal) { + if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal || shadowVolume) { var attrIndex1 = attrIndex + 1; var attrIndex2 = attrIndex + 2; @@ -266,6 +268,15 @@ define([ } } + if (shadowVolume) { + if (wall) { + normal = ellipsoid.geodeticSurfaceNormal(position, normal); + } + extrudeNormals[attrIndex + bottomOffset] = -normal.x; + extrudeNormals[attrIndex1 + bottomOffset] = -normal.y; + extrudeNormals[attrIndex2 + bottomOffset] = -normal.z; + } + if (vertexFormat.tangent) { if (options.wall) { tangents[attrIndex + bottomOffset] = tangent.x; @@ -343,6 +354,14 @@ define([ values : binormals }); } + + if (shadowVolume) { + geometry.attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : extrudeNormals + }); + } } return geometry; } @@ -363,17 +382,8 @@ define([ var numPositions; var newIndices; - var isBottom; if (closeTop && closeBottom) { var topBottomPositions = edgePoints.concat(edgePoints); - isBottom = new Uint8Array(topBottomPositions.length / 3); - if (typeof Uint8Array.prototype.fill === 'function') { - isBottom.fill(1, isBottom.length / 2); - } else { //IE doesn't support fill - for (i = isBottom.length / 2; i < isBottom.length; i++) { - isBottom[i] = 1; - } - } numPositions = topBottomPositions.length / 3; @@ -399,11 +409,6 @@ define([ topGeo.attributes.normal.values = new Float32Array(topBottomPositions.length); topGeo.attributes.normal.values.set(normals); } - topGeo.attributes.isBottom = new GeometryAttribute({ - componentDatatype : ComponentDatatype.UNSIGNED_BYTE, - componentsPerAttribute : 1, - values : isBottom - }); topGeo.indices = newIndices; } else if (closeBottom) { numPositions = edgePoints.length / 3; @@ -593,6 +598,7 @@ define([ this._closeBottom = defaultValue(options.closeBottom, true); this._polygonHierarchy = polygonHierarchy; this._perPositionHeight = perPositionHeight; + this._shadowVolume = defaultValue(options.shadowVolume, false); this._workerName = 'createPolygonGeometry'; var positions = polygonHierarchy.positions; @@ -606,7 +612,7 @@ define([ * The number of elements used to pack the object into an array. * @type {Number} */ - this.packedLength = PolygonGeometryLibrary.computeHierarchyPackedLength(polygonHierarchy) + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 9; + this.packedLength = PolygonGeometryLibrary.computeHierarchyPackedLength(polygonHierarchy) + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 10; } /** @@ -707,6 +713,7 @@ define([ array[startingIndex++] = value._perPositionHeight ? 1.0 : 0.0; array[startingIndex++] = value._closeTop ? 1.0 : 0.0; array[startingIndex++] = value._closeBottom ? 1.0 : 0.0; + array[startingIndex++] = value._shadowVolume ? 1.0 : 0.0; array[startingIndex] = value.packedLength; return array; @@ -758,6 +765,7 @@ define([ var perPositionHeight = array[startingIndex++] === 1.0; var closeTop = array[startingIndex++] === 1.0; var closeBottom = array[startingIndex++] === 1.0; + var shadowVolume = array[startingIndex++] === 1.0; var packedLength = array[startingIndex]; if (!defined(result)) { @@ -776,6 +784,7 @@ define([ result._closeTop = closeTop; result._closeBottom = closeBottom; result._rectangle = Rectangle.clone(rectangle); + result._shadowVolume = shadowVolume; result.packedLength = packedLength; return result; }; @@ -838,6 +847,7 @@ define([ if (extrude) { options.top = closeTop; options.bottom = closeBottom; + options.shadowVolume = polygonGeometry._shadowVolume; for (i = 0; i < polygons.length; i++) { geometry = createGeometryFromPositionsExtruded(ellipsoid, polygons[i], granularity, hierarchy[i], perPositionHeight, closeTop, closeBottom, vertexFormat); @@ -918,7 +928,8 @@ define([ perPositionHeight : false, extrudedHeight : minHeight, height : maxHeight, - vertexFormat : VertexFormat.POSITION_ONLY + vertexFormat : VertexFormat.POSITION_ONLY, + shadowVolume: true }); }; diff --git a/Source/Core/PolygonGeometryLibrary.js b/Source/Core/PolygonGeometryLibrary.js index 603cb215c0f3..12bb78deec5c 100644 --- a/Source/Core/PolygonGeometryLibrary.js +++ b/Source/Core/PolygonGeometryLibrary.js @@ -354,7 +354,6 @@ define([ var length = positions.length; var index = 0; - var isBottom; if (!perPositionHeight) { var minDistance = CesiumMath.chordLength(granularity, ellipsoid.maximumRadius); @@ -411,15 +410,6 @@ define([ } } - isBottom = new Uint8Array(positionLength * 2); - if (typeof Uint8Array.prototype.fill === 'function') { - isBottom.fill(1, positionLength); - } else { //IE doesn't support fill - for (i = positionLength; i < positionLength * 2; i++) { - isBottom[i] = 1; - } - } - length = edgePositions.length; var indices = IndexDatatype.createTypedArray(length / 3, length - positions.length * 6); var edgeIndex = 0; @@ -445,7 +435,7 @@ define([ indices[edgeIndex++] = LR; } - var geometry = new Geometry({ + return new Geometry({ attributes : new GeometryAttributes({ position : new GeometryAttribute({ componentDatatype : ComponentDatatype.DOUBLE, @@ -456,13 +446,6 @@ define([ indices : indices, primitiveType : PrimitiveType.TRIANGLES }); - geometry.attributes.isBottom = new GeometryAttribute({ - componentDatatype : ComponentDatatype.UNSIGNED_BYTE, - componentsPerAttribute : 1, - values : isBottom - }); - - return geometry; }; return PolygonGeometryLibrary; diff --git a/Source/Core/RectangleGeometry.js b/Source/Core/RectangleGeometry.js index 57f07a67f45b..8b4d18e94fbf 100644 --- a/Source/Core/RectangleGeometry.js +++ b/Source/Core/RectangleGeometry.js @@ -380,7 +380,9 @@ define([ } if (shadowVolume) { topNormals = topBottomGeo.attributes.normal.values; - topBottomGeo.attributes.normal = undefined; + if (!vertexFormat.normal) { + topBottomGeo.attributes.normal = undefined; + } var extrudeNormals = new Float32Array(newLength); for (i = 0; i < length; i ++) { topNormals[i] = -topNormals[i]; @@ -655,17 +657,6 @@ define([ options = defaultValue(options, defaultValue.EMPTY_OBJECT); var rectangle = options.rectangle; - var granularity = defaultValue(options.granularity, CesiumMath.RADIANS_PER_DEGREE); - var ellipsoid = defaultValue(options.ellipsoid, Ellipsoid.WGS84); - var surfaceHeight = defaultValue(options.height, 0.0); - var rotation = defaultValue(options.rotation, 0.0); - var stRotation = defaultValue(options.stRotation, 0.0); - var vertexFormat = defaultValue(options.vertexFormat, VertexFormat.DEFAULT); - var extrudedHeight = options.extrudedHeight; - var extrude = defined(extrudedHeight); - var closeTop = defaultValue(options.closeTop, true); - var closeBottom = defaultValue(options.closeBottom, true); - var shadowVolume = defaultValue(options.shadowVolume, false); //>>includeStart('debug', pragmas.debug); if (!defined(rectangle)) { @@ -678,19 +669,19 @@ define([ //>>includeEnd('debug'); this._rectangle = rectangle; - this._granularity = granularity; - this._ellipsoid = Ellipsoid.clone(ellipsoid); - this._surfaceHeight = surfaceHeight; - this._rotation = rotation; - this._stRotation = stRotation; - this._vertexFormat = VertexFormat.clone(vertexFormat); - this._extrudedHeight = defaultValue(extrudedHeight, 0.0); - this._extrude = extrude; - this._closeTop = closeTop; - this._closeBottom = closeBottom; + this._granularity = defaultValue(options.granularity, CesiumMath.RADIANS_PER_DEGREE); + this._ellipsoid = Ellipsoid.clone(defaultValue(options.ellipsoid, Ellipsoid.WGS84)); + this._surfaceHeight = defaultValue(options.height, 0.0); + this._rotation = defaultValue(options.rotation, 0.0); + this._stRotation = defaultValue(options.stRotation, 0.0); + this._vertexFormat = VertexFormat.clone(defaultValue(options.vertexFormat, VertexFormat.DEFAULT)); + this._extrudedHeight = defaultValue(options.extrudedHeight, 0.0); + this._extrude = defined(options.extrudedHeight); + this._closeTop = defaultValue(options.closeTop, true); + this._closeBottom = defaultValue(options.closeBottom, true); + this._shadowVolume = defaultValue(options.shadowVolume, false); this._workerName = 'createRectangleGeometry'; this._rotatedRectangle = computeRectangle(this._rectangle, this._ellipsoid, rotation); - this._shadowVolume = shadowVolume; } /** @@ -741,7 +732,7 @@ define([ array[startingIndex++] = value._extrude ? 1.0 : 0.0; array[startingIndex++] = value._closeTop ? 1.0 : 0.0; array[startingIndex++] = value._closeBottom ? 1.0 : 0.0; - array[startingIndex] = value._shadowVolume? 1.0 : 0.0; + array[startingIndex] = value._shadowVolume ? 1.0 : 0.0; return array; }; @@ -879,12 +870,12 @@ define([ options.stRotation = stRotation; options.tangentRotationMatrix = tangentRotationMatrix; options.size = options.width * options.height; - options.shadowVolume = rectangleGeometry._shadowVolume; var geometry; var boundingSphere; rectangle = rectangleGeometry._rectangle; if (extrude) { + options.shadowVolume = rectangleGeometry._shadowVolume; geometry = constructExtrudedRectangle(options); var topBS = BoundingSphere.fromRectangle3D(rectangle, ellipsoid, surfaceHeight, topBoundingSphere); var bottomBS = BoundingSphere.fromRectangle3D(rectangle, ellipsoid, extrudedHeight, bottomBoundingSphere); From 7bb29fe97aa0f940ad1c3ddc6503357d9582f7f7 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 12 Dec 2016 17:04:57 -0500 Subject: [PATCH 200/396] Throw error when setting an inherited property --- Source/Scene/Cesium3DTileBatchTable.js | 5 +++++ Specs/Scene/Cesium3DTileBatchTableSpec.js | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index 4ba007cf51da..dd3f289c5e89 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -612,6 +612,11 @@ define([ var indexInClass = hierarchy.classIndexes[instanceIndex]; var propertyValues = instanceClass.instances[name]; if (defined(propertyValues)) { + //>>includeStart('debug', pragmas.debug); + if (instanceIndex !== batchId) { + throw new DeveloperError('Inherited property "' + name + '" is read-only.'); + } + //>>includeEnd('debug'); if (defined(propertyValues.typedArray)) { setBinaryProperty(propertyValues, indexInClass, value); } else { diff --git a/Specs/Scene/Cesium3DTileBatchTableSpec.js b/Specs/Scene/Cesium3DTileBatchTableSpec.js index b09ebe910e3b..96bb91520b4b 100644 --- a/Specs/Scene/Cesium3DTileBatchTableSpec.js +++ b/Specs/Scene/Cesium3DTileBatchTableSpec.js @@ -780,15 +780,15 @@ defineSuite([ doorFeature.setProperty('height', 10.0); expect(doorFeature.getProperty('height')).toBe(10.0); - // Sets class property. + // Sets class property doorFeature.setProperty('door_name', 'new_door'); expect(doorFeature.getProperty('door_name')).toBe('new_door'); expect(roofFeature.getProperty('door_name')).toBeUndefined(); - // Sets inherited property. Check that both door and roof respond to the property change. - doorFeature.setProperty('building_name', 'new_building'); - expect(doorFeature.getProperty('building_name')).toBe('new_building'); - expect(roofFeature.getProperty('building_name')).toBe('new_building'); + // Throws error when setting inherited property + expect(function() { + doorFeature.setProperty('building_name', 'new_building'); + }).toThrowDeveloperError(); // Check properties when there is no hierarchy batchTable._batchTableHierarchy = undefined; From 75cdf2f8568578af4365ab5fced9ba8baf4a7fb4 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 12 Dec 2016 17:10:58 -0500 Subject: [PATCH 201/396] Add comment for scratchVisited --- Source/Scene/Cesium3DTileBatchTable.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index dd3f289c5e89..6fc8b90cf00e 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -491,8 +491,9 @@ define([ } } - var scratchStack = []; + // The size of this array equals the maximum instance count among all loaded tiles, which has the potential to be large. var scratchVisited = []; + var scratchStack = []; var marker = 0; function traverseHierarchyMultipleParents(hierarchy, instanceIndex, endConditionCallback) { var classIds = hierarchy.classIds; From e187e670137ddae885b838580dc64d1491d50fb8 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 12 Dec 2016 19:55:53 -0500 Subject: [PATCH 202/396] Use depth-stencil for FXAA --- Source/Renderer/Context.js | 1 + Source/Scene/FXAA.js | 32 ++++++++++++++++---------------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Source/Renderer/Context.js b/Source/Renderer/Context.js index ca41b53f505f..4a8eed3a7a64 100644 --- a/Source/Renderer/Context.js +++ b/Source/Renderer/Context.js @@ -193,6 +193,7 @@ define([ // Override select WebGL defaults webglOptions.alpha = defaultValue(webglOptions.alpha, false); // WebGL default is true + webglOptions.stencil = defaultValue(webglOptions.stencil, true); // WebGL default is false var defaultToWebgl2 = false; var webgl2Supported = (typeof WebGL2RenderingContext !== 'undefined'); diff --git a/Source/Scene/FXAA.js b/Source/Scene/FXAA.js index 57bf02b8f9cd..42c1c4b4a7da 100644 --- a/Source/Scene/FXAA.js +++ b/Source/Scene/FXAA.js @@ -36,8 +36,8 @@ define([ */ function FXAA(context) { this._texture = undefined; - this._depthTexture = undefined; - this._depthRenderbuffer = undefined; + this._depthStencilTexture = undefined; + this._depthStencilRenderbuffer = undefined; this._fbo = undefined; this._command = undefined; @@ -55,13 +55,13 @@ define([ function destroyResources(fxaa) { fxaa._fbo = fxaa._fbo && fxaa._fbo.destroy(); fxaa._texture = fxaa._texture && fxaa._texture.destroy(); - fxaa._depthTexture = fxaa._depthTexture && fxaa._depthTexture.destroy(); - fxaa._depthRenderbuffer = fxaa._depthRenderbuffer && fxaa._depthRenderbuffer.destroy(); + fxaa._depthStencilTexture = fxaa._depthStencilTexture && fxaa._depthStencilTexture.destroy(); + fxaa._depthStencilRenderbuffer = fxaa._depthStencilRenderbuffer && fxaa._depthStencilRenderbuffer.destroy(); fxaa._fbo = undefined; fxaa._texture = undefined; - fxaa._depthTexture = undefined; - fxaa._depthRenderbuffer = undefined; + fxaa._depthStencilTexture = undefined; + fxaa._depthStencilRenderbuffer = undefined; if (defined(fxaa._command)) { fxaa._command.shaderProgram = fxaa._command.shaderProgram && fxaa._command.shaderProgram.destroy(); @@ -77,8 +77,8 @@ define([ var textureChanged = !defined(fxaaTexture) || fxaaTexture.width !== width || fxaaTexture.height !== height; if (textureChanged) { this._texture = this._texture && this._texture.destroy(); - this._depthTexture = this._depthTexture && this._depthTexture.destroy(); - this._depthRenderbuffer = this._depthRenderbuffer && this._depthRenderbuffer.destroy(); + this._depthStencilTexture = this._depthStencilTexture && this._depthStencilTexture.destroy(); + this._depthStencilRenderbuffer = this._depthStencilRenderbuffer && this._depthStencilRenderbuffer.destroy(); this._texture = new Texture({ context : context, @@ -88,20 +88,20 @@ define([ pixelDatatype : PixelDatatype.UNSIGNED_BYTE }); - if (context.depthTexture) { - this._depthTexture = new Texture({ + if (context.depthStencilTexture) { + this._depthStencilTexture = new Texture({ context : context, width : width, height : height, - pixelFormat : PixelFormat.DEPTH_COMPONENT, - pixelDatatype : PixelDatatype.UNSIGNED_SHORT + pixelFormat : PixelFormat.DEPTH_STENCIL, + pixelDatatype : PixelDatatype.UNSIGNED_INT_24_8 }); } else { - this._depthRenderbuffer = new Renderbuffer({ + this._depthStencilRenderbuffer = new Renderbuffer({ context : context, width : width, height : height, - format : RenderbufferFormat.DEPTH_COMPONENT16 + format : RenderbufferFormat.DEPTH_STENCIL }); } } @@ -112,8 +112,8 @@ define([ this._fbo = new Framebuffer({ context : context, colorTextures : [this._texture], - depthTexture : this._depthTexture, - depthRenderbuffer : this._depthRenderbuffer, + depthStencilTexture : this._depthStencilTexture, + depthStencilRenderbuffer : this._depthStencilRenderbuffer, destroyAttachments : false }); } From cce88b6b298e49a933375fa5b7cb3d9cf17c1745 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 12 Dec 2016 20:18:52 -0500 Subject: [PATCH 203/396] Updated CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 1d754f687786..73a359315050 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,7 @@ Change Log * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) * Fixed `Rectangle.union` to correctly account for rectangles that cross the IDL [#4732](https://github.com/AnalyticalGraphicsInc/cesium/pull/4732). * Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) +* Fixed an bug that caused `GroundPrimitive` to render incorrectly. [#4747](https://github.com/AnalyticalGraphicsInc/cesium/pull/4747) ### 1.28 - 2016-12-01 From 077e225ff1f9e50c1874fcbf1ab69bc7d2f4c095 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 12 Dec 2016 14:23:41 -0500 Subject: [PATCH 204/396] Added tests --- Source/Scene/Model.js | 4 +- Specs/Scene/ModelSpec.js | 130 ++++++++++++++++++++++++++++++++++++++- Specs/createScene.js | 1 + 3 files changed, 132 insertions(+), 3 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 7fe5ccc1dd75..e620037690f2 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -3614,7 +3614,7 @@ define([ 'void main() \n' + '{ \n' + ' gltf_silhouette_main(); \n' + - ' vec3 n = normalize(czm_normal * ' + normalAttributeName + '); \n' + + ' vec3 n = normalize(czm_normal3D * ' + normalAttributeName + '); \n' + ' n.x *= czm_projection[0][0]; \n' + ' n.y *= czm_projection[1][1]; \n' + ' vec4 clip = gl_Position; \n' + @@ -3647,7 +3647,7 @@ define([ for (var i = 0; i < length; ++i) { var nodeCommand = nodeCommands[i]; var command = nodeCommand.command; - if (command.renderState.blending.enabled) { + if (command.pass === Pass.TRANSLUCENT) { return true; } } diff --git a/Specs/Scene/ModelSpec.js b/Specs/Scene/ModelSpec.js index 5c484eee2b8d..5c56d9c4c468 100644 --- a/Specs/Scene/ModelSpec.js +++ b/Specs/Scene/ModelSpec.js @@ -28,6 +28,7 @@ defineSuite([ 'Renderer/WebGLConstants', 'Scene/ColorBlendMode', 'Scene/HeightReference', + 'Scene/Pass', 'Scene/ModelAnimationLoop', 'Specs/createScene', 'Specs/pollToPromise', @@ -61,6 +62,7 @@ defineSuite([ WebGLConstants, ColorBlendMode, HeightReference, + Pass, ModelAnimationLoop, createScene, pollToPromise, @@ -237,7 +239,9 @@ defineSuite([ expect(texturedBoxModel.distanceDisplayCondition).toBeUndefined(); expect(texturedBoxModel.silhouetteColor).toEqual(Color.RED); expect(texturedBoxModel.silhouetteSize).toEqual(0.0); - + expect(texturedBoxModel.color).toEqual(Color.WHITE); + expect(texturedBoxModel.colorBlendMode).toEqual(ColorBlendMode.HIGHLIGHT); + expect(texturedBoxModel.colorBlendAmount).toEqual(0.5); }); it('renders', function() { @@ -1934,6 +1938,130 @@ defineSuite([ }); }); + it('silhouetteSupported', function() { + expect(Model.silhouetteSupported(scene)).toBe(true); + scene.context._stencilBits = 0; + expect(Model.silhouetteSupported(scene)).toBe(false); + scene.context._stencilBits = 8; + }); + + it('renders with a silhouette', function() { + return loadModel(boxUrl).then(function(model) { + model.show = true; + model.zoomTo(); + + var commands = scene.frameState.commandList; + + // No silhouette + model.silhouetteSize = 0.0; + scene.renderForSpecs(); + expect(commands.length).toBe(1); + expect(commands[0].renderState.stencilTest.enabled).toBe(false); + expect(commands[0].pass).toBe(Pass.OPAQUE); + + // Opaque silhouette + model.silhouetteSize = 1.0; + scene.renderForSpecs(); + expect(commands.length).toBe(2); + expect(commands[0].renderState.stencilTest.enabled).toBe(true); + expect(commands[0].pass).toBe(Pass.OPAQUE); + expect(commands[1].renderState.stencilTest.enabled).toBe(true); + expect(commands[1].pass).toBe(Pass.OPAQUE); + + // Translucent silhouette + model.silhouetteColor = Color.fromAlpha(Color.GREEN, 0.5); + scene.renderForSpecs(); + expect(commands.length).toBe(2); + expect(commands[0].renderState.stencilTest.enabled).toBe(true); + expect(commands[0].pass).toBe(Pass.OPAQUE); + expect(commands[1].renderState.stencilTest.enabled).toBe(true); + expect(commands[1].pass).toBe(Pass.TRANSLUCENT); + + // Invisible silhouette. The model is rendered normally. + model.silhouetteColor = Color.fromAlpha(Color.GREEN, 0.0); + scene.renderForSpecs(); + expect(commands.length).toBe(1); + expect(commands[0].renderState.stencilTest.enabled).toBe(false); + expect(commands[0].pass).toBe(Pass.OPAQUE); + + // Invisible model with no silhouette. No commands. + model.color = Color.fromAlpha(Color.WHITE, 0.0); + model.silhouetteColor = Color.GREEN; + model.silhouetteSize = 0.0; + scene.renderForSpecs(); + expect(commands.length).toBe(0); + + // Invisible model with silhouette. Model command is stencil-only. + model.silhouetteSize = 1.0; + scene.renderForSpecs(); + expect(commands.length).toBe(2); + expect(commands[0].renderState.colorMask).toEqual({ + red : false, + green : false, + blue : false, + alpha : false + }); + expect(commands[0].renderState.depthMask).toEqual(false); + expect(commands[0].renderState.stencilTest.enabled).toBe(true); + expect(commands[0].pass).toBe(Pass.OPAQUE); + expect(commands[1].renderState.stencilTest.enabled).toBe(true); + expect(commands[1].pass).toBe(Pass.OPAQUE); + + // Translucent model with opaque silhouette. Silhouette is placed in the translucent pass. + model.color = Color.fromAlpha(Color.WHITE, 0.5); + scene.renderForSpecs(); + expect(commands.length).toBe(2); + expect(commands[0].renderState.stencilTest.enabled).toBe(true); + expect(commands[0].pass).toBe(Pass.TRANSLUCENT); + expect(commands[1].renderState.stencilTest.enabled).toBe(true); + expect(commands[1].pass).toBe(Pass.TRANSLUCENT); + + // Model with translucent commands with silhouette + model.color = Color.WHITE; + model._nodeCommands[0].command.pass = Pass.TRANSLUCENT; + scene.renderForSpecs(); + expect(commands.length).toBe(2); + expect(commands[0].renderState.stencilTest.enabled).toBe(true); + expect(commands[0].pass).toBe(Pass.TRANSLUCENT); + expect(commands[1].renderState.stencilTest.enabled).toBe(true); + expect(commands[1].pass).toBe(Pass.TRANSLUCENT); + model._nodeCommands[0].command.pass = Pass.OPAQUE; // Revert change + + // Translucent model with translucent silhouette. + model.color = Color.fromAlpha(Color.WHITE, 0.5); + model.silhouetteColor = Color.fromAlpha(Color.GREEN, 0.5); + scene.renderForSpecs(); + expect(commands.length).toBe(2); + expect(commands[0].renderState.stencilTest.enabled).toBe(true); + expect(commands[0].pass).toBe(Pass.TRANSLUCENT); + expect(commands[1].renderState.stencilTest.enabled).toBe(true); + expect(commands[1].pass).toBe(Pass.TRANSLUCENT); + + model.color = Color.WHITE; + model.silhouetteColor = Color.GREEN; + + // Load a second model + return loadModel(boxUrl).then(function(model) { + model.show = true; + model.silhouetteSize = 1.0; + scene.renderForSpecs(); + expect(commands.length).toBe(4); + expect(commands[0].renderState.stencilTest.enabled).toBe(true); + expect(commands[0].pass).toBe(Pass.OPAQUE); + expect(commands[1].renderState.stencilTest.enabled).toBe(true); + expect(commands[1].pass).toBe(Pass.OPAQUE); + expect(commands[2].renderState.stencilTest.enabled).toBe(true); + expect(commands[2].pass).toBe(Pass.OPAQUE); + expect(commands[3].renderState.stencilTest.enabled).toBe(true); + expect(commands[3].pass).toBe(Pass.OPAQUE); + + var reference1 = commands[0].renderState.stencilTest.reference; + var reference2 = commands[2].renderState.stencilTest.reference; + expect(reference2).toEqual(reference1 + 1); + }); + }); + }); + describe('height referenced model', function() { function createMockGlobe() { var globe = { diff --git a/Specs/createScene.js b/Specs/createScene.js index bbb1d7e7009f..6b070ae6772a 100644 --- a/Specs/createScene.js +++ b/Specs/createScene.js @@ -32,6 +32,7 @@ define([ var contextOptions = options.contextOptions; contextOptions.webgl = defaultValue(contextOptions.webgl, {}); contextOptions.webgl.antialias = defaultValue(contextOptions.webgl.antialias, false); + contextOptions.webgl.stencil = defaultValue(contextOptions.webgl.stencil, true); var scene = new Scene(options); From 23d2fea036f4db558e3158b38ae8560040204595 Mon Sep 17 00:00:00 2001 From: "duvi.fn" Date: Tue, 13 Dec 2016 11:05:50 +0200 Subject: [PATCH 205/396] factor out sqauredAOverSquaredB --- Source/Core/Ellipsoid.js | 4 +++- Specs/Core/EllipsoidSpec.js | 23 +++++++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/Source/Core/Ellipsoid.js b/Source/Core/Ellipsoid.js index 9e14e396e6e6..c4f1db8eb2c5 100644 --- a/Source/Core/Ellipsoid.js +++ b/Source/Core/Ellipsoid.js @@ -57,6 +57,8 @@ define([ ellipsoid._maximumRadius = Math.max(x, y, z); ellipsoid._centerToleranceSquared = CesiumMath.EPSILON1; + + ellipsoid._sqauredAOverSquaredB = ellipsoid.radiiSquared.x / ellipsoid.radiiSquared.z; } /** @@ -641,7 +643,7 @@ define([ buffer = defaultValue(buffer, 0.0); - var sqauredAOverSquaredB = ellipsoid.radiiSquared.x / ellipsoid.radiiSquared.z; + var sqauredAOverSquaredB = ellipsoid._sqauredAOverSquaredB; if (!defined(result)){ result = new Cartesian3(); diff --git a/Specs/Core/EllipsoidSpec.js b/Specs/Core/EllipsoidSpec.js index d09cef50cd19..9c525c4c8a82 100644 --- a/Specs/Core/EllipsoidSpec.js +++ b/Specs/Core/EllipsoidSpec.js @@ -482,7 +482,7 @@ defineSuite([ expect(returnedResult).toBe(undefined); }); - it('getSurfaceNormalIntersectionWithZAxis returns a result that is equal to the value which computed in a different way', function() { + it('getSurfaceNormalIntersectionWithZAxis returns a result that is equal to a value that computed in a different way', function() { var ellipsoid = Ellipsoid.WGS84; var cartographic = Cartographic.fromDegrees(35.23,33.23); var cartesianOnTheSurface = ellipsoid.cartographicToCartesian(cartographic); @@ -498,9 +498,10 @@ defineSuite([ cartesianOnTheSurface = new Cartesian3(ellipsoid.radii.x, 0 , 0); result = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesianOnTheSurface, undefined); expect(result).toEqualEpsilon(Cartesian3.ZERO, CesiumMath.EPSILON8); + }); - it('getSurfaceNormalIntersectionWithZAxis returns a result that when a it\'s used as origin to a vector with the surface normal direction it produces an accurate cartographic', function() { + it('getSurfaceNormalIntersectionWithZAxis returns a result that when a it\'s used as origin for a vector with the surface normal direction it produces an accurate cartographic', function() { var ellipsoid = Ellipsoid.WGS84; var cartographic = Cartographic.fromDegrees(35.23,33.23); var cartesianOnTheSurface = ellipsoid.cartographicToCartesian(cartographic); @@ -514,6 +515,24 @@ defineSuite([ resultCartographic.height = 0.0; expect(resultCartographic).toEqualEpsilon(cartographic, CesiumMath.EPSILON8); + // at the north pole + cartographic = Cartographic.fromDegrees(0,90); + cartesianOnTheSurface = new Cartesian3(0, 0 ,ellipsoid.radii.z); + surfaceNormal = ellipsoid.geodeticSurfaceNormal(cartesianOnTheSurface); + surfaceNormalWithLength = Cartesian3.multiplyByScalar(surfaceNormal, ellipsoid.maximumRadius, new Cartesian3()); + result = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesianOnTheSurface, undefined); + position = Cartesian3.add(result,surfaceNormalWithLength,new Cartesian3()); + resultCartographic = ellipsoid.cartesianToCartographic(position); + resultCartographic.height = 0.0; + expect(resultCartographic).toEqualEpsilon(cartographic, CesiumMath.EPSILON8); + + }); + + it('ellipsoid is initialized with _sqauredAOverSquaredB property', function() { + var ellipsoid = new Ellipsoid(4 , 4 , 3); + + var squaredAOverB = ellipsoid.radiiSquared.x / ellipsoid.radiiSquared.z; + expect(ellipsoid._sqauredAOverSquaredB).toEqual(squaredAOverB); }); createPackableSpecs(Ellipsoid, Ellipsoid.WGS84, [Ellipsoid.WGS84.radii.x, Ellipsoid.WGS84.radii.y, Ellipsoid.WGS84.radii.z]); From dbd917dc9e34ac6aba112c77f25aa75b829c29d1 Mon Sep 17 00:00:00 2001 From: "duvi.fn" Date: Tue, 13 Dec 2016 11:16:45 +0200 Subject: [PATCH 206/396] add _sqauredAOverSquaredB to the Ellipsoid constructor --- Source/Core/Ellipsoid.js | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/Core/Ellipsoid.js b/Source/Core/Ellipsoid.js index c4f1db8eb2c5..8f9ad3117a72 100644 --- a/Source/Core/Ellipsoid.js +++ b/Source/Core/Ellipsoid.js @@ -90,6 +90,7 @@ define([ this._minimumRadius = undefined; this._maximumRadius = undefined; this._centerToleranceSquared = undefined; + this._sqauredAOverSquaredB = undefined; initialize(this, x, y, z); } From 0947e12cb94cf52b8c5435ce5ba4a4eaf978a6d6 Mon Sep 17 00:00:00 2001 From: "duvi.fn" Date: Tue, 13 Dec 2016 11:53:06 +0200 Subject: [PATCH 207/396] add check if radii.z===0 --- Source/Core/Ellipsoid.js | 8 +++++++- Specs/Core/EllipsoidSpec.js | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Source/Core/Ellipsoid.js b/Source/Core/Ellipsoid.js index 8f9ad3117a72..bef67a517e6d 100644 --- a/Source/Core/Ellipsoid.js +++ b/Source/Core/Ellipsoid.js @@ -58,7 +58,9 @@ define([ ellipsoid._centerToleranceSquared = CesiumMath.EPSILON1; - ellipsoid._sqauredAOverSquaredB = ellipsoid.radiiSquared.x / ellipsoid.radiiSquared.z; + if (ellipsoid._radiiSquared.z !== 0){ + ellipsoid._sqauredAOverSquaredB = ellipsoid._radiiSquared.x / ellipsoid._radiiSquared.z; + } } /** @@ -627,6 +629,7 @@ define([ * * @exception {DeveloperError} position is required. * @exception {DeveloperError} Ellipsoid must be an ellipsoid of revolution (radii.x == radii.y). + * @exception {DeveloperError} Ellipsoid.radii.z must be greater than 0. */ Ellipsoid.prototype.getSurfaceNormalIntersectionWithZAxis = function(position, buffer, result) { @@ -640,6 +643,9 @@ define([ if (!CesiumMath.equalsEpsilon(ellipsoid.radii.x, ellipsoid.radii.y, CesiumMath.EPSILON15)) { throw new DeveloperError('Ellipsoid must be an ellipsoid of revolution (radii.x == radii.y)'); } + if (ellipsoid.radii.z === 0) { + throw new DeveloperError('Ellipsoid.radii.z must be greater than 0'); + } //>>includeEnd('debug'); buffer = defaultValue(buffer, 0.0); diff --git a/Specs/Core/EllipsoidSpec.js b/Specs/Core/EllipsoidSpec.js index 9c525c4c8a82..cc95635d46eb 100644 --- a/Specs/Core/EllipsoidSpec.js +++ b/Specs/Core/EllipsoidSpec.js @@ -448,6 +448,14 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('getSurfaceNormalIntersectionWithZAxis throws if the ellipsoid has radii.z === 0', function() { + expect(function() { + var ellipsoid = new Ellipsoid(1,2,0); + var cartesian = new Cartesian3(); + ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesian); + }).toThrowDeveloperError(); + }); + it('getSurfaceNormalIntersectionWithZAxis works without a result parameter', function() { var ellipsoid = Ellipsoid.WGS84; var cartographic = Cartographic.fromDegrees(35.23,33.23); From 1fc73d420ad50ac2274a804ab3350c5a437a1160 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Tue, 13 Dec 2016 11:00:38 +0100 Subject: [PATCH 208/396] Rename LongLatGeocoderService to CartographicGeocoderService --- ...ocoderService.js => CartographicGeocoderService.js} | 10 +++++----- Source/Widgets/Geocoder/GeocoderViewModel.js | 6 +++--- ...rviceSpec.js => CartographicGeocoderServiceSpec.js} | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) rename Source/Core/{LongLatGeocoderService.js => CartographicGeocoderService.js} (84%) rename Specs/Core/{LongLatGeocoderServiceSpec.js => CartographicGeocoderServiceSpec.js} (91%) diff --git a/Source/Core/LongLatGeocoderService.js b/Source/Core/CartographicGeocoderService.js similarity index 84% rename from Source/Core/LongLatGeocoderService.js rename to Source/Core/CartographicGeocoderService.js index be29f6f890be..efa0961dbb38 100644 --- a/Source/Core/LongLatGeocoderService.js +++ b/Source/Core/CartographicGeocoderService.js @@ -12,10 +12,10 @@ define([ /** * Provides geocoding through Bing Maps. * - * @alias LongLatGeocoderService + * @alias CartographicGeocoderService * @constructor */ - function LongLatGeocoderService() { + function CartographicGeocoderService() { this.autoComplete = false; } @@ -23,7 +23,7 @@ define([ * This service completes geocoding synchronously and therefore does not * need to handle canceled requests that have not finished yet. */ - LongLatGeocoderService.prototype.cancel = function() { + CartographicGeocoderService.prototype.cancel = function() { }; /** @@ -32,7 +32,7 @@ define([ * @param {String} query The query to be sent to the geocoder service * @returns {Promise} */ - LongLatGeocoderService.prototype.geocode = function(query) { + CartographicGeocoderService.prototype.geocode = function(query) { try { var splitQuery = query.match(/[^\s,\n]+/g); if ((splitQuery.length === 2) || (splitQuery.length === 3)) { @@ -54,5 +54,5 @@ define([ } }; - return LongLatGeocoderService; + return CartographicGeocoderService; }); diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index ac884f5d6636..32a8ec9cf3fc 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -9,7 +9,7 @@ define([ '../../Core/deprecationWarning', '../../Core/DeveloperError', '../../Core/Event', - '../../Core/LongLatGeocoderService', + '../../Core/CartographicGeocoderService', '../../Core/loadJsonp', '../../Core/Matrix4', '../../Core/OpenStreetMapNominatimGeocoderService', @@ -28,7 +28,7 @@ define([ deprecationWarning, DeveloperError, Event, - LongLatGeocoderService, + CartographicGeocoderService, loadJsonp, Matrix4, OpenStreetMapNominatimGeocoderService, @@ -69,7 +69,7 @@ define([ this._geocoderServices = options.geocoderServices; if (!defined(options.geocoderServices)) { this._geocoderServices = [ - new LongLatGeocoderService(), + new CartographicGeocoderService(), new BingMapsGeocoderService() ]; } diff --git a/Specs/Core/LongLatGeocoderServiceSpec.js b/Specs/Core/CartographicGeocoderServiceSpec.js similarity index 91% rename from Specs/Core/LongLatGeocoderServiceSpec.js rename to Specs/Core/CartographicGeocoderServiceSpec.js index c2cd515a2a6d..5ecf68dbca37 100644 --- a/Specs/Core/LongLatGeocoderServiceSpec.js +++ b/Specs/Core/CartographicGeocoderServiceSpec.js @@ -1,13 +1,13 @@ /*global defineSuite*/ defineSuite([ - 'Core/LongLatGeocoderService', + 'Core/CartographicGeocoderService', 'Core/Cartesian3' ], function( - LongLatGeocoderService, + CartographicGeocoderService, Cartesian3) { 'use strict'; - var service = new LongLatGeocoderService(); + var service = new CartographicGeocoderService(); it('returns cartesian with matching coordinates for long/lat/height input', function (done) { var query = ' 1.0, 2.0, 3.0 '; From b06cfa18500fde7bfe1459ea53a47f9dca20d473 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Tue, 13 Dec 2016 11:18:47 +0100 Subject: [PATCH 209/396] Update doc for cartographic geocoder --- Source/Core/CartographicGeocoderService.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Core/CartographicGeocoderService.js b/Source/Core/CartographicGeocoderService.js index efa0961dbb38..0298626bb44b 100644 --- a/Source/Core/CartographicGeocoderService.js +++ b/Source/Core/CartographicGeocoderService.js @@ -10,7 +10,8 @@ define([ 'use strict'; /** - * Provides geocoding through Bing Maps. + * Geocodes queries containing longitude and latitude coordinates and an optional height. + * Query format: `longitude latitude (height)` with longitude/latitude in degrees and height in meters. * * @alias CartographicGeocoderService * @constructor From e99f83812e460c32a9ae7a87f4eed50983712591 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Tue, 13 Dec 2016 11:58:28 +0100 Subject: [PATCH 210/396] Remove Nominatim geocoder from core and show only as a Sandcastle example --- Apps/Sandcastle/gallery/Custom Geocoder.html | 54 ++++++++++++++- .../OpenStreetMapNominatimGeocoderService.js | 67 ------------------- Source/Widgets/Geocoder/GeocoderViewModel.js | 2 - ...enStreetMapNominatimGeocoderServiceSpec.js | 38 ----------- 4 files changed, 53 insertions(+), 108 deletions(-) delete mode 100644 Source/Core/OpenStreetMapNominatimGeocoderService.js delete mode 100644 Specs/Core/OpenStreetMapNominatimGeocoderServiceSpec.js diff --git a/Apps/Sandcastle/gallery/Custom Geocoder.html b/Apps/Sandcastle/gallery/Custom Geocoder.html index c75b7329263e..c41a144245ba 100644 --- a/Apps/Sandcastle/gallery/Custom Geocoder.html +++ b/Apps/Sandcastle/gallery/Custom Geocoder.html @@ -37,8 +37,60 @@ 'use strict'; //Sandcastle_Begin +/** + * This class is an example of a custom geocoder. It provides geocoding through the OpenStreetMap Nominatim service. + * @alias OpenStreetMapNominatimGeocoder + * @constructor + * + * @param {Object} options Object with the following properties: + * @param {Boolean} autoComplete Indicates whether this service shall be used to fetch auto-complete suggestions + */ +function OpenStreetMapNominatimGeocoder(options) { + options = Cesium.defaultValue(options, Cesium.defaultValue.EMPTY_OBJECT); + this.displayName = 'Nominatim'; + this._canceled = false; + this.autoComplete = Cesium.defaultValue(options.autoComplete, true); +} + +/** + * The function called when a user cancels geocoding. + * + * @returns {undefined} + */ +OpenStreetMapNominatimGeocoder.prototype.cancel = function() { + this._canceled = true; +}; + +/** + * The function called to geocode using this geocoder service. + * + * @param {String} query The query to be sent to the geocoder service + * @returns {Promise} + */ +OpenStreetMapNominatimGeocoder.prototype.geocode = function (input) { + var endpoint = 'http://nominatim.openstreetmap.org/search?'; + var query = 'format=json&q=' + input; + var requestString = endpoint + query; + return Cesium.loadJson(requestString) + .then(function (results) { + var bboxDegrees; + return results.map(function (resultObject) { + bboxDegrees = resultObject.boundingbox; + return { + displayName: resultObject.display_name, + destination: Cesium.Rectangle.fromDegrees( + bboxDegrees[2], + bboxDegrees[0], + bboxDegrees[3], + bboxDegrees[1] + ) + }; + }); + }); +}; + var viewer = new Cesium.Viewer('cesiumContainer', { - geocoder: new Cesium.OpenStreetMapNominatimGeocoderService() + geocoder: new OpenStreetMapNominatimGeocoder() }); //Sandcastle_End diff --git a/Source/Core/OpenStreetMapNominatimGeocoderService.js b/Source/Core/OpenStreetMapNominatimGeocoderService.js deleted file mode 100644 index 9c5386fb3458..000000000000 --- a/Source/Core/OpenStreetMapNominatimGeocoderService.js +++ /dev/null @@ -1,67 +0,0 @@ -/*global define*/ -define([ - './Cartesian3', - './defaultValue', - './loadJson', - './Rectangle' -], function( - Cartesian3, - defaultValue, - loadJson, - Rectangle) { - 'use strict'; - - /** - * Provides geocoding through OpenStreetMap Nominatim. - * @alias OpenStreetMapNominatimGeocoder - * @constructor - * - * @param {Object} options Object with the following properties: - * @param {Boolean} autoComplete Indicates whether this service shall be used to fetch auto-complete suggestions - */ - function OpenStreetMapNominatimGeocoder(options) { - options = defaultValue(options, defaultValue.EMPTY_OBJECT); - this.displayName = 'Nominatim'; - this._canceled = false; - this.autoComplete = defaultValue(options.autoComplete, true); - } - - /** - * The function called when a user cancels geocoding. - * - * @returns {undefined} - */ - OpenStreetMapNominatimGeocoder.prototype.cancel = function() { - this._canceled = true; - }; - - /** - * The function called to geocode using this geocoder service. - * - * @param {String} query The query to be sent to the geocoder service - * @returns {Promise} - */ - OpenStreetMapNominatimGeocoder.prototype.geocode = function (input) { - var endpoint = 'http://nominatim.openstreetmap.org/search?'; - var query = 'format=json&q=' + input; - var requestString = endpoint + query; - return loadJson(requestString) - .then(function (results) { - var bboxDegrees; - return results.map(function (resultObject) { - bboxDegrees = resultObject.boundingbox; - return { - displayName: resultObject.display_name, - destination: Rectangle.fromDegrees( - bboxDegrees[2], - bboxDegrees[0], - bboxDegrees[3], - bboxDegrees[1] - ) - }; - }); - }); - }; - - return OpenStreetMapNominatimGeocoder; -}); \ No newline at end of file diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index 32a8ec9cf3fc..24497a643100 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -12,7 +12,6 @@ define([ '../../Core/CartographicGeocoderService', '../../Core/loadJsonp', '../../Core/Matrix4', - '../../Core/OpenStreetMapNominatimGeocoderService', '../../Core/Rectangle', '../../ThirdParty/knockout', '../../ThirdParty/when', @@ -31,7 +30,6 @@ define([ CartographicGeocoderService, loadJsonp, Matrix4, - OpenStreetMapNominatimGeocoderService, Rectangle, knockout, when, diff --git a/Specs/Core/OpenStreetMapNominatimGeocoderServiceSpec.js b/Specs/Core/OpenStreetMapNominatimGeocoderServiceSpec.js deleted file mode 100644 index f04086580be1..000000000000 --- a/Specs/Core/OpenStreetMapNominatimGeocoderServiceSpec.js +++ /dev/null @@ -1,38 +0,0 @@ -/*global defineSuite*/ -defineSuite([ - 'Core/OpenStreetMapNominatimGeocoderService', - 'Core/Cartesian3', - 'Core/loadJsonp', - 'Core/Rectangle' -], function( - OpenStreetMapNominatimGeocoderService, - Cartesian3, - loadJsonp, - Rectangle) { - 'use strict'; - - var service = new OpenStreetMapNominatimGeocoderService(); - - it('returns geocoder results', function (done) { - var query = 'some query'; - jasmine.createSpy('testSpy', loadJsonp).and.returnValue([{ - displayName: 'a', - boundingbox: [10, 20, 0, 20] - }]); - service.geocode(query, function(err, results) { - expect(results.length).toEqual(1); - expect(results[0].displayName).toEqual('a'); - expect(results[0].destination).toBeInstanceOf(Rectangle); - done(); - }); - }); - - it('returns no geocoder results if OSM Nominatim has no results', function (done) { - var query = 'some query'; - jasmine.createSpy('testSpy', loadJsonp).and.returnValue([]); - service.geocode(query, function(err, results) { - expect(results.length).toEqual(0); - done(); - }); - }); -}); \ No newline at end of file From 0846a8948e1dc70df0572d4d0b6e8172fc257f98 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Tue, 13 Dec 2016 12:15:30 +0100 Subject: [PATCH 211/396] Add geocoder-related classes, interface and example to changes list --- CHANGES.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index b98ea0837e15..396ab05e0430 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,7 +4,11 @@ Change Log ### 1.29 - 2017-01-02 * Deprecated * The properties `url` and `key` will be removed from `GeocoderViewModel` in 1.30. These properties will be available on geocoder services that support them, like `BingMapsGeocoderService`. -* Added support for custom geocoder services [#4723](https://github.com/AnalyticalGraphicsInc/cesium/pull/4723). +* Added support for custom geocoder services and autocomplete [#4723](https://github.com/AnalyticalGraphicsInc/cesium/pull/4723). + * Added [Custom Geocoder Sandcastle example](http://localhost:8080/Apps/Sandcastle/index.html?src=Custom%20Geocoder.html) +* Added `GeocoderService`, an interface for geocoders. +* Added `BingMapsGeocoderService` implementing the `GeocoderService` interface. +* Added `CartographicGeocoderService` implementing the `GeocoderService` interface. * Added the ability to blend a `Model` with a color/translucency. Added `color`, `colorBlendMode`, and `colorBlendAmount` properties to `Model`, `ModelGraphics`, and CZML. Added `ColorBlendMode` enum. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) * Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) From b72ae904721beda0319699eb5565704416a35ca9 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Tue, 13 Dec 2016 12:40:46 +0100 Subject: [PATCH 212/396] Clean up documentation --- Source/Core/BingMapsGeocoderService.js | 6 ++++++ Source/Core/CartographicGeocoderService.js | 17 ++++++++++++++++- Source/Core/GeocoderService.js | 3 +-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Source/Core/BingMapsGeocoderService.js b/Source/Core/BingMapsGeocoderService.js index 2aec91277620..0c85dd6755ef 100644 --- a/Source/Core/BingMapsGeocoderService.js +++ b/Source/Core/BingMapsGeocoderService.js @@ -32,6 +32,12 @@ define([ this._url = 'https://dev.virtualearth.net/REST/v1/Locations'; this._key = BingMapsApi.getKey(options.key); + /** + * Indicates whether this geocoding service is to be used for autocomplete. + * + * @type {boolean} + * @default false + */ this.autoComplete = defaultValue(options.autoComplete, false); } diff --git a/Source/Core/CartographicGeocoderService.js b/Source/Core/CartographicGeocoderService.js index 0298626bb44b..48ea09cc6af9 100644 --- a/Source/Core/CartographicGeocoderService.js +++ b/Source/Core/CartographicGeocoderService.js @@ -2,10 +2,12 @@ define([ './Cartesian3', './defaultValue', + './defineProperties', '../ThirdParty/when' ], function( Cartesian3, defaultValue, + defineProperties, when) { 'use strict'; @@ -17,9 +19,22 @@ define([ * @constructor */ function CartographicGeocoderService() { - this.autoComplete = false; + this._autoComplete = false; } + defineProperties(CartographicGeocoderService.prototype, { + /** + * This geocoder does not support autocomplete, so this property will always be false. + * + * @type {boolean} + */ + autoComplete : { + get : function () { + return this._autoComplete; + } + } + }); + /** * This service completes geocoding synchronously and therefore does not * need to handle canceled requests that have not finished yet. diff --git a/Source/Core/GeocoderService.js b/Source/Core/GeocoderService.js index 14965256fa01..9721c86a17bc 100644 --- a/Source/Core/GeocoderService.js +++ b/Source/Core/GeocoderService.js @@ -20,9 +20,8 @@ define([ * @constructor * * @see BingMapsGeocoderService - * @see OpenStreetMapNominatimGeocoderService */ - function GeocoderService () { + function GeocoderService() { /** * Indicates whether this geocoding service is to be used for autocomplete. * From fb90d241c2afcde1167109d79523bc63a1817a75 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Tue, 13 Dec 2016 16:35:50 +0100 Subject: [PATCH 213/396] Check.defined should pass when passed either undefined or null --- Specs/Core/CheckSpec.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Specs/Core/CheckSpec.js b/Specs/Core/CheckSpec.js index 43012472cae3..748502f1d983 100644 --- a/Specs/Core/CheckSpec.js +++ b/Specs/Core/CheckSpec.js @@ -196,16 +196,13 @@ defineSuite([ }); }); - it('Check.defined does not throw when passed value that is not undefined', function () { + it('Check.defined does not throw unless passed value that is undefined or null', function () { expect(function () { Check.defined({}); }).not.toThrowDeveloperError(); expect(function () { Check.defined([]); }).not.toThrowDeveloperError(); - expect(function () { - Check.defined(null); - }).not.toThrowDeveloperError(); expect(function () { Check.defined(2); }).not.toThrowDeveloperError(); From ba1e9347b5ba358c4ccafd83b048b4ea1e2982cf Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Tue, 13 Dec 2016 17:01:51 +0100 Subject: [PATCH 214/396] Replace array type checks with defined checks --- Source/Core/Cartesian3.js | 6 +++--- Source/Core/Check.js | 10 ---------- Specs/Core/CheckSpec.js | 29 ----------------------------- 3 files changed, 3 insertions(+), 42 deletions(-) diff --git a/Source/Core/Cartesian3.js b/Source/Core/Cartesian3.js index 78aae859e51f..45c6a46fa048 100644 --- a/Source/Core/Cartesian3.js +++ b/Source/Core/Cartesian3.js @@ -822,7 +822,7 @@ define([ */ Cartesian3.fromDegreesArray = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - Check.type.array(coordinates); + Check.defined(coordinates, 'coordinates'); if (coordinates.length < 2 || coordinates.length % 2 !== 0) { throw new DeveloperError('the number of coordinates must be a multiple of 2 and at least 2'); } @@ -858,7 +858,7 @@ define([ */ Cartesian3.fromRadiansArray = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - Check.type.array(coordinates); + Check.defined(coordinates, 'coordinates'); if (coordinates.length < 2 || coordinates.length % 2 !== 0) { throw new DeveloperError('the number of coordinates must be a multiple of 2 and at least 2'); } @@ -894,7 +894,7 @@ define([ */ Cartesian3.fromDegreesArrayHeights = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - Check.type.array(coordinates); + Check.defined(coordinates, 'coordinates'); if (coordinates.length < 3 || coordinates.length % 3 !== 0) { throw new DeveloperError('the number of coordinates must be a multiple of 3 and at least 3'); } diff --git a/Source/Core/Check.js b/Source/Core/Check.js index ae8febf9d26d..960b7519b564 100644 --- a/Source/Core/Check.js +++ b/Source/Core/Check.js @@ -130,16 +130,6 @@ define([ } }; - /** - * @param {} test The value to test - * @throws {DeveloperError} - */ - Check.type.array = function (test) { - if (!isArray(test)) { - throw new DeveloperError(errors.failedType(typeof test, 'array')); - } - }; - /** * @param {} test The value to test * @throws {DeveloperError} diff --git a/Specs/Core/CheckSpec.js b/Specs/Core/CheckSpec.js index 748502f1d983..2543f35f7ec7 100644 --- a/Specs/Core/CheckSpec.js +++ b/Specs/Core/CheckSpec.js @@ -6,35 +6,6 @@ defineSuite([ 'use strict'; describe('type checks', function () { - it('Check.type.array does not throw when passed an array', function () { - expect(function () { - Check.type.array([]); - }).not.toThrowDeveloperError(); - }); - it('Check.type.array does not throw when passed a typed array', function () { - expect(function () { - Check.type.array([]); - }).not.toThrowDeveloperError(); - }); - - it('Check.type.array throws when passed non-array', function () { - expect(function () { - Check.type.array({}); - }).toThrowDeveloperError(); - expect(function () { - Check.type.array(true); - }).toThrowDeveloperError(); - expect(function () { - Check.type.array(1); - }).toThrowDeveloperError(); - expect(function () { - Check.type.array('snth'); - }).toThrowDeveloperError(); - expect(function () { - Check.type.array(function () {return true;}); - }).toThrowDeveloperError(); - }); - it('Check.type.boolean does not throw when passed a boolean', function () { expect(function () { Check.type.boolean(true); From 250bfcc9e6bee66aabd75a7620e2e22c46b93406 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Tue, 13 Dec 2016 12:08:27 -0500 Subject: [PATCH 215/396] On screen Mapbox access token warning --- Source/Core/MapboxApi.js | 31 +++++++++++++++++++++------ Source/Scene/MapboxImageryProvider.js | 7 +++++- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/Source/Core/MapboxApi.js b/Source/Core/MapboxApi.js index b715e680aeec..43dadf66c51e 100644 --- a/Source/Core/MapboxApi.js +++ b/Source/Core/MapboxApi.js @@ -1,8 +1,10 @@ /*global define*/ define([ - './defined' - ], function( - defined) { + './defined', + './Credit' +], function( + defined, + Credit) { 'use strict'; var MapboxApi = { @@ -21,7 +23,10 @@ define([ */ MapboxApi.defaultAccessToken = undefined; - var printedMpaboxWarning = false; + var printedMapboxWarning = false; + var errorCredit; + var errorString = 'This application is using Cesium\'s default Mapbox access token. Please create a new access token for the application as soon as possible and prior to deployment by visiting https://www.mapbox.com/account/apps/, and provide your token to Cesium by setting the Cesium.MapboxApi.defaultAccessToken property before constructing the CesiumWidget or any other object that uses the Mapbox API.'; + MapboxApi.getAccessToken = function(providedToken) { if (defined(providedToken)) { @@ -29,9 +34,9 @@ define([ } if (!defined(MapboxApi.defaultAccessToken)) { - if (!printedMpaboxWarning) { - console.log('This application is using Cesium\'s default Mapbox access token. Please create a new access token for the application as soon as possible and prior to deployment by visiting https://www.mapbox.com/account/apps/, and provide your token to Cesium by setting the Cesium.MapboxApi.defaultAccessToken property before constructing the CesiumWidget or any other object that uses the Mapbox API.'); - printedMpaboxWarning = true; + if (!printedMapboxWarning) { + console.log(errorString); + printedMapboxWarning = true; } return 'pk.eyJ1IjoiYW5hbHl0aWNhbGdyYXBoaWNzIiwiYSI6ImNpd204Zm4wejAwNzYyeW5uNjYyZmFwdWEifQ.7i-VIZZWX8pd1bTfxIVj9g'; } @@ -39,5 +44,17 @@ define([ return MapboxApi.defaultAccessToken; }; + MapboxApi.getErrorCredit = function(providedToken) { + if (defined(providedToken) || defined(MapboxApi.defaultAccessToken)) { + return undefined; + } + + if (!defined(errorCredit)) { + errorCredit = new Credit(errorString); + } + + return errorCredit; + }; + return MapboxApi; }); diff --git a/Source/Scene/MapboxImageryProvider.js b/Source/Scene/MapboxImageryProvider.js index c308f02a2da7..fd17812a3d9d 100644 --- a/Source/Scene/MapboxImageryProvider.js +++ b/Source/Scene/MapboxImageryProvider.js @@ -65,6 +65,7 @@ define([ this._url = url; this._mapId = mapId; this._accessToken = MapboxApi.getAccessToken(options.accessToken); + this._accessTokenErrorCredit = MapboxApi.getErrorCredit(options.key); var format = defaultValue(options.format, 'png'); if (!/\./.test(format)) { format = '.' + format; @@ -302,7 +303,11 @@ define([ * @exception {DeveloperError} getTileCredits must not be called before the imagery provider is ready. */ MapboxImageryProvider.prototype.getTileCredits = function(x, y, level) { - return defaultCredit2; + var credits = defaultCredit2.slice(); + if (defined(this._accessTokenErrorCredit)) { + credits.push(this._accessTokenErrorCredit); + } + return credits; }; /** From 574b663d4a959605f8e9ffc4fd19fe29d90be2c2 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Tue, 13 Dec 2016 12:10:52 -0500 Subject: [PATCH 216/396] Update CHANGES.md --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 73a359315050..370c3eaf1010 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,7 +9,7 @@ Change Log * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) * Fixed `Rectangle.union` to correctly account for rectangles that cross the IDL [#4732](https://github.com/AnalyticalGraphicsInc/cesium/pull/4732). * Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) -* Fixed an bug that caused `GroundPrimitive` to render incorrectly. [#4747](https://github.com/AnalyticalGraphicsInc/cesium/pull/4747) +* Fixed an bug that caused `GroundPrimitive` to render incorrectly on systems without the `WEBGL_depth_texture` extension. [#4747](https://github.com/AnalyticalGraphicsInc/cesium/pull/4747) ### 1.28 - 2016-12-01 From ef86d83e89b3dd502e2403abc6c5951f34c0a6aa Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Tue, 13 Dec 2016 12:56:15 -0500 Subject: [PATCH 217/396] Tweak CHANGES.md --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 8453ec7c1167..f7670a943ba5 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,7 +6,7 @@ Change Log * Added the ability to blend a `Model` with a color/translucency. Added `color`, `colorBlendMode`, and `colorBlendAmount` properties to `Model`, `ModelGraphics`, and CZML. Added `ColorBlendMode` enum. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) * Added new `Label` properties `showBackground`, `backgroundColor`, and `backgroundPadding` to the primitive, Entity, and CZML layers. * Added new enum `VerticalOrigin.BASELINE`. Previously, `VerticalOrigin.BOTTOM` would sometimes align to the baseline depending on the contents of a label. -* Added support for newlines in `Label`s. [#2402](https://github.com/AnalyticalGraphicsInc/cesium/issues/2402) +* Added support for newlines (`\n`) in `Label`s. [#2402](https://github.com/AnalyticalGraphicsInc/cesium/issues/2402) * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) * Fixed `Rectangle.union` to correctly account for rectangles that cross the IDL [#4732](https://github.com/AnalyticalGraphicsInc/cesium/pull/4732). * Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) From 02c6d93eb9a4f9da1bd50f6a54924f04ff74a297 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Tue, 13 Dec 2016 12:58:36 -0500 Subject: [PATCH 218/396] Mention CZML in CHANGES.md --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index f7670a943ba5..7dfff1c2f52d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,7 +6,7 @@ Change Log * Added the ability to blend a `Model` with a color/translucency. Added `color`, `colorBlendMode`, and `colorBlendAmount` properties to `Model`, `ModelGraphics`, and CZML. Added `ColorBlendMode` enum. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) * Added new `Label` properties `showBackground`, `backgroundColor`, and `backgroundPadding` to the primitive, Entity, and CZML layers. * Added new enum `VerticalOrigin.BASELINE`. Previously, `VerticalOrigin.BOTTOM` would sometimes align to the baseline depending on the contents of a label. -* Added support for newlines (`\n`) in `Label`s. [#2402](https://github.com/AnalyticalGraphicsInc/cesium/issues/2402) +* Added support for newlines (`\n`) in Cesium `Label`s and CZML. [#2402](https://github.com/AnalyticalGraphicsInc/cesium/issues/2402) * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) * Fixed `Rectangle.union` to correctly account for rectangles that cross the IDL [#4732](https://github.com/AnalyticalGraphicsInc/cesium/pull/4732). * Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) From be544319542610a9033ae02f54f0a4da94af6d19 Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Tue, 13 Dec 2016 13:52:53 -0500 Subject: [PATCH 219/396] Removed per entry comments and added comment linking to specification --- Source/Core/WebGLConstants.js | 502 +--------------------------------- 1 file changed, 7 insertions(+), 495 deletions(-) diff --git a/Source/Core/WebGLConstants.js b/Source/Core/WebGLConstants.js index d9bf73ffd9da..813108fa2404 100644 --- a/Source/Core/WebGLConstants.js +++ b/Source/Core/WebGLConstants.js @@ -3,7 +3,7 @@ * @module WebGLConstants */ define([ - './freezeObject' + '../Core/freezeObject' ], function( freezeObject) { 'use strict'; @@ -13,443 +13,94 @@ define([ * for use without an active WebGL context, or in cases where certain constants are unavailable using the WebGL context * (For example, in [Safari 9]{@link https://github.com/AnalyticalGraphicsInc/cesium/issues/2989}). * - * @readonly + * These match the constants from the [WebGL 1.0]{@link https://www.khronos.org/registry/webgl/specs/latest/1.0/} + * and [WebGL 2.0]{@link https://www.khronos.org/registry/webgl/specs/latest/2.0/} + * specifications. + * * @alias WebGLConstants + * @readonly * @enum {Number} */ var WebGLConstants = { - /** - * Passed to [gl.clear]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/clear} - * to clear the current depth buffer. - */ DEPTH_BUFFER_BIT : 0x00000100, - /** - * Passed to [gl.clear]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/clear} - * to clear the current stencil buffer. - */ STENCIL_BUFFER_BIT : 0x00000400, - /** - * Passed to [gl.clear]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/clear} - * to clear the current color buffer. - */ COLOR_BUFFER_BIT : 0x00004000, - /** - * Passed to [gl.drawElements]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawElements} - * or [gl.drawArrays]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawArrays} - * to draw single points. - */ POINTS : 0x0000, - /** - * Passed to [gl.drawElements]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawElements} - * or [gl.drawArrays]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawArrays} - * to draw lines. Each vertex connects to the one after it. - */ LINES : 0x0001, - /** - * Passed to [gl.drawElements]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawElements} - * or [gl.drawArrays]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawArrays} - * to draw draw lines. Each set of two vertices is treated as a separate line segment. - */ LINE_LOOP : 0x0002, - /** - * Passed to [gl.drawElements]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawElements} - * or [gl.drawArrays]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawArrays} - * to draw a connected group of line segments from the first vertex to the last. - */ LINE_STRIP : 0x0003, - /** - * Passed to [gl.drawElements]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawElements} - * or [gl.drawArrays]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawArrays} - * to draw triangles. Each set of three vertices creates a separate triangle. - */ TRIANGLES : 0x0004, - /** - * Passed to [gl.drawElements]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawElements} - * or [gl.drawArrays]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawArrays} - * to draw a connected group of triangles. - */ TRIANGLE_STRIP : 0x0005, - /** - * Passed to [gl.drawElements]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawElements} - * or [gl.drawArrays]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/drawArrays} - * to draw a connected group of triangles. Each vertex connects to the previous and the first vertex in the fan. - */ TRIANGLE_FAN : 0x0006, - /** - * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} - * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} - * to turn off a component. - */ ZERO : 0, - /** - * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} - * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} - * to turn on a component. - */ ONE : 1, - /** - * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} - * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} - * to multiply a component by the source color. - */ SRC_COLOR : 0x0300, - /** - * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} - * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} - * to multiply a component by one minus the source color. - */ ONE_MINUS_SRC_COLOR : 0x0301, - /** - * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} - * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} - * to multiply a component by the source alpha. - */ SRC_ALPHA : 0x0302, - /** - * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} - * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} - * to multiply a component by one minus the source alpha. - */ ONE_MINUS_SRC_ALPHA : 0x0303, - /** - * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} - * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} - * to multiply a component by the destination alpha. - */ DST_ALPHA : 0x0304, - /** - * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} - * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} - * to multiply a component by one minus the destination alpha. - */ ONE_MINUS_DST_ALPHA : 0x0305, - /** - * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} - * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} - * to multiply a component by the destination color. - */ DST_COLOR : 0x0306, - /** - * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} - * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} - * to multiply a component by one minus the destination color. - */ ONE_MINUS_DST_COLOR : 0x0307, - /** - * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} - * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} - * to multiply a component by the minimum of the source alpha or one minus the destination alpha. - */ SRC_ALPHA_SATURATE : 0x0308, - /** - * Passed to [gl.blendEquation]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendEquation} - * or [gl.blendEquationSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendEquationSeparate} - * to set an addition blend function. - */ FUNC_ADD : 0x8006, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the current RGB blend function. - */ BLEND_EQUATION : 0x8009, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the current RGB blend function, same as BLEND_EQUATION. - */ - BLEND_EQUATION_RGB : 0x8009, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the current alpha blend function. - */ + BLEND_EQUATION_RGB : 0x8009, // same as BLEND_EQUATION BLEND_EQUATION_ALPHA : 0x883D, - /** - * Passed to [gl.blendEquation]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendEquation} - * or [gl.blendEquationSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendEquationSeparate} - * to set a subtraction blend function (source - destination). - */ FUNC_SUBTRACT : 0x800A, - /** - * Passed to [gl.blendEquation]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendEquation} - * or [gl.blendEquationSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendEquationSeparate} - * to set a subtraction blend function (destination - source). - */ FUNC_REVERSE_SUBTRACT : 0x800B, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the current destination RGB blend function. - */ BLEND_DST_RGB : 0x80C8, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the current source RGB blend function. - */ BLEND_SRC_RGB : 0x80C9, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the current destination alpha blend function. - */ BLEND_DST_ALPHA : 0x80CA, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the current source alpha blend function. - */ BLEND_SRC_ALPHA : 0x80CB, - /** - * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} - * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} - * to specify a constant color blend function. - */ CONSTANT_COLOR : 0x8001, - /** - * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} - * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} - * to specify one minus a constant color blend function. - */ ONE_MINUS_CONSTANT_COLOR : 0x8002, - /** - * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} - * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} - * to specify a constant alpha blend function. - */ CONSTANT_ALPHA : 0x8003, - /** - * Passed to [gl.blendFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFunc} - * or [gl.blendFuncSeparate]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/blendFuncSeparate} - * to specify one minus a constant alpha blend function. - */ ONE_MINUS_CONSTANT_ALPHA : 0x8004, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to return the current blend color. - */ BLEND_COLOR : 0x8005, - /** - * Passed to [gl.bindBuffer]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bindBuffer} - * or [gl.bufferData]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bufferData} - * to specify that the buffer is used for vertex attributes. - */ ARRAY_BUFFER : 0x8892, - /** - * Passed to [gl.bindBuffer]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bindBuffer} - * or [gl.bufferData]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bufferData} - * to specify that the buffer is used for element indices. - */ ELEMENT_ARRAY_BUFFER : 0x8893, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the array buffer binding. - */ ARRAY_BUFFER_BINDING : 0x8894, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the current element array buffer. - */ ELEMENT_ARRAY_BUFFER_BINDING : 0x8895, - /** - * Passed to [gl.bufferData]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bufferData} - * as a hint about whether the contents of the buffer are likely to not be used often. - */ STREAM_DRAW : 0x88E0, - /** - * Passed to [gl.bufferData]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bufferData} - * as a hint about whether the contents of the buffer are likely to be used often and not change often. - */ STATIC_DRAW : 0x88E4, - /** - * Passed to [gl.bufferData]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bufferData} - * as a hint about whether the contents of the buffer are likely to be used often and change often. - */ DYNAMIC_DRAW : 0x88E8, - /** - * Passed to [gl.getBufferParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getBufferParameter} - * to get a buffer's size. - */ BUFFER_SIZE : 0x8764, - /** - * Passed to [gl.getBufferParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getBufferParameter} - * to get the hint for the buffer passed in when it was created. - */ BUFFER_USAGE : 0x8765, - /** - * Passed to [gl.getVertexAttrib]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getVertexAttrib} - * to read back the current vertex attribute. - */ CURRENT_VERTEX_ATTRIB : 0x8626, - /** - * Passed to [gl.cullFace]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/cullFace} - * to specify that only front faces should be drawn. - */ FRONT : 0x0404, - /** - * Passed to [gl.cullFace]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/cullFace} - * to specify that only back faces should be drawn. - */ BACK : 0x0405, - /** - * Passed to [gl.cullFace]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/cullFace} - * to specify that front and back faces should be drawn. - */ FRONT_AND_BACK : 0x0408, - /** - * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} - * to turn on/off culling. Can also be used with [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to find the current culling method. - */ CULL_FACE : 0x0B44, - /** - * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} - * to turn on/off blending. Can also be used with [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to find the current blending method. - */ BLEND : 0x0BE2, - /** - * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} - * to turn on/off dithering. Can also be used with [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to find the current dithering method. - */ DITHER : 0x0BD0, - /** - * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} - * to turn on/off the stencil test. Can also be used with [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to query the stencil test. - */ STENCIL_TEST : 0x0B90, - /** - * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} - * to turn on/off the depth test. Can also be used with [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to query the depth test. - */ DEPTH_TEST : 0x0B71, - /** - * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} - * to turn on/off the scissor test. Can also be used with [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to query the scissor test. - */ SCISSOR_TEST : 0x0C11, - /** - * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} - * to turn on/off the polygon offset. Useful for rendering hidden-line images, decals, and or solids with highlighted edges. - */ POLYGON_OFFSET_FILL : 0x8037, - /** - * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} - * to turn on/off the alpha to coverage. Used in multi-sampling alpha channels. - */ SAMPLE_ALPHA_TO_COVERAGE : 0x809E, - /** - * Passed to [gl.enable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/enable}/[disable]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/disable} - * to turn on/off the sample coverage. Used in multi-sampling. - */ SAMPLE_COVERAGE : 0x80A0, - /** - * Returned from [gl.getError]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError}. - * Indicates that no error has been recorded. - */ NO_ERROR : 0, - /** - * Returned from [gl.getError]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError}. - * Indicates that an unacceptable value has been specified for an enumerated argument. - */ INVALID_ENUM : 0x0500, - /** - * Returned from [gl.getError]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError}. - * Indicates that a numeric argument is out of range. - */ INVALID_VALUE : 0x0501, - /** - * Returned from [gl.getError]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError}. - * Indicates that the specified command is not allowed for the current state. - */ INVALID_OPERATION : 0x0502, - /** - * Returned from [gl.getError]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError}. - * Indicates that the not enough memory is left to execute the command. - */ OUT_OF_MEMORY : 0x0505, - /** - * Passed to [gl.frontFace]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/frontFace} - * to specify the front face of a polygon is drawn in the clockwise direction. - */ CW : 0x0900, - /** - * Passed to [gl.frontFace]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/frontFace} - * to specify the front face of a polygon is drawn in the counter-clockwise direction. - */ CCW : 0x0901, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the current lineWidth (set by [gl.lineWidth]{https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/lineWidth}). - */ LINE_WIDTH : 0x0B21, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the current size of a drawn point. - */ ALIASED_POINT_SIZE_RANGE : 0x846D, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the range of available widths for a line. Returns a length-2 array with the lo value at 0, and hight at 1. - */ ALIASED_LINE_WIDTH_RANGE : 0x846E, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the current value of cullFace. Should return FRONT, BACK, or FRONT_AND_BACK. - */ CULL_FACE_MODE : 0x0B45, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to determine the current value of [gl.frontFace]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/frontFace}. - */ FRONT_FACE : 0x0B46, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to return a length-2 array of floats giving the current depth range. - */ DEPTH_RANGE : 0x0B70, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to determine if the depth write mask is enabled. - */ DEPTH_WRITEMASK : 0x0B72, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to determine the current depth clear value. - */ DEPTH_CLEAR_VALUE : 0x0B73, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the current depth function. Returns NEVER, ALWAYS, LESS, EQUAL, LEQUAL, GREATER, GEQUAL, or NOTEQUAL. - */ DEPTH_FUNC : 0x0B74, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the value the stencil will be cleared to. - */ STENCIL_CLEAR_VALUE : 0x0B91, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the current stencil function. Returns NEVER, ALWAYS, LESS, EQUAL, LEQUAL, GREATER, GEQUAL, or NOTEQUAL. - */ STENCIL_FUNC : 0x0B92, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the current stencil fail function. Should return KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, or DECR_WRAP. - */ STENCIL_FAIL : 0x0B94, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the current stencil fail function should the depth buffer test fail. Should return KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, or DECR_WRAP. - */ STENCIL_PASS_DEPTH_FAIL : 0x0B95, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the current stencil fail function should the depth buffer test pass. Should return KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, or DECR_WRAP. - */ STENCIL_PASS_DEPTH_PASS : 0x0B96, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get the reference value used for stencil tests. - */ STENCIL_REF : 0x0B97, STENCIL_VALUE_MASK : 0x0B93, STENCIL_WRITEMASK : 0x0B98, @@ -460,15 +111,7 @@ define([ STENCIL_BACK_REF : 0x8CA3, STENCIL_BACK_VALUE_MASK : 0x8CA4, STENCIL_BACK_WRITEMASK : 0x8CA5, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get an Int32Array with four elements for the current viewport dimensions. - */ VIEWPORT : 0x0BA2, - /** - * Passed to [gl.getParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParameter} - * to get an Int32Array with four elements for the current scissor box dimensions. - */ SCISSOR_BOX : 0x0C10, COLOR_CLEAR_VALUE : 0x0C22, COLOR_WRITEMASK : 0x0C23, @@ -491,26 +134,9 @@ define([ SAMPLE_COVERAGE_VALUE : 0x80AA, SAMPLE_COVERAGE_INVERT : 0x80AB, COMPRESSED_TEXTURE_FORMATS : 0x86A3, - /** - * Passed to [gl.hint]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/hint} - * There is no preference for this behavior. - */ DONT_CARE : 0x1100, - /** - * Passed to [gl.hint]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/hint} - * The most efficient behavior should be used. - */ FASTEST : 0x1101, - /** - * Passed to [gl.hint]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/hint} - * The most correct or the highest quality option should be used. - */ NICEST : 0x1102, - /** - * Passed to [gl.hint]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/hint} - * for the quality of filtering when generating mipmap images with - * [gl.generateMipmap]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/generateMipmap}. - */ GENERATE_MIPMAP_HINT : 0x8192, BYTE : 0x1400, UNSIGNED_BYTE : 0x1401, @@ -528,15 +154,7 @@ define([ UNSIGNED_SHORT_4_4_4_4 : 0x8033, UNSIGNED_SHORT_5_5_5_1 : 0x8034, UNSIGNED_SHORT_5_6_5 : 0x8363, - /** - * Passed to [gl.createShader]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/createShader} - * to define a fragment shader. - */ FRAGMENT_SHADER : 0x8B30, - /** - * Passed to [gl.createShader]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/createShader} - * to define a vertex shader. - */ VERTEX_SHADER : 0x8B31, MAX_VERTEX_ATTRIBS : 0x8869, MAX_VERTEX_UNIFORM_VECTORS : 0x8DFB, @@ -546,125 +164,28 @@ define([ MAX_TEXTURE_IMAGE_UNITS : 0x8872, MAX_FRAGMENT_UNIFORM_VECTORS : 0x8DFD, SHADER_TYPE : 0x8B4F, - /** - * Passed to [gl.getShaderParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getShaderParameter} - * to determine if a shader was deleted via [gl.deleteShader]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/deleteShader}. - */ DELETE_STATUS : 0x8B80, - /** - * Passed to [gl.getProgramParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getProgramParameter} - * after calling [gl.linkProgram]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/linkProgram} - * to determine if a program was linked correctly. - */ LINK_STATUS : 0x8B82, - /** - * Passed to [gl.getProgramParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getProgramParameter} - * after calling [gl.validateProgram]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/validateProgram} - * to determine if it is valid. - */ VALIDATE_STATUS : 0x8B83, - /** - * Passed to [gl.getProgramParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getProgramParameter} - * after calling [gl.attachShader]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/validateProgram} - * to determine if the shader was attached correctly. - */ ATTACHED_SHADERS : 0x8B85, - /** - * Passed to [gl.getProgramParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getProgramParameter} - * to get the number of uniforms active in a program. - */ ACTIVE_UNIFORMS : 0x8B86, - /** - * Passed to [gl.getProgramParameter]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getProgramParameter} - * to get the number of attributes active in a program. - */ ACTIVE_ATTRIBUTES : 0x8B89, SHADING_LANGUAGE_VERSION : 0x8B8C, CURRENT_PROGRAM : 0x8B8D, - /** - * Passed to [gl.depthFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc} - * or [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} - * to specify depth or stencil tests will never pass. i.e. Nothing will be drawn. - */ NEVER : 0x0200, - /** - * Passed to [gl.depthFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc} - * or [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} - * to specify depth or stencil tests will pass if the new depth value is less than the stored value. - */ LESS : 0x0201, - /** - * Passed to [gl.depthFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc} - * or [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} - * to specify depth or stencil tests will pass if the new depth value is equals to the stored value. - */ EQUAL : 0x0202, - /** - * Passed to [gl.depthFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc} - * or [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} - * to specify depth or stencil tests will pass if the new depth value is less than or equal to the stored value. - */ LEQUAL : 0x0203, - /** - * Passed to [gl.depthFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc} - * or [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} - * to specify depth or stencil tests will pass if the new depth value is greater than the stored value. - */ GREATER : 0x0204, - /** - * Passed to [gl.depthFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc} - * or [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} - * to specify depth or stencil tests will pass if the new depth value is not equal to the stored value. - */ NOTEQUAL : 0x0205, - /** - * Passed to [gl.depthFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc} - * or [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} - * to specify depth or stencil tests will pass if the new depth value is greater than or equal to the stored value. - */ GEQUAL : 0x0206, - /** - * Passed to [gl.depthFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc} - * or [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} - * to specify depth or stencil tests will always pass. i.e. Pixels will be drawn in the order they are drawn. - */ ALWAYS : 0x0207, - /** - * Passed to [gl.stencilOp]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilOp} - * to keep the current value when the stencil test fails. - */ KEEP : 0x1E00, - /** - * Passed to [gl.stencilOp]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilOp} - * to set the stencil buffer value to the reference value as specified by - * [gl.stencilFunc]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilFunc} - * when the stencil test fails. - */ REPLACE : 0x1E01, - /** - * Passed to [gl.stencilOp]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilOp} - * to increment the current stencil buffer value when the stencil test fails. Clamps to the maximum representable unsigned value. - */ INCR : 0x1E02, - /** - * Passed to [gl.stencilOp]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilOp} - * to decrement the current stencil buffer value when the stencil test fails. Clamps to zero. - */ DECR : 0x1E03, - /** - * Passed to [gl.stencilOp]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilOp} - * to invert the current stencil buffer value bitwise when the stencil test fails. - */ INVERT : 0x150A, - /** - * Passed to [gl.stencilOp]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilOp} - * to increment the current stencil buffer value when the stencil test fails. Wraps stencil buffer value to zero when incrementing the maximum representable unsigned value. - */ INCR_WRAP : 0x8507, - /** - * Passed to [gl.stencilOp]{@link https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/stencilOp} - * to decrement the current stencil buffer value when the stencil test fails. Wraps stencil buffer value to the maximum representable unsigned value when decrementing a stencil buffer value of zero. - */ DECR_WRAP : 0x8508, VENDOR : 0x1F00, RENDERER : 0x1F01, @@ -690,9 +211,6 @@ define([ TEXTURE_CUBE_MAP_POSITIVE_Z : 0x8519, TEXTURE_CUBE_MAP_NEGATIVE_Z : 0x851A, MAX_CUBE_MAP_TEXTURE_SIZE : 0x851C, - /** - * Used to address texture units. - */ TEXTURE0 : 0x84C0, TEXTURE1 : 0x84C1, TEXTURE2 : 0x84C2, @@ -725,9 +243,6 @@ define([ TEXTURE29 : 0x84DD, TEXTURE30 : 0x84DE, TEXTURE31 : 0x84DF, - /** - * Used to address the current active texture unit. - */ ACTIVE_TEXTURE : 0x84E0, REPEAT : 0x2901, CLAMP_TO_EDGE : 0x812F, @@ -965,9 +480,6 @@ define([ READ_FRAMEBUFFER_BINDING : 0x8CAA, RENDERBUFFER_SAMPLES : 0x8CAB, FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER : 0x8CD4, - /** - * Maximum number of framebuffer color attachment points. - */ MAX_COLOR_ATTACHMENTS : 0x8CDF, COLOR_ATTACHMENT1 : 0x8CE1, COLOR_ATTACHMENT2 : 0x8CE2, From fe84befbdc45db4adab62b5a16b6fb17b87cfaac Mon Sep 17 00:00:00 2001 From: Matthew Amato Date: Tue, 13 Dec 2016 13:56:48 -0500 Subject: [PATCH 220/396] Fix formatting. --- Source/Scene/LabelCollection.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index bf102a006a82..f7416ffc40d7 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -270,8 +270,7 @@ define([ label._repositionAllGlyphs = true; } - function calculateWidthOffset(lineWidth, horizontalOrigin, backgroundPadding) - { + function calculateWidthOffset(lineWidth, horizontalOrigin, backgroundPadding) { if (horizontalOrigin === HorizontalOrigin.CENTER) { return -lineWidth / 2; } else if (horizontalOrigin === HorizontalOrigin.RIGHT) { @@ -406,7 +405,7 @@ define([ function destroyLabel(labelCollection, label) { var glyphs = label._glyphs; - for ( var i = 0, len = glyphs.length; i < len; ++i) { + for (var i = 0, len = glyphs.length; i < len; ++i) { unbindGlyph(labelCollection, glyphs[i]); } if (defined(label._backgroundBillboard)) { @@ -667,7 +666,7 @@ define([ LabelCollection.prototype.removeAll = function() { var labels = this._labels; - for ( var i = 0, len = labels.length; i < len; ++i) { + for (var i = 0, len = labels.length; i < len; ++i) { destroyLabel(this, labels[i]); } From 94eecbfc1adf0689210d84ebf83ee88547d46b0f Mon Sep 17 00:00:00 2001 From: hpinkos Date: Tue, 13 Dec 2016 14:56:23 -0500 Subject: [PATCH 221/396] knockout es5 makes everything difficult --- Source/Core/BingMapsGeocoderService.js | 10 - Source/Core/GeocoderService.js | 12 -- Source/Widgets/Geocoder/Geocoder.css | 2 +- Source/Widgets/Geocoder/Geocoder.js | 17 +- Source/Widgets/Geocoder/GeocoderViewModel.js | 194 ++++++++++--------- 5 files changed, 111 insertions(+), 124 deletions(-) diff --git a/Source/Core/BingMapsGeocoderService.js b/Source/Core/BingMapsGeocoderService.js index 0c85dd6755ef..5e0ee46e2f58 100644 --- a/Source/Core/BingMapsGeocoderService.js +++ b/Source/Core/BingMapsGeocoderService.js @@ -42,16 +42,6 @@ define([ } defineProperties(BingMapsGeocoderService.prototype, { - /** - * The display name of the geocoder service - * @type {String} - */ - displayName : { - get : function () { - return this._displayName; - } - }, - /** * The URL endpoint for the Bing geocoder service * @type {String} diff --git a/Source/Core/GeocoderService.js b/Source/Core/GeocoderService.js index 9721c86a17bc..fbf80f2ce6ea 100644 --- a/Source/Core/GeocoderService.js +++ b/Source/Core/GeocoderService.js @@ -31,18 +31,6 @@ define([ this.autoComplete = false; } - defineProperties(GeocoderService.prototype, { - /** - * The name of this service to be displayed next to suggestions - * in case more than one geocoder is in use - * @type {String} - * - */ - displayName : { - get : DeveloperError.throwInstantiationError - } - }); - /** * @function * diff --git a/Source/Widgets/Geocoder/Geocoder.css b/Source/Widgets/Geocoder/Geocoder.css index f77696d693a8..b97c06f55f1d 100644 --- a/Source/Widgets/Geocoder/Geocoder.css +++ b/Source/Widgets/Geocoder/Geocoder.css @@ -39,7 +39,7 @@ .cesium-viewer-geocoderContainer .search-results { position: absolute; - background-color: black; + background-color: #000; overflow-y: auto; opacity: 0.8; width: 100%; diff --git a/Source/Widgets/Geocoder/Geocoder.js b/Source/Widgets/Geocoder/Geocoder.js index 0d2ba2e53522..e2bf4a7c63fc 100644 --- a/Source/Widgets/Geocoder/Geocoder.js +++ b/Source/Widgets/Geocoder/Geocoder.js @@ -70,7 +70,8 @@ define([ textInput: searchText,\ disable: isSearchInProgress,\ event: { keyup: handleKeyUp, keydown: handleKeyDown, mouseover: deselectSuggestion },\ -css: { "cesium-geocoder-input-wide" : keepExpanded || searchText.length > 0 }'); +css: { "cesium-geocoder-input-wide" : keepExpanded || searchText.length > 0 },\ +hasFocus: _focusTextbox'); this._onTextBoxFocus = function() { // as of 2016-10-19, setTimeout is required to ensure that the @@ -95,16 +96,16 @@ cesiumSvgPath: { path: isSearchInProgress ? _stopSearchPath : _startSearchPath, var searchSuggestionsContainer = document.createElement('div'); searchSuggestionsContainer.className = 'search-results'; - searchSuggestionsContainer.setAttribute('data-bind', 'visible: suggestionsVisible'); + searchSuggestionsContainer.setAttribute('data-bind', 'visible: _suggestionsVisible'); var suggestionsList = document.createElement('ul'); - suggestionsList.setAttribute('data-bind', 'foreach: suggestions'); + suggestionsList.setAttribute('data-bind', 'foreach: _suggestions'); var suggestions = document.createElement('li'); suggestionsList.appendChild(suggestions); suggestions.setAttribute('data-bind', 'text: $data.displayName, \ click: $parent.activateSuggestion, \ -event: { mouseover: $parent.handleMouseover }, \ -css: { active: $data === $parent.selectedSuggestion() }'); +event: { mouseover: $parent.handleMouseover}, \ +css: { active: $data === $parent._selectedSuggestion }'); searchSuggestionsContainer.appendChild(suggestionsList); container.appendChild(searchSuggestionsContainer); @@ -119,14 +120,14 @@ css: { active: $data === $parent.selectedSuggestion() }'); this._onInputBegin = function(e) { if (!container.contains(e.target)) { - textBox.blur(); + viewModel._focusTextbox = false; viewModel.hideSuggestions(); } }; this._onInputEnd = function(e) { if (container.contains(e.target)) { - textBox.focus(); + viewModel._focusTextbox = true; viewModel.showSuggestions(); } }; @@ -207,7 +208,7 @@ css: { active: $data === $parent.selectedSuggestion() }'); document.removeEventListener('touchstart', this._onInputBegin, true); document.removeEventListener('touchend', this._onInputEnd, true); } - + this._viewModel.destory(); knockout.cleanNode(this._form); knockout.cleanNode(this._searchSuggestionsContainer); this._container.removeChild(this._form); diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index 24497a643100..3a0fd488a301 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -64,8 +64,9 @@ define([ } //>>includeEnd('debug'); - this._geocoderServices = options.geocoderServices; - if (!defined(options.geocoderServices)) { + if (defined(options.geocoderServices)) { + this._geocoderServices = options.geocoderServices; + } else { this._geocoderServices = [ new CartographicGeocoderService(), new BingMapsGeocoderService() @@ -98,21 +99,25 @@ define([ this._isSearchInProgress = false; this._geocodeInProgress = undefined; this._complete = new Event(); - this._suggestions = knockout.observableArray(); - this._selectedSuggestion = knockout.observable(); - this._showSuggestions = knockout.observable(true); + this._suggestions = []; + this._selectedSuggestion = undefined; + this._showSuggestions = true; this._updateCamera = updateCamera; this._adjustSuggestionsScroll = adjustSuggestionsScroll; var that = this; this._suggestionsVisible = knockout.pureComputed(function () { - return that._suggestions().length > 0 && that._showSuggestions(); + var suggestions = knockout.getObservable(that, '_suggestions'); + var suggestionsNotEmpty = suggestions().length > 0; + var showSuggestions = knockout.getObservable(that, '_showSuggestions')(); + return suggestionsNotEmpty && showSuggestions; }); this._searchCommand = createCommand(function() { - if (defined(that._selectedSuggestion())) { - that.activateSuggestion(that._selectedSuggestion()); + that.hideSuggestions(); + if (defined(that._selectedSuggestion)) { + that.activateSuggestion(that._selectedSuggestion); return false; } if (that.isSearchInProgress) { @@ -122,79 +127,29 @@ define([ } }); - this.handleArrowDown = function () { - if (that._suggestions().length === 0) { - return; - } - var numberOfSuggestions = that._suggestions().length; - var currentIndex = that._suggestions().indexOf(that._selectedSuggestion()); - var next = (currentIndex + 1) % numberOfSuggestions; - that._selectedSuggestion(that._suggestions()[next]); - - adjustSuggestionsScroll(this, next); - }; - - this.handleArrowUp = function () { - if (that._suggestions().length === 0) { - return; - } - var numberOfSuggestions = that._suggestions().length; - var next; - var currentIndex = that._suggestions().indexOf(that._selectedSuggestion()); - if (currentIndex === -1 || currentIndex === 0) { - next = numberOfSuggestions - 1; - } else { - next = currentIndex - 1; - } - that._selectedSuggestion(that._suggestions()[next]); - - adjustSuggestionsScroll(this, next); - }; - this.deselectSuggestion = function () { - that._selectedSuggestion(undefined); + that._selectedSuggestion = undefined; }; - this.updateSearchSuggestions = function () { - var query = that.searchText; - - if (hasOnlyWhitespace(query)) { - that._suggestions.splice(0, that._suggestions().length); - return; - } - - that._suggestions.splice(0, that._suggestions().length); - var geocoderServices = that._geocoderServices.filter(function (service) { - return service.autoComplete === true; - }); - - geocoderServices.forEach(function (service) { - service.geocode(query) - .then(function (results) { - results.slice(0, 3).forEach(function(result) { - that._suggestions.push(result); - }); - }); - }); - }; - - this.handleKeyDown = function (data, event) { - var key = event.which; - if (key === 38) { - event.preventDefault(); - } else if (key === 40) { + this.handleKeyDown = function(data, event) { + var downKey = event.key === 'ArrowDown' || event.key === 'Down' || event.keyCode === 40; + var upKey = event.key === 'ArrowUp' || event.key === 'Up' || event.keyCode === 38; + if (downKey || upKey) { event.preventDefault(); } + return true; }; this.handleKeyUp = function (data, event) { - var key = event.which; - if (key === 38) { - that.handleArrowUp(); - } else if (key === 40) { - that.handleArrowDown(); - } else if (key === 13) { + var downKey = event.key === 'ArrowDown' || event.key === 'Down' || event.keyCode === 40; + var upKey = event.key === 'ArrowUp' || event.key === 'Up' || event.keyCode === 38; + var enterKey = event.key === 'Enter' || event.keyCode === 13; + if (upKey) { + handleArrowUp(that); + } else if (downKey) { + handleArrowDown(that); + } else if (enterKey) { that._searchCommand(); } return true; @@ -203,22 +158,22 @@ define([ this.activateSuggestion = function (data) { that._searchText = data.displayName; var destination = data.destination; - that._suggestions.splice(0, that._suggestions().length); + clearSuggestions(that); updateCamera(that, destination); }; this.hideSuggestions = function () { - that._showSuggestions(false); - that._selectedSuggestion(undefined); + that._showSuggestions = false; + that._selectedSuggestion = undefined; }; this.showSuggestions = function () { - that._showSuggestions(true); + that._showSuggestions = true; }; this.handleMouseover = function (data, event) { - if (data !== that._selectedSuggestion()) { - that._selectedSuggestion(data); + if (data !== that._selectedSuggestion) { + that._selectedSuggestion = data; } }; @@ -230,8 +185,15 @@ define([ */ this.keepExpanded = false; - knockout.track(this, ['_searchText', '_isSearchInProgress', 'keepExpanded']); + this._focusTextbox = false; + knockout.track(this, ['_searchText', '_isSearchInProgress', 'keepExpanded', '_suggestions', '_selectedSuggestion', '_showSuggestions', '_focusTextbox']); + + var searchTextObservable = knockout.getObservable(this, '_searchText'); + searchTextObservable.extend({ rateLimit: { timeout: 500, method: "notifyWhenChangesStop" } }); + this._suggestionSubscription = searchTextObservable.subscribe(function() { + updateSearchSuggestions(that); + }); /** * Gets a value indicating whether a search is currently in progress. This property is observable. * @@ -256,6 +218,7 @@ define([ if (this.isSearchInProgress) { return 'Searching...'; } + return this._searchText; }, set : function(value) { @@ -265,7 +228,6 @@ define([ } //>>includeEnd('debug'); this._searchText = value; - this.updateSearchSuggestions(); } }); @@ -381,20 +343,40 @@ define([ get : function() { return this._suggestions; } - }, - - /** - * Indicates whether search suggestions should be visible. True if there are at least 1 suggestion. - * - * @type {Boolean} - */ - suggestionsVisible : { - get : function() { - return this._suggestionsVisible; - } } }); + GeocoderViewModel.prototype.destroy = function() { + this._suggestionSubscription.dispose(); + }; + + function handleArrowUp(viewModel) { + if (viewModel._suggestions.length === 0) { + return; + } + var next; + var currentIndex = viewModel._suggestions.indexOf(viewModel._selectedSuggestion); + if (currentIndex === -1 || currentIndex === 0) { + viewModel._selectedSuggestion = undefined; + return; + } + next = currentIndex - 1; + viewModel._selectedSuggestion = viewModel._suggestions[next]; + adjustSuggestionsScroll(viewModel, next); + } + + function handleArrowDown(viewModel) { + if (viewModel._suggestions.length === 0) { + return; + } + var numberOfSuggestions = viewModel._suggestions.length; + var currentIndex = viewModel._suggestions.indexOf(viewModel._selectedSuggestion); + var next = (currentIndex + 1) % numberOfSuggestions; + viewModel._selectedSuggestion = viewModel._suggestions[next]; + + adjustSuggestionsScroll(viewModel, next); + } + function updateCamera(viewModel, destination) { viewModel._scene.camera.flyTo({ destination : destination, @@ -451,7 +433,7 @@ define([ } function geocode(viewModel, geocoderServices) { - var query = viewModel.searchText; + var query = viewModel._searchText; if (hasOnlyWhitespace(query)) { return; @@ -464,7 +446,7 @@ define([ var geocoderService = geocoderServices[i]; viewModel._isSearchInProgress = true; - viewModel._suggestions.splice(0, viewModel._suggestions().length); + clearSuggestions(viewModel); var geocodePromise = geocoderService.geocode(query); resultPromises.push(geocodePromise); geocodePromise.then(getFirstResult); @@ -529,5 +511,31 @@ define([ return /^\s*$/.test(string); } + function clearSuggestions(viewModel) { + knockout.getObservable(viewModel, '_suggestions').removeAll(); + } + + function updateSearchSuggestions(viewModel) { + var query = viewModel._searchText; + + clearSuggestions(viewModel); + if (hasOnlyWhitespace(query)) { + return; + } + + var geocoderServices = viewModel._geocoderServices.filter(function (service) { + return service.autoComplete === true; + }); + + geocoderServices.forEach(function (service) { + service.geocode(query) + .then(function (results) { + results.slice(0, 3).forEach(function(result) { + viewModel._suggestions.push(result); + }); + }); + }); + } + return GeocoderViewModel; }); From 1b66af9caa7746c12fab4ecbcdd4c38cb5bdc5dc Mon Sep 17 00:00:00 2001 From: hpinkos Date: Tue, 13 Dec 2016 15:13:40 -0500 Subject: [PATCH 222/396] fix specs --- Source/Widgets/Geocoder/Geocoder.js | 2 +- Source/Widgets/Geocoder/GeocoderViewModel.js | 3 ++ Specs/Widgets/Geocoder/GeocoderSpec.js | 29 ++++++++++--------- .../Widgets/Geocoder/GeocoderViewModelSpec.js | 16 +++++----- 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/Source/Widgets/Geocoder/Geocoder.js b/Source/Widgets/Geocoder/Geocoder.js index e2bf4a7c63fc..e96346785ec7 100644 --- a/Source/Widgets/Geocoder/Geocoder.js +++ b/Source/Widgets/Geocoder/Geocoder.js @@ -208,7 +208,7 @@ css: { active: $data === $parent._selectedSuggestion }'); document.removeEventListener('touchstart', this._onInputBegin, true); document.removeEventListener('touchend', this._onInputEnd, true); } - this._viewModel.destory(); + this._viewModel.destroy(); knockout.cleanNode(this._form); knockout.cleanNode(this._searchSuggestionsContainer); this._container.removeChild(this._form); diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index 3a0fd488a301..d25d847572a3 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -104,6 +104,9 @@ define([ this._showSuggestions = true; this._updateCamera = updateCamera; this._adjustSuggestionsScroll = adjustSuggestionsScroll; + this._updateSearchSuggestions = updateSearchSuggestions; + this._handleArrowDown = handleArrowDown; + this._handleArrowUp = handleArrowUp; var that = this; diff --git a/Specs/Widgets/Geocoder/GeocoderSpec.js b/Specs/Widgets/Geocoder/GeocoderSpec.js index cbe522c08808..0b2bde8b24ad 100644 --- a/Specs/Widgets/Geocoder/GeocoderSpec.js +++ b/Specs/Widgets/Geocoder/GeocoderSpec.js @@ -115,20 +115,21 @@ defineSuite([ }); var viewModel = geocoder._viewModel; viewModel._searchText = 'some_text'; - viewModel.updateSearchSuggestions(); - - expect(viewModel._selectedSuggestion()).toEqual(undefined); - viewModel.handleArrowDown(); - expect(viewModel._selectedSuggestion().displayName).toEqual('a'); - viewModel.handleArrowDown(); - viewModel.handleArrowDown(); - expect(viewModel._selectedSuggestion().displayName).toEqual('c'); - viewModel.handleArrowDown(); - expect(viewModel._selectedSuggestion().displayName).toEqual('a'); - viewModel.handleArrowUp(); - expect(viewModel._selectedSuggestion().displayName).toEqual('c'); - viewModel.handleArrowUp(); - expect(viewModel._selectedSuggestion().displayName).toEqual('b'); + viewModel._updateSearchSuggestions(viewModel); + + expect(viewModel._selectedSuggestion).toEqual(undefined); + viewModel._handleArrowDown(viewModel); + expect(viewModel._selectedSuggestion.displayName).toEqual('a'); + viewModel._handleArrowDown(viewModel); + viewModel._handleArrowDown(viewModel); + expect(viewModel._selectedSuggestion.displayName).toEqual('c'); + viewModel._handleArrowDown(viewModel); + expect(viewModel._selectedSuggestion.displayName).toEqual('a'); + viewModel._handleArrowDown(viewModel); + viewModel._handleArrowUp(viewModel); + expect(viewModel._selectedSuggestion.displayName).toEqual('a'); + viewModel._handleArrowUp(viewModel); + expect(viewModel._selectedSuggestion).toBeUndefined(); }); }, 'WebGL'); diff --git a/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js b/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js index d3a270f2d030..442e7dd9ded2 100644 --- a/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js +++ b/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js @@ -5,7 +5,7 @@ defineSuite([ 'Scene/Camera', 'Specs/createScene', 'Specs/pollToPromise', - 'ThirdParty/when', + 'ThirdParty/when' ], function( GeocoderViewModel, Cartesian3, @@ -165,8 +165,8 @@ defineSuite([ geocoderServices : [customGeocoderOptions] }); geocoder._searchText = 'some_text'; - geocoder.updateSearchSuggestions(); - expect(geocoder._suggestions().length).toEqual(2); + geocoder._updateSearchSuggestions(geocoder); + expect(geocoder._suggestions.length).toEqual(2); }); it('update search suggestions results in empty list if the query is empty', function() { @@ -176,8 +176,8 @@ defineSuite([ }); geocoder._searchText = ''; spyOn(geocoder, '_adjustSuggestionsScroll'); - geocoder.updateSearchSuggestions(); - expect(geocoder._suggestions().length).toEqual(0); + geocoder._updateSearchSuggestions(geocoder); + expect(geocoder._suggestions.length).toEqual(0); }); it('can activate selected search suggestion', function () { @@ -189,7 +189,7 @@ defineSuite([ spyOn(geocoder, '_adjustSuggestionsScroll'); var suggestion = {displayName: 'a', destination: {west: 0.0, east: 0.1, north: 0.1, south: -0.1}}; - geocoder._selectedSuggestion(suggestion); + geocoder._selectedSuggestion = suggestion; geocoder.activateSuggestion(suggestion); expect(geocoder._searchText).toEqual('a'); }); @@ -214,8 +214,8 @@ defineSuite([ geocoder._searchText = 'sthsnth'; // an empty query will prevent geocoding spyOn(geocoder, '_updateCamera'); spyOn(geocoder, '_adjustSuggestionsScroll'); - geocoder.updateSearchSuggestions(); - expect(geocoder._suggestions().length).toEqual(geocoderResults1.length + geocoderResults2.length); + geocoder._updateSearchSuggestions(geocoder); + expect(geocoder._suggestions.length).toEqual(geocoderResults1.length + geocoderResults2.length); }); }, 'WebGL'); From a2660db14eb0dd3903e7ea231d5118ed5cffc628 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Tue, 13 Dec 2016 15:18:38 -0500 Subject: [PATCH 223/396] Tweak doc --- Source/Core/WebGLConstants.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Source/Core/WebGLConstants.js b/Source/Core/WebGLConstants.js index 813108fa2404..0281f4c0dff9 100644 --- a/Source/Core/WebGLConstants.js +++ b/Source/Core/WebGLConstants.js @@ -1,7 +1,4 @@ /*global define*/ -/** - * @module WebGLConstants - */ define([ '../Core/freezeObject' ], function( @@ -17,9 +14,7 @@ define([ * and [WebGL 2.0]{@link https://www.khronos.org/registry/webgl/specs/latest/2.0/} * specifications. * - * @alias WebGLConstants - * @readonly - * @enum {Number} + * @exports WebGLConstants */ var WebGLConstants = { DEPTH_BUFFER_BIT : 0x00000100, From 0c359eeb39b36f6589835e30b5e695ff98508f67 Mon Sep 17 00:00:00 2001 From: Hannah Date: Tue, 13 Dec 2016 15:19:09 -0500 Subject: [PATCH 224/396] Update CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 1d754f687786..26825ceb4730 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,7 @@ Change Log * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) * Fixed `Rectangle.union` to correctly account for rectangles that cross the IDL [#4732](https://github.com/AnalyticalGraphicsInc/cesium/pull/4732). * Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) +* Fixed default Mapbox token and added a watermark to notify users that they need to sign up for their own token. ### 1.28 - 2016-12-01 From 244cc523c9bc6cf71d56b574dd2254858d63b211 Mon Sep 17 00:00:00 2001 From: "duvi.fn" Date: Tue, 13 Dec 2016 22:26:14 +0200 Subject: [PATCH 225/396] remove unused dependency, change sqauredAOverSquaredB to sqauredXOverSquaredZ --- Source/Core/Ellipsoid.js | 20 ++++++++------------ Specs/Core/EllipsoidSpec.js | 6 +++--- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/Source/Core/Ellipsoid.js b/Source/Core/Ellipsoid.js index bef67a517e6d..1e91f1d78428 100644 --- a/Source/Core/Ellipsoid.js +++ b/Source/Core/Ellipsoid.js @@ -8,7 +8,6 @@ define([ './DeveloperError', './freezeObject', './Math', - './Ray', './scaleToGeodeticSurface' ], function( Cartesian3, @@ -19,7 +18,6 @@ define([ DeveloperError, freezeObject, CesiumMath, - Ray, scaleToGeodeticSurface) { 'use strict'; @@ -59,7 +57,7 @@ define([ ellipsoid._centerToleranceSquared = CesiumMath.EPSILON1; if (ellipsoid._radiiSquared.z !== 0){ - ellipsoid._sqauredAOverSquaredB = ellipsoid._radiiSquared.x / ellipsoid._radiiSquared.z; + ellipsoid._sqauredXOverSquaredZ = ellipsoid._radiiSquared.x / ellipsoid._radiiSquared.z; } } @@ -92,7 +90,7 @@ define([ this._minimumRadius = undefined; this._maximumRadius = undefined; this._centerToleranceSquared = undefined; - this._sqauredAOverSquaredB = undefined; + this._sqauredXOverSquaredZ = undefined; initialize(this, x, y, z); } @@ -622,7 +620,7 @@ define([ * @param {Number} [buffer = 0.0] A buffer to subtract from the ellipsoid size when checking if the point is inside the ellipsoid. * In earth case, with common earth datums, there is no need for this buffer since the intersection point is always (relatively) very close to the center. * In WGS84 datum, intersection point is at max z = +-42841.31151331382 (0.673% of z-axis). - * Intersection point could be outside the ellipsoid if the ratio of MajorAxis / MinorAxis is bigger than the square root of 2 + * Intersection point could be outside the ellipsoid if the ratio of MajorAxis / AxisOfRotation is bigger than the square root of 2 * @param {Cartesian} [result] The cartesian to which to copy the result, or undefined to create and * return a new instance. * @returns {Cartesian | undefined} the intersection point if it's inside the ellipsoid, undefined otherwise @@ -634,23 +632,21 @@ define([ Ellipsoid.prototype.getSurfaceNormalIntersectionWithZAxis = function(position, buffer, result) { - var ellipsoid = this; - //>>includeStart('debug', pragmas.debug); if (!defined(position)) { throw new DeveloperError('position is required.'); } - if (!CesiumMath.equalsEpsilon(ellipsoid.radii.x, ellipsoid.radii.y, CesiumMath.EPSILON15)) { + if (!CesiumMath.equalsEpsilon(this._radii.x, this._radii.y, CesiumMath.EPSILON15)) { throw new DeveloperError('Ellipsoid must be an ellipsoid of revolution (radii.x == radii.y)'); } - if (ellipsoid.radii.z === 0) { + if (this._radii.z === 0) { throw new DeveloperError('Ellipsoid.radii.z must be greater than 0'); } //>>includeEnd('debug'); buffer = defaultValue(buffer, 0.0); - var sqauredAOverSquaredB = ellipsoid._sqauredAOverSquaredB; + var sqauredXOverSquaredZ = this._sqauredXOverSquaredZ; if (!defined(result)){ result = new Cartesian3(); @@ -658,8 +654,8 @@ define([ result.x = 0; result.y = 0; - result.z = position.z * (1 - sqauredAOverSquaredB); - if (Math.abs(result.z) >= ellipsoid.radii.z - buffer){ + result.z = position.z * (1 - sqauredXOverSquaredZ); + if (Math.abs(result.z) >= this._radii.z - buffer){ return undefined; } diff --git a/Specs/Core/EllipsoidSpec.js b/Specs/Core/EllipsoidSpec.js index cc95635d46eb..dea3c73a56de 100644 --- a/Specs/Core/EllipsoidSpec.js +++ b/Specs/Core/EllipsoidSpec.js @@ -536,11 +536,11 @@ defineSuite([ }); - it('ellipsoid is initialized with _sqauredAOverSquaredB property', function() { + it('ellipsoid is initialized with _sqauredXOverSquaredZ property', function() { var ellipsoid = new Ellipsoid(4 , 4 , 3); - var squaredAOverB = ellipsoid.radiiSquared.x / ellipsoid.radiiSquared.z; - expect(ellipsoid._sqauredAOverSquaredB).toEqual(squaredAOverB); + var sqauredXOverSquaredZ = ellipsoid.radiiSquared.x / ellipsoid.radiiSquared.z; + expect(ellipsoid._sqauredXOverSquaredZ).toEqual(sqauredXOverSquaredZ); }); createPackableSpecs(Ellipsoid, Ellipsoid.WGS84, [Ellipsoid.WGS84.radii.x, Ellipsoid.WGS84.radii.y, Ellipsoid.WGS84.radii.z]); From 0a4aa31720be9d02846a910b7cf9295bf9cd102e Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Tue, 13 Dec 2016 15:43:34 -0500 Subject: [PATCH 226/396] Tabs to spaces --- Source/DataSources/EntityCluster.js | 66 ++++++++++++++--------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/Source/DataSources/EntityCluster.js b/Source/DataSources/EntityCluster.js index b926038278a5..fc13807bf1a1 100644 --- a/Source/DataSources/EntityCluster.js +++ b/Source/DataSources/EntityCluster.js @@ -208,7 +208,7 @@ define([ var pointCollection = entityCluster._pointCollection; if ((!defined(labelCollection) && !defined(billboardCollection) && !defined(pointCollection)) || - (!entityCluster._clusterBillboards && !entityCluster._clusterLabels && !entityCluster._clusterPoints)) { + (!entityCluster._clusterBillboards && !entityCluster._clusterLabels && !entityCluster._clusterPoints)) { return; } @@ -256,10 +256,10 @@ define([ getScreenSpacePositions(labelCollection, points, scene, occluder, entityCluster); } if (entityCluster._clusterBillboards) { - getScreenSpacePositions(billboardCollection, points, scene, occluder, entityCluster); + getScreenSpacePositions(billboardCollection, points, scene, occluder, entityCluster); } if (entityCluster._clusterPoints) { - getScreenSpacePositions(pointCollection, points, scene, occluder, entityCluster); + getScreenSpacePositions(pointCollection, points, scene, occluder, entityCluster); } var i; @@ -471,48 +471,48 @@ define([ return this._clusterEvent; } }, - /** + /** * Gets or sets whether clustering billboard entities is enabled. * @memberof EntityCluster.prototype * @type {Boolean} */ - clusterBillboards : { - get : function() { - return this._clusterBillboards; - }, - set : function(value) { - this._clusterDirty = this._clusterDirty || value !== this._clusterBillboards; - this._clusterBillboards = value; - } - }, - /** + clusterBillboards : { + get : function() { + return this._clusterBillboards; + }, + set : function(value) { + this._clusterDirty = this._clusterDirty || value !== this._clusterBillboards; + this._clusterBillboards = value; + } + }, + /** * Gets or sets whether clustering labels entities is enabled. * @memberof EntityCluster.prototype * @type {Boolean} */ - clusterLabels : { - get : function() { - return this._clusterLabels; - }, - set : function(value) { - this._clusterDirty = this._clusterDirty || value !== this._clusterLabels; - this._clusterLabels = value; - } - }, - /** + clusterLabels : { + get : function() { + return this._clusterLabels; + }, + set : function(value) { + this._clusterDirty = this._clusterDirty || value !== this._clusterLabels; + this._clusterLabels = value; + } + }, + /** * Gets or sets whether clustering point entities is enabled. * @memberof EntityCluster.prototype * @type {Boolean} */ - clusterPoints : { - get : function() { - return this._clusterPoints; - }, - set : function(value) { - this._clusterDirty = this._clusterDirty || value !== this._clusterPoints; - this._clusterPoints = value; - } - } + clusterPoints : { + get : function() { + return this._clusterPoints; + }, + set : function(value) { + this._clusterDirty = this._clusterDirty || value !== this._clusterPoints; + this._clusterPoints = value; + } + } }); function createGetEntity(collectionProperty, CollectionConstructor, unusedIndicesProperty, entityIndexProperty) { From f7604c0614de2a2bc14b8b919ae3697b980f1b85 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Tue, 13 Dec 2016 16:09:56 -0500 Subject: [PATCH 227/396] Added divideComponents --- CHANGES.md | 1 + Source/Core/Cartesian2.js | 26 ++++++++++++++++++++++++ Source/Core/Cartesian3.js | 27 +++++++++++++++++++++++++ Source/Core/Cartesian4.js | 28 ++++++++++++++++++++++++++ Specs/Core/Cartesian2Spec.js | 39 ++++++++++++++++++++++++++++++++++++ Specs/Core/Cartesian3Spec.js | 39 ++++++++++++++++++++++++++++++++++++ Specs/Core/Cartesian4Spec.js | 39 ++++++++++++++++++++++++++++++++++++ 7 files changed, 199 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 1d754f687786..6f781ac76d96 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,7 @@ Change Log * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) * Fixed `Rectangle.union` to correctly account for rectangles that cross the IDL [#4732](https://github.com/AnalyticalGraphicsInc/cesium/pull/4732). * Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) +* Added `divideComponents` function to `Cartesian2`, `Cartesian3`, and `Cartesian4`. ### 1.28 - 2016-12-01 diff --git a/Source/Core/Cartesian2.js b/Source/Core/Cartesian2.js index 0b4927d01d54..92e6d6715b8f 100644 --- a/Source/Core/Cartesian2.js +++ b/Source/Core/Cartesian2.js @@ -470,6 +470,32 @@ define([ return result; }; + /** + * Computes the componentwise quotient of two Cartesians. + * + * @param {Cartesian2} left The first Cartesian. + * @param {Cartesian2} right The second Cartesian. + * @param {Cartesian2} result The object onto which to store the result. + * @returns {Cartesian2} The modified result parameter. + */ + Cartesian2.divideComponents = function(left, right, result) { + //>>includeStart('debug', pragmas.debug); + if (!defined(left)) { + throw new DeveloperError('left is required'); + } + if (!defined(right)) { + throw new DeveloperError('right is required'); + } + if (!defined(result)) { + throw new DeveloperError('result is required'); + } + //>>includeEnd('debug'); + + result.x = left.x / right.x; + result.y = left.y / right.y; + return result; + }; + /** * Computes the componentwise sum of two Cartesians. * diff --git a/Source/Core/Cartesian3.js b/Source/Core/Cartesian3.js index a2e1f2f268f7..0c8325d43cab 100644 --- a/Source/Core/Cartesian3.js +++ b/Source/Core/Cartesian3.js @@ -510,6 +510,33 @@ define([ return result; }; + /** + * Computes the componentwise quotient of two Cartesians. + * + * @param {Cartesian3} left The first Cartesian. + * @param {Cartesian3} right The second Cartesian. + * @param {Cartesian3} result The object onto which to store the result. + * @returns {Cartesian3} The modified result parameter. + */ + Cartesian3.divideComponents = function(left, right, result) { + //>>includeStart('debug', pragmas.debug); + if (!defined(left)) { + throw new DeveloperError('left is required'); + } + if (!defined(right)) { + throw new DeveloperError('right is required'); + } + if (!defined(result)) { + throw new DeveloperError('result is required'); + } + //>>includeEnd('debug'); + + result.x = left.x / right.x; + result.y = left.y / right.y; + result.z = left.z / right.z; + return result; + }; + /** * Computes the componentwise sum of two Cartesians. * diff --git a/Source/Core/Cartesian4.js b/Source/Core/Cartesian4.js index f9ca0bddc60d..33627bf01915 100644 --- a/Source/Core/Cartesian4.js +++ b/Source/Core/Cartesian4.js @@ -513,6 +513,34 @@ define([ return result; }; + /** + * Computes the componentwise quotient of two Cartesians. + * + * @param {Cartesian4} left The first Cartesian. + * @param {Cartesian4} right The second Cartesian. + * @param {Cartesian4} result The object onto which to store the result. + * @returns {Cartesian4} The modified result parameter. + */ + Cartesian4.divideComponents = function(left, right, result) { + //>>includeStart('debug', pragmas.debug); + if (!defined(left)) { + throw new DeveloperError('left is required'); + } + if (!defined(right)) { + throw new DeveloperError('right is required'); + } + if (!defined(result)) { + throw new DeveloperError('result is required'); + } + //>>includeEnd('debug'); + + result.x = left.x / right.x; + result.y = left.y / right.y; + result.z = left.z / right.z; + result.w = left.w / right.w; + return result; + }; + /** * Computes the componentwise sum of two Cartesians. * diff --git a/Specs/Core/Cartesian2Spec.js b/Specs/Core/Cartesian2Spec.js index 4087a64e6959..a2af6188b0e1 100644 --- a/Specs/Core/Cartesian2Spec.js +++ b/Specs/Core/Cartesian2Spec.js @@ -328,6 +328,25 @@ defineSuite([ expect(left).toEqual(expectedResult); }); + it('divideComponents works with a result parameter', function() { + var left = new Cartesian2(2.0, 3.0); + var right = new Cartesian2(4.0, 5.0); + var result = new Cartesian2(); + var expectedResult = new Cartesian2(0.5, 0.6); + var returnedResult = Cartesian2.divideComponents(left, right, result); + expect(result).toBe(returnedResult); + expect(result).toEqual(expectedResult); + }); + + it('divideComponents works with a result parameter that is an input parameter', function() { + var left = new Cartesian2(2.0, 3.0); + var right = new Cartesian2(4.0, 5.0); + var expectedResult = new Cartesian2(0.5, 0.6); + var returnedResult = Cartesian2.divideComponents(left, right, left); + expect(left).toBe(returnedResult); + expect(left).toEqual(expectedResult); + }); + it('dot', function() { var left = new Cartesian2(2.0, 3.0); var right = new Cartesian2(4.0, 5.0); @@ -614,6 +633,20 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('divideComponents throw with no left parameter', function() { + var right = new Cartesian2(4.0, 5.0); + expect(function() { + Cartesian2.divideComponents(undefined, right); + }).toThrowDeveloperError(); + }); + + it('divideComponents throw with no right parameter', function() { + var left = new Cartesian2(4.0, 5.0); + expect(function() { + Cartesian2.divideComponents(left, undefined); + }).toThrowDeveloperError(); + }); + it('add throws with no left parameter', function() { expect(function() { Cartesian2.add(undefined, new Cartesian2()); @@ -761,6 +794,12 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('divideComponents throws with no result', function() { + expect(function() { + Cartesian2.divideComponents(new Cartesian2(), new Cartesian2()); + }).toThrowDeveloperError(); + }); + it('add throws with no result', function() { expect(function() { Cartesian2.add(new Cartesian2(), new Cartesian2()); diff --git a/Specs/Core/Cartesian3Spec.js b/Specs/Core/Cartesian3Spec.js index 188e6ee724a2..854b0e62a1b7 100644 --- a/Specs/Core/Cartesian3Spec.js +++ b/Specs/Core/Cartesian3Spec.js @@ -400,6 +400,25 @@ defineSuite([ expect(left).toEqual(expectedResult); }); + it('divideComponents works with a result parameter', function() { + var left = new Cartesian3(2.0, 3.0, 6.0); + var right = new Cartesian3(4.0, 5.0, 8.0); + var result = new Cartesian3(); + var expectedResult = new Cartesian3(0.5, 0.6, 0.75); + var returnedResult = Cartesian3.divideComponents(left, right, result); + expect(result).toBe(returnedResult); + expect(result).toEqual(expectedResult); + }); + + it('divideComponents works with a result parameter that is an input parameter', function() { + var left = new Cartesian3(2.0, 3.0, 6.0); + var right = new Cartesian3(4.0, 5.0, 8.0); + var expectedResult = new Cartesian3(0.5, 0.6, 0.75); + var returnedResult = Cartesian3.divideComponents(left, right, left); + expect(left).toBe(returnedResult); + expect(left).toEqual(expectedResult); + }); + it('dot', function() { var left = new Cartesian3(2.0, 3.0, 6.0); var right = new Cartesian3(4.0, 5.0, 7.0); @@ -742,6 +761,20 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('divideComponents throw with no left parameter', function() { + var right = new Cartesian3(4.0, 5.0, 6.0); + expect(function() { + Cartesian3.divideComponents(undefined, right); + }).toThrowDeveloperError(); + }); + + it('divideComponents throw with no right parameter', function() { + var left = new Cartesian3(4.0, 5.0, 6.0); + expect(function() { + Cartesian3.divideComponents(left, undefined); + }).toThrowDeveloperError(); + }); + it('dot throws with no right parameter', function() { expect(function() { Cartesian3.dot(new Cartesian3(), undefined); @@ -1149,6 +1182,12 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('divideComponents throws with no result', function() { + expect(function() { + Cartesian3.divideComponents(new Cartesian3(), new Cartesian3()); + }).toThrowDeveloperError(); + }); + it('add throws with no result', function() { expect(function() { Cartesian3.add(new Cartesian3(), new Cartesian3()); diff --git a/Specs/Core/Cartesian4Spec.js b/Specs/Core/Cartesian4Spec.js index 4e9cbb91737b..a2e877a6aef7 100644 --- a/Specs/Core/Cartesian4Spec.js +++ b/Specs/Core/Cartesian4Spec.js @@ -464,6 +464,25 @@ defineSuite([ expect(left).toEqual(expectedResult); }); + it('divideComponents works with a result parameter', function() { + var left = new Cartesian4(2.0, 3.0, 6.0, 15.0); + var right = new Cartesian4(4.0, 5.0, 8.0, 2.0); + var result = new Cartesian4(); + var expectedResult = new Cartesian4(0.5, 0.6, 0.75, 7.5); + var returnedResult = Cartesian4.divideComponents(left, right, result); + expect(result).toBe(returnedResult); + expect(result).toEqual(expectedResult); + }); + + it('divideComponents works with a result parameter that is an input parameter', function() { + var left = new Cartesian4(2.0, 3.0, 6.0, 15.0); + var right = new Cartesian4(4.0, 5.0, 8.0, 2.0); + var expectedResult = new Cartesian4(0.5, 0.6, 0.75, 7.5); + var returnedResult = Cartesian4.divideComponents(left, right, left); + expect(left).toBe(returnedResult); + expect(left).toEqual(expectedResult); + }); + it('dot', function() { var left = new Cartesian4(2.0, 3.0, 6.0, 8.0); var right = new Cartesian4(4.0, 5.0, 7.0, 9.0); @@ -740,6 +759,20 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('divideComponents throw with no left parameter', function() { + var right = new Cartesian4(4.0, 5.0, 6.0, 7.0); + expect(function() { + Cartesian4.divideComponents(undefined, right); + }).toThrowDeveloperError(); + }); + + it('divideComponents throw with no right parameter', function() { + var left = new Cartesian4(4.0, 5.0, 6.0, 7.0); + expect(function() { + Cartesian4.divideComponents(left, undefined); + }).toThrowDeveloperError(); + }); + it('dot throws with no right parameter', function() { expect(function() { Cartesian4.dot(new Cartesian4(), undefined); @@ -866,6 +899,12 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('divideComponents throws with no result', function() { + expect(function() { + Cartesian4.divideComponents(new Cartesian4(), new Cartesian4()); + }).toThrowDeveloperError(); + }); + it('add throws with no result', function() { expect(function() { Cartesian4.add(new Cartesian4(), new Cartesian4()); From 9d97ca304b44b050e35fc563fb7602184fc45046 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Tue, 13 Dec 2016 16:15:14 -0500 Subject: [PATCH 228/396] Updated CHANGES.md --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 85e27cfb9baf..3042d8fbdb46 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,7 +10,7 @@ Change Log * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) * Fixed `Rectangle.union` to correctly account for rectangles that cross the IDL [#4732](https://github.com/AnalyticalGraphicsInc/cesium/pull/4732). * Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) -* Added `divideComponents` function to `Cartesian2`, `Cartesian3`, and `Cartesian4`. +* Added `divideComponents` function to `Cartesian2`, `Cartesian3`, and `Cartesian4`. [#4750](https://github.com/AnalyticalGraphicsInc/cesium/pull/4750) * Added `WebGLConstants` enum. Previously, this was part of the private Renderer API. [#4731](https://github.com/AnalyticalGraphicsInc/cesium/pull/4731) * Fixed an bug that caused `GroundPrimitive` to render incorrectly on systems without the `WEBGL_depth_texture` extension. [#4747](https://github.com/AnalyticalGraphicsInc/cesium/pull/4747) * Fixed default Mapbox token and added a watermark to notify users that they need to sign up for their own token. From a952cdc9f13e89b01222ea718e722f68775664dc Mon Sep 17 00:00:00 2001 From: hpinkos Date: Tue, 13 Dec 2016 17:07:16 -0500 Subject: [PATCH 229/396] fix specs --- Source/Core/CircleGeometry.js | 10 +++++--- Source/Core/EllipseGeometry.js | 26 +++++++++++++------ Source/Core/GeometryPipeline.js | 39 +++++++++++++++++++++++------ Source/Core/PolygonGeometry.js | 4 +-- Source/Core/RectangleGeometry.js | 3 ++- Source/Scene/GroundPrimitive.js | 4 +-- Specs/Core/CircleGeometrySpec.js | 2 +- Specs/Core/CorridorGeometrySpec.js | 2 +- Specs/Core/EllipseGeometrySpec.js | 2 +- Specs/Core/PolygonGeometrySpec.js | 2 +- Specs/Core/RectangleGeometrySpec.js | 2 +- 11 files changed, 69 insertions(+), 27 deletions(-) diff --git a/Source/Core/CircleGeometry.js b/Source/Core/CircleGeometry.js index 8aa557d4c33b..1d938bb2d64e 100644 --- a/Source/Core/CircleGeometry.js +++ b/Source/Core/CircleGeometry.js @@ -68,7 +68,8 @@ define([ extrudedHeight : options.extrudedHeight, granularity : options.granularity, vertexFormat : options.vertexFormat, - stRotation : options.stRotation + stRotation : options.stRotation, + shadowVolume: options.shadowVolume }; this._ellipseGeometry = new EllipseGeometry(ellipseGeometryOptions); this._workerName = 'createCircleGeometry'; @@ -113,7 +114,8 @@ define([ vertexFormat : new VertexFormat(), stRotation : undefined, semiMajorAxis : undefined, - semiMinorAxis : undefined + semiMinorAxis : undefined, + shadowVolume: undefined }; /** @@ -133,6 +135,7 @@ define([ scratchOptions.granularity = ellipseGeometry._granularity; scratchOptions.vertexFormat = VertexFormat.clone(ellipseGeometry._vertexFormat, scratchOptions.vertexFormat); scratchOptions.stRotation = ellipseGeometry._stRotation; + scratchOptions.shadowVolume = ellipseGeometry._shadowVolume; if (!defined(result)) { scratchOptions.radius = ellipseGeometry._semiMajorAxis; @@ -173,7 +176,8 @@ define([ granularity : granularity, extrudedHeight : minHeight, height : maxHeight, - vertexFormat : VertexFormat.POSITION_ONLY + vertexFormat : VertexFormat.POSITION_ONLY, + shadowVolume: true }); }; diff --git a/Source/Core/EllipseGeometry.js b/Source/Core/EllipseGeometry.js index 3020da7a2cc0..34fd0e3503ed 100644 --- a/Source/Core/EllipseGeometry.js +++ b/Source/Core/EllipseGeometry.js @@ -248,6 +248,7 @@ define([ values : extrudeNormals }); } + return attributes; } @@ -390,6 +391,9 @@ define([ var tangents = (vertexFormat.tangent) ? new Float32Array(size * 3) : undefined; var binormals = (vertexFormat.binormal) ? new Float32Array(size * 3) : undefined; + var shadowVolume = options.shadowVolume; + var extrudeNormals = (shadowVolume) ? new Float32Array(size * 3) : undefined; + var textureCoordIndex = 0; // Raise positions to a height above the ellipsoid and compute the @@ -440,6 +444,13 @@ define([ position = ellipsoid.scaleToGeodeticSurface(position, position); extrudedPosition = Cartesian3.clone(position, scratchCartesian2); normal = ellipsoid.geodeticSurfaceNormal(position, normal); + + if (shadowVolume) { + extrudeNormals[i + length] = -normal.x; + extrudeNormals[i1 + length] = -normal.y; + extrudeNormals[i2 + length] = -normal.z; + } + var scaledNormal = Cartesian3.multiplyByScalar(normal, height, scratchCartesian4); position = Cartesian3.add(position, scaledNormal, position); scaledNormal = Cartesian3.multiplyByScalar(normal, extrudedHeight, scaledNormal); @@ -547,6 +558,14 @@ define([ }); } + if (shadowVolume) { + attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : extrudeNormals + }); + } + return attributes; } @@ -610,13 +629,6 @@ define([ }); var wallAttributes = computeWallAttributes(outerPositions, options); - if (options.shadowVolume) { - wallAttributes.extrudeDirection = new GeometryAttribute({ - componentDatatype: ComponentDatatype.FLOAT, - componentsPerAttribute: 3, - values: topBottomAttributes.extrudeDirection.slice() - }); - } indices = computeWallIndices(outerPositions); var wallIndices = IndexDatatype.createTypedArray(outerPositions.length * 2 / 3, indices); diff --git a/Source/Core/GeometryPipeline.js b/Source/Core/GeometryPipeline.js index e681e1543112..448396bf69b1 100644 --- a/Source/Core/GeometryPipeline.js +++ b/Source/Core/GeometryPipeline.js @@ -282,7 +282,8 @@ define([ 'binormal', 'tangent', - 'extrudeDirection', //TODO: do I need this? + // For shadow volumes + 'extrudeDirection', // From compressing texture coordinates and normals 'compressedAttributes' @@ -1879,8 +1880,8 @@ define([ var s1Scratch = new Cartesian2(); var s2Scratch = new Cartesian2(); - function computeTriangleAttributes(i0, i1, i2, point, positions, normals, binormals, tangents, texCoords, currentAttributes, insertedIndex) { - if (!defined(normals) && !defined(binormals) && !defined(tangents) && !defined(texCoords)) { + function computeTriangleAttributes(i0, i1, i2, point, positions, normals, binormals, tangents, texCoords, extrudeDirections, currentAttributes, insertedIndex) { + if (!defined(normals) && !defined(binormals) && !defined(tangents) && !defined(texCoords) && !defined(extrudeDirections)) { return; } @@ -1905,6 +1906,29 @@ define([ Cartesian3.pack(normal, currentAttributes.normal.values, insertedIndex * 3); } + if (defined(extrudeDirections)) { + var d0 = Cartesian3.fromArray(extrudeDirections, i0 * 3, p0Scratch); + var d1 = Cartesian3.fromArray(extrudeDirections, i1 * 3, p1Scratch); + var d2 = Cartesian3.fromArray(extrudeDirections, i2 * 3, p2Scratch); + + Cartesian3.multiplyByScalar(d0, coords.x, d0); + Cartesian3.multiplyByScalar(d1, coords.y, d1); + Cartesian3.multiplyByScalar(d2, coords.z, d2); + + var direction; + if (!Cartesian3.equals(d0, Cartesian3.ZERO) || !Cartesian3.equals(d1, Cartesian3.ZERO) || !Cartesian3.equals(d2, Cartesian3.ZERO)) { + direction = Cartesian3.add(d0, d1, d0); + Cartesian3.add(direction, d2, direction); + Cartesian3.normalize(direction, direction); + } else { + direction = p0Scratch; + direction.x = 0; + direction.y = 0; + direction.z = 0; + } + Cartesian3.pack(direction, currentAttributes.extrudeDirection.values, insertedIndex * 3); + } + if (defined(binormals)) { var b0 = Cartesian3.fromArray(binormals, i0 * 3, p0Scratch); var b1 = Cartesian3.fromArray(binormals, i1 * 3, p1Scratch); @@ -1984,6 +2008,7 @@ define([ var binormals = (defined(attributes.binormal)) ? attributes.binormal.values : undefined; var tangents = (defined(attributes.tangent)) ? attributes.tangent.values : undefined; var texCoords = (defined(attributes.st)) ? attributes.st.values : undefined; + var extrudeDirections = (defined(attributes.extrudeDirection)) ? attributes.extrudeDirection.values : undefined; var indices = geometry.indices; var eastGeometry = copyGeometryForSplit(geometry); @@ -2037,7 +2062,7 @@ define([ } insertedIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, resultIndex < 3 ? i + resultIndex : -1, point); - computeTriangleAttributes(i0, i1, i2, point, positions, normals, binormals, tangents, texCoords, currentAttributes, insertedIndex); + computeTriangleAttributes(i0, i1, i2, point, positions, normals, binormals, tangents, texCoords, extrudeDirections, currentAttributes, insertedIndex); } } else { if (defined(result)) { @@ -2057,13 +2082,13 @@ define([ } insertedIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, i, p0); - computeTriangleAttributes(i0, i1, i2, p0, positions, normals, binormals, tangents, texCoords, currentAttributes, insertedIndex); + computeTriangleAttributes(i0, i1, i2, p0, positions, normals, binormals, tangents, texCoords, extrudeDirections, currentAttributes, insertedIndex); insertedIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, i + 1, p1); - computeTriangleAttributes(i0, i1, i2, p1, positions, normals, binormals, tangents, texCoords, currentAttributes, insertedIndex); + computeTriangleAttributes(i0, i1, i2, p1, positions, normals, binormals, tangents, texCoords, extrudeDirections, currentAttributes, insertedIndex); insertedIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, i + 2, p2); - computeTriangleAttributes(i0, i1, i2, p2, positions, normals, binormals, tangents, texCoords, currentAttributes, insertedIndex); + computeTriangleAttributes(i0, i1, i2, p2, positions, normals, binormals, tangents, texCoords, extrudeDirections, currentAttributes, insertedIndex); } } diff --git a/Source/Core/PolygonGeometry.js b/Source/Core/PolygonGeometry.js index d1bb0a542c4b..44c569bde91d 100644 --- a/Source/Core/PolygonGeometry.js +++ b/Source/Core/PolygonGeometry.js @@ -123,7 +123,8 @@ define([ function computeAttributes(options) { var vertexFormat = options.vertexFormat; var geometry = options.geometry; - if (vertexFormat.st || vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal) { + var shadowVolume = options.shadowVolume; + if (vertexFormat.st || vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal || shadowVolume) { // PERFORMANCE_IDEA: Compute before subdivision, then just interpolate during subdivision. // PERFORMANCE_IDEA: Compute with createGeometryFromPositions() for fast path when there's no holes. var boundingRectangle = options.boundingRectangle; @@ -134,7 +135,6 @@ define([ var top = options.top || wall; var bottom = options.bottom || wall; var perPositionHeight = options.perPositionHeight; - var shadowVolume = options.shadowVolume; var origin = appendTextureCoordinatesOrigin; origin.x = boundingRectangle.x; diff --git a/Source/Core/RectangleGeometry.js b/Source/Core/RectangleGeometry.js index 8b4d18e94fbf..6d2247715f59 100644 --- a/Source/Core/RectangleGeometry.js +++ b/Source/Core/RectangleGeometry.js @@ -668,11 +668,12 @@ define([ } //>>includeEnd('debug'); + var rotation = defaultValue(options.rotation, 0.0); this._rectangle = rectangle; this._granularity = defaultValue(options.granularity, CesiumMath.RADIANS_PER_DEGREE); this._ellipsoid = Ellipsoid.clone(defaultValue(options.ellipsoid, Ellipsoid.WGS84)); this._surfaceHeight = defaultValue(options.height, 0.0); - this._rotation = defaultValue(options.rotation, 0.0); + this._rotation = rotation; this._stRotation = defaultValue(options.stRotation, 0.0); this._vertexFormat = VertexFormat.clone(defaultValue(options.vertexFormat, VertexFormat.DEFAULT)); this._extrudedHeight = defaultValue(options.extrudedHeight, 0.0); diff --git a/Source/Scene/GroundPrimitive.js b/Source/Scene/GroundPrimitive.js index 278e5a2f1885..a8013a2d339d 100644 --- a/Source/Scene/GroundPrimitive.js +++ b/Source/Scene/GroundPrimitive.js @@ -217,7 +217,7 @@ define([ this._uniformMap = { u_globeMinimumAltitude: function() { - return 1100.0; //TODO verify + return 33000.0; } }; @@ -256,7 +256,7 @@ define([ releaseGeometryInstances : defaultValue(options.releaseGeometryInstances, true), allowPicking : defaultValue(options.allowPicking, true), asynchronous : defaultValue(options.asynchronous, true), - compressVertices : false,//defaultValue(options.compressVertices, true), + compressVertices : defaultValue(options.compressVertices, true), _readOnlyInstanceAttributes : readOnlyAttributes, _createRenderStatesFunction : undefined, _createShaderProgramFunction : undefined, diff --git a/Specs/Core/CircleGeometrySpec.js b/Specs/Core/CircleGeometrySpec.js index d41fc2a3c42a..ec7fdac5fb63 100644 --- a/Specs/Core/CircleGeometrySpec.js +++ b/Specs/Core/CircleGeometrySpec.js @@ -178,6 +178,6 @@ defineSuite([ radius : 1.0, stRotation : CesiumMath.PI_OVER_TWO }); - var packedInstance = [center.x, center.y, center.z, ellipsoid.radii.x, ellipsoid.radii.y, ellipsoid.radii.z, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, rectangle.west, rectangle.south, rectangle.east, rectangle.north, 1.0, 1.0, 0.0, CesiumMath.PI_OVER_TWO, 0.0, 0.1, 0.0, 0.0]; + var packedInstance = [center.x, center.y, center.z, ellipsoid.radii.x, ellipsoid.radii.y, ellipsoid.radii.z, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, rectangle.west, rectangle.south, rectangle.east, rectangle.north, 1.0, 1.0, 0.0, CesiumMath.PI_OVER_TWO, 0.0, 0.1, 0.0, 0.0, 0.0]; createPackableSpecs(CircleGeometry, packableInstance, packedInstance); }); diff --git a/Specs/Core/CorridorGeometrySpec.js b/Specs/Core/CorridorGeometrySpec.js index 1862108eabbc..4bac8615e1ba 100644 --- a/Specs/Core/CorridorGeometrySpec.js +++ b/Specs/Core/CorridorGeometrySpec.js @@ -291,6 +291,6 @@ defineSuite([ packedInstance.push(Ellipsoid.WGS84.radii.x, Ellipsoid.WGS84.radii.y, Ellipsoid.WGS84.radii.z); packedInstance.push(1.0, 0.0, 0.0, 0.0, 0.0, 0.0); packedInstance.push(rectangle.west, rectangle.south, rectangle.east, rectangle.north); - packedInstance.push(30000.0, 0.0, 0.0, 2.0, 0.1); + packedInstance.push(30000.0, 0.0, 0.0, 2.0, 0.1, 0.0); createPackableSpecs(CorridorGeometry, corridor, packedInstance); }); diff --git a/Specs/Core/EllipseGeometrySpec.js b/Specs/Core/EllipseGeometrySpec.js index df9f86701a16..0af786c8bf03 100644 --- a/Specs/Core/EllipseGeometrySpec.js +++ b/Specs/Core/EllipseGeometrySpec.js @@ -265,7 +265,7 @@ defineSuite([ semiMinorAxis : 1.0, stRotation : CesiumMath.PI_OVER_TWO }); - var packedInstance = [center.x, center.y, center.z, ellipsoid.radii.x, ellipsoid.radii.y, ellipsoid.radii.z, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, rectangle.west, rectangle.south, rectangle.east, rectangle.north, 1.0, 1.0, 0.0, CesiumMath.PI_OVER_TWO, 0.0, 0.1, 0.0, 0.0]; + var packedInstance = [center.x, center.y, center.z, ellipsoid.radii.x, ellipsoid.radii.y, ellipsoid.radii.z, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, rectangle.west, rectangle.south, rectangle.east, rectangle.north, 1.0, 1.0, 0.0, CesiumMath.PI_OVER_TWO, 0.0, 0.1, 0.0, 0.0, 0.0]; createPackableSpecs(EllipseGeometry, packableInstance, packedInstance); }); diff --git a/Specs/Core/PolygonGeometrySpec.js b/Specs/Core/PolygonGeometrySpec.js index 2d2aae6b3d41..d29fdb8bbc43 100644 --- a/Specs/Core/PolygonGeometrySpec.js +++ b/Specs/Core/PolygonGeometrySpec.js @@ -699,6 +699,6 @@ defineSuite([ packedInstance.push(Ellipsoid.WGS84.radii.x, Ellipsoid.WGS84.radii.y, Ellipsoid.WGS84.radii.z); packedInstance.push(1.0, 0.0, 0.0, 0.0, 0.0, 0.0); packedInstance.push(rectangle.west, rectangle.south, rectangle.east, rectangle.north); - packedInstance.push(0.0, 0.0, CesiumMath.PI_OVER_THREE, 0.0, 0.0, 1.0, 0, 1, 55); + packedInstance.push(0.0, 0.0, CesiumMath.PI_OVER_THREE, 0.0, 0.0, 1.0, 0, 1, 0, 56); createPackableSpecs(PolygonGeometry, polygon, packedInstance); }); diff --git a/Specs/Core/RectangleGeometrySpec.js b/Specs/Core/RectangleGeometrySpec.js index 5ed3b14f5b39..0e1e51f92d7e 100644 --- a/Specs/Core/RectangleGeometrySpec.js +++ b/Specs/Core/RectangleGeometrySpec.js @@ -349,6 +349,6 @@ defineSuite([ granularity : 1.0, ellipsoid : Ellipsoid.UNIT_SPHERE }); - var packedInstance = [-2.0, -1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -2.0, -1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0]; + var packedInstance = [-2.0, -1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -2.0, -1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0]; createPackableSpecs(RectangleGeometry, rectangle, packedInstance); }); From f14a19e848a5cfcece4d075b2b02a546e43d49c6 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Tue, 13 Dec 2016 17:10:16 -0500 Subject: [PATCH 230/396] jshint --- Source/Core/RectangleGeometry.js | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/Core/RectangleGeometry.js b/Source/Core/RectangleGeometry.js index 6d2247715f59..73dcdfeb60f6 100644 --- a/Source/Core/RectangleGeometry.js +++ b/Source/Core/RectangleGeometry.js @@ -741,7 +741,6 @@ define([ var scratchRectangle = new Rectangle(); var scratchRotatedRectangle = new Rectangle(); var scratchEllipsoid = Ellipsoid.clone(Ellipsoid.UNIT_SPHERE); - var scratchVertexFormat = new VertexFormat(); var scratchOptions = { rectangle : scratchRectangle, ellipsoid : scratchEllipsoid, From db2e9ca78e70e407e3f404bd7772b6600c23e47b Mon Sep 17 00:00:00 2001 From: hpinkos Date: Tue, 13 Dec 2016 17:33:51 -0500 Subject: [PATCH 231/396] cleanup --- Source/Core/CorridorGeometry.js | 4 ++-- Source/Core/PolygonGeometryLibrary.js | 7 ++----- Source/Core/RectangleGeometry.js | 16 ---------------- Source/Renderer/AutomaticUniforms.js | 6 ++++++ Source/Renderer/UniformState.js | 12 ++++++++++++ Source/Scene/FrameState.js | 7 +++++++ 6 files changed, 29 insertions(+), 23 deletions(-) diff --git a/Source/Core/CorridorGeometry.js b/Source/Core/CorridorGeometry.js index 7ab047cfa002..73bdc2fb5475 100644 --- a/Source/Core/CorridorGeometry.js +++ b/Source/Core/CorridorGeometry.js @@ -868,8 +868,8 @@ define([ array[startingIndex++] = value._height; array[startingIndex++] = value._extrudedHeight; array[startingIndex++] = value._cornerType; - array[startingIndex++] = value._granularity; - array[startingIndex] = value._shadowVolume ? 1.0 : 0.0; + array[startingIndex++] = value._granularity; + array[startingIndex] = value._shadowVolume ? 1.0 : 0.0; return array; }; diff --git a/Source/Core/PolygonGeometryLibrary.js b/Source/Core/PolygonGeometryLibrary.js index 12bb78deec5c..f36e24764715 100644 --- a/Source/Core/PolygonGeometryLibrary.js +++ b/Source/Core/PolygonGeometryLibrary.js @@ -346,7 +346,6 @@ define([ PolygonGeometryLibrary.computeWallGeometry = function(positions, ellipsoid, granularity, perPositionHeight) { var edgePositions; var topEdgeLength; - var positionLength; var i; var p1; var p2; @@ -362,8 +361,7 @@ define([ numVertices += PolygonGeometryLibrary.subdivideLineCount(positions[i], positions[(i + 1) % length], minDistance); } - positionLength = numVertices + length; - topEdgeLength = positionLength * 3; + topEdgeLength = (numVertices + length) * 3; edgePositions = new Array(topEdgeLength * 2); for (i = 0; i < length; i++) { p1 = positions[i]; @@ -389,8 +387,7 @@ define([ ++index; } } else { - positionLength = length * 2; - topEdgeLength = positionLength * 3; + topEdgeLength = length * 3 * 2; edgePositions = new Array(topEdgeLength * 2); for (i = 0; i < length; i++) { p1 = positions[i]; diff --git a/Source/Core/RectangleGeometry.js b/Source/Core/RectangleGeometry.js index 73dcdfeb60f6..afc6c9896a04 100644 --- a/Source/Core/RectangleGeometry.js +++ b/Source/Core/RectangleGeometry.js @@ -450,10 +450,6 @@ define([ stIndex += 4; } if (shadowVolume) { - wallExtrudeNormals[extrudeNormalIndex++] = 0; - wallExtrudeNormals[extrudeNormalIndex++] = 0; - wallExtrudeNormals[extrudeNormalIndex++] = 0; - wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; @@ -469,10 +465,6 @@ define([ stIndex += 4; } if (shadowVolume) { - wallExtrudeNormals[extrudeNormalIndex++] = 0; - wallExtrudeNormals[extrudeNormalIndex++] = 0; - wallExtrudeNormals[extrudeNormalIndex++] = 0; - wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; @@ -488,10 +480,6 @@ define([ stIndex += 4; } if (shadowVolume) { - wallExtrudeNormals[extrudeNormalIndex++] = 0; - wallExtrudeNormals[extrudeNormalIndex++] = 0; - wallExtrudeNormals[extrudeNormalIndex++] = 0; - wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; @@ -507,10 +495,6 @@ define([ stIndex += 4; } if (shadowVolume) { - wallExtrudeNormals[extrudeNormalIndex++] = 0; - wallExtrudeNormals[extrudeNormalIndex++] = 0; - wallExtrudeNormals[extrudeNormalIndex++] = 0; - wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; diff --git a/Source/Renderer/AutomaticUniforms.js b/Source/Renderer/AutomaticUniforms.js index 5507b53b907a..f7da008bbc4a 100644 --- a/Source/Renderer/AutomaticUniforms.js +++ b/Source/Renderer/AutomaticUniforms.js @@ -1478,6 +1478,12 @@ define([ } }), + /** + * An automatic GLSL uniform scalar representing the geometric tolerance per distance + * + * @alias czm_geometricToleranceOverDistance + * @glslUniform + */ czm_geometricToleranceOverDistance : new AutomaticUniform({ size: 1, datatype: WebGLConstants.FLOAT, diff --git a/Source/Renderer/UniformState.js b/Source/Renderer/UniformState.js index 574a213744c5..6818f9f5e222 100644 --- a/Source/Renderer/UniformState.js +++ b/Source/Renderer/UniformState.js @@ -769,12 +769,24 @@ define([ } }, + /** + * The maximum screen-space error used to drive level-of-detail refinement. Higher + * values will provide better performance but lower visual quality. + * + * @type {Number} + * @default 2 + */ maximumScreenSpaceError: { get: function() { return this._frameState.maximumScreenSpaceError; } }, + /** + * The size of one pixel in meters + * + * @type {Number} + */ pixelSizePerMeter: { get: function() { return this._pixelSizePerMeter; diff --git a/Source/Scene/FrameState.js b/Source/Scene/FrameState.js index 29c163b357e2..e3f87f3fcea6 100644 --- a/Source/Scene/FrameState.js +++ b/Source/Scene/FrameState.js @@ -95,6 +95,13 @@ define([ */ this.occluder = undefined; + /** + * The maximum screen-space error used to drive level-of-detail refinement. Higher + * values will provide better performance but lower visual quality. + * + * @type {Number} + * @default 2 + */ this.maximumScreenSpaceError = undefined; this.passes = { From 2659c7f9e310df9ab9075e65d78e4d521277747e Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Wed, 14 Dec 2016 13:15:14 +0100 Subject: [PATCH 232/396] Remove unused property displayName --- Apps/Sandcastle/gallery/Custom Geocoder.html | 1 - Source/Core/BingMapsGeocoderService.js | 2 -- 2 files changed, 3 deletions(-) diff --git a/Apps/Sandcastle/gallery/Custom Geocoder.html b/Apps/Sandcastle/gallery/Custom Geocoder.html index c41a144245ba..1431907308eb 100644 --- a/Apps/Sandcastle/gallery/Custom Geocoder.html +++ b/Apps/Sandcastle/gallery/Custom Geocoder.html @@ -47,7 +47,6 @@ */ function OpenStreetMapNominatimGeocoder(options) { options = Cesium.defaultValue(options, Cesium.defaultValue.EMPTY_OBJECT); - this.displayName = 'Nominatim'; this._canceled = false; this.autoComplete = Cesium.defaultValue(options.autoComplete, true); } diff --git a/Source/Core/BingMapsGeocoderService.js b/Source/Core/BingMapsGeocoderService.js index 5e0ee46e2f58..1ff29ec6b2ba 100644 --- a/Source/Core/BingMapsGeocoderService.js +++ b/Source/Core/BingMapsGeocoderService.js @@ -27,8 +27,6 @@ define([ function BingMapsGeocoderService(options) { options = defaultValue(options, defaultValue.EMPTY_OBJECT); this._canceled = false; - this._displayName = 'Bing Maps Geocoder Service'; - this._url = 'https://dev.virtualearth.net/REST/v1/Locations'; this._key = BingMapsApi.getKey(options.key); From cc2c62092f42bafe60bee6e97ff055ea1758a9b9 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Wed, 14 Dec 2016 23:46:51 +0100 Subject: [PATCH 233/396] Make type checks only use typeof and change naming to reflect this --- Source/Core/Cartesian3.js | 4 +- Source/Core/Check.js | 30 +++++++-------- Specs/Core/CheckSpec.js | 81 +++++++++++++++++++-------------------- 3 files changed, 56 insertions(+), 59 deletions(-) diff --git a/Source/Core/Cartesian3.js b/Source/Core/Cartesian3.js index 45c6a46fa048..0a1709600bfb 100644 --- a/Source/Core/Cartesian3.js +++ b/Source/Core/Cartesian3.js @@ -60,7 +60,7 @@ define([ */ Cartesian3.fromSpherical = function(spherical, result) { //>>includeStart('debug', pragmas.debug); - Check.type.object(spherical); + Check.typeOf.object(spherical); //>>includeEnd('debug'); if (!defined(result)) { @@ -146,7 +146,7 @@ define([ */ Cartesian3.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - Check.type.object(value); + Check.typeOf.object(value); Check.defined(array, 'array'); //>>includeEnd('debug'); diff --git a/Source/Core/Check.js b/Source/Core/Check.js index 960b7519b564..f1827c9b9b5b 100644 --- a/Source/Core/Check.js +++ b/Source/Core/Check.js @@ -20,7 +20,7 @@ define([ */ var Check = {}; - Check.type = {}; + Check.typeOf = {}; Check.numeric = {}; var errors = { @@ -29,7 +29,7 @@ define([ }; function getUndefinedErrorMessage(name) { - return defaultValue(name, 'variable') + ' is required but is undefined.'; + return defaultValue(name, 'a value') + ' is required but is undefined.'; } function getFailedTypeErrorMessage(actual, expected) { return 'Expected ' + expected + ', got ' + actual; @@ -53,9 +53,9 @@ define([ * @throws {DeveloperError} */ Check.numeric.withinRange = function (test, min, max) { - Check.type.number(test); - Check.type.number(max); - Check.type.number(min); + Check.typeOf.number(test); + Check.typeOf.number(max); + Check.typeOf.number(min); if (min > max) { throw new DeveloperError('Invalid condition: min (' + min + ') must be less than max (' + max + ')'); } @@ -70,8 +70,8 @@ define([ * @throws {DeveloperError} */ Check.numeric.maximum = function (test, max) { - Check.type.number(test); - Check.type.number(max); + Check.typeOf.number(test); + Check.typeOf.number(max); if (test > max) { throw new DeveloperError('Expected ' + test + ' to be at most ' + max); } @@ -83,8 +83,8 @@ define([ * @throws {DeveloperError} */ Check.numeric.minimum = function (test, min) { - Check.type.number(test); - Check.type.number(min); + Check.typeOf.number(test); + Check.typeOf.number(min); if (test < min) { throw new DeveloperError('Expected ' + test + ' to be at least ' + min); } @@ -94,7 +94,7 @@ define([ * @param {} test The value to test * @throws {DeveloperError} */ - Check.type.function = function (test) { + Check.typeOf.function = function (test) { if (typeof test !== 'function') { throw new DeveloperError(errors.failedType(typeof test, 'function')); } @@ -104,7 +104,7 @@ define([ * @param {} test The value to test * @throws {DeveloperError} */ - Check.type.string = function (test) { + Check.typeOf.string = function (test) { if (typeof test !== 'string') { throw new DeveloperError(errors.failedType(typeof test, 'string')); } @@ -114,7 +114,7 @@ define([ * @param {} test The value to test * @throws {DeveloperError} */ - Check.type.number = function (test) { + Check.typeOf.number = function (test) { if (typeof test !== 'number') { throw new DeveloperError(errors.failedType(typeof test, 'number')); } @@ -124,8 +124,8 @@ define([ * @param {} test The value to test * @throws {DeveloperError} */ - Check.type.object = function (test) { - if (typeof test !== 'object' || isArray(test)) { + Check.typeOf.object = function (test) { + if (typeof test !== 'object') { throw new DeveloperError(errors.failedType(typeof test, 'object')); } }; @@ -134,7 +134,7 @@ define([ * @param {} test The value to test * @throws {DeveloperError} */ - Check.type.boolean = function (test) { + Check.typeOf.boolean = function (test) { if (typeof test !== 'boolean') { throw new DeveloperError(errors.failedType(typeof test, 'boolean')); } diff --git a/Specs/Core/CheckSpec.js b/Specs/Core/CheckSpec.js index 2543f35f7ec7..ef79d94ef063 100644 --- a/Specs/Core/CheckSpec.js +++ b/Specs/Core/CheckSpec.js @@ -6,123 +6,120 @@ defineSuite([ 'use strict'; describe('type checks', function () { - it('Check.type.boolean does not throw when passed a boolean', function () { + it('Check.typeOf.boolean does not throw when passed a boolean', function () { expect(function () { - Check.type.boolean(true); + Check.typeOf.boolean(true); }).not.toThrowDeveloperError(); }); - it('Check.type.boolean throws when passed a non-boolean', function () { + it('Check.typeOf.boolean throws when passed a non-boolean', function () { expect(function () { - Check.type.boolean({}); + Check.typeOf.boolean({}); }).toThrowDeveloperError(); expect(function () { - Check.type.boolean([]); + Check.typeOf.boolean([]); }).toThrowDeveloperError(); expect(function () { - Check.type.boolean(1); + Check.typeOf.boolean(1); }).toThrowDeveloperError(); expect(function () { - Check.type.boolean('snth'); + Check.typeOf.boolean('snth'); }).toThrowDeveloperError(); expect(function () { - Check.type.boolean(function () {return true;}); + Check.typeOf.boolean(function () {return true;}); }).toThrowDeveloperError(); }); - it('Check.type.function does not throw when passed a function', function () { + it('Check.typeOf.function does not throw when passed a function', function () { expect(function () { - Check.type.function(function () {return true;}); + Check.typeOf.function(function () {return true;}); }).not.toThrowDeveloperError(); }); - it('Check.type.function throws when passed a non-function', function () { + it('Check.typeOf.function throws when passed a non-function', function () { expect(function () { - Check.type.function({}); + Check.typeOf.function({}); }).toThrowDeveloperError(); expect(function () { - Check.type.function([]); + Check.typeOf.function([]); }).toThrowDeveloperError(); expect(function () { - Check.type.function(1); + Check.typeOf.function(1); }).toThrowDeveloperError(); expect(function () { - Check.type.function('snth'); + Check.typeOf.function('snth'); }).toThrowDeveloperError(); expect(function () { - Check.type.function(true); + Check.typeOf.function(true); }).toThrowDeveloperError(); }); - it('Check.type.object does not throw when passed object', function() { + it('Check.typeOf.object does not throw when passed object', function() { expect(function () { - Check.type.object({}); + Check.typeOf.object({}); }).not.toThrowDeveloperError(); }); - it('Check.type.object throws when passed non-object', function() { + it('Check.typeOf.object throws when passed non-object', function() { expect(function () { - Check.type.object('snth'); + Check.typeOf.object('snth'); }).toThrowDeveloperError(); expect(function () { - Check.type.object(true); + Check.typeOf.object(true); }).toThrowDeveloperError(); expect(function () { - Check.type.object(1); + Check.typeOf.object(1); }).toThrowDeveloperError(); expect(function () { - Check.type.object([2]); - }).toThrowDeveloperError(); - expect(function () { - Check.type.object(function () {return true;}); + Check.typeOf.object(function () {return true;}); }).toThrowDeveloperError(); }); - it('Check.type.number does not throw when passed number', function() { + it('Check.typeOf.number does not throw when passed number', function() { expect(function () { - Check.type.number(2); + Check.typeOf.number(2); }).not.toThrowDeveloperError(); }); - it('Check.type.number throws when passed non-number', function() { + it('Check.typeOf.number throws when passed non-number', function() { expect(function () { - Check.type.number('snth'); + Check.typeOf.number('snth'); }).toThrowDeveloperError(); expect(function () { - Check.type.number(true); + Check.typeOf.number(true); }).toThrowDeveloperError(); expect(function () { - Check.type.number({}); + Check.typeOf.number({}); }).toThrowDeveloperError(); expect(function () { - Check.type.number([2]); + Check.typeOf.number([2]); }).toThrowDeveloperError(); expect(function () { - Check.type.number(function () {return true;}); + Check.typeOf.number(function () {return true;}); }).toThrowDeveloperError(); }); - it('Check.type.string does not throw when passed a string', function () { + it('Check.typeOf.string does not throw when passed a string', function () { expect(function () { - Check.type.string('s'); + Check.typeOf.string('s'); }).not.toThrowDeveloperError(); }); - it('Check.type.string throws on non-string', function () { + it('Check.typeOf.string throws on non-string', function () { expect(function () { - Check.type.string({}); + Check.typeOf.string({}); }).toThrowDeveloperError(); expect(function () { - Check.type.string(true); + Check.typeOf.string(true); }).toThrowDeveloperError(); expect(function () { - Check.type.string(1); + Check.typeOf.string(1); }).toThrowDeveloperError(); expect(function () { - Check.type.string([2]); + Check.typeOf.string([2]); }).toThrowDeveloperError(); expect(function () { - Check.type.string(function () {return true;}); + Check.typeOf.string(function () {return true;}); }).toThrowDeveloperError(); }); }); From 4cf758500e56816d9f73a60771f17d12bc46bc52 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Wed, 14 Dec 2016 23:53:14 +0100 Subject: [PATCH 234/396] Clean up accidental characters --- Source/Core/Check.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/Check.js b/Source/Core/Check.js index f1827c9b9b5b..577928bfadfa 100644 --- a/Source/Core/Check.js +++ b/Source/Core/Check.js @@ -37,7 +37,7 @@ define([ /** * @param {} test The value that is to be checked - * @param {string} name The name of the variable being tested: makes + * @param {string} name The name of the variable being tested * @throws {DeveloperError} */ Check.defined = function (test, name) { From d966ebabf03f23daa887f902a70c1c3cef21b098 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Wed, 14 Dec 2016 18:59:53 -0500 Subject: [PATCH 235/396] Check for CESIUM_RTC_MODELVIEW in ModelInstanceCollection --- Source/Scene/ModelInstanceCollection.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Source/Scene/ModelInstanceCollection.js b/Source/Scene/ModelInstanceCollection.js index d837acd854f3..8701f5fa48a6 100644 --- a/Source/Scene/ModelInstanceCollection.js +++ b/Source/Scene/ModelInstanceCollection.js @@ -195,8 +195,9 @@ define([ var instancedUniformsByProgram = {}; collection._instancedUniformsByProgram = instancedUniformsByProgram; - var modelSemantics = ['MODEL', 'MODELVIEW', 'MODELVIEWPROJECTION', 'MODELINVERSE', 'MODELVIEWINVERSE', 'MODELVIEWPROJECTIONINVERSE', 'MODELINVERSETRANSPOSE', 'MODELVIEWINVERSETRANSPOSE']; - var supportedSemantics = ['MODELVIEW', 'MODELVIEWPROJECTION', 'MODELVIEWINVERSETRANSPOSE']; + // + var modelSemantics = ['MODEL', 'MODELVIEW', 'CESIUM_RTC_MODELVIEW', 'MODELVIEWPROJECTION', 'MODELINVERSE', 'MODELVIEWINVERSE', 'MODELVIEWPROJECTIONINVERSE', 'MODELINVERSETRANSPOSE', 'MODELVIEWINVERSETRANSPOSE']; + var supportedSemantics = ['MODELVIEW', 'CESIUM_RTC_MODELVIEW', 'MODELVIEWPROJECTION', 'MODELVIEWINVERSETRANSPOSE']; var gltf = collection._model.gltf; var techniques = gltf.techniques; @@ -253,7 +254,7 @@ define([ if (instancedUniforms.hasOwnProperty(uniform)) { var semantic = instancedUniforms[uniform]; var varName; - if (semantic === 'MODELVIEW') { + if (semantic === 'MODELVIEW' || semantic === 'CESIUM_RTC_MODELVIEW') { varName = 'czm_instanced_modelView'; } else if (semantic === 'MODELVIEWPROJECTION') { varName = 'czm_instanced_modelViewProjection'; From d1783ad7b5c7d2e47f74471501340363d9fe560e Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Wed, 14 Dec 2016 19:04:34 -0500 Subject: [PATCH 236/396] Add comment --- Source/Scene/ModelInstanceCollection.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Scene/ModelInstanceCollection.js b/Source/Scene/ModelInstanceCollection.js index 8701f5fa48a6..7e0530e65e31 100644 --- a/Source/Scene/ModelInstanceCollection.js +++ b/Source/Scene/ModelInstanceCollection.js @@ -195,7 +195,7 @@ define([ var instancedUniformsByProgram = {}; collection._instancedUniformsByProgram = instancedUniformsByProgram; - // + // When using CESIUM_RTC_MODELVIEW the CESIUM_RTC center is ignored. Instances are always rendered relative-to-center. var modelSemantics = ['MODEL', 'MODELVIEW', 'CESIUM_RTC_MODELVIEW', 'MODELVIEWPROJECTION', 'MODELINVERSE', 'MODELVIEWINVERSE', 'MODELVIEWPROJECTIONINVERSE', 'MODELINVERSETRANSPOSE', 'MODELVIEWINVERSETRANSPOSE']; var supportedSemantics = ['MODELVIEW', 'CESIUM_RTC_MODELVIEW', 'MODELVIEWPROJECTION', 'MODELVIEWINVERSETRANSPOSE']; From 12cbbfe11d8186edce33aeb9334cd65485439ba3 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Wed, 14 Dec 2016 16:27:39 -0500 Subject: [PATCH 237/396] Support vectors in the styling language --- .../gallery/3D Tiles Point Cloud Styling.html | 15 +- Source/Scene/Expression.js | 222 ++++++++++---- Source/Scene/ExpressionNodeType.js | 7 +- Source/Scene/PointCloud3DTileContent.js | 45 ++- Specs/Scene/ExpressionSpec.js | 272 +++++++++++++++++- 5 files changed, 485 insertions(+), 76 deletions(-) diff --git a/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html b/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html index 7d2a15bae834..6362b6edfcf4 100644 --- a/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html +++ b/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html @@ -130,18 +130,18 @@ }); addStyle('Min and Max', { - color : "rgb(min(${POSITION}[0], 0.75) * 255, max(${POSITION}[2], 0.25) * 255, 255)", + color : "rgb(min(${POSITION}.x, 0.75) * 255, max(${POSITION}.z, 0.25) * 255, 255)", pointSize : "5" }); +// secondaryColor is originally a vec3 - so add vec4(0.0, 0.0, 0.0, 1.0) to make the point cloud opaque addStyle('Secondary Color', { color : { - expression : "[${secondaryColor}[0], ${secondaryColor}[1], ${secondaryColor}[2], 1.0]", conditions : [ - ["${id} < 250", "${expression}"], - ["${id} < 500", "${expression} * ${expression}"], - ["${id} < 750", "${expression} / 5.0"], - ["${id} < 1000", "rgb(0, 0, Number(${expression}[0] < 0.5) * 255)"] + ["${id} < 250", "${secondaryColor} + vec4(0.0, 0.0, 0.0, 1.0)"], + ["${id} < 500", "${secondaryColor} * ${secondaryColor} + vec4(0.0, 0.0, 0.0, 1.0)"], + ["${id} < 750", "${secondaryColor} / 5.0 + vec4(0.0, 0.0, 0.0, 1.0)"], + ["${id} < 1000", "rgb(0, 0, Number(${secondaryColor}.x < 0.5) * 255)"] ] } }); @@ -154,8 +154,9 @@ show : "${POSITION}[0] > 0.5 || ${POSITION}[1] > 0.5 || ${POSITION}[2] > 0.5" }); +// POSITION contains 0 as its last component, so add 1.0 to make the point cloud opaque addStyle('Color based on position', { - color : "rgb(${POSITION}[0] * 255, ${POSITION}[1] * 255, ${POSITION}[2] * 255)" + color : "${POSITION} + vec4(0.0, 0.0, 0.0, 1.0)" }); addStyle('Style point size', { diff --git a/Source/Scene/Expression.js b/Source/Scene/Expression.js index 7edb2d791ee2..b9d3de154ff9 100644 --- a/Source/Scene/Expression.js +++ b/Source/Scene/Expression.js @@ -1,5 +1,6 @@ /*global define*/ define([ + '../Core/Cartesian4', '../Core/Color', '../Core/defined', '../Core/defineProperties', @@ -9,6 +10,7 @@ define([ '../ThirdParty/jsep', './ExpressionNodeType' ], function( + Cartesian4, Color, defined, defineProperties, @@ -32,8 +34,11 @@ define([ var ScratchStorage = { scratchColorIndex : 0, scratchColors : [new Color()], + scratchCartesianIndex : 0, + scratchCartesians : [new Cartesian4()], reset : function() { this.scratchColorIndex = 0; + this.scratchCartesianIndex = 0; }, getColor : function() { if (this.scratchColorIndex >= this.scratchColors.length) { @@ -42,6 +47,14 @@ define([ var scratchColor = this.scratchColors[this.scratchColorIndex]; ++this.scratchColorIndex; return scratchColor; + }, + getCartesian : function() { + if (this.scratchCartesianIndex >= this.scratchCartesians.length) { + this.scratchCartesians.push(new Cartesian4()); + } + var scratchCartesian = this.scratchCartesians[this.scratchCartesianIndex]; + ++this.scratchCartesianIndex; + return scratchCartesian; } }; @@ -138,16 +151,19 @@ define([ * is of type Boolean, Number, or String, the corresponding JavaScript * primitive type will be returned. If the result is a RegExp, a Javascript RegExp * object will be returned. If the result is a Color, a {@link Color} object will be returned. + * If the result is a Cartesian4, a {@link Cartesian4} object will be returned. * * @param {FrameState} frameState The frame state. * @param {Cesium3DTileFeature} feature The feature who's properties may be used as variables in the expression. - * @returns {Boolean|Number|String|Color|RegExp} The result of evaluating the expression. + * @returns {Boolean|Number|String|Color|Cartesian4|RegExp} The result of evaluating the expression. */ Expression.prototype.evaluate = function(frameState, feature) { ScratchStorage.reset(); var result = this._runtimeAst.evaluate(frameState, feature); if (result instanceof Color) { return Color.clone(result); + } else if (result instanceof Cartesian4) { + return Cartesian4.clone(result); } return result; }; @@ -352,6 +368,14 @@ define([ createRuntimeAst(expression, args[3]) ]; return new Node(ExpressionNodeType.LITERAL_COLOR, call, val); + } else if (call === 'vec2' || call === 'vec3' || call === 'vec4') { + val = [ + defined(args[0]) ? createRuntimeAst(expression, args[0]) : new Node(ExpressionNodeType.LITERAL_NUMBER, 0), + defined(args[1]) ? createRuntimeAst(expression, args[1]) : new Node(ExpressionNodeType.LITERAL_NUMBER, 0), + defined(args[2]) ? createRuntimeAst(expression, args[2]) : new Node(ExpressionNodeType.LITERAL_NUMBER, 0), + defined(args[3]) ? createRuntimeAst(expression, args[3]) : new Node(ExpressionNodeType.LITERAL_NUMBER, 0) + ]; + return new Node(ExpressionNodeType.LITERAL_VECTOR, call, val); } else if (call === 'isNaN' || call === 'isFinite') { if (args.length === 0) { if (call === 'isNaN') { @@ -484,12 +508,14 @@ define([ } function parseMemberExpression(expression, ast) { + var val; var obj = createRuntimeAst(expression, ast.object); if (ast.computed) { - var val = createRuntimeAst(expression, ast.property); + val = createRuntimeAst(expression, ast.property); return new Node(ExpressionNodeType.MEMBER, 'brackets', obj, val); } else { - return new Node(ExpressionNodeType.MEMBER, 'dot', obj, ast.property.name); + val = new Node(ExpressionNodeType.LITERAL_STRING, ast.property.name); + return new Node(ExpressionNodeType.MEMBER, 'dot', obj, val); } } @@ -660,6 +686,8 @@ define([ node.evaluate = node._evaluateVariableString; } else if (node._type === ExpressionNodeType.LITERAL_COLOR) { node.evaluate = node._evaluateLiteralColor; + } else if (node._type === ExpressionNodeType.LITERAL_VECTOR) { + node.evaluate = node._evaluateLiteralVector; } else if (node._type === ExpressionNodeType.LITERAL_STRING) { node.evaluate = node._evaluateLiteralString; } else if (node._type === ExpressionNodeType.REGEX) { @@ -702,42 +730,53 @@ define([ if (!defined(args)) { return Color.fromBytes(255, 255, 255, 255, result); } else if (args.length > 1) { - Color.fromCssColorString(args[0].evaluate(frameState, feature, result), result); - result.alpha = args[1].evaluate(frameState, feature, result); + Color.fromCssColorString(args[0].evaluate(frameState, feature), result); + result.alpha = args[1].evaluate(frameState, feature); } else { - Color.fromCssColorString(args[0].evaluate(frameState, feature, result), result); + Color.fromCssColorString(args[0].evaluate(frameState, feature), result); } } else if (this._value === 'rgb') { Color.fromBytes( - args[0].evaluate(frameState, feature, result), - args[1].evaluate(frameState, feature, result), - args[2].evaluate(frameState, feature, result), + args[0].evaluate(frameState, feature), + args[1].evaluate(frameState, feature), + args[2].evaluate(frameState, feature), 255, result); } else if (this._value === 'rgba') { // convert between css alpha (0 to 1) and cesium alpha (0 to 255) - var a = args[3].evaluate(frameState, feature, result) * 255; + var a = args[3].evaluate(frameState, feature) * 255; Color.fromBytes( - args[0].evaluate(frameState, feature, result), - args[1].evaluate(frameState, feature, result), - args[2].evaluate(frameState, feature, result), + args[0].evaluate(frameState, feature), + args[1].evaluate(frameState, feature), + args[2].evaluate(frameState, feature), a, result); } else if (this._value === 'hsl') { Color.fromHsl( - args[0].evaluate(frameState, feature, result), - args[1].evaluate(frameState, feature, result), - args[2].evaluate(frameState, feature, result), + args[0].evaluate(frameState, feature), + args[1].evaluate(frameState, feature), + args[2].evaluate(frameState, feature), 1.0, result); } else if (this._value === 'hsla') { Color.fromHsl( - args[0].evaluate(frameState, feature, result), - args[1].evaluate(frameState, feature, result), - args[2].evaluate(frameState, feature, result), - args[3].evaluate(frameState, feature, result), + args[0].evaluate(frameState, feature), + args[1].evaluate(frameState, feature), + args[2].evaluate(frameState, feature), + args[3].evaluate(frameState, feature), result); } return result; }; + Node.prototype._evaluateLiteralVector = function(frameState, feature) { + var result = ScratchStorage.getCartesian(); + var args = this._left; + return Cartesian4.fromElements( + args[0].evaluate(frameState, feature), + args[1].evaluate(frameState, feature), + args[2].evaluate(frameState, feature), + args[3].evaluate(frameState, feature), + result); + }; + Node.prototype._evaluateLiteralString = function(frameState, feature) { return this._value; }; @@ -769,25 +808,65 @@ define([ // PERFORMANCE_IDEA: Determine if parent property needs to be computed before runtime Node.prototype._evaluateMemberDot = function(frameState, feature) { - if(checkFeature(this._left)) { - return feature.getProperty(this._right); + if (checkFeature(this._left)) { + return feature.getProperty(this._right.evaluate(frameState, feature)); } var property = this._left.evaluate(frameState, feature); if (!defined(property)) { return undefined; } - return property[this._right]; + + var member = this._right.evaluate(frameState, feature); + if (property instanceof Color) { + // Color components may be accessed with .x, .y, .z, .w and implicitly with .red, .green, .blue, .alpha + if (member === 'x') { + return property.red; + } else if (member === 'y') { + return property.green; + } else if (member === 'z') { + return property.blue; + } else if (member === 'w') { + return property.alpha; + } + } + + return property[member]; }; Node.prototype._evaluateMemberBrackets = function(frameState, feature) { - if(checkFeature(this._left)) { + if (checkFeature(this._left)) { return feature.getProperty(this._right.evaluate(frameState, feature)); } var property = this._left.evaluate(frameState, feature); if (!defined(property)) { return undefined; } - return property[this._right.evaluate(frameState, feature)]; + + var member = this._right.evaluate(frameState, feature); + if (property instanceof Color) { + // Color components may be accessed with [0][1][2][3], ['x']['y']['z']['w'], and implicitly with ['red']['green']['blue']['alpha'] + if (member === 0 || member === 'x') { + return property.red; + } else if (member === 1 || member === 'y') { + return property.green; + } else if (member === 2 || member === 'z') { + return property.blue; + } else if (member === 3 || member === 'w') { + return property.alpha; + } + } else if (property instanceof Cartesian4) { + // Vector components may be accessed with [0][1][2][3] and implicitly with ['x']['y']['z']['w'] + if (member === 0) { + return property.x; + } else if (member === 1) { + return property.y; + } else if (member === 2) { + return property.z; + } else if (member === 3) { + return property.w; + } + } + return property[member]; }; Node.prototype._evaluateArray = function(frameState, feature) { @@ -806,11 +885,19 @@ define([ }; Node.prototype._evaluateNegative = function(frameState, feature) { - return -(this._left.evaluate(frameState, feature)); + var left = this._left.evaluate(frameState, feature); + if (left instanceof Cartesian4) { + return Cartesian4.negate(left, ScratchStorage.getCartesian()); + } + return -left; }; Node.prototype._evaluatePositive = function(frameState, feature) { - return +(this._left.evaluate(frameState, feature)); + var left = this._left.evaluate(frameState, feature); + if ((left instanceof Color) || (left instanceof Cartesian4)) { + return left; + } + return +left; }; Node.prototype._evaluateLessThan = function(frameState, feature) { @@ -886,6 +973,8 @@ define([ var right = this._right.evaluate(frameState, feature); if ((right instanceof Color) && (left instanceof Color)) { return Color.add(left, right, ScratchStorage.getColor()); + } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return Cartesian4.add(left, right, ScratchStorage.getCartesian()); } return left + right; }; @@ -895,6 +984,8 @@ define([ var right = this._right.evaluate(frameState, feature); if ((right instanceof Color) && (left instanceof Color)) { return Color.subtract(left, right, ScratchStorage.getColor()); + } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return Cartesian4.subtract(left, right, ScratchStorage.getCartesian()); } return left - right; }; @@ -908,6 +999,12 @@ define([ return Color.multiplyByScalar(right, left, ScratchStorage.getColor()); } else if ((left instanceof Color) && (typeof(right) === 'number')) { return Color.multiplyByScalar(left, right, ScratchStorage.getColor()); + } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return Cartesian4.multiplyComponents(left, right, ScratchStorage.getCartesian()); + } else if ((right instanceof Cartesian4) && (typeof(left) === 'number')) { + return Cartesian4.multiplyByScalar(right, left, ScratchStorage.getCartesian()); + } else if ((left instanceof Cartesian4) && (typeof(right) === 'number')) { + return Cartesian4.multiplyByScalar(left, right, ScratchStorage.getCartesian()); } return left * right; }; @@ -919,6 +1016,10 @@ define([ return Color.divide(left, right, ScratchStorage.getColor()); } else if ((left instanceof Color) && (typeof(right) === 'number')) { return Color.divideByScalar(left, right, ScratchStorage.getColor()); + } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return Cartesian4.divideComponents(left, right, ScratchStorage.getCartesian()); + } else if ((left instanceof Cartesian4) && (typeof(right) === 'number')) { + return Cartesian4.divideByScalar(left, right, ScratchStorage.getCartesian()); } return left / right; }; @@ -928,6 +1029,10 @@ define([ var right = this._right.evaluate(frameState, feature); if ((right instanceof Color) && (left instanceof Color)) { return Color.mod(left, right, ScratchStorage.getColor()); + } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { + // TODO : make mod a built-in Cartesian function? + // TODO : modByScalar? + return Cartesian4.fromElements(left.x % right.x, left.y % right.y, left.z % right.z, left.w % right.w, ScratchStorage.getCartesian()); } return left % right; }; @@ -937,6 +1042,8 @@ define([ var right = this._right.evaluate(frameState, feature); if ((right instanceof Color) && (left instanceof Color)) { return Color.equals(left, right); + } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return Cartesian4.equals(left, right); } return left === right; }; @@ -946,6 +1053,8 @@ define([ var right = this._right.evaluate(frameState, feature); if ((right instanceof Color) && (left instanceof Color)) { return Color.equals(left, right); + } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return Cartesian4.equals(left, right); } // Specifically want to do an abstract equality comparison (==) instead of a strict equality comparison (===) @@ -958,6 +1067,8 @@ define([ var right = this._right.evaluate(frameState, feature); if ((right instanceof Color) && (left instanceof Color)) { return !Color.equals(left, right); + } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return !Cartesian4.equals(left, right); } return left !== right; }; @@ -967,6 +1078,8 @@ define([ var right = this._right.evaluate(frameState, feature); if ((right instanceof Color) && (left instanceof Color)) { return !Color.equals(left, right); + } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return !Cartesian4.equals(left, right); } // Specifically want to do an abstract inequality comparison (!=) instead of a strict inequality comparison (!==) // so that cases like "5 != '5'" return false. Tell jsHint to ignore this line. @@ -1069,7 +1182,7 @@ define([ Node.prototype._evaluateToString = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); - if ((left instanceof RegExp) || (left instanceof Color)) { + if ((left instanceof RegExp) || (left instanceof Color) || (left instanceof Cartesian4)) { return String(left); } //>>includeStart('debug', pragmas.debug); @@ -1152,7 +1265,7 @@ define([ return expressions; } - Node.prototype.getShaderExpression = function(attributePrefix, shaderState) { + Node.prototype.getShaderExpression = function(attributePrefix, shaderState, parent) { var color; var left; var right; @@ -1161,21 +1274,12 @@ define([ var type = this._type; var value = this._value; - // Right may be a string if it's a member variable: e.g. "${property.name}" - if (typeof(this._right) === 'string') { - //>>includeStart('debug', pragmas.debug); - throw new DeveloperError('Error generating style shader: string members are not supported.'); - //>>includeEnd('debug'); - // Return undefined when not in debug. Tell jsHint to ignore this line. - return; // jshint ignore:line - } - if (defined(this._left)) { if (isArray(this._left)) { - // Left can be an array if the type is LITERAL_COLOR + // Left can be an array if the type is LITERAL_COLOR or LITERAL_VECTOR left = getExpressionArray(this._left, attributePrefix, shaderState); } else { - left = this._left.getShaderExpression(attributePrefix, shaderState); + left = this._left.getShaderExpression(attributePrefix, shaderState, this); } if (!defined(left)) { // If the left side is not valid shader code, then the expression is not valid @@ -1184,7 +1288,7 @@ define([ } if (defined(this._right)) { - right = this._right.getShaderExpression(attributePrefix, shaderState); + right = this._right.getShaderExpression(attributePrefix, shaderState, this); if (!defined(right)) { // If the right side is not valid shader code, then the expression is not valid return undefined; @@ -1192,7 +1296,7 @@ define([ } if (defined(this._test)) { - test = this._test.getShaderExpression(attributePrefix, shaderState); + test = this._test.getShaderExpression(attributePrefix, shaderState, this); if (!defined(test)) { // If the test is not valid shader code, then the expression is not valid return undefined; @@ -1225,12 +1329,13 @@ define([ return 'cos(' + left + ')'; } else if (value === 'sqrt') { return 'sqrt(' + left + ')'; - } - //>>includeStart('debug', pragmas.debug); - else if ((value === 'isNaN') || (value === 'isFinite') || (value === 'String') || (value === 'isExactClass') || (value === 'isClass') || (value === 'getExactClassName')) { + } else if ((value === 'isNaN') || (value === 'isFinite') || (value === 'String') || (value === 'isExactClass') || (value === 'isClass') || (value === 'getExactClassName')) { + //>>includeStart('debug', pragmas.debug); throw new DeveloperError('Error generating style shader: "' + value + '" is not supported.'); + //>>includeEnd('debug'); + // Return undefined when not in debug. Tell jsHint to ignore this line. + return undefined; // jshint ignore:line } - //>>includeEnd('debug'); return value + left; case ExpressionNodeType.BINARY: // Supported types: ||, &&, ===, ==, !==, !=, <, >, <=, >=, +, -, *, /, % @@ -1249,7 +1354,18 @@ define([ case ExpressionNodeType.CONDITIONAL: return '(' + test + ' ? ' + left + ' : ' + right + ')'; case ExpressionNodeType.MEMBER: - // This is intended for accessing the components of vec2, vec3, and vec4 properties. String members aren't supported. + // This is intended for accessing the components of vec4 properties. String members aren't supported. + // Check for 0.0 rather than 0 because all numbers are previously converted to decimals. + // In this shader there is not much distinction between colors and vectors so allow .red to access the 0th component for both. + if (right === 'red' || right === 'x' || right === '0.0') { + return left + '[0]'; + } else if (right === 'green' || right === 'y' || right === '1.0') { + return left + '[1]'; + } else if (right === 'blue' || right === 'z' || right === '2.0') { + return left + '[2]'; + } else if (right === 'alpha' || right === 'w' || right === '3.0') { + return left + '[3]'; + } return left + '[int(' + right + ')]'; case ExpressionNodeType.FUNCTION_CALL: //>>includeStart('debug', pragmas.debug); @@ -1286,7 +1402,15 @@ define([ case ExpressionNodeType.LITERAL_NUMBER: return numberToString(value); case ExpressionNodeType.LITERAL_STRING: - // The only supported strings are css color strings + // Check if parent is of type MEMBER. Otherwise it is not possible to know whether 'red', 'green', and 'blue' + // refer to CSS strings or component accessors. + if (defined(parent) && (parent._type === ExpressionNodeType.MEMBER)) { + if (value === 'red' || value === 'green' || value === 'blue' || value === 'alpha' || + value === 'x' || value === 'y' || value === 'z' || value === 'w') { + return value; + } + } + // Check for css color strings color = Color.fromCssColorString(value, scratchColor); if (defined(color)) { return colorToVec3(color); @@ -1348,6 +1472,8 @@ define([ } } break; + case ExpressionNodeType.LITERAL_VECTOR: + return 'vec4(' + left[0] + ', ' + left[1] + ', ' + left[2] + ', ' + left[3] + ')'; case ExpressionNodeType.LITERAL_REGEX: //>>includeStart('debug', pragmas.debug); throw new DeveloperError('Error generating style shader: Regular expressions are not supported.'); diff --git a/Source/Scene/ExpressionNodeType.js b/Source/Scene/ExpressionNodeType.js index 072a7aa34707..e1f3701d187b 100644 --- a/Source/Scene/ExpressionNodeType.js +++ b/Source/Scene/ExpressionNodeType.js @@ -23,9 +23,10 @@ define([ LITERAL_NUMBER : 11, LITERAL_STRING : 12, LITERAL_COLOR : 13, - LITERAL_REGEX : 14, - LITERAL_UNDEFINED : 15, - LITERAL_GLOBAL : 16 + LITERAL_VECTOR : 14, + LITERAL_REGEX : 15, + LITERAL_UNDEFINED : 16, + LITERAL_GLOBAL : 17 }; return freezeObject(ExpressionNodeType); diff --git a/Source/Scene/PointCloud3DTileContent.js b/Source/Scene/PointCloud3DTileContent.js index 6b4e3f954d7c..7f3665554e3c 100644 --- a/Source/Scene/PointCloud3DTileContent.js +++ b/Source/Scene/PointCloud3DTileContent.js @@ -800,7 +800,8 @@ define([ } // Edit the function header to accept the point position, color, and normal - return source.replace('()', '(vec3 position, vec4 color, vec3 normal)'); + // The styling language expects all vectors to be vec4 + return source.replace('()', '(vec4 position, vec4 color, vec4 normal)'); } function createShaders(content, frameState, style) { @@ -908,12 +909,9 @@ define([ attributeLocations.a_batchId = batchIdLocation; } - var vs = 'attribute vec3 a_position; \n' + - 'varying vec4 v_color; \n' + - 'uniform float u_pointSize; \n' + - 'uniform vec4 u_constantColor; \n' + - 'uniform vec4 u_highlightColor; \n' + - 'uniform float u_tilesetTime; \n'; + var attributeDeclarations = ''; + var attributeGlobals = ''; + var attributeDefaults = ''; var length = styleableProperties.length; for (i = 0; i < length; ++i) { @@ -930,14 +928,35 @@ define([ var attributeType; if (componentCount === 1) { attributeType = 'float'; + } else if (componentCount === 4) { + attributeType = 'vec4'; } else { - attributeType = 'vec' + componentCount; + // The styling language expects all vectors to be vec4. GLSL can cast vertex attributes to vec4 but sets + // the w component to 1.0, while the styling language expects 0.0. Since vertex attributes are read-only, + // create global variables and set their w component to 0.0 in main(). + attributeType = 'vec4'; + if (componentCount < 4) { + var globalName = 'czm_tiles3d_style_' + name; + attributeName = 'czm_tiles3d_attribute_' + name; + attributeGlobals = 'vec4 ' + globalName + '; \n'; + attributeDefaults += ' ' + globalName + ' = vec4(' + attributeName + '.xyz, 0.0); \n'; + } } - vs += 'attribute ' + attributeType + ' ' + attributeName + '; \n'; + attributeDeclarations += 'attribute ' + attributeType + ' ' + attributeName + '; \n'; attributeLocations[attributeName] = attribute.location; } + var vs = 'attribute vec3 a_position; \n' + + 'varying vec4 v_color; \n' + + 'uniform float u_pointSize; \n' + + 'uniform vec4 u_constantColor; \n' + + 'uniform vec4 u_highlightColor; \n' + + 'uniform float u_tilesetTime; \n'; + + vs += attributeDeclarations; + vs += attributeGlobals; + if (usesColors) { if (isTranslucent) { vs += 'attribute vec4 a_color; \n'; @@ -984,6 +1003,8 @@ define([ vs += 'void main() \n' + '{ \n'; + vs += attributeDefaults; + if (usesColors) { if (isTranslucent) { vs += ' vec4 color = a_color; \n'; @@ -1020,15 +1041,15 @@ define([ } if (hasColorStyle) { - vs += ' color = getColorFromStyle(position, color, normal); \n'; + vs += ' color = getColorFromStyle(vec4(position, 0.0), color, vec4(normal, 0.0)); \n'; } if (hasShowStyle) { - vs += ' float show = float(getShowFromStyle(position, color, normal)); \n'; + vs += ' float show = float(getShowFromStyle(vec4(position, 0.0), color, vec4(normal, 0.0))); \n'; } if (hasPointSizeStyle) { - vs += ' gl_PointSize = getPointSizeFromStyle(position, color, normal); \n'; + vs += ' gl_PointSize = getPointSizeFromStyle(vec4(position, 0.0), color, vec4(normal, 0.0)); \n'; } else { vs += ' gl_PointSize = u_pointSize; \n'; } diff --git a/Specs/Scene/ExpressionSpec.js b/Specs/Scene/ExpressionSpec.js index 19c546e74840..006f0e05cd8b 100644 --- a/Specs/Scene/ExpressionSpec.js +++ b/Specs/Scene/ExpressionSpec.js @@ -1,11 +1,13 @@ /*global defineSuite*/ defineSuite([ 'Scene/Expression', + 'Core/Cartesian4', 'Core/Color', 'Core/Math', 'Scene/ExpressionNodeType' ], function( Expression, + Cartesian4, Color, CesiumMath, ExpressionNodeType) { @@ -485,7 +487,7 @@ defineSuite([ }).toThrowDeveloperError(); }); - it('evaluates color properties', function() { + it('evaluates color properties (reg, green, blue, alpha)', function() { var expression = new Expression('color(\'#ffffff\').red'); expect(expression.evaluate(frameState, undefined)).toEqual(1); @@ -499,6 +501,140 @@ defineSuite([ expect(expression.evaluate(frameState, undefined)).toEqual(0.5); }); + it('evaluates color properties (x, y, z, w)', function() { + var expression = new Expression('color(\'#ffffff\').x'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('rgb(255, 255, 0).y'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('color("cyan").z'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('rgba(255, 255, 0, 0.5).w'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.5); + }); + + it('evaluates color properties ([0], [1], [2]. [3])', function() { + var expression = new Expression('color(\'#ffffff\')[0]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('rgb(255, 255, 0)[1]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('color("cyan")[2]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('rgba(255, 255, 0, 0.5)[3]'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.5); + }); + + it('evaluates color properties (["red"], ["green"], ["blue"], ["alpha"])', function() { + var expression = new Expression('color(\'#ffffff\')["red"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('rgb(255, 255, 0)["green"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('color("cyan")["blue"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('rgba(255, 255, 0, 0.5)["alpha"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.5); + }); + + it('evaluates color properties (["x"], ["y"], ["z"], ["w"])', function() { + var expression = new Expression('color(\'#ffffff\')["x"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('rgb(255, 255, 0)["y"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('color("cyan")["z"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('rgba(255, 255, 0, 0.5)["w"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.5); + }); + + it('evaluates vector', function() { + var expression = new Expression('vec2()'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(0.0, 0.0, 0.0, 0.0)); + + expression = new Expression('vec3()'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(0.0, 0.0, 0.0, 0.0)); + + expression = new Expression('vec4()'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(0.0, 0.0, 0.0, 0.0)); + + expression = new Expression('vec2(1.0, 2.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(1.0, 2.0, 0.0, 0.0)); + + expression = new Expression('vec3(1.0, 2.0, 3.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(1.0, 2.0, 3.0, 0.0)); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(1.0, 2.0, 3.0, 4.0)); + }); + + it('evaluates vector with expressions as arguments', function() { + var feature = new MockFeature(); + feature.addProperty('height', 2); + feature.addProperty('width', 4); + feature.addProperty('depth', 3); + feature.addProperty('scale', 1); + + var expression = new Expression('vec4(${height}, ${width}, ${depth}, ${scale})'); + expect(expression.evaluate(frameState, feature)).toEqual(new Cartesian4(2.0, 4.0, 3.0, 1.0)); + }); + + it('evaluates expression with multiple nested vectors', function() { + var expression = new Expression('vec4(vec2(1, 2)[vec3(6, 1, 5).y], 2, vec4().w, 5)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(2.0, 2.0, 0.0, 5.0)); + }); + + it('evaluates vector properties (x, y, z, w)', function() { + var expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0).x'); + expect(expression.evaluate(frameState, undefined)).toEqual(1.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0).y'); + expect(expression.evaluate(frameState, undefined)).toEqual(2.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0).z'); + expect(expression.evaluate(frameState, undefined)).toEqual(3.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0).w'); + expect(expression.evaluate(frameState, undefined)).toEqual(4.0); + }); + + it('evaluates vector properties ([0], [1], [2]. [3])', function() { + var expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)[0]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)[1]'); + expect(expression.evaluate(frameState, undefined)).toEqual(2.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)[2]'); + expect(expression.evaluate(frameState, undefined)).toEqual(3.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)[3]'); + expect(expression.evaluate(frameState, undefined)).toEqual(4.0); + }); + + it('evaluates vector properties (["x"], ["y"], ["z"]. ["w"])', function() { + var expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)["x"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)["y"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(2.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)["z"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(3.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)["w"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(4.0); + }); + it('evaluates unary not', function() { var expression = new Expression('!true'); expect(expression.evaluate(frameState, undefined)).toEqual(false); @@ -748,7 +884,10 @@ defineSuite([ }); it('evaluates color operations', function() { - var expression = new Expression('rgba(255, 0, 0, 0.5) + rgba(0, 0, 255, 0.5)'); + var expression = new Expression('+rgba(255, 0, 0, 1.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(Color.RED); + + expression = new Expression('rgba(255, 0, 0, 0.5) + rgba(0, 0, 255, 0.5)'); expect(expression.evaluate(frameState, undefined)).toEqual(Color.MAGENTA); expression = new Expression('rgba(0, 255, 255, 1.0) - rgba(0, 255, 0, 0)'); @@ -783,6 +922,56 @@ defineSuite([ expression = new Expression('color(\'green\') != color(\'green\')'); expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('color(\'green\') !== color(\'green\')'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + }); + + it('evaluates vector operations', function() { + var expression = new Expression('+vec3(1, 2, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(1, 2, 3, 0)); + + expression = new Expression('-vec3(1, 2, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(-1, -2, -3, 0)); + + expression = new Expression('vec2(1, 2) + vec4(3, 4, 5, 6)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(4, 6, 5, 6)); + + expression = new Expression('vec2(1, 2) - vec4(3, 4, 5, 6)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(-2, -2, -5, -6)); + + expression = new Expression('vec4(1, 2, 3, 4) * vec4(3, 4, 5, 6)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3, 8, 15, 24)); + + expression = new Expression('vec3(1, 2, 3) * 3.0'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3, 6, 9, 0)); + + expression = new Expression('3.0 * vec3(1, 2, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3, 6, 9, 0)); + + expression = new Expression('vec3(1, 2, 3) / vec4(2, 5, 3, 1)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(0.5, 0.4, 1.0, 0.0)); + + expression = new Expression('vec3(1, 2, 3) / 2.0'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(0.5, 1.0, 1.5, 0.0)); + + expression = new Expression('vec4(2, 3, 4, 5) % vec3(3, 3, 3, 2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(2, 0, 1, 1)); + + expression = new Expression('vec2(1, 3) == vec4(1, 3, 0, 0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('vec2(1, 3) === vec4(1, 3, 0, 0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('!!vec4() == true'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('vec3(1, 2, 3) != vec3(1, 2, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('vec3(1, 2, 3) !== vec3(1, 2, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); }); it('evaluates color toString function', function() { @@ -799,6 +988,17 @@ defineSuite([ expect(expression.evaluate(frameState, feature)).toEqual('(0, 0, 1, 1)'); }); + it('evaluates vector toString function', function() { + var feature = new MockFeature(); + feature.addProperty('property', new Cartesian4(1, 2, 3, 4)); + + var expression = new Expression('vec4(1, 2, 3, 4).toString()'); + expect(expression.evaluate(frameState, undefined)).toEqual('(1, 2, 3, 4)'); + + expression = new Expression('${property}.toString()'); + expect(expression.evaluate(frameState, feature)).toEqual('(1, 2, 3, 4)'); + }); + it('evaluates isNaN function', function() { var expression = new Expression('isNaN()'); expect(expression.evaluate(frameState, undefined)).toEqual(true); @@ -1472,7 +1672,7 @@ defineSuite([ expect(expression.evaluate(frameState, feature)).toEqual(false); }); - it('throws if test is not call with a RegExp', function() { + it('throws if test is not called with a RegExp', function() { expect(function() { return new Expression('color("blue").test()'); }).toThrowDeveloperError(); @@ -1728,12 +1928,12 @@ defineSuite([ it('gets shader expression for array indexing', function() { var expression = new Expression('${property[0]}'); var shaderExpression = expression.getShaderExpression('', {}); - var expected = 'property[int(0.0)]'; + var expected = 'property[0]'; expect(shaderExpression).toEqual(expected); - expression = new Expression('rgb(0,0,0)[1]'); + expression = new Expression('${property[4 / 2]}'); shaderExpression = expression.getShaderExpression('', {}); - expected = 'vec4(0.0, 0.0, 0.0, 1.0)[int(1.0)]'; + expected = 'property[int((4.0 / 2.0))]'; expect(shaderExpression).toEqual(expected); }); @@ -1892,6 +2092,66 @@ defineSuite([ expect(shaderState.translucent).toBe(true); }); + it('gets shader expression for color components', function() { + // .red, .green, .blue, .alpha + var expression = new Expression('color().red + color().green + color().blue + color().alpha'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = '(((vec4(1.0)[0] + vec4(1.0)[1]) + vec4(1.0)[2]) + vec4(1.0)[3])'; + expect(shaderExpression).toEqual(expected); + + // .x, .y, .z, .w + expression = new Expression('color().x + color().y + color().z + color().w'); + shaderExpression = expression.getShaderExpression('', {}); + expect(shaderExpression).toEqual(expected); + + // [0], [1], [2], [3] + expression = new Expression('color()[0] + color()[1] + color()[2] + color()[3]'); + shaderExpression = expression.getShaderExpression('', {}); + expect(shaderExpression).toEqual(expected); + + // ['red'], ['green'], ['blue'], ['alpha'] + expression = new Expression('color()["red"] + color()["green"] + color()["blue"] + color()["alpha"]'); + shaderExpression = expression.getShaderExpression('', {}); + expect(shaderExpression).toEqual(expected); + + // ['x'], ['y'], ['z'], ['w'] + expression = new Expression('color()["x"] + color()["y"] + color()["z"] + color()["w"]'); + shaderExpression = expression.getShaderExpression('', {}); + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for vector', function() { + var expression = new Expression('vec4(1, 2, 3, 4)'); + var shaderExpression = expression.getShaderExpression('', {}); + expect(shaderExpression).toEqual('vec4(1.0, 2.0, 3.0, 4.0)'); + + expression = new Expression('vec2() + vec3() + vec4()'); + shaderExpression = expression.getShaderExpression('', {}); + expect(shaderExpression).toEqual('((vec4(0.0, 0.0, 0.0, 0.0) + vec4(0.0, 0.0, 0.0, 0.0)) + vec4(0.0, 0.0, 0.0, 0.0))'); + + expression = new Expression('vec4(1, ${property}, vec2(1, 2).x)'); + shaderExpression = expression.getShaderExpression('', {}); + expect(shaderExpression).toEqual('vec4(1.0, property, vec4(1.0, 2.0, 0.0, 0.0)[0], 0.0)'); + }); + + it('gets shader expression for color components', function() { + // .x, .y, .z, .w + var expression = new Expression('vec4().x + vec4().y + vec4().z + vec4().w'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = '(((vec4(0.0, 0.0, 0.0, 0.0)[0] + vec4(0.0, 0.0, 0.0, 0.0)[1]) + vec4(0.0, 0.0, 0.0, 0.0)[2]) + vec4(0.0, 0.0, 0.0, 0.0)[3])'; + expect(shaderExpression).toEqual(expected); + + // [0], [1], [2], [3] + expression = new Expression('vec4()[0] + vec4()[1] + vec4()[2] + vec4()[3]'); + shaderExpression = expression.getShaderExpression('', {}); + expect(shaderExpression).toEqual(expected); + + // ['x'], ['y'], ['z'], ['w'] + expression = new Expression('vec4()["x"] + vec4()["y"] + vec4()["z"] + vec4()["w"]'); + shaderExpression = expression.getShaderExpression('', {}); + expect(shaderExpression).toEqual(expected); + }); + it('gets shader expression for TILES3D_TILESET_TIME', function() { var expression = new Expression('TILES3D_TILESET_TIME'); var shaderExpression = expression.getShaderExpression('', {}); From a5d9c37f56a10629baf885438fdce3368473f0bb Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 15 Dec 2016 10:57:27 -0500 Subject: [PATCH 238/396] Typo --- Specs/Scene/ExpressionSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Specs/Scene/ExpressionSpec.js b/Specs/Scene/ExpressionSpec.js index 006f0e05cd8b..e90349408d1f 100644 --- a/Specs/Scene/ExpressionSpec.js +++ b/Specs/Scene/ExpressionSpec.js @@ -2134,7 +2134,7 @@ defineSuite([ expect(shaderExpression).toEqual('vec4(1.0, property, vec4(1.0, 2.0, 0.0, 0.0)[0], 0.0)'); }); - it('gets shader expression for color components', function() { + it('gets shader expression for vector components', function() { // .x, .y, .z, .w var expression = new Expression('vec4().x + vec4().y + vec4().z + vec4().w'); var shaderExpression = expression.getShaderExpression('', {}); From 5a8ce2a64c224ebbdcbbc1be123f8268d806ec94 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Fri, 16 Dec 2016 14:11:27 +0100 Subject: [PATCH 239/396] Clean up and improve documentation --- Source/Core/Check.js | 123 +++++++++++++++++++++++++------------------ 1 file changed, 71 insertions(+), 52 deletions(-) diff --git a/Source/Core/Check.js b/Source/Core/Check.js index 577928bfadfa..27c53af0ff47 100644 --- a/Source/Core/Check.js +++ b/Source/Core/Check.js @@ -15,128 +15,147 @@ define([ * Contains functions for checking that supplied arguments are of a specified type * or meet specified conditions * @private - * - * @exports Check */ var Check = {}; + /** + * Contains type checking functions, all using the typeof operator + */ Check.typeOf = {}; - Check.numeric = {}; - var errors = { - defined: getUndefinedErrorMessage, - failedType: getFailedTypeErrorMessage - }; + /** + * Contains functions for checking numeric conditions such as minimum and maximum values + */ + Check.numeric = {}; function getUndefinedErrorMessage(name) { - return defaultValue(name, 'a value') + ' is required but is undefined.'; + return defaultValue(name, 'A value') + ' was required but undefined.'; } + function getFailedTypeErrorMessage(actual, expected) { return 'Expected ' + expected + ', got ' + actual; } /** - * @param {} test The value that is to be checked - * @param {string} name The name of the variable being tested - * @throws {DeveloperError} + * Throws if test is not defined + * + * @param {*} test The value that is to be checked + * @param {String} name The name of the variable being tested + * @exception {DeveloperError} test must be defined */ Check.defined = function (test, name) { if (!defined(test)) { - throw new DeveloperError(errors.defined(name)); + throw new DeveloperError(getUndefinedErrorMessage(name)); } }; /** - * @param {} test The value to test - * @param {number} min The minimum allowed value - * @param {number} max The maximum allowed value - * @throws {DeveloperError} + * Throws if test is not with range [minimum, maximum] + * + * @param {*} test The value to test + * @param {Number} minimum The minimum allowed value + * @param {Number} maximum The maximum allowed value + * @exception {DeveloperError} test must be a number in the range [minimum, maximum] */ - Check.numeric.withinRange = function (test, min, max) { + Check.numeric.withinRange = function (test, minimum, maximum) { Check.typeOf.number(test); - Check.typeOf.number(max); - Check.typeOf.number(min); - if (min > max) { - throw new DeveloperError('Invalid condition: min (' + min + ') must be less than max (' + max + ')'); + Check.typeOf.number(maximum); + Check.typeOf.number(minimum); + if (minimum > maximum) { + throw new DeveloperError('Invalid condition: minimum (' + minimum + ') must be less than maximum (' + maximum + ')'); } - if (test > max || test < min) { - throw new DeveloperError('Invalid argument: expected ' + test + ' to be in range [' + min + ', ' + max + ']'); + if (test > maximum || test < minimum) { + throw new DeveloperError('Invalid argument: expected ' + test + ' to be in range [' + minimum + ', ' + maximum + ']'); } }; /** - * @param {number} test The value to test - * @param {number} max The maximum allowed value - * @throws {DeveloperError} + * Throws if test is greater than maximum + * + * @param {Number} test The value to test + * @param {Number} maximum The maximum allowed value + * @exception {DeveloperError} test must not be greater than maximum */ - Check.numeric.maximum = function (test, max) { + Check.numeric.maximum = function (test, maximum) { Check.typeOf.number(test); - Check.typeOf.number(max); - if (test > max) { - throw new DeveloperError('Expected ' + test + ' to be at most ' + max); + Check.typeOf.number(maximum); + if (test > maximum) { + throw new DeveloperError('Expected ' + test + ' to be at most ' + maximum); } }; /** - * @param {number} test The value to test - * @param {number} min The minimum allowed value - * @throws {DeveloperError} + * Throws if test is less than minimum + * + * @param {Number} test The value to test + * @param {Number} minimum The minimum allowed value + * @exception {DeveloperError} test must not be less than mininum */ - Check.numeric.minimum = function (test, min) { + Check.numeric.minimum = function (test, minimum) { Check.typeOf.number(test); - Check.typeOf.number(min); - if (test < min) { - throw new DeveloperError('Expected ' + test + ' to be at least ' + min); + Check.typeOf.number(minimum); + if (test < minimum) { + throw new DeveloperError('Expected ' + test + ' to be at least ' + minimum); } }; /** - * @param {} test The value to test - * @throws {DeveloperError} + * Throws if test is not typeof 'function' + * + * @param {*} test The value to test + * @exception {DeveloperError} test must be typeof 'function' */ Check.typeOf.function = function (test) { if (typeof test !== 'function') { - throw new DeveloperError(errors.failedType(typeof test, 'function')); + throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'function')); } }; /** - * @param {} test The value to test - * @throws {DeveloperError} + * Throws if test is not typeof 'string' + * + * @param {*} test The value to test + * @exception {DeveloperError} test must be typeof 'string' */ Check.typeOf.string = function (test) { if (typeof test !== 'string') { - throw new DeveloperError(errors.failedType(typeof test, 'string')); + throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'string')); } }; /** - * @param {} test The value to test - * @throws {DeveloperError} + * Throws if test is not typeof 'number' + * + * @param {*} test The value to test + * @exception {DeveloperError} test must be typeof 'number' */ Check.typeOf.number = function (test) { if (typeof test !== 'number') { - throw new DeveloperError(errors.failedType(typeof test, 'number')); + throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'number')); } }; /** - * @param {} test The value to test - * @throws {DeveloperError} + * Throws if test is not typeof 'object' + * + * @param {*} test The value to test + * @exception {DeveloperError} test must be typeof 'object' */ Check.typeOf.object = function (test) { if (typeof test !== 'object') { - throw new DeveloperError(errors.failedType(typeof test, 'object')); + throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'object')); } }; /** - * @param {} test The value to test - * @throws {DeveloperError} + * Throws if test is not typeof 'boolean' + * + * @param {*} test The value to test + * @exception {DeveloperError} test must be typeof 'boolean' */ Check.typeOf.boolean = function (test) { if (typeof test !== 'boolean') { - throw new DeveloperError(errors.failedType(typeof test, 'boolean')); + throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'boolean')); } }; From 471736463b081715d849053940954d5ff19637ed Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Fri, 16 Dec 2016 14:31:31 +0100 Subject: [PATCH 240/396] Remove currently unused withinRange function --- Source/Core/Check.js | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/Source/Core/Check.js b/Source/Core/Check.js index 27c53af0ff47..57afd85e0412 100644 --- a/Source/Core/Check.js +++ b/Source/Core/Check.js @@ -49,26 +49,6 @@ define([ } }; - /** - * Throws if test is not with range [minimum, maximum] - * - * @param {*} test The value to test - * @param {Number} minimum The minimum allowed value - * @param {Number} maximum The maximum allowed value - * @exception {DeveloperError} test must be a number in the range [minimum, maximum] - */ - Check.numeric.withinRange = function (test, minimum, maximum) { - Check.typeOf.number(test); - Check.typeOf.number(maximum); - Check.typeOf.number(minimum); - if (minimum > maximum) { - throw new DeveloperError('Invalid condition: minimum (' + minimum + ') must be less than maximum (' + maximum + ')'); - } - if (test > maximum || test < minimum) { - throw new DeveloperError('Invalid argument: expected ' + test + ' to be in range [' + minimum + ', ' + maximum + ']'); - } - }; - /** * Throws if test is greater than maximum * From ec84d53b70fe9377b134c7a517bc0b16fd89ff63 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Fri, 16 Dec 2016 15:06:59 +0100 Subject: [PATCH 241/396] Remove spec for removed function --- Specs/Core/CheckSpec.js | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/Specs/Core/CheckSpec.js b/Specs/Core/CheckSpec.js index ef79d94ef063..a99a1d99d7d4 100644 --- a/Specs/Core/CheckSpec.js +++ b/Specs/Core/CheckSpec.js @@ -124,44 +124,30 @@ defineSuite([ }); }); - describe('numeric tests: min/max/min-max', function () { - it('min throws on value less than min', function () { + describe('Check.numeric', function () { + it('minimum throws on value less than minimum', function () { expect(function () { Check.numeric.minimum(4, 5); }).toThrowDeveloperError(); }); - it('min does not throw on value at least as big as min', function () { + it('minimum does not throw on value at least as big as minimum', function () { expect(function () { Check.numeric.minimum(4, 4); Check.numeric.minimum(4, 3); }).not.toThrowDeveloperError(); }); - it('max throws on value greater than max', function () { + it('maximum throws on value greater than maximum', function () { expect(function () { Check.numeric.maximum(6, 5); }).toThrowDeveloperError(); }); - it('max does not throw on value at most as big as max', function () { + it('maximum does not throw on value at most as big as maximum', function () { expect(function () { Check.numeric.maximum(5, 5); Check.numeric.maximum(4, 5); }).not.toThrowDeveloperError(); }); - - it('minMax throws on value outside range', function () { - expect(function () { - Check.numeric.withinRange(-2, 3, 5); - Check.numeric.withinRange(6, 3, 5); - }).toThrowDeveloperError(); - }); - it('minMax does not throw on value inside range', function () { - expect(function () { - Check.numeric.withinRange(3, 3, 5); - Check.numeric.withinRange(5, 3, 5); - Check.numeric.withinRange(4, 3, 5); - }).not.toThrowDeveloperError(); - }); }); it('Check.defined does not throw unless passed value that is undefined or null', function () { From 984044e39048282d3a526bb867b5fcc0c38c9f39 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Fri, 16 Dec 2016 15:20:11 +0100 Subject: [PATCH 242/396] Replace Check.defined with Check.typeOf.* where appropriate --- Source/Core/Cartesian3.js | 102 +++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/Source/Core/Cartesian3.js b/Source/Core/Cartesian3.js index 0a1709600bfb..8ed6c5f0f8c8 100644 --- a/Source/Core/Cartesian3.js +++ b/Source/Core/Cartesian3.js @@ -266,7 +266,7 @@ define([ */ Cartesian3.maximumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - Check.defined(cartesian, 'cartesian'); + Check.typeOf.object(cartesian); //>>includeEnd('debug'); return Math.max(cartesian.x, cartesian.y, cartesian.z); @@ -280,7 +280,7 @@ define([ */ Cartesian3.minimumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - Check.defined(cartesian, 'cartesian'); + Check.typeOf.object(cartesian); //>>includeEnd('debug'); return Math.min(cartesian.x, cartesian.y, cartesian.z); @@ -296,9 +296,9 @@ define([ */ Cartesian3.minimumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - Check.defined(first,'first'); - Check.defined(second, 'second'); - Check.defined(result, 'result'); + Check.typeOf.object(first); + Check.typeOf.object(second); + Check.typeOf.object(result); //>>includeEnd('debug'); result.x = Math.min(first.x, second.x); @@ -318,9 +318,9 @@ define([ */ Cartesian3.maximumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - Check.defined(first, 'first'); - Check.defined(second, 'second'); - Check.defined(result, 'result'); + Check.typeOf.object(first); + Check.typeOf.object(second); + Check.typeOf.object(result); //>>includeEnd('debug'); result.x = Math.max(first.x, second.x); @@ -337,7 +337,7 @@ define([ */ Cartesian3.magnitudeSquared = function(cartesian) { //>>includeStart('debug', pragmas.debug); - Check.defined(cartesian, 'cartesian'); + Check.typeOf.object(cartesian); //>>includeEnd('debug'); return cartesian.x * cartesian.x + cartesian.y * cartesian.y + cartesian.z * cartesian.z; @@ -368,8 +368,8 @@ define([ */ Cartesian3.distance = function(left, right) { //>>includeStart('debug', pragmas.debug); - Check.defined(left, 'left'); - Check.defined(right, 'right'); + Check.typeOf.object(left); + Check.typeOf.object(right); //>>includeEnd('debug'); Cartesian3.subtract(left, right, distanceScratch); @@ -390,8 +390,8 @@ define([ */ Cartesian3.distanceSquared = function(left, right) { //>>includeStart('debug', pragmas.debug); - Check.defined(left, 'left'); - Check.defined(right, 'right'); + Check.typeOf.object(left); + Check.typeOf.object(right); //>>includeEnd('debug'); Cartesian3.subtract(left, right, distanceScratch); @@ -407,8 +407,8 @@ define([ */ Cartesian3.normalize = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - Check.defined(cartesian, 'cartesian'); - Check.defined(result, 'result'); + Check.typeOf.object(cartesian); + Check.typeOf.object(result); //>>includeEnd('debug'); var magnitude = Cartesian3.magnitude(cartesian); @@ -435,8 +435,8 @@ define([ */ Cartesian3.dot = function(left, right) { //>>includeStart('debug', pragmas.debug); - Check.defined(left, 'left'); - Check.defined(right, 'right'); + Check.typeOf.object(left); + Check.typeOf.object(right); //>>includeEnd('debug'); return left.x * right.x + left.y * right.y + left.z * right.z; @@ -452,9 +452,9 @@ define([ */ Cartesian3.multiplyComponents = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - Check.defined(left, 'left'); - Check.defined(right, 'right'); - Check.defined(result, 'result'); + Check.typeOf.object(left); + Check.typeOf.object(right); + Check.typeOf.object(result); //>>includeEnd('debug'); result.x = left.x * right.x; @@ -473,9 +473,9 @@ define([ */ Cartesian3.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - Check.defined(left, 'left'); - Check.defined(right, 'right'); - Check.defined(result, 'result'); + Check.typeOf.object(left); + Check.typeOf.object(right); + Check.typeOf.object(result); //>>includeEnd('debug'); result.x = left.x + right.x; @@ -494,9 +494,9 @@ define([ */ Cartesian3.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - Check.defined(left, 'left'); - Check.defined(right, 'right'); - Check.defined(result, 'result'); + Check.typeOf.object(left); + Check.typeOf.object(right); + Check.typeOf.object(result); //>>includeEnd('debug'); result.x = left.x - right.x; @@ -515,9 +515,9 @@ define([ */ Cartesian3.multiplyByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - Check.defined(cartesian, 'cartesian'); - Check.defined(scalar, 'scalar'); - Check.defined(result, 'result'); + Check.typeOf.object(cartesian); + Check.typeOf.number(scalar); + Check.typeOf.object(result); //>>includeEnd('debug'); result.x = cartesian.x * scalar; @@ -536,9 +536,9 @@ define([ */ Cartesian3.divideByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - Check.defined(cartesian, 'cartesian'); - Check.defined(scalar, 'scalar'); - Check.defined(result, 'result'); + Check.typeOf.object(cartesian); + Check.typeOf.number(scalar); + Check.typeOf.object(result); //>>includeEnd('debug'); result.x = cartesian.x / scalar; @@ -556,8 +556,8 @@ define([ */ Cartesian3.negate = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - Check.defined(cartesian, 'cartesian'); - Check.defined(result, 'result'); + Check.typeOf.object(cartesian); + Check.typeOf.object(result); //>>includeEnd('debug'); result.x = -cartesian.x; @@ -575,8 +575,8 @@ define([ */ Cartesian3.abs = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - Check.defined(cartesian, 'cartesian'); - Check.defined(result, 'result'); + Check.typeOf.object(cartesian); + Check.typeOf.object(result); //>>includeEnd('debug'); result.x = Math.abs(cartesian.x); @@ -597,10 +597,10 @@ define([ */ Cartesian3.lerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - Check.defined(start, 'start'); - Check.defined(end, 'end'); - Check.defined(t, 't'); - Check.defined(result, 'result'); + Check.typeOf.object(start); + Check.typeOf.object(end); + Check.typeOf.number(t); + Check.typeOf.object(result); //>>includeEnd('debug'); Cartesian3.multiplyByScalar(end, t, lerpScratch); @@ -619,8 +619,8 @@ define([ */ Cartesian3.angleBetween = function(left, right) { //>>includeStart('debug', pragmas.debug); - Check.defined(left, 'left'); - Check.defined(right, 'right'); + Check.typeOf.object(left); + Check.typeOf.object(right); //>>includeEnd('debug'); Cartesian3.normalize(left, angleBetweenScratch); @@ -640,8 +640,8 @@ define([ */ Cartesian3.mostOrthogonalAxis = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - Check.defined(cartesian, 'cartesian'); - Check.defined(result, 'result'); + Check.typeOf.object(cartesian); + Check.typeOf.object(result); //>>includeEnd('debug'); var f = Cartesian3.normalize(cartesian, mostOrthogonalAxisScratch); @@ -720,9 +720,9 @@ define([ */ Cartesian3.cross = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - Check.defined(left, 'left'); - Check.defined(right, 'right'); - Check.defined(result, 'result'); + Check.typeOf.object(left); + Check.typeOf.object(right); + Check.typeOf.object(result); //>>includeEnd('debug'); var leftX = left.x; @@ -757,8 +757,8 @@ define([ */ Cartesian3.fromDegrees = function(longitude, latitude, height, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - Check.defined(longitude, 'longitude'); - Check.defined(latitude, 'latitude'); + Check.typeOf.number(longitude); + Check.typeOf.number(latitude); //>>includeEnd('debug'); longitude = CesiumMath.toRadians(longitude); @@ -785,8 +785,8 @@ define([ */ Cartesian3.fromRadians = function(longitude, latitude, height, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - Check.defined(longitude, 'longitude'); - Check.defined(latitude, 'latitude'); + Check.typeOf.number(longitude); + Check.typeOf.number(latitude); //>>includeEnd('debug'); height = defaultValue(height, 0.0); From 736ea8847ab798c3b4706dc58ee0862514e9825e Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Fri, 16 Dec 2016 16:00:58 +0100 Subject: [PATCH 243/396] Made all typeof checks take a name argument indication the variable name being checked --- Source/Core/Cartesian3.js | 106 +++++++++++++++++++------------------- Source/Core/Check.js | 31 ++++++----- Specs/Core/CheckSpec.js | 68 ++++++++++++------------ 3 files changed, 105 insertions(+), 100 deletions(-) diff --git a/Source/Core/Cartesian3.js b/Source/Core/Cartesian3.js index 8ed6c5f0f8c8..a547f4d07e7c 100644 --- a/Source/Core/Cartesian3.js +++ b/Source/Core/Cartesian3.js @@ -60,7 +60,7 @@ define([ */ Cartesian3.fromSpherical = function(spherical, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(spherical); + Check.typeOf.object(spherical, 'spherical'); //>>includeEnd('debug'); if (!defined(result)) { @@ -146,7 +146,7 @@ define([ */ Cartesian3.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(value); + Check.typeOf.object(value, 'value'); Check.defined(array, 'array'); //>>includeEnd('debug'); @@ -266,7 +266,7 @@ define([ */ Cartesian3.maximumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(cartesian); + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.max(cartesian.x, cartesian.y, cartesian.z); @@ -280,7 +280,7 @@ define([ */ Cartesian3.minimumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(cartesian); + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.min(cartesian.x, cartesian.y, cartesian.z); @@ -296,9 +296,9 @@ define([ */ Cartesian3.minimumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(first); - Check.typeOf.object(second); - Check.typeOf.object(result); + Check.typeOf.object(first, 'first'); + Check.typeOf.object(second, 'second'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.min(first.x, second.x); @@ -318,9 +318,9 @@ define([ */ Cartesian3.maximumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(first); - Check.typeOf.object(second); - Check.typeOf.object(result); + Check.typeOf.object(first, 'first'); + Check.typeOf.object(second, 'second'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.max(first.x, second.x); @@ -337,7 +337,7 @@ define([ */ Cartesian3.magnitudeSquared = function(cartesian) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(cartesian); + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return cartesian.x * cartesian.x + cartesian.y * cartesian.y + cartesian.z * cartesian.z; @@ -368,8 +368,8 @@ define([ */ Cartesian3.distance = function(left, right) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(left); - Check.typeOf.object(right); + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); Cartesian3.subtract(left, right, distanceScratch); @@ -390,8 +390,8 @@ define([ */ Cartesian3.distanceSquared = function(left, right) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(left); - Check.typeOf.object(right); + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); Cartesian3.subtract(left, right, distanceScratch); @@ -407,8 +407,8 @@ define([ */ Cartesian3.normalize = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(cartesian); - Check.typeOf.object(result); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var magnitude = Cartesian3.magnitude(cartesian); @@ -435,8 +435,8 @@ define([ */ Cartesian3.dot = function(left, right) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(left); - Check.typeOf.object(right); + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); return left.x * right.x + left.y * right.y + left.z * right.z; @@ -452,9 +452,9 @@ define([ */ Cartesian3.multiplyComponents = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(left); - Check.typeOf.object(right); - Check.typeOf.object(result); + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x * right.x; @@ -473,9 +473,9 @@ define([ */ Cartesian3.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(left); - Check.typeOf.object(right); - Check.typeOf.object(result); + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x + right.x; @@ -494,9 +494,9 @@ define([ */ Cartesian3.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(left); - Check.typeOf.object(right); - Check.typeOf.object(result); + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x - right.x; @@ -515,9 +515,9 @@ define([ */ Cartesian3.multiplyByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(cartesian); - Check.typeOf.number(scalar); - Check.typeOf.object(result); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x * scalar; @@ -536,9 +536,9 @@ define([ */ Cartesian3.divideByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(cartesian); - Check.typeOf.number(scalar); - Check.typeOf.object(result); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x / scalar; @@ -556,8 +556,8 @@ define([ */ Cartesian3.negate = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(cartesian); - Check.typeOf.object(result); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = -cartesian.x; @@ -575,8 +575,8 @@ define([ */ Cartesian3.abs = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(cartesian); - Check.typeOf.object(result); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.abs(cartesian.x); @@ -597,10 +597,10 @@ define([ */ Cartesian3.lerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(start); - Check.typeOf.object(end); - Check.typeOf.number(t); - Check.typeOf.object(result); + Check.typeOf.object(start, 'start'); + Check.typeOf.object(end, 'end'); + Check.typeOf.number(t, 't);'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); Cartesian3.multiplyByScalar(end, t, lerpScratch); @@ -619,8 +619,8 @@ define([ */ Cartesian3.angleBetween = function(left, right) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(left); - Check.typeOf.object(right); + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); Cartesian3.normalize(left, angleBetweenScratch); @@ -640,8 +640,8 @@ define([ */ Cartesian3.mostOrthogonalAxis = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(cartesian); - Check.typeOf.object(result); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var f = Cartesian3.normalize(cartesian, mostOrthogonalAxisScratch); @@ -720,9 +720,9 @@ define([ */ Cartesian3.cross = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(left); - Check.typeOf.object(right); - Check.typeOf.object(result); + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var leftX = left.x; @@ -757,8 +757,8 @@ define([ */ Cartesian3.fromDegrees = function(longitude, latitude, height, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.number(longitude); - Check.typeOf.number(latitude); + Check.typeOf.number(longitude, 'longitude'); + Check.typeOf.number(latitude, 'latitude'); //>>includeEnd('debug'); longitude = CesiumMath.toRadians(longitude); @@ -785,8 +785,8 @@ define([ */ Cartesian3.fromRadians = function(longitude, latitude, height, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.number(longitude); - Check.typeOf.number(latitude); + Check.typeOf.number(longitude, 'longitude'); + Check.typeOf.number(latitude, 'latitude'); //>>includeEnd('debug'); height = defaultValue(height, 0.0); diff --git a/Source/Core/Check.js b/Source/Core/Check.js index 57afd85e0412..8d3a49e308ef 100644 --- a/Source/Core/Check.js +++ b/Source/Core/Check.js @@ -29,11 +29,11 @@ define([ Check.numeric = {}; function getUndefinedErrorMessage(name) { - return defaultValue(name, 'A value') + ' was required but undefined.'; + return name + ' was required but undefined.'; } - function getFailedTypeErrorMessage(actual, expected) { - return 'Expected ' + expected + ', got ' + actual; + function getFailedTypeErrorMessage(actual, expected, name) { + return 'Expected ' + name + ' to be typeof ' + expected + ', got ' + actual; } /** @@ -83,11 +83,12 @@ define([ * Throws if test is not typeof 'function' * * @param {*} test The value to test + * @param {String} name The name of the variable being tested * @exception {DeveloperError} test must be typeof 'function' */ - Check.typeOf.function = function (test) { + Check.typeOf.function = function (test, name) { if (typeof test !== 'function') { - throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'function')); + throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'function', name)); } }; @@ -95,11 +96,12 @@ define([ * Throws if test is not typeof 'string' * * @param {*} test The value to test + * @param {String} name The name of the variable being tested * @exception {DeveloperError} test must be typeof 'string' */ - Check.typeOf.string = function (test) { + Check.typeOf.string = function (test, name) { if (typeof test !== 'string') { - throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'string')); + throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'string', name)); } }; @@ -107,11 +109,12 @@ define([ * Throws if test is not typeof 'number' * * @param {*} test The value to test + * @param {String} name The name of the variable being tested * @exception {DeveloperError} test must be typeof 'number' */ - Check.typeOf.number = function (test) { + Check.typeOf.number = function (test, name) { if (typeof test !== 'number') { - throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'number')); + throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'number', name)); } }; @@ -119,11 +122,12 @@ define([ * Throws if test is not typeof 'object' * * @param {*} test The value to test + * @param {String} name The name of the variable being tested * @exception {DeveloperError} test must be typeof 'object' */ - Check.typeOf.object = function (test) { + Check.typeOf.object = function (test, name) { if (typeof test !== 'object') { - throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'object')); + throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'object', name)); } }; @@ -131,11 +135,12 @@ define([ * Throws if test is not typeof 'boolean' * * @param {*} test The value to test + * @param {String} name The name of the variable being tested * @exception {DeveloperError} test must be typeof 'boolean' */ - Check.typeOf.boolean = function (test) { + Check.typeOf.boolean = function (test, name) { if (typeof test !== 'boolean') { - throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'boolean')); + throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'boolean', name)); } }; diff --git a/Specs/Core/CheckSpec.js b/Specs/Core/CheckSpec.js index a99a1d99d7d4..df0aebc938d4 100644 --- a/Specs/Core/CheckSpec.js +++ b/Specs/Core/CheckSpec.js @@ -14,112 +14,112 @@ defineSuite([ it('Check.typeOf.boolean throws when passed a non-boolean', function () { expect(function () { - Check.typeOf.boolean({}); + Check.typeOf.boolean({}, 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.boolean([]); + Check.typeOf.boolean([], 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.boolean(1); + Check.typeOf.boolean(1, 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.boolean('snth'); + Check.typeOf.boolean('snth', 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.boolean(function () {return true;}); + Check.typeOf.boolean(function () {return true;}, 'mockName'); }).toThrowDeveloperError(); }); it('Check.typeOf.function does not throw when passed a function', function () { expect(function () { - Check.typeOf.function(function () {return true;}); + Check.typeOf.function(function () {return true;}, 'mockName'); }).not.toThrowDeveloperError(); }); it('Check.typeOf.function throws when passed a non-function', function () { expect(function () { - Check.typeOf.function({}); + Check.typeOf.function({}, 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.function([]); + Check.typeOf.function([], 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.function(1); + Check.typeOf.function(1, 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.function('snth'); + Check.typeOf.function('snth', 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.function(true); + Check.typeOf.function(true, 'mockName'); }).toThrowDeveloperError(); }); it('Check.typeOf.object does not throw when passed object', function() { expect(function () { - Check.typeOf.object({}); + Check.typeOf.object({}, 'mockName'); }).not.toThrowDeveloperError(); }); it('Check.typeOf.object throws when passed non-object', function() { expect(function () { - Check.typeOf.object('snth'); + Check.typeOf.object('snth', 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.object(true); + Check.typeOf.object(true, 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.object(1); + Check.typeOf.object(1, 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.object(function () {return true;}); + Check.typeOf.object(function () {return true;}, 'mockName'); }).toThrowDeveloperError(); }); it('Check.typeOf.number does not throw when passed number', function() { expect(function () { - Check.typeOf.number(2); + Check.typeOf.number(2, 'mockName'); }).not.toThrowDeveloperError(); }); it('Check.typeOf.number throws when passed non-number', function() { expect(function () { - Check.typeOf.number('snth'); + Check.typeOf.number('snth', 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.number(true); + Check.typeOf.number(true, 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.number({}); + Check.typeOf.number({}, 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.number([2]); + Check.typeOf.number([2], 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.number(function () {return true;}); + Check.typeOf.number(function () {return true;}, 'mockName'); }).toThrowDeveloperError(); }); it('Check.typeOf.string does not throw when passed a string', function () { expect(function () { - Check.typeOf.string('s'); + Check.typeOf.string('s', 'mockName'); }).not.toThrowDeveloperError(); }); it('Check.typeOf.string throws on non-string', function () { expect(function () { - Check.typeOf.string({}); + Check.typeOf.string({}, 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.string(true); + Check.typeOf.string(true, 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.string(1); + Check.typeOf.string(1, 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.string([2]); + Check.typeOf.string([2], 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.string(function () {return true;}); + Check.typeOf.string(function () {return true;}, 'mockName'); }).toThrowDeveloperError(); }); }); @@ -152,25 +152,25 @@ defineSuite([ it('Check.defined does not throw unless passed value that is undefined or null', function () { expect(function () { - Check.defined({}); + Check.defined({}, 'mockName'); }).not.toThrowDeveloperError(); expect(function () { - Check.defined([]); + Check.defined([], 'mockName'); }).not.toThrowDeveloperError(); expect(function () { - Check.defined(2); + Check.defined(2, 'mockName'); }).not.toThrowDeveloperError(); expect(function () { - Check.defined(function() {return true;}); + Check.defined(function() {return true;}, 'mockName'); }).not.toThrowDeveloperError(); expect(function () { - Check.defined('snt'); + Check.defined('snt', 'mockName'); }).not.toThrowDeveloperError(); }); it('Check.defined throws when passed undefined', function () { expect(function () { - Check.defined(undefined); + Check.defined(undefined, 'mockName'); }).toThrowDeveloperError(); }); From 3828e112d02286ad6098fd9bd30815a1047b9f9a Mon Sep 17 00:00:00 2001 From: Dylan Brown Date: Fri, 16 Dec 2016 12:20:01 -0500 Subject: [PATCH 244/396] Implementation of ternary functions --- .../gallery/3D Tiles Point Cloud Styling.html | 5 ++ Source/Scene/Expression.js | 87 ++++++++++++------- Source/Scene/ExpressionNodeType.js | 35 ++++---- Specs/Scene/ExpressionSpec.js | 66 ++++++++++++++ 4 files changed, 147 insertions(+), 46 deletions(-) diff --git a/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html b/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html index 7d2a15bae834..79d7e169438b 100644 --- a/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html +++ b/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html @@ -134,6 +134,11 @@ pointSize : "5" }); +addStyle('Clamp and Mix', { + color : "clamp(color(), 0.0, 100.0)", + pointSize : "mix(0.0, 2.0, 0.5) * 5" +}); + addStyle('Secondary Color', { color : { expression : "[${secondaryColor}[0], ${secondaryColor}[1], ${secondaryColor}[2], 1.0]", diff --git a/Source/Scene/Expression.js b/Source/Scene/Expression.js index 7edb2d791ee2..1010b58b5953 100644 --- a/Source/Scene/Expression.js +++ b/Source/Scene/Expression.js @@ -65,6 +65,11 @@ define([ degrees : CesiumMath.toDegrees }; + var ternaryFunctions = { + clamp : CesiumMath.clamp, + mix : CesiumMath.lerp + }; + /** * Evaluates an expression defined using the * {@link https://github.com/AnalyticalGraphicsInc/3d-tiles/tree/master/Styling|3D Tiles Styling language}. @@ -394,6 +399,16 @@ define([ left = createRuntimeAst(expression, args[0]); right = createRuntimeAst(expression, args[1]); return new Node(ExpressionNodeType.BINARY, call, left, right); + } else if (defined(ternaryFunctions[call])) { + //>>includeStart('debug', pragmas.debug); + if (args.length < 3 || args.length > 3) { + throw new DeveloperError('Error: ' + call + ' requires exactly three arguments.'); + } + //>>includeEnd('debug'); + left = createRuntimeAst(expression, args[0]); + right = createRuntimeAst(expression, args[1]); + var test = createRuntimeAst(expression, args[2]); + return new Node(ExpressionNodeType.TERNARY, call, left, right, test); } else if (call === 'Boolean') { if (args.length === 0) { return new Node(ExpressionNodeType.LITERAL_BOOLEAN, false); @@ -582,6 +597,32 @@ define([ } else if (node._value === 'toString') { node.evaluate = node._evaluateToString; } + } else if (node._type === ExpressionNodeType.UNARY) { + if (node._value === '!') { + node.evaluate = node._evaluateNot; + } else if (node._value === '-') { + node.evaluate = node._evaluateNegative; + } else if (node._value === '+') { + node.evaluate = node._evaluatePositive; + } else if (node._value === 'isNaN') { + node.evaluate = node._evaluateNaN; + } else if (node._value === 'isFinite') { + node.evaluate = node._evaluateIsFinite; + } else if (node._value === 'isExactClass') { + node.evaluate = node._evaluateIsExactClass; + } else if (node._value === 'isClass') { + node.evaluate = node._evaluateIsClass; + } else if (node._value === 'getExactClassName') { + node.evaluate = node._evaluategetExactClassName; + } else if (defined(unaryFunctions[node._value])) { + node.evaluate = getEvaluateUnaryFunction(node._value); + } else if (node._value === 'Boolean') { + node.evaluate = node._evaluateBooleanConversion; + } else if (node._value === 'Number') { + node.evaluate = node._evaluateNumberConversion; + } else if (node._value === 'String') { + node.evaluate = node._evaluateStringConversion; + } } else if (node._type === ExpressionNodeType.BINARY) { if (node._value === '+') { node.evaluate = node._evaluatePlus; @@ -620,32 +661,8 @@ define([ } else if (defined(binaryFunctions[node._value])) { node.evaluate = getEvaluateBinaryFunction(node._value); } - } else if (node._type === ExpressionNodeType.UNARY) { - if (node._value === '!') { - node.evaluate = node._evaluateNot; - } else if (node._value === '-') { - node.evaluate = node._evaluateNegative; - } else if (node._value === '+') { - node.evaluate = node._evaluatePositive; - } else if (node._value === 'isNaN') { - node.evaluate = node._evaluateNaN; - } else if (node._value === 'isFinite') { - node.evaluate = node._evaluateIsFinite; - } else if (node._value === 'isExactClass') { - node.evaluate = node._evaluateIsExactClass; - } else if (node._value === 'isClass') { - node.evaluate = node._evaluateIsClass; - } else if (node._value === 'getExactClassName') { - node.evaluate = node._evaluategetExactClassName; - } else if (defined(unaryFunctions[node._value])) { - node.evaluate = getEvaluateUnaryFunction(node._value); - } else if (node._value === 'Boolean') { - node.evaluate = node._evaluateBooleanConversion; - } else if (node._value === 'Number') { - node.evaluate = node._evaluateNumberConversion; - } else if (node._value === 'String') { - node.evaluate = node._evaluateStringConversion; - } + } else if (node._type === ExpressionNodeType.TERNARY) { + node.evaluate = getEvaluateTernaryFunction(node._value); } else if (node._type === ExpressionNodeType.MEMBER) { if (node._value === 'brackets') { node.evaluate = node._evaluateMemberBrackets; @@ -677,6 +694,13 @@ define([ return feature._content._tileset.timeSinceLoad; } + function getEvaluateUnaryFunction(call) { + var evaluate = unaryFunctions[call]; + return function(feature) { + return evaluate(this._left.evaluate(feature)); + }; + } + function getEvaluateBinaryFunction(call) { var evaluate = binaryFunctions[call]; return function(feature) { @@ -684,10 +708,10 @@ define([ }; } - function getEvaluateUnaryFunction(call) { - var evaluate = unaryFunctions[call]; + function getEvaluateTernaryFunction(call) { + var evaluate = ternaryFunctions[call]; return function(feature) { - return evaluate(this._left.evaluate(feature)); + return evaluate(this._left.evaluate(feature), this._right.evaluate(feature), this._test.evaluate(feature)); }; } @@ -1246,6 +1270,11 @@ define([ return value + '(' + left + ', ' + right + ')'; } return '(' + left + ' ' + value + ' ' + right + ')'; + case ExpressionNodeType.TERNARY: + if (defined(ternaryFunctions[value])) { + return value + '(' + left + ', ' + right + ', ' + test + ')'; + } + break; case ExpressionNodeType.CONDITIONAL: return '(' + test + ' ? ' + left + ' : ' + right + ')'; case ExpressionNodeType.MEMBER: diff --git a/Source/Scene/ExpressionNodeType.js b/Source/Scene/ExpressionNodeType.js index 072a7aa34707..d13c71d4a127 100644 --- a/Source/Scene/ExpressionNodeType.js +++ b/Source/Scene/ExpressionNodeType.js @@ -1,8 +1,8 @@ /*global define*/ define([ - '../Core/freezeObject' - ], function( - freezeObject) { + '../Core/freezeObject' +], function( + freezeObject) { 'use strict'; /** @@ -12,20 +12,21 @@ define([ VARIABLE : 0, UNARY : 1, BINARY : 2, - CONDITIONAL : 3, - MEMBER : 4, - FUNCTION_CALL : 5, - ARRAY : 6, - REGEX: 7, - VARIABLE_IN_STRING : 8, - LITERAL_NULL : 9, - LITERAL_BOOLEAN : 10, - LITERAL_NUMBER : 11, - LITERAL_STRING : 12, - LITERAL_COLOR : 13, - LITERAL_REGEX : 14, - LITERAL_UNDEFINED : 15, - LITERAL_GLOBAL : 16 + TERNARY : 3, + CONDITIONAL : 4, + MEMBER : 5, + FUNCTION_CALL : 6, + ARRAY : 7, + REGEX: 8, + VARIABLE_IN_STRING : 9, + LITERAL_NULL : 10, + LITERAL_BOOLEAN : 11, + LITERAL_NUMBER : 12, + LITERAL_STRING : 13, + LITERAL_COLOR : 14, + LITERAL_REGEX : 15, + LITERAL_UNDEFINED : 16, + LITERAL_GLOBAL : 17 }; return freezeObject(ExpressionNodeType); diff --git a/Specs/Scene/ExpressionSpec.js b/Specs/Scene/ExpressionSpec.js index 19c546e74840..c8b8ced4c52d 100644 --- a/Specs/Scene/ExpressionSpec.js +++ b/Specs/Scene/ExpressionSpec.js @@ -1064,6 +1064,58 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('evaluates clamp function', function() { + var expression = new Expression('clamp(50.0, 0.0, 100.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(50.0); + + expression = new Expression('clamp(50.0, 0.0, 25.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(25.0); + + expression = new Expression('clamp(50.0, 75.0, 100.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(75.0); + }); + + it('throws if clamp function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('clamp()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('clamp(1)'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('clamp(1, 2)'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('clamp(1, 2, 3, 4)'); + }).toThrowDeveloperError(); + }); + + it('evaluates mix function', function() { + var expression = new Expression('mix(0.0, 2.0, 0.5)'); + expect(expression.evaluate(frameState, undefined)).toEqual(1.0); + }); + + it('throws if mix function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('mix()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('mix(1)'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('mix(1, 2)'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('mix(1, 2, 3, 4)'); + }).toThrowDeveloperError(); + }); + it('evaluates atan2 function', function() { var expression = new Expression('atan2(0,1)'); expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(0.0, CesiumMath.EPSILON10); @@ -1955,6 +2007,20 @@ defineSuite([ expect(shaderExpression).toEqual(expected); }); + it('gets shader expression for clamp', function() { + var expression = new Expression('clamp(50.0, 0.0, 100.0)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'clamp(50.0, 0.0, 100.0)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for mix', function() { + var expression = new Expression('mix(0.0, 2.0, 0.5)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'mix(0.0, 2.0, 0.5)'; + expect(shaderExpression).toEqual(expected); + }); + it('gets shader expression for atan2', function() { var expression = new Expression('atan2(0.0,1.0)'); var shaderExpression = expression.getShaderExpression('', {}); From 672a03e1f6b517ced806d35711907e78997f6c4f Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Fri, 16 Dec 2016 18:39:25 +0100 Subject: [PATCH 245/396] Fix typo --- Source/Core/Cartesian3.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/Cartesian3.js b/Source/Core/Cartesian3.js index a547f4d07e7c..11f003944b19 100644 --- a/Source/Core/Cartesian3.js +++ b/Source/Core/Cartesian3.js @@ -599,7 +599,7 @@ define([ //>>includeStart('debug', pragmas.debug); Check.typeOf.object(start, 'start'); Check.typeOf.object(end, 'end'); - Check.typeOf.number(t, 't);'); + Check.typeOf.number(t, 't'); Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); From 34f3f11da51b1f2f122dcd1ef19b1171b5bb6f2b Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Fri, 16 Dec 2016 18:52:21 +0100 Subject: [PATCH 246/396] Add exception documentation --- Source/Core/Check.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/Core/Check.js b/Source/Core/Check.js index 8d3a49e308ef..4183a6fe064e 100644 --- a/Source/Core/Check.js +++ b/Source/Core/Check.js @@ -55,6 +55,7 @@ define([ * @param {Number} test The value to test * @param {Number} maximum The maximum allowed value * @exception {DeveloperError} test must not be greater than maximum + * @exception {DeveloperError} Both test and maximum must be typeof 'number' */ Check.numeric.maximum = function (test, maximum) { Check.typeOf.number(test); @@ -70,6 +71,7 @@ define([ * @param {Number} test The value to test * @param {Number} minimum The minimum allowed value * @exception {DeveloperError} test must not be less than mininum + * @exception {DeveloperError} Both test and maximum must be typeof 'number' */ Check.numeric.minimum = function (test, minimum) { Check.typeOf.number(test); From d11f26feb61f8b6144969216eeefd42cd11c890d Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Fri, 16 Dec 2016 13:21:02 -0500 Subject: [PATCH 247/396] Unrelated cleanup --- Source/Scene/Expression.js | 14 +++++++------- Source/Scene/ExpressionNodeType.js | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Source/Scene/Expression.js b/Source/Scene/Expression.js index 1010b58b5953..d3eaaa8b4f55 100644 --- a/Source/Scene/Expression.js +++ b/Source/Scene/Expression.js @@ -384,7 +384,7 @@ define([ return new Node(ExpressionNodeType.UNARY, call); } else if (defined(unaryFunctions[call])) { //>>includeStart('debug', pragmas.debug); - if (args.length < 1 || args.length > 1) { + if (args.length !== 1) { throw new DeveloperError('Error: ' + call + ' requires exactly one argument.'); } //>>includeEnd('debug'); @@ -392,7 +392,7 @@ define([ return new Node(ExpressionNodeType.UNARY, call, val); } else if (defined(binaryFunctions[call])) { //>>includeStart('debug', pragmas.debug); - if (args.length < 2 || args.length > 2) { + if (args.length !== 2) { throw new DeveloperError('Error: ' + call + ' requires exactly two arguments.'); } //>>includeEnd('debug'); @@ -401,7 +401,7 @@ define([ return new Node(ExpressionNodeType.BINARY, call, left, right); } else if (defined(ternaryFunctions[call])) { //>>includeStart('debug', pragmas.debug); - if (args.length < 3 || args.length > 3) { + if (args.length !== 3) { throw new DeveloperError('Error: ' + call + ' requires exactly three arguments.'); } //>>includeEnd('debug'); @@ -614,14 +614,14 @@ define([ node.evaluate = node._evaluateIsClass; } else if (node._value === 'getExactClassName') { node.evaluate = node._evaluategetExactClassName; - } else if (defined(unaryFunctions[node._value])) { - node.evaluate = getEvaluateUnaryFunction(node._value); } else if (node._value === 'Boolean') { node.evaluate = node._evaluateBooleanConversion; } else if (node._value === 'Number') { node.evaluate = node._evaluateNumberConversion; } else if (node._value === 'String') { node.evaluate = node._evaluateStringConversion; + } else if (defined(unaryFunctions[node._value])) { + node.evaluate = getEvaluateUnaryFunction(node._value); } } else if (node._type === ExpressionNodeType.BINARY) { if (node._value === '+') { @@ -1241,14 +1241,14 @@ define([ return 'bool(' + left + ')'; } else if (value === 'Number') { return 'float(' + left + ')'; - } else if (defined(unaryFunctions[value])) { - return value + '(' + left + ')'; } else if (value === 'abs') { return 'abs(' + left + ')'; } else if (value === 'cos') { return 'cos(' + left + ')'; } else if (value === 'sqrt') { return 'sqrt(' + left + ')'; + } else if (defined(unaryFunctions[value])) { + return value + '(' + left + ')'; } //>>includeStart('debug', pragmas.debug); else if ((value === 'isNaN') || (value === 'isFinite') || (value === 'String') || (value === 'isExactClass') || (value === 'isClass') || (value === 'getExactClassName')) { diff --git a/Source/Scene/ExpressionNodeType.js b/Source/Scene/ExpressionNodeType.js index d13c71d4a127..bf8ccd9e9094 100644 --- a/Source/Scene/ExpressionNodeType.js +++ b/Source/Scene/ExpressionNodeType.js @@ -1,8 +1,8 @@ /*global define*/ define([ - '../Core/freezeObject' + '../Core/freezeObject' ], function( - freezeObject) { + freezeObject) { 'use strict'; /** From eddc070ffa00dec54e827aef8ea636ce5b210e8b Mon Sep 17 00:00:00 2001 From: Dylan Brown Date: Fri, 16 Dec 2016 15:17:19 -0500 Subject: [PATCH 248/396] Updated style example to per-point property --- Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html b/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html index 79d7e169438b..7a77ca28ff15 100644 --- a/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html +++ b/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html @@ -135,7 +135,7 @@ }); addStyle('Clamp and Mix', { - color : "clamp(color(), 0.0, 100.0)", + color : "clamp(${temperature}, 0.1, 0.2)", pointSize : "mix(0.0, 2.0, 0.5) * 5" }); From f10c75f3d99d5a6966e3bb4ccca379fcb0c703ea Mon Sep 17 00:00:00 2001 From: hpinkos Date: Fri, 16 Dec 2016 17:29:40 -0500 Subject: [PATCH 249/396] chain geocoder promises --- Source/Core/BingMapsGeocoderService.js | 34 ++--- Source/Core/CartographicGeocoderService.js | 31 ++-- Source/Core/GeocoderService.js | 16 -- Source/Widgets/Geocoder/Geocoder.css | 1 + Source/Widgets/Geocoder/Geocoder.js | 3 +- Source/Widgets/Geocoder/GeocoderViewModel.js | 153 +++++++++---------- 6 files changed, 95 insertions(+), 143 deletions(-) diff --git a/Source/Core/BingMapsGeocoderService.js b/Source/Core/BingMapsGeocoderService.js index 1ff29ec6b2ba..52f73196cf6e 100644 --- a/Source/Core/BingMapsGeocoderService.js +++ b/Source/Core/BingMapsGeocoderService.js @@ -2,13 +2,17 @@ define([ './BingMapsApi', './defaultValue', + './defined', './defineProperties', + './DeveloperError', './loadJsonp', - './Rectangle', + './Rectangle' ], function( BingMapsApi, defaultValue, + defined, defineProperties, + DeveloperError, loadJsonp, Rectangle) { 'use strict'; @@ -26,23 +30,16 @@ define([ */ function BingMapsGeocoderService(options) { options = defaultValue(options, defaultValue.EMPTY_OBJECT); - this._canceled = false; this._url = 'https://dev.virtualearth.net/REST/v1/Locations'; this._key = BingMapsApi.getKey(options.key); - - /** - * Indicates whether this geocoding service is to be used for autocomplete. - * - * @type {boolean} - * @default false - */ - this.autoComplete = defaultValue(options.autoComplete, false); } defineProperties(BingMapsGeocoderService.prototype, { /** * The URL endpoint for the Bing geocoder service * @type {String} + * @memberof {BingMapsGeocoderService.prototype} + * @readonly */ url : { get : function () { @@ -53,6 +50,8 @@ define([ /** * The key for the Bing geocoder service * @type {String} + * @memberof {BingMapsGeocoderService.prototype} + * @readonly */ key : { get : function () { @@ -61,10 +60,6 @@ define([ } }); - BingMapsGeocoderService.prototype.cancel = function() { - this._canceled = true; - }; - /** * @function * @@ -72,7 +67,11 @@ define([ * @returns {Promise} */ BingMapsGeocoderService.prototype.geocode = function(query) { - this._canceled = false; + //>>includeStart('debug', pragmas.debug); + if (!defined(query)) { + throw new DeveloperError('query must be defined'); + } + //>>includeEnd('debug'); var key = this.key; var promise = loadJsonp(url, { @@ -83,12 +82,7 @@ define([ callbackParameterName : 'jsonp' }); - var that = this; - return promise.then(function(result) { - if (that._canceled) { - return; - } if (result.resourceSets.length === 0) { return []; } diff --git a/Source/Core/CartographicGeocoderService.js b/Source/Core/CartographicGeocoderService.js index 48ea09cc6af9..19beb25f0dbf 100644 --- a/Source/Core/CartographicGeocoderService.js +++ b/Source/Core/CartographicGeocoderService.js @@ -3,11 +3,15 @@ define([ './Cartesian3', './defaultValue', './defineProperties', + './defined', + './DeveloperError', '../ThirdParty/when' ], function( Cartesian3, defaultValue, defineProperties, + defined, + DeveloperError, when) { 'use strict'; @@ -19,29 +23,8 @@ define([ * @constructor */ function CartographicGeocoderService() { - this._autoComplete = false; } - defineProperties(CartographicGeocoderService.prototype, { - /** - * This geocoder does not support autocomplete, so this property will always be false. - * - * @type {boolean} - */ - autoComplete : { - get : function () { - return this._autoComplete; - } - } - }); - - /** - * This service completes geocoding synchronously and therefore does not - * need to handle canceled requests that have not finished yet. - */ - CartographicGeocoderService.prototype.cancel = function() { - }; - /** * @function * @@ -49,6 +32,12 @@ define([ * @returns {Promise} */ CartographicGeocoderService.prototype.geocode = function(query) { + //>>includeStart('debug', pragmas.debug); + if (!defined(query)) { + throw new DeveloperError('query must be defined'); + } + //>>includeEnd('debug'); + try { var splitQuery = query.match(/[^\s,\n]+/g); if ((splitQuery.length === 2) || (splitQuery.length === 3)) { diff --git a/Source/Core/GeocoderService.js b/Source/Core/GeocoderService.js index fbf80f2ce6ea..c15982213a0f 100644 --- a/Source/Core/GeocoderService.js +++ b/Source/Core/GeocoderService.js @@ -22,13 +22,6 @@ define([ * @see BingMapsGeocoderService */ function GeocoderService() { - /** - * Indicates whether this geocoding service is to be used for autocomplete. - * - * @type {boolean} - * @default false - */ - this.autoComplete = false; } /** @@ -39,14 +32,5 @@ define([ */ GeocoderService.prototype.geocode = DeveloperError.throwInstantiationError; - /** - * A function that is called when geocoding is canceled by the user, so that the - * geocoding service can stop processing current requests. - * @function - * - * @returns {undefined} - */ - GeocoderService.prototype.cancel = DeveloperError.throwInstantiationError; - return GeocoderService; }); diff --git a/Source/Widgets/Geocoder/Geocoder.css b/Source/Widgets/Geocoder/Geocoder.css index b97c06f55f1d..244e41de2c8d 100644 --- a/Source/Widgets/Geocoder/Geocoder.css +++ b/Source/Widgets/Geocoder/Geocoder.css @@ -40,6 +40,7 @@ .cesium-viewer-geocoderContainer .search-results { position: absolute; background-color: #000; + color: #eee; overflow-y: auto; opacity: 0.8; width: 100%; diff --git a/Source/Widgets/Geocoder/Geocoder.js b/Source/Widgets/Geocoder/Geocoder.js index e96346785ec7..2b42e86a2ccb 100644 --- a/Source/Widgets/Geocoder/Geocoder.js +++ b/Source/Widgets/Geocoder/Geocoder.js @@ -32,7 +32,8 @@ define([ * @param {Object} options Object with the following properties: * @param {Element|String} options.container The DOM element or ID that will contain the widget. * @param {Scene} options.scene The Scene instance to use. - * @param {Object} [options.geocoderServices] The geocoder services to be used + * @param {GeocoderService[]} [options.geocoderServices] The geocoder services to be used + * @param {Boolean} [options.autoComplete = true] True if the geocoder should query as the user types to autocomplete * @param {String} [options.url='https://dev.virtualearth.net'] The base URL of the Bing Maps API. * @param {String} [options.key] The Bing Maps key for your application, which can be * created at {@link https://www.bingmapsportal.com}. diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index d25d847572a3..a45e3a82cb28 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -97,7 +97,7 @@ define([ this._flightDuration = options.flightDuration; this._searchText = ''; this._isSearchInProgress = false; - this._geocodeInProgress = undefined; + this._geocodePromise = undefined; this._complete = new Event(); this._suggestions = []; this._selectedSuggestion = undefined; @@ -159,6 +159,7 @@ define([ }; this.activateSuggestion = function (data) { + that.hideSuggestions(); that._searchText = data.displayName; var destination = data.destination; clearSuggestions(that); @@ -188,12 +189,19 @@ define([ */ this.keepExpanded = false; + /** + * True if the geocoder should query as the user types to autocomplete + * @type {Booelan} + * @default true + */ + this.autoComplete = defaultValue(options.autocomplete, true); + this._focusTextbox = false; knockout.track(this, ['_searchText', '_isSearchInProgress', 'keepExpanded', '_suggestions', '_selectedSuggestion', '_showSuggestions', '_focusTextbox']); var searchTextObservable = knockout.getObservable(this, '_searchText'); - searchTextObservable.extend({ rateLimit: { timeout: 500, method: "notifyWhenChangesStop" } }); + searchTextObservable.extend({ rateLimit: { timeout: 500 } }); this._suggestionSubscription = searchTextObservable.subscribe(function() { updateSearchSuggestions(that); }); @@ -391,48 +399,27 @@ define([ }); } - function getFirstResult(results) { - if (results.length === 0) { - return undefined; - } - - var firstResult = results[0]; - //>>includeStart('debug', pragmas.debug); - if (!defined(firstResult.displayName)) { - throw new DeveloperError('each result must have a displayName'); - } - if (!defined(firstResult.destination)) { - throw new DeveloperError('each result must have a rectangle'); - } - //>>includeEnd('debug'); - - return { - displayName: firstResult.displayName, - destination: firstResult.destination - }; - } - - function promisesSettled(promises) { - var settledPromises = []; - promises.forEach(function (promise) { - var settled = when.defer(); - settledPromises.push(settled); - promise.then(function (result) { - return settled.resolve({state: 'fulfilled', value: result}); - }); - - if (defined(promise.otherwise)) { - promise.otherwise(function (err) { - return settled.resolve({state: 'rejected', reason: err}); - }); - return; - } - promise.catch(function (err) { - return settled.resolve({state: 'rejected', reason: err}); + function chainPromise(promise, geocoderService, query) { + return promise + .then(function(result) { + if (defined(result) && result.state === 'fulfilled' && result.value.length > 0){ + return result; + } + var nextPromise = geocoderService.geocode(query) + .then(function (result) { + return {state: 'fulfilled', value: result}; + }); + if (defined(nextPromise.otherwise)) { + nextPromise.otherwise(function (err) { + return {state: 'rejected', reason: err}; + }); + } else if (defined(nextPromise.catch)) { + nextPromise.catch(function (err) { + return {state: 'rejected', reason: err}; + }); + } + return nextPromise; }); - }); - - return when.all(settledPromises); } function geocode(viewModel, geocoderServices) { @@ -442,41 +429,25 @@ define([ return; } - viewModel._geocodeInProgress = true; + viewModel._isSearchInProgress = true; - var resultPromises = []; + var promise = when.resolve(); for (var i = 0; i < geocoderServices.length; i++) { - var geocoderService = geocoderServices[i]; - - viewModel._isSearchInProgress = true; - clearSuggestions(viewModel); - var geocodePromise = geocoderService.geocode(query); - resultPromises.push(geocodePromise); - geocodePromise.then(getFirstResult); + promise = chainPromise(promise, geocoderServices[i], query); } - promisesSettled(resultPromises) - .then(function (descriptors) { - viewModel._isSearchInProgress = false; - if (viewModel._cancelGeocode) { - viewModel._cancelGeocode = false; + viewModel._geocodePromise = promise; + promise + .then(function (result) { + if (promise.cancel || promise !== viewModel._geocodePromise) { return; } - var allFailed = true; - for (var j = 0; j < descriptors.length; j++) { - if (descriptors[j].state === 'rejected') { - continue; - } - allFailed = false; - var geocoderResults = descriptors[j].value; - if (defined(geocoderResults) && geocoderResults.length > 0) { - viewModel._searchText = geocoderResults[0].displayName; - updateCamera(viewModel, geocoderResults[0].destination); - return; - } - } - if (allFailed) { - viewModel._searchText = query + ' (geocoders failed)'; + viewModel._isSearchInProgress = false; + + var geocoderResults = result.value; + if (result.state === 'fulfilled' && defined(geocoderResults) && geocoderResults.length > 0) { + viewModel._searchText = geocoderResults[0].displayName; + updateCamera(viewModel, geocoderResults[0].destination); return; } viewModel._searchText = query + ' (not found)'; @@ -504,9 +475,9 @@ define([ function cancelGeocode(viewModel) { viewModel._isSearchInProgress = false; - if (defined(viewModel._geocodeInProgress)) { - viewModel._cancelGeocode = true; - viewModel._geocodeInProgress = undefined; + if (defined(viewModel._geocodePromise)) { + viewModel._geocodePromise.cancel = true; + viewModel._geocodePromise = undefined; } } @@ -519,6 +490,10 @@ define([ } function updateSearchSuggestions(viewModel) { + if (!viewModel.autoComplete) { + return; + } + var query = viewModel._searchText; clearSuggestions(viewModel); @@ -526,18 +501,26 @@ define([ return; } - var geocoderServices = viewModel._geocoderServices.filter(function (service) { - return service.autoComplete === true; - }); - - geocoderServices.forEach(function (service) { - service.geocode(query) - .then(function (results) { - results.slice(0, 3).forEach(function(result) { - viewModel._suggestions.push(result); + var promise = when.resolve([]); + viewModel._geocoderServices.forEach(function (service) { + promise = promise.then(function(results) { + if (results.length >= 5) { + return results; + } + return service.geocode(query) + .then(function(newResults) { + results = results.concat(newResults); + return results; }); - }); + }); }); + promise + .then(function (results) { + var suggestions = viewModel._suggestions; + for (var i = 0; i < results.length; i++) { + suggestions.push(results[i]); + } + }); } return GeocoderViewModel; From 9fd4154a2eb3696f1c4c053ccf3a9b8354d683d4 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Fri, 16 Dec 2016 23:13:16 -0500 Subject: [PATCH 250/396] OIT workaround --- Source/Scene/OIT.js | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/Source/Scene/OIT.js b/Source/Scene/OIT.js index 56634581365f..7d9cebd117e7 100644 --- a/Source/Scene/OIT.js +++ b/Source/Scene/OIT.js @@ -113,19 +113,27 @@ define([ function updateTextures(oit, context, width, height) { destroyTextures(oit); + var source = new Float32Array(width * height * 4); + oit._accumulationTexture = new Texture({ context : context, - width : width, - height : height, pixelFormat : PixelFormat.RGBA, - pixelDatatype : PixelDatatype.FLOAT + pixelDatatype : PixelDatatype.FLOAT, + source : { + arrayBufferView : source, + width : width, + height : height + } }); oit._revealageTexture = new Texture({ context : context, - width : width, - height : height, pixelFormat : PixelFormat.RGBA, - pixelDatatype : PixelDatatype.FLOAT + pixelDatatype : PixelDatatype.FLOAT, + source : { + arrayBufferView : source, + width : width, + height : height + } }); } From b3009f31bf8d0ea7b6bb525fee1ddd72aa1ab10b Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Fri, 16 Dec 2016 23:30:11 -0500 Subject: [PATCH 251/396] Unrelated fix --- Source/Scene/FXAA.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Scene/FXAA.js b/Source/Scene/FXAA.js index 42c1c4b4a7da..783bb7485c49 100644 --- a/Source/Scene/FXAA.js +++ b/Source/Scene/FXAA.js @@ -88,7 +88,7 @@ define([ pixelDatatype : PixelDatatype.UNSIGNED_BYTE }); - if (context.depthStencilTexture) { + if (context.depthTexture) { this._depthStencilTexture = new Texture({ context : context, width : width, From ce00c03bcbe7f3437b0494a71181a668f9d7115d Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Sun, 18 Dec 2016 09:02:22 -0500 Subject: [PATCH 252/396] Update comment --- Source/Scene/OIT.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/Scene/OIT.js b/Source/Scene/OIT.js index 7d9cebd117e7..eba923512306 100644 --- a/Source/Scene/OIT.js +++ b/Source/Scene/OIT.js @@ -113,6 +113,8 @@ define([ function updateTextures(oit, context, width, height) { destroyTextures(oit); + // Use zeroed arraybuffer instead of null to initialize texture + // to workaround Firefox 50. https://github.com/AnalyticalGraphicsInc/cesium/pull/4762 var source = new Float32Array(width * height * 4); oit._accumulationTexture = new Texture({ From 51cc82b3ab40f8a618ab35e5aa2fd730d14bb9b4 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Sun, 18 Dec 2016 09:10:25 -0500 Subject: [PATCH 253/396] Updated CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 215bf28c7bf7..45de317d4270 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -15,6 +15,7 @@ Change Log * Added `WebGLConstants` enum. Previously, this was part of the private Renderer API. [#4731](https://github.com/AnalyticalGraphicsInc/cesium/pull/4731) * Fixed an bug that caused `GroundPrimitive` to render incorrectly on systems without the `WEBGL_depth_texture` extension. [#4747](https://github.com/AnalyticalGraphicsInc/cesium/pull/4747) * Fixed default Mapbox token and added a watermark to notify users that they need to sign up for their own token. +* Fixed translucency in Firefox 50. https://github.com/AnalyticalGraphicsInc/cesium/pull/4762 ### 1.28 - 2016-12-01 From 8318417aa1740e787b323c549683dc1b111251dd Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 19 Dec 2016 11:44:34 +1100 Subject: [PATCH 254/396] Fix "readyImagery is not actually ready" exception. --- Source/Scene/Imagery.js | 2 +- Source/Scene/ImageryLayer.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Scene/Imagery.js b/Source/Scene/Imagery.js index 497248f0eb81..607fb1319cc9 100644 --- a/Source/Scene/Imagery.js +++ b/Source/Scene/Imagery.js @@ -72,7 +72,7 @@ define([ this.texture.destroy(); } - if (defined(this.textureWebMercator)) { + if (defined(this.textureWebMercator) && this.texture !== this.textureWebMercator) { this.textureWebMercator.destroy(); } diff --git a/Source/Scene/ImageryLayer.js b/Source/Scene/ImageryLayer.js index 3a0a04d7f99e..745240be4d0e 100644 --- a/Source/Scene/ImageryLayer.js +++ b/Source/Scene/ImageryLayer.js @@ -811,6 +811,7 @@ define([ }); this._reprojectComputeCommands.push(computeCommand); } else { + imagery.texture = texture; finalizeReprojectTexture(this, context, imagery, texture); } }; From b4cd684a4e1e75863ccf081990506972b3c4f388 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 19 Dec 2016 12:04:46 +1100 Subject: [PATCH 255/396] Fix test failure, add a new (currently failing) test. --- Source/Scene/ImageryLayer.js | 4 ++- Specs/Scene/ImageryLayerSpec.js | 43 +++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/Source/Scene/ImageryLayer.js b/Source/Scene/ImageryLayer.js index 745240be4d0e..3123f580ec78 100644 --- a/Source/Scene/ImageryLayer.js +++ b/Source/Scene/ImageryLayer.js @@ -811,7 +811,9 @@ define([ }); this._reprojectComputeCommands.push(computeCommand); } else { - imagery.texture = texture; + if (needGeographicProjection) { + imagery.texture = texture; + } finalizeReprojectTexture(this, context, imagery, texture); } }; diff --git a/Specs/Scene/ImageryLayerSpec.js b/Specs/Scene/ImageryLayerSpec.js index 88a8804b12fd..e789bf269011 100644 --- a/Specs/Scene/ImageryLayerSpec.js +++ b/Specs/Scene/ImageryLayerSpec.js @@ -17,6 +17,7 @@ defineSuite([ 'Scene/NeverTileDiscardPolicy', 'Scene/QuadtreeTile', 'Scene/SingleTileImageryProvider', + 'Scene/UrlTemplateImageryProvider', 'Scene/WebMapServiceImageryProvider', 'Specs/createScene', 'Specs/pollToPromise' @@ -38,6 +39,7 @@ defineSuite([ NeverTileDiscardPolicy, QuadtreeTile, SingleTileImageryProvider, + UrlTemplateImageryProvider, WebMapServiceImageryProvider, createScene, pollToPromise) { @@ -271,6 +273,47 @@ defineSuite([ }); }); + it('assigns texture property when reprojection is skipped because the tile is very small', function() { + var provider = new UrlTemplateImageryProvider({ + url : 'http://example.com/{z}/{x}/{y}.png', + minimumLevel : 13, + maximumLevel: 19, + rectangle : Rectangle.fromDegrees(13.39657249732205, 52.49127999816725, 13.42722986993895, 52.50998943590507) + }); + var layer = new ImageryLayer(provider); + + return pollToPromise(function() { + return provider.ready; + }).then(function() { + var imagery = new Imagery(layer, x, y, 13); + imagery.addReference(); + layer._requestImagery(imagery); + + return pollToPromise(function() { + return imagery.state === ImageryState.RECEIVED; + }).then(function() { + layer._createTexture(scene.context, imagery); + + return pollToPromise(function() { + return imagery.state === ImageryState.TEXTURE_LOADED; + }).then(function() { + var textureBeforeReprojection = imagery.textureWebMercator; + layer._reprojectTexture(scene.frameState, imagery, true); + layer.queueReprojectionCommands(scene.frameState); + scene.frameState.commandList[0].execute(computeEngine); + + return pollToPromise(function() { + return imagery.state === ImageryState.READY; + }).then(function() { + expect(imagery.texture).toBeDefined(); + expect(imagery.texture).toBe(imagery.textureWebMercator); + imagery.releaseReference(); + }); + }); + }); + }); + }); + it('cancels reprojection', function() { var provider = createWebMercatorProvider(); var layer = new ImageryLayer(provider); From af231deb3915c183855e5a266f13fd2205a76c49 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 19 Dec 2016 13:09:30 +1100 Subject: [PATCH 256/396] Fix test. --- Specs/Data/Images/Red256x256.png | Bin 0 -> 742 bytes Specs/Scene/ImageryLayerSpec.js | 8 ++++++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 Specs/Data/Images/Red256x256.png diff --git a/Specs/Data/Images/Red256x256.png b/Specs/Data/Images/Red256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..693565bf26b36c5b5d5004d243bb5400ffada37e GIT binary patch literal 742 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911L)MWvCLlCbx$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBK4*bPWHAE+-(e7DJf6QIg@J*o+SA1`q$2L^aYJ4P0|DlZ&;57Zb$+N* z`EhUaI@=|06jS*%t37TypOOpuHeplylu@D4kf2JM5GeZ280o|JiBU_w2$(h*JYD@< J);T3K0RSBOL6rai literal 0 HcmV?d00001 diff --git a/Specs/Scene/ImageryLayerSpec.js b/Specs/Scene/ImageryLayerSpec.js index e789bf269011..07e3c7187836 100644 --- a/Specs/Scene/ImageryLayerSpec.js +++ b/Specs/Scene/ImageryLayerSpec.js @@ -274,6 +274,10 @@ defineSuite([ }); it('assigns texture property when reprojection is skipped because the tile is very small', function() { + loadImage.createImage = function(url, crossOrigin, deferred) { + loadImage.defaultCreateImage('Data/Images/Red256x256.png', crossOrigin, deferred); + }; + var provider = new UrlTemplateImageryProvider({ url : 'http://example.com/{z}/{x}/{y}.png', minimumLevel : 13, @@ -285,7 +289,7 @@ defineSuite([ return pollToPromise(function() { return provider.ready; }).then(function() { - var imagery = new Imagery(layer, x, y, 13); + var imagery = new Imagery(layer, 4400, 2686, 13); imagery.addReference(); layer._requestImagery(imagery); @@ -300,7 +304,7 @@ defineSuite([ var textureBeforeReprojection = imagery.textureWebMercator; layer._reprojectTexture(scene.frameState, imagery, true); layer.queueReprojectionCommands(scene.frameState); - scene.frameState.commandList[0].execute(computeEngine); + expect(scene.frameState.commandList.length).toBe(0); return pollToPromise(function() { return imagery.state === ImageryState.READY; From e4243c7fc1b1491fc607bf5c52e9f14009215817 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 19 Dec 2016 15:45:58 +1100 Subject: [PATCH 257/396] Fix jshint warning. --- Specs/Scene/ImageryLayerSpec.js | 1 - 1 file changed, 1 deletion(-) diff --git a/Specs/Scene/ImageryLayerSpec.js b/Specs/Scene/ImageryLayerSpec.js index 07e3c7187836..4c9ec1fcbcbb 100644 --- a/Specs/Scene/ImageryLayerSpec.js +++ b/Specs/Scene/ImageryLayerSpec.js @@ -301,7 +301,6 @@ defineSuite([ return pollToPromise(function() { return imagery.state === ImageryState.TEXTURE_LOADED; }).then(function() { - var textureBeforeReprojection = imagery.textureWebMercator; layer._reprojectTexture(scene.frameState, imagery, true); layer.queueReprojectionCommands(scene.frameState); expect(scene.frameState.commandList.length).toBe(0); From cea586032482db9915b55cc0f1cb3431dcc5647c Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 19 Dec 2016 16:03:26 +1100 Subject: [PATCH 258/396] Update CHANGES.md. --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 45de317d4270..f10f79d03af7 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -16,6 +16,7 @@ Change Log * Fixed an bug that caused `GroundPrimitive` to render incorrectly on systems without the `WEBGL_depth_texture` extension. [#4747](https://github.com/AnalyticalGraphicsInc/cesium/pull/4747) * Fixed default Mapbox token and added a watermark to notify users that they need to sign up for their own token. * Fixed translucency in Firefox 50. https://github.com/AnalyticalGraphicsInc/cesium/pull/4762 +* Fixed a bug that could cause a "readyImagery is not actually ready" exception with some configurations of imagery layers. ### 1.28 - 2016-12-01 From 9ee6145862079aa7acfa6c321ffad99aa748f164 Mon Sep 17 00:00:00 2001 From: Dylan Brown Date: Mon, 19 Dec 2016 12:05:24 -0500 Subject: [PATCH 259/396] Added color(), to style --- Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html b/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html index 7a77ca28ff15..3fe63914b5f8 100644 --- a/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html +++ b/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html @@ -135,8 +135,8 @@ }); addStyle('Clamp and Mix', { - color : "clamp(${temperature}, 0.1, 0.2)", - pointSize : "mix(0.0, 2.0, 0.5) * 5" + color : "color() * clamp(${temperature}, 0.1, 0.2)", + pointSize : "mix(${temperature}, 2.0, 0.5) * 0.2" }); addStyle('Secondary Color', { From ff5b0eae3da7f1e78d02aa6a364c7d3384f67fa9 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Mon, 19 Dec 2016 13:00:32 -0500 Subject: [PATCH 260/396] update sandcastle example --- Apps/Sandcastle/gallery/Custom Geocoder.html | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/Apps/Sandcastle/gallery/Custom Geocoder.html b/Apps/Sandcastle/gallery/Custom Geocoder.html index 1431907308eb..b1f388c92db4 100644 --- a/Apps/Sandcastle/gallery/Custom Geocoder.html +++ b/Apps/Sandcastle/gallery/Custom Geocoder.html @@ -41,29 +41,14 @@ * This class is an example of a custom geocoder. It provides geocoding through the OpenStreetMap Nominatim service. * @alias OpenStreetMapNominatimGeocoder * @constructor - * - * @param {Object} options Object with the following properties: - * @param {Boolean} autoComplete Indicates whether this service shall be used to fetch auto-complete suggestions */ -function OpenStreetMapNominatimGeocoder(options) { - options = Cesium.defaultValue(options, Cesium.defaultValue.EMPTY_OBJECT); - this._canceled = false; - this.autoComplete = Cesium.defaultValue(options.autoComplete, true); +function OpenStreetMapNominatimGeocoder() { } -/** - * The function called when a user cancels geocoding. - * - * @returns {undefined} - */ -OpenStreetMapNominatimGeocoder.prototype.cancel = function() { - this._canceled = true; -}; - /** * The function called to geocode using this geocoder service. * - * @param {String} query The query to be sent to the geocoder service + * @param {String} input The query to be sent to the geocoder service * @returns {Promise} */ OpenStreetMapNominatimGeocoder.prototype.geocode = function (input) { From 1b1d5a7791537dfea3ef05f2961d677d16e9654a Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Mon, 19 Dec 2016 13:47:07 -0500 Subject: [PATCH 261/396] Reorder CHANGES.md for 1.29 --- CHANGES.md | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index f10f79d03af7..896831df2990 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,20 +3,22 @@ Change Log ### 1.29 - 2017-01-02 -* Added the ability to blend a `Model` with a color/translucency. Added `color`, `colorBlendMode`, and `colorBlendAmount` properties to `Model`, `ModelGraphics`, and CZML. Added `ColorBlendMode` enum. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) -* Added the ability to render a `Model` with a silhouette. Added `silhouetteColor` and `silhouetteSize` properties to `Model`, `ModelGraphics`, and CZML. [#4314](https://github.com/AnalyticalGraphicsInc/cesium/pull/4314) -* Added new `Label` properties `showBackground`, `backgroundColor`, and `backgroundPadding` to the primitive, Entity, and CZML layers. -* Added new enum `VerticalOrigin.BASELINE`. Previously, `VerticalOrigin.BOTTOM` would sometimes align to the baseline depending on the contents of a label. -* Added support for newlines (`\n`) in Cesium `Label`s and CZML. [#2402](https://github.com/AnalyticalGraphicsInc/cesium/issues/2402) -* Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) -* Fixed `Rectangle.union` to correctly account for rectangles that cross the IDL [#4732](https://github.com/AnalyticalGraphicsInc/cesium/pull/4732). +* Improved 3D Models + * Added the ability to blend a `Model` with a color/translucency. Added `color`, `colorBlendMode`, and `colorBlendAmount` properties to `Model`, `ModelGraphics`, and CZML. Also added `ColorBlendMode` enum. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) + * Added the ability to render a `Model` with a silhouette. Added `silhouetteColor` and `silhouetteSize` properties to `Model`, `ModelGraphics`, and CZML. [#4314](https://github.com/AnalyticalGraphicsInc/cesium/pull/4314) +* Improved Labels + * Added new `Label` properties `showBackground`, `backgroundColor`, and `backgroundPadding` to the primitive, Entity, and CZML layers. + * Added new enum `VerticalOrigin.BASELINE`. Previously, `VerticalOrigin.BOTTOM` would sometimes align to the baseline depending on the contents of a label. + * Added support for newlines (`\n`) in Cesium `Label`s and CZML. [#2402](https://github.com/AnalyticalGraphicsInc/cesium/issues/2402) * Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) -* Added `divideComponents` function to `Cartesian2`, `Cartesian3`, and `Cartesian4`. [#4750](https://github.com/AnalyticalGraphicsInc/cesium/pull/4750) -* Added `WebGLConstants` enum. Previously, this was part of the private Renderer API. [#4731](https://github.com/AnalyticalGraphicsInc/cesium/pull/4731) -* Fixed an bug that caused `GroundPrimitive` to render incorrectly on systems without the `WEBGL_depth_texture` extension. [#4747](https://github.com/AnalyticalGraphicsInc/cesium/pull/4747) -* Fixed default Mapbox token and added a watermark to notify users that they need to sign up for their own token. * Fixed translucency in Firefox 50. https://github.com/AnalyticalGraphicsInc/cesium/pull/4762 +* Fixed a bug that caused `GroundPrimitive` to render incorrectly on systems without the `WEBGL_depth_texture` extension. [#4747](https://github.com/AnalyticalGraphicsInc/cesium/pull/4747) +* Fixed default Mapbox token and added a watermark to notify users that they need to sign up for their own token. * Fixed a bug that could cause a "readyImagery is not actually ready" exception with some configurations of imagery layers. +* Fixed `Rectangle.union` to correctly account for rectangles that cross the IDL [#4732](https://github.com/AnalyticalGraphicsInc/cesium/pull/4732). +* Added `divideComponents` function to `Cartesian2`, `Cartesian3`, and `Cartesian4`. [#4750](https://github.com/AnalyticalGraphicsInc/cesium/pull/4750) +* Added `WebGLConstants` enum. Previously, this was part of the private Renderer API. [#4731](https://github.com/AnalyticalGraphicsInc/cesium/pull/4731) +* Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) ### 1.28 - 2016-12-01 From a9d93e5cb98e14288923378f1a65f0aa2ef3323d Mon Sep 17 00:00:00 2001 From: hpinkos Date: Mon, 19 Dec 2016 15:44:26 -0500 Subject: [PATCH 262/396] fix rectangle, circle and corridor updates from review --- Source/Core/CorridorGeometry.js | 3 +-- Source/Core/EllipseGeometry.js | 2 +- Source/Core/RectangleGeometry.js | 4 ++++ Source/Renderer/AutomaticUniforms.js | 6 +++--- Source/Shaders/ShadowVolumeVS.glsl | 4 ++-- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Source/Core/CorridorGeometry.js b/Source/Core/CorridorGeometry.js index 73bdc2fb5475..49992368288d 100644 --- a/Source/Core/CorridorGeometry.js +++ b/Source/Core/CorridorGeometry.js @@ -602,8 +602,7 @@ define([ } //only get normals for bottom layer that's going to be pushed down extrudeNormals.set(topNormals, length); //bottom face - extrudeNormals.set(topNormals, length * 4); //bottom wall positions - extrudeNormals.set(topNormals, length * 5); //duplicate bottom wall positions + extrudeNormals = addWallPositions(topNormals, length*4, extrudeNormals); //bottom wall attributes.extrudeDirection = new GeometryAttribute({ componentDatatype : ComponentDatatype.FLOAT, componentsPerAttribute : 3, diff --git a/Source/Core/EllipseGeometry.js b/Source/Core/EllipseGeometry.js index 34fd0e3503ed..3faca9185f5d 100644 --- a/Source/Core/EllipseGeometry.js +++ b/Source/Core/EllipseGeometry.js @@ -901,7 +901,7 @@ define([ result._granularity = granularity; result._extrudedHeight = extrudedHeight; result._extrude = extrude; - result._shadowVoluem = shadowVolume; + result._shadowVolume = shadowVolume; result._rectangle = Rectangle.clone(rectangle); return result; diff --git a/Source/Core/RectangleGeometry.js b/Source/Core/RectangleGeometry.js index afc6c9896a04..4ee7ff3bb69d 100644 --- a/Source/Core/RectangleGeometry.js +++ b/Source/Core/RectangleGeometry.js @@ -450,6 +450,7 @@ define([ stIndex += 4; } if (shadowVolume) { + extrudeNormalIndex += 3; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; @@ -465,6 +466,7 @@ define([ stIndex += 4; } if (shadowVolume) { + extrudeNormalIndex += 3; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; @@ -480,6 +482,7 @@ define([ stIndex += 4; } if (shadowVolume) { + extrudeNormalIndex += 3; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; @@ -495,6 +498,7 @@ define([ stIndex += 4; } if (shadowVolume) { + extrudeNormalIndex += 3; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; diff --git a/Source/Renderer/AutomaticUniforms.js b/Source/Renderer/AutomaticUniforms.js index f7da008bbc4a..f520cf0aedf4 100644 --- a/Source/Renderer/AutomaticUniforms.js +++ b/Source/Renderer/AutomaticUniforms.js @@ -1479,12 +1479,12 @@ define([ }), /** - * An automatic GLSL uniform scalar representing the geometric tolerance per distance + * An automatic GLSL uniform scalar representing the geometric tolerance per meter * - * @alias czm_geometricToleranceOverDistance + * @alias czm_geometricToleranceOverMeter * @glslUniform */ - czm_geometricToleranceOverDistance : new AutomaticUniform({ + czm_geometricToleranceOverMeter : new AutomaticUniform({ size: 1, datatype: WebGLConstants.FLOAT, getValue: function(uniformState) { diff --git a/Source/Shaders/ShadowVolumeVS.glsl b/Source/Shaders/ShadowVolumeVS.glsl index 14f072145918..a20b00d1ed9a 100644 --- a/Source/Shaders/ShadowVolumeVS.glsl +++ b/Source/Shaders/ShadowVolumeVS.glsl @@ -22,9 +22,9 @@ void main() v_color = color; vec4 position = czm_computePosition(); - float delta = min(u_globeMinimumAltitude, czm_geometricToleranceOverDistance * length(position.xyz)); + float delta = min(u_globeMinimumAltitude, czm_geometricToleranceOverMeter * length(position.xyz)); //extrudeDirection is zero for the top layer - position = position + vec4(extrudeDirection.xyz * delta, 0); + position = position + vec4(extrudeDirection * delta, 0.0); gl_Position = depthClampFarPlane(czm_modelViewProjectionRelativeToEye * position); } From 4b41ee242cb601d98a5bb4dc9eaace11ba746676 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Mon, 19 Dec 2016 16:13:19 -0500 Subject: [PATCH 263/396] Fix incorrect doc default. --- Source/DataSources/LabelGraphics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/DataSources/LabelGraphics.js b/Source/DataSources/LabelGraphics.js index 3f5396ccd463..3377176256cf 100644 --- a/Source/DataSources/LabelGraphics.js +++ b/Source/DataSources/LabelGraphics.js @@ -35,7 +35,7 @@ define([ * @param {Property} [options.outlineColor=Color.BLACK] A Property specifying the outline {@link Color}. * @param {Property} [options.outlineWidth=1.0] A numeric Property specifying the outline width. * @param {Property} [options.show=true] A boolean Property specifying the visibility of the label. - * @param {Property} [options.showBackground=true] A boolean Property specifying the visibility of the background behind the label. + * @param {Property} [options.showBackground=false] A boolean Property specifying the visibility of the background behind the label. * @param {Property} [options.backgroundColor=new Color(0.165, 0.165, 0.165, 0.8)] A Property specifying the background {@link Color}. * @param {Property} [options.backgroundPadding=new Cartesian2(7, 5)] A {@link Cartesian2} Property specifying the horizontal and vertical background padding in pixels. * @param {Property} [options.scale=1.0] A numeric Property specifying the scale to apply to the text. From a83ad44b1b5e76f285ccc5a7eee6db7e25bbee61 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Mon, 19 Dec 2016 16:25:32 -0500 Subject: [PATCH 264/396] adjust u_globeMinimumAltitude --- Source/Scene/GroundPrimitive.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Scene/GroundPrimitive.js b/Source/Scene/GroundPrimitive.js index 7fc4443ddf63..78f93572bf28 100644 --- a/Source/Scene/GroundPrimitive.js +++ b/Source/Scene/GroundPrimitive.js @@ -217,7 +217,7 @@ define([ this._uniformMap = { u_globeMinimumAltitude: function() { - return 33000.0; + return 55000.0; } }; From bcf563c4d1acac018a10183793d69a31714fc488 Mon Sep 17 00:00:00 2001 From: Scott Hunter Date: Mon, 19 Dec 2016 17:05:34 -0500 Subject: [PATCH 265/396] Update CZML validation document and test. --- Specs/Data/CZML/ValidationDocument.czml | 162 ++++++++++++++++++++++-- Specs/DataSources/CzmlDataSourceSpec.js | 48 +++++++ 2 files changed, 201 insertions(+), 9 deletions(-) diff --git a/Specs/Data/CZML/ValidationDocument.czml b/Specs/Data/CZML/ValidationDocument.czml index ee2f1882ec3b..ada01b4758fd 100644 --- a/Specs/Data/CZML/ValidationDocument.czml +++ b/Specs/Data/CZML/ValidationDocument.czml @@ -105,7 +105,8 @@ 121,42,244,168 ] }, - "outlineWidth":15323 + "outlineWidth":15323, + "shadows":"CAST_ONLY" }, "corridor":{ "show":true, @@ -135,7 +136,8 @@ 198,25,134,60 ] }, - "outlineWidth":9132 + "outlineWidth":9132, + "shadows":"CAST_ONLY" }, "cylinder":{ "show":true, @@ -160,7 +162,8 @@ }, "outlineWidth":64018, "numberOfVerticalLines":38567, - "slices":39979 + "slices":39979, + "shadows":"CAST_ONLY" }, "ellipse":{ "show":true, @@ -188,7 +191,8 @@ ] }, "outlineWidth":8839, - "numberOfVerticalLines":38878 + "numberOfVerticalLines":38878, + "shadows":"CAST_ONLY" }, "ellipsoid":{ "show":true, @@ -216,7 +220,8 @@ "outlineWidth":47507, "stackPartitions":54278, "slicePartitions":28562, - "subdivisions":14008 + "subdivisions":14008, + "shadows":"CAST_ONLY" }, "label":{ "show":true, @@ -224,6 +229,17 @@ "font":"14px sans-serif", "style":"FILL_AND_OUTLINE", "scale":6510, + "showBackground":true, + "backgroundColor":{ + "rgba":[ + 225,114,54,128 + ] + }, + "backgroundPadding":{ + "cartesian2":[ + 5508,56341 + ] + }, "pixelOffset":{ "cartesian2":[ 25913,30821 @@ -267,7 +283,14 @@ "maximumScale":64305, "incrementallyLoadTextures":true, "runAnimations":true, + "shadows":"CAST_ONLY", "heightReference":"CLAMP_TO_GROUND", + "silhouetteColor":{ + "rgba":[ + 29,61,52,101 + ] + }, + "silhouetteSize":4645, "color":{ "rgba":[ 0,52,75,73 @@ -367,7 +390,8 @@ "outlineWidth":62220, "perPositionHeight":true, "closeTop":true, - "closeBottom":true + "closeBottom":true, + "shadows":"CAST_ONLY" }, "polyline":{ "show":true, @@ -387,7 +411,8 @@ } } }, - "followSurface":true + "followSurface":true, + "shadows":"CAST_ONLY" }, "rectangle":{ "show":true, @@ -419,7 +444,8 @@ }, "outlineWidth":59794, "closeTop":true, - "closeBottom":true + "closeBottom":true, + "shadows":"CAST_ONLY" }, "wall":{ "show":true, @@ -455,7 +481,8 @@ 107,196,96,198 ] }, - "outlineWidth":50458 + "outlineWidth":50458, + "shadows":"CAST_ONLY" }, "agi_conicSensor":{ "show":true, @@ -1551,6 +1578,16 @@ } } }, + { + "id":"constant_label_backgroundColor_rgbaf", + "label":{ + "backgroundColor":{ + "rgbaf":[ + 0.8941176470588236,0.9490196078431372,0.49411764705882355,0.8431372549019608 + ] + } + } + }, { "id":"constant_label_fillColor_rgbaf", "label":{ @@ -1571,6 +1608,16 @@ } } }, + { + "id":"constant_model_silhouetteColor_rgbaf", + "model":{ + "silhouetteColor":{ + "rgbaf":[ + 0.29411764705882354,0.3137254901960784,0.4196078431372549,0.8784313725490196 + ] + } + } + }, { "id":"constant_model_color_rgbaf", "model":{ @@ -5207,6 +5254,9 @@ }, "outlineWidth":{ "reference":"Constant#box.outlineWidth" + }, + "shadows":{ + "reference":"Constant#box.shadows" } }, "corridor":{ @@ -5251,6 +5301,9 @@ }, "outlineWidth":{ "reference":"Constant#corridor.outlineWidth" + }, + "shadows":{ + "reference":"Constant#corridor.shadows" } }, "cylinder":{ @@ -5290,6 +5343,9 @@ }, "slices":{ "reference":"Constant#cylinder.slices" + }, + "shadows":{ + "reference":"Constant#cylinder.shadows" } }, "ellipse":{ @@ -5338,6 +5394,9 @@ }, "numberOfVerticalLines":{ "reference":"Constant#ellipse.numberOfVerticalLines" + }, + "shadows":{ + "reference":"Constant#ellipse.shadows" } }, "ellipsoid":{ @@ -5374,6 +5433,9 @@ }, "subdivisions":{ "reference":"Constant#ellipsoid.subdivisions" + }, + "shadows":{ + "reference":"Constant#ellipsoid.shadows" } }, "label":{ @@ -5392,6 +5454,15 @@ "scale":{ "reference":"Constant#label.scale" }, + "showBackground":{ + "reference":"Constant#label.showBackground" + }, + "backgroundColor":{ + "reference":"Constant#label.backgroundColor" + }, + "backgroundPadding":{ + "reference":"Constant#label.backgroundPadding" + }, "pixelOffset":{ "reference":"Constant#label.pixelOffset" }, @@ -5445,9 +5516,18 @@ "runAnimations":{ "reference":"Constant#model.runAnimations" }, + "shadows":{ + "reference":"Constant#model.shadows" + }, "heightReference":{ "reference":"Constant#model.heightReference" }, + "silhouetteColor":{ + "reference":"Constant#model.silhouetteColor" + }, + "silhouetteSize":{ + "reference":"Constant#model.silhouetteSize" + }, "color":{ "reference":"Constant#model.color" }, @@ -5569,6 +5649,9 @@ }, "closeBottom":{ "reference":"Constant#polygon.closeBottom" + }, + "shadows":{ + "reference":"Constant#polygon.shadows" } }, "polyline":{ @@ -5595,6 +5678,9 @@ }, "followSurface":{ "reference":"Constant#polyline.followSurface" + }, + "shadows":{ + "reference":"Constant#polyline.shadows" } }, "rectangle":{ @@ -5643,6 +5729,9 @@ }, "closeBottom":{ "reference":"Constant#rectangle.closeBottom" + }, + "shadows":{ + "reference":"Constant#rectangle.shadows" } }, "wall":{ @@ -5685,6 +5774,9 @@ }, "outlineWidth":{ "reference":"Constant#wall.outlineWidth" + }, + "shadows":{ + "reference":"Constant#wall.shadows" } }, "agi_conicSensor":{ @@ -8310,6 +8402,20 @@ 3600,42123 ] }, + "backgroundColor":{ + "epoch":"2016-06-17T12:00:00Z", + "rgba":[ + 0,30,92,161,169, + 3600,85,52,166,62 + ] + }, + "backgroundPadding":{ + "epoch":"2016-06-17T12:00:00Z", + "cartesian2":[ + 0,32945,5504, + 3600,35323,6281 + ] + }, "pixelOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ @@ -8382,6 +8488,20 @@ 3600,25558 ] }, + "silhouetteColor":{ + "epoch":"2016-06-17T12:00:00Z", + "rgba":[ + 0,33,239,70,81, + 3600,60,48,26,123 + ] + }, + "silhouetteSize":{ + "epoch":"2016-06-17T12:00:00Z", + "number":[ + 0,65103, + 3600,29065 + ] + }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ @@ -10091,6 +10211,18 @@ } } }, + { + "id":"sampled_label_backgroundColor_rgbaf", + "label":{ + "backgroundColor":{ + "epoch":"2016-06-17T12:00:00Z", + "rgbaf":[ + 0,0.9607843137254902,0.18823529411764706,0.8705882352941177,0.27058823529411763, + 3600,0.8823529411764706,0.796078431372549,0.6039215686274509,0.8235294117647058 + ] + } + } + }, { "id":"sampled_label_fillColor_rgbaf", "label":{ @@ -10115,6 +10247,18 @@ } } }, + { + "id":"sampled_model_silhouetteColor_rgbaf", + "model":{ + "silhouetteColor":{ + "epoch":"2016-06-17T12:00:00Z", + "rgbaf":[ + 0,0.23137254901960785,0.8666666666666667,0.26666666666666666,0.6352941176470588, + 3600,0.7490196078431373,0.22745098039215686,0.807843137254902,0.08235294117647059 + ] + } + } + }, { "id":"sampled_model_color_rgbaf", "model":{ diff --git a/Specs/DataSources/CzmlDataSourceSpec.js b/Specs/DataSources/CzmlDataSourceSpec.js index 1da26e311f2f..7c2c956b09a1 100644 --- a/Specs/DataSources/CzmlDataSourceSpec.js +++ b/Specs/DataSources/CzmlDataSourceSpec.js @@ -2876,6 +2876,7 @@ defineSuite([ expect(e.box.outline.getValue(date)).toEqual(true); expect(e.box.outlineColor.getValue(date)).toEqual(Color.fromBytes(121, 42, 244, 168)); expect(e.box.outlineWidth.getValue(date)).toEqual(15323.0); + expect(e.box.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.corridor.show.getValue(date)).toEqual(true); expect(e.corridor.positions.getValue(date)).toEqual([ new Cartesian3(36415, 2702, 36618), new Cartesian3(47759, 11706, 63277) ]); expect(e.corridor.width.getValue(date)).toEqual(20413.0); @@ -2888,6 +2889,7 @@ defineSuite([ expect(e.corridor.outline.getValue(date)).toEqual(true); expect(e.corridor.outlineColor.getValue(date)).toEqual(Color.fromBytes(198, 25, 134, 60)); expect(e.corridor.outlineWidth.getValue(date)).toEqual(9132.0); + expect(e.corridor.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.cylinder.show.getValue(date)).toEqual(true); expect(e.cylinder.length.getValue(date)).toEqual(33298.0); expect(e.cylinder.topRadius.getValue(date)).toEqual(16245.0); @@ -2899,6 +2901,7 @@ defineSuite([ expect(e.cylinder.outlineWidth.getValue(date)).toEqual(64018.0); expect(e.cylinder.numberOfVerticalLines.getValue(date)).toEqual(38567.0); expect(e.cylinder.slices.getValue(date)).toEqual(39979.0); + expect(e.cylinder.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.ellipse.show.getValue(date)).toEqual(true); expect(e.ellipse.semiMajorAxis.getValue(date)).toEqual(60072.0); expect(e.ellipse.semiMinorAxis.getValue(date)).toEqual(38653.0); @@ -2913,6 +2916,7 @@ defineSuite([ expect(e.ellipse.outlineColor.getValue(date)).toEqual(Color.fromBytes(160, 82, 145, 104)); expect(e.ellipse.outlineWidth.getValue(date)).toEqual(8839.0); expect(e.ellipse.numberOfVerticalLines.getValue(date)).toEqual(38878.0); + expect(e.ellipse.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.ellipsoid.show.getValue(date)).toEqual(true); expect(e.ellipsoid.radii.getValue(date)).toEqual(new Cartesian3(15638, 24381, 37983)); expect(e.ellipsoid.fill.getValue(date)).toEqual(true); @@ -2923,11 +2927,15 @@ defineSuite([ expect(e.ellipsoid.stackPartitions.getValue(date)).toEqual(54278.0); expect(e.ellipsoid.slicePartitions.getValue(date)).toEqual(28562.0); expect(e.ellipsoid.subdivisions.getValue(date)).toEqual(14008.0); + expect(e.ellipsoid.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.label.show.getValue(date)).toEqual(true); expect(e.label.text.getValue(date)).toEqual('string36641'); expect(e.label.font.getValue(date)).toEqual('14px sans-serif'); expect(e.label.style.getValue(date)).toEqual(LabelStyle.FILL_AND_OUTLINE); expect(e.label.scale.getValue(date)).toEqual(6510.0); + expect(e.label.showBackground.getValue(date)).toEqual(true); + expect(e.label.backgroundColor.getValue(date)).toEqual(Color.fromBytes(225, 114, 54, 128)); + expect(e.label.backgroundPadding.getValue(date)).toEqual(new Cartesian2(5508, 56341)); expect(e.label.pixelOffset.getValue(date)).toEqual(new Cartesian2(25913, 30821)); expect(e.label.eyeOffset.getValue(date)).toEqual(new Cartesian3(30502, 29047, 25457)); expect(e.label.horizontalOrigin.getValue(date)).toEqual(HorizontalOrigin.LEFT); @@ -2945,7 +2953,10 @@ defineSuite([ expect(e.model.maximumScale.getValue(date)).toEqual(64305.0); expect(e.model.incrementallyLoadTextures.getValue(date)).toEqual(true); expect(e.model.runAnimations.getValue(date)).toEqual(true); + expect(e.model.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.model.heightReference.getValue(date)).toEqual(HeightReference.CLAMP_TO_GROUND); + expect(e.model.silhouetteColor.getValue(date)).toEqual(Color.fromBytes(29, 61, 52, 101)); + expect(e.model.silhouetteSize.getValue(date)).toEqual(4645.0); expect(e.model.color.getValue(date)).toEqual(Color.fromBytes(0, 52, 75, 73)); expect(e.model.colorBlendMode.getValue(date)).toEqual(ColorBlendMode.REPLACE); expect(e.model.colorBlendAmount.getValue(date)).toEqual(7475.0); @@ -2980,12 +2991,14 @@ defineSuite([ expect(e.polygon.perPositionHeight.getValue(date)).toEqual(true); expect(e.polygon.closeTop.getValue(date)).toEqual(true); expect(e.polygon.closeBottom.getValue(date)).toEqual(true); + expect(e.polygon.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.polyline.show.getValue(date)).toEqual(true); expect(e.polyline.positions.getValue(date)).toEqual([ new Cartesian3(23333, 31067, 17529), new Cartesian3(57924, 41186, 31648) ]); expect(e.polyline.width.getValue(date)).toEqual(14667.0); expect(e.polyline.granularity.getValue(date)).toEqual(53395.0); expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(88, 0, 232, 230)); expect(e.polyline.followSurface.getValue(date)).toEqual(true); + expect(e.polyline.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.rectangle.show.getValue(date)).toEqual(true); expect(e.rectangle.coordinates.getValue(date)).toEqual(new Rectangle(1.13325368272577, 0.703573207377445, 0.756676249095309, 0.339217858685931)); expect(e.rectangle.height.getValue(date)).toEqual(20608.0); @@ -3000,6 +3013,7 @@ defineSuite([ expect(e.rectangle.outlineWidth.getValue(date)).toEqual(59794.0); expect(e.rectangle.closeTop.getValue(date)).toEqual(true); expect(e.rectangle.closeBottom.getValue(date)).toEqual(true); + expect(e.rectangle.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.wall.show.getValue(date)).toEqual(true); expect(e.wall.positions.getValue(date)).toEqual([ new Cartesian3(21681, 40276, 30621), new Cartesian3(3959, 61967, 19442) ]); expect(e.wall.minimumHeights.getValue(date)).toEqual([ 49466, 44737 ]); @@ -3010,6 +3024,7 @@ defineSuite([ expect(e.wall.outline.getValue(date)).toEqual(true); expect(e.wall.outlineColor.getValue(date)).toEqual(Color.fromBytes(107, 196, 96, 198)); expect(e.wall.outlineWidth.getValue(date)).toEqual(50458.0); + expect(e.wall.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e = dataSource.entities.getById('constant_position_cartographicRadians')).toBeDefined(); expect(e.position.getValue(date)).toEqual(Cartesian3.fromRadians(0.368123392863751, 0.678098621973879, 32050)); expect(e = dataSource.entities.getById('constant_position_cartographicDegrees')).toBeDefined(); @@ -3169,10 +3184,14 @@ defineSuite([ expect(e.ellipsoid.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.580392156862745, 0.164705882352941, 0.741176470588235, 0.0941176470588235), 1e-14); expect(e = dataSource.entities.getById('constant_ellipsoid_outlineColor_rgbaf')).toBeDefined(); expect(e.ellipsoid.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.494117647058824, 0.0823529411764706, 0.274509803921569, 0.823529411764706), 1e-14); + expect(e = dataSource.entities.getById('constant_label_backgroundColor_rgbaf')).toBeDefined(); + expect(e.label.backgroundColor.getValue(date)).toEqualEpsilon(new Color(0.894117647058824, 0.949019607843137, 0.494117647058824, 0.843137254901961), 1e-14); expect(e = dataSource.entities.getById('constant_label_fillColor_rgbaf')).toBeDefined(); expect(e.label.fillColor.getValue(date)).toEqualEpsilon(new Color(0.16078431372549, 0.568627450980392, 0.776470588235294, 0.505882352941176), 1e-14); expect(e = dataSource.entities.getById('constant_label_outlineColor_rgbaf')).toBeDefined(); expect(e.label.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.458823529411765, 0.325490196078431, 0.909803921568627, 0.67843137254902), 1e-14); + expect(e = dataSource.entities.getById('constant_model_silhouetteColor_rgbaf')).toBeDefined(); + expect(e.model.silhouetteColor.getValue(date)).toEqualEpsilon(new Color(0.294117647058824, 0.313725490196078, 0.419607843137255, 0.87843137254902), 1e-14); expect(e = dataSource.entities.getById('constant_model_color_rgbaf')).toBeDefined(); expect(e.model.color.getValue(date)).toEqualEpsilon(new Color(0.568627450980392, 0.333333333333333, 0.141176470588235, 0.572549019607843), 1e-14); expect(e = dataSource.entities.getById('constant_path_material_solidColor_color')).toBeDefined(); @@ -3551,6 +3570,7 @@ defineSuite([ expect(e.box.outline.getValue(date)).toEqual(constant.box.outline.getValue(date)); expect(e.box.outlineColor.getValue(date)).toEqual(constant.box.outlineColor.getValue(date)); expect(e.box.outlineWidth.getValue(date)).toEqual(constant.box.outlineWidth.getValue(date)); + expect(e.box.shadows.getValue(date)).toEqual(constant.box.shadows.getValue(date)); expect(e.corridor.show.getValue(date)).toEqual(constant.corridor.show.getValue(date)); expect(e.corridor.positions.getValue(date)).toEqual([dataSource.entities.getById('ConstantPosition1').position.getValue(date), dataSource.entities.getById('ConstantPosition2').position.getValue(date)]); expect(e.corridor.width.getValue(date)).toEqual(constant.corridor.width.getValue(date)); @@ -3563,6 +3583,7 @@ defineSuite([ expect(e.corridor.outline.getValue(date)).toEqual(constant.corridor.outline.getValue(date)); expect(e.corridor.outlineColor.getValue(date)).toEqual(constant.corridor.outlineColor.getValue(date)); expect(e.corridor.outlineWidth.getValue(date)).toEqual(constant.corridor.outlineWidth.getValue(date)); + expect(e.corridor.shadows.getValue(date)).toEqual(constant.corridor.shadows.getValue(date)); expect(e.cylinder.show.getValue(date)).toEqual(constant.cylinder.show.getValue(date)); expect(e.cylinder.length.getValue(date)).toEqual(constant.cylinder.length.getValue(date)); expect(e.cylinder.topRadius.getValue(date)).toEqual(constant.cylinder.topRadius.getValue(date)); @@ -3574,6 +3595,7 @@ defineSuite([ expect(e.cylinder.outlineWidth.getValue(date)).toEqual(constant.cylinder.outlineWidth.getValue(date)); expect(e.cylinder.numberOfVerticalLines.getValue(date)).toEqual(constant.cylinder.numberOfVerticalLines.getValue(date)); expect(e.cylinder.slices.getValue(date)).toEqual(constant.cylinder.slices.getValue(date)); + expect(e.cylinder.shadows.getValue(date)).toEqual(constant.cylinder.shadows.getValue(date)); expect(e.ellipse.show.getValue(date)).toEqual(constant.ellipse.show.getValue(date)); expect(e.ellipse.semiMajorAxis.getValue(date)).toEqual(constant.ellipse.semiMajorAxis.getValue(date)); expect(e.ellipse.semiMinorAxis.getValue(date)).toEqual(constant.ellipse.semiMinorAxis.getValue(date)); @@ -3588,6 +3610,7 @@ defineSuite([ expect(e.ellipse.outlineColor.getValue(date)).toEqual(constant.ellipse.outlineColor.getValue(date)); expect(e.ellipse.outlineWidth.getValue(date)).toEqual(constant.ellipse.outlineWidth.getValue(date)); expect(e.ellipse.numberOfVerticalLines.getValue(date)).toEqual(constant.ellipse.numberOfVerticalLines.getValue(date)); + expect(e.ellipse.shadows.getValue(date)).toEqual(constant.ellipse.shadows.getValue(date)); expect(e.ellipsoid.show.getValue(date)).toEqual(constant.ellipsoid.show.getValue(date)); expect(e.ellipsoid.radii.getValue(date)).toEqual(constant.ellipsoid.radii.getValue(date)); expect(e.ellipsoid.fill.getValue(date)).toEqual(constant.ellipsoid.fill.getValue(date)); @@ -3598,11 +3621,15 @@ defineSuite([ expect(e.ellipsoid.stackPartitions.getValue(date)).toEqual(constant.ellipsoid.stackPartitions.getValue(date)); expect(e.ellipsoid.slicePartitions.getValue(date)).toEqual(constant.ellipsoid.slicePartitions.getValue(date)); expect(e.ellipsoid.subdivisions.getValue(date)).toEqual(constant.ellipsoid.subdivisions.getValue(date)); + expect(e.ellipsoid.shadows.getValue(date)).toEqual(constant.ellipsoid.shadows.getValue(date)); expect(e.label.show.getValue(date)).toEqual(constant.label.show.getValue(date)); expect(e.label.text.getValue(date)).toEqual(constant.label.text.getValue(date)); expect(e.label.font.getValue(date)).toEqual(constant.label.font.getValue(date)); expect(e.label.style.getValue(date)).toEqual(constant.label.style.getValue(date)); expect(e.label.scale.getValue(date)).toEqual(constant.label.scale.getValue(date)); + expect(e.label.showBackground.getValue(date)).toEqual(constant.label.showBackground.getValue(date)); + expect(e.label.backgroundColor.getValue(date)).toEqual(constant.label.backgroundColor.getValue(date)); + expect(e.label.backgroundPadding.getValue(date)).toEqual(constant.label.backgroundPadding.getValue(date)); expect(e.label.pixelOffset.getValue(date)).toEqual(constant.label.pixelOffset.getValue(date)); expect(e.label.eyeOffset.getValue(date)).toEqual(constant.label.eyeOffset.getValue(date)); expect(e.label.horizontalOrigin.getValue(date)).toEqual(constant.label.horizontalOrigin.getValue(date)); @@ -3620,7 +3647,10 @@ defineSuite([ expect(e.model.maximumScale.getValue(date)).toEqual(constant.model.maximumScale.getValue(date)); expect(e.model.incrementallyLoadTextures.getValue(date)).toEqual(constant.model.incrementallyLoadTextures.getValue(date)); expect(e.model.runAnimations.getValue(date)).toEqual(constant.model.runAnimations.getValue(date)); + expect(e.model.shadows.getValue(date)).toEqual(constant.model.shadows.getValue(date)); expect(e.model.heightReference.getValue(date)).toEqual(constant.model.heightReference.getValue(date)); + expect(e.model.silhouetteColor.getValue(date)).toEqual(constant.model.silhouetteColor.getValue(date)); + expect(e.model.silhouetteSize.getValue(date)).toEqual(constant.model.silhouetteSize.getValue(date)); expect(e.model.color.getValue(date)).toEqual(constant.model.color.getValue(date)); expect(e.model.colorBlendMode.getValue(date)).toEqual(constant.model.colorBlendMode.getValue(date)); expect(e.model.colorBlendAmount.getValue(date)).toEqual(constant.model.colorBlendAmount.getValue(date)); @@ -3655,12 +3685,14 @@ defineSuite([ expect(e.polygon.perPositionHeight.getValue(date)).toEqual(constant.polygon.perPositionHeight.getValue(date)); expect(e.polygon.closeTop.getValue(date)).toEqual(constant.polygon.closeTop.getValue(date)); expect(e.polygon.closeBottom.getValue(date)).toEqual(constant.polygon.closeBottom.getValue(date)); + expect(e.polygon.shadows.getValue(date)).toEqual(constant.polygon.shadows.getValue(date)); expect(e.polyline.show.getValue(date)).toEqual(constant.polyline.show.getValue(date)); expect(e.polyline.positions.getValue(date)).toEqual([dataSource.entities.getById('ConstantPosition1').position.getValue(date), dataSource.entities.getById('ConstantPosition2').position.getValue(date)]); expect(e.polyline.width.getValue(date)).toEqual(constant.polyline.width.getValue(date)); expect(e.polyline.granularity.getValue(date)).toEqual(constant.polyline.granularity.getValue(date)); expect(e.polyline.material.color.getValue(date)).toEqual(constant.polyline.material.color.getValue(date)); expect(e.polyline.followSurface.getValue(date)).toEqual(constant.polyline.followSurface.getValue(date)); + expect(e.polyline.shadows.getValue(date)).toEqual(constant.polyline.shadows.getValue(date)); expect(e.rectangle.show.getValue(date)).toEqual(constant.rectangle.show.getValue(date)); expect(e.rectangle.coordinates.getValue(date)).toEqual(constant.rectangle.coordinates.getValue(date)); expect(e.rectangle.height.getValue(date)).toEqual(constant.rectangle.height.getValue(date)); @@ -3675,6 +3707,7 @@ defineSuite([ expect(e.rectangle.outlineWidth.getValue(date)).toEqual(constant.rectangle.outlineWidth.getValue(date)); expect(e.rectangle.closeTop.getValue(date)).toEqual(constant.rectangle.closeTop.getValue(date)); expect(e.rectangle.closeBottom.getValue(date)).toEqual(constant.rectangle.closeBottom.getValue(date)); + expect(e.rectangle.shadows.getValue(date)).toEqual(constant.rectangle.shadows.getValue(date)); expect(e.wall.show.getValue(date)).toEqual(constant.wall.show.getValue(date)); expect(e.wall.positions.getValue(date)).toEqual([dataSource.entities.getById('ConstantPosition1').position.getValue(date), dataSource.entities.getById('ConstantPosition2').position.getValue(date)]); expect(e.wall.minimumHeights.getValue(date)).toEqual([dataSource.entities.getById('ConstantDouble1').billboard.scale.getValue(date), dataSource.entities.getById('ConstantDouble2').billboard.scale.getValue(date)]); @@ -3685,6 +3718,7 @@ defineSuite([ expect(e.wall.outline.getValue(date)).toEqual(constant.wall.outline.getValue(date)); expect(e.wall.outlineColor.getValue(date)).toEqual(constant.wall.outlineColor.getValue(date)); expect(e.wall.outlineWidth.getValue(date)).toEqual(constant.wall.outlineWidth.getValue(date)); + expect(e.wall.shadows.getValue(date)).toEqual(constant.wall.shadows.getValue(date)); expect(e = dataSource.entities.getById('reference_box_material_image')).toBeDefined(); expect(e.box.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_image').box.material.image.getValue(date)); expect(e.box.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_image').box.material.repeat.getValue(date)); @@ -4033,6 +4067,10 @@ defineSuite([ expect(e.ellipsoid.subdivisions.getValue(documentStopDate)).toEqual(53957.0); expect(e.label.scale.getValue(documentStartDate)).toEqual(40153.0); expect(e.label.scale.getValue(documentStopDate)).toEqual(42123.0); + expect(e.label.backgroundColor.getValue(documentStartDate)).toEqual(Color.fromBytes(30, 92, 161, 169)); + expect(e.label.backgroundColor.getValue(documentStopDate)).toEqual(Color.fromBytes(85, 52, 166, 62)); + expect(e.label.backgroundPadding.getValue(documentStartDate)).toEqual(new Cartesian2(32945, 5504)); + expect(e.label.backgroundPadding.getValue(documentStopDate)).toEqual(new Cartesian2(35323, 6281)); expect(e.label.pixelOffset.getValue(documentStartDate)).toEqual(new Cartesian2(8539, 9761)); expect(e.label.pixelOffset.getValue(documentStopDate)).toEqual(new Cartesian2(10537, 54569)); expect(e.label.eyeOffset.getValue(documentStartDate)).toEqual(new Cartesian3(5984, 34327, 59014)); @@ -4053,6 +4091,10 @@ defineSuite([ expect(e.model.minimumPixelSize.getValue(documentStopDate)).toEqual(40522.0); expect(e.model.maximumScale.getValue(documentStartDate)).toEqual(8290.0); expect(e.model.maximumScale.getValue(documentStopDate)).toEqual(25558.0); + expect(e.model.silhouetteColor.getValue(documentStartDate)).toEqual(Color.fromBytes(33, 239, 70, 81)); + expect(e.model.silhouetteColor.getValue(documentStopDate)).toEqual(Color.fromBytes(60, 48, 26, 123)); + expect(e.model.silhouetteSize.getValue(documentStartDate)).toEqual(65103.0); + expect(e.model.silhouetteSize.getValue(documentStopDate)).toEqual(29065.0); expect(e.model.color.getValue(documentStartDate)).toEqual(Color.fromBytes(74, 69, 164, 116)); expect(e.model.color.getValue(documentStopDate)).toEqual(Color.fromBytes(127, 30, 46, 170)); expect(e.model.colorBlendAmount.getValue(documentStartDate)).toEqual(64130.0); @@ -4355,12 +4397,18 @@ defineSuite([ expect(e = dataSource.entities.getById('sampled_ellipsoid_outlineColor_rgbaf')).toBeDefined(); expect(e.ellipsoid.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.552941176470588, 0.549019607843137, 0.431372549019608, 0.568627450980392), 1e-14); expect(e.ellipsoid.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.435294117647059, 0.698039215686274, 0.396078431372549, 0.772549019607843), 1e-14); + expect(e = dataSource.entities.getById('sampled_label_backgroundColor_rgbaf')).toBeDefined(); + expect(e.label.backgroundColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.96078431372549, 0.188235294117647, 0.870588235294118, 0.270588235294118), 1e-14); + expect(e.label.backgroundColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.882352941176471, 0.796078431372549, 0.603921568627451, 0.823529411764706), 1e-14); expect(e = dataSource.entities.getById('sampled_label_fillColor_rgbaf')).toBeDefined(); expect(e.label.fillColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.709803921568627, 0.556862745098039, 0.337254901960784, 0.247058823529412), 1e-14); expect(e.label.fillColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.43921568627451, 0.694117647058824, 0.901960784313726, 0.0823529411764706), 1e-14); expect(e = dataSource.entities.getById('sampled_label_outlineColor_rgbaf')).toBeDefined(); expect(e.label.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.631372549019608, 0.709803921568627, 0.270588235294118, 0.792156862745098), 1e-14); expect(e.label.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.435294117647059, 0.176470588235294, 0.235294117647059, 0.631372549019608), 1e-14); + expect(e = dataSource.entities.getById('sampled_model_silhouetteColor_rgbaf')).toBeDefined(); + expect(e.model.silhouetteColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.231372549019608, 0.866666666666667, 0.266666666666667, 0.635294117647059), 1e-14); + expect(e.model.silhouetteColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.749019607843137, 0.227450980392157, 0.807843137254902, 0.0823529411764706), 1e-14); expect(e = dataSource.entities.getById('sampled_model_color_rgbaf')).toBeDefined(); expect(e.model.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0509803921568627, 0.83921568627451, 0.470588235294118, 0.956862745098039), 1e-14); expect(e.model.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.435294117647059, 0.945098039215686, 0.431372549019608, 0.619607843137255), 1e-14); From 4cc7559fce7a5e1acf97ef25692af612c4c1037a Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Thu, 1 Dec 2016 17:40:17 -0500 Subject: [PATCH 266/396] Add support for s3tc, pvrtc, and etc1 compressed textures and loading them from KTX files. --- CHANGES.md | 1 + Source/Core/PixelFormat.js | 152 ++++++- Source/Core/WebGLConstants.js | 15 + Source/Core/loadKTX.js | 198 +++++++++ Source/Renderer/Context.js | 44 +- Source/Renderer/Texture.js | 51 ++- Source/Scene/ImageryLayer.js | 25 +- Source/Scene/ImageryProvider.js | 8 +- Source/Scene/Model.js | 99 +++-- Specs/Core/loadKTXSpec.js | 375 ++++++++++++++++++ Specs/Data/Images/Green4x4.ktx | Bin 0 -> 164 bytes Specs/Data/Images/Green4x4DXT1.KTX | Bin 0 -> 76 bytes Specs/Data/Images/Green4x4ETC1.ktx | Bin 0 -> 108 bytes Specs/Data/Images/Green4x4PVR.ktx | Bin 0 -> 132 bytes .../CesiumTexturedBoxTest.glb | Bin 0 -> 267852 bytes .../Models/Box-Textured-KTX-Binary/Readme.txt | 1 + .../CesiumTexturedBoxTest.gltf | 353 +++++++++++++++++ .../Box-Textured-KTX-Embedded/Readme.txt | 1 + .../CesiumTexturedBoxTest.bin | Bin 0 -> 840 bytes .../CesiumTexturedBoxTest.dae | 126 ++++++ .../CesiumTexturedBoxTest.gltf | 339 ++++++++++++++++ .../CesiumTexturedBoxTest0FS.glsl | 18 + .../CesiumTexturedBoxTest0VS.glsl | 15 + .../Box-Textured-KTX/Cesium_Logo_Flat.ktx | Bin 0 -> 262244 bytes .../Box-Textured-KTX/Cesium_Logo_Flat.png | Bin 0 -> 34222 bytes Specs/Renderer/TextureSpec.js | 199 ++++++++++ Specs/Scene/ModelSpec.js | 24 ++ server.js | 1 + web.config | 2 + 29 files changed, 1995 insertions(+), 52 deletions(-) create mode 100644 Source/Core/loadKTX.js create mode 100644 Specs/Core/loadKTXSpec.js create mode 100644 Specs/Data/Images/Green4x4.ktx create mode 100644 Specs/Data/Images/Green4x4DXT1.KTX create mode 100644 Specs/Data/Images/Green4x4ETC1.ktx create mode 100644 Specs/Data/Images/Green4x4PVR.ktx create mode 100644 Specs/Data/Models/Box-Textured-KTX-Binary/CesiumTexturedBoxTest.glb create mode 100644 Specs/Data/Models/Box-Textured-KTX-Binary/Readme.txt create mode 100644 Specs/Data/Models/Box-Textured-KTX-Embedded/CesiumTexturedBoxTest.gltf create mode 100644 Specs/Data/Models/Box-Textured-KTX-Embedded/Readme.txt create mode 100644 Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.bin create mode 100644 Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.dae create mode 100644 Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.gltf create mode 100644 Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest0FS.glsl create mode 100644 Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest0VS.glsl create mode 100644 Specs/Data/Models/Box-Textured-KTX/Cesium_Logo_Flat.ktx create mode 100644 Specs/Data/Models/Box-Textured-KTX/Cesium_Logo_Flat.png diff --git a/CHANGES.md b/CHANGES.md index 896831df2990..de74928178c5 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -19,6 +19,7 @@ Change Log * Added `divideComponents` function to `Cartesian2`, `Cartesian3`, and `Cartesian4`. [#4750](https://github.com/AnalyticalGraphicsInc/cesium/pull/4750) * Added `WebGLConstants` enum. Previously, this was part of the private Renderer API. [#4731](https://github.com/AnalyticalGraphicsInc/cesium/pull/4731) * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) +* Added compressed texture support. The supported extensions are `WEBGL_compressed_s3tc`, `WEBGL_compressed_texture_pvrtc`, and `WEBGL_compressed_texture_etc1`. [#4758](https://github.com/AnalyticalGraphicsInc/cesium/pull/4758) ### 1.28 - 2016-12-01 diff --git a/Source/Core/PixelFormat.js b/Source/Core/PixelFormat.js index 2b95611e7603..ee8f9c48c12d 100644 --- a/Source/Core/PixelFormat.js +++ b/Source/Core/PixelFormat.js @@ -69,6 +69,78 @@ define([ */ LUMINANCE_ALPHA : WebGLConstants.LUMINANCE_ALPHA, + /** + * A pixel format containing red, green, and blue channels that is DXT1 compressed. + * + * @type {Number} + * @constant + */ + RGB_DXT1 : WebGLConstants.COMPRESSED_RGB_S3TC_DXT1_EXT, + + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT1 compressed. + * + * @type {Number} + * @constant + */ + RGBA_DXT1 : WebGLConstants.COMPRESSED_RGBA_S3TC_DXT1_EXT, + + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT3 compressed. + * + * @type {Number} + * @constant + */ + RGBA_DXT3 : WebGLConstants.COMPRESSED_RGBA_S3TC_DXT3_EXT, + + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT5 compressed. + * + * @type {Number} + * @constant + */ + RGBA_DXT5 : WebGLConstants.COMPRESSED_RGBA_S3TC_DXT5_EXT, + + /** + * A pixel format containing red, green, and blue channels that is PVR 4bpp compressed. + * + * @type {Number} + * @constant + */ + RGB_PVRTC_4BPPV1 : WebGLConstants.COMPRESSED_RGB_PVRTC_4BPPV1_IMG, + + /** + * A pixel format containing red, green, and blue channels that is PVR 2bpp compressed. + * + * @type {Number} + * @constant + */ + RGB_PVRTC_2BPPV1 : WebGLConstants.COMPRESSED_RGB_PVRTC_2BPPV1_IMG, + + /** + * A pixel format containing red, green, blue, and alpha channels that is PVR 4bpp compressed. + * + * @type {Number} + * @constant + */ + RGBA_PVRTC_4BPPV1 : WebGLConstants.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, + + /** + * A pixel format containing red, green, blue, and alpha channels that is PVR 2bpp compressed. + * + * @type {Number} + * @constant + */ + RGBA_PVRTC_2BPPV1 : WebGLConstants.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, + + /** + * A pixel format containing red, green, and blue channels that is ETC1 compressed. + * + * @type {Number} + * @constant + */ + RGB_ETC1 : WebGLConstants.COMPRESSED_RGB_ETC1_WEBGL, + /** * @private */ @@ -79,7 +151,16 @@ define([ pixelFormat === PixelFormat.RGB || pixelFormat === PixelFormat.RGBA || pixelFormat === PixelFormat.LUMINANCE || - pixelFormat === PixelFormat.LUMINANCE_ALPHA; + pixelFormat === PixelFormat.LUMINANCE_ALPHA || + pixelFormat === PixelFormat.RGB_DXT1 || + pixelFormat === PixelFormat.RGBA_DXT1 || + pixelFormat === PixelFormat.RGBA_DXT3 || + pixelFormat === PixelFormat.RGBA_DXT5 || + pixelFormat === PixelFormat.RGB_PVRTC_4BPPV1 || + pixelFormat === PixelFormat.RGB_PVRTC_2BPPV1 || + pixelFormat === PixelFormat.RGBA_PVRTC_4BPPV1 || + pixelFormat === PixelFormat.RGBA_PVRTC_2BPPV1 || + pixelFormat === PixelFormat.RGB_ETC1; }, /** @@ -99,6 +180,75 @@ define([ isDepthFormat : function(pixelFormat) { return pixelFormat === PixelFormat.DEPTH_COMPONENT || pixelFormat === PixelFormat.DEPTH_STENCIL; + }, + + /** + * @private + */ + isCompressedFormat : function(pixelFormat) { + return pixelFormat === PixelFormat.RGB_DXT1 || + pixelFormat === PixelFormat.RGBA_DXT1 || + pixelFormat === PixelFormat.RGBA_DXT3 || + pixelFormat === PixelFormat.RGBA_DXT5 || + pixelFormat === PixelFormat.RGB_PVRTC_4BPPV1 || + pixelFormat === PixelFormat.RGB_PVRTC_2BPPV1 || + pixelFormat === PixelFormat.RGBA_PVRTC_4BPPV1 || + pixelFormat === PixelFormat.RGBA_PVRTC_2BPPV1 || + pixelFormat === PixelFormat.RGB_ETC1; + }, + + /** + * @private + */ + isDXTFormat : function(pixelFormat) { + return pixelFormat === PixelFormat.RGB_DXT1 || + pixelFormat === PixelFormat.RGBA_DXT1 || + pixelFormat === PixelFormat.RGBA_DXT3 || + pixelFormat === PixelFormat.RGBA_DXT5; + }, + + /** + * @private + */ + isPVRTCFormat : function(pixelFormat) { + return pixelFormat === PixelFormat.RGB_PVRTC_4BPPV1 || + pixelFormat === PixelFormat.RGB_PVRTC_2BPPV1 || + pixelFormat === PixelFormat.RGBA_PVRTC_4BPPV1 || + pixelFormat === PixelFormat.RGBA_PVRTC_2BPPV1; + }, + + /** + * @private + */ + isETC1Format : function(pixelFormat) { + return pixelFormat === PixelFormat.RGB_ETC1; + }, + + /** + * @private + */ + compressedTextureSize : function(pixelFormat, width, height) { + switch (pixelFormat) { + case PixelFormat.RGB_DXT1: + case PixelFormat.RGBA_DXT1: + case PixelFormat.RGB_ETC1: + return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8; + + case PixelFormat.RGBA_DXT3: + case PixelFormat.RGBA_DXT5: + return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; + + case PixelFormat.RGB_PVRTC_4BPPV1: + case PixelFormat.RGBA_PVRTC_4BPPV1: + return Math.floor((Math.max(width, 8) * Math.max(height, 8) * 4 + 7) / 8); + + case PixelFormat.RGB_PVRTC_2BPPV1: + case PixelFormat.RGBA_PVRTC_2BPPV1: + return Math.floor((Math.max(width, 16) * Math.max(height, 8) * 2 + 7) / 8); + + default: + return 0; + } } }; diff --git a/Source/Core/WebGLConstants.js b/Source/Core/WebGLConstants.js index 0281f4c0dff9..62a0da8c26d2 100644 --- a/Source/Core/WebGLConstants.js +++ b/Source/Core/WebGLConstants.js @@ -315,6 +315,21 @@ define([ UNPACK_COLORSPACE_CONVERSION_WEBGL : 0x9243, BROWSER_DEFAULT_WEBGL : 0x9244, + // WEBGL_compressed_texture_s3tc + COMPRESSED_RGB_S3TC_DXT1_EXT : 0x83F0, + COMPRESSED_RGBA_S3TC_DXT1_EXT : 0x83F1, + COMPRESSED_RGBA_S3TC_DXT3_EXT : 0x83F2, + COMPRESSED_RGBA_S3TC_DXT5_EXT : 0x83F3, + + // WEBGL_compressed_texture_pvrtc + COMPRESSED_RGB_PVRTC_4BPPV1_IMG : 0x8C00, + COMPRESSED_RGB_PVRTC_2BPPV1_IMG : 0x8C01, + COMPRESSED_RGBA_PVRTC_4BPPV1_IMG : 0x8C02, + COMPRESSED_RGBA_PVRTC_2BPPV1_IMG : 0x8C03, + + // WEBGL_compressed_texture_etc1 + COMPRESSED_RGB_ETC1_WEBGL : 0x8D64, + // Desktop OpenGL DOUBLE : 0x140A, diff --git a/Source/Core/loadKTX.js b/Source/Core/loadKTX.js new file mode 100644 index 000000000000..bed3be598a2c --- /dev/null +++ b/Source/Core/loadKTX.js @@ -0,0 +1,198 @@ +/*global define*/ +define([ + '../ThirdParty/when', + './defined', + './DeveloperError', + './loadArrayBuffer', + './PixelFormat', + './RuntimeError' + ], function( + when, + defined, + DeveloperError, + loadArrayBuffer, + PixelFormat, + RuntimeError) { + 'use strict'; + + var fileIdentifier = [0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A]; + var endiannessTest = 0x04030201; + + var sizeOfUint32 = 4; + + function parseKTX(data) { + var byteBuffer = new Uint8Array(data); + + var isKTX = true; + for (var i = 0; i < fileIdentifier.length; ++i) { + if (fileIdentifier[i] !== byteBuffer[i]) { + isKTX = false; + break; + } + } + + if (!isKTX) { + throw new RuntimeError('Invalid KTX file.'); + } + + var view; + var byteOffset; + + if (defined(data.buffer)) { + view = new DataView(data.buffer); + byteOffset = data.byteOffset; + } else { + view = new DataView(data); + byteOffset = 0; + } + + byteOffset += 12; // skip identifier + + var endianness = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + if (endianness !== endiannessTest) { + // TODO: Switch endianness? + throw new RuntimeError('File is the wrong endianness.'); + } + + var glType = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var glTypeSize = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var glFormat = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var glInternalFormat = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var glBaseInternalFormat = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var pixelWidth = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var pixelHeight = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var pixelDepth = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var numberOfArrayElements = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var numberOfFaces = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var numberOfMipmapLevels = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var bytesOfKeyValueByteSize = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + + // TODO: read metadata? At least need to check for KTXorientation + byteOffset += bytesOfKeyValueByteSize; + + var imageSize = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + + var texture = new Uint8Array(data, byteOffset, imageSize); + + // Some tools use a sized internal format. + // See table 2: https://www.opengl.org/sdk/docs/man/html/glTexImage2D.xhtml + if (glInternalFormat === 0x8051) { // GL_RGB8 + glInternalFormat = PixelFormat.RGB; + } else if (glInternalFormat === 0x8058) { // GL_RGBA8 + glInternalFormat = PixelFormat.RGBA; + } + + if (!PixelFormat.validate(glInternalFormat)) { + throw new RuntimeError('glInternalFormat is not a valid format.'); + } + + if (PixelFormat.isCompressedFormat(glInternalFormat)) { + if (glType !== 0) { + throw new RuntimeError('glType must be zero when the texture is compressed.'); + } + if (glTypeSize !== 1) { + throw new RuntimeError('The type size for compressed textures must be 1.'); + } + if (glFormat !== 0) { + throw new RuntimeError('glFormat must be zero when the texture is compressed.'); + } + if (numberOfMipmapLevels === 0) { + throw new RuntimeError('Generating mipmaps for a compressed texture is unsupported.'); + } + } else { + if (glBaseInternalFormat !== glFormat) { + throw new RuntimeError('The base internal format must be the same as the format for uncompressed textures.'); + } + } + + if (pixelDepth !== 0) { + throw new RuntimeError('3D textures are unsupported.'); + } + + // TODO: support texture arrays and cubemaps + if (numberOfArrayElements !== 0) { + throw new RuntimeError('Texture arrays are unsupported.'); + } + if (numberOfFaces !== 1) { + throw new RuntimeError('Cubemaps are unsupported.'); + } + + // TODO: multiple mipmap levels + if (PixelFormat.isCompressedFormat(glInternalFormat) && numberOfMipmapLevels > 1) { + var levelSize = PixelFormat.compressedTextureSize(glInternalFormat, pixelWidth, pixelHeight); + texture = new Uint8Array(texture.buffer, 0, levelSize); + } + + return { + bufferView : texture, + width : pixelWidth, + height : pixelHeight, + internalFormat : glInternalFormat + }; + } + + /** + * Asynchronously loads and parses the given URL to a KTX file or parses the raw binary data of a KTX file. + * Returns a promise that will resolve to an object containing the image buffer, width, height and format once loaded, + * or reject if the URL failed to load or failed to parse the data. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * + * @exports loadKTX + * + * @param {String|Promise.|ArrayBuffer} urlOrBuffer The URL of the binary data, a promise for the URL, or an ArrayBuffer. + * @param {Object} [headers] HTTP headers to send with the requests. + * @returns {Promise.} A promise that will resolve to the requested data when loaded. + * + * + * @example + * // load a single URL asynchronously + * Cesium.loadKTX('some/url').then(function(ktxData) { + * var width = ktxData.width; + * var height = ktxData.height; + * var format = ktxData.internalFormat; + * var arrayBufferView = ktxData.bufferView; + * // use the data to create a texture + * }).otherwise(function(error) { + * // an error occurred + * }); + * + * @see {@link https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/|KTX file format} + * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} + * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A} + */ + function loadKTX(urlOrBuffer, headers) { + //>>includeStart('debug', pragmas.debug); + if (!defined(urlOrBuffer)) { + throw new DeveloperError('urlOrBuffer is required.'); + } + //>>includeEnd('debug'); + + var loadPromise; + if (urlOrBuffer instanceof ArrayBuffer || ArrayBuffer.isView(urlOrBuffer)) { + loadPromise = when.resolve(urlOrBuffer); + } else { + loadPromise = loadArrayBuffer(urlOrBuffer, headers); + } + + return loadPromise.then(function(data) { + return parseKTX(data); + }); + } + + return loadKTX; +}); \ No newline at end of file diff --git a/Source/Renderer/Context.js b/Source/Renderer/Context.js index 20aa9ded0b77..634b56d51385 100644 --- a/Source/Renderer/Context.js +++ b/Source/Renderer/Context.js @@ -271,7 +271,10 @@ define([ this._depthTexture = !!getExtension(gl, ['WEBGL_depth_texture', 'WEBKIT_WEBGL_depth_texture']); this._textureFloat = !!getExtension(gl, ['OES_texture_float']); this._fragDepth = !!getExtension(gl, ['EXT_frag_depth']); - this._debugShaders = getExtension(gl, ['WEBGL_debug_shaders']); + this._debugShaders = !!getExtension(gl, ['WEBGL_debug_shaders']); + this._s3tc = !!getExtension(gl, ['WEBGL_compressed_s3tc', 'MOZ_WEBGL_compressed_texture_s3tc', 'WEBKIT_WEBGL_compressed_texture_s3tc']); + this._pvrtc = !!getExtension(gl, ['WEBGL_compressed_texture_pvrtc', 'WEBKIT_WEBGL_compressed_texture_pvrtc']); + this._etc1 = !!getExtension(gl, ['WEBGL_compressed_texture_etc1']); var textureFilterAnisotropic = options.allowTextureFilterAnisotropic ? getExtension(gl, ['EXT_texture_filter_anisotropic', 'WEBKIT_EXT_texture_filter_anisotropic']) : undefined; this._textureFilterAnisotropic = textureFilterAnisotropic; @@ -593,6 +596,45 @@ define([ } }, + /** + * true if WEBGL_texture_compression_s3tc is supported. This extension provides + * access to DXT compressed textures. + * @memberof Context.prototype + * @type {Boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_s3tc/} + */ + s3tc : { + get : function() { + return this._s3tc; + } + }, + + /** + * true if WEBGL_texture_compression_pvrtc is supported. This extension provides + * access to PVR compressed textures. + * @memberof Context.prototype + * @type {Boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_pvrtc/} + */ + pvrtc : { + get : function() { + return this._pvrtc; + } + }, + + /** + * true if WEBGL_texture_compression_etc1 is supported. This extension provides + * access to ETC1 compressed textures. + * @memberof Context.prototype + * @type {Boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_etc1/} + */ + etc1 : { + get : function() { + return this._etc1; + } + }, + /** * true if the OES_vertex_array_object extension is supported. This * extension can improve performance by reducing the overhead of switching vertex arrays. diff --git a/Source/Renderer/Texture.js b/Source/Renderer/Texture.js index b1c80ee0d6c3..242c91bfba4d 100644 --- a/Source/Renderer/Texture.js +++ b/Source/Renderer/Texture.js @@ -60,6 +60,8 @@ define([ var pixelDatatype = defaultValue(options.pixelDatatype, PixelDatatype.UNSIGNED_BYTE); var internalFormat = pixelFormat; + var isCompressed = PixelFormat.isCompressedFormat(internalFormat); + if (context.webgl2) { if (pixelFormat === PixelFormat.DEPTH_STENCIL) { internalFormat = WebGLConstants.DEPTH24_STENCIL8; @@ -97,7 +99,7 @@ define([ throw new DeveloperError('Invalid options.pixelFormat.'); } - if (!PixelDatatype.validate(pixelDatatype)) { + if (!isCompressed && !PixelDatatype.validate(pixelDatatype)) { throw new DeveloperError('Invalid options.pixelDatatype.'); } @@ -123,6 +125,24 @@ define([ throw new DeveloperError('When options.pixelFormat is DEPTH_COMPONENT or DEPTH_STENCIL, this WebGL implementation must support WEBGL_depth_texture. Check context.depthTexture.'); } } + + if (isCompressed) { + if (!defined(source) || !defined(source.arrayBufferView)) { + throw new DeveloperError('When options.pixelFormat is compressed, options.source.arrayBufferView must be defined.'); + } + + if (PixelFormat.isDXTFormat(internalFormat) && !context.s3tc) { + throw new DeveloperError('When options.pixelFormat is S3TC compressed, this WebGL implementation must support the WEBGL_texture_compression_s3tc extension. Check context.s3tc.'); + } else if (PixelFormat.isPVRTCFormat(internalFormat) && !context.pvrtc) { + throw new DeveloperError('When options.pixelFormat is PVRTC compressed, this WebGL implementation must support the WEBGL_texture_compression_pvrtc extension. Check context.pvrtc.'); + } else if (PixelFormat.isETC1Format(internalFormat) && !context.etc1) { + throw new DeveloperError('When options.pixelFormat is ETC1 compressed, this WebGL implementation must support the WEBGL_texture_compression_etc1 extension. Check context.etc1.'); + } + + if (PixelFormat.compressedTextureSize(internalFormat, width, height) !== source.arrayBufferView.byteLength) { + throw new DeveloperError('The byte length of the array buffer is invalid for the compressed texture with the given width and height.'); + } + } //>>includeEnd('debug'); // Use premultiplied alpha for opaque textures should perform better on Chrome: @@ -144,7 +164,11 @@ define([ if (defined(source.arrayBufferView)) { // Source: typed array - gl.texImage2D(textureTarget, 0, internalFormat, width, height, 0, pixelFormat, pixelDatatype, source.arrayBufferView); + if (isCompressed) { + gl.compressedTexImage2D(textureTarget, 0, internalFormat, width, height, 0, source.arrayBufferView); + } else { + gl.texImage2D(textureTarget, 0, internalFormat, width, height, 0, pixelFormat, pixelDatatype, source.arrayBufferView); + } } else if (defined(source.framebuffer)) { // Source: framebuffer if (source.framebuffer !== context.defaultFramebuffer) { @@ -197,7 +221,7 @@ define([ * @returns {Texture} A texture with contents from the framebuffer. * * @exception {DeveloperError} Invalid pixelFormat. - * @exception {DeveloperError} pixelFormat cannot be DEPTH_COMPONENT or DEPTH_STENCIL. + * @exception {DeveloperError} pixelFormat cannot be DEPTH_COMPONENT, DEPTH_STENCIL or a compressed format. * @exception {DeveloperError} framebufferXOffset must be greater than or equal to zero. * @exception {DeveloperError} framebufferYOffset must be greater than or equal to zero. * @exception {DeveloperError} framebufferXOffset + width must be less than or equal to canvas.clientWidth. @@ -237,27 +261,21 @@ define([ if (!defined(options.context)) { throw new DeveloperError('context is required.'); } - if (!PixelFormat.validate(pixelFormat)) { throw new DeveloperError('Invalid pixelFormat.'); } - - if (PixelFormat.isDepthFormat(pixelFormat)) { - throw new DeveloperError('pixelFormat cannot be DEPTH_COMPONENT or DEPTH_STENCIL.'); + if (PixelFormat.isDepthFormat(pixelFormat) || PixelFormat.isCompressedFormat(pixelFormat)) { + throw new DeveloperError('pixelFormat cannot be DEPTH_COMPONENT, DEPTH_STENCIL or a compressed format.'); } - if (framebufferXOffset < 0) { throw new DeveloperError('framebufferXOffset must be greater than or equal to zero.'); } - if (framebufferYOffset < 0) { throw new DeveloperError('framebufferYOffset must be greater than or equal to zero.'); } - if (framebufferXOffset + width > gl.drawingBufferWidth) { throw new DeveloperError('framebufferXOffset + width must be less than or equal to drawingBufferWidth'); } - if (framebufferYOffset + height > gl.drawingBufferHeight) { throw new DeveloperError('framebufferYOffset + height must be less than or equal to drawingBufferHeight.'); } @@ -379,6 +397,7 @@ define([ * @param {Number} [yOffset=0] The offset in the y direction within the texture to copy into. * * @exception {DeveloperError} Cannot call copyFrom when the texture pixel format is DEPTH_COMPONENT or DEPTH_STENCIL. + * @exception {DeveloperError} Cannot call copyFrom with a compressed texture pixel format. * @exception {DeveloperError} xOffset must be greater than or equal to zero. * @exception {DeveloperError} yOffset must be greater than or equal to zero. * @exception {DeveloperError} xOffset + source.width must be less than or equal to width. @@ -403,6 +422,9 @@ define([ if (PixelFormat.isDepthFormat(this._pixelFormat)) { throw new DeveloperError('Cannot call copyFrom when the texture pixel format is DEPTH_COMPONENT or DEPTH_STENCIL.'); } + if (PixelFormat.isCompressedFormat(this._pixelFormat)) { + throw new DeveloperError('Cannot call copyFrom with a compressed texture pixel format.'); + } if (xOffset < 0) { throw new DeveloperError('xOffset must be greater than or equal to zero.'); } @@ -445,6 +467,7 @@ define([ * * @exception {DeveloperError} Cannot call copyFromFramebuffer when the texture pixel format is DEPTH_COMPONENT or DEPTH_STENCIL. * @exception {DeveloperError} Cannot call copyFromFramebuffer when the texture pixel data type is FLOAT. + * @exception {DeveloperError} Cannot call copyFrom with a compressed texture pixel format. * @exception {DeveloperError} This texture was destroyed, i.e., destroy() was called. * @exception {DeveloperError} xOffset must be greater than or equal to zero. * @exception {DeveloperError} yOffset must be greater than or equal to zero. @@ -468,6 +491,9 @@ define([ if (this._pixelDatatype === PixelDatatype.FLOAT) { throw new DeveloperError('Cannot call copyFromFramebuffer when the texture pixel data type is FLOAT.'); } + if (PixelFormat.isCompressedFormat(this._pixelFormat)) { + throw new DeveloperError('Cannot call copyFrom with a compressed texture pixel format.'); + } if (xOffset < 0) { throw new DeveloperError('xOffset must be greater than or equal to zero.'); } @@ -513,6 +539,9 @@ define([ if (PixelFormat.isDepthFormat(this._pixelFormat)) { throw new DeveloperError('Cannot call generateMipmap when the texture pixel format is DEPTH_COMPONENT or DEPTH_STENCIL.'); } + if (PixelFormat.isCompressedFormat(this._pixelFormat)) { + throw new DeveloperError('Cannot call generateMipmap with a compressed pixel format.'); + } if (this._width > 1 && !CesiumMath.isPowerOfTwo(this._width)) { throw new DeveloperError('width must be a power of two to call generateMipmap().'); } diff --git a/Source/Scene/ImageryLayer.js b/Source/Scene/ImageryLayer.js index 3123f580ec78..8181ca91774d 100644 --- a/Source/Scene/ImageryLayer.js +++ b/Source/Scene/ImageryLayer.js @@ -722,11 +722,24 @@ define([ } // Imagery does not need to be discarded, so upload it to WebGL. - var texture = new Texture({ - context : context, - source : imagery.image, - pixelFormat : imageryProvider.hasAlphaChannel ? PixelFormat.RGBA : PixelFormat.RGB - }); + var texture; + if (defined(imagery.image.internalFormat)) { + texture = new Texture({ + context : context, + pixelFormat : imagery.image.internalFormat, + width : imagery.image.width, + height : imagery.image.height, + source : { + arrayBufferView : imagery.image.bufferView + } + }); + } else { + texture = new Texture({ + context : context, + source : imagery.image, + pixelFormat : imageryProvider.hasAlphaChannel ? PixelFormat.RGBA : PixelFormat.RGB + }); + } if (imageryProvider.tilingScheme instanceof WebMercatorTilingScheme) { imagery.textureWebMercator = texture; @@ -739,7 +752,7 @@ define([ function finalizeReprojectTexture(imageryLayer, context, imagery, texture) { // Use mipmaps if this texture has power-of-two dimensions. - if (CesiumMath.isPowerOfTwo(texture.width) && CesiumMath.isPowerOfTwo(texture.height)) { + if (!PixelFormat.isCompressedFormat(texture.pixelFormat) && CesiumMath.isPowerOfTwo(texture.width) && CesiumMath.isPowerOfTwo(texture.height)) { var mipmapSampler = context.cache.imageryLayer_mipmapSampler; if (!defined(mipmapSampler)) { var maximumSupportedAnisotropy = ContextLimits.maximumTextureFilterAnisotropy; diff --git a/Source/Scene/ImageryProvider.js b/Source/Scene/ImageryProvider.js index fdfa6dec444a..974e820a52a3 100644 --- a/Source/Scene/ImageryProvider.js +++ b/Source/Scene/ImageryProvider.js @@ -5,6 +5,7 @@ define([ '../Core/DeveloperError', '../Core/loadImage', '../Core/loadImageViaBlob', + '../Core/loadKTX', '../Core/throttleRequestByServer' ], function( defined, @@ -12,6 +13,7 @@ define([ DeveloperError, loadImage, loadImageViaBlob, + loadKTX, throttleRequestByServer) { 'use strict'; @@ -294,6 +296,8 @@ define([ */ ImageryProvider.prototype.pickFeatures = DeveloperError.throwInstantiationError; + var ktxRegex = /(^data:image\/ktx)|(\.ktx$)/i; + /** * Loads an image from a given URL. If the server referenced by the URL already has * too many requests pending, this function will instead return undefined, indicating @@ -306,7 +310,9 @@ define([ * Image or a Canvas DOM object. */ ImageryProvider.loadImage = function(imageryProvider, url) { - if (defined(imageryProvider.tileDiscardPolicy)) { + if (ktxRegex.test(url)) { + return throttleRequestByServer(url, loadKTX); + } else if (defined(imageryProvider.tileDiscardPolicy)) { return throttleRequestByServer(url, loadImageViaBlob); } return throttleRequestByServer(url, loadImage); diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 7a2ca8bd8811..d7692813ee09 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -23,11 +23,13 @@ define([ '../Core/loadArrayBuffer', '../Core/loadImage', '../Core/loadImageFromTypedArray', + '../Core/loadKTX', '../Core/loadText', '../Core/Math', '../Core/Matrix2', '../Core/Matrix3', '../Core/Matrix4', + '../Core/PixelFormat', '../Core/PrimitiveType', '../Core/Quaternion', '../Core/Queue', @@ -86,11 +88,13 @@ define([ loadArrayBuffer, loadImage, loadImageFromTypedArray, + loadKTX, loadText, CesiumMath, Matrix2, Matrix3, Matrix4, + PixelFormat, PrimitiveType, Quaternion, Queue, @@ -1390,11 +1394,16 @@ define([ loadResources.texturesToCreate.enqueue({ id : id, image : image, - bufferView : undefined + bufferView : image.bufferView, + width : image.width, + height : image.height, + internalFormat : image.internalFormat }); }; } + var ktxRegex = /(^data:image\/ktx)|(\.ktx$)/i; + function parseTextures(model) { var images = model.gltf.images; var textures = model.gltf.textures; @@ -1415,7 +1424,12 @@ define([ ++model._loadResources.pendingTextureLoads; var uri = new Uri(gltfImage.uri); var imagePath = uri.resolve(model._baseUri).toString(); - loadImage(imagePath).then(imageLoad(model, id)).otherwise(getFailedLoadFunction(model, 'image', imagePath)); + + if (ktxRegex.test(imagePath)) { + loadKTX(imagePath).then(imageLoad(model, id)).otherwise(getFailedLoadFunction(model, 'image', imagePath)); + } else { + loadImage(imagePath).then(imageLoad(model, id)).otherwise(getFailedLoadFunction(model, 'image', imagePath)); + } } } } @@ -1949,12 +1963,17 @@ define([ var gltf = model.gltf; var bufferView = gltf.bufferViews[gltfTexture.bufferView]; - var onload = getOnImageCreatedFromTypedArray(loadResources, gltfTexture); var onerror = getFailedLoadFunction(model, 'image', 'id: ' + gltfTexture.id + ', bufferView: ' + gltfTexture.bufferView); - loadImageFromTypedArray(loadResources.getBuffer(bufferView), gltfTexture.mimeType). - then(onload).otherwise(onerror); - ++loadResources.pendingBufferViewToImage; + if (gltfTexture.mimeType === 'image/ktx') { + loadKTX(loadResources.getBuffer(bufferView)).then(imageLoad(model, gltfTexture.id)).otherwise(onerror); + ++model._loadResources.pendingTextureLoads; + } else { + var onload = getOnImageCreatedFromTypedArray(loadResources, gltfTexture); + loadImageFromTypedArray(loadResources.getBuffer(bufferView), gltfTexture.mimeType) + .then(onload).otherwise(onerror); + ++loadResources.pendingBufferViewToImage; + } } } @@ -1988,46 +2007,62 @@ define([ var rendererSamplers = model._rendererResources.samplers; var sampler = rendererSamplers[texture.sampler]; + var internalFormat = gltfTexture.internalFormat; + var mipmap = - (sampler.minificationFilter === TextureMinificationFilter.NEAREST_MIPMAP_NEAREST) || - (sampler.minificationFilter === TextureMinificationFilter.NEAREST_MIPMAP_LINEAR) || - (sampler.minificationFilter === TextureMinificationFilter.LINEAR_MIPMAP_NEAREST) || - (sampler.minificationFilter === TextureMinificationFilter.LINEAR_MIPMAP_LINEAR); + (!(defined(internalFormat) && PixelFormat.isCompressedFormat(internalFormat))) && + ((sampler.minificationFilter === TextureMinificationFilter.NEAREST_MIPMAP_NEAREST) || + (sampler.minificationFilter === TextureMinificationFilter.NEAREST_MIPMAP_LINEAR) || + (sampler.minificationFilter === TextureMinificationFilter.LINEAR_MIPMAP_NEAREST) || + (sampler.minificationFilter === TextureMinificationFilter.LINEAR_MIPMAP_LINEAR)); var requiresNpot = mipmap || (sampler.wrapS === TextureWrap.REPEAT) || (sampler.wrapS === TextureWrap.MIRRORED_REPEAT) || (sampler.wrapT === TextureWrap.REPEAT) || (sampler.wrapT === TextureWrap.MIRRORED_REPEAT); - var source = gltfTexture.image; - var npot = !CesiumMath.isPowerOfTwo(source.width) || !CesiumMath.isPowerOfTwo(source.height); - - if (requiresNpot && npot) { - // WebGL requires power-of-two texture dimensions for mipmapping and REPEAT/MIRRORED_REPEAT wrap modes. - var canvas = document.createElement('canvas'); - canvas.width = CesiumMath.nextPowerOfTwo(source.width); - canvas.height = CesiumMath.nextPowerOfTwo(source.height); - var canvasContext = canvas.getContext('2d'); - canvasContext.drawImage(source, 0, 0, source.width, source.height, 0, 0, canvas.width, canvas.height); - source = canvas; - } - var tx; + var source = gltfTexture.image; - if (texture.target === WebGLConstants.TEXTURE_2D) { + if (defined(internalFormat) && texture.target === WebGLConstants.TEXTURE_2D) { tx = new Texture({ context : context, - source : source, - pixelFormat : texture.internalFormat, - pixelDatatype : texture.type, - sampler : sampler, + source : { + arrayBufferView : gltfTexture.bufferView + }, + width : gltfTexture.width, + height : gltfTexture.height, + pixelFormat : internalFormat, flipY : false }); - } - // GLTF_SPEC: Support TEXTURE_CUBE_MAP. https://github.com/KhronosGroup/glTF/issues/40 + } else if (defined(source)) { + var npot = !CesiumMath.isPowerOfTwo(source.width) || !CesiumMath.isPowerOfTwo(source.height); + + if (requiresNpot && npot) { + // WebGL requires power-of-two texture dimensions for mipmapping and REPEAT/MIRRORED_REPEAT wrap modes. + var canvas = document.createElement('canvas'); + canvas.width = CesiumMath.nextPowerOfTwo(source.width); + canvas.height = CesiumMath.nextPowerOfTwo(source.height); + var canvasContext = canvas.getContext('2d'); + canvasContext.drawImage(source, 0, 0, source.width, source.height, 0, 0, canvas.width, canvas.height); + source = canvas; + } - if (mipmap) { - tx.generateMipmap(); + if (texture.target === WebGLConstants.TEXTURE_2D) { + tx = new Texture({ + context : context, + source : source, + pixelFormat : texture.internalFormat, + pixelDatatype : texture.type, + sampler : sampler, + flipY : false + }); + } + // GLTF_SPEC: Support TEXTURE_CUBE_MAP. https://github.com/KhronosGroup/glTF/issues/40 + + if (mipmap) { + tx.generateMipmap(); + } } model._rendererResources.textures[gltfTexture.id] = tx; diff --git a/Specs/Core/loadKTXSpec.js b/Specs/Core/loadKTXSpec.js new file mode 100644 index 000000000000..3718ca996ca4 --- /dev/null +++ b/Specs/Core/loadKTXSpec.js @@ -0,0 +1,375 @@ +/*global defineSuite*/ +defineSuite([ + 'Core/loadKTX', + 'Core/PixelFormat', + 'Core/RequestErrorEvent', + 'Core/RuntimeError' + ], function( + loadKTX, + PixelFormat, + RequestErrorEvent, + RuntimeError) { + 'use strict'; + + var validCompressed = new Uint8Array([171, 75, 84, 88, 32, 49, 49, 187, 13, 10, 26, 10, 1, 2, 3, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 241, 131, 0, 0, 8, 25, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 224, 7, 224, 7, 0, 0, 0, 0]); + var validUncompressed = new Uint8Array([171, 75, 84, 88, 32, 49, 49, 187, 13, 10, 26, 10, 1, 2, 3, 4, 1, 20, 0, 0, 1, 0, 0, 0, 8, 25, 0, 0, 88, 128, 0, 0, 8, 25, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 27, 0, 0, 0, 75, 84, 88, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 0, 83, 61, 114, 44, 84, 61, 100, 44, 82, 61, 105, 0, 0, 64, 0, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255]); + + var fakeXHR; + + beforeEach(function() { + fakeXHR = jasmine.createSpyObj('XMLHttpRequest', ['send', 'open', 'setRequestHeader', 'abort', 'getAllResponseHeaders']); + fakeXHR.simulateLoad = function(response) { + fakeXHR.status = 200; + fakeXHR.response = response; + if (typeof fakeXHR.onload === 'function') { + fakeXHR.onload(); + } + }; + fakeXHR.simulateError = function() { + fakeXHR.response = ''; + if (typeof fakeXHR.onerror === 'function') { + fakeXHR.onerror(); + } + }; + fakeXHR.simulateHttpError = function(statusCode, response) { + fakeXHR.status = statusCode; + fakeXHR.response = response; + if (typeof fakeXHR.onload === 'function') { + fakeXHR.onload(); + } + }; + + spyOn(window, 'XMLHttpRequest').and.returnValue(fakeXHR); + }); + + it('throws with no url', function() { + expect(function() { + loadKTX(); + }).toThrowDeveloperError(); + }); + + it('creates and sends request without any custom headers', function() { + var testUrl = 'http://example.invalid/testuri'; + loadKTX(testUrl); + + expect(fakeXHR.open).toHaveBeenCalledWith('GET', testUrl, true); + expect(fakeXHR.setRequestHeader).not.toHaveBeenCalled(); + expect(fakeXHR.send).toHaveBeenCalled(); + }); + + it('creates and sends request with custom headers', function() { + var testUrl = 'http://example.invalid/testuri'; + loadKTX(testUrl, { + 'Accept' : 'application/json', + 'Cache-Control' : 'no-cache' + }); + + expect(fakeXHR.open).toHaveBeenCalledWith('GET', testUrl, true); + expect(fakeXHR.setRequestHeader.calls.count()).toEqual(2); + expect(fakeXHR.setRequestHeader).toHaveBeenCalledWith('Accept', 'application/json'); + expect(fakeXHR.setRequestHeader).toHaveBeenCalledWith('Cache-Control', 'no-cache'); + expect(fakeXHR.send).toHaveBeenCalled(); + }); + + it('returns a promise that rejects when the request errors', function() { + var testUrl = 'http://example.invalid/testuri'; + var promise = loadKTX(testUrl); + + expect(promise).toBeDefined(); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError).toBeUndefined(); + + fakeXHR.simulateError(); + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RequestErrorEvent).toBe(true); + expect(rejectedError.statusCode).toBeUndefined(); + expect(rejectedError.response).toBeUndefined(); + }); + + it('returns a promise that rejects when the request results in an HTTP error code', function() { + var testUrl = 'http://example.invalid/testuri'; + var promise = loadKTX(testUrl); + + expect(promise).toBeDefined(); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError).toBeUndefined(); + + var error = 'some error'; + fakeXHR.simulateHttpError(404, error); + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RequestErrorEvent).toBe(true); + expect(rejectedError.statusCode).toEqual(404); + expect(rejectedError.response).toEqual(error); + }); + + it('returns a promise that resolves to an uncompressed texture when the request loads', function() { + var testUrl = 'http://example.invalid/testuri'; + var promise = loadKTX(testUrl); + + expect(promise).toBeDefined(); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError).toBeUndefined(); + + var response = validUncompressed.buffer; + fakeXHR.simulateLoad(response); + expect(resolvedValue).toBeDefined(); + expect(resolvedValue.width).toEqual(4); + expect(resolvedValue.height).toEqual(4); + expect(PixelFormat.isCompressedFormat(resolvedValue.internalFormat)).toEqual(false); + expect(resolvedValue.bufferView).toBeDefined(); + expect(rejectedError).toBeUndefined(); + }); + + it('returns a promise that resolves to an compressed texture when the request loads', function() { + var testUrl = 'http://example.invalid/testuri'; + var promise = loadKTX(testUrl); + + expect(promise).toBeDefined(); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError).toBeUndefined(); + + var response = validCompressed.buffer; + fakeXHR.simulateLoad(response); + expect(resolvedValue).toBeDefined(); + expect(resolvedValue.width).toEqual(4); + expect(resolvedValue.height).toEqual(4); + expect(PixelFormat.isCompressedFormat(resolvedValue.internalFormat)).toEqual(true); + expect(resolvedValue.bufferView).toBeDefined(); + expect(rejectedError).toBeUndefined(); + }); + + it('cannot parse invalid KTX buffer', function() { + var invalidKTX = new Uint8Array(validCompressed); + invalidKTX[0] = 0; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('Invalid KTX file.'); + }); + + it('cannot parse KTX buffer with invalid endianness', function() { + var reinterprestBuffer = new Uint32Array(validCompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[3] = 0x01020304; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('File is the wrong endianness.'); + }); + + it('cannot parse KTX buffer with invalid internal format', function() { + var reinterprestBuffer = new Uint32Array(validCompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[7] = 0; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('glInternalFormat is not a valid format.'); + }); + + it('cannot parse KTX buffer with compressed texture and invalid type', function() { + var reinterprestBuffer = new Uint32Array(validCompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[4] = 15; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('glType must be zero when the texture is compressed.'); + }); + + it('cannot parse KTX buffer with compressed texture and invalid type size', function() { + var reinterprestBuffer = new Uint32Array(validCompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[5] = 15; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('The type size for compressed textures must be 1.'); + }); + + it('cannot parse KTX buffer with compressed texture and needs to generate mipmaps', function() { + var reinterprestBuffer = new Uint32Array(validCompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[14] = 0; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('Generating mipmaps for a compressed texture is unsupported.'); + }); + + it('cannot parse KTX buffer with uncompressed texture and base format is not the same as format', function() { + var reinterprestBuffer = new Uint32Array(validUncompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[8] = invalidKTX[6] + 1; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('The base internal format must be the same as the format for uncompressed textures.'); + }); + + it('3D textures are unsupported', function() { + var reinterprestBuffer = new Uint32Array(validUncompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[11] = 15; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('3D textures are unsupported.'); + }); + + it('Texture arrays are unsupported', function() { + var reinterprestBuffer = new Uint32Array(validUncompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[12] = 15; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('Texture arrays are unsupported.'); + }); + + it('Cubemaps are unsupported', function() { + var reinterprestBuffer = new Uint32Array(validUncompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[13] = 6; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('Cubemaps are unsupported.'); + }); +}); diff --git a/Specs/Data/Images/Green4x4.ktx b/Specs/Data/Images/Green4x4.ktx new file mode 100644 index 0000000000000000000000000000000000000000..b251f62c3f5e2873f82f0876b29e8b0fbe0fc818 GIT binary patch literal 164 zcmZ4O9TK5nXt5`-nxt*oG)@zTL6L3QRwA$k zW`>xVF?M3d>=c6``5p?Lla} z)@@pM?iU~4v0Jye@c7oxv^5^S5g!}THC#RH5);)kCOSMizEi)Rc;@kT?K`w--6bX= z8t?A#M4Q&}>gm>Ryzu-h&%cgui;9SD{mlDqKg3^QeeqZO4j&F`Q*~~k?K|A>blNuI zbZ`!?(`o;h`J-(geY}n9;EAYHdW26@{SQyO&it*HUg*%e#wkADm{WZ0sfMf>-t(Q4 zY}W?=Ri9qFHjnV%{Z8!3#++FDr=DuSX4bWOPq>{{+cwZNMmdJxwtIwC48J|ZTX zw8qDAih2gL?j9Z;9vc=P6ALoy5)&C2)-|ks_sIBe&tYSG#)d~FM8-$-jEo5H`g~;1 z9$~GYiH}VP=PNPYA|gRupxd4i_~_f=o&Wd>KGHipHV(gnXWBj5_EG$Ht*7`zHEAot zuYMTXwtBfp^%2owvHe23gLhn1_DXnk_xK*5>BrlDhYRAvV!M+eIz0CD6YXpK3V5c9 zq3-*&PuBWY^)v3@+kxL}oK^K%H~6I6KV9>rpJ@MBUEkNxvwf^Xt?z5s?(sTLuzdqB zzx@;K+dl@5bQdq}9)G$$>BqQSW53+C1?%dfw6NINuztq7YHe2gCptVuxswn}Lg^Y7 zANEWeMU$Y&?&0byU*=zJ+qPAg9vv11!fIXpT&<6`X&v4-K0KOarat_aKfNC6PAXM< zZ3@rY8`d5t7!?r}-pLSz>NNiS)A+tPDPAi0Bs?}EEK+^>OOV1{;veaRpG=5V^zJ%6 z^BJ&Oc$Xg05xo+4(p7&`F7^(KOfasmYecth330|7)E9-iUtL^}i0FuDXoA+yw0|56 z71uMoOG0EAIP!h45SE3v_D?_6wtWX|5X5A|o@@7^aXH~}J&d#XV|YwdczkTXN22f) zzL8|%x|+Y@8Juy?*odfz_=w(o|NCI=cxaW*3Gv3qU+wt%U!Q*k7ip@k(DskxGp}`g z5zu`#UZ7?(*B&p_T6w${Lk0KP zAY4|P*3o#NHmLSRy{g_dpmmoX5s_VE!>QUnRNosLLFLx24dkQxug<^tR@ZvH-@5i! zx5lgP>xI+k9vhR;^Ocw`6rgQ8w5{XETgUf}k2T-X{t5Mt#+^`2f(!j4f0Ap+B?#@n zO?11~@0_&y!Mabh?$c;Xt;Qv)ULgF9_qxvG-Ox8*3+)se79H0uCN_#EQpXk6JgK^W zsQUZe{;K|+7sBHr5~4z1iRm5_`iID{_)vpqLPJActQV?;2sBam*sv%?3$DKnHR4XZ z@3#&MjmFuAMS{k{LVL!WQbHda_OHKCxjv-)Q|zyS9%#?RwP7^@w~B*9H0;=h-#9TNqUJ8|tC!Y4vM0 zULeC8jPt%pK8l;-)a9!8*L%VEtRd<L_*HQQgqAeoDtRBulR ztu_nHzwnOG@9gk*_MGoB_S0M{*Y>&|^7Zd7C(pX(3iEw#i`TmPZ}m!*8B)EDib=6{ zG=^M^QQMxudh!y(V2VHSSX+2B5z!#(=&;B?)Ogk<1+kdb@(_y|lMvg5^32^ns5qQyT7Nd=lHt$ym@av=X$*FIlKqA#m}j`kbTd6D?{+wV%Pmp*YoDx;I}B!DHUc*ZH{WJJl=3d6~}*{hjd`XpHM$ z^uOZ(L`G0Zz z*O31&uP?yY)}@`XT=HaH|1$if3d9p;phj{)p%w{*ZZ+5A$RE z5r7IYv3Ls~Jk<8lHm$0Us`t3WUtRBN_h{9-+)lRo11@3I{>6u?F0+mMity9s2l4$i zF4^@hkM`}?ztu0F#Rc|#sB298L&jCL;T7_P@ee2QFi)IcrmjbQ;7#s!R`qB&uy$eC#`~85e?A z>LVkQRv;2PU}@ZS3O?obDru#bUi$7EYU`KUr_{cco3&l@tZEZ+-30eoD;O1O6KkCd zmRONj^>Sd#+A6|vU6lHi`}N@?rs2j@sb(R(v*u}HlU{Q<4C-5IUnaf@r-d)Uwypk4 zr*~SlYq#?U-~Zp=|K5N2kAL^Qe^4SNow3c;2ShxD=!s04u`E&oNh-2{;tGv%>LcuxT92RAGP1d&+_2+nBU9a;BWCa z%gai&9MG~*(|{LfK>c}Z7mn<9^1?7^SUoL4l zQgIx09VvNb;(nOVAI-yi`57GiY*t~pWaE2s@xA#t3QEfHTV+yGN*Pdn9y}k@#?bbG zZ|DWBpZ#+mOuL)>Wd2a|gLZ7kkDaW_Bf zlv(>KWZ?m)EIsU$75MITsSf;>P4;G%DS47zXq*eriRZ?1q--GV@!Z|7LDQpu(xcut z&+VJZ-zJ|>mz#W^3!cgVf2ZV@$u98Qx>UO?0$)!8Z<2=xZgxoT4K|5iZ+BM>)-I85$ER!T@+lsFvc^{9;B)FVyl%dqpXGPN;4r_p7rvLj6^GwU z*kG6bkRd}MJ0|XO%KQTrvigWacBGd}at>ruewpM#M$u;AHI*uV0e*vw9Z!>O_;@OTZTeu&1d<4};HlXO_#?M{VFGr_$GbHiJ*YH#iiJM}X>hNj9O}-;vK8T0C{koDBu5)xhXP!swde|wrCSKcM*b8Iei!41{ zA$zkO@EOX~S`drm+Hj3Dy;(zVdL3JK9o=nv>iZJdzr@ipfvFt<&bABs@XLen%Xc{C z({&E%vdS)9R@x;T_dQk{_PMwD*y`V-ZNO^@UuBc7xHev6#9D`p+FmJ(VdHEAZjqd8 zV2!!OHmp%i9Fc3N=~%CUKhc0`(=t9rpO<(!{osAT>6RtiW$JDNYoqT@o1Q*4`J_s} z)6Vum9p6;h;BFi68tF&yn&~Sf07n?Q#UT@b9}r{QlVy`^U>;mEt{vCV^p*UH2K2cG zpUhJF9(tZwS01oCh1)^LFFWjj&FfTn8F4iF@8pRpeh(mCZ>WrLmkE>y{2bSYxB+7k zOAa|?dxi~|2x5g|-(z-i6KZy4A>oqaW+G|JKpx-9D%tcPa=5#ya2sULGFn*%riCPAF zL)MV@?ZBujfZaQBq~zJ;bKrNwx7rO|51iYy>v^wv+L|>m*OayaV+o9p4BG-(u-_pE zbM44`E>nBL++^;NH)uisMsTe&bqsN+D&HQq=t^LDL$^4kJLt0WN}F^C&P^Oo^Sw2E zUwa+RSVC8|*33O3X6P_50>o8{O3RfkzGjsAr zZ#QyYV_g2d!m6~L-(vQTDGMTDe-STaPBLQ$YmPWo?UE@6v^}8ZKttt#!u1%lhrZ81 zp3bIJn^4y?=bdzB;?wRrN&oG6z5k#!cE<~uSHSv+^{GzS12$JKfq@e?ln(U!f=gzY zwj%4;b|Pj!XFqD?P%jsU8W++Y`TjvPs9*PuH8N#1?E%&w%--jeomqBOA6=$$ih_%_ zwJf{;epBZYJ7ygYF})$EjqUk0^6!z8t8IMW;OVBwRwc8shuq5{h|8`zS^>MxruLe9 zuK6Ok*MK_T4m#jH`)05{jdk*@w;`6#+P0?9o&JpP$PDfw_mX=$es`tp%(Sb$cHes~ z2ZB!yaR1HReD=jznPOM<^vp{)b-u>)eTR>mDpR?KCQcXyTVOz$H8+Oo0 zxj3{f5K#UQZ9Dd^WuMGd$u=2;dh)K110S@}Pt>@8 z-^&5+VJ`YtuR(9zk*L#&V;+x7?rYv@9`6Lo`kB4}NL3Z|j=`Qcn!Rj&bU3;2gDFmYVw@(|x= z-yPnvspyPzTy9S1zPrkRw(nB^Gh+ebY zU(NfP&+Fpz`#nc{fX4vjf-b|{lf5}kDFB8<8q+es_twC~Yc`}(ZnG|wwfM#!-fy4v zYg#tcM*~U*Ab(KR7;ksTri==)q1TA+QSN*EPy38{d^7ekZ=Zd%ZRnY=^LOi`ZT)=1 z~|~V9Pxlp z@LjY6W&%s*?1nO6%O>qWS-6STg*}&wvMP%Wz;e zdUcFY%K^{J0mb{Uz4jxvHyLwq`)qO=7{5ifo+oHVe`jFX5yS<#r@c2CvzYfGXV9EU zpk;vPWB_9?wE5}lPu%6eEL;aLKJ?tydSB~(FUx<*0Qv)@!SR^&l3r+6zJSIAJj4Gg zuLu0kzI>Zf%OxK3agCX{8spdYMa$S1>_<)-jKfTVjcIoD88q+!-EY)d89xHDx={Tc{Ad$5roWohxWro)qh{(+f(K z-XDhk&YJHv5BickP`&{4&_MJUTyqq23QKX(xN{BezHEd%Xre zNCQd+z#kwUz}Num21vUa4{Z7x(2nBFok>+#pU&si^3Qi|AIg9pzysK4kbPt`3Xvjj!51C1Cz=51jHd~d|~G}h<4bgyMn_1-8<5dB1m335(x31^XMKcG=Efa}GBd6r|5 zYeo8E{w3wBrZv3=zD@(AQywEQmymPH=>upP&@ewhVW+T}G7;mSzQ?KRur=Rnp7(X0 zuYG=sX5j}+*j1tG(#ZchE_i<#VDf$%cz-^6bh1yg&h62>Uz@l5nYT5x@ zk8)$%a6QrrD?)0E~l|5_J=mL2FzpHBajOs*eW9|DDl~hW!Ip9Kj4yS3kk}Y~f&hJ}IkA&E2KF#J)XR_iKKtkDvVU zdG?+rZ4W|@U{a2wQSq=ql?R61Una!+CLq5r$`v>9$NkmktmV~%XuyaG*k#-6 z8x*`fgvk5E`#E=e!2#A$YJdMh^b;(vQ%`>9fNltc>!%E0j_~{gm5TPwzO{j>=*bbG(Ll zU;(TZ$_EzU056ay>f)6^e2)E7?a=+nxtz~Iy|4X!U!hHJp9lTo?yGFl6+L#ltUzA} z%;KE1?}RK!J|mwWIfMJtGI{?=)#s`6iZTfYj%LUK|Lyxg8-SP~Ygv=fN3h(+9AV6- z4FVaU^#t_XVvarMxB9a!U|#pCqfSXJH1NP+umO0DIjHGde8?fg zw>yo#osfrtMA!OS9=xB5cftPyHdiPezYRQIdgg|lxq3$~-MlMTZyCoG-1G5SJYRn9 zrmW3AFQaxIQ~jSJ@p*rh0ki>#cMslLDGLu)sy?EDZUd0_*~5pkc>8U#OLy!a>v}Z5 z1lJmnXW6frc7EaM8*<_LH*)>-Fu&GcWdLcvJ8A{{ zp}uuZY9)9haBBt0`#cUI$8RuVpxiTU_Xii>Q_geW$+I&Lo`OEVCEq-V>FbdQckX^G z_Vc%7&Y@HOEd$`o&<`4z=#WEscEuy)lR(1)i1)E4(vpMh+iTz-TJHxJ|I=@$%?RI2ag_xmGFk^ecPdeOlOWgnAQ0*U{PzTHMIpK&{NzkYwD z(dM2r^?ncF{PcOJC7qOW*S={E>sNjDJbZ^ahfgb=!Z?CI`T{C12mi9-wAQr%$LF>~hkr!hVM}Xu88oo@a9Dv_HlD&ID2b%x=hi|RmB@^o& z1m0hgdR9(dxg*W9{A)^#v)As(s?2jLE}-VXftRc}Z*PAGW#phOPT85|Kp%0VZ;(Ix z0pxww^|24yEY$S(^kb~n+q4i!zel=`g>GA!bxyM3uV24ojqW$4z%AGkrDtx+ro0Oh zhaS=VJ%3z3%1P!1Pug=#)*>Fjei;6Z1(u@!S-E_+jr&2}@1OXLKhlyfoii~%_HfOp zye2on`%Q%WO?Lmz{kJeChy`W?Q|yc1@#nY_Wmk{Y4jGCV+1_kpuAo2K0F+yd^)E%9 zPXc6r_f`HIr}ZUX^2c*wt{dmH7M!~A9p1I_iDK9QL$+4SbIAYw6P+s8$4Y*${avMJZ>k(&f44JfzYxb5 zh2Gbhm@n>+K0qnz8FpcAPjA%rv3I}b{ov$%$_~==5ahX1KYQ}V{NS;>k4q$euema- zB|lGIA-GJxlrS6n7D_BxE79=Mj4Tu=SmExZ2I{{s>$yrTa{>^L3} zIFr(sumQ&Ju0U;o|KNb+ea=1GiMc%q(EU2Uzh!yP7i1s%xe@;(K1ZC6c%79uejW3O zb5GomzK}DNH@QV0n7kPnk^H1KrPfA8eWCu7m!(f3G1iZN}v` z=U-Gg|BTmJd814@ap|_~F1ZAonfSkdua`;hChu?tR(7E=SKOCl0XF0;@%&ih!}>n+ z{LSmp_klr|jonA;F~+r7^Ro*)dKvY+R^C`Eob0$Fi;tdBy#)AsjXg(SeLwBz-sp+4 zKNmOv=7*R(=4*0*c0coc8Lvo8vmw{VsB7}ob=BwPJszPRP_^#cDrIT1~x@eNNOi$FytxE%bf}B97kM;^9|5xDLGGV98GI2j``v;63s*5%o z^BnQ)Zis7-MDLFLlQ)`N_iOUJd4CsvKjVJH{pt7nbM8-F>#1yL_|cPgqfZceX8A1t zL+|GU^WU0YE`3x_FYoD>y4FoU=UeM<=C#ldn1!1CWAN9Tn+M3xpSXNm7N9p6^JVmx|nF$SKw`2a*r=p#9OWH%!)0mywpqtIIRa z%5m`S-6jSDsP|8!575^+=OxyK`2{M?aoyN6RXa zA2gpgjL+}4PKFGysW{z6)awwtYs!s2|MsGbs(&DDeq|>Iu)j&U8L`$WqY(>8FEsiD z`3eR|{ZGt)&}PgzTjfymyY5E=`nBfskw34YqGj~GV_)ywlh;*$&s*O-I4^*v0{aBg zcQ{&cO=cmUVEFujzn&3TuQ2pTACPEAEWmf>hmrTqo}Rto_lNsw4;FvsCx1M5+K4@2 zD^A>dLUtBkQn@>f;j_Od^8=XA!{ZJPKIZc$(Kp~|#Z{RPe}6c7f%Ef$hWFLCms~I6 zr_2dnmQtzWY~;O`wgGq!tn(SW!=ZeXVA+rQ_DMhAa9vD0AQH1*jQ;;l8H@PcnymAx zKTt0E1mwdu$U)9vvhAvTjriX9JttKEe>1Pl_4~Rr?t{`{D2O)RXhSR8ujZOg1s z`9Lix1Nhs-{TCcSPhXAs>sY@9_#5q9(s=DdW6FkJ&H%LqP0Q^nP^Vp1B|5%(0Ws;^Jy#|^FJWm7UwO*(RSf5@29&8yLkhXsTeE+%o z4cuSb|KHtr`fBz0v+n+_dY|^6wEn0?1LUc?=tuR_0&Pv%Q-MA^-meR$?q|+lT7H?D zTc<!Ta1Vt_AHg?i=G&oOQi`2O#4fq?0PzA^qUsbAvG}Ahp1p8EDkrdpaM0yl+RHKl}P`N!PZ&!SmQN z_ME}~k=NPlb`0v#=3$ooSLtVED`s0CMhrV0{jWK%F6a0)$;96&j;pF3emQDlnF}`v zJ@VKmhkHwmSJ45!Q_F(Dlmk_?1D-cyp9!e-ABY~tpCK1w9_E^D$U84d<(DPZc~$jK zVqOGiD5O?imHlPNo3fo$alo=t@9{rt5OZO7EIo``ALut;M=>)4wPR3zuytoHa6t;Eeay8U%w_!heL{si%}Qsc^iQCeg83_i2lp zct>CKw5QBw?1KpX)2-y8f-e1W~a6Vrk# z=a)Q38$4>Ak()Xd{(2_-c-m*=*LzK@W3N*PxSpgepe=Fn#$DAnb7|T+HQ$Q#W6)7> z`d$7g3rIUWm?z5~NP9~!tKKEoZ{KZJPvkpy?#SuWr^Nvqz#G^fYyEa+*;USOudfX{ z^vC^Z%sG?y$!`NOzjj5&IXR5^)s)xlJL|0*Wx<8(cO@Nluk3Y2+{K_NEdv^}m)?G_ z(i`v-84DV?r9zgborPU@OW{9OsEoUJ@5+@cSCkAWFE96~44~~_0NwuuaKGW(Dva44 z;0*ZNJ`9j6g9Al5kN&}mo9II#D^AL)m*!~Bl@Wzf&WhTzLt$@?Z*7&zc{ z&+|X@e`Z0MjNFP|1ej4w`_muyr6K1`-Y3r26WIG=;BOZZYw@+)1>gcZi!TRF53Gjl zo3Fgb)QwYUq01GvwZA-7@k1K(JJc`}T_`6BO|^hCWv+miDyhy|Fr;ohKg{TnrX zF47KjdMJlS?x>VPKKsa##! z{JzZl?lORV@E5^Pi9=lhX)w_C#vf>mIpB=VvQKv^`V=xQ?5*3qd-vq()vLl7fG2za zVt<_PF=?04-#-xZP?XIN9eTiarOAD%y|v%9e}{P^%o}At&8pgg0LN#2NhX*%VY4yY zWKYRumA~bAtG^}{+`M_yV;G=`{f|QLLB_)<=X`1Xn|m(Qm$chhx5K<^PvbQ;cg~te zv{%?ufBc@~#_VO-GR<8V{rQHiA^E>Qa<#V?UKBgxv)IN8TCvKT!07q4%rz?+mcCme@Nh68FMoyyY|l$ zdHnA5z+4Sa-}n=(IbM@}PSurizce0bEzNR0&0Za>-y_!VY2GL8+>d^k3w-wMS%m>w zSqnhlpZz{my+3#*Q23wzKCz7Pz|4r9d1C**xqC-0Uq2@&FW9BxOtIKb%hQ~i@A~%l-nYQ? zZ(Nkq7b^_fIhiLm9M024a_nrWoV$ENZr;8Itjh3L83VX{`Lg90Ao;(rq#QLr6#>)d zpZiDNUyyP};r*A zZ^iFY_p_dF4`es-ek*gd?%w-G&Rm2|=sYTWvsTOGwVz7o@&7Iz2mPbGI`ALV!N1=b z)mjEG=_H9M3#9x+wvy#_(Lr;bJBxY~<}b642(Q_sT`SfwSigh1BaV6DN6*S(^l-a+ z%R0Q6y8PCi>&h<7D%&RuHV=?br#&No8~iWwD(MHuUqM5ihW$|bLnf?FnkpHkd!+(4 z0p-B;>(4ARzZIE?!kY*bX>B_lVttDS;|K2JpNJn zU^HmQjc&}pKOFP0gim@**#y(S?g{$YBj+!j7CY(y%YfHeg#nQNb5ZvZ}(}piOmMIfgb(b#C_wT7aYc216_A|AIAB_G5?rR>D3-68kscFVd~hP^_uMqGn^2-#CCcD*xT@EdRQKlL7MDBAr+r>)KFr_ERi zpZ@c0LnUU$bMn!cUn;twj(8vZUz=|DSm_kd&U>RsUk^#oS-+R9N0vxQSrK@jwZK-$ zfKoMMC>_1Nd;9T>&l-5`cG%|FKP&ORJKx-rQtw%c>T<0n6T?w~+Ub zpDUNSiT$O^gtk?7VtssHn|_oIA^pI^X?_M&rKTO!SRM$*_ZxbjKBGgHXPlFBz*Ma87m3$VZ&2@lwR@~|o!Gw7 zdc&QrNH<+4w3q#98^N>C+mHcG<$LpUkEQ_`dlJ1ipckN$I8{d788uB;g$A_@zh#N9CVC9Ydg?A&zk$vcTAbw@8O)&Cx zL$2A~ZXAX<3VXC$WjB)d85iE0wNiS)c31XaBW%Xnv_xN_>%9gcKwrMey1!ax(C&K| zvYdY4-mF!K|2k1edfO5)KpTL)ib>0i2eRggG~N(i2*&qNK6Zng>;>F}eVDE61H;(< zq5MrUC$SIkpNACx*XHTQJXZV<{lDeVmr`6(2prG}AE4>{&%D2?SwCs$Wu$se`WLO3 zv^@=dSPFpGUb7IdWxQo~<_d|O{i3`*qLn4O-`sD?kzVuOXZ?Q7{TmLupL=IzF9z;kf%Axp zy>Q*%A$Hdc+pVs>B~83F;>Qv_<9D(td7fN>zOdp(-{-{TJF+V49D39oGiJCz&v}cl z{N;COH*!A5hTIDZFTM%i$%@-uU`BT2@s0i}RLS^vu*byk>Y{pZrC0{|;b&npJzp{U`4m`}eVmyKvnbvri3uui*z6 z`2sOBpF^I<9)%ZKLxbN6a~|2#cr^M{aji^S$zS->ljq6xAl|n!)5!1p<}NZaEWnJu zh0n;`u!UO(OW3$al+9=b?~|s88}U0ACJvFDf^?~{A5(Dv6U%GtJ?(#U*56mjPL(s` zFZ|E_BYn(0d`eD2*I9-4k@wDCJ}&DH&M@#==;(&>b5q}E*oME539GxS{17Yn-~0~B zfPKh;WQ_o^08jFizkGL<-H14G@tK>J=7!$>=BA{T?3C!4zcYB>LYtBN&s?*)8~aOk zL7G%Jj$6Y2Ine)Kg8zvb`vd>;96wo&98F+;+t81}O1$p|>MaT@QWY;!KYL2|yUPmG z4v3oZtYnt$waf;f3?P=x9)}}9>$+cnp)*K7tO;F={*PATeO&J=*U!tUeUnwb7cpM< zeQxgGL(T)sHuAN)_*%{V{j6A<&WvX{?w;Cw(#Z66agvpHR4N@OtkM7A|0RcfzxGerZQyL&ivr{m}N@67pyXX z*UkC}_Dx~`l$#dy?__@8mFpK^yX{kW|NE}o-3RS=V_!G;|Ccg(O_XHjrN}Yo$!6sM znf`w^_1H1YNi-OgxzEc+}WNp%PKeiAJG0;tny_Y6l} z&oYba`LEr)EL)CzEwn|Fe$lvt^wnE$0yUAG2%9?M==Brv4}YXMz9c z9l*>#;(tEK|H|$M|BqyxAGvK-#`$mGxhY4BwoBBE->RHEZ`=HJ$q3eay*2#br2FK@ z<%^vov4$8US8=b~XZumh~(GTR)8h5!2^|AR&;o4!Cj|3%Eiv+{QN z+BsRVcY>0uw7u(Fdv89^eP+HPe{<*;Z%NtlY|Cr_`b@-4Hs@c2AIzR1fzAI4??X-R zlzk_}4*$o>8}Yt_c^jn5#J2MGNNaL@?nh^y;D5&dvx{u9i1?om`v2TN&LS8E-Os#s ztMS^L@`EbB*AsZ{{r2)fuW_&0Uw}1Z>kdp8$|-b!YBu>23uOOl_6%8=d?uiC18FxB zGh!Ze3i|k16({B<&?hTDo`W85?&Oe<1kCakgP@KT;Wssf8>4Q zwX{(=|5oiE7r&V|1Fr=JynmXET>61m_pkPTHsrCA0njZ2KmVH)SEgH<8$>@i8~sBE zZAESnY%CtW?8i6s+{pW^eP$0h_Cv9389g1lu^!wD`JpDAkQT`Q6IXsB z8M)TQ|MHOk_f?AT@IUvDJ#1Ld|CPmfE$jKWq%4vcFW|N2zBTurwk3NGv0p$DauZpX zXjN_iXNhp8)xa&N6$DP^?|1-he$o$fou(f+rTU>*L#3;cH&OYn#jW z?w_ZgVgJCD`zA^ra?H%0(9JZ5RNaIV{gD?PIV}S=SNOdzz#0eQ*sOibJ#pRAK3?qI zxn%n=^ymJQ*L;3=8c_Ma;Z?|q=m!#}< z=-mmt)}oqB_x}{7)doS-!Ymt{iy!NQ`n&o&c<7n)+K|9JDc&!zCUi}^HFaA^21G3NjSL86}Mp)H9lsrNi zkOO_m`Qr4mxfc!fw|(V(lv{D=%D?Eh1U*jFZOEQB4@W;N6Ib_8a|W%-4<^H0 zy?sx16kn2f)K<5YE@-Shp>zi@qtWPf#JmQpY<{lCjoVk%+!pp{G5WW+4DXXpxbO5` z*X^C{>i<>Ito}cW{~-f7M<9u_zgwvPC-J`UmE|&gN2O##|5%Cl-9pTqIX;}PrgD5* zNOm`c&+qpc(gNoSZBP9|E?zxDQnlp9{GbZpfvl}I_{z8a0G=b`#LQhIhGAtNC@v`b zK#gA&-XeHk?fp0SznyGKS}aAy1=8I9pCq+^|{rvgnShX zFz_PKEHFRzH?f_+318hB!{6xL?NI$+Kb`g)r8`=hR%pAj|NquQ%h3O~$P)fHe1I~^ z!2F*+Ex`ZWJI0-M!RB-V@4t=QR4Z<@iA#@X%A~cQNW|2qU6^0X*>2X;jxlfWlWD(J zzG><4EX!tz5I3`9FDC9gq3Y&*wN{w^33Y#e;KhlkXRvCX{N zy6<~)X+ZHm`v31fvJO6biL3UndHz57-;NmoIhg-9c(ZqXKJH&E;!PVpfY-8z4twda zUvf*~wawk{2YsG+Ankz8m_a&vd6?>3#y%!i+?XGnf9i&eM?8SJSiY7UNZn7oZwz{y zuFg7dX%EQD=;5^vJy;^AKkK3$->3_t|H_=hzaC3~B5-kDW5`i$(iGU)R+ggsb%DM!Sl;{gj^liY$#<@-~2 zTXB&8i%QW0*i{4I$vr0T(`O?sC3yg^wE?dkx3Vkt&ghqJ@<^cHlRj8496Rep$#?h zKk^E*!T+57XC40+ga22jRv`b=b26TG8?hwjXcMn>Sd7=6IB%C-8O!BUU}A>dR?}8) z%zFFddl{eRT=~T0`NF%{qs#83w> zepA(knEKXN=z#oB9CFgCPoBa4{!QPtGxD7#t@%W@9$hTwkpKLx1$i<2igVZQpeMsw!~+~g zzW^`T0mK|gLt~&jNIzEPhZ65&PnGe&i@G7VpE}mp?0%DO-W}Ci!V&x5dt|-R)yw3YMcx@K;&T71t`^VlmwD*J2<~Ql1<~`#9KS8a~k0pN2 zA7o$FYPpHIW>(y2vsGNUElV&vYcTo-MS9o{pwAc&S+g86C#~X|FgMYP8*To|vn80N z@u|uUWen9<>4!Z=-U0tdOnyrB{VgxIChqSp2j~M7pbl_$Ql+W^w<_n$lXxxj-ap?q zRK>oHeAwW^`)cxh&1ra289CJmPAE@ke>~m9i{C=My?XVxoTHr-zP|t7Gjpxo8-E$NB0xNk) z*-9<7M-Td4>V7k>GvxEP5&O^b82>W{xFNj)@f8Q^@tRi)MA^apBVN1ch;?`^^ZV$x zokaiD)%zy{uWhINwg;_au)c2EMWdI0EcR3RsuzM)d_)}Q0Osg%o}QKdB4vV!El%8f zQuXa;{K2Xl`=%VuOH{dZ#QS{J=O@jYc3cbmA?m^Xz;5I@b{h7t^2yX^WX+x# zs_xHf?9b$X`T*I5RTKiEHC zkps+!>M{9A)Uz%}eZ)Dd*h%^0CobQXg(+uHKW<HSD_wDte{~|qS{9g8_Zn7-r&*XXcdmH#aA2EQ1 z2P#w#D9%jep47Krbv;ikh&DfKM)FQx7uJwib-Q@=v@F~@Q1Skon2%@Lw&q&t`!-HLdixv!M(%n#;FLG}$I4Vdg>$@la7b6dNPj00wK8!ekxsUg;=S+K_G5#p@?dFW$)QYPrx7RA(C+2qn zx_|ke@hS(3buRv3yZM?t;+hff?ltT8GJ8{k>TPuwcCi&V=5tX7uxG&h0UyF4fd|Cg29C9C9^tjahe127kc_B{1E?K2+yTRp}-eT1ICe)=NDH~SFh zt=v>`K8v~+H&Kh691*Yo$IHR?U)1$4t~@r7Fl$(c));4|xdH1h39^l#l- za8cC@vd)vW-ru1e&=GToNL$1WrtUwf>I;}3W)WPZXovk!3NbUO?}EQ7y74Ewk$c6O z?l~L#%B~};J&OIg%Yah!7IHY9pbhlTJ99&pXPiTC&SR?XigVP>gR)^BWc{AfOOgv; zU-ewKa`Ui*tYI(`yf@Ar2}Nr~9)cDZ=*BKk_+RsB`yk5yi}t!DCYemrwOjsy2)T_|NX_s&Y4e-C!) z^;?%w%br}df13B3&-*5AaV?20$00vB&vDqYSt9OogmQow5bb%^dsQN5khDV^@i=Jd z44%ITpMmqpt)v}do7DTq&X&ni^zaKq&um|-=QsDE{(JNvLGDkV`G1w<%sq0f;*>|R zKX-XhT3U)6gK{~2`m}uWO?5wB`eWSFZ(!qDRlnm-FYbS{em$*Zmwd5vq_R~h3+rDi z>-Zv=euLN&<6zU)$A}Yp($hEcIQ4|px}x@ZllNKkbRc&Fu#Oj%t>eu(omS8g>4tvp$bGPkP+Z)eC}g4{xohRlh^o9EN)TC0j-! z=QjhhelXj_!`PoY|5FAy91gj4%eo#C4W%pg?cWc2jGy}_zrt&++Iw$)5AEWQ$37yX zzWN9~Z>J+pR$(a~*w8(<>U{>@cT_%G_K~WAR+tg&Xm75m6~D#v?uvTft%uR;zqC+n zs^3@hdwrWc{-AsEzs+Wo%a<=BXWTk`_(A(@?q8qze*xC_Gt@l-@At#~vw{Y^^&RxB z-oiZOo-=EtJCQ46(9522YL)wdweS`n1nch@egJx>Ko0bp^CI%(_NjS7 zp4@AzzuU<1sgOn6hNyaeVw?Vo7nANo$NoxYu1}D{qCBtRe(rqFzrE!HP;N6nlf67< zZ|tq>`CCZlk?zPd?0?NV3)*7-a3k+uMi00|%y?y919{&Udw4ZezfcadzGZvza`0e@ z*W!M)`Ja#J16;j&Rn>cYiWaT|uSqZ2ElYQeMxE2se!qVW-Dh8XAMH-+p4prFs5t_j z+H)(vmwC(ujuhm{{n^0!A;WxeZ5w({H(x_F<@F%Ed)!Ud0E0L<%W zT{`Dh3|ah^(m#g$)^>kG>BY+TnRx*T^Zq0mrF-Ot#koON@;&uFdzzfQV3!StW~*FT z=7(Cj9^U>gu0Q>;{+RQThdCcMV| zx81x=FP`{4`T-vy_RKjdlmVP4Cd%FSgWo8h*ep(LeN$ zz+@7D&7=VnylJKSZt{0gZ=An;Qg&n3OaFx(Ri4bd0l@pz{mfP9jy?_hQxl>08SnF6 z%&$HfKp)`j*|V190_Uiw-ldx@^@(mP%ej#`xWNmbdn5U zG*@oG7sMX6)XmTvC8`$Gz>0pRc*fuLK6#(DNgrdaM=cFiGyXhX>sKGY*M6RH04M5! zu3x|2WE+4on|5T`i5%IJxl)EKc}vM{|I5n`E?h$Sqpr9>%*^LyBQSQ(T4EnID|?9C zPo7ZTuzxw{^A$Res<{T7>+b7)dmAI0X>WBxpAXKiTeoj6=5ZCbDDGcd1~3kA>Cz=- z12kpd>8owRT)Lr4-T}t{Yc-=r<9z-jOGuyGuSm>UnYXz=dNAeyd!r2Sye&Z9XAS7) zBa2l3BF@25ydOY$VYGqY9PvZ+`S}a#efIi<-|sF1=mVTNb4IRRyVj^!0PQu_n5P!+ zkg>}UxZ&P%fX&@9zYs{$AfZ2@!yzn=kMPMIz$4*CpC2E<{oVPWf3qIo)TvYV z#Q|s=kRC2yJFj}pmL1QQRr@9>94QpICUpog4uAL8>e|O(c#i%Wb2Gc5A9d{P7iA9e z1hUJMRNcT8*m&Igrs4zNLWXdz1M`nBTs?)jaDi;WTt3d^?KbIg6_X(S&?gC`wWe)F zn`X+IC`mlHM2d$N<(!K@jwU{_Hd6DzRBc?p1dNiy%Fhlj(qHn-?L!8gVyiUpl z_T6R-k#o0b6Y}wGJbx4PLrjr)ekE`P<{oc6JO{Hm`bh8je^&S~f6w6iz@#6_)Trsd zl^w~e(R&N|ez3J`>t0`YY}N!-R63Dwbp$n*+ZC3#7PcAZaE*g~#yBkNmOe(mdC~^2 zP4j)r+wPu{RVqgC*-un|9rmi?-hYa@48y;C54re*)%;QF1NwhCs zQPB@=`)TW9q!04f^zr_r`r&OOi>Ip?V^beJ-7+7|GUHi;@#m?wY zv@>P3l#~^>Xsw^g;k%HM|ki~J3<2^hC{Ys8PRcRzORTj1)uy7o{% zS98Bf%%BVC55tT_e@o1NuKAv@dz|rM)P$|zHZEVC`{W$7o>6Xpnb?V zg85k82Py3sw*N0>#@BI}>&M>SEuZUuKizM>#=NA=yrVMs^EXw#u3@V+omLt{SNgqr zodbmiDEpZ2b0A|2aKCb&%J(sOy{>!CA7p;g*Zb!yyysouKRTYL`7%)W(i_)7d`#6@ zukY*enZ9-LaC4ud4UnCeD#I7QC!xUkiQ8!VU&{b*@Q%O#hKZF%P5+%7OyBO(`@R|T zt4~f42cQkGV&_yfqkvcr?HPaH8-4y-hIx_($otG+WUO@Rni$E4-(T)0et%6_V92Yz zM>k5soR@+368qQu?@8Lx-|hdhi9EtQfBOAv_RKWue4tBf@)lm`E4oH;wx8BT3CU;Pdgm`^zBO0OgoVnk9+*mq^q!qlb?_ z?u|ZYEfYLV1H}BgPG~O+HVu(|sT*9n-@p9++VX(8%1(QwvICZE8Kq_}=y;&!B~SB` zzkNTk@ejv5r1bs~)c01{D_Xp_XKh|?>SJPo><^Hhdsqf6d|kx?wG7ZQz~6Y(bLVT+ zFMW!>7rT$FlhQKG*R?tQCf?r=xxn0|lF}ksxoe7wYrZq8wT=a}P#=HK(Xp0kO<7yo z{U2e@>g3hYk_TVe4qjmnO+)y~U*1DMfJahVqC}#1xl#WUnDv@Xp#lAw;FKN2{KyO8 zsEZ`tPu=e?dA^O6J&XrXzD+?~v&+P`$O&qtbAq%D5VUrns)Isa9R2=*i#kbqjxo<8 z&~$&boG@~j4`=L>kzam@n&5Wee_a=(b$@W`e)c4%9~?LP53=RZGU)!&fV2CndEdxa zplsvJvXrb{vTXYV=`r~!W&da%2u>ad)_rF^Y}oimW!#EzS+{q#6cp$Ad91(T`ACch zI1t}Bnv*0GR`yW#kB$du{tq5mfPS9f|2XtX-I=lmdLMl~z!SbO%cHiw_QYfIf2HGu z6hh`P9zg6P7<)Se54~&I=DyeDed7HSSAHT{=;?K$@=U;De)Y)@$~zuuz&wU7epg{Y zx;{|zi94SJ=HHC<{|r5So|C;t)+=8)&|>}d@qF#)X$SDRT`B9(-;}w*f!Dh^FlkuJ zsiy8L?Oe{YT)As1=6CvLAMe_H>dD9DWj3`AMx8L`e6m*v)~KoLt3RiC(-&!gwk`Er z7<%B&SQjU`g_$nAFR=1_nj$M`2QV*S?)v_!zq3&*tYv^N(y>0L#>-bD&i`XIpJdn< z@4@Fi7&KUaL*xNtg2Vz+GWVcwc$jpX{Fu%Q(0M@tV*|3E=^N;Q9R;7CasIM$_Q}pVl$cQgLQ1gy-OrY_)M(bzaS~Kc?9zCW$E#p^wBANL|R4tr4?d!jp zJ7ClY6qV!y4_qq)7W_@E8`nqNYd^U7B3o-TPsnV@Zl=KTluEu$TP z86v0^{(9d6`2;o5l%d)V@GaWbvgUsKVb=7um&IE~sve&7Z_RkORr)e;zsHaPMaB8D zX7>y=Kaev7^c;cv(VTwG7i1Fk6zh4z(8F)$*S%HWD_dFM)$@B^_An-ZS)v8$G8?l` zIV1e_q5n(w5Z7@5pT&cix5D1toJTxpaVJSeJd1HH?e90dHppGB&|c!P_3&5HZ~m+3 z8^n3x@CC5Gz98%MIcS^1ody`MdVloKRPXKui9;2R6{x*D-1*d#e{=l`in3)>(ju9L zz9Gz=qzrIhcm22K!i$sV_VruPQRZ$Oh+ZCtmF^Fgnm$j<0Lp=k++_4d9*miS z?X?}C{Q#fQ0o41P)i-)+XGu!ktomFUSf9@Eu}UtO^@7>J1LkZT;HnwMoM>Pz^tW1C z{_EclJ{!cq`hJF7wKg*5tIl#Xd%w!-v)MSOTl2nEyl;LFWh(6e)(lTs9i{TA|Ax7O zoEfkAFZlScCHLIK`snZXU-+6FNZYD--_ZL_!@Ep6*Z1|WANilhhW!hq-@Lz~p6U_B z|2jWF^S}4xff3{T5I$JswBN}5O@mO!UyQ!p4pq;t`L}-lZT{LYH^7dWV%dlbER#8i z4Mt2s4?!Il&^C~lFcJ3e;C$Ypi{F;dH;(`=MXXQT{LSa>hRY2VSA{>2Q<#pv>9bUh zwUziFP`YOJq?eI8f60BVP~A6_MWktakvmiUaW zAJ+Cjb7hsu_tgFDQMY!_9OR?qDj!tm^?6_C*JnG>7T|or9gqRT(PO0>Y_xYUTZM9< zxip|ZADnW8y#LO~AIqB~e1w_E-1;B z?WLMCsPhA~3~V$uXkh#wBfivg_Dh&q*Hcn+_v;#7pX7Z*-q0RnKha|JRZY&^EpyiQ zgB|d=jtw-L_JdR3SKE08?{~(0o>5CbmL18fRUH~Wn;?)@A&rN5F`*!yeu&QUogMx0sa^45pD z`TFy;*Em--H7iM$Z=WdRmUngG0<;A*HW=)DuVVU$>vfsXR{A2JbjI2^68%M=QGJET|2khN z@NEGT2mWa6!|($i$E=ADW%rS_z=`rzTwmw&1-{K=#0ksMn=uo6zfQi~Hdgw;_xpI< zqeiSy#|Q$@7BXUboVy(}<9Ss#mUwWnn!inbVZ`+`&R3uA48-S+Jug-H0;$;tWMSek zRnPh1=!cb0sC$d}zdfMhdGPVrBc>Z-dJ|WEB1ypa3W{?TE^PSun(qUVzZ-H*1~$li z0n`!}q{&9~8SFjx&k7fMedzyI*g)|3#s1Il?t4XSr_=Bsq9^Z<(3A6NS-xwsq~#uR z;d{oOH-tv?dxF3x0RKDf$0WBXL*{K5An|klsA>p49K(D8%p})2#D3%xaPAiO>}RT1 zB<=l)n7wxt`MVX4W03Xi)1h^~mTNWT8f^h$1B?Of0w%O{`*<0+@D0R<+bRC1J~4U? z>f9lBJ?l$<6T{^}EGKsMACbd1ND>czA(_bIV;+d%^VQsU%?Elts%gNeC+1_$BhJh_ zBCGezmi`M~lP=@iDji5%Kw|^G<13KgjTv#|`$weL%opT~t)nG1J4p&LLyCN_{d~>i z)ja;-wJ`ICnK!_Bq?x%XY8Kh>FW#5vna`^PwN2nXJAi9#;Q3tpFzEVj zlb!%>^B4Ji%LqA=y-($RD|?PM9gfEAy?*b5`6HOt$dmD|b!9jPlo2 zA9D77XD>)o2YHVVd`Aa+Rqh^V#~Xb(Jx>do--36IDF+<3N?^&yRZobOJEzFh)iIJV=Vb}! zd@|Uk3V#O8QdfCHHwNNw7=9Ifd*U zVZL5x%+ijY@tn+97b`ncR;!x){GuF%%MjNy{CgeG^EMCY-=n-W=9DYDv%Fl%g0$>| zvVPw@%zsZnFTxMdoBUbOa9hX%^cGUeBZ zBenyL|GQCl-n%8}a*Y9^O)J?PrRNp8i4~i5{m6EwfHXU3dOF`q4Rz*s$SuY}n@R+JaHsT2M z7YzH?kO@Yg6939SWFIZ#P`aHqkIJ3;1+cq^Rg9i9oTH}wPW5B?V(Tc(bDJ**;6Je@ zi~SqRVM|r5pVsr*&hhh_Wa=-w%>kM&S23!*qAZnDa4>zlY)D#&c`|)u$l^EQ=RPZM zkNUB^j=83thW)F`U4MIID;J*V`&go3&;L~Q&3=2tzsZ}(zvs2QIpT-XeahpKFz;m< zzoI+hr&DGB(L_nd?5y0vOl2$4monB!&(pb|Zqcv#uN}nx#Eerp?Ui!Oc~Xv5oJ3Fg zEZLE=3U$b1WE%QR_eWkqG;-G2n}Gd`*|#theJY59bEbj9!(BSH+D7oEZ1}Ej=Q**D z$~!nd7(*Za5#aUhqz7g*Mo)hZy|rG2FW&>T6$9mKU?b^y2c^<^3~O*o;rDi1h3eg` zY1@BkTkl=N_D;nPlz#x97FZV7jW%x~@Gas6={d==D|sz&uNksv^DvnX+0gtlC%3GBIkA4D1_NB4S=;zz-N(puNDkr-kTg%30_+(5>0|>4=Rdt9V0F z>SoMBTcP^eZ9;FmjY*#id6YA(zS=QS`5KFXyM4Z8q%7VtO34#GzXG{TYxc~nQDn^fWV)WemD$EYLo##y)PxHD}G@-vo z%NIi?n0&^2VrIk?95@tyMmd2vIeC&Yf-?}<-;Vx8J`c!?T<|ZkcIGYdARfu*c`(ji zsC0L}k~K=+q-I-vu_mWrU)E^{JT%P~{ literal 0 HcmV?d00001 diff --git a/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.dae b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.dae new file mode 100644 index 000000000000..b07a87d4aa98 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.dae @@ -0,0 +1,126 @@ + + + + + modo 801 [Build 77509], Microsoft Windows 7 Service Pack 1 (6.1.7601 Service Pack 1) + Plug-in: [Build 77509]; Use Absolute Path: No; Merge Reference Items: No; Save Hidden Items: No; Save Cameras: No; Save Lights: No; Save Locators: Yes; Save Triangles as Triangles: Yes; Order Vertex Maps Alphabetically: Yes; Bake Matrices: No; Save Vertex Normals: Yes; Save UV Texture Coordinates: Yes; Save Vertex Colors: No; Save Vertex Weights: No; Save Animation: Yes; Sample Animation: No; Sample Animation Start: 0; Sample Animation End: 120; Save modo Profile: No; Save Maya Profile: No; Save 3ds Max Profile: No; Formatted Arrays: No; + file:///C:/Users/Branden/Creative%20Cloud%20Files/03-2015%20Cesium%20Test%20Models/CesiumTexturedBoxTest.lxo + + 2015-03-04T16:58:00Z + 2015-03-04T16:58:00Z + Z_UP + + + + Cesium_Logo_Flat.png + + + + + + + + + + + + + Image0001 + A8R8G8B8 + + + + + Image0001-surface + LINEAR_MIPMAP_LINEAR + LINEAR + + + + + + + + + 0.2 0.2 0.2 1 + + + 256 + + + + + + + + + + + -0.5 -0.5 -0.5 -0.5 0.5 -0.5 0.5 0.5 -0.5 0.5 -0.5 -0.5 -0.5 -0.5 0.5 -0.5 0.5 0.5 0.5 -0.5 0.5 0.5 0.5 0.5 + + + + + + + + + + 0 0 1 1 0 0 0 1 0 0 -1 0 -1 0 0 0 0 -1 + + + + + + + + + + 6 1 5 1 6 1.09011e-007 5 1.09011e-007 4 1 5 1 4 1.02033e-008 5 1.02033e-008 2 1 1 1 2 1.02033e-008 1 1.02033e-008 3 1 3 1.02033e-008 0 1 0 1.09011e-007 1 1 1 1.09011e-007 + + + + + + + + + + + + + + +

    4 0 0 6 0 1 5 0 2 7 0 3 5 0 2 6 0 1 7 1 4 6 1 5 2 1 6 3 1 7 2 1 6 6 1 5 5 2 8 7 2 9 1 2 10 2 2 11 1 2 10 7 2 9 6 3 12 4 3 4 3 3 13 0 3 6 3 3 13 4 3 4 4 4 12 5 4 8 0 4 13 1 4 10 0 4 13 5 4 8 0 5 14 1 5 15 3 5 16 2 5 17 3 5 16 1 5 15

    +
    +
    +
    +
    + + + + + + + + + + + + + + + + 0 0 0 + 0 1 0 0 + 1 0 0 0 + 0 0 1 0 + 1 1 1 + + + + + + + +
    diff --git a/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.gltf b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.gltf new file mode 100644 index 000000000000..6c0b53852341 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.gltf @@ -0,0 +1,339 @@ +{ + "accessors": { + "accessor_21": { + "bufferView": "bufferView_29", + "byteOffset": 0, + "byteStride": 0, + "componentType": 5123, + "count": 36, + "type": "SCALAR" + }, + "accessor_23": { + "bufferView": "bufferView_30", + "byteOffset": 0, + "byteStride": 12, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + }, + "accessor_25": { + "bufferView": "bufferView_30", + "byteOffset": 288, + "byteStride": 12, + "componentType": 5126, + "count": 24, + "max": [ + 1, + 1, + 1 + ], + "min": [ + -1, + -1, + -1 + ], + "type": "VEC3" + }, + "accessor_27": { + "bufferView": "bufferView_30", + "byteOffset": 576, + "byteStride": 8, + "componentType": 5126, + "count": 24, + "max": [ + 6, + 1 + ], + "min": [ + 0, + 0 + ], + "type": "VEC2" + } + }, + "animations": {}, + "asset": { + "generator": "collada2gltf@", + "premultipliedAlpha": true, + "profile": { + "api": "WebGL", + "version": "1.0.2" + }, + "version": "1.0" + }, + "bufferViews": { + "bufferView_29": { + "buffer": "CesiumTexturedBoxTest", + "byteLength": 72, + "byteOffset": 0, + "target": 34963 + }, + "bufferView_30": { + "buffer": "CesiumTexturedBoxTest", + "byteLength": 768, + "byteOffset": 72, + "target": 34962 + } + }, + "buffers": { + "CesiumTexturedBoxTest": { + "byteLength": 840, + "type": "arraybuffer", + "uri": "CesiumTexturedBoxTest.bin" + } + }, + "images": { + "Image0001": { + "name": "Image0001", + "uri": "Cesium_Logo_Flat.ktx" + } + }, + "materials": { + "Effect-Texture": { + "name": "Texture", + "technique": "technique0", + "values": { + "diffuse": "texture_Image0001", + "shininess": 256, + "specular": [ + 0.20000000298023224, + 0.20000000298023224, + 0.20000000298023224, + 1 + ] + } + } + }, + "meshes": { + "Geometry-mesh002": { + "name": "Mesh", + "primitives": [ + { + "attributes": { + "NORMAL": "accessor_25", + "POSITION": "accessor_23", + "TEXCOORD_0": "accessor_27" + }, + "indices": "accessor_21", + "material": "Effect-Texture", + "mode": 4 + } + ] + } + }, + "nodes": { + "Geometry-mesh002Node": { + "children": [], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "meshes": [ + "Geometry-mesh002" + ], + "name": "Mesh" + }, + "groupLocator030Node": { + "children": [ + "txtrLocator026Node" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Texture_Group" + }, + "node_3": { + "children": [ + "Geometry-mesh002Node", + "groupLocator030Node" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + -1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Y_UP_Transform" + }, + "txtrLocator026Node": { + "children": [], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Cesium_Logo_Flat__Image___Texture_" + } + }, + "programs": { + "program_0": { + "attributes": [ + "a_normal", + "a_position", + "a_texcoord0" + ], + "fragmentShader": "CesiumTexturedBoxTest0FS", + "vertexShader": "CesiumTexturedBoxTest0VS" + } + }, + "samplers": { + "sampler_0": { + "magFilter": 9729, + "minFilter": 9987, + "wrapS": 10497, + "wrapT": 10497 + } + }, + "scene": "defaultScene", + "scenes": { + "defaultScene": { + "nodes": [ + "node_3" + ] + } + }, + "shaders": { + "CesiumTexturedBoxTest0FS": { + "type": 35632, + "uri": "CesiumTexturedBoxTest0FS.glsl" + }, + "CesiumTexturedBoxTest0VS": { + "type": 35633, + "uri": "CesiumTexturedBoxTest0VS.glsl" + } + }, + "skins": {}, + "techniques": { + "technique0": { + "attributes": { + "a_normal": "normal", + "a_position": "position", + "a_texcoord0": "texcoord0" + }, + "parameters": { + "diffuse": { + "type": 35678 + }, + "modelViewMatrix": { + "semantic": "MODELVIEW", + "type": 35676 + }, + "normal": { + "semantic": "NORMAL", + "type": 35665 + }, + "normalMatrix": { + "semantic": "MODELVIEWINVERSETRANSPOSE", + "type": 35675 + }, + "position": { + "semantic": "POSITION", + "type": 35665 + }, + "projectionMatrix": { + "semantic": "PROJECTION", + "type": 35676 + }, + "shininess": { + "type": 5126 + }, + "specular": { + "type": 35666 + }, + "texcoord0": { + "semantic": "TEXCOORD_0", + "type": 35664 + } + }, + "program": "program_0", + "states": { + "enable": [ + 2929, + 2884 + ] + }, + "uniforms": { + "u_diffuse": "diffuse", + "u_modelViewMatrix": "modelViewMatrix", + "u_normalMatrix": "normalMatrix", + "u_projectionMatrix": "projectionMatrix", + "u_shininess": "shininess", + "u_specular": "specular" + } + } + }, + "textures": { + "texture_Image0001": { + "format": 6408, + "internalFormat": 6408, + "sampler": "sampler_0", + "source": "Image0001", + "target": 3553, + "type": 5121 + } + } +} diff --git a/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest0FS.glsl b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest0FS.glsl new file mode 100644 index 000000000000..782e1f41628c --- /dev/null +++ b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest0FS.glsl @@ -0,0 +1,18 @@ +precision highp float; +varying vec3 v_normal; +varying vec2 v_texcoord0; +uniform sampler2D u_diffuse; +uniform vec4 u_specular; +uniform float u_shininess; +void main(void) { +vec3 normal = normalize(v_normal); +vec4 color = vec4(0., 0., 0., 0.); +vec4 diffuse = vec4(0., 0., 0., 1.); +vec4 specular; +diffuse = texture2D(u_diffuse, v_texcoord0); +specular = u_specular; +diffuse.xyz *= max(dot(normal,vec3(0.,0.,1.)), 0.); +color.xyz += diffuse.xyz; +color = vec4(color.rgb * diffuse.a, diffuse.a); +gl_FragColor = color; +} diff --git a/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest0VS.glsl b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest0VS.glsl new file mode 100644 index 000000000000..cacc9ed997a3 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest0VS.glsl @@ -0,0 +1,15 @@ +precision highp float; +attribute vec3 a_position; +attribute vec3 a_normal; +varying vec3 v_normal; +uniform mat3 u_normalMatrix; +uniform mat4 u_modelViewMatrix; +uniform mat4 u_projectionMatrix; +attribute vec2 a_texcoord0; +varying vec2 v_texcoord0; +void main(void) { +vec4 pos = u_modelViewMatrix * vec4(a_position,1.0); +v_normal = u_normalMatrix * a_normal; +v_texcoord0 = a_texcoord0; +gl_Position = u_projectionMatrix * pos; +} diff --git a/Specs/Data/Models/Box-Textured-KTX/Cesium_Logo_Flat.ktx b/Specs/Data/Models/Box-Textured-KTX/Cesium_Logo_Flat.ktx new file mode 100644 index 0000000000000000000000000000000000000000..c05afa20b6b2e8d74104c64ba1720f7d8c2f4700 GIT binary patch literal 262244 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 YAIvPT{2mlMlK=n!07*qoM6N<$g3Fl*bN~PV literal 0 HcmV?d00001 diff --git a/Specs/Renderer/TextureSpec.js b/Specs/Renderer/TextureSpec.js index 49c70cf5dbd1..22ab8bb90f23 100644 --- a/Specs/Renderer/TextureSpec.js +++ b/Specs/Renderer/TextureSpec.js @@ -4,6 +4,7 @@ defineSuite([ 'Core/Cartesian2', 'Core/Color', 'Core/loadImage', + 'Core/loadKTX', 'Core/PixelFormat', 'Core/PrimitiveType', 'Renderer/Buffer', @@ -25,6 +26,7 @@ defineSuite([ Cartesian2, Color, loadImage, + loadKTX, PixelFormat, PrimitiveType, Buffer, @@ -49,6 +51,10 @@ defineSuite([ var blueAlphaImage; var blueOverRedImage; + var greenDXTImage; + var greenPVRImage; + var greenETC1Image; + var sp; var va; var texture; @@ -69,6 +75,15 @@ defineSuite([ promises.push(loadImage('./Data/Images/BlueOverRed.png').then(function(image) { blueOverRedImage = image; })); + promises.push(loadKTX('./Data/Images/Green4x4DXT1.ktx').then(function(image) { + greenDXTImage = image; + })); + promises.push(loadKTX('./Data/Images/Green4x4PVR.ktx').then(function(image) { + greenPVRImage = image; + })); + promises.push(loadKTX('./Data/Images/Green4x4ETC1.ktx').then(function(image) { + greenETC1Image = image; + })); return when.all(promises); }); @@ -212,6 +227,60 @@ defineSuite([ } }); + it('draws the expected DXT compressed texture color', function() { + if (context.s3tc) { + texture = new Texture({ + context : context, + pixelFormat : greenDXTImage.internalFormat, + source : { + width : greenDXTImage.width, + height : greenDXTImage.height, + arrayBufferView : greenDXTImage.bufferView + } + }); + + var pixels = renderFragment(context); + expect(pixels).toEqual([0, 255, 0, 255]); + } + }); + + it('draws the expected PVR compressed texture color', function() { + if (context.pvrtc) { + texture = new Texture({ + context : context, + pixelFormat : greenPVRImage.internalFormat, + source : { + width : greenPVRImage.width, + height : greenPVRImage.height, + arrayBufferView : greenPVRImage.bufferView + } + }); + + var pixels = renderFragment(context); + expect(pixels).toEqual([0, 255, 0, 255]); + } + }); + + it('draws the expected ETC1 compressed texture color', function() { + if (context.etc1) { + texture = new Texture({ + context : context, + pixelFormat : greenETC1Image.internalFormat, + source : { + width : greenETC1Image.width, + height : greenETC1Image.height, + arrayBufferView : greenETC1Image.bufferView + } + }); + + var pixels = renderFragment(context); + expect(pixels[0]).toEqual(0); + expect(pixels[1]).toBeGreaterThan(250); + expect(pixels[2]).toEqual(0); + expect(pixels[3]).toEqual(255); + } + }); + it('renders with premultiplied alpha', function() { texture = new Texture({ context : context, @@ -639,6 +708,81 @@ defineSuite([ } }); + it('throws when creating compressed texture and the array buffer source is undefined', function() { + expect(function() { + texture = new Texture({ + context : context, + width : 4, + height : 4, + pixelFormat : PixelFormat.RGBA_DXT3 + }); + }).toThrowDeveloperError(); + }); + + it('throws when creating compressed texture when s3tc is unsupported', function() { + if (!context.s3tc) { + expect(function() { + texture = new Texture({ + context : context, + width :greenDXTImage.width, + height : greenDXTImage.height, + pixelFormat : greenDXTImage.internalFormat, + source : { + arrayBufferView : greenDXTImage.bufferView + } + }); + }).toThrowDeveloperError(); + } + }); + + it('throws when creating compressed texture when pvrtc is unsupported', function() { + if (!context.pvrtc) { + expect(function() { + texture = new Texture({ + context : context, + width :greenPVRImage.width, + height : greenPVRImage.height, + pixelFormat : greenPVRImage.internalFormat, + source : { + arrayBufferView : greenPVRImage.bufferView + } + }); + }).toThrowDeveloperError(); + } + }); + + it('throws when creating compressed texture when etc1 is unsupported', function() { + if (!context.etc1) { + expect(function() { + texture = new Texture({ + context : context, + width :greenETC1Image.width, + height : greenETC1Image.height, + pixelFormat : greenETC1Image.internalFormat, + source : { + arrayBufferView : greenETC1Image.bufferView + } + }); + }).toThrowDeveloperError(); + } + }); + + it('throws when creating compressed texture and the array buffer is not the right length', function() { + if (context.s3tc) { + expect(function() { + texture = new Texture({ + context : context, + width :greenDXTImage.width + 1, + height : greenDXTImage.height, + pixelFormat : greenDXTImage.internalFormat, + source : { + arrayBufferView : greenDXTImage.bufferView + } + }); + }).toThrowDeveloperError(); + } + }); + it('throws when creating from the framebuffer with an invalid pixel format', function() { expect(function() { texture = Texture.fromFramebuffer({ @@ -719,6 +863,24 @@ defineSuite([ } }); + it('throws when copying to a texture from the framebuffer with a compressed pixel format', function() { + if (context.s3tc) { + texture = new Texture({ + context : context, + width : greenDXTImage.width, + height : greenDXTImage.height, + pixelFormat : greenDXTImage.internalFormat, + source : { + arrayBufferView : greenDXTImage.bufferView + } + }); + + expect(function() { + texture.copyFromFramebuffer(); + }).toThrowDeveloperError(); + } + }); + it('throws when copying to a texture from the framebuffer with a FLOAT pixel data type', function() { if (context.floatingPointTexture) { texture = new Texture({ @@ -880,6 +1042,25 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('throws when copyFrom is given a source with a compressed pixel format', function() { + if (context.s3tc) { + texture = new Texture({ + context : context, + width : greenDXTImage.width, + height : greenDXTImage.height, + pixelFormat : greenDXTImage.internalFormat, + source : { + arrayBufferView : greenDXTImage.bufferView + } + }); + + var image = new Image(); + expect(function() { + texture.copyFrom(image); + }).toThrowDeveloperError(); + } + }); + it('throws when generating mipmaps with a DEPTH_COMPONENT or DEPTH_STENCIL pixel format', function() { if (context.depthTexture) { texture = new Texture({ @@ -896,6 +1077,24 @@ defineSuite([ } }); + it('throws when generating mipmaps with a compressed pixel format', function() { + if (context.s3tc) { + texture = new Texture({ + context : context, + width : greenDXTImage.width, + height : greenDXTImage.height, + pixelFormat : greenDXTImage.internalFormat, + source : { + arrayBufferView : greenDXTImage.bufferView + } + }); + + expect(function() { + texture.generateMipmap(); + }).toThrowDeveloperError(); + } + }); + it('throws when generating mipmaps with a non-power of two width', function() { texture = new Texture({ context : context, diff --git a/Specs/Scene/ModelSpec.js b/Specs/Scene/ModelSpec.js index b9ebd649193f..859ff6fbdca9 100644 --- a/Specs/Scene/ModelSpec.js +++ b/Specs/Scene/ModelSpec.js @@ -74,6 +74,9 @@ defineSuite([ var boxNoIndicesUrl = './Data/Models/Box-NoIndices/box-noindices.gltf'; var texturedBoxUrl = './Data/Models/Box-Textured/CesiumTexturedBoxTest.gltf'; var texturedBoxSeparateUrl = './Data/Models/Box-Textured-Separate/CesiumTexturedBoxTest.gltf'; + var texturedBoxKTXUrl = './Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.gltf'; + var texturedBoxKTXBinaryUrl = './Data/Models/Box-Textured-KTX-Binary/CesiumTexturedBoxTest.glb'; + var texturedBoxKTXEmbeddedUrl = './Data/Models/Box-Textured-KTX-Embedded/CesiumTexturedBoxTest.gltf'; var texturedBoxCustomUrl = './Data/Models/Box-Textured-Custom/CesiumTexturedBoxTest.gltf'; var texturedBoxKhrBinaryUrl = './Data/Models/Box-Textured-Binary/CesiumTexturedBoxTest.glb'; var boxRtcUrl = './Data/Models/Box-RTC/Box.gltf'; @@ -740,6 +743,27 @@ defineSuite([ }); }); + it('renders textured box with external KTX texture', function() { + return loadModel(texturedBoxKTXUrl).then(function(m) { + verifyRender(m); + primitives.remove(m); + }); + }); + + it('renders textured box with embedded binary KTX texture', function() { + return loadModel(texturedBoxKTXBinaryUrl).then(function(m) { + verifyRender(m); + primitives.remove(m); + }); + }); + + it('renders textured box with embedded base64 encoded KTX texture', function() { + return loadModel(texturedBoxKTXEmbeddedUrl).then(function(m) { + verifyRender(m); + primitives.remove(m); + }); + }); + /////////////////////////////////////////////////////////////////////////// it('loads cesiumAir', function() { diff --git a/server.js b/server.js index 15c1149793ef..2180fb3b4ab8 100644 --- a/server.js +++ b/server.js @@ -40,6 +40,7 @@ var mime = express.static.mime; mime.define({ 'application/json' : ['czml', 'json', 'geojson', 'topojson'], + 'image/ktx' : ['ktx'], 'model/vnd.gltf+json' : ['gltf'], 'model/vnd.gltf.binary' : ['bgltf', 'glb'], 'text/plain' : ['glsl'] diff --git a/web.config b/web.config index 49cd03ab042d..c05fb7a74ea0 100644 --- a/web.config +++ b/web.config @@ -30,6 +30,8 @@ + + From 0b49d0f756b3dd93596768c97533364e557082ca Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Mon, 19 Dec 2016 20:45:13 -0500 Subject: [PATCH 267/396] Added deprecation warning for BATCHID without a prefixed underscore --- Source/Scene/Batched3DModel3DTileContent.js | 15 +++++++++++++-- Specs/Scene/Batched3DModel3DTileContentSpec.js | 10 ++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Source/Scene/Batched3DModel3DTileContent.js b/Source/Scene/Batched3DModel3DTileContent.js index b380e568978f..678e4050b48d 100644 --- a/Source/Scene/Batched3DModel3DTileContent.js +++ b/Source/Scene/Batched3DModel3DTileContent.js @@ -178,11 +178,22 @@ define([ return true; }; + function getBatchIdAttributeName(gltf) { + var batchIdAttributeName = getAttributeOrUniformBySemantic(gltf, '_BATCHID'); + if (!defined(batchIdAttributeName)) { + batchIdAttributeName = getAttributeOrUniformBySemantic(gltf, 'BATCHID'); + if (defined(batchIdAttributeName)) { + deprecationWarning('b3dm-legacy-batchid', 'The glTF in this b3dm uses the semantic `BATCHID`. Application-specific semantics should be prefixed with an underscore: `_BATCHID`.'); + } + } + return batchIdAttributeName; + } + function getVertexShaderCallback(content) { return function(vs) { var batchTable = content.batchTable; var gltf = content._model.gltf; - var batchIdAttributeName = getAttributeOrUniformBySemantic(gltf, 'BATCHID'); + var batchIdAttributeName = getBatchIdAttributeName(gltf); var callback = batchTable.getVertexShaderCallback(true, batchIdAttributeName); return defined(callback) ? callback(vs) : vs; }; @@ -192,7 +203,7 @@ define([ return function(vs) { var batchTable = content.batchTable; var gltf = content._model.gltf; - var batchIdAttributeName = getAttributeOrUniformBySemantic(gltf, 'BATCHID'); + var batchIdAttributeName = getBatchIdAttributeName(gltf); var callback = batchTable.getPickVertexShaderCallback(batchIdAttributeName); return defined(callback) ? callback(vs) : vs; }; diff --git a/Specs/Scene/Batched3DModel3DTileContentSpec.js b/Specs/Scene/Batched3DModel3DTileContentSpec.js index c7e9e5da1a84..182e05286be5 100644 --- a/Specs/Scene/Batched3DModel3DTileContentSpec.js +++ b/Specs/Scene/Batched3DModel3DTileContentSpec.js @@ -2,6 +2,7 @@ defineSuite([ 'Scene/Batched3DModel3DTileContent', 'Core/Cartesian3', + 'Core/deprecationWarning', 'Core/HeadingPitchRange', 'Core/Transforms', 'Specs/Cesium3DTilesTester', @@ -9,6 +10,7 @@ defineSuite([ ], function( Batched3DModel3DTileContent, Cartesian3, + deprecationWarning, HeadingPitchRange, Transforms, Cesium3DTilesTester, @@ -100,6 +102,14 @@ defineSuite([ expect(tile.batchTable.featuresLength).toEqual(1); }); + it('logs deprecation warning for use of BATCHID without prefixed underscore', function() { + var deprecationWarningSpy = jasmine.createSpy(deprecationWarning); + return Cesium3DTilesTester.loadTileset(scene, withBatchTableUrl).then(function(tileset) { + expect(deprecationWarningSpy).toHaveBeenCalled(); + Cesium3DTilesTester.expectRenderTileset(scene, tileset); + }); + }); + it('throws with empty gltf', function() { // Expect to throw DeveloperError in Model due to invalid gltf magic var arrayBuffer = Cesium3DTilesTester.generateBatchedTileBuffer(); From cd3b02adc547304d1cca3a8f881492536f0e7f1a Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Tue, 20 Dec 2016 09:02:00 -0500 Subject: [PATCH 268/396] Move exported function to the top --- Source/Core/loadKTX.js | 100 ++++++++++++++++++++--------------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/Source/Core/loadKTX.js b/Source/Core/loadKTX.js index bed3be598a2c..b62de89cc219 100644 --- a/Source/Core/loadKTX.js +++ b/Source/Core/loadKTX.js @@ -15,6 +15,55 @@ define([ RuntimeError) { 'use strict'; + /** + * Asynchronously loads and parses the given URL to a KTX file or parses the raw binary data of a KTX file. + * Returns a promise that will resolve to an object containing the image buffer, width, height and format once loaded, + * or reject if the URL failed to load or failed to parse the data. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * + * @exports loadKTX + * + * @param {String|Promise.|ArrayBuffer} urlOrBuffer The URL of the binary data, a promise for the URL, or an ArrayBuffer. + * @param {Object} [headers] HTTP headers to send with the requests. + * @returns {Promise.} A promise that will resolve to the requested data when loaded. + * + * + * @example + * // load a single URL asynchronously + * Cesium.loadKTX('some/url').then(function(ktxData) { + * var width = ktxData.width; + * var height = ktxData.height; + * var format = ktxData.internalFormat; + * var arrayBufferView = ktxData.bufferView; + * // use the data to create a texture + * }).otherwise(function(error) { + * // an error occurred + * }); + * + * @see {@link https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/|KTX file format} + * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} + * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A} + */ + function loadKTX(urlOrBuffer, headers) { + //>>includeStart('debug', pragmas.debug); + if (!defined(urlOrBuffer)) { + throw new DeveloperError('urlOrBuffer is required.'); + } + //>>includeEnd('debug'); + + var loadPromise; + if (urlOrBuffer instanceof ArrayBuffer || ArrayBuffer.isView(urlOrBuffer)) { + loadPromise = when.resolve(urlOrBuffer); + } else { + loadPromise = loadArrayBuffer(urlOrBuffer, headers); + } + + return loadPromise.then(function(data) { + return parseKTX(data); + }); + } + var fileIdentifier = [0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A]; var endiannessTest = 0x04030201; @@ -145,54 +194,5 @@ define([ }; } - /** - * Asynchronously loads and parses the given URL to a KTX file or parses the raw binary data of a KTX file. - * Returns a promise that will resolve to an object containing the image buffer, width, height and format once loaded, - * or reject if the URL failed to load or failed to parse the data. The data is loaded - * using XMLHttpRequest, which means that in order to make requests to another origin, - * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. - * - * @exports loadKTX - * - * @param {String|Promise.|ArrayBuffer} urlOrBuffer The URL of the binary data, a promise for the URL, or an ArrayBuffer. - * @param {Object} [headers] HTTP headers to send with the requests. - * @returns {Promise.} A promise that will resolve to the requested data when loaded. - * - * - * @example - * // load a single URL asynchronously - * Cesium.loadKTX('some/url').then(function(ktxData) { - * var width = ktxData.width; - * var height = ktxData.height; - * var format = ktxData.internalFormat; - * var arrayBufferView = ktxData.bufferView; - * // use the data to create a texture - * }).otherwise(function(error) { - * // an error occurred - * }); - * - * @see {@link https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/|KTX file format} - * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} - * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A} - */ - function loadKTX(urlOrBuffer, headers) { - //>>includeStart('debug', pragmas.debug); - if (!defined(urlOrBuffer)) { - throw new DeveloperError('urlOrBuffer is required.'); - } - //>>includeEnd('debug'); - - var loadPromise; - if (urlOrBuffer instanceof ArrayBuffer || ArrayBuffer.isView(urlOrBuffer)) { - loadPromise = when.resolve(urlOrBuffer); - } else { - loadPromise = loadArrayBuffer(urlOrBuffer, headers); - } - - return loadPromise.then(function(data) { - return parseKTX(data); - }); - } - return loadKTX; -}); \ No newline at end of file +}); From 797e43b1151f23bc5663cbf1def6eed8bfd3d359 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Tue, 20 Dec 2016 09:16:52 -0500 Subject: [PATCH 269/396] Style --- Source/Scene/ImageryLayer.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Source/Scene/ImageryLayer.js b/Source/Scene/ImageryLayer.js index 8181ca91774d..df78eb0b21d5 100644 --- a/Source/Scene/ImageryLayer.js +++ b/Source/Scene/ImageryLayer.js @@ -700,6 +700,7 @@ define([ */ ImageryLayer.prototype._createTexture = function(context, imagery) { var imageryProvider = this._imageryProvider; + var image = imagery.image; // If this imagery provider has a discard policy, use it to check if this // image should be discarded. @@ -714,7 +715,7 @@ define([ } // Mark discarded imagery tiles invalid. Parent imagery will be used instead. - if (discardPolicy.shouldDiscardImage(imagery.image)) { + if (discardPolicy.shouldDiscardImage(image)) { imagery.state = ImageryState.INVALID; return; } @@ -723,20 +724,20 @@ define([ // Imagery does not need to be discarded, so upload it to WebGL. var texture; - if (defined(imagery.image.internalFormat)) { + if (defined(image.internalFormat)) { texture = new Texture({ context : context, - pixelFormat : imagery.image.internalFormat, - width : imagery.image.width, - height : imagery.image.height, + pixelFormat : image.internalFormat, + width : image.width, + height : image.height, source : { - arrayBufferView : imagery.image.bufferView + arrayBufferView : image.bufferView } }); } else { texture = new Texture({ context : context, - source : imagery.image, + source : image, pixelFormat : imageryProvider.hasAlphaChannel ? PixelFormat.RGBA : PixelFormat.RGB }); } From a9fc4f98806677c5a82ecae42d26c830daa6e0ed Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Tue, 20 Dec 2016 09:21:29 -0500 Subject: [PATCH 270/396] Update CHANGES.md --- CHANGES.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index de74928178c5..ec47d29a4519 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,13 @@ Change Log ========== +### TODO + +* Added compressed texture support. + * glTF models and imagery layers can now reference [KTX](https://www.khronos.org/opengles/sdk/tools/KTX/) textures. + * Added `loadKTX` to load KTX textures. + * Added new `PixelFormat` and `WebGLConstants` enums from WebGL extensions `WEBGL_compressed_s3tc`, `WEBGL_compressed_texture_pvrtc`, and `WEBGL_compressed_texture_etc1`. [#4758](https://github.com/AnalyticalGraphicsInc/cesium/pull/4758) + ### 1.29 - 2017-01-02 * Improved 3D Models @@ -19,7 +26,6 @@ Change Log * Added `divideComponents` function to `Cartesian2`, `Cartesian3`, and `Cartesian4`. [#4750](https://github.com/AnalyticalGraphicsInc/cesium/pull/4750) * Added `WebGLConstants` enum. Previously, this was part of the private Renderer API. [#4731](https://github.com/AnalyticalGraphicsInc/cesium/pull/4731) * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) -* Added compressed texture support. The supported extensions are `WEBGL_compressed_s3tc`, `WEBGL_compressed_texture_pvrtc`, and `WEBGL_compressed_texture_etc1`. [#4758](https://github.com/AnalyticalGraphicsInc/cesium/pull/4758) ### 1.28 - 2016-12-01 From 43ca55b3693ee1b20fc731813d427a9e8040b758 Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Tue, 20 Dec 2016 11:55:45 -0500 Subject: [PATCH 271/396] Moved Pass from Scene to Renderer --- Source/Renderer/ComputeCommand.js | 2 +- Source/{Scene => Renderer}/Pass.js | 0 Source/Scene/BillboardCollection.js | 4 ++-- Source/Scene/DepthPlane.js | 4 ++-- Source/Scene/EllipsoidPrimitive.js | 4 ++-- Source/Scene/FrustumCommands.js | 2 +- Source/Scene/GlobeSurfaceTileProvider.js | 4 ++-- Source/Scene/GroundPrimitive.js | 4 ++-- Source/Scene/Model.js | 4 ++-- Source/Scene/PointPrimitiveCollection.js | 4 ++-- Source/Scene/PolylineCollection.js | 4 ++-- Source/Scene/Primitive.js | 4 ++-- Source/Scene/Scene.js | 4 ++-- Source/Scene/ShadowMap.js | 4 ++-- Source/Scene/ViewportQuad.js | 8 ++++---- 15 files changed, 28 insertions(+), 28 deletions(-) rename Source/{Scene => Renderer}/Pass.js (100%) diff --git a/Source/Renderer/ComputeCommand.js b/Source/Renderer/ComputeCommand.js index 2e7678276f76..8d0231c673bc 100644 --- a/Source/Renderer/ComputeCommand.js +++ b/Source/Renderer/ComputeCommand.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/defaultValue', - '../Scene/Pass' + './Pass' ], function( defaultValue, Pass) { diff --git a/Source/Scene/Pass.js b/Source/Renderer/Pass.js similarity index 100% rename from Source/Scene/Pass.js rename to Source/Renderer/Pass.js diff --git a/Source/Scene/BillboardCollection.js b/Source/Scene/BillboardCollection.js index 0e29e5d9af74..f20fb3afc4af 100644 --- a/Source/Scene/BillboardCollection.js +++ b/Source/Scene/BillboardCollection.js @@ -19,6 +19,7 @@ define([ '../Renderer/Buffer', '../Renderer/BufferUsage', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/ShaderProgram', '../Renderer/ShaderSource', @@ -29,7 +30,6 @@ define([ './BlendingState', './HeightReference', './HorizontalOrigin', - './Pass', './SceneMode', './TextureAtlas', './VerticalOrigin' @@ -53,6 +53,7 @@ define([ Buffer, BufferUsage, DrawCommand, + Pass, RenderState, ShaderProgram, ShaderSource, @@ -63,7 +64,6 @@ define([ BlendingState, HeightReference, HorizontalOrigin, - Pass, SceneMode, TextureAtlas, VerticalOrigin) { diff --git a/Source/Scene/DepthPlane.js b/Source/Scene/DepthPlane.js index 71f81e70d14f..78e5808e05b1 100644 --- a/Source/Scene/DepthPlane.js +++ b/Source/Scene/DepthPlane.js @@ -10,13 +10,13 @@ define([ '../Core/PrimitiveType', '../Renderer/BufferUsage', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/ShaderProgram', '../Renderer/VertexArray', '../Shaders/DepthPlaneFS', '../Shaders/DepthPlaneVS', './DepthFunction', - './Pass', './SceneMode' ], function( BoundingSphere, @@ -29,13 +29,13 @@ define([ PrimitiveType, BufferUsage, DrawCommand, + Pass, RenderState, ShaderProgram, VertexArray, DepthPlaneFS, DepthPlaneVS, DepthFunction, - Pass, SceneMode) { 'use strict'; diff --git a/Source/Scene/EllipsoidPrimitive.js b/Source/Scene/EllipsoidPrimitive.js index 732d41f74d33..2bdab578c846 100644 --- a/Source/Scene/EllipsoidPrimitive.js +++ b/Source/Scene/EllipsoidPrimitive.js @@ -12,6 +12,7 @@ define([ '../Core/VertexFormat', '../Renderer/BufferUsage', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/ShaderProgram', '../Renderer/ShaderSource', @@ -21,7 +22,6 @@ define([ './BlendingState', './CullFace', './Material', - './Pass', './SceneMode' ], function( BoundingSphere, @@ -36,6 +36,7 @@ define([ VertexFormat, BufferUsage, DrawCommand, + Pass, RenderState, ShaderProgram, ShaderSource, @@ -45,7 +46,6 @@ define([ BlendingState, CullFace, Material, - Pass, SceneMode) { 'use strict'; diff --git a/Source/Scene/FrustumCommands.js b/Source/Scene/FrustumCommands.js index 2d33d09d338a..fe5828910791 100644 --- a/Source/Scene/FrustumCommands.js +++ b/Source/Scene/FrustumCommands.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/defaultValue', - './Pass' + '../Renderer/Pass' ], function( defaultValue, Pass) { diff --git a/Source/Scene/GlobeSurfaceTileProvider.js b/Source/Scene/GlobeSurfaceTileProvider.js index 20f3a40ecb2f..54bf1c306e0a 100644 --- a/Source/Scene/GlobeSurfaceTileProvider.js +++ b/Source/Scene/GlobeSurfaceTileProvider.js @@ -30,11 +30,11 @@ define([ '../Renderer/BufferUsage', '../Renderer/ContextLimits', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/VertexArray', '../Scene/BlendingState', '../Scene/DepthFunction', - '../Scene/Pass', '../Scene/PerInstanceColorAppearance', '../Scene/Primitive', './GlobeSurfaceTile', @@ -73,11 +73,11 @@ define([ BufferUsage, ContextLimits, DrawCommand, + Pass, RenderState, VertexArray, BlendingState, DepthFunction, - Pass, PerInstanceColorAppearance, Primitive, GlobeSurfaceTile, diff --git a/Source/Scene/GroundPrimitive.js b/Source/Scene/GroundPrimitive.js index cfcea5ec94e3..9939662eea12 100644 --- a/Source/Scene/GroundPrimitive.js +++ b/Source/Scene/GroundPrimitive.js @@ -20,6 +20,7 @@ define([ '../Core/OrientedBoundingBox', '../Core/Rectangle', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/ShaderProgram', '../Renderer/ShaderSource', @@ -28,7 +29,6 @@ define([ '../ThirdParty/when', './BlendingState', './DepthFunction', - './Pass', './PerInstanceColorAppearance', './Primitive', './SceneMode', @@ -55,6 +55,7 @@ define([ OrientedBoundingBox, Rectangle, DrawCommand, + Pass, RenderState, ShaderProgram, ShaderSource, @@ -63,7 +64,6 @@ define([ when, BlendingState, DepthFunction, - Pass, PerInstanceColorAppearance, Primitive, SceneMode, diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 7a2ca8bd8811..0447bbf29ec1 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -37,6 +37,7 @@ define([ '../Renderer/Buffer', '../Renderer/BufferUsage', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/Sampler', '../Renderer/ShaderProgram', @@ -59,7 +60,6 @@ define([ './modelMaterialsCommon', './ModelMesh', './ModelNode', - './Pass', './SceneMode', './ShadowMode' ], function( @@ -100,6 +100,7 @@ define([ Buffer, BufferUsage, DrawCommand, + Pass, RenderState, Sampler, ShaderProgram, @@ -122,7 +123,6 @@ define([ modelMaterialsCommon, ModelMesh, ModelNode, - Pass, SceneMode, ShadowMode) { 'use strict'; diff --git a/Source/Scene/PointPrimitiveCollection.js b/Source/Scene/PointPrimitiveCollection.js index 78820c715716..52f0b5f42a80 100644 --- a/Source/Scene/PointPrimitiveCollection.js +++ b/Source/Scene/PointPrimitiveCollection.js @@ -16,6 +16,7 @@ define([ '../Renderer/BufferUsage', '../Renderer/ContextLimits', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/ShaderProgram', '../Renderer/ShaderSource', @@ -23,7 +24,6 @@ define([ '../Shaders/PointPrimitiveCollectionFS', '../Shaders/PointPrimitiveCollectionVS', './BlendingState', - './Pass', './PointPrimitive', './SceneMode' ], function( @@ -43,6 +43,7 @@ define([ BufferUsage, ContextLimits, DrawCommand, + Pass, RenderState, ShaderProgram, ShaderSource, @@ -50,7 +51,6 @@ define([ PointPrimitiveCollectionFS, PointPrimitiveCollectionVS, BlendingState, - Pass, PointPrimitive, SceneMode) { 'use strict'; diff --git a/Source/Scene/PolylineCollection.js b/Source/Scene/PolylineCollection.js index 3e24d43528c3..4d491863be01 100644 --- a/Source/Scene/PolylineCollection.js +++ b/Source/Scene/PolylineCollection.js @@ -23,6 +23,7 @@ define([ '../Renderer/BufferUsage', '../Renderer/ContextLimits', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/ShaderProgram', '../Renderer/ShaderSource', @@ -33,7 +34,6 @@ define([ './BatchTable', './BlendingState', './Material', - './Pass', './Polyline', './SceneMode' ], function( @@ -60,6 +60,7 @@ define([ BufferUsage, ContextLimits, DrawCommand, + Pass, RenderState, ShaderProgram, ShaderSource, @@ -70,7 +71,6 @@ define([ BatchTable, BlendingState, Material, - Pass, Polyline, SceneMode) { 'use strict'; diff --git a/Source/Scene/Primitive.js b/Source/Scene/Primitive.js index dd05d4749feb..23b812e41b38 100644 --- a/Source/Scene/Primitive.js +++ b/Source/Scene/Primitive.js @@ -27,6 +27,7 @@ define([ '../Renderer/BufferUsage', '../Renderer/ContextLimits', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/ShaderProgram', '../Renderer/ShaderSource', @@ -34,7 +35,6 @@ define([ '../ThirdParty/when', './BatchTable', './CullFace', - './Pass', './PrimitivePipeline', './PrimitiveState', './SceneMode', @@ -67,6 +67,7 @@ define([ BufferUsage, ContextLimits, DrawCommand, + Pass, RenderState, ShaderProgram, ShaderSource, @@ -74,7 +75,6 @@ define([ when, BatchTable, CullFace, - Pass, PrimitivePipeline, PrimitiveState, SceneMode, diff --git a/Source/Scene/Scene.js b/Source/Scene/Scene.js index e8e5840d0464..221e9d5869dd 100644 --- a/Source/Scene/Scene.js +++ b/Source/Scene/Scene.js @@ -35,6 +35,7 @@ define([ '../Renderer/Context', '../Renderer/ContextLimits', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/PassState', '../Renderer/ShaderProgram', '../Renderer/ShaderSource', @@ -51,7 +52,6 @@ define([ './MapMode2D', './OIT', './OrthographicFrustum', - './Pass', './PerformanceDisplay', './PerInstanceColorAppearance', './PerspectiveFrustum', @@ -102,6 +102,7 @@ define([ Context, ContextLimits, DrawCommand, + Pass, PassState, ShaderProgram, ShaderSource, @@ -118,7 +119,6 @@ define([ MapMode2D, OIT, OrthographicFrustum, - Pass, PerformanceDisplay, PerInstanceColorAppearance, PerspectiveFrustum, diff --git a/Source/Scene/ShadowMap.js b/Source/Scene/ShadowMap.js index 594bc3346381..cce66085ebdb 100644 --- a/Source/Scene/ShadowMap.js +++ b/Source/Scene/ShadowMap.js @@ -30,6 +30,7 @@ define([ '../Renderer/CubeMap', '../Renderer/DrawCommand', '../Renderer/Framebuffer', + '../Renderer/Pass', '../Renderer/PassState', '../Renderer/PixelDatatype', '../Renderer/Renderbuffer', @@ -46,7 +47,6 @@ define([ './CullingVolume', './DebugCameraPrimitive', './OrthographicFrustum', - './Pass', './PerInstanceColorAppearance', './PerspectiveFrustum', './Primitive', @@ -82,6 +82,7 @@ define([ CubeMap, DrawCommand, Framebuffer, + Pass, PassState, PixelDatatype, Renderbuffer, @@ -98,7 +99,6 @@ define([ CullingVolume, DebugCameraPrimitive, OrthographicFrustum, - Pass, PerInstanceColorAppearance, PerspectiveFrustum, Primitive, diff --git a/Source/Scene/ViewportQuad.js b/Source/Scene/ViewportQuad.js index 5d26694eb94b..b8dbeb2269f9 100644 --- a/Source/Scene/ViewportQuad.js +++ b/Source/Scene/ViewportQuad.js @@ -5,24 +5,24 @@ define([ '../Core/defined', '../Core/destroyObject', '../Core/DeveloperError', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/ShaderSource', '../Shaders/ViewportQuadFS', './BlendingState', - './Material', - './Pass' + './Material' ], function( BoundingRectangle, Color, defined, destroyObject, DeveloperError, + Pass, RenderState, ShaderSource, ViewportQuadFS, BlendingState, - Material, - Pass) { + Material) { 'use strict'; /** From 5d54b800ff9fe670ae7c5c1baadb3a054a9a85c4 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Tue, 20 Dec 2016 11:56:44 -0500 Subject: [PATCH 272/396] Add demo of "offline" Cesium usage. --- Apps/Sandcastle/gallery/Offline.html | 52 +++++++++++++++++++++++++++ Apps/Sandcastle/gallery/Offline.jpg | Bin 0 -> 11231 bytes 2 files changed, 52 insertions(+) create mode 100644 Apps/Sandcastle/gallery/Offline.html create mode 100644 Apps/Sandcastle/gallery/Offline.jpg diff --git a/Apps/Sandcastle/gallery/Offline.html b/Apps/Sandcastle/gallery/Offline.html new file mode 100644 index 000000000000..36d02c454644 --- /dev/null +++ b/Apps/Sandcastle/gallery/Offline.html @@ -0,0 +1,52 @@ + + + + + + + + + Cesium Demo + + + + + + +
    +

    Loading...

    +
    + + + diff --git a/Apps/Sandcastle/gallery/Offline.jpg b/Apps/Sandcastle/gallery/Offline.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ab0c0b70bc20aed3991e9806adb943eba2abfe4 GIT binary patch literal 11231 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 C2D4HC literal 0 HcmV?d00001 From 8ff63f706a0e87e8cfcbe3750ca496a120042669 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Tue, 20 Dec 2016 11:57:00 -0500 Subject: [PATCH 273/396] Context stencil fix --- Specs/Scene/SceneSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Specs/Scene/SceneSpec.js b/Specs/Scene/SceneSpec.js index 151b77c3c8b2..a4729f3cb711 100644 --- a/Specs/Scene/SceneSpec.js +++ b/Specs/Scene/SceneSpec.js @@ -117,7 +117,7 @@ defineSuite([ var contextAttributes = scene.context._gl.getContextAttributes(); // Do not check depth and antialias since they are requests not requirements expect(contextAttributes.alpha).toEqual(false); - expect(contextAttributes.stencil).toEqual(false); + expect(contextAttributes.stencil).toEqual(true); expect(contextAttributes.premultipliedAlpha).toEqual(true); expect(contextAttributes.preserveDrawingBuffer).toEqual(false); }); From 4c0189243fc082322d596780cf27d55d836cb894 Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Tue, 20 Dec 2016 12:19:26 -0500 Subject: [PATCH 274/396] Attempting to fix broken build --- Source/Core/WebGLConstants.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/WebGLConstants.js b/Source/Core/WebGLConstants.js index 0281f4c0dff9..7d053d8275be 100644 --- a/Source/Core/WebGLConstants.js +++ b/Source/Core/WebGLConstants.js @@ -1,6 +1,6 @@ /*global define*/ define([ - '../Core/freezeObject' + './freezeObject' ], function( freezeObject) { 'use strict'; From 6cd33aea74c48d4b7dfc245e11777ee677c2334f Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Tue, 20 Dec 2016 12:34:53 -0500 Subject: [PATCH 275/396] Fixed pathing for specs --- Specs/Renderer/AutomaticUniformSpec.js | 4 ++-- Specs/Renderer/DrawCommandSpec.js | 6 +++--- Specs/Scene/FrustumCommandsSpec.js | 8 ++++---- Specs/Scene/GroundPrimitiveSpec.js | 6 +++--- Specs/Scene/ModelSpec.js | 4 ++-- Specs/Scene/MultifrustumSpec.js | 4 ++-- Specs/Scene/SceneSpec.js | 4 ++-- Specs/pick.js | 8 ++++---- Specs/render.js | 2 +- 9 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Specs/Renderer/AutomaticUniformSpec.js b/Specs/Renderer/AutomaticUniformSpec.js index b00f04ae2779..8e4c5010ee30 100644 --- a/Specs/Renderer/AutomaticUniformSpec.js +++ b/Specs/Renderer/AutomaticUniformSpec.js @@ -4,9 +4,9 @@ defineSuite([ 'Core/Cartesian3', 'Core/defaultValue', 'Core/Matrix4', + 'Renderer/Pass', 'Renderer/Texture', 'Scene/OrthographicFrustum', - 'Scene/Pass', 'Scene/SceneMode', 'Specs/createCamera', 'Specs/createContext', @@ -16,9 +16,9 @@ defineSuite([ Cartesian3, defaultValue, Matrix4, + Pass, Texture, OrthographicFrustum, - Pass, SceneMode, createCamera, createContext, diff --git a/Specs/Renderer/DrawCommandSpec.js b/Specs/Renderer/DrawCommandSpec.js index b15ff6c9b772..a066f2cf8e06 100644 --- a/Specs/Renderer/DrawCommandSpec.js +++ b/Specs/Renderer/DrawCommandSpec.js @@ -1,11 +1,11 @@ /*global defineSuite*/ defineSuite([ - 'Renderer/DrawCommand', 'Core/PrimitiveType', - 'Scene/Pass' + 'Renderer/DrawCommand', + 'Renderer/Pass' ], function( - DrawCommand, PrimitiveType, + DrawCommand, Pass) { 'use strict'; diff --git a/Specs/Scene/FrustumCommandsSpec.js b/Specs/Scene/FrustumCommandsSpec.js index 57bc636a5a0b..e3f5a7eb9afe 100644 --- a/Specs/Scene/FrustumCommandsSpec.js +++ b/Specs/Scene/FrustumCommandsSpec.js @@ -1,10 +1,10 @@ /*global defineSuite*/ defineSuite([ - 'Scene/FrustumCommands', - 'Scene/Pass' + 'Renderer/Pass', + 'Scene/FrustumCommands' ], function( - FrustumCommands, - Pass) { + Pass, + FrustumCommands) { 'use strict'; it('constructs without arguments', function() { diff --git a/Specs/Scene/GroundPrimitiveSpec.js b/Specs/Scene/GroundPrimitiveSpec.js index a64916d714dc..4b46d3a7a17a 100644 --- a/Specs/Scene/GroundPrimitiveSpec.js +++ b/Specs/Scene/GroundPrimitiveSpec.js @@ -1,6 +1,5 @@ /*global defineSuite*/ defineSuite([ - 'Scene/GroundPrimitive', 'Core/Color', 'Core/ColorGeometryInstanceAttribute', 'Core/destroyObject', @@ -13,13 +12,13 @@ defineSuite([ 'Core/Rectangle', 'Core/RectangleGeometry', 'Core/ShowGeometryInstanceAttribute', - 'Scene/Pass', + 'Renderer/Pass', + 'Scene/GroundPrimitive', 'Scene/PerInstanceColorAppearance', 'Scene/Primitive', 'Specs/createScene', 'Specs/pollToPromise' ], function( - GroundPrimitive, Color, ColorGeometryInstanceAttribute, destroyObject, @@ -33,6 +32,7 @@ defineSuite([ RectangleGeometry, ShowGeometryInstanceAttribute, Pass, + GroundPrimitive, PerInstanceColorAppearance, Primitive, createScene, diff --git a/Specs/Scene/ModelSpec.js b/Specs/Scene/ModelSpec.js index b9ebd649193f..c9908b0fa5c3 100644 --- a/Specs/Scene/ModelSpec.js +++ b/Specs/Scene/ModelSpec.js @@ -24,11 +24,11 @@ defineSuite([ 'Core/PrimitiveType', 'Core/Transforms', 'Core/WebGLConstants', + 'Renderer/Pass', 'Renderer/RenderState', 'Renderer/ShaderSource', 'Scene/ColorBlendMode', 'Scene/HeightReference', - 'Scene/Pass', 'Scene/ModelAnimationLoop', 'Specs/createScene', 'Specs/pollToPromise', @@ -58,11 +58,11 @@ defineSuite([ PrimitiveType, Transforms, WebGLConstants, + Pass, RenderState, ShaderSource, ColorBlendMode, HeightReference, - Pass, ModelAnimationLoop, createScene, pollToPromise, diff --git a/Specs/Scene/MultifrustumSpec.js b/Specs/Scene/MultifrustumSpec.js index 7b0ff8a8f5c9..dfa07c5481fc 100644 --- a/Specs/Scene/MultifrustumSpec.js +++ b/Specs/Scene/MultifrustumSpec.js @@ -14,6 +14,7 @@ defineSuite([ 'Core/Matrix4', 'Renderer/BufferUsage', 'Renderer/DrawCommand', + 'Renderer/Pass', 'Renderer/RenderState', 'Renderer/Sampler', 'Renderer/ShaderProgram', @@ -22,7 +23,6 @@ defineSuite([ 'Renderer/VertexArray', 'Scene/BillboardCollection', 'Scene/BlendingState', - 'Scene/Pass', 'Scene/TextureAtlas', 'Specs/createScene', 'ThirdParty/when' @@ -41,6 +41,7 @@ defineSuite([ Matrix4, BufferUsage, DrawCommand, + Pass, RenderState, Sampler, ShaderProgram, @@ -49,7 +50,6 @@ defineSuite([ VertexArray, BillboardCollection, BlendingState, - Pass, TextureAtlas, createScene, when) { diff --git a/Specs/Scene/SceneSpec.js b/Specs/Scene/SceneSpec.js index a4729f3cb711..b18de90eb279 100644 --- a/Specs/Scene/SceneSpec.js +++ b/Specs/Scene/SceneSpec.js @@ -16,6 +16,7 @@ defineSuite([ 'Core/WebMercatorProjection', 'Renderer/DrawCommand', 'Renderer/Framebuffer', + 'Renderer/Pass', 'Renderer/PixelDatatype', 'Renderer/ShaderProgram', 'Renderer/Texture', @@ -23,7 +24,6 @@ defineSuite([ 'Scene/EllipsoidSurfaceAppearance', 'Scene/FrameState', 'Scene/Globe', - 'Scene/Pass', 'Scene/Primitive', 'Scene/PrimitiveCollection', 'Scene/Scene', @@ -51,6 +51,7 @@ defineSuite([ WebMercatorProjection, DrawCommand, Framebuffer, + Pass, PixelDatatype, ShaderProgram, Texture, @@ -58,7 +59,6 @@ defineSuite([ EllipsoidSurfaceAppearance, FrameState, Globe, - Pass, Primitive, PrimitiveCollection, Scene, diff --git a/Specs/pick.js b/Specs/pick.js index 061d47dde3d4..3af52acd40bd 100644 --- a/Specs/pick.js +++ b/Specs/pick.js @@ -4,17 +4,17 @@ define([ 'Core/Color', 'Core/defined', 'Renderer/ClearCommand', + 'Renderer/Pass', 'Scene/CreditDisplay', - 'Scene/FrameState', - 'Scene/Pass' + 'Scene/FrameState' ], function( BoundingRectangle, Color, defined, ClearCommand, + Pass, CreditDisplay, - FrameState, - Pass) { + FrameState) { 'use strict'; function executeCommands(context, passState, commands) { diff --git a/Specs/render.js b/Specs/render.js index ed2caf3d0346..d239ed626176 100644 --- a/Specs/render.js +++ b/Specs/render.js @@ -2,7 +2,7 @@ define([ 'Core/defined', 'Core/Intersect', - 'Scene/Pass', + 'Renderer/Pass', 'Scene/SceneMode' ], function( defined, From ca727049beea9fcd744059e70f5760ea62477a0d Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Tue, 20 Dec 2016 16:45:07 -0500 Subject: [PATCH 276/396] Fix failing tests. --- Source/Renderer/Context.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Renderer/Context.js b/Source/Renderer/Context.js index 634b56d51385..d60df36489a2 100644 --- a/Source/Renderer/Context.js +++ b/Source/Renderer/Context.js @@ -271,7 +271,8 @@ define([ this._depthTexture = !!getExtension(gl, ['WEBGL_depth_texture', 'WEBKIT_WEBGL_depth_texture']); this._textureFloat = !!getExtension(gl, ['OES_texture_float']); this._fragDepth = !!getExtension(gl, ['EXT_frag_depth']); - this._debugShaders = !!getExtension(gl, ['WEBGL_debug_shaders']); + this._debugShaders = getExtension(gl, ['WEBGL_debug_shaders']); + this._s3tc = !!getExtension(gl, ['WEBGL_compressed_s3tc', 'MOZ_WEBGL_compressed_texture_s3tc', 'WEBKIT_WEBGL_compressed_texture_s3tc']); this._pvrtc = !!getExtension(gl, ['WEBGL_compressed_texture_pvrtc', 'WEBKIT_WEBGL_compressed_texture_pvrtc']); this._etc1 = !!getExtension(gl, ['WEBGL_compressed_texture_etc1']); From 64dd9b45cca0540b5b1d681bb49828a2eb57ae55 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Wed, 21 Dec 2016 14:18:42 -0500 Subject: [PATCH 277/396] Add ktx loading support to materials. Update Sandcastle and tests. --- Apps/Sandcastle/gallery/Materials.html | 30 +++++++++++++++++ Apps/Sandcastle/images/LogoDXT1.ktx | Bin 0 -> 32836 bytes Apps/Sandcastle/images/LogoETC1.ktx | Bin 0 -> 32868 bytes Apps/Sandcastle/images/LogoPVR.ktx | Bin 0 -> 16484 bytes Source/Scene/Material.js | 44 ++++++++++++++++++++----- Specs/Scene/MaterialSpec.js | 27 +++++++++++++++ 6 files changed, 92 insertions(+), 9 deletions(-) create mode 100644 Apps/Sandcastle/images/LogoDXT1.ktx create mode 100644 Apps/Sandcastle/images/LogoETC1.ktx create mode 100644 Apps/Sandcastle/images/LogoPVR.ktx diff --git a/Apps/Sandcastle/gallery/Materials.html b/Apps/Sandcastle/gallery/Materials.html index 4837b977d00f..ef0f13c94f12 100644 --- a/Apps/Sandcastle/gallery/Materials.html +++ b/Apps/Sandcastle/gallery/Materials.html @@ -202,6 +202,29 @@ }); } +function applyCompressedTextureMaterial(primitive, scene) { + Sandcastle.declare(applyCompressedTextureMaterial); // For highlighting in Sandcastle. + + var compressedImageUrl; + var context = scene.context; + if (context.s3tc) { + compressedImageUrl = '../images/LogoDXT1.ktx'; + } else if (context.etc1) { + compressedImageUrl = '../images/LogoETC1.ktx'; + } else if (context.pvrtc) { + compressedImageUrl = '../images/LogoPVR.ktx'; + } + + primitive.appearance.material = new Cesium.Material({ + fabric : { + type : 'Image', + uniforms : { + image : compressedImageUrl + } + } + }); +} + function applyNormalMapMaterial(primitive, scene) { Sandcastle.declare(applyNormalMapMaterial); // For highlighting in Sandcastle. primitive.appearance.material = new Cesium.Material({ @@ -310,6 +333,13 @@ applyImageMaterial(rectangle, scene); Sandcastle.highlight(applyImageMaterial); } + }, { + text : 'Compressed Image', + onselect : function() { + toggleRectangleVisibility(); + applyCompressedTextureMaterial(rectangle, scene); + Sandcastle.highlight(applyCompressedTextureMaterial); + } }]); Sandcastle.addToolbarMenu([{ diff --git a/Apps/Sandcastle/images/LogoDXT1.ktx b/Apps/Sandcastle/images/LogoDXT1.ktx new file mode 100644 index 0000000000000000000000000000000000000000..73598d1c8d302b976d6bd3c79f82f8b075cc93e0 GIT binary patch literal 32836 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 JK3>n?{2!TN$5{XX literal 0 HcmV?d00001 diff --git a/Apps/Sandcastle/images/LogoETC1.ktx b/Apps/Sandcastle/images/LogoETC1.ktx new file mode 100644 index 0000000000000000000000000000000000000000..9d8b88d7f541961dc4cc91f5f7e52bddd3c2aa7d GIT binary patch literal 32868 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 literal 0 HcmV?d00001 diff --git a/Source/Scene/Material.js b/Source/Scene/Material.js index 1d488b034809..18596e6d8825 100644 --- a/Source/Scene/Material.js +++ b/Source/Scene/Material.js @@ -12,6 +12,7 @@ define([ '../Core/DeveloperError', '../Core/isArray', '../Core/loadImage', + '../Core/loadKTX', '../Core/Matrix2', '../Core/Matrix3', '../Core/Matrix4', @@ -43,6 +44,7 @@ define([ DeveloperError, isArray, loadImage, + loadKTX, Matrix2, Matrix3, Matrix4, @@ -413,10 +415,23 @@ define([ uniformId = loadedImage.id; var image = loadedImage.image; - var texture = new Texture({ - context : context, - source : image - }); + var texture; + if (defined(image.internalFormat)) { + texture = new Texture({ + context : context, + pixelFormat : image.internalFormat, + width : image.width, + height : image.height, + source : { + arrayBufferView : image.bufferView + } + }); + } else { + texture = new Texture({ + context : context, + source : image + }); + } this._textures[uniformId] = texture; @@ -663,6 +678,8 @@ define([ 'mat4' : Matrix4 }; + var ktxRegex = /\.ktx$/i; + function createTexture2DUpdateFunction(uniformId) { var oldUniformValue; return function(material, context) { @@ -741,12 +758,21 @@ define([ if (uniformValue !== material._texturePaths[uniformId]) { if (typeof uniformValue === 'string') { - when(loadImage(uniformValue), function(image) { - material._loadedImages.push({ - id : uniformId, - image : image + if (ktxRegex.test(uniformValue)) { + when(loadKTX(uniformValue), function(image) { + material._loadedImages.push({ + id : uniformId, + image : image + }); }); - }); + } else { + when(loadImage(uniformValue), function(image) { + material._loadedImages.push({ + id : uniformId, + image : image + }); + }); + } } else if (uniformValue instanceof HTMLCanvasElement) { material._loadedImages.push({ id : uniformId, diff --git a/Specs/Scene/MaterialSpec.js b/Specs/Scene/MaterialSpec.js index 0be40157f399..e7d2a13d1861 100644 --- a/Specs/Scene/MaterialSpec.js +++ b/Specs/Scene/MaterialSpec.js @@ -6,8 +6,10 @@ defineSuite([ 'Core/defaultValue', 'Core/Ellipsoid', 'Core/GeometryInstance', + 'Core/loadImage', 'Core/Rectangle', 'Core/RectangleGeometry', + 'Renderer/Texture', 'Scene/MaterialAppearance', 'Scene/PolylineCollection', 'Scene/Primitive', @@ -20,8 +22,10 @@ defineSuite([ defaultValue, Ellipsoid, GeometryInstance, + loadImage, Rectangle, RectangleGeometry, + Texture, MaterialAppearance, PolylineCollection, Primitive, @@ -344,6 +348,29 @@ defineSuite([ renderMaterial(material); }); + it('creates a material with an compressed image uniform', function () { + var compressedUrl; + var context = scene.context; + if (context.s3tc) { + compressedUrl = './Data/Images/Green4x4DXT1.ktx'; + } else if (context.etc1) { + compressedUrl = './Data/Images/Green4x4ETC1.ktx'; + } else if (context.pvrtc) { + compressedUrl = './Data/Images/Green4x4PVR.ktx'; + } + + var material = new Material({ + strict : true, + fabric : { + type : 'DiffuseMap', + uniforms : { + image : compressedUrl + } + } + }); + renderMaterial(material); + }); + it('creates a material with a cube map uniform', function() { var material = new Material({ strict : true, From da6d1c61cec5804b6dc79fba680866956239cdf8 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Wed, 21 Dec 2016 14:48:18 -0500 Subject: [PATCH 278/396] Document type returned from loadKTX and doc unsupported features of the file format. --- Source/Core/loadKTX.js | 97 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 86 insertions(+), 11 deletions(-) diff --git a/Source/Core/loadKTX.js b/Source/Core/loadKTX.js index b62de89cc219..6ffd90885cb2 100644 --- a/Source/Core/loadKTX.js +++ b/Source/Core/loadKTX.js @@ -2,6 +2,7 @@ define([ '../ThirdParty/when', './defined', + './definedProperties', './DeveloperError', './loadArrayBuffer', './PixelFormat', @@ -9,6 +10,7 @@ define([ ], function( when, defined, + defineProperties, DeveloperError, loadArrayBuffer, PixelFormat, @@ -21,13 +23,35 @@ define([ * or reject if the URL failed to load or failed to parse the data. The data is loaded * using XMLHttpRequest, which means that in order to make requests to another origin, * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + *

    + * The following are part of the KTX format specification but are not supported: + *

      + *
    • Big-endian files
    • + *
    • Metadata
    • + *
    • 3D textures
    • + *
    • Texture Arrays
    • + *
    • Cubemaps
    • + *
    • Mipmaps
    • + *
    + *

    * * @exports loadKTX * * @param {String|Promise.|ArrayBuffer} urlOrBuffer The URL of the binary data, a promise for the URL, or an ArrayBuffer. * @param {Object} [headers] HTTP headers to send with the requests. - * @returns {Promise.} A promise that will resolve to the requested data when loaded. + * @returns {Promise.} A promise that will resolve to the requested data when loaded. * + * @exception {RuntimeError} Invalid KTX file. + * @exception {RuntimeError} File is the wrong endianness. + * @exception {RuntimeError} glInternalFormat is not a valid format. + * @exception {RuntimeError} glType must be zero when the texture is compressed. + * @exception {RuntimeError} The type size for compressed textures must be 1. + * @exception {RuntimeError} glFormat must be zero when the texture is compressed. + * @exception {RuntimeError} Generating mipmaps for a compressed texture is unsupported. + * @exception {RuntimeError} The base internal format must be the same as the format for uncompressed textures. + * @exception {RuntimeError} 3D textures are not supported. + * @exception {RuntimeError} Texture arrays are not supported. + * @exception {RuntimeError} Cubemaps are not supported. * * @example * // load a single URL asynchronously @@ -64,6 +88,64 @@ define([ }); } + /** + * Describes a compressed texture and contains a compressed texture buffer. + * + * @param {PixelFormat} internalFormat The pixel format of the compressed texture. + * @param {Number} width The width of the texture. + * @param {Number} height The height of the texture. + * @param {Uint8Array} buffer The compressed texture buffer. + */ + function CompressedTextureBuffer(internalFormat, width, height, buffer) { + this._format = internalFormat; + this._width = width; + this._height = height; + this._buffer = buffer; + } + + defineProperties(CompressedTextureBuffer.prototype, { + /** + * The format of the compressed texture. + * @type PixelFormat + * @readonly + */ + internalFormat : { + get : function() { + return this._format; + } + }, + /** + * The width of the texture. + * @type Number + * @readonly + */ + width : { + get : function() { + return this._width; + } + }, + /** + * The height of the texture. + * @type Number + * @readonly + */ + height : { + get : function() { + return this._height; + } + }, + /** + * The compressed texture buffer. + * @type Uint8Array + * @readonly + */ + bufferView : { + get : function() { + return this._buffer; + } + } + }); + var fileIdentifier = [0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A]; var endiannessTest = 0x04030201; @@ -100,7 +182,6 @@ define([ var endianness = view.getUint32(byteOffset, true); byteOffset += sizeOfUint32; if (endianness !== endiannessTest) { - // TODO: Switch endianness? throw new RuntimeError('File is the wrong endianness.'); } @@ -129,7 +210,7 @@ define([ var bytesOfKeyValueByteSize = view.getUint32(byteOffset, true); byteOffset += sizeOfUint32; - // TODO: read metadata? At least need to check for KTXorientation + // skip metadata byteOffset += bytesOfKeyValueByteSize; var imageSize = view.getUint32(byteOffset, true); @@ -172,7 +253,6 @@ define([ throw new RuntimeError('3D textures are unsupported.'); } - // TODO: support texture arrays and cubemaps if (numberOfArrayElements !== 0) { throw new RuntimeError('Texture arrays are unsupported.'); } @@ -180,18 +260,13 @@ define([ throw new RuntimeError('Cubemaps are unsupported.'); } - // TODO: multiple mipmap levels + // Only use the level 0 mipmap if (PixelFormat.isCompressedFormat(glInternalFormat) && numberOfMipmapLevels > 1) { var levelSize = PixelFormat.compressedTextureSize(glInternalFormat, pixelWidth, pixelHeight); texture = new Uint8Array(texture.buffer, 0, levelSize); } - return { - bufferView : texture, - width : pixelWidth, - height : pixelHeight, - internalFormat : glInternalFormat - }; + return new CompressedTextureBuffer(glInternalFormat, pixelWidth, pixelHeight, texture); } return loadKTX; From 172cc21912674a5925a7e96d213d1295c0264456 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Wed, 21 Dec 2016 14:53:01 -0500 Subject: [PATCH 279/396] Fix typo. --- Source/Core/loadKTX.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/loadKTX.js b/Source/Core/loadKTX.js index 6ffd90885cb2..03622acc8819 100644 --- a/Source/Core/loadKTX.js +++ b/Source/Core/loadKTX.js @@ -2,7 +2,7 @@ define([ '../ThirdParty/when', './defined', - './definedProperties', + './defineProperties', './DeveloperError', './loadArrayBuffer', './PixelFormat', From b1876d98dcc5459ce4a054455030b3ed1bcbae92 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Wed, 21 Dec 2016 15:26:49 -0500 Subject: [PATCH 280/396] Add missing sampler when loading glTF with comressed texture. --- Source/Scene/Model.js | 2 +- .../CesiumTexturedBoxTest.glb | Bin 267852 -> 267852 bytes .../CesiumTexturedBoxTest.gltf | 2 +- .../CesiumTexturedBoxTest.gltf | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index d7692813ee09..40d20087be25 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -2033,7 +2033,7 @@ define([ width : gltfTexture.width, height : gltfTexture.height, pixelFormat : internalFormat, - flipY : false + sampler : sampler }); } else if (defined(source)) { var npot = !CesiumMath.isPowerOfTwo(source.width) || !CesiumMath.isPowerOfTwo(source.height); diff --git a/Specs/Data/Models/Box-Textured-KTX-Binary/CesiumTexturedBoxTest.glb b/Specs/Data/Models/Box-Textured-KTX-Binary/CesiumTexturedBoxTest.glb index 933dbc4e7d5930a39b16562a75c0b054abde2938..c276adb6a7ea74f4564a68add65149944d30413f 100644 GIT binary patch delta 34 mcmX@JM&QgEfemI{%;rXx&6Zs4mRyWL%ml>D+by|Rgn0nL6bS7A delta 34 mcmX@JM&QgEfemI{%$64B&6Zs4mRyWL%ml>D+by|Rgn0nLq6qT< diff --git a/Specs/Data/Models/Box-Textured-KTX-Embedded/CesiumTexturedBoxTest.gltf b/Specs/Data/Models/Box-Textured-KTX-Embedded/CesiumTexturedBoxTest.gltf index 6df86743c63a..530166206797 100644 --- a/Specs/Data/Models/Box-Textured-KTX-Embedded/CesiumTexturedBoxTest.gltf +++ b/Specs/Data/Models/Box-Textured-KTX-Embedded/CesiumTexturedBoxTest.gltf @@ -249,7 +249,7 @@ "samplers": { "sampler_0": { "magFilter": 9729, - "minFilter": 9987, + "minFilter": 9729, "wrapS": 10497, "wrapT": 10497 } diff --git a/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.gltf b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.gltf index 6c0b53852341..ec3f2d6d0326 100644 --- a/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.gltf +++ b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.gltf @@ -243,7 +243,7 @@ "samplers": { "sampler_0": { "magFilter": 9729, - "minFilter": 9987, + "minFilter": 9729, "wrapS": 10497, "wrapT": 10497 } From b4eda37bb30d34f0d5ad005372ac98e96f46391a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20ATE=C5=9E?= Date: Fri, 23 Dec 2016 17:44:16 +0300 Subject: [PATCH 281/396] ScreenSpaceCameraController.maximumZoomDistance doc fixed #4660 --- Source/Scene/ScreenSpaceCameraController.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Scene/ScreenSpaceCameraController.js b/Source/Scene/ScreenSpaceCameraController.js index 8a52c42dd7df..7f0652571b0a 100644 --- a/Source/Scene/ScreenSpaceCameraController.js +++ b/Source/Scene/ScreenSpaceCameraController.js @@ -153,9 +153,9 @@ define([ */ this.bounceAnimationTime = 3.0; /** - * The minimum magnitude, in meters, of the camera position when zooming. Defaults to 20.0. + * The minimum magnitude, in meters, of the camera position when zooming. Defaults to 1.0. * @type {Number} - * @default 20.0 + * @default 1.0 */ this.minimumZoomDistance = 1.0; /** From 89b07f74bbb668d5a5363fc0e9cf9b301213702e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20ATE=C5=9E?= Date: Fri, 23 Dec 2016 18:00:30 +0300 Subject: [PATCH 282/396] fixed issue 4029 --- Source/DataSources/DataSourceClock.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/DataSources/DataSourceClock.js b/Source/DataSources/DataSourceClock.js index 454d8fe7b050..70f8b2871322 100644 --- a/Source/DataSources/DataSourceClock.js +++ b/Source/DataSources/DataSourceClock.js @@ -165,12 +165,12 @@ define([ if (!defined(result)) { result = new Clock(); } - result.startTime = this.startTime; - result.stopTime = this.stopTime; - result.currentTime = this.currentTime; - result.clockRange = this.clockRange; - result.multiplier = this.multiplier; - result.clockStep = this.clockStep; + result.startTime = defaultValue(this.startTime, result.startTime); + result.stopTime = defaultValue(this.stopTime, result.stopTime); + result.currentTime = defaultValue(this.currentTime, result.currentTime); + result.clockRange = defaultValue(this.clockRange, result.clockRange); + result.multiplier = defaultValue(this.multiplier, result.multiplier); + result.clockStep = defaultValue(this.clockStep, result.clockStep); return result; }; From 3244710e2893138ae4d6bf6128115593e7b9f65c Mon Sep 17 00:00:00 2001 From: ateshuseyin Date: Fri, 23 Dec 2016 19:37:09 +0200 Subject: [PATCH 283/396] update CONTRIBUTORS.md --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 0b5dce7d42cf..19ce6a515a89 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -116,3 +116,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu * [David Friedman](https://github.com/duvifn) * [Abhishek Potnis](https://github.com/abhishekvp) * [Brad Hover](https://github.com/tekhaus) +* [Hüseyin Ateş](https://github.com/ateshuseyin) From 9ae322c9f898dc91cd229bf9f962745c9e5df225 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Sat, 24 Dec 2016 16:21:19 -0500 Subject: [PATCH 284/396] Whitespace --- Source/Core/Ellipsoid.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Source/Core/Ellipsoid.js b/Source/Core/Ellipsoid.js index 1e91f1d78428..c49cde15bb32 100644 --- a/Source/Core/Ellipsoid.js +++ b/Source/Core/Ellipsoid.js @@ -629,9 +629,7 @@ define([ * @exception {DeveloperError} Ellipsoid must be an ellipsoid of revolution (radii.x == radii.y). * @exception {DeveloperError} Ellipsoid.radii.z must be greater than 0. */ - Ellipsoid.prototype.getSurfaceNormalIntersectionWithZAxis = function(position, buffer, result) { - //>>includeStart('debug', pragmas.debug); if (!defined(position)) { throw new DeveloperError('position is required.'); @@ -652,14 +650,14 @@ define([ result = new Cartesian3(); } - result.x = 0; - result.y = 0; + result.x = 0.0; + result.y = 0.0; result.z = position.z * (1 - sqauredXOverSquaredZ); + if (Math.abs(result.z) >= this._radii.z - buffer){ return undefined; } - return result; }; From 056fc20d914c89fe9746671774e422b99ba4155f Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Sat, 24 Dec 2016 16:21:50 -0500 Subject: [PATCH 285/396] Whitespace --- Source/Scene/Globe.js | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/Scene/Globe.js b/Source/Scene/Globe.js index 2c7e1ec18a78..807bb74563a1 100644 --- a/Source/Scene/Globe.js +++ b/Source/Scene/Globe.js @@ -437,7 +437,6 @@ define([ // minimum height (-11500.0) for the terrain set, need to get this information from the terrain provider var rayOrigin = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesian, 11500.0, ray.origin); - // Theoretically, not with Earth datums, the intersection point can be outside the ellipsoid if (!defined(rayOrigin)){ // intersection point is outside the ellipsoid, try other value From b3943352cc0bec6ef7b1e593ab2a1fab68ca9786 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Sat, 24 Dec 2016 16:22:47 -0500 Subject: [PATCH 286/396] Style tweak --- Source/Core/Ellipsoid.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Core/Ellipsoid.js b/Source/Core/Ellipsoid.js index c49cde15bb32..deca2629e1ae 100644 --- a/Source/Core/Ellipsoid.js +++ b/Source/Core/Ellipsoid.js @@ -56,7 +56,7 @@ define([ ellipsoid._centerToleranceSquared = CesiumMath.EPSILON1; - if (ellipsoid._radiiSquared.z !== 0){ + if (ellipsoid._radiiSquared.z !== 0) { ellipsoid._sqauredXOverSquaredZ = ellipsoid._radiiSquared.x / ellipsoid._radiiSquared.z; } } @@ -646,7 +646,7 @@ define([ var sqauredXOverSquaredZ = this._sqauredXOverSquaredZ; - if (!defined(result)){ + if (!defined(result)) { result = new Cartesian3(); } @@ -654,7 +654,7 @@ define([ result.y = 0.0; result.z = position.z * (1 - sqauredXOverSquaredZ); - if (Math.abs(result.z) >= this._radii.z - buffer){ + if (Math.abs(result.z) >= this._radii.z - buffer) { return undefined; } From 1f325e5bfc7f176103e4be56e71ee8ee3daee31b Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Sat, 24 Dec 2016 16:23:21 -0500 Subject: [PATCH 287/396] Style tweak --- Source/Scene/Globe.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Scene/Globe.js b/Source/Scene/Globe.js index 807bb74563a1..bb92954ec673 100644 --- a/Source/Scene/Globe.js +++ b/Source/Scene/Globe.js @@ -438,7 +438,7 @@ define([ var rayOrigin = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesian, 11500.0, ray.origin); // Theoretically, not with Earth datums, the intersection point can be outside the ellipsoid - if (!defined(rayOrigin)){ + if (!defined(rayOrigin)) { // intersection point is outside the ellipsoid, try other value // minimum height (-11500.0) for the terrain set, need to get this information from the terrain provider var magnitude = Math.min(defaultValue(tile.data.minimumHeight, 0.0),-11500.0); From 761eda4c6c81bffed11a06a702c69931f5e9c8ed Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Sat, 24 Dec 2016 16:23:54 -0500 Subject: [PATCH 288/396] Style tweak --- Source/Scene/QuadtreePrimitive.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Source/Scene/QuadtreePrimitive.js b/Source/Scene/QuadtreePrimitive.js index cb48a48878d5..9149b60359e4 100644 --- a/Source/Scene/QuadtreePrimitive.js +++ b/Source/Scene/QuadtreePrimitive.js @@ -776,7 +776,7 @@ define([ var rayOrigin = ellipsoid.getSurfaceNormalIntersectionWithZAxis(data.positionOnEllipsoidSurface, 11500.0, scratchRay.origin); // Theoretically, not with Earth datums, the intersection point can be outside the ellipsoid - if (!defined(rayOrigin)){ + if (!defined(rayOrigin)) { // intersection point is outside the ellipsoid, try other value // minimum height (-11500.0) for the terrain set, need to get this information from the terrain provider var magnitude = Math.min(defaultValue(tile.data.minimumHeight, 0.0),-11500.0); @@ -785,7 +785,6 @@ define([ var vectorToMinimumPoint = Cartesian3.multiplyByScalar(surfaceNormal, Math.abs(magnitude) + 1, scratchPosition); Cartesian3.subtract(data.positionOnEllipsoidSurface, vectorToMinimumPoint, scratchRay.origin); } - } else { Cartographic.clone(data.positionCartographic, scratchCartographic); From 94ddf8c050fbd0ad7213d7b2e672968168c3403a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20ATE=C5=9E?= Date: Mon, 26 Dec 2016 12:23:56 +0300 Subject: [PATCH 289/396] test added --- Specs/DataSources/DataSourceClockSpec.js | 30 ++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Specs/DataSources/DataSourceClockSpec.js b/Specs/DataSources/DataSourceClockSpec.js index e957725cb1f1..3a40542bb5d9 100644 --- a/Specs/DataSources/DataSourceClockSpec.js +++ b/Specs/DataSources/DataSourceClockSpec.js @@ -89,4 +89,34 @@ defineSuite([ target.merge(undefined); }).toThrowDeveloperError(); }); + + it('gets value as a clock instance',function () { + var source = new DataSourceClock(); + source.startTime = JulianDate.now(); + source.stopTime = JulianDate.now(); + source.currentTime = JulianDate.now(); + source.clockRange = ClockRange.CLAMPED; + source.clockStep = ClockStep.TICK_DEPENDENT; + source.multiplier = 2; + + var clock = source.getValue(); + expect(clock.startTime).toEqual(source.startTime); + expect(clock.stopTime).toEqual(source.stopTime); + expect(clock.currentTime).toEqual(source.currentTime); + expect(clock.clockRange).toEqual(source.clockRange); + expect(clock.clockStep).toEqual(source.clockStep); + expect(clock.multiplier).toEqual(source.multiplier); + + source.multiplier = undefined; + source.clockStep = undefined; + source.clockRange = undefined; + + clock = source.getValue(); + expect(clock.startTime).toEqual(source.startTime); + expect(clock.stopTime).toEqual(source.stopTime); + expect(clock.currentTime).toEqual(source.currentTime); + expect(clock.clockRange).toEqual(ClockRange.UNBOUNDED); + expect(clock.clockStep).toEqual(ClockStep.SYSTEM_CLOCK_MULTIPLIER); + expect(clock.multiplier).toEqual(1.0); + }); }); From 9d3c061a8b465bd7cb38d5844a5f9545c92ee21f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=BCseyin=20ATE=C5=9E?= Date: Mon, 26 Dec 2016 12:45:45 +0300 Subject: [PATCH 290/396] changes.mg modified --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 896831df2990..424871efa108 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -19,6 +19,7 @@ Change Log * Added `divideComponents` function to `Cartesian2`, `Cartesian3`, and `Cartesian4`. [#4750](https://github.com/AnalyticalGraphicsInc/cesium/pull/4750) * Added `WebGLConstants` enum. Previously, this was part of the private Renderer API. [#4731](https://github.com/AnalyticalGraphicsInc/cesium/pull/4731) * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) +* Fixed DataSourceClock undefined property modification issue. [#4029](https://github.com/AnalyticalGraphicsInc/cesium/issues/4029) ### 1.28 - 2016-12-01 From d01196bb2fe0f9e0dfa76924c60093525f6ba486 Mon Sep 17 00:00:00 2001 From: "duvi.fn" Date: Mon, 26 Dec 2016 14:25:41 +0200 Subject: [PATCH 291/396] fix typo in spec title --- Specs/Core/EllipsoidSpec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Specs/Core/EllipsoidSpec.js b/Specs/Core/EllipsoidSpec.js index dea3c73a56de..944c388ebb21 100644 --- a/Specs/Core/EllipsoidSpec.js +++ b/Specs/Core/EllipsoidSpec.js @@ -440,7 +440,7 @@ defineSuite([ }).toThrowDeveloperError(); }); - it('getSurfaceNormalIntersectionWithZAxis throws if the ellipsoid is no ellipsoid of revolution', function() { + it('getSurfaceNormalIntersectionWithZAxis throws if the ellipsoid is not an ellipsoid of revolution', function() { expect(function() { var ellipsoid = new Ellipsoid(1,2,3); var cartesian = new Cartesian3(); @@ -509,7 +509,7 @@ defineSuite([ }); - it('getSurfaceNormalIntersectionWithZAxis returns a result that when a it\'s used as origin for a vector with the surface normal direction it produces an accurate cartographic', function() { + it('getSurfaceNormalIntersectionWithZAxis returns a result that when it\'s used as an origin for a vector with the surface normal direction it produces an accurate cartographic', function() { var ellipsoid = Ellipsoid.WGS84; var cartographic = Cartographic.fromDegrees(35.23,33.23); var cartesianOnTheSurface = ellipsoid.cartographicToCartesian(cartographic); From 853d1ca312c764eb21659b944222e4467acda7d3 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Mon, 26 Dec 2016 16:36:23 -0500 Subject: [PATCH 292/396] Update CHANGES.md --- CHANGES.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index c62883bfbc10..eb080bb46d4d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,7 +1,5 @@ Change Log ========== -* Fixed issue where billboards on terrain had some offset. [#4598](https://github.com/AnalyticalGraphicsInc/cesium/issues/4598) -* Fixed issue where `globe.getHeight` randomly returned 'undefined'. [#3411](https://github.com/AnalyticalGraphicsInc/cesium/issues/3411) ### 1.29 - 2017-01-02 @@ -14,6 +12,8 @@ Change Log * Added support for newlines (`\n`) in Cesium `Label`s and CZML. [#2402](https://github.com/AnalyticalGraphicsInc/cesium/issues/2402) * Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) * Fixed translucency in Firefox 50. https://github.com/AnalyticalGraphicsInc/cesium/pull/4762 +* Fixed issue where billboards on terrain had some offset. [#4598](https://github.com/AnalyticalGraphicsInc/cesium/issues/4598) +* Fixed issue where `globe.getHeight` randomly returned `undefined`. [#3411](https://github.com/AnalyticalGraphicsInc/cesium/issues/3411) * Fixed a bug that caused `GroundPrimitive` to render incorrectly on systems without the `WEBGL_depth_texture` extension. [#4747](https://github.com/AnalyticalGraphicsInc/cesium/pull/4747) * Fixed default Mapbox token and added a watermark to notify users that they need to sign up for their own token. * Fixed a bug that could cause a "readyImagery is not actually ready" exception with some configurations of imagery layers. From d2b31f21bf39463af27a03786bd06b1e0e5b52a8 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Mon, 26 Dec 2016 16:47:20 -0500 Subject: [PATCH 293/396] Tweak CHANGES.md --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 424871efa108..8a69834fd7c4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -19,7 +19,7 @@ Change Log * Added `divideComponents` function to `Cartesian2`, `Cartesian3`, and `Cartesian4`. [#4750](https://github.com/AnalyticalGraphicsInc/cesium/pull/4750) * Added `WebGLConstants` enum. Previously, this was part of the private Renderer API. [#4731](https://github.com/AnalyticalGraphicsInc/cesium/pull/4731) * Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) -* Fixed DataSourceClock undefined property modification issue. [#4029](https://github.com/AnalyticalGraphicsInc/cesium/issues/4029) +* DataSourceClock.getValue now preserves the provided `result` properties when its properties are `undefined`. [#4029](https://github.com/AnalyticalGraphicsInc/cesium/issues/4029) ### 1.28 - 2016-12-01 From 086063085fbe98acf0b4e94205f031044060a709 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Tue, 27 Dec 2016 13:36:07 -0500 Subject: [PATCH 294/396] Add reference for ray/triangle intersection --- Source/Core/IntersectionTests.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Source/Core/IntersectionTests.js b/Source/Core/IntersectionTests.js index 3657b9b48ee5..e468763c9ff0 100644 --- a/Source/Core/IntersectionTests.js +++ b/Source/Core/IntersectionTests.js @@ -80,6 +80,10 @@ define([ /** * Computes the intersection of a ray and a triangle as a parametric distance along the input ray. + * + * Implements {@link https://cadxfem.org/inf/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf| + * Fast Minimum Storage Ray/Triangle Intersection} by Tomas Moller and Ben Trumbore. + * * @memberof IntersectionTests * * @param {Ray} ray The ray. @@ -170,6 +174,10 @@ define([ /** * Computes the intersection of a ray and a triangle as a Cartesian3 coordinate. + * + * Implements {@link https://cadxfem.org/inf/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf| + * Fast Minimum Storage Ray/Triangle Intersection} by Tomas Moller and Ben Trumbore. + * * @memberof IntersectionTests * * @param {Ray} ray The ray. From a7c2a645970d001cbba01d5a98e82ee65a0bd048 Mon Sep 17 00:00:00 2001 From: Vladimir Rutsky Date: Wed, 28 Dec 2016 19:56:55 +0300 Subject: [PATCH 295/396] don't draw SkyAtmosphere on picking --- Source/Scene/Scene.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/Scene/Scene.js b/Source/Scene/Scene.js index 221e9d5869dd..bdfe357cde1c 100644 --- a/Source/Scene/Scene.js +++ b/Source/Scene/Scene.js @@ -1624,7 +1624,7 @@ define([ var scratchPerspectiveOffCenterFrustum = new PerspectiveOffCenterFrustum(); var scratchOrthographicFrustum = new OrthographicFrustum(); - function executeCommands(scene, passState) { + function executeCommands(scene, passState, picking) { var camera = scene._camera; var context = scene.context; var us = context.uniformState; @@ -1654,7 +1654,7 @@ define([ executeCommand(skyBoxCommand, scene, context, passState); } - if (environmentState.isSkyAtmosphereVisible) { + if (environmentState.isSkyAtmosphereVisible && !picking) { executeCommand(environmentState.skyAtmosphereCommand, scene, context, passState); } @@ -1954,14 +1954,14 @@ define([ Cartesian3.add(savedCamera.position, eyeTranslation, camera.position); camera.frustum.xOffset = offset; - executeCommands(scene, passState); + executeCommands(scene, passState, picking); viewport.x = passState.viewport.width; Cartesian3.subtract(savedCamera.position, eyeTranslation, camera.position); camera.frustum.xOffset = -offset; - executeCommands(scene, passState); + executeCommands(scene, passState, picking); Camera.clone(savedCamera, camera); } else { @@ -2112,7 +2112,7 @@ define([ executeShadowMapCastCommands(scene); } - executeCommands(scene, passState); + executeCommands(scene, passState, picking); } function updateEnvironment(scene) { @@ -2341,7 +2341,7 @@ define([ if (defined(this._deviceOrientationCameraController)) { this._deviceOrientationCameraController.update(); } - + this._camera.update(this._mode); this._camera._updateCameraChanged(); }; From e6ae2444a45e1c2c1f6c38e2e49a1ac459e43be6 Mon Sep 17 00:00:00 2001 From: Denver Pierce Date: Thu, 29 Dec 2016 09:23:26 -0600 Subject: [PATCH 296/396] Fix for WalkingLady model bindShapeMatrix. --- Source/ThirdParty/gltfDefaults.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/ThirdParty/gltfDefaults.js b/Source/ThirdParty/gltfDefaults.js index 14cb12615d82..d9174d665b2f 100644 --- a/Source/ThirdParty/gltfDefaults.js +++ b/Source/ThirdParty/gltfDefaults.js @@ -401,7 +401,7 @@ define([ for (var name in skins) { if (skins.hasOwnProperty(name)) { var skin = skins[name]; - if (defined(skin.bindShapeMatrix)) { + if (!defined(skin.bindShapeMatrix)) { skin.bindShapeMatrix = [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, From 83e19aad95c1701e15c5c08657fd7a4abd37eee7 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Fri, 30 Dec 2016 16:09:59 -0500 Subject: [PATCH 297/396] Update CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 583c216a0de7..c5b786d8ffe2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -16,6 +16,7 @@ Change Log * Fixed issue where `globe.getHeight` randomly returned `undefined`. [#3411](https://github.com/AnalyticalGraphicsInc/cesium/issues/3411) * Fixed a bug that caused `GroundPrimitive` to render incorrectly on systems without the `WEBGL_depth_texture` extension. [#4747](https://github.com/AnalyticalGraphicsInc/cesium/pull/4747) * Fixed default Mapbox token and added a watermark to notify users that they need to sign up for their own token. +* Fixed glTF models with skinning that used `bindShapeMatrix`. [#4722](https://github.com/AnalyticalGraphicsInc/cesium/issues/4722) * Fixed a bug that could cause a "readyImagery is not actually ready" exception with some configurations of imagery layers. * Fixed `Rectangle.union` to correctly account for rectangles that cross the IDL [#4732](https://github.com/AnalyticalGraphicsInc/cesium/pull/4732). * Added `divideComponents` function to `Cartesian2`, `Cartesian3`, and `Cartesian4`. [#4750](https://github.com/AnalyticalGraphicsInc/cesium/pull/4750) From 25f98594c52f8a77c51ec42c723a83844a29ffae Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Sat, 31 Dec 2016 12:56:30 -0500 Subject: [PATCH 298/396] Update CHANGES.md for 1.29 release --- CHANGES.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index c5b786d8ffe2..0cf3d0adf887 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,21 +8,22 @@ Change Log * Added the ability to render a `Model` with a silhouette. Added `silhouetteColor` and `silhouetteSize` properties to `Model`, `ModelGraphics`, and CZML. [#4314](https://github.com/AnalyticalGraphicsInc/cesium/pull/4314) * Improved Labels * Added new `Label` properties `showBackground`, `backgroundColor`, and `backgroundPadding` to the primitive, Entity, and CZML layers. + * Added support for newlines (`\n`) in Cesium `Label`s and CZML. [#2402] * Added new enum `VerticalOrigin.BASELINE`. Previously, `VerticalOrigin.BOTTOM` would sometimes align to the baseline depending on the contents of a label. - * Added support for newlines (`\n`) in Cesium `Label`s and CZML. [#2402](https://github.com/AnalyticalGraphicsInc/cesium/issues/2402) -* Fixed texture rotation for `RectangleGeometry` [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) -* Fixed translucency in Firefox 50. https://github.com/AnalyticalGraphicsInc/cesium/pull/4762 -* Fixed issue where billboards on terrain had some offset. [#4598](https://github.com/AnalyticalGraphicsInc/cesium/issues/4598) -* Fixed issue where `globe.getHeight` randomly returned `undefined`. [#3411](https://github.com/AnalyticalGraphicsInc/cesium/issues/3411) +(https://github.com/AnalyticalGraphicsInc/cesium/issues/2402) +* Fixed translucency in Firefox 50. [#4762](https://github.com/AnalyticalGraphicsInc/cesium/pull/4762) +* Fixed texture rotation for `RectangleGeometry`. [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) +* Fixed issue where billboards on terrain had an incorrect offset. [#4598](https://github.com/AnalyticalGraphicsInc/cesium/issues/4598) +* Fixed issue where `globe.getHeight` incorrectly returned `undefined`. [#3411](https://github.com/AnalyticalGraphicsInc/cesium/issues/3411) * Fixed a bug that caused `GroundPrimitive` to render incorrectly on systems without the `WEBGL_depth_texture` extension. [#4747](https://github.com/AnalyticalGraphicsInc/cesium/pull/4747) * Fixed default Mapbox token and added a watermark to notify users that they need to sign up for their own token. * Fixed glTF models with skinning that used `bindShapeMatrix`. [#4722](https://github.com/AnalyticalGraphicsInc/cesium/issues/4722) * Fixed a bug that could cause a "readyImagery is not actually ready" exception with some configurations of imagery layers. -* Fixed `Rectangle.union` to correctly account for rectangles that cross the IDL [#4732](https://github.com/AnalyticalGraphicsInc/cesium/pull/4732). +* Fixed `Rectangle.union` to correctly account for rectangles that cross the IDL. [#4732](https://github.com/AnalyticalGraphicsInc/cesium/pull/4732) +* Fixed tooltips for gallery thumbnails in Sandcastle [#4702].(https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) +* DataSourceClock.getValue now preserves the provided `result` properties when its properties are `undefined`. [#4029](https://github.com/AnalyticalGraphicsInc/cesium/issues/4029) * Added `divideComponents` function to `Cartesian2`, `Cartesian3`, and `Cartesian4`. [#4750](https://github.com/AnalyticalGraphicsInc/cesium/pull/4750) * Added `WebGLConstants` enum. Previously, this was part of the private Renderer API. [#4731](https://github.com/AnalyticalGraphicsInc/cesium/pull/4731) -* Fixed tooltips for gallery thumbnails in Sandcastle [#4702](https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) -* DataSourceClock.getValue now preserves the provided `result` properties when its properties are `undefined`. [#4029](https://github.com/AnalyticalGraphicsInc/cesium/issues/4029) ### 1.28 - 2016-12-01 From 6663e1b7acb7c613657750150d6964788293406b Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Mon, 2 Jan 2017 10:57:46 +0100 Subject: [PATCH 299/396] Add information on using Check to the section on throwing errors --- .../Contributors/CodingGuide/README.md | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/Documentation/Contributors/CodingGuide/README.md b/Documentation/Contributors/CodingGuide/README.md index fce089da7972..0d0858ce8b82 100644 --- a/Documentation/Contributors/CodingGuide/README.md +++ b/Documentation/Contributors/CodingGuide/README.md @@ -383,26 +383,40 @@ Some common sensible defaults are ### Throwing Exceptions -* Throw Cesium's `DeveloperError` when the user has a coding error. The most common errors are missing parameters and out-of-range parameters. For example: +Use the methods of Cesium's [Check](https://github.com/AnalyticalGraphicsInc/cesium/blob/master/Source/Core/Check.js) class to throw a `DeveloperError` when the user has a coding error. The most common errors are parameters that are missing, have the wrong type or are out of rangers of the wrong type or are out of range. + +* For example, to check that a parameter is an object: ```javascript Cartesian3.maximumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required.'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.max(cartesian.x, cartesian.y, cartesian.z); }; ``` + +* For more complicated parameter checks, manually check the parameter and then throw a `DeveloperError`. Example: +```javascript + Cartesian3.unpackArray = function(array, result) { + //>>includeStart('debug', pragmas.debug); + Check.defined(array, 'array'); + Check.numeric.minimum(array.length, 3); + if (array.length % 3 !== 0) { + throw new DeveloperError('array length must be a multiple of 3.'); + } + //>>includeEnd('debug'); + + // ... + }; +``` + * To check for `DeveloperError`, surround code in `includeStart`/`includeEnd` comments, as shown above, so developer error checks can be optimized out of release builds. Do not include required side effects inside `includeStart`/`includeEnd`, e.g., ```javascript Cartesian3.maximumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); var c = cartesian; - if (!defined(c)) { - throw new DeveloperError('cartesian is required.'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); // Works in debug. Fails in release since c is optimized out! From 84ed37464c0f74cfd321e0bae6454a75036ccb49 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Mon, 2 Jan 2017 10:59:22 +0100 Subject: [PATCH 300/396] Fix indentation --- .../Contributors/CodingGuide/README.md | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Documentation/Contributors/CodingGuide/README.md b/Documentation/Contributors/CodingGuide/README.md index 0d0858ce8b82..dd3ad90d9324 100644 --- a/Documentation/Contributors/CodingGuide/README.md +++ b/Documentation/Contributors/CodingGuide/README.md @@ -398,17 +398,17 @@ Cartesian3.maximumComponent = function(cartesian) { * For more complicated parameter checks, manually check the parameter and then throw a `DeveloperError`. Example: ```javascript - Cartesian3.unpackArray = function(array, result) { - //>>includeStart('debug', pragmas.debug); - Check.defined(array, 'array'); - Check.numeric.minimum(array.length, 3); - if (array.length % 3 !== 0) { - throw new DeveloperError('array length must be a multiple of 3.'); - } - //>>includeEnd('debug'); +Cartesian3.unpackArray = function(array, result) { + //>>includeStart('debug', pragmas.debug); + Check.defined(array, 'array'); + Check.numeric.minimum(array.length, 3); + if (array.length % 3 !== 0) { + throw new DeveloperError('array length must be a multiple of 3.'); + } + //>>includeEnd('debug'); - // ... - }; + // ... +}; ``` * To check for `DeveloperError`, surround code in `includeStart`/`includeEnd` comments, as shown above, so developer error checks can be optimized out of release builds. Do not include required side effects inside `includeStart`/`includeEnd`, e.g., From b2fa6d3ea1b12f10d21b6629741459bafe02b737 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Mon, 2 Jan 2017 08:06:33 -0500 Subject: [PATCH 301/396] Update version to 1.29 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1bce15dbaa92..c5df42eebcee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cesium", - "version": "1.28.0", + "version": "1.29.0", "description": "Cesium is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.", "homepage": "http://cesiumjs.org", "license": "Apache-2.0", From 240821f92fa477969651de3e1d299e90dc182ebc Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Mon, 2 Jan 2017 11:15:59 -0500 Subject: [PATCH 302/396] Update CHANGES.md --- CHANGES.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 0cf3d0adf887..8fd410376eef 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,10 @@ Change Log ========== +### 1.30 - 2017-02-01 + +* Updated the morph so the default view in Columbus View is now angled. [#3878](https://github.com/AnalyticalGraphicsInc/cesium/issues/3878) + ### 1.29 - 2017-01-02 * Improved 3D Models From a0f1610efe3090e4c6f94f895dc333ba6ab0b01c Mon Sep 17 00:00:00 2001 From: Zsolt Simon Date: Tue, 3 Jan 2017 11:29:02 +1000 Subject: [PATCH 303/396] Fix ModelVisualizer.update to set colors properly --- Source/DataSources/ModelVisualizer.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Source/DataSources/ModelVisualizer.js b/Source/DataSources/ModelVisualizer.js index bd00c0ae9829..7af69e624e5f 100644 --- a/Source/DataSources/ModelVisualizer.js +++ b/Source/DataSources/ModelVisualizer.js @@ -42,7 +42,6 @@ define([ var defaultColorBlendMode = ColorBlendMode.HIGHLIGHT; var defaultColorBlendAmount = 0.5; - var color = new Color(); var modelMatrixScratch = new Matrix4(); var nodeMatrixScratch = new Matrix4(); @@ -151,7 +150,7 @@ define([ model.distanceDisplayCondition = Property.getValueOrUndefined(modelGraphics._distanceDisplayCondition, time); model.silhouetteColor = Property.getValueOrDefault(modelGraphics.silhouetteColor, time, defaultSilhouetteColor); model.silhouetteSize = Property.getValueOrDefault(modelGraphics.silhouetteSize, time, defaultSilhouetteSize); - model.color = Property.getValueOrDefault(modelGraphics._color, time, defaultColor, color); + model.color = Property.getValueOrDefault(modelGraphics._color, time, defaultColor); model.colorBlendMode = Property.getValueOrDefault(modelGraphics._colorBlendMode, time, defaultColorBlendMode); model.colorBlendAmount = Property.getValueOrDefault(modelGraphics._colorBlendAmount, time, defaultColorBlendAmount); From 7cbcfa6a9bc9763740d56216800c16fa421eb477 Mon Sep 17 00:00:00 2001 From: Zsolt Simon Date: Tue, 3 Jan 2017 11:45:25 +1000 Subject: [PATCH 304/396] Update CONTRIBUTORS.md --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 19ce6a515a89..a48712cd0bef 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -117,3 +117,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu * [Abhishek Potnis](https://github.com/abhishekvp) * [Brad Hover](https://github.com/tekhaus) * [Hüseyin Ateş](https://github.com/ateshuseyin) +* [Zsolt Simon](https://github.com/szsolt) From 878f974c85f0b1e11a9598aea7596adf99d4929f Mon Sep 17 00:00:00 2001 From: Zsolt Simon Date: Tue, 3 Jan 2017 15:36:46 +1000 Subject: [PATCH 305/396] Avoid allocating a new Color while updating color in visualizer --- Source/DataSources/ModelVisualizer.js | 4 ++-- Source/Scene/Model.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/DataSources/ModelVisualizer.js b/Source/DataSources/ModelVisualizer.js index 7af69e624e5f..9514d5ddf6e2 100644 --- a/Source/DataSources/ModelVisualizer.js +++ b/Source/DataSources/ModelVisualizer.js @@ -148,9 +148,9 @@ define([ model.shadows = Property.getValueOrDefault(modelGraphics._shadows, time, defaultShadows); model.heightReference = Property.getValueOrDefault(modelGraphics._heightReference, time, defaultHeightReference); model.distanceDisplayCondition = Property.getValueOrUndefined(modelGraphics._distanceDisplayCondition, time); - model.silhouetteColor = Property.getValueOrDefault(modelGraphics.silhouetteColor, time, defaultSilhouetteColor); + model.silhouetteColor = Property.getValueOrClonedDefault(modelGraphics.silhouetteColor, time, defaultSilhouetteColor, model.silhouetteColor); model.silhouetteSize = Property.getValueOrDefault(modelGraphics.silhouetteSize, time, defaultSilhouetteSize); - model.color = Property.getValueOrDefault(modelGraphics._color, time, defaultColor); + model.color = Property.getValueOrClonedDefault(modelGraphics._color, time, defaultColor, model.color); model.colorBlendMode = Property.getValueOrDefault(modelGraphics._colorBlendMode, time, defaultColorBlendMode); model.colorBlendAmount = Property.getValueOrDefault(modelGraphics._colorBlendAmount, time, defaultColorBlendAmount); diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 0447bbf29ec1..a19e9f767d3f 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -416,7 +416,7 @@ define([ * * @default Color.RED */ - this.silhouetteColor = defaultValue(options.silhouetteColor, Color.RED); + this.silhouetteColor = Color.clone(defaultValue(options.silhouetteColor, Color.RED)); this._silhouetteColor = new Color(); this._normalAttributeName = undefined; @@ -554,7 +554,7 @@ define([ * * @default Color.WHITE */ - this.color = defaultValue(options.color, Color.WHITE); + this.color = Color.clone(defaultValue(options.color, Color.WHITE)); this._color = new Color(); /** From 5a2a925cd9c8547520abdfc1fea623b358bddd5c Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Tue, 3 Jan 2017 13:15:27 +0100 Subject: [PATCH 306/396] Rename Check.typeOf.function -> Check.typeOf.func --- Source/Core/Check.js | 2 +- Specs/Core/CheckSpec.js | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Source/Core/Check.js b/Source/Core/Check.js index 4183a6fe064e..5bf150dcab79 100644 --- a/Source/Core/Check.js +++ b/Source/Core/Check.js @@ -88,7 +88,7 @@ define([ * @param {String} name The name of the variable being tested * @exception {DeveloperError} test must be typeof 'function' */ - Check.typeOf.function = function (test, name) { + Check.typeOf.func = function (test, name) { if (typeof test !== 'function') { throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'function', name)); } diff --git a/Specs/Core/CheckSpec.js b/Specs/Core/CheckSpec.js index df0aebc938d4..54bcc1cd304b 100644 --- a/Specs/Core/CheckSpec.js +++ b/Specs/Core/CheckSpec.js @@ -30,27 +30,27 @@ defineSuite([ }).toThrowDeveloperError(); }); - it('Check.typeOf.function does not throw when passed a function', function () { + it('Check.typeOf.func does not throw when passed a function', function () { expect(function () { - Check.typeOf.function(function () {return true;}, 'mockName'); + Check.typeOf.func(function () {return true;}, 'mockName'); }).not.toThrowDeveloperError(); }); - it('Check.typeOf.function throws when passed a non-function', function () { + it('Check.typeOf.func throws when passed a non-function', function () { expect(function () { - Check.typeOf.function({}, 'mockName'); + Check.typeOf.func({}, 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.function([], 'mockName'); + Check.typeOf.func([], 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.function(1, 'mockName'); + Check.typeOf.func(1, 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.function('snth', 'mockName'); + Check.typeOf.func('snth', 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.function(true, 'mockName'); + Check.typeOf.func(true, 'mockName'); }).toThrowDeveloperError(); }); From 258eb007e2e0c4c8721caac4e72e3c601764b886 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Wed, 4 Jan 2017 06:51:31 -0500 Subject: [PATCH 307/396] Fixed running just GroundPrimitive tests --- Specs/Scene/GroundPrimitiveSpec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Specs/Scene/GroundPrimitiveSpec.js b/Specs/Scene/GroundPrimitiveSpec.js index 4b46d3a7a17a..35201b444668 100644 --- a/Specs/Scene/GroundPrimitiveSpec.js +++ b/Specs/Scene/GroundPrimitiveSpec.js @@ -1,5 +1,6 @@ /*global defineSuite*/ defineSuite([ + 'Scene/GroundPrimitive', 'Core/Color', 'Core/ColorGeometryInstanceAttribute', 'Core/destroyObject', @@ -13,12 +14,12 @@ defineSuite([ 'Core/RectangleGeometry', 'Core/ShowGeometryInstanceAttribute', 'Renderer/Pass', - 'Scene/GroundPrimitive', 'Scene/PerInstanceColorAppearance', 'Scene/Primitive', 'Specs/createScene', 'Specs/pollToPromise' ], function( + GroundPrimitive, Color, ColorGeometryInstanceAttribute, destroyObject, @@ -32,7 +33,6 @@ defineSuite([ RectangleGeometry, ShowGeometryInstanceAttribute, Pass, - GroundPrimitive, PerInstanceColorAppearance, Primitive, createScene, From 2d50df1ef5a9c878e5fd75020fc58c4bcc8c9191 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Wed, 4 Jan 2017 08:25:16 -0500 Subject: [PATCH 308/396] Make debugShowShadowVolume show the actual volume rendered --- Source/Scene/GroundPrimitive.js | 284 +++++++++++++++----------------- 1 file changed, 130 insertions(+), 154 deletions(-) diff --git a/Source/Scene/GroundPrimitive.js b/Source/Scene/GroundPrimitive.js index 43536a54a362..b01058f7e7fe 100644 --- a/Source/Scene/GroundPrimitive.js +++ b/Source/Scene/GroundPrimitive.js @@ -5,6 +5,7 @@ define([ '../Core/Cartesian2', '../Core/Cartesian3', '../Core/Cartographic', + '../Core/clone', '../Core/Color', '../Core/ColorGeometryInstanceAttribute', '../Core/defaultValue', @@ -40,6 +41,7 @@ define([ Cartesian2, Cartesian3, Cartographic, + clone, Color, ColorGeometryInstanceAttribute, defaultValue, @@ -196,9 +198,7 @@ define([ /** * This property is for debugging only; it is not for production use nor is it optimized. *

    - * Draws the shadow volume for each geometry in the primitive. Must be true on - * creation for the volumes to be created before the geometry is released or releaseGeometryInstances - * must be false + * Draws the shadow volume for each geometry in the primitive. *

    * * @type {Boolean} @@ -206,6 +206,7 @@ define([ * @default false */ this.debugShowShadowVolume = defaultValue(options.debugShowShadowVolume, false); + this._debugShowShadowVolume = false; this._sp = undefined; this._spPick = undefined; @@ -228,7 +229,6 @@ define([ this._readyPromise = when.defer(); this._primitive = undefined; - this._debugPrimitive = undefined; this._maxHeight = undefined; this._minHeight = undefined; @@ -423,91 +423,98 @@ define([ }; } - var stencilPreloadRenderState = { - colorMask : { - red : false, - green : false, - blue : false, - alpha : false - }, - stencilTest : { - enabled : true, - frontFunction : StencilFunction.ALWAYS, - frontOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.DECREMENT_WRAP, - zPass : StencilOperation.DECREMENT_WRAP + function getStencilPreloadRenderState(enableStencil) { + return { + colorMask : { + red : false, + green : false, + blue : false, + alpha : false }, - backFunction : StencilFunction.ALWAYS, - backOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.INCREMENT_WRAP, - zPass : StencilOperation.INCREMENT_WRAP + stencilTest : { + enabled : enableStencil, + frontFunction : StencilFunction.ALWAYS, + frontOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.DECREMENT_WRAP, + zPass : StencilOperation.DECREMENT_WRAP + }, + backFunction : StencilFunction.ALWAYS, + backOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.INCREMENT_WRAP, + zPass : StencilOperation.INCREMENT_WRAP + }, + reference : 0, + mask : ~0 }, - reference : 0, - mask : ~0 - }, - depthTest : { - enabled : false - }, - depthMask : false - }; + depthTest : { + enabled : false + }, + depthMask : false + }; + } - var stencilDepthRenderState = { - colorMask : { - red : false, - green : false, - blue : false, - alpha : false - }, - stencilTest : { - enabled : true, - frontFunction : StencilFunction.ALWAYS, - frontOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.KEEP, - zPass : StencilOperation.INCREMENT_WRAP + function getStencilDepthRenderState(enableStencil) { + return { + colorMask : { + red : false, + green : false, + blue : false, + alpha : false }, - backFunction : StencilFunction.ALWAYS, - backOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.KEEP, - zPass : StencilOperation.DECREMENT_WRAP + stencilTest : { + enabled : enableStencil, + frontFunction : StencilFunction.ALWAYS, + frontOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.KEEP, + zPass : StencilOperation.INCREMENT_WRAP + }, + backFunction : StencilFunction.ALWAYS, + backOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.KEEP, + zPass : StencilOperation.DECREMENT_WRAP + }, + reference : 0, + mask : ~0 }, - reference : 0, - mask : ~0 - }, - depthTest : { - enabled : true, - func : DepthFunction.LESS_OR_EQUAL - }, - depthMask : false - }; + depthTest : { + enabled : true, + func : DepthFunction.LESS_OR_EQUAL + }, + depthMask : false + }; + } - var colorRenderState = { - stencilTest : { - enabled : true, - frontFunction : StencilFunction.NOT_EQUAL, - frontOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.KEEP, - zPass : StencilOperation.DECREMENT_WRAP + + function getColorRenderState(enableStencil) { + return { + stencilTest : { + enabled : enableStencil, + frontFunction : StencilFunction.NOT_EQUAL, + frontOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.KEEP, + zPass : StencilOperation.DECREMENT_WRAP + }, + backFunction : StencilFunction.NOT_EQUAL, + backOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.KEEP, + zPass : StencilOperation.DECREMENT_WRAP + }, + reference : 0, + mask : ~0 }, - backFunction : StencilFunction.NOT_EQUAL, - backOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.KEEP, - zPass : StencilOperation.DECREMENT_WRAP + depthTest : { + enabled : false }, - reference : 0, - mask : ~0 - }, - depthTest : { - enabled : false - }, - depthMask : false, - blending : BlendingState.ALPHA_BLEND - }; + depthMask : false, + blending : BlendingState.ALPHA_BLEND + }; + } var pickRenderState = { stencilTest : { @@ -692,66 +699,67 @@ define([ return BoundingSphere.union(result, scratchBoundingSphere, result); } - function createBoundingVolume(primitive, frameState, geometry) { + function createBoundingVolume(groundPrimitive, frameState, geometry) { var ellipsoid = frameState.mapProjection.ellipsoid; var rectangle = getRectangle(frameState, geometry); // Use an oriented bounding box by default, but switch to a bounding sphere if bounding box creation would fail. if (rectangle.width < CesiumMath.PI) { - var obb = OrientedBoundingBox.fromRectangle(rectangle, primitive._maxHeight, primitive._minHeight, ellipsoid); - primitive._boundingVolumes.push(obb); + var obb = OrientedBoundingBox.fromRectangle(rectangle, groundPrimitive._maxHeight, groundPrimitive._minHeight, ellipsoid); + groundPrimitive._boundingVolumes.push(obb); } else { var highPositions = geometry.attributes.position3DHigh.values; var lowPositions = geometry.attributes.position3DLow.values; - primitive._boundingVolumes.push(BoundingSphere.fromEncodedCartesianVertices(highPositions, lowPositions)); + groundPrimitive._boundingVolumes.push(BoundingSphere.fromEncodedCartesianVertices(highPositions, lowPositions)); } if (!frameState.scene3DOnly) { var projection = frameState.mapProjection; - var boundingVolume = BoundingSphere.fromRectangleWithHeights2D(rectangle, projection, primitive._maxHeight, primitive._minHeight); + var boundingVolume = BoundingSphere.fromRectangleWithHeights2D(rectangle, projection, groundPrimitive._maxHeight, groundPrimitive._minHeight); Cartesian3.fromElements(boundingVolume.center.z, boundingVolume.center.x, boundingVolume.center.y, boundingVolume.center); - primitive._boundingVolumes2D.push(boundingVolume); + groundPrimitive._boundingVolumes2D.push(boundingVolume); } } - function createRenderStates(primitive, context, appearance, twoPasses) { - if (defined(primitive._rsStencilPreloadPass)) { + function createRenderStates(groundPrimitive, context, appearance, twoPasses) { + if (defined(groundPrimitive._rsStencilPreloadPass)) { return; } + var stencilEnabled = !groundPrimitive.debugShowShadowVolume; - primitive._rsStencilPreloadPass = RenderState.fromCache(stencilPreloadRenderState); - primitive._rsStencilDepthPass = RenderState.fromCache(stencilDepthRenderState); - primitive._rsColorPass = RenderState.fromCache(colorRenderState); - primitive._rsPickPass = RenderState.fromCache(pickRenderState); + groundPrimitive._rsStencilPreloadPass = RenderState.fromCache(getStencilPreloadRenderState(stencilEnabled)); + groundPrimitive._rsStencilDepthPass = RenderState.fromCache(getStencilDepthRenderState(stencilEnabled)); + groundPrimitive._rsColorPass = RenderState.fromCache(getColorRenderState(stencilEnabled)); + groundPrimitive._rsPickPass = RenderState.fromCache(pickRenderState); } - function createShaderProgram(primitive, frameState, appearance) { - if (defined(primitive._sp)) { + function createShaderProgram(groundPrimitive, frameState, appearance) { + if (defined(groundPrimitive._sp)) { return; } var context = frameState.context; var vs = ShadowVolumeVS; - vs = primitive._primitive._batchTable.getVertexShaderCallback()(vs); - vs = Primitive._appendShowToShader(primitive._primitive, vs); - vs = Primitive._appendDistanceDisplayConditionToShader(primitive._primitive, vs); - vs = Primitive._modifyShaderPosition(primitive, vs, frameState.scene3DOnly); - vs = Primitive._updateColorAttribute(primitive._primitive, vs); + vs = groundPrimitive._primitive._batchTable.getVertexShaderCallback()(vs); + vs = Primitive._appendShowToShader(groundPrimitive._primitive, vs); + vs = Primitive._appendDistanceDisplayConditionToShader(groundPrimitive._primitive, vs); + vs = Primitive._modifyShaderPosition(groundPrimitive, vs, frameState.scene3DOnly); + vs = Primitive._updateColorAttribute(groundPrimitive._primitive, vs); var fs = ShadowVolumeFS; - var attributeLocations = primitive._primitive._attributeLocations; + var attributeLocations = groundPrimitive._primitive._attributeLocations; - primitive._sp = ShaderProgram.replaceCache({ + groundPrimitive._sp = ShaderProgram.replaceCache({ context : context, - shaderProgram : primitive._sp, + shaderProgram : groundPrimitive._sp, vertexShaderSource : vs, fragmentShaderSource : fs, attributeLocations : attributeLocations }); - if (primitive._primitive.allowPicking) { + if (groundPrimitive._primitive.allowPicking) { var vsPick = ShaderSource.createPickVertexShaderSource(vs); vsPick = Primitive._updatePickColorAttribute(vsPick); @@ -759,15 +767,15 @@ define([ sources : [fs], pickColorQualifier : 'varying' }); - primitive._spPick = ShaderProgram.replaceCache({ + groundPrimitive._spPick = ShaderProgram.replaceCache({ context : context, - shaderProgram : primitive._spPick, + shaderProgram : groundPrimitive._spPick, vertexShaderSource : vsPick, fragmentShaderSource : pickFS, attributeLocations : attributeLocations }); } else { - primitive._spPick = ShaderProgram.fromCache({ + groundPrimitive._spPick = ShaderProgram.fromCache({ context : context, vertexShaderSource : vs, fragmentShaderSource : fs, @@ -1011,8 +1019,10 @@ define([ return; } + var that = this; + var primitiveOptions = this._primitiveOptions; + if (!defined(this._primitive)) { - var primitiveOptions = this._primitiveOptions; var ellipsoid = frameState.mapProjection.ellipsoid; var instance; @@ -1086,7 +1096,6 @@ define([ primitiveOptions.geometryInstances = groundInstances; - var that = this; primitiveOptions._createBoundingVolumeFunction = function(frameState, geometry) { createBoundingVolume(that, frameState, geometry); }; @@ -1120,52 +1129,20 @@ define([ }); } - this._primitive.debugShowBoundingVolume = this.debugShowBoundingVolume; - this._primitive.update(frameState); - - if (this.debugShowShadowVolume && !defined(this._debugPrimitive) && defined(this.geometryInstances)) { - var debugInstances = isArray(this.geometryInstances) ? this.geometryInstances : [this.geometryInstances]; - var debugLength = debugInstances.length; - var debugVolumeInstances = new Array(debugLength); - - for (var j = 0 ; j < debugLength; ++j) { - var debugInstance = debugInstances[j]; - var debugGeometry = debugInstance.geometry; - var debugInstanceType = debugGeometry.constructor; - if (defined(debugInstanceType) && defined(debugInstanceType.createShadowVolume)) { - var debugColorArray = debugInstance.attributes.color.value; - var debugColor = Color.fromBytes(debugColorArray[0], debugColorArray[1], debugColorArray[2], debugColorArray[3]); - Color.subtract(new Color(1.0, 1.0, 1.0, 0.0), debugColor, debugColor); - debugVolumeInstances[j] = new GeometryInstance({ - geometry : debugInstanceType.createShadowVolume(debugGeometry, getComputeMinimumHeightFunction(this), getComputeMaximumHeightFunction(this)), - attributes : { - color : ColorGeometryInstanceAttribute.fromColor(debugColor) - }, - id : debugInstance.id, - pickPrimitive : this - }); - } - } - - this._debugPrimitive = new Primitive({ - geometryInstances : debugVolumeInstances, - releaseGeometryInstances : true, - allowPicking : false, - asynchronous : false, - appearance : new PerInstanceColorAppearance({ - flat : true - }) - }); + if (this.debugShowShadowVolume && !this._debugShowShadowVolume && this._ready) { + this._debugShowShadowVolume = true; + this._rsStencilPreloadPass = RenderState.fromCache(getStencilPreloadRenderState(false)); + this._rsStencilDepthPass = RenderState.fromCache(getStencilDepthRenderState(false)); + this._rsColorPass = RenderState.fromCache(getColorRenderState(false)); + } else if (!this.debugShowShadowVolume && this._debugShowShadowVolume) { + this._debugShowShadowVolume = false; + this._rsStencilPreloadPass = RenderState.fromCache(getStencilPreloadRenderState(true)); + this._rsStencilDepthPass = RenderState.fromCache(getStencilDepthRenderState(true)); + this._rsColorPass = RenderState.fromCache(getColorRenderState(true)); } - if (defined(this._debugPrimitive)) { - if (this.debugShowShadowVolume) { - this._debugPrimitive.update(frameState); - } else { - this._debugPrimitive.destroy(); - this._debugPrimitive = undefined; - } - } + this._primitive.debugShowBoundingVolume = this.debugShowBoundingVolume; + this._primitive.update(frameState); }; /** @@ -1237,7 +1214,6 @@ define([ */ GroundPrimitive.prototype.destroy = function() { this._primitive = this._primitive && this._primitive.destroy(); - this._debugPrimitive = this._debugPrimitive && this._debugPrimitive.destroy(); this._sp = this._sp && this._sp.destroy(); this._spPick = this._spPick && this._spPick.destroy(); return destroyObject(this); From 0f5b872900446a581d282af02b4aa248b63ddaab Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Wed, 4 Jan 2017 08:56:54 -0500 Subject: [PATCH 309/396] Style --- Source/Shaders/ShadowVolumeVS.glsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Shaders/ShadowVolumeVS.glsl b/Source/Shaders/ShadowVolumeVS.glsl index a20b00d1ed9a..888eca6500dd 100644 --- a/Source/Shaders/ShadowVolumeVS.glsl +++ b/Source/Shaders/ShadowVolumeVS.glsl @@ -1,11 +1,11 @@ -uniform float u_globeMinimumAltitude; - attribute vec3 position3DHigh; attribute vec3 position3DLow; attribute vec3 extrudeDirection; attribute vec4 color; attribute float batchId; +uniform float u_globeMinimumAltitude; + // emulated noperspective varying float v_WindowZ; varying vec4 v_color; From 4e1c23c7a51b419312abcd68aa25102330b459e7 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Wed, 4 Jan 2017 09:19:53 -0500 Subject: [PATCH 310/396] Update CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 8fd410376eef..9bbc1d66ba52 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ Change Log ### 1.30 - 2017-02-01 * Updated the morph so the default view in Columbus View is now angled. [#3878](https://github.com/AnalyticalGraphicsInc/cesium/issues/3878) +* Fixed sky atmosphere from causing incorrect picking and hanging drill picking. [#4783](https://github.com/AnalyticalGraphicsInc/cesium/issues/4783) and [#4784](https://github.com/AnalyticalGraphicsInc/cesium/issues/4784) ### 1.29 - 2017-01-02 From 0cc510708d5b4bb18a82b6a05b2711bf16136bca Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Wed, 4 Jan 2017 09:40:20 -0500 Subject: [PATCH 311/396] Tweak picking fix --- Source/Scene/Scene.js | 51 +++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/Source/Scene/Scene.js b/Source/Scene/Scene.js index bdfe357cde1c..ab3169195926 100644 --- a/Source/Scene/Scene.js +++ b/Source/Scene/Scene.js @@ -1648,37 +1648,40 @@ define([ us.updateFrustum(frustum); us.updatePass(Pass.ENVIRONMENT); + var useWebVR = scene._useWebVR && scene.mode !== SceneMode.SCENE2D; var environmentState = scene._environmentState; - var skyBoxCommand = environmentState.skyBoxCommand; - if (defined(skyBoxCommand)) { - executeCommand(skyBoxCommand, scene, context, passState); - } - if (environmentState.isSkyAtmosphereVisible && !picking) { - executeCommand(environmentState.skyAtmosphereCommand, scene, context, passState); - } + // Do not render environment primitives during a pick pass since they do not generate picking commands. + if (!picking) { + var skyBoxCommand = environmentState.skyBoxCommand; + if (defined(skyBoxCommand)) { + executeCommand(skyBoxCommand, scene, context, passState); + } - var useWebVR = scene._useWebVR && scene.mode !== SceneMode.SCENE2D; + if (environmentState.isSkyAtmosphereVisible) { + executeCommand(environmentState.skyAtmosphereCommand, scene, context, passState); + } - if (environmentState.isSunVisible) { - environmentState.sunDrawCommand.execute(context, passState); - if (scene.sunBloom && !useWebVR) { - var framebuffer; - if (environmentState.useGlobeDepthFramebuffer) { - framebuffer = scene._globeDepth.framebuffer; - } else if (environmentState.useFXAA) { - framebuffer = scene._fxaa.getColorFramebuffer(); - } else { - framebuffer = environmentState.originalFramebuffer; + if (environmentState.isSunVisible) { + environmentState.sunDrawCommand.execute(context, passState); + if (scene.sunBloom && !useWebVR) { + var framebuffer; + if (environmentState.useGlobeDepthFramebuffer) { + framebuffer = scene._globeDepth.framebuffer; + } else if (environmentState.useFXAA) { + framebuffer = scene._fxaa.getColorFramebuffer(); + } else { + framebuffer = environmentState.originalFramebuffer; + } + scene._sunPostProcess.execute(context, framebuffer); + passState.framebuffer = framebuffer; } - scene._sunPostProcess.execute(context, framebuffer); - passState.framebuffer = framebuffer; } - } - // Moon can be seen through the atmosphere, since the sun is rendered after the atmosphere. - if (environmentState.isMoonVisible) { - environmentState.moonCommand.execute(context, passState); + // Moon can be seen through the atmosphere, since the sun is rendered after the atmosphere. + if (environmentState.isMoonVisible) { + environmentState.moonCommand.execute(context, passState); + } } // Determine how translucent surfaces will be handled. From 2e3b0debbc976160032f9fe8d4c0d0be2ccc30dd Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Wed, 4 Jan 2017 15:32:24 -0500 Subject: [PATCH 312/396] Mock deprecation warning function to fix failing test --- Source/Scene/Batched3DModel3DTileContent.js | 5 ++++- .../Scene/Batched3DModel3DTileContentSpec.js | 19 ++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/Source/Scene/Batched3DModel3DTileContent.js b/Source/Scene/Batched3DModel3DTileContent.js index 678e4050b48d..d51112ba0ed6 100644 --- a/Source/Scene/Batched3DModel3DTileContent.js +++ b/Source/Scene/Batched3DModel3DTileContent.js @@ -72,6 +72,9 @@ define([ this._features = undefined; } + // This can be overridden for testing purposes + Batched3DModel3DTileContent._deprecationWarning = deprecationWarning; + defineProperties(Batched3DModel3DTileContent.prototype, { /** * Part of the {@link Cesium3DTileContent} interface. @@ -183,7 +186,7 @@ define([ if (!defined(batchIdAttributeName)) { batchIdAttributeName = getAttributeOrUniformBySemantic(gltf, 'BATCHID'); if (defined(batchIdAttributeName)) { - deprecationWarning('b3dm-legacy-batchid', 'The glTF in this b3dm uses the semantic `BATCHID`. Application-specific semantics should be prefixed with an underscore: `_BATCHID`.'); + Batched3DModel3DTileContent._deprecationWarning('b3dm-legacy-batchid', 'The glTF in this b3dm uses the semantic `BATCHID`. Application-specific semantics should be prefixed with an underscore: `_BATCHID`.'); } } return batchIdAttributeName; diff --git a/Specs/Scene/Batched3DModel3DTileContentSpec.js b/Specs/Scene/Batched3DModel3DTileContentSpec.js index 182e05286be5..f1efc8846aa6 100644 --- a/Specs/Scene/Batched3DModel3DTileContentSpec.js +++ b/Specs/Scene/Batched3DModel3DTileContentSpec.js @@ -103,11 +103,20 @@ defineSuite([ }); it('logs deprecation warning for use of BATCHID without prefixed underscore', function() { - var deprecationWarningSpy = jasmine.createSpy(deprecationWarning); - return Cesium3DTilesTester.loadTileset(scene, withBatchTableUrl).then(function(tileset) { - expect(deprecationWarningSpy).toHaveBeenCalled(); - Cesium3DTilesTester.expectRenderTileset(scene, tileset); - }); + var called = false; + var originalDeprecationWarning = Batched3DModel3DTileContent._deprecationWarning; + Batched3DModel3DTileContent._deprecationWarning = function() { + called = true; + }; + return Cesium3DTilesTester.loadTileset(scene, withBatchTableUrl) + .then(function(tileset) { + expect(called).toEqual(true); + Cesium3DTilesTester.expectRenderTileset(scene, tileset); + Batched3DModel3DTileContent._deprecationWarning = originalDeprecationWarning; + }) + .otherwise(function() { + Batched3DModel3DTileContent._deprecationWarning = originalDeprecationWarning; + }); }); it('throws with empty gltf', function() { From a69beb5f7ab6dff915cc53c821a6d771483882ae Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Wed, 4 Jan 2017 16:09:43 -0500 Subject: [PATCH 313/396] Use spyOn --- Specs/Scene/Batched3DModel3DTileContentSpec.js | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/Specs/Scene/Batched3DModel3DTileContentSpec.js b/Specs/Scene/Batched3DModel3DTileContentSpec.js index f1efc8846aa6..255fd33acbb9 100644 --- a/Specs/Scene/Batched3DModel3DTileContentSpec.js +++ b/Specs/Scene/Batched3DModel3DTileContentSpec.js @@ -103,19 +103,11 @@ defineSuite([ }); it('logs deprecation warning for use of BATCHID without prefixed underscore', function() { - var called = false; - var originalDeprecationWarning = Batched3DModel3DTileContent._deprecationWarning; - Batched3DModel3DTileContent._deprecationWarning = function() { - called = true; - }; + spyOn(Batched3DModel3DTileContent, '_deprecationWarning'); return Cesium3DTilesTester.loadTileset(scene, withBatchTableUrl) .then(function(tileset) { - expect(called).toEqual(true); + expect(Batched3DModel3DTileContent._deprecationWarning).toHaveBeenCalled(); Cesium3DTilesTester.expectRenderTileset(scene, tileset); - Batched3DModel3DTileContent._deprecationWarning = originalDeprecationWarning; - }) - .otherwise(function() { - Batched3DModel3DTileContent._deprecationWarning = originalDeprecationWarning; }); }); From fdcb9aefed63b1faf6c839025417942601825439 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Wed, 4 Jan 2017 16:11:47 -0500 Subject: [PATCH 314/396] cleanup, octencode extrudeDirection --- Source/Core/GeometryPipeline.js | 76 ++++++++++++++----- Source/Renderer/AutomaticUniforms.js | 2 +- Source/Renderer/UniformState.js | 31 +++----- Source/Scene/GroundPrimitive.js | 37 ++++++++- .../Shaders/Builtin/Functions/octDecode.glsl | 3 + 5 files changed, 103 insertions(+), 46 deletions(-) diff --git a/Source/Core/GeometryPipeline.js b/Source/Core/GeometryPipeline.js index 448396bf69b1..13e121e2c431 100644 --- a/Source/Core/GeometryPipeline.js +++ b/Source/Core/GeometryPipeline.js @@ -1363,53 +1363,87 @@ define([ } //>>includeEnd('debug'); + var extrudeAttribute = geometry.attributes.extrudeDirection; + var i; + var index; + var numVertices; + if (defined(extrudeAttribute)) { + //only shadow volumes use extrudeDirection, and shadow volumes use vertexFormat: POSITION_ONLY so we don't need to check other attributes + var extrudeDirections = extrudeAttribute.values; + numVertices = extrudeDirections.length / 3.0; + var compressedDirections = new Float32Array(numVertices); + + for (i = 0; i < numVertices; ++i) { + index = i * 3.0; + Cartesian3.fromArray(extrudeDirections, index, toEncode1); + if (Cartesian3.equals(toEncode1, Cartesian3.ZERO)) { + continue; + } + compressedDirections[i] = AttributeCompression.octEncodeFloat(toEncode1); + } + + geometry.attributes.compressedAttributes = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 1, + values : compressedDirections + }); + delete geometry.attributes.extrudeDirection; + return geometry; + } + var normalAttribute = geometry.attributes.normal; var stAttribute = geometry.attributes.st; - if (!defined(normalAttribute) && !defined(stAttribute)) { + + var hasNormal = defined(normalAttribute); + var hasSt = defined(stAttribute); + if (!hasNormal && !hasSt) { return geometry; } var tangentAttribute = geometry.attributes.tangent; var binormalAttribute = geometry.attributes.binormal; + var hasTangent = defined(tangentAttribute); + var hasBinormal = defined(binormalAttribute); + var normals; var st; var tangents; var binormals; - if (defined(normalAttribute)) { + if (hasNormal) { normals = normalAttribute.values; } - if (defined(stAttribute)) { + if (hasSt) { st = stAttribute.values; } - if (defined(tangentAttribute)) { + if (hasTangent) { tangents = tangentAttribute.values; } - if (binormalAttribute) { + if (hasBinormal) { binormals = binormalAttribute.values; } - var length = defined(normals) ? normals.length : st.length; - var numComponents = defined(normals) ? 3.0 : 2.0; - var numVertices = length / numComponents; + var length = hasNormal ? normals.length : st.length; + var numComponents = hasNormal ? 3.0 : 2.0; + numVertices = length / numComponents; var compressedLength = numVertices; - var numCompressedComponents = defined(st) && defined(normals) ? 2.0 : 1.0; - numCompressedComponents += defined(tangents) || defined(binormals) ? 1.0 : 0.0; + var numCompressedComponents = hasSt && hasNormal ? 2.0 : 1.0; + numCompressedComponents += hasTangent || hasBinormal ? 1.0 : 0.0; compressedLength *= numCompressedComponents; var compressedAttributes = new Float32Array(compressedLength); var normalIndex = 0; - for (var i = 0; i < numVertices; ++i) { - if (defined(st)) { + for (i = 0; i < numVertices; ++i) { + if (hasSt) { Cartesian2.fromArray(st, i * 2.0, scratchCartesian2); compressedAttributes[normalIndex++] = AttributeCompression.compressTextureCoordinates(scratchCartesian2); } - var index = i * 3.0; - if (defined(normals) && defined(tangents) && defined(binormals)) { + index = i * 3.0; + if (hasNormal && defined(tangents) && defined(binormals)) { Cartesian3.fromArray(normals, index, toEncode1); Cartesian3.fromArray(tangents, index, toEncode2); Cartesian3.fromArray(binormals, index, toEncode3); @@ -1418,17 +1452,17 @@ define([ compressedAttributes[normalIndex++] = scratchCartesian2.x; compressedAttributes[normalIndex++] = scratchCartesian2.y; } else { - if (defined(normals)) { + if (hasNormal) { Cartesian3.fromArray(normals, index, toEncode1); compressedAttributes[normalIndex++] = AttributeCompression.octEncodeFloat(toEncode1); } - if (defined(tangents)) { + if (hasTangent) { Cartesian3.fromArray(tangents, index, toEncode1); compressedAttributes[normalIndex++] = AttributeCompression.octEncodeFloat(toEncode1); } - if (defined(binormals)) { + if (hasBinormal) { Cartesian3.fromArray(binormals, index, toEncode1); compressedAttributes[normalIndex++] = AttributeCompression.octEncodeFloat(toEncode1); } @@ -1441,16 +1475,16 @@ define([ values : compressedAttributes }); - if (defined(normals)) { + if (hasNormal) { delete geometry.attributes.normal; } - if (defined(st)) { + if (hasSt) { delete geometry.attributes.st; } - if (defined(tangents)) { + if (hasTangent) { delete geometry.attributes.tangent; } - if (defined(binormals)) { + if (hasBinormal) { delete geometry.attributes.binormal; } diff --git a/Source/Renderer/AutomaticUniforms.js b/Source/Renderer/AutomaticUniforms.js index f520cf0aedf4..6f71025bf1cb 100644 --- a/Source/Renderer/AutomaticUniforms.js +++ b/Source/Renderer/AutomaticUniforms.js @@ -1488,7 +1488,7 @@ define([ size: 1, datatype: WebGLConstants.FLOAT, getValue: function(uniformState) { - return uniformState.pixelSizePerMeter * uniformState.maximumScreenSpaceError; + return uniformState.geometricToleranceOverMeter; } }) }; diff --git a/Source/Renderer/UniformState.js b/Source/Renderer/UniformState.js index 6818f9f5e222..e0f77ea724d3 100644 --- a/Source/Renderer/UniformState.js +++ b/Source/Renderer/UniformState.js @@ -151,6 +151,7 @@ define([ this._fogDensity = undefined; this._pixelSizePerMeter = undefined; + this._geometricToleranceOverMeter = undefined; } defineProperties(UniformState.prototype, { @@ -770,26 +771,13 @@ define([ }, /** - * The maximum screen-space error used to drive level-of-detail refinement. Higher - * values will provide better performance but lower visual quality. - * - * @type {Number} - * @default 2 - */ - maximumScreenSpaceError: { - get: function() { - return this._frameState.maximumScreenSpaceError; - } - }, - - /** - * The size of one pixel in meters - * + * A scalar that represents the geometric tolerance per meter + * @memberof UniformStat.prototype * @type {Number} */ - pixelSizePerMeter: { + geometricToleranceOverMeter: { get: function() { - return this._pixelSizePerMeter; + return this._geometricToleranceOverMeter; } }, @@ -964,11 +952,14 @@ define([ var fov = camera.frustum.fov; var viewport = this._viewport; - if (viewport.width > viewport.height * camera.frustum.aspectRatio) { - this._pixelSizePerMeter = Math.tan(0.5 * fov) * 2.0 / viewport.width; + var pixelSizePerMeter; + if (viewport.height > viewport.width) { + pixelSizePerMeter = Math.tan(0.5 * fov) * 2.0 / viewport.height; } else { - this._pixelSizePerMeter = Math.tan(0.5 * fov) * 2.0 / viewport.height; + pixelSizePerMeter = Math.tan(0.5 * fov) * 2.0 / viewport.width; } + + this._geometricToleranceOverMeter = pixelSizePerMeter * frameState.maximumScreenSpaceError; }; function cleanViewport(uniformState) { diff --git a/Source/Scene/GroundPrimitive.js b/Source/Scene/GroundPrimitive.js index b01058f7e7fe..d87ef7ed5bb4 100644 --- a/Source/Scene/GroundPrimitive.js +++ b/Source/Scene/GroundPrimitive.js @@ -734,19 +734,48 @@ define([ groundPrimitive._rsPickPass = RenderState.fromCache(pickRenderState); } + function modifyForEncodedNormals(primitive, vertexShaderSource) { + if (!primitive.compressVertices) { + return vertexShaderSource; + } + + if (vertexShaderSource.search(/attribute\s+vec3\s+extrudeDirection;/g) !== -1) { + var attributeName = 'compressedAttributes'; + + //only shadow volumes use extrudeDirection, and shadow volumes use vertexFormat: POSITION_ONLY so we don't need to check other attributes + var attributeDecl = 'attribute float ' + attributeName + ';'; + + var globalDecl = 'vec3 extrudeDirection;\n'; + var decode = ' extrudeDirection = czm_octDecode(' + attributeName + ');\n'; + + var modifiedVS = vertexShaderSource; + modifiedVS = modifiedVS.replace(/attribute\s+vec3\s+extrudeDirection;/g, ''); + modifiedVS = ShaderSource.replaceMain(modifiedVS, 'czm_non_compressed_main'); + var compressedMain = + 'void main() \n' + + '{ \n' + + decode + + ' czm_non_compressed_main(); \n' + + '}'; + + return [attributeDecl, globalDecl, modifiedVS, compressedMain].join('\n'); + } + } + function createShaderProgram(groundPrimitive, frameState, appearance) { if (defined(groundPrimitive._sp)) { return; } var context = frameState.context; - + var primitive = groundPrimitive._primitive; var vs = ShadowVolumeVS; vs = groundPrimitive._primitive._batchTable.getVertexShaderCallback()(vs); - vs = Primitive._appendShowToShader(groundPrimitive._primitive, vs); - vs = Primitive._appendDistanceDisplayConditionToShader(groundPrimitive._primitive, vs); + vs = Primitive._appendShowToShader(primitive, vs); + vs = Primitive._appendDistanceDisplayConditionToShader(primitive, vs); vs = Primitive._modifyShaderPosition(groundPrimitive, vs, frameState.scene3DOnly); - vs = Primitive._updateColorAttribute(groundPrimitive._primitive, vs); + vs = Primitive._updateColorAttribute(primitive, vs); + vs = modifyForEncodedNormals(primitive, vs); var fs = ShadowVolumeFS; var attributeLocations = groundPrimitive._primitive._attributeLocations; diff --git a/Source/Shaders/Builtin/Functions/octDecode.glsl b/Source/Shaders/Builtin/Functions/octDecode.glsl index 4fe85a220bb6..5a224b9552c1 100644 --- a/Source/Shaders/Builtin/Functions/octDecode.glsl +++ b/Source/Shaders/Builtin/Functions/octDecode.glsl @@ -30,6 +30,9 @@ */ vec3 czm_octDecode(float encoded) { + if (encoded == 0.0) { + return vec3(0.0, 0.0, 0.0); + } float temp = encoded / 256.0; float x = floor(temp); float y = (temp - x) * 256.0; From 56eec834e8d24d4e631c8baf88c10079b2a2f9ad Mon Sep 17 00:00:00 2001 From: hpinkos Date: Wed, 4 Jan 2017 16:15:52 -0500 Subject: [PATCH 315/396] CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 9bbc1d66ba52..7119c3548f4e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ Change Log ### 1.30 - 2017-02-01 * Updated the morph so the default view in Columbus View is now angled. [#3878](https://github.com/AnalyticalGraphicsInc/cesium/issues/3878) +* Fixed bug where `GroundPrimitives` where rendering incorrectly or disappearing at different zoom levels. [#4161](https://github.com/AnalyticalGraphicsInc/cesium/issues/4161) [#4326](https://github.com/AnalyticalGraphicsInc/cesium/issues/4326) * Fixed sky atmosphere from causing incorrect picking and hanging drill picking. [#4783](https://github.com/AnalyticalGraphicsInc/cesium/issues/4783) and [#4784](https://github.com/AnalyticalGraphicsInc/cesium/issues/4784) ### 1.29 - 2017-01-02 From 7d52c003b79e3c9d39cfc2237fcfa7926fe10884 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Wed, 4 Jan 2017 17:43:04 -0500 Subject: [PATCH 316/396] cleanup --- Source/Core/CartographicGeocoderService.js | 28 +++++++++----------- Source/Widgets/Geocoder/GeocoderViewModel.js | 19 ++++++------- 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/Source/Core/CartographicGeocoderService.js b/Source/Core/CartographicGeocoderService.js index 19beb25f0dbf..e7475fcdcca1 100644 --- a/Source/Core/CartographicGeocoderService.js +++ b/Source/Core/CartographicGeocoderService.js @@ -38,25 +38,21 @@ define([ } //>>includeEnd('debug'); - try { - var splitQuery = query.match(/[^\s,\n]+/g); - if ((splitQuery.length === 2) || (splitQuery.length === 3)) { - var longitude = +splitQuery[0]; - var latitude = +splitQuery[1]; - var height = (splitQuery.length === 3) ? +splitQuery[2] : 300.0; + var splitQuery = query.match(/[^\s,\n]+/g); + if ((splitQuery.length === 2) || (splitQuery.length === 3)) { + var longitude = +splitQuery[0]; + var latitude = +splitQuery[1]; + var height = (splitQuery.length === 3) ? +splitQuery[2] : 300.0; - if (!isNaN(longitude) && !isNaN(latitude) && !isNaN(height)) { - var result = { - displayName: query, - destination: Cartesian3.fromDegrees(longitude, latitude, height) - }; - return when.resolve([result]); - } + if (!isNaN(longitude) && !isNaN(latitude) && !isNaN(height)) { + var result = { + displayName: query, + destination: Cartesian3.fromDegrees(longitude, latitude, height) + }; + return when.resolve([result]); } - return when.resolve([]); - } catch (e) { - when.reject(e); } + return when.resolve([]); }; return CartographicGeocoderService; diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index a45e3a82cb28..4a1b55581530 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -10,7 +10,6 @@ define([ '../../Core/DeveloperError', '../../Core/Event', '../../Core/CartographicGeocoderService', - '../../Core/loadJsonp', '../../Core/Matrix4', '../../Core/Rectangle', '../../ThirdParty/knockout', @@ -28,7 +27,6 @@ define([ DeveloperError, Event, CartographicGeocoderService, - loadJsonp, Matrix4, Rectangle, knockout, @@ -44,7 +42,7 @@ define([ * * @param {Object} options Object with the following properties: * @param {Scene} options.scene The Scene instance to use. - * @param {GeocoderService[]} [geocoderServices] Geocoder services to use for geocoding queries. + * @param {GeocoderService[]} [options.geocoderServices] Geocoder services to use for geocoding queries. * If more than one are supplied, suggestions will be gathered for the geocoders that support it, * and if no suggestion is selected the result from the first geocoder service wil be used. * @param {String} [options.url='https://dev.virtualearth.net'] The base URL of the Bing Maps API. @@ -357,6 +355,10 @@ define([ } }); + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ GeocoderViewModel.prototype.destroy = function() { this._suggestionSubscription.dispose(); }; @@ -408,16 +410,11 @@ define([ var nextPromise = geocoderService.geocode(query) .then(function (result) { return {state: 'fulfilled', value: result}; - }); - if (defined(nextPromise.otherwise)) { - nextPromise.otherwise(function (err) { + }) + .otherwise(function (err) { return {state: 'rejected', reason: err}; }); - } else if (defined(nextPromise.catch)) { - nextPromise.catch(function (err) { - return {state: 'rejected', reason: err}; - }); - } + return nextPromise; }); } From fe099fd4bbd668c6092c6ae57c6899da8beefe68 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Wed, 4 Jan 2017 18:02:49 -0500 Subject: [PATCH 317/396] Tweak Coding Guide working --- Documentation/Contributors/CodingGuide/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/Contributors/CodingGuide/README.md b/Documentation/Contributors/CodingGuide/README.md index dd3ad90d9324..72ba88ce27bc 100644 --- a/Documentation/Contributors/CodingGuide/README.md +++ b/Documentation/Contributors/CodingGuide/README.md @@ -383,9 +383,9 @@ Some common sensible defaults are ### Throwing Exceptions -Use the methods of Cesium's [Check](https://github.com/AnalyticalGraphicsInc/cesium/blob/master/Source/Core/Check.js) class to throw a `DeveloperError` when the user has a coding error. The most common errors are parameters that are missing, have the wrong type or are out of rangers of the wrong type or are out of range. +Use the functions of Cesium's [Check](https://github.com/AnalyticalGraphicsInc/cesium/blob/master/Source/Core/Check.js) class to throw a `DeveloperError` when the user has a coding error. The most common errors are parameters that are missing, have the wrong type or are out of rangers of the wrong type or are out of range. -* For example, to check that a parameter is an object: +* For example, to check that a parameter is defined and is an object: ```javascript Cartesian3.maximumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); From 97f10a76a57d86723548061458f3391e468f2009 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Wed, 4 Jan 2017 18:05:58 -0500 Subject: [PATCH 318/396] fix search dropdown --- Source/Widgets/Geocoder/GeocoderViewModel.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index 4a1b55581530..88058f912319 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -423,6 +423,7 @@ define([ var query = viewModel._searchText; if (hasOnlyWhitespace(query)) { + viewModel.showSuggestions(); return; } @@ -436,7 +437,7 @@ define([ viewModel._geocodePromise = promise; promise .then(function (result) { - if (promise.cancel || promise !== viewModel._geocodePromise) { + if (promise.cancel) { return; } viewModel._isSearchInProgress = false; From c7131b7aa4f45543721a631c603cab0bdabf4e80 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Wed, 4 Jan 2017 21:36:42 -0500 Subject: [PATCH 319/396] Change to _BATCHID in modelMaterialsCommon --- Source/Scene/modelMaterialsCommon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Scene/modelMaterialsCommon.js b/Source/Scene/modelMaterialsCommon.js index 9d1ca8abe7d6..69f3a6182337 100644 --- a/Source/Scene/modelMaterialsCommon.js +++ b/Source/Scene/modelMaterialsCommon.js @@ -353,7 +353,7 @@ define([ if (options.addBatchIdToGeneratedShaders) { techniqueAttributes.a_batchId = 'batchId'; techniqueParameters.batchId = { - semantic: 'BATCHID', + semantic: '_BATCHID', type: WebGLConstants.FLOAT }; vertexShader += 'attribute float a_batchId;\n'; From f96621e066d8b59c039d4502b19b8cd48dd0065b Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Thu, 5 Jan 2017 16:28:53 +1100 Subject: [PATCH 320/396] Update CHANGES.md. --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 9bbc1d66ba52..a6c5f56c7a76 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,7 @@ Change Log * Updated the morph so the default view in Columbus View is now angled. [#3878](https://github.com/AnalyticalGraphicsInc/cesium/issues/3878) * Fixed sky atmosphere from causing incorrect picking and hanging drill picking. [#4783](https://github.com/AnalyticalGraphicsInc/cesium/issues/4783) and [#4784](https://github.com/AnalyticalGraphicsInc/cesium/issues/4784) +* Fixed a bug that could cause a "readyImagery is not actually ready" exception when quickly zooming past the maximum available imagery level of an imagery layer near the poles. ### 1.29 - 2017-01-02 From 196a6b6b4f1be20a32c170d10ad4d9717dd204de Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Thu, 5 Jan 2017 17:03:35 +1100 Subject: [PATCH 321/396] Add test. --- Specs/Scene/TileImagerySpec.js | 66 ++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Specs/Scene/TileImagerySpec.js diff --git a/Specs/Scene/TileImagerySpec.js b/Specs/Scene/TileImagerySpec.js new file mode 100644 index 000000000000..3583f74ad73a --- /dev/null +++ b/Specs/Scene/TileImagerySpec.js @@ -0,0 +1,66 @@ +/*global defineSuite*/ +defineSuite([ + 'Scene/TileImagery', + 'Scene/ImageryState' + ], function( + TileImagery, + ImageryState) { + 'use strict'; + + it('does not use ancestor ready imagery that needs to be reprojected', function() { + var imageryLayer = { + _calculateTextureTranslationAndScale: function() {} + }; + + var grandparentImagery = { + imageryLayer: imageryLayer, + level: 0, + x: 0, + y: 0, + state: ImageryState.READY, + texture: {}, + textureWebMercator: {}, + addReference: function() {} + }; + + var parentImagery = { + imageryLayer: imageryLayer, + parent: grandparentImagery, + level: 1, + x: 0, + y: 0, + state: ImageryState.READY, + texture: undefined, + textureWebMercator: {}, + processStateMachine: function() { + ++this.processStateMachineCalls; + }, + processStateMachineCalls: 0, + addReference: function() {} + }; + + var thisImagery = { + imageryLayer: imageryLayer, + parent: parentImagery, + level: 2, + x: 0, + y: 0, + state: ImageryState.FAILED, + processStateMachine: function() {}, + addReference: function() {} + } + + // This TileImagery needs reprojected imagery, and: + // * thisImagery has failed + // * parentImagery needs to be reprojected + // * grandparentImagery is good to go + // When we process the state machine, it should selected grandparentImagery for rendering + // and process the state machine of parentImagery. + var tileImagery = new TileImagery(thisImagery, undefined, false); + + tileImagery.processStateMachine({}, {}); + + expect(tileImagery.readyImagery).toBe(grandparentImagery); + expect(parentImagery.processStateMachineCalls).toBe(1); + }); +}); From b970c07f2e1580b7246bf6eca36d615444c13a6e Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Thu, 5 Jan 2017 17:20:04 +1100 Subject: [PATCH 322/396] Add missing semicolons. --- Specs/Scene/TileImagerySpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Specs/Scene/TileImagerySpec.js b/Specs/Scene/TileImagerySpec.js index 3583f74ad73a..a715df4c1f92 100644 --- a/Specs/Scene/TileImagerySpec.js +++ b/Specs/Scene/TileImagerySpec.js @@ -48,7 +48,7 @@ defineSuite([ state: ImageryState.FAILED, processStateMachine: function() {}, addReference: function() {} - } + }; // This TileImagery needs reprojected imagery, and: // * thisImagery has failed From 7c8f5f4ebbaabec23dd0d764700e1b7d868b32c2 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Thu, 5 Jan 2017 10:32:07 +0100 Subject: [PATCH 323/396] Update release numbers since this was delayed --- CHANGES.md | 2 +- Source/Widgets/Geocoder/GeocoderViewModel.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index caaf5980ecf8..0feb998afd60 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,7 +3,7 @@ Change Log ### 1.30 - 2017-02-01 * Deprecated - * The properties `url` and `key` will be removed from `GeocoderViewModel` in 1.30. These properties will be available on geocoder services that support them, like `BingMapsGeocoderService`. + * The properties `url` and `key` will be removed from `GeocoderViewModel` in 1.31. These properties will be available on geocoder services that support them, like `BingMapsGeocoderService`. * Added support for custom geocoder services and autocomplete [#4723](https://github.com/AnalyticalGraphicsInc/cesium/pull/4723). * Added [Custom Geocoder Sandcastle example](http://localhost:8080/Apps/Sandcastle/index.html?src=Custom%20Geocoder.html) * Added `GeocoderService`, an interface for geocoders. diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index 88058f912319..e1ebc2e3068d 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -275,7 +275,7 @@ define([ */ url : { get : function() { - deprecationWarning('url is deprecated', 'The url property was deprecated in Cesium 1.29 and will be removed in version 1.30.'); + deprecationWarning('url is deprecated', 'The url property was deprecated in Cesium 1.30 and will be removed in version 1.31.'); return this._url; } }, @@ -289,7 +289,7 @@ define([ */ key : { get : function() { - deprecationWarning('key is deprecated', 'The key property was deprecated in Cesium 1.29 and will be removed in version 1.30.'); + deprecationWarning('key is deprecated', 'The key property was deprecated in Cesium 1.30 and will be removed in version 1.31.'); return this._key; } }, From cb0107319ddfa9179ea477fdbdc2f5f6734b5dcb Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Thu, 5 Jan 2017 15:05:00 -0500 Subject: [PATCH 324/396] Initial support for transcoding textures from crunch to DXT. --- Source/Core/CompressedTextureBuffer.js | 68 +++++++++++ Source/Core/loadCRN.js | 157 +++++++++++++++++++++++++ Source/Core/loadKTX.js | 62 +--------- Source/Scene/Model.js | 5 + Source/ThirdParty/crunch.js | 28 +++++ 5 files changed, 260 insertions(+), 60 deletions(-) create mode 100644 Source/Core/CompressedTextureBuffer.js create mode 100644 Source/Core/loadCRN.js create mode 100644 Source/ThirdParty/crunch.js diff --git a/Source/Core/CompressedTextureBuffer.js b/Source/Core/CompressedTextureBuffer.js new file mode 100644 index 000000000000..dc0835944667 --- /dev/null +++ b/Source/Core/CompressedTextureBuffer.js @@ -0,0 +1,68 @@ +/*global define*/ +define([ + './defineProperties' + ], function( + defineProperties + ) { + 'use strict'; + + /** + * Describes a compressed texture and contains a compressed texture buffer. + * + * @param {PixelFormat} internalFormat The pixel format of the compressed texture. + * @param {Number} width The width of the texture. + * @param {Number} height The height of the texture. + * @param {Uint8Array} buffer The compressed texture buffer. + */ + function CompressedTextureBuffer(internalFormat, width, height, buffer) { + this._format = internalFormat; + this._width = width; + this._height = height; + this._buffer = buffer; + } + + defineProperties(CompressedTextureBuffer.prototype, { + /** + * The format of the compressed texture. + * @type PixelFormat + * @readonly + */ + internalFormat : { + get : function() { + return this._format; + } + }, + /** + * The width of the texture. + * @type Number + * @readonly + */ + width : { + get : function() { + return this._width; + } + }, + /** + * The height of the texture. + * @type Number + * @readonly + */ + height : { + get : function() { + return this._height; + } + }, + /** + * The compressed texture buffer. + * @type Uint8Array + * @readonly + */ + bufferView : { + get : function() { + return this._buffer; + } + } + }); + + return CompressedTextureBuffer; +}); \ No newline at end of file diff --git a/Source/Core/loadCRN.js b/Source/Core/loadCRN.js new file mode 100644 index 000000000000..f7466f41ed66 --- /dev/null +++ b/Source/Core/loadCRN.js @@ -0,0 +1,157 @@ +/*global define*/ +define([ + './CompressedTextureBuffer', + './defined', + './defineProperties', + './DeveloperError', + './loadArrayBuffer', + './PixelFormat', + './RuntimeError', + '../ThirdParty/crunch', + '../ThirdParty/when' +], function( + CompressedTextureBuffer, + defined, + defineProperties, + DeveloperError, + loadArrayBuffer, + PixelFormat, + RuntimeError, + crunch, + when) { + 'use strict'; + + // Modified from: https://github.com/toji/texture-tester/blob/master/js/webgl-texture-util.js + // Also see: http://toji.github.io/texture-tester/ + + /* Copyright (c) 2014, Brandon Jones. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + + // Taken from crnlib.h + var CRN_FORMAT = { + cCRNFmtInvalid: -1, + + cCRNFmtDXT1: 0, + // cCRNFmtDXT3 is not currently supported when writing to CRN - only DDS. + cCRNFmtDXT3: 1, + cCRNFmtDXT5: 2 + + // Crunch supports more formats than this, but we can't use them here. + }; + + // Mapping of Crunch formats to DXT formats. + var DXT_FORMAT_MAP = {}; + DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT1] = PixelFormat.RGB_DXT1; + DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT3] = PixelFormat.RGBA_DXT3; + DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT5] = PixelFormat.RGBA_DXT5; + + + var dst; + var dxtData; + var cachedDstSize = 0; + + // Copy an array of bytes into or out of the emscripten heap. + function arrayBufferCopy(src, dst, dstByteOffset, numBytes) { + var i; + var dst32Offset = dstByteOffset / 4; + var tail = (numBytes % 4); + var src32 = new Uint32Array(src.buffer, 0, (numBytes - tail) / 4); + var dst32 = new Uint32Array(dst.buffer); + for (i = 0; i < src32.length; i++) { + dst32[dst32Offset + i] = src32[i]; + } + for (i = numBytes - tail; i < numBytes; i++) { + dst[dstByteOffset + i] = src[i]; + } + } + + function decompressCRN(arrayBuffer) { + // Copy the contents of the arrayBuffer into emscriptens heap. + var srcSize = arrayBuffer.byteLength; + var bytes = new Uint8Array(arrayBuffer); + var src = crunch._malloc(srcSize); + arrayBufferCopy(bytes, crunch.HEAPU8, src, srcSize); + + // Determine what type of compressed data the file contains. + var crnFormat = crunch._crn_get_dxt_format(src, srcSize); + var format = DXT_FORMAT_MAP[crnFormat]; + if (!defined(format)) { + throw new RuntimeError("Unsupported DXT format"); + } + + // Gather basic metrics about the DXT data. + var levels = crunch._crn_get_levels(src, srcSize); + var width = crunch._crn_get_width(src, srcSize); + var height = crunch._crn_get_height(src, srcSize); + + // Determine the size of the decoded DXT data. + var dstSize = 0; + var i; + for (i = 0; i < levels; ++i) { + dstSize += PixelFormat.compressedTextureSize(format, width >> i, height >> i); + } + + // Allocate enough space on the emscripten heap to hold the decoded DXT data + // or reuse the existing allocation if a previous call to this function has + // already acquired a large enough buffer. + if(cachedDstSize < dstSize) { + if(defined(dst)) { + crunch._free(dst); + } + dst = crunch._malloc(dstSize); + dxtData = new Uint8Array(crunch.HEAPU8.buffer, dst, dstSize); + cachedDstSize = dstSize; + } + + // Decompress the DXT data from the Crunch file into the allocated space. + crunch._crn_decompress(src, srcSize, dst, dstSize, 0, levels); + + // Release the crunch file data from the emscripten heap. + crunch._free(src); + + // Mipmaps are unsupported, so copy the level 0 texture + // When mipmaps are supported, a copy will still be necessary as dxtData is a view on the heap. + var level0DXTData = dxtData.slice(0, PixelFormat.compressedTextureSize(format, width, height)); + return new CompressedTextureBuffer(format, width, height, level0DXTData); + } + + function loadCRN(urlOrBuffer, headers) { + //>>includeStart('debug', pragmas.debug); + if (!defined(urlOrBuffer)) { + throw new DeveloperError('urlOrBuffer is required.'); + } + //>>includeEnd('debug'); + + var loadPromise; + if (urlOrBuffer instanceof ArrayBuffer || ArrayBuffer.isView(urlOrBuffer)) { + loadPromise = when.resolve(urlOrBuffer); + } else { + loadPromise = loadArrayBuffer(urlOrBuffer, headers); + } + + return loadPromise.then(function(data) { + return decompressCRN(data); + }); + } + + return loadCRN; +}); \ No newline at end of file diff --git a/Source/Core/loadKTX.js b/Source/Core/loadKTX.js index 03622acc8819..6c7570f0ff76 100644 --- a/Source/Core/loadKTX.js +++ b/Source/Core/loadKTX.js @@ -1,16 +1,16 @@ /*global define*/ define([ '../ThirdParty/when', + './CompressedTextureBuffer', './defined', - './defineProperties', './DeveloperError', './loadArrayBuffer', './PixelFormat', './RuntimeError' ], function( when, + CompressedTextureBuffer, defined, - defineProperties, DeveloperError, loadArrayBuffer, PixelFormat, @@ -88,64 +88,6 @@ define([ }); } - /** - * Describes a compressed texture and contains a compressed texture buffer. - * - * @param {PixelFormat} internalFormat The pixel format of the compressed texture. - * @param {Number} width The width of the texture. - * @param {Number} height The height of the texture. - * @param {Uint8Array} buffer The compressed texture buffer. - */ - function CompressedTextureBuffer(internalFormat, width, height, buffer) { - this._format = internalFormat; - this._width = width; - this._height = height; - this._buffer = buffer; - } - - defineProperties(CompressedTextureBuffer.prototype, { - /** - * The format of the compressed texture. - * @type PixelFormat - * @readonly - */ - internalFormat : { - get : function() { - return this._format; - } - }, - /** - * The width of the texture. - * @type Number - * @readonly - */ - width : { - get : function() { - return this._width; - } - }, - /** - * The height of the texture. - * @type Number - * @readonly - */ - height : { - get : function() { - return this._height; - } - }, - /** - * The compressed texture buffer. - * @type Uint8Array - * @readonly - */ - bufferView : { - get : function() { - return this._buffer; - } - } - }); - var fileIdentifier = [0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A]; var endiannessTest = 0x04030201; diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 6b0f942f74a5..8ab54a42628f 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -21,6 +21,7 @@ define([ '../Core/getStringFromTypedArray', '../Core/IndexDatatype', '../Core/loadArrayBuffer', + '../Core/loadCRN', '../Core/loadImage', '../Core/loadImageFromTypedArray', '../Core/loadKTX', @@ -86,6 +87,7 @@ define([ getStringFromTypedArray, IndexDatatype, loadArrayBuffer, + loadCRN, loadImage, loadImageFromTypedArray, loadKTX, @@ -1403,6 +1405,7 @@ define([ } var ktxRegex = /(^data:image\/ktx)|(\.ktx$)/i; + var crnRegex = /(^data:image\/crn)|(\.crn$)/i; function parseTextures(model) { var images = model.gltf.images; @@ -1427,6 +1430,8 @@ define([ if (ktxRegex.test(imagePath)) { loadKTX(imagePath).then(imageLoad(model, id)).otherwise(getFailedLoadFunction(model, 'image', imagePath)); + } else if (crnRegex.test(imagePath)) { + loadCRN(imagePath).then(imageLoad(model, id)).otherwise(getFailedLoadFunction(model, 'image', imagePath)); } else { loadImage(imagePath).then(imageLoad(model, id)).otherwise(getFailedLoadFunction(model, 'image', imagePath)); } diff --git a/Source/ThirdParty/crunch.js b/Source/ThirdParty/crunch.js new file mode 100644 index 000000000000..48b28bc45c8c --- /dev/null +++ b/Source/ThirdParty/crunch.js @@ -0,0 +1,28 @@ +/*global define*/ +define([], function() { + + // crunch/crnlib v1.04 - Advanced DXTn texture compression library + // Copyright (C) 2010-2016 Richard Geldreich, Jr. and Binomial LLC http://binomial.info + + // This software uses the ZLIB license, which is located in license.txt. + // http://opensource.org/licenses/Zlib + + // The crunch C++ code was compiled to Javascript with Emcripten: + // emcc -O3 crn.cpp -I./inc -s EXPORTED_FUNCTIONS="['_malloc', '_free', '_crn_get_width', '_crn_get_height', '_crn_get_levels', '_crn_get_dxt_format', '_crn_get_bytes_per_block', '_crn_get_uncompressed_size', '_crn_decompress']" -s NO_EXIT_RUNTIME=1 -s NO_FILESYSTEM=1 -s ELIMINATE_DUPLICATE_FUNCTIONS=1 -s ALLOW_MEMORY_GROWTH=1 --memory-init-file 0 -o crunch.js + + + var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=function print(x){process["stdout"].write(x+"\n")};if(!Module["printErr"])Module["printErr"]=function printErr(x){process["stderr"].write(x+"\n")};var nodeFS=require("fs");var nodePath=require("path");Module["read"]=function read(filename,binary){filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);if(!ret&&filename!=nodePath["resolve"](filename)){filename=path.join(__dirname,"..","src",filename);ret=nodeFS["readFileSync"](filename)}if(ret&&!binary)ret=ret.toString();return ret};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f))};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function read(){throw"no read() available (jsc?)"}}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function printErr(x){console.log(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){eval.call(null,x)}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}var Runtime={setTempRet0:(function(value){tempRet0=value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){if(!args.splice)args=Array.prototype.slice.call(args);args.splice(0,0,ptr);return Module["dynCall_"+sig].apply(null,args)}else{return Module["dynCall_"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i=TOTAL_MEMORY){var success=enlargeMemory();if(!success){DYNAMICTOP=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module["Runtime"]=Runtime;var __THREW__=0;var ABORT=false;var EXITSTATUS=0;var undef=0;var tempValue,tempInt,tempBigInt,tempInt2,tempBigInt2,tempPair,tempBigIntI,tempBigIntR,tempBigIntS,tempBigIntP,tempBigIntD,tempDouble,tempFloat;var tempI64,tempI64b;var tempRet0,tempRet1,tempRet2,tempRet3,tempRet4,tempRet5,tempRet6,tempRet7,tempRet8,tempRet9;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var globalScope=this;function getCFunc(ident){var func=Module["_"+ident];if(!func){try{func=eval("_"+ident)}catch(e){}}assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)");return func}var cwrap,ccall;((function(){var JSfuncs={"stackSave":(function(){Runtime.stackSave()}),"stackRestore":(function(){Runtime.stackRestore()}),"arrayToC":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=Runtime.stackAlloc((str.length<<2)+1);writeStringToMemory(str,ret)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}Module["setValue"]=setValue;function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type)}return null}Module["getValue"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module["ALLOC_NORMAL"]=ALLOC_NORMAL;Module["ALLOC_STACK"]=ALLOC_STACK;Module["ALLOC_STATIC"]=ALLOC_STATIC;Module["ALLOC_DYNAMIC"]=ALLOC_DYNAMIC;Module["ALLOC_NONE"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[_malloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module["UTF8ToString"](ptr)}Module["Pointer_stringify"]=Pointer_stringify;function AsciiToString(ptr){var str="";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module["AsciiToString"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module["stringToAscii"]=stringToAscii;function UTF8ArrayToString(u8Array,idx){var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}Module["UTF8ArrayToString"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module["UTF8ToString"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module["stringToUTF8Array"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module["stringToUTF8"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module["lengthBytesUTF8"]=lengthBytesUTF8;function UTF16ToString(ptr){var i=0;var str="";while(1){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)return str;++i;str+=String.fromCharCode(codeUnit)}}Module["UTF16ToString"]=UTF16ToString;function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}Module["stringToUTF16"]=stringToUTF16;function lengthBytesUTF16(str){return str.length*2}Module["lengthBytesUTF16"]=lengthBytesUTF16;function UTF32ToString(ptr){var i=0;var str="";while(1){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)return str;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}}Module["UTF32ToString"]=UTF32ToString;function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}Module["stringToUTF32"]=stringToUTF32;function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}Module["lengthBytesUTF32"]=lengthBytesUTF32;function demangle(func){var hasLibcxxabi=!!Module["___cxa_demangle"];if(hasLibcxxabi){try{var buf=_malloc(func.length);writeStringToMemory(func.substr(1),buf);var status=_malloc(4);var ret=Module["___cxa_demangle"](buf,0,0,status);if(getValue(status,"i32")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}}var i=3;var basicTypes={"v":"void","b":"bool","c":"char","s":"short","i":"int","l":"long","f":"float","d":"double","w":"wchar_t","a":"signed char","h":"unsigned char","t":"unsigned short","j":"unsigned int","m":"unsigned long","x":"long long","y":"unsigned long long","z":"..."};var subs=[];var first=true;function dump(x){if(x)Module.print(x);Module.print(func);var pre="";for(var a=0;a"}else{ret=name}paramLoop:while(i0){var c=func[i++];if(c in basicTypes){list.push(basicTypes[c])}else{switch(c){case"P":list.push(parse(true,1,true)[0]+"*");break;case"R":list.push(parse(true,1,true)[0]+"&");break;case"L":{i++;var end=func.indexOf("E",i);var size=end-i;list.push(func.substr(i,size));i+=size+2;break};case"A":{var size=parseInt(func.substr(i));i+=size.toString().length;if(func[i]!=="_")throw"?";i++;list.push(parse(true,1,true)[0]+" ["+size+"]");break};case"E":break paramLoop;default:ret+="?"+c;break paramLoop}}}if(!allowVoid&&list.length===1&&list[0]==="void")list=[];if(rawList){if(ret){list.push(ret+"?")}return list}else{return ret+flushList()}}var parsed=func;try{if(func=="Object._main"||func=="_main"){return"main()"}if(typeof func==="number")func=Pointer_stringify(func);if(func[0]!=="_")return func;if(func[1]!=="_")return func;if(func[2]!=="Z")return func;switch(func[3]){case"n":return"operator new()";case"d":return"operator delete()"}parsed=parse()}catch(e){parsed+="?"}if(parsed.indexOf("?")>=0&&!hasLibcxxabi){Runtime.warnOnce("warning: a problem occurred in builtin C++ name demangling; build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling")}return parsed}function demangleAll(text){return text.replace(/__Z[\w\d_]+/g,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){return demangleAll(jsStackTrace())}Module["stackTrace"]=stackTrace;var PAGE_SIZE=4096;function alignMemoryPage(x){if(x%4096>0){x+=4096-x%4096}return x}var HEAP;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var STATIC_BASE=0,STATICTOP=0,staticSealed=false;var STACK_BASE=0,STACKTOP=0,STACK_MAX=0;var DYNAMIC_BASE=0,DYNAMICTOP=0;function enlargeMemory(){var OLD_TOTAL_MEMORY=TOTAL_MEMORY;var LIMIT=Math.pow(2,31);if(DYNAMICTOP>=LIMIT)return false;while(TOTAL_MEMORY<=DYNAMICTOP){if(TOTAL_MEMORY=LIMIT)return false;try{if(ArrayBuffer.transfer){buffer=ArrayBuffer.transfer(buffer,TOTAL_MEMORY)}else{var oldHEAP8=HEAP8;buffer=new ArrayBuffer(TOTAL_MEMORY)}}catch(e){return false}var success=_emscripten_replace_memory(buffer);if(!success)return false;Module["buffer"]=buffer;Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer);if(!ArrayBuffer.transfer){HEAP8.set(oldHEAP8)}return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;var totalMemory=64*1024;while(totalMemory0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Runtime.dynCall("v",func)}else{Runtime.dynCall("vi",func,[callback.arg])}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module["addOnPreRun"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module["addOnInit"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module["addOnPreMain"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module["addOnExit"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module["addOnPostRun"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["intArrayFromString"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}Module["intArrayToString"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){var array=intArrayFromString(string,dontAddNull);var i=0;while(i>0]=chr;i=i+1}}Module["writeStringToMemory"]=writeStringToMemory;function writeArrayToMemory(array,buffer){for(var i=0;i>0]=array[i]}}Module["writeArrayToMemory"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module["writeAsciiToMemory"]=writeAsciiToMemory;function unSign(value,bits,ignore){if(value>=0){return value}return bits<=32?2*Math.abs(1<=half&&(bits<=32||value>half)){value=-2*half+value}return value}if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math["imul"];if(!Math["clz32"])Math["clz32"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math["clz32"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_min=Math.min;var Math_clz32=Math.clz32;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}Module["addRunDependency"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["removeRunDependency"]=removeRunDependency;Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var ASM_CONSTS=[];STATIC_BASE=8;STATICTOP=STATIC_BASE+5888;__ATINIT__.push();allocate([116,0,0,0,86,7,0,0,116,0,0,0,99,7,0,0,156,0,0,0,112,7,0,0,16,0,0,0,0,0,0,0,156,0,0,0,145,7,0,0,24,0,0,0,0,0,0,0,156,0,0,0,215,7,0,0,24,0,0,0,0,0,0,0,156,0,0,0,179,7,0,0,56,0,0,0,0,0,0,0,156,0,0,0,249,7,0,0,40,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,40,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,88,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,4,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,1,0,0,220,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0,0,227,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,4,0,0,0,219,16,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,115,40,37,117,41,58,32,65,115,115,101,114,116,105,111,110,32,102,97,105,108,117,114,101,58,32,34,37,115,34,10,0,109,95,115,105,122,101,32,60,61,32,109,95,99,97,112,97,99,105,116,121,0,46,47,105,110,99,92,99,114,110,95,100,101,99,111,109,112,46,104,0,109,105,110,95,110,101,119,95,99,97,112,97,99,105,116,121,32,60,32,40,48,120,55,70,70,70,48,48,48,48,85,32,47,32,101,108,101,109,101,110,116,95,115,105,122,101,41,0,110,101,119,95,99,97,112,97,99,105,116,121,32,38,38,32,40,110,101,119,95,99,97,112,97,99,105,116,121,32,62,32,109,95,99,97,112,97,99,105,116,121,41,0,110,117,109,95,99,111,100,101,115,91,99,93,0,115,111,114,116,101,100,95,112,111,115,32,60,32,116,111,116,97,108,95,117,115,101,100,95,115,121,109,115,0,112,67,111,100,101,115,105,122,101,115,91,115,121,109,95,105,110,100,101,120,93,32,61,61,32,99,111,100,101,115,105,122,101,0,116,32,60,32,40,49,85,32,60,60,32,116,97,98,108,101,95,98,105,116,115,41,0,109,95,108,111,111,107,117,112,91,116,93,32,61,61,32,99,85,73,78,84,51,50,95,77,65,88,0,99,114,110,100,95,109,97,108,108,111,99,58,32,115,105,122,101,32,116,111,111,32,98,105,103,0,99,114,110,100,95,109,97,108,108,111,99,58,32,111,117,116,32,111,102,32,109,101,109,111,114,121,0,40,40,117,105,110,116,51,50,41,112,95,110,101,119,32,38,32,40,67,82,78,68,95,77,73,78,95,65,76,76,79,67,95,65,76,73,71,78,77,69,78,84,32,45,32,49,41,41,32,61,61,32,48,0,99,114,110,100,95,114,101,97,108,108,111,99,58,32,98,97,100,32,112,116,114,0,99,114,110,100,95,102,114,101,101,58,32,98,97,100,32,112,116,114,0,102,97,108,115,101,0,40,116,111,116,97,108,95,115,121,109,115,32,62,61,32,49,41,32,38,38,32,40,116,111,116,97,108,95,115,121,109,115,32,60,61,32,112,114,101,102,105,120,95,99,111,100,105,110,103,58,58,99,77,97,120,83,117,112,112,111,114,116,101,100,83,121,109,115,41,0,17,18,19,20,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15,16,48,0,110,117,109,95,98,105,116,115,32,60,61,32,51,50,85,0,109,95,98,105,116,95,99,111,117,110,116,32,60,61,32,99,66,105,116,66,117,102,83,105,122,101,0,116,32,33,61,32,99,85,73,78,84,51,50,95,77,65,88,0,109,111,100,101,108,46,109,95,99,111,100,101,95,115,105,122,101,115,91,115,121,109,93,32,61,61,32,108,101,110,0,0,2,3,1,0,2,3,4,5,6,7,1,40,108,101,110,32,62,61,32,49,41,32,38,38,32,40,108,101,110,32,60,61,32,99,77,97,120,69,120,112,101,99,116,101,100,67,111,100,101,83,105,122,101,41,0,105,32,60,32,109,95,115,105,122,101,0,110,101,120,116,95,108,101,118,101,108,95,111,102,115,32,62,32,99,117,114,95,108,101,118,101,108,95,111,102,115,0,1,2,2,3,3,3,3,4,0,0,0,0,0,0,1,1,0,1,0,1,0,0,1,2,1,2,0,0,0,1,0,2,1,0,2,0,0,1,2,3,110,117,109,32,38,38,32,40,110,117,109,32,61,61,32,126,110,117,109,95,99,104,101,99,107,41,0,83,116,57,101,120,99,101,112,116,105,111,110,0,83,116,57,116,121,112,101,95,105,110,102,111,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,57,95,95,112,111,105,110,116,101,114,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,112,98,97,115,101,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,112,116,104,114,101,97,100,95,111,110,99,101,32,102,97,105,108,117,114,101,32,105,110,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,95,102,97,115,116,40,41,0,116,101,114,109,105,110,97,116,101,95,104,97,110,100,108,101,114,32,117,110,101,120,112,101,99,116,101,100,108,121,32,114,101,116,117,114,110,101,100,0,99,97,110,110,111,116,32,99,114,101,97,116,101,32,112,116,104,114,101,97,100,32,107,101,121,32,102,111,114,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,40,41,0,99,97,110,110,111,116,32,122,101,114,111,32,111,117,116,32,116,104,114,101,97,100,32,118,97,108,117,101,32,102,111,114,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,40,41,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,121,112,101,32,37,115,58,32,37,115,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,121,112,101,32,37,115,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,102,111,114,101,105,103,110,32,101,120,99,101,112,116,105,111,110,0,116,101,114,109,105,110,97,116,105,110,103,0,117,110,99,97,117,103,104,116,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,46,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=Runtime.alignMemory(allocate(12,"i8",ALLOC_STATIC),8);assert(tempDoublePtr%8==0);function copyTempFloat(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3]}function copyTempDouble(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3];HEAP8[tempDoublePtr+4]=HEAP8[ptr+4];HEAP8[tempDoublePtr+5]=HEAP8[ptr+5];HEAP8[tempDoublePtr+6]=HEAP8[ptr+6];HEAP8[tempDoublePtr+7]=HEAP8[ptr+7]}var _BDtoIHigh=true;Module["_i64Subtract"]=_i64Subtract;Module["_i64Add"]=_i64Add;function _pthread_cleanup_push(routine,arg){__ATEXIT__.push((function(){Runtime.dynCall("vi",routine,[arg])}));_pthread_cleanup_push.level=__ATEXIT__.length}Module["_memset"]=_memset;var _BDtoILow=true;Module["_bitshift64Lshr"]=_bitshift64Lshr;Module["_bitshift64Shl"]=_bitshift64Shl;function _pthread_cleanup_pop(){assert(_pthread_cleanup_push.level==__ATEXIT__.length,"cannot pop if something else added meanwhile!");__ATEXIT__.pop();_pthread_cleanup_push.level=__ATEXIT__.length}function _abort(){Module["abort"]()}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:(function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var ptr in EXCEPTIONS.infos){var info=EXCEPTIONS.infos[ptr];if(info.adjusted===adjusted){return ptr}}return adjusted}),addRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount++}),decRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0);info.refcount--;if(info.refcount===0){if(info.destructor){Runtime.dynCall("vi",info.destructor,[ptr])}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___cxa_begin_catch(ptr){__ZSt18uncaught_exceptionv.uncaught_exception--;EXCEPTIONS.caught.push(ptr);EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr));return ptr}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Runtime.dynCall("v",func);_pthread_once.seen[ptr]=1}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module["_memcpy"]=_memcpy;var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _sysconf(name){switch(name){case 30:return PAGE_SIZE;case 85:return totalMemory/PAGE_SIZE;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 79:return 0;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:{if(typeof navigator==="object")return navigator["hardwareConcurrency"]||1;return 1}}___setErrNo(ERRNO_CODES.EINVAL);return-1}function _sbrk(bytes){var self=_sbrk;if(!self.called){DYNAMICTOP=alignMemoryPage(DYNAMICTOP);self.called=true;assert(Runtime.dynamicAlloc);self.alloc=Runtime.dynamicAlloc;Runtime.dynamicAlloc=(function(){abort("cannot dynamically allocate, sbrk now has control")})}var ret=DYNAMICTOP;if(bytes!=0){var success=self.alloc(bytes);if(!success)return-1>>>0}return ret}var PTHREAD_SPECIFIC_NEXT_KEY=1;function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}var _BItoD=true;var PATH=undefined;function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){setTimeout(Browser.mainLoop.runner,value)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(!window["setImmediate"]){var setImmediates=[];var emscriptenMainLoopMessageId="__emcc";function Browser_setImmediate_messageHandler(event){if(event.source===window&&event.data===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}}window.addEventListener("message",Browser_setImmediate_messageHandler,true);window["setImmediate"]=function Browser_emulated_setImmediate(func){setImmediates.push(func);window.postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){window["setImmediate"](Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop,arg,noSetTiming){Module["noExitRuntime"]=true;assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=func;Browser.mainLoop.arg=arg;var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;Browser.mainLoop.runner=function Browser_mainLoop_runner(){if(ABORT)return;if(Browser.mainLoop.queue.length>0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();setTimeout(Browser.mainLoop.runner,0);return}if(thisMainLoopId1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}if(Browser.mainLoop.method==="timeout"&&Module.ctx){Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!");Browser.mainLoop.method=""}Browser.mainLoop.runIter((function(){if(typeof arg!=="undefined"){Runtime.dynCall("vi",func,[arg])}else{Runtime.dynCall("v",func)}}));if(thisMainLoopId0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"SimulateInfiniteLoop"}}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:(function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++}),resume:(function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;_emscripten_set_main_loop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()}),updateStatus:(function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);var canvas=Module["canvas"];function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===canvas||document["mozPointerLockElement"]===canvas||document["webkitPointerLockElement"]===canvas||document["msPointerLockElement"]===canvas}if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",(function(ev){if(!Browser.pointerLock&&canvas.requestPointerLock){canvas.requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}canvas.style.backgroundColor="black"}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx==="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach((function(callback){callback()}));Browser.init()}return ctx}),destroyContext:(function(canvas,useWebGL,setInModule){}),fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:(function(lockPointer,resizeCanvas,vrDevice){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;Browser.vrDevice=vrDevice;if(typeof Browser.lockPointer==="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas==="undefined")Browser.resizeCanvas=false;if(typeof Browser.vrDevice==="undefined")Browser.vrDevice=null;var canvas=Module["canvas"];function fullScreenChange(){Browser.isFullScreen=false;var canvasContainer=canvas.parentNode;if((document["webkitFullScreenElement"]||document["webkitFullscreenElement"]||document["mozFullScreenElement"]||document["mozFullscreenElement"]||document["fullScreenElement"]||document["fullscreenElement"]||document["msFullScreenElement"]||document["msFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.cancelFullScreen=document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["webkitCancelFullScreen"]||document["msExitFullscreen"]||document["exitFullscreen"]||(function(){});canvas.cancelFullScreen=canvas.cancelFullScreen.bind(document);if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullScreen=true;if(Browser.resizeCanvas)Browser.setFullScreenCanvasSize()}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas)Browser.setWindowedCanvasSize()}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullScreen);Browser.updateCanvasDimensions(canvas)}if(!Browser.fullScreenHandlersInstalled){Browser.fullScreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullScreenChange,false);document.addEventListener("mozfullscreenchange",fullScreenChange,false);document.addEventListener("webkitfullscreenchange",fullScreenChange,false);document.addEventListener("MSFullscreenChange",fullScreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullScreen=canvasContainer["requestFullScreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullScreen"]?(function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null);if(vrDevice){canvasContainer.requestFullScreen({vrDisplay:vrDevice})}else{canvasContainer.requestFullScreen()}}),nextRAF:0,fakeRequestAnimationFrame:(function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){Browser.fakeRequestAnimationFrame(func)}else{if(!window.requestAnimationFrame){window.requestAnimationFrame=window["requestAnimationFrame"]||window["mozRequestAnimationFrame"]||window["webkitRequestAnimationFrame"]||window["msRequestAnimationFrame"]||window["oRequestAnimationFrame"]||Browser.fakeRequestAnimationFrame}window.requestAnimationFrame(func)}},safeCallback:(function(func){return(function(){if(!ABORT)return func.apply(null,arguments)})}),allowAsyncCallbacks:true,queuedAsyncCallbacks:[],pauseAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=false}),resumeAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=true;if(Browser.queuedAsyncCallbacks.length>0){var callbacks=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[];callbacks.forEach((function(func){func()}))}}),safeRequestAnimationFrame:(function(func){return Browser.requestAnimationFrame((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}))}),safeSetTimeout:(function(func,timeout){Module["noExitRuntime"]=true;return setTimeout((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}),timeout)}),safeSetInterval:(function(func,timeout){Module["noExitRuntime"]=true;return setInterval((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}}),timeout)}),getMimetype:(function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]}),getUserMedia:(function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)}),getMovementX:(function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0}),getMovementY:(function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0}),getMouseWheelDelta:(function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail;break;case"mousewheel":delta=event.wheelDelta;break;case"wheel":delta=event["deltaY"];break;default:throw"unrecognized mouse wheel event: "+event.type}return delta}),mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:(function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!=="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!=="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}}),xhrLoad:(function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)}),asyncLoad:(function(url,onload,onerror,noRunDep){Browser.xhrLoad(url,(function(arrayBuffer){assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(!noRunDep)removeRunDependency("al "+url)}),(function(event){if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}}));if(!noRunDep)addRunDependency("al "+url)}),resizeListeners:[],updateResizeListeners:(function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach((function(listener){listener(canvas.width,canvas.height)}))}),setCanvasSize:(function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()}),windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];flags=flags|8388608;HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=flags}Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];flags=flags&~8388608;HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=flags}Browser.updateResizeListeners()}),updateCanvasDimensions:(function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h>2]=ret}return ret}function _pthread_self(){return 0}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffer)___syscall146.buffer=[];var buffer=___syscall146.buffer;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j2147483648)return false;i=new a(newBuffer);j=new b(newBuffer);k=new c(newBuffer);l=new d(newBuffer);m=new e(newBuffer);n=new f(newBuffer);o=new g(newBuffer);p=new h(newBuffer);buffer=newBuffer;return true} +// EMSCRIPTEN_START_FUNCS + function Za(a){a=a|0;var b=0;b=r;r=r+a|0;r=r+15&-16;return b|0}function _a(){return r|0}function $a(a){a=a|0;r=a}function ab(a,b){a=a|0;b=b|0;r=a;s=b}function bb(a,b){a=a|0;b=b|0;if(!w){w=a;x=b}}function cb(a){a=a|0;i[t>>0]=i[a>>0];i[t+1>>0]=i[a+1>>0];i[t+2>>0]=i[a+2>>0];i[t+3>>0]=i[a+3>>0]}function db(a){a=a|0;i[t>>0]=i[a>>0];i[t+1>>0]=i[a+1>>0];i[t+2>>0]=i[a+2>>0];i[t+3>>0]=i[a+3>>0];i[t+4>>0]=i[a+4>>0];i[t+5>>0]=i[a+5>>0];i[t+6>>0]=i[a+6>>0];i[t+7>>0]=i[a+7>>0]}function eb(a){a=a|0;L=a}function fb(){return L|0}function gb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0;o=r;r=r+576|0;l=o+48|0;h=o+32|0;g=o+16|0;f=o;j=o+64|0;m=o+60|0;i=a+4|0;n=a+8|0;if((k[i>>2]|0)>>>0>(k[n>>2]|0)>>>0){k[f>>2]=1138;k[f+4>>2]=2119;k[f+8>>2]=1117;xc(j,1084,f)|0;wc(j)|0}if((2147418112/(d>>>0)|0)>>>0<=b>>>0){k[g>>2]=1138;k[g+4>>2]=2120;k[g+8>>2]=1157;xc(j,1084,g)|0;wc(j)|0}g=k[n>>2]|0;if(g>>>0>=b>>>0){n=1;r=o;return n|0}do if(c){if(b){f=b+-1|0;if(!(f&b)){f=11;break}else b=f}else b=-1;b=b>>>16|b;b=b>>>8|b;b=b>>>4|b;b=b>>>2|b;b=(b>>>1|b)+1|0;f=10}else f=10;while(0);if((f|0)==10)if(!b){b=0;f=12}else f=11;if((f|0)==11)if(b>>>0<=g>>>0)f=12;if((f|0)==12){k[h>>2]=1138;k[h+4>>2]=2129;k[h+8>>2]=1205;xc(j,1084,h)|0;wc(j)|0}c=ha(b,d)|0;do if(!e){f=hb(k[a>>2]|0,c,m,1)|0;if(!f){n=0;r=o;return n|0}else{k[a>>2]=f;break}}else{g=ib(c,m)|0;if(!g){n=0;r=o;return n|0}Va[e&0](g,k[a>>2]|0,k[i>>2]|0);f=k[a>>2]|0;do if(f)if(!(f&7)){kb(f,0,0,1,0)|0;break}else{k[l>>2]=1138;k[l+4>>2]=2502;k[l+8>>2]=1504;xc(j,1084,l)|0;wc(j)|0;break}while(0);k[a>>2]=g}while(0);f=k[m>>2]|0;if(f>>>0>c>>>0)b=(f>>>0)/(d>>>0)|0;k[n>>2]=b;n=1;r=o;return n|0}function hb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=r;r=r+560|0;i=j+32|0;f=j+16|0;e=j;h=j+48|0;g=j+44|0;if(a&7){k[e>>2]=1138;k[e+4>>2]=2502;k[e+8>>2]=1482;xc(h,1084,e)|0;wc(h)|0;i=0;r=j;return i|0}if(b>>>0>2147418112){k[f>>2]=1138;k[f+4>>2]=2502;k[f+8>>2]=1375;xc(h,1084,f)|0;wc(h)|0;i=0;r=j;return i|0}k[g>>2]=b;d=kb(a,b,g,d,0)|0;if(c)k[c>>2]=k[g>>2];if(!(d&7)){i=d;r=j;return i|0}k[i>>2]=1138;k[i+4>>2]=2554;k[i+8>>2]=1428;xc(h,1084,i)|0;wc(h)|0;i=d;r=j;return i|0}function ib(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;i=r;r=r+560|0;h=i+32|0;g=i+16|0;c=i;f=i+48|0;e=i+44|0;d=a+3&-4;d=(d|0)!=0?d:4;if(d>>>0>2147418112){k[c>>2]=1138;k[c+4>>2]=2502;k[c+8>>2]=1375;xc(f,1084,c)|0;wc(f)|0;h=0;r=i;return h|0}k[e>>2]=d;c=kb(0,d,e,1,0)|0;a=k[e>>2]|0;if(b)k[b>>2]=a;if((c|0)==0|a>>>0>>0){k[g>>2]=1138;k[g+4>>2]=2502;k[g+8>>2]=1401;xc(f,1084,g)|0;wc(f)|0;h=0;r=i;return h|0}if(!(c&7)){h=c;r=i;return h|0}k[h>>2]=1138;k[h+4>>2]=2529;k[h+8>>2]=1428;xc(f,1084,h)|0;wc(f)|0;h=c;r=i;return h|0}function jb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;L=r;r=r+880|0;I=L+144|0;H=L+128|0;G=L+112|0;F=L+96|0;C=L+80|0;w=L+64|0;u=L+48|0;v=L+32|0;q=L+16|0;p=L;E=L+360|0;J=L+296|0;K=L+224|0;t=L+156|0;if((b|0)==0|d>>>0>11){a=0;r=L;return a|0}k[a>>2]=b;e=K;f=e+68|0;do{k[e>>2]=0;e=e+4|0}while((e|0)<(f|0));f=0;do{e=i[c+f>>0]|0;if(e<<24>>24){D=K+((e&255)<<2)|0;k[D>>2]=(k[D>>2]|0)+1}f=f+1|0}while((f|0)!=(b|0));f=0;o=1;g=0;h=-1;n=0;while(1){e=k[K+(o<<2)>>2]|0;if(!e)k[a+28+(o+-1<<2)>>2]=0;else{D=o+-1|0;k[J+(D<<2)>>2]=f;f=e+f|0;B=16-o|0;k[a+28+(D<<2)>>2]=(f+-1<>2]=n;k[t+(o<<2)>>2]=n;g=g>>>0>o>>>0?g:o;h=h>>>0>>0?h:o;n=e+n|0}o=o+1|0;if((o|0)==17){D=g;break}else f=f<<1}k[a+4>>2]=n;f=a+172|0;do if(n>>>0>(k[f>>2]|0)>>>0){k[f>>2]=n;if(n){e=n+-1|0;if(e&n)s=14}else{e=-1;s=14}if((s|0)==14){B=e>>>16|e;B=B>>>8|B;B=B>>>4|B;B=B>>>2|B;B=(B>>>1|B)+1|0;k[f>>2]=B>>>0>b>>>0?b:B}g=a+176|0;e=k[g>>2]|0;do if(e){B=k[e+-4>>2]|0;e=e+-8|0;if(!((B|0)!=0?(B|0)==(~k[e>>2]|0):0)){k[p>>2]=1138;k[p+4>>2]=647;k[p+8>>2]=1851;xc(E,1084,p)|0;wc(E)|0}if(!(e&7)){kb(e,0,0,1,0)|0;break}else{k[q>>2]=1138;k[q+4>>2]=2502;k[q+8>>2]=1504;xc(E,1084,q)|0;wc(E)|0;break}}while(0);f=k[f>>2]|0;f=(f|0)!=0?f:1;e=ib((f<<1)+8|0,0)|0;if(!e){k[g>>2]=0;e=0;break}else{k[e+4>>2]=f;k[e>>2]=~f;k[g>>2]=e+8;s=25;break}}else s=25;while(0);a:do if((s|0)==25){B=a+24|0;i[B>>0]=h;i[a+25>>0]=D;f=a+176|0;g=0;do{A=i[c+g>>0]|0;e=A&255;if(A<<24>>24){if(!(k[K+(e<<2)>>2]|0)){k[v>>2]=1138;k[v+4>>2]=2272;k[v+8>>2]=1249;xc(E,1084,v)|0;wc(E)|0}A=t+(e<<2)|0;e=k[A>>2]|0;k[A>>2]=e+1;if(e>>>0>=n>>>0){k[u>>2]=1138;k[u+4>>2]=2276;k[u+8>>2]=1262;xc(E,1084,u)|0;wc(E)|0}j[(k[f>>2]|0)+(e<<1)>>1]=g}g=g+1|0}while((g|0)!=(b|0));e=i[B>>0]|0;z=(e&255)>>>0>>0?d:0;A=a+8|0;k[A>>2]=z;y=(z|0)!=0;if(y){x=1<>>0>(k[e>>2]|0)>>>0){k[e>>2]=x;g=a+168|0;e=k[g>>2]|0;do if(e){v=k[e+-4>>2]|0;e=e+-8|0;if(!((v|0)!=0?(v|0)==(~k[e>>2]|0):0)){k[w>>2]=1138;k[w+4>>2]=647;k[w+8>>2]=1851;xc(E,1084,w)|0;wc(E)|0}if(!(e&7)){kb(e,0,0,1,0)|0;break}else{k[C>>2]=1138;k[C+4>>2]=2502;k[C+8>>2]=1504;xc(E,1084,C)|0;wc(E)|0;break}}while(0);e=x<<2;f=ib(e+8|0,0)|0;if(!f){k[g>>2]=0;e=0;break a}else{C=f+8|0;k[f+4>>2]=x;k[f>>2]=~x;k[g>>2]=C;f=C;break}}else{f=a+168|0;e=x<<2;g=f;f=k[f>>2]|0}while(0);_c(f|0,-1,e|0)|0;t=a+176|0;w=1;do{if(k[K+(w<<2)>>2]|0){u=z-w|0;v=1<>2]|0;if(f>>>0>=16){k[F>>2]=1138;k[F+4>>2]=1956;k[F+8>>2]=1725;xc(E,1084,F)|0;wc(E)|0}e=k[a+28+(f<<2)>>2]|0;if(!e)b=-1;else b=(e+-1|0)>>>(16-w|0);if(h>>>0<=b>>>0){q=(k[a+96+(f<<2)>>2]|0)-h|0;s=w<<16;do{e=m[(k[t>>2]|0)+(q+h<<1)>>1]|0;if((l[c+e>>0]|0|0)!=(w|0)){k[G>>2]=1138;k[G+4>>2]=2318;k[G+8>>2]=1291;xc(E,1084,G)|0;wc(E)|0}p=h<>>0>=x>>>0){k[H>>2]=1138;k[H+4>>2]=2324;k[H+8>>2]=1325;xc(E,1084,H)|0;wc(E)|0}e=k[g>>2]|0;if((k[e+(n<<2)>>2]|0)!=-1){k[I>>2]=1138;k[I+4>>2]=2326;k[I+8>>2]=1348;xc(E,1084,I)|0;wc(E)|0;e=k[g>>2]|0}k[e+(n<<2)>>2]=f;o=o+1|0}while(o>>>0>>0);h=h+1|0}while(h>>>0<=b>>>0)}}w=w+1|0}while(z>>>0>=w>>>0);e=i[B>>0]|0}f=a+96|0;k[f>>2]=(k[f>>2]|0)-(k[J>>2]|0);f=a+100|0;k[f>>2]=(k[f>>2]|0)-(k[J+4>>2]|0);f=a+104|0;k[f>>2]=(k[f>>2]|0)-(k[J+8>>2]|0);f=a+108|0;k[f>>2]=(k[f>>2]|0)-(k[J+12>>2]|0);f=a+112|0;k[f>>2]=(k[f>>2]|0)-(k[J+16>>2]|0);f=a+116|0;k[f>>2]=(k[f>>2]|0)-(k[J+20>>2]|0);f=a+120|0;k[f>>2]=(k[f>>2]|0)-(k[J+24>>2]|0);f=a+124|0;k[f>>2]=(k[f>>2]|0)-(k[J+28>>2]|0);f=a+128|0;k[f>>2]=(k[f>>2]|0)-(k[J+32>>2]|0);f=a+132|0;k[f>>2]=(k[f>>2]|0)-(k[J+36>>2]|0);f=a+136|0;k[f>>2]=(k[f>>2]|0)-(k[J+40>>2]|0);f=a+140|0;k[f>>2]=(k[f>>2]|0)-(k[J+44>>2]|0);f=a+144|0;k[f>>2]=(k[f>>2]|0)-(k[J+48>>2]|0);f=a+148|0;k[f>>2]=(k[f>>2]|0)-(k[J+52>>2]|0);f=a+152|0;k[f>>2]=(k[f>>2]|0)-(k[J+56>>2]|0);f=a+156|0;k[f>>2]=(k[f>>2]|0)-(k[J+60>>2]|0);f=a+16|0;k[f>>2]=0;g=a+20|0;k[g>>2]=e&255;b:do if(y){while(1){if(!d)break b;e=d+-1|0;if(!(k[K+(d<<2)>>2]|0))d=e;else break}k[f>>2]=k[a+28+(e<<2)>>2];e=z+1|0;k[g>>2]=e;if(e>>>0<=D>>>0){while(1){if(k[K+(e<<2)>>2]|0)break;e=e+1|0;if(e>>>0>D>>>0)break b}k[g>>2]=e}}while(0);k[a+92>>2]=-1;k[a+160>>2]=1048575;k[a+12>>2]=32-(k[A>>2]|0);e=1}while(0);a=e;r=L;return a|0}function kb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;do if(!a){d=Rc(b)|0;if(c){if(!d)a=0;else a=Uc(d)|0;k[c>>2]=a}}else{if(!b){Sc(a);if(!c){d=0;break}k[c>>2]=0;d=0;break}if(d){d=Tc(a,b)|0;a=(d|0)==0?a:d}else d=0;if(c){b=Uc(a)|0;k[c>>2]=b}}while(0);return d|0}function lb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if(!((a|0)!=0&b>>>0>73&(c|0)!=0)){c=0;return c|0}if((k[c>>2]|0)!=40|b>>>0<74){c=0;return c|0}if(((l[a>>0]|0)<<8|(l[a+1>>0]|0)|0)!=18552){c=0;return c|0}if(((l[a+2>>0]|0)<<8|(l[a+3>>0]|0))>>>0<74){c=0;return c|0}if(((l[a+7>>0]|0)<<16|(l[a+6>>0]|0)<<24|(l[a+8>>0]|0)<<8|(l[a+9>>0]|0))>>>0>b>>>0){c=0;return c|0}k[c+4>>2]=(l[a+12>>0]|0)<<8|(l[a+13>>0]|0);k[c+8>>2]=(l[a+14>>0]|0)<<8|(l[a+15>>0]|0);k[c+12>>2]=l[a+16>>0];k[c+16>>2]=l[a+17>>0];b=a+18|0;d=c+32|0;k[d>>2]=l[b>>0];k[d+4>>2]=0;b=i[b>>0]|0;k[c+20>>2]=b<<24>>24==0|b<<24>>24==9?8:16;k[c+24>>2]=(l[a+26>>0]|0)<<16|(l[a+25>>0]|0)<<24|(l[a+27>>0]|0)<<8|(l[a+28>>0]|0);k[c+28>>2]=(l[a+30>>0]|0)<<16|(l[a+29>>0]|0)<<24|(l[a+31>>0]|0)<<8|(l[a+32>>0]|0);c=1;return c|0}function mb(a){a=a|0;Oa(a|0)|0;Rb()}function nb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;f=r;r=r+528|0;e=f;d=f+16|0;b=k[a+20>>2]|0;if(b)ob(b);b=a+4|0;c=k[b>>2]|0;if(!c){e=a+16|0;i[e>>0]=0;r=f;return}if(!(c&7))kb(c,0,0,1,0)|0;else{k[e>>2]=1138;k[e+4>>2]=2502;k[e+8>>2]=1504;xc(d,1084,e)|0;wc(d)|0}k[b>>2]=0;k[a+8>>2]=0;k[a+12>>2]=0;e=a+16|0;i[e>>0]=0;r=f;return}function ob(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;i=r;r=r+592|0;g=i+64|0;f=i+48|0;h=i+32|0;d=i+16|0;c=i;e=i+80|0;if(!a){r=i;return}b=k[a+168>>2]|0;do if(b){j=k[b+-4>>2]|0;b=b+-8|0;if(!((j|0)!=0?(j|0)==(~k[b>>2]|0):0)){k[c>>2]=1138;k[c+4>>2]=647;k[c+8>>2]=1851;xc(e,1084,c)|0;wc(e)|0}if(!(b&7)){kb(b,0,0,1,0)|0;break}else{k[d>>2]=1138;k[d+4>>2]=2502;k[d+8>>2]=1504;xc(e,1084,d)|0;wc(e)|0;break}}while(0);b=k[a+176>>2]|0;do if(b){j=k[b+-4>>2]|0;b=b+-8|0;if(!((j|0)!=0?(j|0)==(~k[b>>2]|0):0)){k[h>>2]=1138;k[h+4>>2]=647;k[h+8>>2]=1851;xc(e,1084,h)|0;wc(e)|0}if(!(b&7)){kb(b,0,0,1,0)|0;break}else{k[f>>2]=1138;k[f+4>>2]=2502;k[f+8>>2]=1504;xc(e,1084,f)|0;wc(e)|0;break}}while(0);if(!(a&7)){kb(a,0,0,1,0)|0;r=i;return}else{k[g>>2]=1138;k[g+4>>2]=2502;k[g+8>>2]=1504;xc(e,1084,g)|0;wc(e)|0;r=i;return}}function pb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;i=r;r=r+544|0;g=i+16|0;b=i;f=i+32|0;e=a+8|0;c=k[e>>2]|0;if((c+-1|0)>>>0>=8192){k[b>>2]=1138;k[b+4>>2]=3002;k[b+8>>2]=1529;xc(f,1084,b)|0;wc(f)|0}k[a>>2]=c;d=a+20|0;b=k[d>>2]|0;if(!b){b=ib(180,0)|0;if(!b)b=0;else{h=b+164|0;k[h>>2]=0;k[h+4>>2]=0;k[h+8>>2]=0;k[h+12>>2]=0}k[d>>2]=b;h=k[a>>2]|0}else h=c;if(!(k[e>>2]|0)){k[g>>2]=1138;k[g+4>>2]=906;k[g+8>>2]=1769;xc(f,1084,g)|0;wc(f)|0;g=k[a>>2]|0}else g=h;f=k[a+4>>2]|0;if(g>>>0>16){d=g;c=0}else{a=0;a=jb(b,h,f,a)|0;r=i;return a|0}while(1){e=c+1|0;if(d>>>0>3){d=d>>>1;c=e}else{d=e;break}}a=c+2+((d|0)!=32&1<>>0>>0&1)|0;a=a>>>0<11?a&255:11;a=jb(b,h,f,a)|0;r=i;return a|0}function qb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=r;r=r+720|0;z=E+160|0;y=E+144|0;x=E+128|0;w=E+112|0;v=E+96|0;u=E+80|0;t=E+64|0;s=E+48|0;n=E+32|0;h=E+16|0;e=E;C=E+200|0;D=E+176|0;A=rb(a,14)|0;if(!A){k[b>>2]=0;c=b+4|0;d=k[c>>2]|0;if(d){if(!(d&7))kb(d,0,0,1,0)|0;else{k[e>>2]=1138;k[e+4>>2]=2502;k[e+8>>2]=1504;xc(C,1084,e)|0;wc(C)|0}k[c>>2]=0;k[b+8>>2]=0;k[b+12>>2]=0}i[b+16>>0]=0;c=b+20|0;d=k[c>>2]|0;if(!d){b=1;r=E;return b|0}ob(d);k[c>>2]=0;b=1;r=E;return b|0}p=b+4|0;q=b+8|0;c=k[q>>2]|0;if((c|0)!=(A|0)){if(c>>>0<=A>>>0){do if((k[b+12>>2]|0)>>>0>>0){if(gb(p,A,(c+1|0)==(A|0),1,0)|0){c=k[q>>2]|0;break}i[b+16>>0]=1;b=0;r=E;return b|0}while(0);_c((k[p>>2]|0)+c|0,0,A-c|0)|0}k[q>>2]=A}_c(k[p>>2]|0,0,A|0)|0;o=a+20|0;c=k[o>>2]|0;if((c|0)<5){f=a+4|0;g=a+8|0;e=a+16|0;do{d=k[f>>2]|0;if((d|0)==(k[g>>2]|0))d=0;else{k[f>>2]=d+1;d=l[d>>0]|0}c=c+8|0;k[o>>2]=c;if((c|0)>=33){k[h>>2]=1138;k[h+4>>2]=3204;k[h+8>>2]=1638;xc(C,1084,h)|0;wc(C)|0;c=k[o>>2]|0}d=d<<32-c|k[e>>2];k[e>>2]=d}while((c|0)<5)}else{d=a+16|0;e=d;d=k[d>>2]|0}m=d>>>27;k[e>>2]=d<<5;k[o>>2]=c+-5;if((m+-1|0)>>>0>20){b=0;r=E;return b|0}k[D+20>>2]=0;k[D>>2]=0;k[D+4>>2]=0;k[D+8>>2]=0;k[D+12>>2]=0;i[D+16>>0]=0;c=D+4|0;d=D+8|0;a:do if(gb(c,21,0,1,0)|0){h=k[d>>2]|0;j=k[c>>2]|0;_c(j+h|0,0,21-h|0)|0;k[d>>2]=21;if(m){e=a+4|0;f=a+8|0;g=a+16|0;h=0;do{c=k[o>>2]|0;if((c|0)<3)do{d=k[e>>2]|0;if((d|0)==(k[f>>2]|0))d=0;else{k[e>>2]=d+1;d=l[d>>0]|0}c=c+8|0;k[o>>2]=c;if((c|0)>=33){k[n>>2]=1138;k[n+4>>2]=3204;k[n+8>>2]=1638;xc(C,1084,n)|0;wc(C)|0;c=k[o>>2]|0}d=d<<32-c|k[g>>2];k[g>>2]=d}while((c|0)<3);else d=k[g>>2]|0;k[g>>2]=d<<3;k[o>>2]=c+-3;i[j+(l[1599+h>>0]|0)>>0]=d>>>29;h=h+1|0}while((h|0)!=(m|0))}if(pb(D)|0){m=a+4|0;h=a+8|0;j=a+16|0;d=0;b:while(1){g=A-d|0;c=sb(a,D)|0;c:do if(c>>>0<17){if((k[q>>2]|0)>>>0<=d>>>0){k[s>>2]=1138;k[s+4>>2]=906;k[s+8>>2]=1769;xc(C,1084,s)|0;wc(C)|0}i[(k[p>>2]|0)+d>>0]=c;c=d+1|0}else switch(c|0){case 17:{c=k[o>>2]|0;if((c|0)<3)do{e=k[m>>2]|0;if((e|0)==(k[h>>2]|0))e=0;else{k[m>>2]=e+1;e=l[e>>0]|0}c=c+8|0;k[o>>2]=c;if((c|0)>=33){k[t>>2]=1138;k[t+4>>2]=3204;k[t+8>>2]=1638;xc(C,1084,t)|0;wc(C)|0;c=k[o>>2]|0}e=e<<32-c|k[j>>2];k[j>>2]=e}while((c|0)<3);else e=k[j>>2]|0;k[j>>2]=e<<3;k[o>>2]=c+-3;c=(e>>>29)+3|0;if(c>>>0>g>>>0){c=0;break a}c=c+d|0;break c}case 18:{c=k[o>>2]|0;if((c|0)<7)do{e=k[m>>2]|0;if((e|0)==(k[h>>2]|0))e=0;else{k[m>>2]=e+1;e=l[e>>0]|0}c=c+8|0;k[o>>2]=c;if((c|0)>=33){k[u>>2]=1138;k[u+4>>2]=3204;k[u+8>>2]=1638;xc(C,1084,u)|0;wc(C)|0;c=k[o>>2]|0}e=e<<32-c|k[j>>2];k[j>>2]=e}while((c|0)<7);else e=k[j>>2]|0;k[j>>2]=e<<7;k[o>>2]=c+-7;c=(e>>>25)+11|0;if(c>>>0>g>>>0){c=0;break a}c=c+d|0;break c}default:{if((c+-19|0)>>>0>=2){B=90;break b}f=k[o>>2]|0;if((c|0)==19){if((f|0)<2){e=f;while(1){c=k[m>>2]|0;if((c|0)==(k[h>>2]|0))f=0;else{k[m>>2]=c+1;f=l[c>>0]|0}c=e+8|0;k[o>>2]=c;if((c|0)>=33){k[v>>2]=1138;k[v+4>>2]=3204;k[v+8>>2]=1638;xc(C,1084,v)|0;wc(C)|0;c=k[o>>2]|0}e=f<<32-c|k[j>>2];k[j>>2]=e;if((c|0)<2)e=c;else break}}else{e=k[j>>2]|0;c=f}k[j>>2]=e<<2;k[o>>2]=c+-2;f=(e>>>30)+3|0}else{if((f|0)<6){e=f;while(1){c=k[m>>2]|0;if((c|0)==(k[h>>2]|0))f=0;else{k[m>>2]=c+1;f=l[c>>0]|0}c=e+8|0;k[o>>2]=c;if((c|0)>=33){k[w>>2]=1138;k[w+4>>2]=3204;k[w+8>>2]=1638;xc(C,1084,w)|0;wc(C)|0;c=k[o>>2]|0}e=f<<32-c|k[j>>2];k[j>>2]=e;if((c|0)<6)e=c;else break}}else{e=k[j>>2]|0;c=f}k[j>>2]=e<<6;k[o>>2]=c+-6;f=(e>>>26)+7|0}if((d|0)==0|f>>>0>g>>>0){c=0;break a}c=d+-1|0;if((k[q>>2]|0)>>>0<=c>>>0){k[x>>2]=1138;k[x+4>>2]=906;k[x+8>>2]=1769;xc(C,1084,x)|0;wc(C)|0}e=i[(k[p>>2]|0)+c>>0]|0;if(!(e<<24>>24)){c=0;break a}c=f+d|0;if(d>>>0>=c>>>0){c=d;break c}do{if((k[q>>2]|0)>>>0<=d>>>0){k[y>>2]=1138;k[y+4>>2]=906;k[y+8>>2]=1769;xc(C,1084,y)|0;wc(C)|0}i[(k[p>>2]|0)+d>>0]=e;d=d+1|0}while((d|0)!=(c|0))}}while(0);if(A>>>0>c>>>0)d=c;else break}if((B|0)==90){k[z>>2]=1138;k[z+4>>2]=3145;k[z+8>>2]=1620;xc(C,1084,z)|0;wc(C)|0;c=0;break}if((A|0)==(c|0))c=pb(b)|0;else c=0}else c=0}else{i[D+16>>0]=1;c=0}while(0);nb(D);b=c;r=E;return b|0}function rb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=r;r=r+528|0;g=j;f=j+16|0;if(!b){i=0;r=j;return i|0}if(b>>>0<=16){i=tb(a,b)|0;r=j;return i|0}h=tb(a,b+-16|0)|0;i=a+20|0;b=k[i>>2]|0;if((b|0)<16){d=a+4|0;e=a+8|0;c=a+16|0;do{a=k[d>>2]|0;if((a|0)==(k[e>>2]|0))a=0;else{k[d>>2]=a+1;a=l[a>>0]|0}b=b+8|0;k[i>>2]=b;if((b|0)>=33){k[g>>2]=1138;k[g+4>>2]=3204;k[g+8>>2]=1638;xc(f,1084,g)|0;wc(f)|0;b=k[i>>2]|0}a=a<<32-b|k[c>>2];k[c>>2]=a}while((b|0)<16)}else{a=a+16|0;c=a;a=k[a>>2]|0}k[c>>2]=a<<16;k[i>>2]=b+-16;i=a>>>16|h<<16;r=j;return i|0}function sb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,n=0,o=0,p=0,q=0,s=0,t=0;t=r;r=r+576|0;o=t+48|0;n=t+32|0;j=t+16|0;i=t;q=t+64|0;p=k[b+20>>2]|0;s=a+20|0;h=k[s>>2]|0;do if((h|0)<24){g=a+4|0;d=k[g>>2]|0;e=k[a+8>>2]|0;c=d>>>0>>0;if((h|0)>=16){if(c){k[g>>2]=d+1;c=l[d>>0]|0}else c=0;k[s>>2]=h+8;g=a+16|0;f=c<<24-h|k[g>>2];k[g>>2]=f;break}if(c){f=(l[d>>0]|0)<<8;c=d+1|0}else{f=0;c=d}if(c>>>0>>0){d=l[c>>0]|0;c=c+1|0}else d=0;k[g>>2]=c;k[s>>2]=h+16;g=a+16|0;f=(d|f)<<16-h|k[g>>2];k[g>>2]=f}else{f=a+16|0;g=f;f=k[f>>2]|0}while(0);e=(f>>>16)+1|0;do if(e>>>0<=(k[p+16>>2]|0)>>>0){d=k[(k[p+168>>2]|0)+(f>>>(32-(k[p+8>>2]|0)|0)<<2)>>2]|0;if((d|0)==-1){k[i>>2]=1138;k[i+4>>2]=3249;k[i+8>>2]=1665;xc(q,1084,i)|0;wc(q)|0}c=d&65535;d=d>>>16;if((k[b+8>>2]|0)>>>0<=c>>>0){k[j>>2]=1138;k[j+4>>2]=905;k[j+8>>2]=1769;xc(q,1084,j)|0;wc(q)|0}if((l[(k[b+4>>2]|0)+c>>0]|0|0)!=(d|0)){k[n>>2]=1138;k[n+4>>2]=3253;k[n+8>>2]=1682;xc(q,1084,n)|0;wc(q)|0}}else{d=k[p+20>>2]|0;while(1){c=d+-1|0;if(e>>>0>(k[p+28+(c<<2)>>2]|0)>>>0)d=d+1|0;else break}c=(f>>>(32-d|0))+(k[p+96+(c<<2)>>2]|0)|0;if(c>>>0<(k[b>>2]|0)>>>0){c=m[(k[p+176>>2]|0)+(c<<1)>>1]|0;break}k[o>>2]=1138;k[o+4>>2]=3271;k[o+8>>2]=1620;xc(q,1084,o)|0;wc(q)|0;s=0;r=t;return s|0}while(0);k[g>>2]=k[g>>2]<>2]=(k[s>>2]|0)-d;s=c;r=t;return s|0}function tb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=r;r=r+544|0;h=j+16|0;c=j;g=j+32|0;if(b>>>0>=33){k[c>>2]=1138;k[c+4>>2]=3195;k[c+8>>2]=1622;xc(g,1084,c)|0;wc(g)|0}i=a+20|0;c=k[i>>2]|0;if((c|0)>=(b|0)){e=a+16|0;f=e;e=k[e>>2]|0;g=c;h=32-b|0;h=e>>>h;e=e<>2]=e;b=g-b|0;k[i>>2]=b;r=j;return h|0}e=a+4|0;f=a+8|0;d=a+16|0;do{a=k[e>>2]|0;if((a|0)==(k[f>>2]|0))a=0;else{k[e>>2]=a+1;a=l[a>>0]|0}c=c+8|0;k[i>>2]=c;if((c|0)>=33){k[h>>2]=1138;k[h+4>>2]=3204;k[h+8>>2]=1638;xc(g,1084,h)|0;wc(g)|0;c=k[i>>2]|0}a=a<<32-c|k[d>>2];k[d>>2]=a}while((c|0)<(b|0));h=32-b|0;h=a>>>h;g=a<>2]=g;b=c-b|0;k[i>>2]=b;r=j;return h|0}function ub(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0;q=r;r=r+528|0;o=q;n=q+16|0;if((a|0)==0|b>>>0<62){p=0;r=q;return p|0}m=ib(300,0)|0;if(!m){p=0;r=q;return p|0}k[m>>2]=519686845;c=m+4|0;k[c>>2]=0;d=m+8|0;k[d>>2]=0;j=m+88|0;e=m+136|0;f=m+160|0;g=j;h=g+44|0;do{k[g>>2]=0;g=g+4|0}while((g|0)<(h|0));i[j+44>>0]=0;s=m+184|0;g=m+208|0;h=m+232|0;t=m+252|0;k[t>>2]=0;k[t+4>>2]=0;k[t+8>>2]=0;i[t+12>>0]=0;t=m+268|0;k[t>>2]=0;k[t+4>>2]=0;k[t+8>>2]=0;i[t+12>>0]=0;t=m+284|0;k[t>>2]=0;k[t+4>>2]=0;k[t+8>>2]=0;i[t+12>>0]=0;k[e>>2]=0;k[e+4>>2]=0;k[e+8>>2]=0;k[e+12>>2]=0;k[e+16>>2]=0;i[e+20>>0]=0;k[f>>2]=0;k[f+4>>2]=0;k[f+8>>2]=0;k[f+12>>2]=0;k[f+16>>2]=0;i[f+20>>0]=0;k[s>>2]=0;k[s+4>>2]=0;k[s+8>>2]=0;k[s+12>>2]=0;k[s+16>>2]=0;i[s+20>>0]=0;k[g>>2]=0;k[g+4>>2]=0;k[g+8>>2]=0;k[g+12>>2]=0;k[g+16>>2]=0;i[g+20>>0]=0;k[h>>2]=0;k[h+4>>2]=0;k[h+8>>2]=0;k[h+12>>2]=0;i[h+16>>0]=0;do if(((b>>>0>=74?((l[a>>0]|0)<<8|(l[a+1>>0]|0)|0)==18552:0)?((l[a+2>>0]|0)<<8|(l[a+3>>0]|0))>>>0>=74:0)?((l[a+7>>0]|0)<<16|(l[a+6>>0]|0)<<24|(l[a+8>>0]|0)<<8|(l[a+9>>0]|0))>>>0<=b>>>0:0){k[j>>2]=a;k[c>>2]=a;k[d>>2]=b;if(Db(m)|0){c=k[j>>2]|0;if((l[c+39>>0]|0)<<8|(l[c+40>>0]|0)){if(!(Eb(m)|0))break;if(!(Fb(m)|0))break;c=k[j>>2]|0}if(!((l[c+55>>0]|0)<<8|(l[c+56>>0]|0))){t=m;r=q;return t|0}if(Gb(m)|0?Hb(m)|0:0){t=m;r=q;return t|0}}}else p=7;while(0);if((p|0)==7)k[j>>2]=0;Mb(m);if(!(m&7)){kb(m,0,0,1,0)|0;t=0;r=q;return t|0}else{k[o>>2]=1138;k[o+4>>2]=2502;k[o+8>>2]=1504;xc(n,1084,o)|0;wc(n)|0;t=0;r=q;return t|0}return 0}function vb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,m=0;m=r;r=r+528|0;j=m;i=m+16|0;f=k[a+88>>2]|0;h=(l[f+70+(e<<2)+1>>0]|0)<<16|(l[f+70+(e<<2)>>0]|0)<<24|(l[f+70+(e<<2)+2>>0]|0)<<8|(l[f+70+(e<<2)+3>>0]|0);g=e+1|0;if(g>>>0<(l[f+16>>0]|0)>>>0)f=(l[f+70+(g<<2)+1>>0]|0)<<16|(l[f+70+(g<<2)>>0]|0)<<24|(l[f+70+(g<<2)+2>>0]|0)<<8|(l[f+70+(g<<2)+3>>0]|0);else f=k[a+8>>2]|0;if(f>>>0>h>>>0){i=a+4|0;i=k[i>>2]|0;i=i+h|0;j=f-h|0;j=wb(a,i,j,b,c,d,e)|0;r=m;return j|0}k[j>>2]=1138;k[j+4>>2]=3690;k[j+8>>2]=1780;xc(i,1084,j)|0;wc(i)|0;i=a+4|0;i=k[i>>2]|0;i=i+h|0;j=f-h|0;j=wb(a,i,j,b,c,d,e)|0;r=m;return j|0}function wb(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,m=0,n=0;n=k[a+88>>2]|0;j=((l[n+12>>0]|0)<<8|(l[n+13>>0]|0))>>>g;m=((l[n+14>>0]|0)<<8|(l[n+15>>0]|0))>>>g;j=j>>>0>1?(j+3|0)>>>2:1;m=m>>>0>1?(m+3|0)>>>2:1;n=n+18|0;g=i[n>>0]|0;g=ha(g<<24>>24==0|g<<24>>24==9?8:16,j)|0;if(f)if((f&3|0)==0&g>>>0<=f>>>0)g=f;else{a=0;return a|0}if((ha(g,m)|0)>>>0>e>>>0){a=0;return a|0}f=(j+1|0)>>>1;h=(m+1|0)>>>1;if(!c){a=0;return a|0}k[a+92>>2]=b;k[a+96>>2]=b;k[a+104>>2]=c;k[a+100>>2]=b+c;k[a+108>>2]=0;k[a+112>>2]=0;switch(l[n>>0]|0|0){case 0:{Ib(a,d,e,g,j,m,f,h)|0;a=1;return a|0}case 4:case 6:case 5:case 3:case 2:{Jb(a,d,e,g,j,m,f,h)|0;a=1;return a|0}case 9:{Kb(a,d,e,g,j,m,f,h)|0;a=1;return a|0}case 8:case 7:{Lb(a,d,e,g,j,m,f,h)|0;a=1;return a|0}default:{a=0;return a|0}}return 0}function xb(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+48|0;c=d;k[c>>2]=40;lb(a,b,c)|0;r=d;return k[c+4>>2]|0}function yb(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+48|0;c=d;k[c>>2]=40;lb(a,b,c)|0;r=d;return k[c+8>>2]|0}function zb(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+48|0;c=d;k[c>>2]=40;lb(a,b,c)|0;r=d;return k[c+12>>2]|0}function Ab(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+48|0;c=d;k[c>>2]=40;lb(a,b,c)|0;r=d;return k[c+32>>2]|0}function Bb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;g=r;r=r+576|0;e=g+40|0;d=g+56|0;h=g;k[h>>2]=40;lb(a,b,h)|0;b=((k[h+4>>2]|0)+3|0)>>>2;c=((k[h+8>>2]|0)+3|0)>>>2;h=h+32|0;a=k[h+4>>2]|0;do switch(k[h>>2]|0){case 0:{if(!a)a=8;else f=14;break}case 1:{if(!a)f=13;else f=14;break}case 2:{if(!a)f=13;else f=14;break}case 3:{if(!a)f=13;else f=14;break}case 4:{if(!a)f=13;else f=14;break}case 5:{if(!a)f=13;else f=14;break}case 6:{if(!a)f=13;else f=14;break}case 7:{if(!a)f=13;else f=14;break}case 8:{if(!a)f=13;else f=14;break}case 9:{if(!a)a=8;else f=14;break}case 10:{if(!a)a=8;else f=14;break}default:f=14}while(0);if((f|0)==13)a=16;else if((f|0)==14){k[e>>2]=1138;k[e+4>>2]=2668;k[e+8>>2]=1523;xc(d,1084,e)|0;wc(d)|0;a=0}h=ha(ha(c,b)|0,a)|0;r=g;return h|0}function Cb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0;m=r;r=r+592|0;l=m+56|0;f=m+40|0;i=m+72|0;n=m;j=m+68|0;k[n>>2]=40;lb(a,b,n)|0;g=((k[n+4>>2]|0)+3|0)>>>2;n=n+32|0;e=k[n+4>>2]|0;do switch(k[n>>2]|0){case 0:{if(!e)e=8;else h=14;break}case 1:{if(!e)h=13;else h=14;break}case 2:{if(!e)h=13;else h=14;break}case 3:{if(!e)h=13;else h=14;break}case 4:{if(!e)h=13;else h=14;break}case 5:{if(!e)h=13;else h=14;break}case 6:{if(!e)h=13;else h=14;break}case 7:{if(!e)h=13;else h=14;break}case 8:{if(!e)h=13;else h=14;break}case 9:{if(!e)e=8;else h=14;break}case 10:{if(!e)e=8;else h=14;break}default:h=14}while(0);if((h|0)==13)e=16;else if((h|0)==14){k[f>>2]=1138;k[f+4>>2]=2668;k[f+8>>2]=1523;xc(i,1084,f)|0;wc(i)|0;e=0}g=ha(e,g)|0;f=ub(a,b)|0;k[j>>2]=c;e=(f|0)==0;if(!(d>>>0<8|e)?(k[f>>2]|0)==519686845:0)vb(f,j,d,g,0)|0;if(e){r=m;return}if((k[f>>2]|0)!=519686845){r=m;return}Mb(f);if(!(f&7)){kb(f,0,0,1,0)|0;r=m;return}else{k[l>>2]=1138;k[l+4>>2]=2502;k[l+8>>2]=1504;xc(i,1084,l)|0;wc(i)|0;r=m;return}}function Db(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;g=a+92|0;d=k[a+4>>2]|0;f=a+88|0;e=k[f>>2]|0;b=(l[e+68>>0]|0)<<8|(l[e+67>>0]|0)<<16|(l[e+69>>0]|0);c=d+b|0;e=(l[e+65>>0]|0)<<8|(l[e+66>>0]|0);if(!e){a=0;return a|0}k[g>>2]=c;k[a+96>>2]=c;k[a+104>>2]=e;k[a+100>>2]=d+(e+b);k[a+108>>2]=0;k[a+112>>2]=0;if(!(qb(g,a+116|0)|0)){a=0;return a|0}b=k[f>>2]|0;do if(!((l[b+39>>0]|0)<<8|(l[b+40>>0]|0))){if(!((l[b+55>>0]|0)<<8|(l[b+56>>0]|0))){a=0;return a|0}}else{if(!(qb(g,a+140|0)|0)){a=0;return a|0}if(qb(g,a+188|0)|0){b=k[f>>2]|0;break}else{a=0;return a|0}}while(0);if((l[b+55>>0]|0)<<8|(l[b+56>>0]|0)){if(!(qb(g,a+164|0)|0)){a=0;return a|0}if(!(qb(g,a+212|0)|0)){a=0;return a|0}}a=1;return a|0}function Eb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0;q=r;r=r+576|0;h=q;g=q+64|0;p=q+16|0;d=a+88|0;b=k[d>>2]|0;o=(l[b+39>>0]|0)<<8|(l[b+40>>0]|0);m=a+236|0;f=a+240|0;c=k[f>>2]|0;if((c|0)!=(o|0)){if(c>>>0<=o>>>0){do if((k[a+244>>2]|0)>>>0>>0){if(gb(m,o,(c+1|0)==(o|0),4,0)|0){b=k[f>>2]|0;break}i[a+248>>0]=1;p=0;r=q;return p|0}else b=c;while(0);_c((k[m>>2]|0)+(b<<2)|0,0,o-b<<2|0)|0;b=k[d>>2]|0}k[f>>2]=o}j=a+92|0;c=k[a+4>>2]|0;d=(l[b+34>>0]|0)<<8|(l[b+33>>0]|0)<<16|(l[b+35>>0]|0);e=c+d|0;b=(l[b+37>>0]|0)<<8|(l[b+36>>0]|0)<<16|(l[b+38>>0]|0);if(!b){p=0;r=q;return p|0}k[j>>2]=e;k[a+96>>2]=e;k[a+104>>2]=b;k[a+100>>2]=c+(b+d);k[a+108>>2]=0;k[a+112>>2]=0;k[p+20>>2]=0;k[p>>2]=0;k[p+4>>2]=0;k[p+8>>2]=0;k[p+12>>2]=0;i[p+16>>0]=0;a=p+24|0;k[p+44>>2]=0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;k[a+12>>2]=0;i[a+16>>0]=0;if(qb(j,p)|0?(n=p+24|0,qb(j,n)|0):0){if(!(k[f>>2]|0)){k[h>>2]=1138;k[h+4>>2]=906;k[h+8>>2]=1769;xc(g,1084,h)|0;wc(g)|0}if(!o)b=1;else{d=0;e=0;f=0;b=0;g=0;a=0;h=0;c=k[m>>2]|0;while(1){d=(sb(j,p)|0)+d&31;e=(sb(j,n)|0)+e&63;f=(sb(j,p)|0)+f&31;b=(sb(j,p)|0)+b|0;g=(sb(j,n)|0)+g&63;a=(sb(j,p)|0)+a&31;k[c>>2]=e<<5|d<<11|f|b<<27|g<<21|a<<16;h=h+1|0;if((h|0)==(o|0)){b=1;break}else{b=b&31;c=c+4|0}}}}else b=0;nb(p+24|0);nb(p);p=b;r=q;return p|0}function Fb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;D=r;r=r+1008|0;g=D;f=D+496|0;C=D+472|0;A=D+276|0;B=D+80|0;z=D+16|0;e=k[a+88>>2]|0;y=(l[e+47>>0]|0)<<8|(l[e+48>>0]|0);x=a+92|0;b=k[a+4>>2]|0;c=(l[e+42>>0]|0)<<8|(l[e+41>>0]|0)<<16|(l[e+43>>0]|0);d=b+c|0;e=(l[e+45>>0]|0)<<8|(l[e+44>>0]|0)<<16|(l[e+46>>0]|0);if(!e){C=0;r=D;return C|0}k[x>>2]=d;k[a+96>>2]=d;k[a+104>>2]=e;k[a+100>>2]=b+(e+c);k[a+108>>2]=0;k[a+112>>2]=0;k[C+20>>2]=0;k[C>>2]=0;k[C+4>>2]=0;k[C+8>>2]=0;k[C+12>>2]=0;i[C+16>>0]=0;if(qb(x,C)|0){c=0;d=-3;e=-3;while(1){k[A+(c<<2)>>2]=d;k[B+(c<<2)>>2]=e;b=(d|0)>2;c=c+1|0;if((c|0)==49)break;else{d=b?-3:d+1|0;e=(b&1)+e|0}}b=z;c=b+64|0;do{k[b>>2]=0;b=b+4|0}while((b|0)<(c|0));w=a+252|0;c=a+256|0;b=k[c>>2]|0;a:do if((b|0)==(y|0))h=13;else{if(b>>>0<=y>>>0){do if((k[a+260>>2]|0)>>>0>>0)if(gb(w,y,(b+1|0)==(y|0),4,0)|0){b=k[c>>2]|0;break}else{i[a+264>>0]=1;b=0;break a}while(0);_c((k[w>>2]|0)+(b<<2)|0,0,y-b<<2|0)|0}k[c>>2]=y;h=13}while(0);do if((h|0)==13){if(!y){k[g>>2]=1138;k[g+4>>2]=906;k[g+8>>2]=1769;xc(f,1084,g)|0;wc(f)|0;b=1;break}d=z+4|0;e=z+8|0;a=z+12|0;f=z+16|0;g=z+20|0;h=z+24|0;j=z+28|0;m=z+32|0;n=z+36|0;o=z+40|0;p=z+44|0;q=z+48|0;s=z+52|0;t=z+56|0;u=z+60|0;v=0;c=k[w>>2]|0;while(1){b=0;do{E=sb(x,C)|0;w=b<<1;F=z+(w<<2)|0;k[F>>2]=(k[F>>2]|0)+(k[A+(E<<2)>>2]|0)&3;w=z+((w|1)<<2)|0;k[w>>2]=(k[w>>2]|0)+(k[B+(E<<2)>>2]|0)&3;b=b+1|0}while((b|0)!=8);k[c>>2]=(l[1713+(k[d>>2]|0)>>0]|0)<<2|(l[1713+(k[z>>2]|0)>>0]|0)|(l[1713+(k[e>>2]|0)>>0]|0)<<4|(l[1713+(k[a>>2]|0)>>0]|0)<<6|(l[1713+(k[f>>2]|0)>>0]|0)<<8|(l[1713+(k[g>>2]|0)>>0]|0)<<10|(l[1713+(k[h>>2]|0)>>0]|0)<<12|(l[1713+(k[j>>2]|0)>>0]|0)<<14|(l[1713+(k[m>>2]|0)>>0]|0)<<16|(l[1713+(k[n>>2]|0)>>0]|0)<<18|(l[1713+(k[o>>2]|0)>>0]|0)<<20|(l[1713+(k[p>>2]|0)>>0]|0)<<22|(l[1713+(k[q>>2]|0)>>0]|0)<<24|(l[1713+(k[s>>2]|0)>>0]|0)<<26|(l[1713+(k[t>>2]|0)>>0]|0)<<28|(l[1713+(k[u>>2]|0)>>0]|0)<<30;v=v+1|0;if((v|0)==(y|0)){b=1;break}else c=c+4|0}}while(0)}else b=0;nb(C);F=b;r=D;return F|0}function Gb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,m=0,n=0,o=0,p=0;p=r;r=r+560|0;h=p;g=p+40|0;o=p+16|0;e=k[a+88>>2]|0;n=(l[e+55>>0]|0)<<8|(l[e+56>>0]|0);m=a+92|0;b=k[a+4>>2]|0;c=(l[e+50>>0]|0)<<8|(l[e+49>>0]|0)<<16|(l[e+51>>0]|0);d=b+c|0;e=(l[e+53>>0]|0)<<8|(l[e+52>>0]|0)<<16|(l[e+54>>0]|0);if(!e){o=0;r=p;return o|0}k[m>>2]=d;k[a+96>>2]=d;k[a+104>>2]=e;k[a+100>>2]=b+(e+c);k[a+108>>2]=0;k[a+112>>2]=0;k[o+20>>2]=0;k[o>>2]=0;k[o+4>>2]=0;k[o+8>>2]=0;k[o+12>>2]=0;i[o+16>>0]=0;a:do if(qb(m,o)|0){f=a+268|0;c=a+272|0;b=k[c>>2]|0;if((b|0)!=(n|0)){if(b>>>0<=n>>>0){do if((k[a+276>>2]|0)>>>0>>0)if(gb(f,n,(b+1|0)==(n|0),2,0)|0){b=k[c>>2]|0;break}else{i[a+280>>0]=1;b=0;break a}while(0);_c((k[f>>2]|0)+(b<<1)|0,0,n-b<<1|0)|0}k[c>>2]=n}if(!n){k[h>>2]=1138;k[h+4>>2]=906;k[h+8>>2]=1769;xc(g,1084,h)|0;wc(g)|0;b=1;break}c=0;d=0;e=0;b=k[f>>2]|0;while(1){h=sb(m,o)|0;c=h+c&255;d=(sb(m,o)|0)+d&255;j[b>>1]=d<<8|c;e=e+1|0;if((e|0)==(n|0)){b=1;break}else b=b+2|0}}else b=0;while(0);nb(o);o=b;r=p;return o|0}function Hb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;E=r;r=r+2416|0;g=E;f=E+1904|0;D=E+1880|0;B=E+980|0;C=E+80|0;A=E+16|0;e=k[a+88>>2]|0;z=(l[e+63>>0]|0)<<8|(l[e+64>>0]|0);y=a+92|0;b=k[a+4>>2]|0;c=(l[e+58>>0]|0)<<8|(l[e+57>>0]|0)<<16|(l[e+59>>0]|0);d=b+c|0;e=(l[e+61>>0]|0)<<8|(l[e+60>>0]|0)<<16|(l[e+62>>0]|0);if(!e){D=0;r=E;return D|0}k[y>>2]=d;k[a+96>>2]=d;k[a+104>>2]=e;k[a+100>>2]=b+(e+c);k[a+108>>2]=0;k[a+112>>2]=0;k[D+20>>2]=0;k[D>>2]=0;k[D+4>>2]=0;k[D+8>>2]=0;k[D+12>>2]=0;i[D+16>>0]=0;if(qb(y,D)|0){c=0;d=-7;e=-7;while(1){k[B+(c<<2)>>2]=d;k[C+(c<<2)>>2]=e;b=(d|0)>6;c=c+1|0;if((c|0)==225)break;else{d=b?-7:d+1|0;e=(b&1)+e|0}}b=A;c=b+64|0;do{k[b>>2]=0;b=b+4|0}while((b|0)<(c|0));x=a+284|0;c=z*3|0;d=a+288|0;b=k[d>>2]|0;a:do if((b|0)==(c|0))h=13;else{if(b>>>0<=c>>>0){do if((k[a+292>>2]|0)>>>0>>0)if(gb(x,c,(b+1|0)==(c|0),2,0)|0){b=k[d>>2]|0;break}else{i[a+296>>0]=1;b=0;break a}while(0);_c((k[x>>2]|0)+(b<<1)|0,0,c-b<<1|0)|0}k[d>>2]=c;h=13}while(0);do if((h|0)==13){if(!z){k[g>>2]=1138;k[g+4>>2]=906;k[g+8>>2]=1769;xc(f,1084,g)|0;wc(f)|0;b=1;break}d=A+4|0;e=A+8|0;a=A+12|0;f=A+16|0;g=A+20|0;h=A+24|0;m=A+28|0;n=A+32|0;o=A+36|0;p=A+40|0;q=A+44|0;s=A+48|0;t=A+52|0;u=A+56|0;v=A+60|0;w=0;c=k[x>>2]|0;while(1){b=0;do{F=sb(y,D)|0;x=b<<1;G=A+(x<<2)|0;k[G>>2]=(k[G>>2]|0)+(k[B+(F<<2)>>2]|0)&7;x=A+((x|1)<<2)|0;k[x>>2]=(k[x>>2]|0)+(k[C+(F<<2)>>2]|0)&7;b=b+1|0}while((b|0)!=8);F=l[1717+(k[g>>2]|0)>>0]|0;j[c>>1]=(l[1717+(k[d>>2]|0)>>0]|0)<<3|(l[1717+(k[A>>2]|0)>>0]|0)|(l[1717+(k[e>>2]|0)>>0]|0)<<6|(l[1717+(k[a>>2]|0)>>0]|0)<<9|(l[1717+(k[f>>2]|0)>>0]|0)<<12|F<<15;G=l[1717+(k[p>>2]|0)>>0]|0;j[c+2>>1]=(l[1717+(k[h>>2]|0)>>0]|0)<<2|F>>>1|(l[1717+(k[m>>2]|0)>>0]|0)<<5|(l[1717+(k[n>>2]|0)>>0]|0)<<8|(l[1717+(k[o>>2]|0)>>0]|0)<<11|G<<14;j[c+4>>1]=(l[1717+(k[q>>2]|0)>>0]|0)<<1|G>>>2|(l[1717+(k[s>>2]|0)>>0]|0)<<4|(l[1717+(k[t>>2]|0)>>0]|0)<<7|(l[1717+(k[u>>2]|0)>>0]|0)<<10|(l[1717+(k[v>>2]|0)>>0]|0)<<13;w=w+1|0;if((w|0)==(z|0)){b=1;break}else c=c+6|0}}while(0)}else b=0;nb(D);G=b;r=E;return G|0}function Ib(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ia=0,ja=0;ga=r;r=r+656|0;ea=ga+112|0;ca=ga+96|0;ba=ga+80|0;aa=ga+64|0;$=ga+48|0;fa=ga+32|0;da=ga+16|0;_=ga;Y=ga+144|0;Z=ga+128|0;R=a+240|0;S=k[R>>2]|0;V=a+256|0;W=k[V>>2]|0;c=i[(k[a+88>>2]|0)+17>>0]|0;X=d>>>2;if(!(c<<24>>24)){r=ga;return 1}T=(h|0)==0;U=h+-1|0;K=(f&1|0)!=0;L=d<<1;M=a+92|0;N=a+116|0;O=a+140|0;P=a+236|0;Q=g+-1|0;J=(e&1|0)!=0;I=a+188|0;D=a+252|0;E=X+1|0;F=X+2|0;G=X+3|0;H=Q<<4;B=c&255;c=0;f=0;e=1;C=0;do{if(!T){z=k[b+(C<<2)>>2]|0;A=0;while(1){w=A&1;j=(w|0)==0;v=(w<<5^32)+-16|0;w=(w<<1^2)+-1|0;y=j?g:-1;m=j?0:Q;a=(A|0)==(U|0);x=K&a;if((m|0)!=(y|0)){u=K&a^1;t=j?z:z+H|0;while(1){if((e|0)==1)e=sb(M,N)|0|512;s=e&7;e=e>>>3;j=l[1811+s>>0]|0;a=0;do{p=(sb(M,O)|0)+f|0;q=p-S|0;f=q>>31;f=f&p|q&~f;if((k[R>>2]|0)>>>0<=f>>>0){k[_>>2]=1138;k[_+4>>2]=906;k[_+8>>2]=1769;xc(Y,1084,_)|0;wc(Y)|0}k[Z+(a<<2)>>2]=k[(k[P>>2]|0)+(f<<2)>>2];a=a+1|0}while(a>>>0>>0);q=J&(m|0)==(Q|0);if(x|q){p=0;do{n=ha(p,d)|0;a=t+n|0;j=(p|0)==0|u;o=p<<1;ja=(sb(M,I)|0)+c|0;ia=ja-W|0;c=ia>>31;c=c&ja|ia&~c;do if(q){if(!j){ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;break}k[a>>2]=k[Z+((l[1819+(s<<2)+o>>0]|0)<<2)>>2];if((k[V>>2]|0)>>>0<=c>>>0){k[ca>>2]=1138;k[ca+4>>2]=906;k[ca+8>>2]=1769;xc(Y,1084,ca)|0;wc(Y)|0}k[t+(n+4)>>2]=k[(k[D>>2]|0)+(c<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c}else{if(!j){ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;break}k[a>>2]=k[Z+((l[1819+(s<<2)+o>>0]|0)<<2)>>2];if((k[V>>2]|0)>>>0<=c>>>0){k[ba>>2]=1138;k[ba+4>>2]=906;k[ba+8>>2]=1769;xc(Y,1084,ba)|0;wc(Y)|0}k[t+(n+4)>>2]=k[(k[D>>2]|0)+(c<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;k[t+(n+8)>>2]=k[Z+((l[(o|1)+(1819+(s<<2))>>0]|0)<<2)>>2];if((k[V>>2]|0)>>>0<=c>>>0){k[ea>>2]=1138;k[ea+4>>2]=906;k[ea+8>>2]=1769;xc(Y,1084,ea)|0;wc(Y)|0}k[t+(n+12)>>2]=k[(k[D>>2]|0)+(c<<2)>>2]}while(0);p=p+1|0}while((p|0)!=2)}else{k[t>>2]=k[Z+((l[1819+(s<<2)>>0]|0)<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;if((k[V>>2]|0)>>>0<=c>>>0){k[da>>2]=1138;k[da+4>>2]=906;k[da+8>>2]=1769;xc(Y,1084,da)|0;wc(Y)|0}k[t+4>>2]=k[(k[D>>2]|0)+(c<<2)>>2];k[t+8>>2]=k[Z+((l[1819+(s<<2)+1>>0]|0)<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;if((k[V>>2]|0)>>>0<=c>>>0){k[fa>>2]=1138;k[fa+4>>2]=906;k[fa+8>>2]=1769;xc(Y,1084,fa)|0;wc(Y)|0}k[t+12>>2]=k[(k[D>>2]|0)+(c<<2)>>2];k[t+(X<<2)>>2]=k[Z+((l[1819+(s<<2)+2>>0]|0)<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;if((k[V>>2]|0)>>>0<=c>>>0){k[$>>2]=1138;k[$+4>>2]=906;k[$+8>>2]=1769;xc(Y,1084,$)|0;wc(Y)|0}k[t+(E<<2)>>2]=k[(k[D>>2]|0)+(c<<2)>>2];k[t+(F<<2)>>2]=k[Z+((l[1819+(s<<2)+3>>0]|0)<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;if((k[V>>2]|0)>>>0<=c>>>0){k[aa>>2]=1138;k[aa+4>>2]=906;k[aa+8>>2]=1769;xc(Y,1084,aa)|0;wc(Y)|0}k[t+(G<<2)>>2]=k[(k[D>>2]|0)+(c<<2)>>2]}m=m+w|0;if((m|0)==(y|0))break;else t=t+v|0}}A=A+1|0;if((A|0)==(h|0))break;else z=z+L|0}}C=C+1|0}while((C|0)!=(B|0));r=ga;return 1}function Jb(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0;ma=r;r=r+608|0;ja=ma+48|0;la=ma+32|0;ka=ma+16|0;ia=ma;ga=ma+96|0;ha=ma+80|0;fa=ma+64|0;S=a+240|0;T=k[S>>2]|0;W=a+256|0;ca=k[W>>2]|0;da=a+272|0;ea=k[da>>2]|0;c=k[a+88>>2]|0;U=(l[c+63>>0]|0)<<8|(l[c+64>>0]|0);c=i[c+17>>0]|0;if(!(c<<24>>24)){r=ma;return 1}V=(h|0)==0;X=h+-1|0;Y=d<<1;Z=a+92|0;_=a+116|0;$=g+-1|0;aa=a+212|0;ba=a+188|0;R=(e&1|0)==0;Q=(f&1|0)==0;K=a+288|0;L=a+284|0;M=a+252|0;N=a+140|0;O=a+236|0;P=a+164|0;I=a+268|0;J=$<<5;G=c&255;c=0;e=0;f=0;a=0;j=1;H=0;do{if(!V){E=k[b+(H<<2)>>2]|0;F=0;while(1){C=F&1;n=(C|0)==0;B=(C<<6^64)+-32|0;C=(C<<1^2)+-1|0;D=n?g:-1;o=n?0:$;if((o|0)!=(D|0)){A=Q|(F|0)!=(X|0);z=n?E:E+J|0;while(1){if((j|0)==1)j=sb(Z,_)|0|512;y=j&7;j=j>>>3;p=l[1811+y>>0]|0;n=0;do{w=(sb(Z,P)|0)+e|0;x=w-ea|0;e=x>>31;e=e&w|x&~e;if((k[da>>2]|0)>>>0<=e>>>0){k[ia>>2]=1138;k[ia+4>>2]=906;k[ia+8>>2]=1769;xc(ga,1084,ia)|0;wc(ga)|0}k[fa+(n<<2)>>2]=m[(k[I>>2]|0)+(e<<1)>>1];n=n+1|0}while(n>>>0

    >>0);n=0;do{w=(sb(Z,N)|0)+a|0;x=w-T|0;a=x>>31;a=a&w|x&~a;if((k[S>>2]|0)>>>0<=a>>>0){k[ka>>2]=1138;k[ka+4>>2]=906;k[ka+8>>2]=1769;xc(ga,1084,ka)|0;wc(ga)|0}k[ha+(n<<2)>>2]=k[(k[O>>2]|0)+(a<<2)>>2];n=n+1|0}while(n>>>0

    >>0);x=R|(o|0)!=($|0);v=0;w=z;while(1){u=A|(v|0)==0;t=v<<1;q=0;s=w;while(1){p=(sb(Z,aa)|0)+c|0;n=p-U|0;c=n>>31;c=c&p|n&~c;n=(sb(Z,ba)|0)+f|0;p=n-ca|0;f=p>>31;f=f&n|p&~f;if((x|(q|0)==0)&u){n=l[q+t+(1819+(y<<2))>>0]|0;p=c*3|0;if((k[K>>2]|0)>>>0<=p>>>0){k[la>>2]=1138;k[la+4>>2]=906;k[la+8>>2]=1769;xc(ga,1084,la)|0;wc(ga)|0}na=k[L>>2]|0;k[s>>2]=(m[na+(p<<1)>>1]|0)<<16|k[fa+(n<<2)>>2];k[s+4>>2]=(m[na+(p+2<<1)>>1]|0)<<16|(m[na+(p+1<<1)>>1]|0);k[s+8>>2]=k[ha+(n<<2)>>2];if((k[W>>2]|0)>>>0<=f>>>0){k[ja>>2]=1138;k[ja+4>>2]=906;k[ja+8>>2]=1769;xc(ga,1084,ja)|0;wc(ga)|0}k[s+12>>2]=k[(k[M>>2]|0)+(f<<2)>>2]}q=q+1|0;if((q|0)==2)break;else s=s+16|0}v=v+1|0;if((v|0)==2)break;else w=w+d|0}o=o+C|0;if((o|0)==(D|0))break;else z=z+B|0}}F=F+1|0;if((F|0)==(h|0))break;else E=E+Y|0}}H=H+1|0}while((H|0)!=(G|0));r=ma;return 1}function Kb(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;$=r;r=r+576|0;_=$+32|0;Z=$+16|0;Y=$;X=$+64|0;W=$+48|0;M=a+272|0;N=k[M>>2]|0;c=k[a+88>>2]|0;O=(l[c+63>>0]|0)<<8|(l[c+64>>0]|0);c=i[c+17>>0]|0;if(!(c<<24>>24)){r=$;return 1}P=(h|0)==0;Q=h+-1|0;R=d<<1;S=a+92|0;T=a+116|0;U=g+-1|0;V=a+212|0;L=(f&1|0)==0;I=a+288|0;J=a+284|0;K=a+164|0;G=a+268|0;H=U<<4;F=c&255;E=(e&1|0)!=0;c=0;f=0;a=1;D=0;do{if(!P){B=k[b+(D<<2)>>2]|0;C=0;while(1){z=C&1;e=(z|0)==0;y=(z<<5^32)+-16|0;z=(z<<1^2)+-1|0;A=e?g:-1;j=e?0:U;if((j|0)!=(A|0)){x=L|(C|0)!=(Q|0);w=e?B:B+H|0;while(1){if((a|0)==1)a=sb(S,T)|0|512;v=a&7;a=a>>>3;n=l[1811+v>>0]|0;e=0;do{t=(sb(S,K)|0)+f|0;u=t-N|0;f=u>>31;f=f&t|u&~f;if((k[M>>2]|0)>>>0<=f>>>0){k[Y>>2]=1138;k[Y+4>>2]=906;k[Y+8>>2]=1769;xc(X,1084,Y)|0;wc(X)|0}k[W+(e<<2)>>2]=m[(k[G>>2]|0)+(f<<1)>>1];e=e+1|0}while(e>>>0>>0);u=(j|0)==(U|0)&E;s=0;t=w;while(1){q=x|(s|0)==0;p=s<<1;e=(sb(S,V)|0)+c|0;o=e-O|0;n=o>>31;n=n&e|o&~n;if(q){c=l[1819+(v<<2)+p>>0]|0;e=n*3|0;if((k[I>>2]|0)>>>0<=e>>>0){k[Z>>2]=1138;k[Z+4>>2]=906;k[Z+8>>2]=1769;xc(X,1084,Z)|0;wc(X)|0}o=k[J>>2]|0;k[t>>2]=(m[o+(e<<1)>>1]|0)<<16|k[W+(c<<2)>>2];k[t+4>>2]=(m[o+(e+2<<1)>>1]|0)<<16|(m[o+(e+1<<1)>>1]|0)}o=t+8|0;e=(sb(S,V)|0)+n|0;n=e-O|0;c=n>>31;c=c&e|n&~c;if(!(u|q^1)){e=l[(p|1)+(1819+(v<<2))>>0]|0;n=c*3|0;if((k[I>>2]|0)>>>0<=n>>>0){k[_>>2]=1138;k[_+4>>2]=906;k[_+8>>2]=1769;xc(X,1084,_)|0;wc(X)|0}q=k[J>>2]|0;k[o>>2]=(m[q+(n<<1)>>1]|0)<<16|k[W+(e<<2)>>2];k[t+12>>2]=(m[q+(n+2<<1)>>1]|0)<<16|(m[q+(n+1<<1)>>1]|0)}s=s+1|0;if((s|0)==2)break;else t=t+d|0}j=j+z|0;if((j|0)==(A|0))break;else w=w+y|0}}C=C+1|0;if((C|0)==(h|0))break;else B=B+R|0}}D=D+1|0}while((D|0)!=(F|0));r=$;return 1}function Lb(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;ha=r;r=r+608|0;ea=ha+48|0;ga=ha+32|0;fa=ha+16|0;da=ha;ca=ha+96|0;aa=ha+80|0;ba=ha+64|0;S=a+272|0;T=k[S>>2]|0;c=k[a+88>>2]|0;U=(l[c+63>>0]|0)<<8|(l[c+64>>0]|0);c=i[c+17>>0]|0;if(!(c<<24>>24)){r=ha;return 1}V=(h|0)==0;W=h+-1|0;X=d<<1;Y=a+92|0;Z=a+116|0;_=g+-1|0;$=a+212|0;R=(e&1|0)==0;Q=(f&1|0)==0;N=a+288|0;O=a+284|0;P=a+164|0;L=a+268|0;M=_<<5;J=c&255;c=0;e=0;f=0;a=0;j=1;K=0;do{if(!V){H=k[b+(K<<2)>>2]|0;I=0;while(1){F=I&1;n=(F|0)==0;E=(F<<6^64)+-32|0;F=(F<<1^2)+-1|0;G=n?g:-1;o=n?0:_;if((o|0)!=(G|0)){D=Q|(I|0)!=(W|0);C=n?H:H+M|0;while(1){if((j|0)==1)j=sb(Y,Z)|0|512;B=j&7;j=j>>>3;p=l[1811+B>>0]|0;n=0;do{z=(sb(Y,P)|0)+a|0;A=z-T|0;a=A>>31;a=a&z|A&~a;if((k[S>>2]|0)>>>0<=a>>>0){k[da>>2]=1138;k[da+4>>2]=906;k[da+8>>2]=1769;xc(ca,1084,da)|0;wc(ca)|0}k[aa+(n<<2)>>2]=m[(k[L>>2]|0)+(a<<1)>>1];n=n+1|0}while(n>>>0

    >>0);n=0;do{z=(sb(Y,P)|0)+e|0;A=z-T|0;e=A>>31;e=e&z|A&~e;if((k[S>>2]|0)>>>0<=e>>>0){k[fa>>2]=1138;k[fa+4>>2]=906;k[fa+8>>2]=1769;xc(ca,1084,fa)|0;wc(ca)|0}k[ba+(n<<2)>>2]=m[(k[L>>2]|0)+(e<<1)>>1];n=n+1|0}while(n>>>0

    >>0);A=R|(o|0)!=(_|0);y=0;z=C;while(1){x=D|(y|0)==0;w=y<<1;u=0;v=z;while(1){t=(sb(Y,$)|0)+f|0;s=t-U|0;f=s>>31;f=f&t|s&~f;s=(sb(Y,$)|0)+c|0;t=s-U|0;c=t>>31;c=c&s|t&~c;if((A|(u|0)==0)&x){s=l[u+w+(1819+(B<<2))>>0]|0;t=f*3|0;n=k[N>>2]|0;if(n>>>0<=t>>>0){k[ga>>2]=1138;k[ga+4>>2]=906;k[ga+8>>2]=1769;xc(ca,1084,ga)|0;wc(ca)|0;n=k[N>>2]|0}p=k[O>>2]|0;q=c*3|0;if(n>>>0>q>>>0)n=p;else{k[ea>>2]=1138;k[ea+4>>2]=906;k[ea+8>>2]=1769;xc(ca,1084,ea)|0;wc(ca)|0;n=k[O>>2]|0}k[v>>2]=(m[p+(t<<1)>>1]|0)<<16|k[aa+(s<<2)>>2];k[v+4>>2]=(m[p+(t+2<<1)>>1]|0)<<16|(m[p+(t+1<<1)>>1]|0);k[v+8>>2]=(m[n+(q<<1)>>1]|0)<<16|k[ba+(s<<2)>>2];k[v+12>>2]=(m[n+(q+2<<1)>>1]|0)<<16|(m[n+(q+1<<1)>>1]|0)}u=u+1|0;if((u|0)==2)break;else v=v+16|0}y=y+1|0;if((y|0)==2)break;else z=z+d|0}o=o+F|0;if((o|0)==(G|0))break;else C=C+E|0}}I=I+1|0;if((I|0)==(h|0))break;else H=H+X|0}}K=K+1|0}while((K|0)!=(J|0));r=ha;return 1}function Mb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0;j=r;r=r+576|0;h=j+48|0;f=j+32|0;e=j+16|0;d=j;g=j+64|0;k[a>>2]=0;b=a+284|0;c=k[b>>2]|0;if(c){if(!(c&7))kb(c,0,0,1,0)|0;else{k[d>>2]=1138;k[d+4>>2]=2502;k[d+8>>2]=1504;xc(g,1084,d)|0;wc(g)|0}k[b>>2]=0;k[a+288>>2]=0;k[a+292>>2]=0}i[a+296>>0]=0;c=a+268|0;b=k[c>>2]|0;if(b){if(!(b&7))kb(b,0,0,1,0)|0;else{k[e>>2]=1138;k[e+4>>2]=2502;k[e+8>>2]=1504;xc(g,1084,e)|0;wc(g)|0}k[c>>2]=0;k[a+272>>2]=0;k[a+276>>2]=0}i[a+280>>0]=0;b=a+252|0;c=k[b>>2]|0;if(c){if(!(c&7))kb(c,0,0,1,0)|0;else{k[f>>2]=1138;k[f+4>>2]=2502;k[f+8>>2]=1504;xc(g,1084,f)|0;wc(g)|0}k[b>>2]=0;k[a+256>>2]=0;k[a+260>>2]=0}i[a+264>>0]=0;b=a+236|0;c=k[b>>2]|0;if(!c){h=a+248|0;i[h>>0]=0;h=a+212|0;nb(h);h=a+188|0;nb(h);h=a+164|0;nb(h);h=a+140|0;nb(h);h=a+116|0;nb(h);r=j;return}if(!(c&7))kb(c,0,0,1,0)|0;else{k[h>>2]=1138;k[h+4>>2]=2502;k[h+8>>2]=1504;xc(g,1084,h)|0;wc(g)|0}k[b>>2]=0;k[a+240>>2]=0;k[a+244>>2]=0;h=a+248|0;i[h>>0]=0;h=a+212|0;nb(h);h=a+188|0;nb(h);h=a+164|0;nb(h);h=a+140|0;nb(h);h=a+116|0;nb(h);r=j;return}function Nb(a,b){a=a|0;b=b|0;var c=0;c=r;r=r+16|0;k[c>>2]=b;b=k[60]|0;yc(b,a,c)|0;sc(10,b)|0;Aa()}function Ob(){var a=0,b=0;a=r;r=r+16|0;if(!(Ka(192,2)|0)){b=va(k[47]|0)|0;r=a;return b|0}else Nb(2078,a);return 0}function Pb(a){a=a|0;Sc(a);return}function Qb(a){a=a|0;var b=0;b=r;r=r+16|0;Wa[a&3]();Nb(2127,b)}function Rb(){var a=0,b=0;a=Ob()|0;if(((a|0)!=0?(b=k[a>>2]|0,(b|0)!=0):0)?(a=b+48|0,(k[a>>2]&-256|0)==1126902528?(k[a+4>>2]|0)==1129074247:0):0)Qb(k[b+12>>2]|0);b=k[26]|0;k[26]=b+0;Qb(b)}function Sb(a){a=a|0;return}function Tb(a){a=a|0;return}function Ub(a){a=a|0;return}function Vb(a){a=a|0;return}function Wb(a){a=a|0;Pb(a);return}function Xb(a){a=a|0;Pb(a);return}function Yb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;g=r;r=r+64|0;f=g;if((a|0)!=(b|0))if((b|0)!=0?(e=ac(b,24,40,0)|0,(e|0)!=0):0){b=f;d=b+56|0;do{k[b>>2]=0;b=b+4|0}while((b|0)<(d|0));k[f>>2]=e;k[f+8>>2]=a;k[f+12>>2]=-1;k[f+48>>2]=1;Ya[k[(k[e>>2]|0)+28>>2]&3](e,f,k[c>>2]|0,1);if((k[f+24>>2]|0)==1){k[c>>2]=k[f+16>>2];b=1}else b=0}else b=0;else b=1;r=g;return b|0}function Zb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;a=b+16|0;e=k[a>>2]|0;do if(e){if((e|0)!=(c|0)){d=b+36|0;k[d>>2]=(k[d>>2]|0)+1;k[b+24>>2]=2;i[b+54>>0]=1;break}a=b+24|0;if((k[a>>2]|0)==2)k[a>>2]=d}else{k[a>>2]=c;k[b+24>>2]=d;k[b+36>>2]=1}while(0);return}function _b(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((a|0)==(k[b+8>>2]|0))Zb(0,b,c,d);return}function $b(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((a|0)==(k[b+8>>2]|0))Zb(0,b,c,d);else{a=k[a+8>>2]|0;Ya[k[(k[a>>2]|0)+28>>2]&3](a,b,c,d)}return}function ac(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,l=0,m=0,n=0,o=0,p=0,q=0;q=r;r=r+64|0;p=q;o=k[a>>2]|0;n=a+(k[o+-8>>2]|0)|0;o=k[o+-4>>2]|0;k[p>>2]=c;k[p+4>>2]=a;k[p+8>>2]=b;k[p+12>>2]=d;d=p+16|0;a=p+20|0;b=p+24|0;e=p+28|0;f=p+32|0;g=p+40|0;h=(o|0)==(c|0);l=d;m=l+36|0;do{k[l>>2]=0;l=l+4|0}while((l|0)<(m|0));j[d+36>>1]=0;i[d+38>>0]=0;a:do if(h){k[p+48>>2]=1;Xa[k[(k[c>>2]|0)+20>>2]&3](c,p,n,n,1,0);d=(k[b>>2]|0)==1?n:0}else{Sa[k[(k[o>>2]|0)+24>>2]&3](o,p,n,1,0);switch(k[p+36>>2]|0){case 0:{d=(k[g>>2]|0)==1&(k[e>>2]|0)==1&(k[f>>2]|0)==1?k[a>>2]|0:0;break a}case 1:break;default:{d=0;break a}}if((k[b>>2]|0)!=1?!((k[g>>2]|0)==0&(k[e>>2]|0)==1&(k[f>>2]|0)==1):0){d=0;break}d=k[d>>2]|0}while(0);r=q;return d|0}function bc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;i[b+53>>0]=1;do if((k[b+4>>2]|0)==(d|0)){i[b+52>>0]=1;d=b+16|0;a=k[d>>2]|0;if(!a){k[d>>2]=c;k[b+24>>2]=e;k[b+36>>2]=1;if(!((e|0)==1?(k[b+48>>2]|0)==1:0))break;i[b+54>>0]=1;break}if((a|0)!=(c|0)){e=b+36|0;k[e>>2]=(k[e>>2]|0)+1;i[b+54>>0]=1;break}a=b+24|0;d=k[a>>2]|0;if((d|0)==2){k[a>>2]=e;d=e}if((d|0)==1?(k[b+48>>2]|0)==1:0)i[b+54>>0]=1}while(0);return}function cc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;a:do if((a|0)==(k[b+8>>2]|0)){if((k[b+4>>2]|0)==(c|0)?(f=b+28|0,(k[f>>2]|0)!=1):0)k[f>>2]=d}else{if((a|0)!=(k[b>>2]|0)){h=k[a+8>>2]|0;Sa[k[(k[h>>2]|0)+24>>2]&3](h,b,c,d,e);break}if((k[b+16>>2]|0)!=(c|0)?(g=b+20|0,(k[g>>2]|0)!=(c|0)):0){k[b+32>>2]=d;d=b+44|0;if((k[d>>2]|0)==4)break;f=b+52|0;i[f>>0]=0;j=b+53|0;i[j>>0]=0;a=k[a+8>>2]|0;Xa[k[(k[a>>2]|0)+20>>2]&3](a,b,c,c,1,e);if(i[j>>0]|0){if(!(i[f>>0]|0)){f=1;h=13}}else{f=0;h=13}do if((h|0)==13){k[g>>2]=c;j=b+40|0;k[j>>2]=(k[j>>2]|0)+1;if((k[b+36>>2]|0)==1?(k[b+24>>2]|0)==2:0){i[b+54>>0]=1;if(f)break}else h=16;if((h|0)==16?f:0)break;k[d>>2]=4;break a}while(0);k[d>>2]=3;break}if((d|0)==1)k[b+32>>2]=1}while(0);return}function dc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;do if((a|0)==(k[b+8>>2]|0)){if((k[b+4>>2]|0)==(c|0)?(g=b+28|0,(k[g>>2]|0)!=1):0)k[g>>2]=d}else if((a|0)==(k[b>>2]|0)){if((k[b+16>>2]|0)!=(c|0)?(f=b+20|0,(k[f>>2]|0)!=(c|0)):0){k[b+32>>2]=d;k[f>>2]=c;e=b+40|0;k[e>>2]=(k[e>>2]|0)+1;if((k[b+36>>2]|0)==1?(k[b+24>>2]|0)==2:0)i[b+54>>0]=1;k[b+44>>2]=4;break}if((d|0)==1)k[b+32>>2]=1}while(0);return}function ec(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if((a|0)==(k[b+8>>2]|0))bc(0,b,c,d,e);else{a=k[a+8>>2]|0;Xa[k[(k[a>>2]|0)+20>>2]&3](a,b,c,d,e,f)}return}function fc(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if((a|0)==(k[b+8>>2]|0))bc(0,b,c,d,e);return}function gc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=r;r=r+16|0;d=e;k[d>>2]=k[c>>2];a=Ra[k[(k[a>>2]|0)+16>>2]&7](a,b,d)|0;if(a)k[c>>2]=k[d>>2];r=e;return a&1|0}function hc(a){a=a|0;if(!a)a=0;else a=(ac(a,24,72,0)|0)!=0;return a&1|0}function ic(){var a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;e=r;r=r+48|0;g=e+32|0;c=e+24|0;h=e+16|0;f=e;e=e+36|0;a=Ob()|0;if((a|0)!=0?(d=k[a>>2]|0,(d|0)!=0):0){a=d+48|0;b=k[a>>2]|0;a=k[a+4>>2]|0;if(!((b&-256|0)==1126902528&(a|0)==1129074247)){k[c>>2]=2406;Nb(2356,c)}if((b|0)==1126902529&(a|0)==1129074247)a=k[d+44>>2]|0;else a=d+80|0;k[e>>2]=a;d=k[d>>2]|0;a=k[d+4>>2]|0;if(Ra[k[(k[8>>2]|0)+16>>2]&7](8,d,e)|0){h=k[e>>2]|0;h=Ua[k[(k[h>>2]|0)+8>>2]&1](h)|0;k[f>>2]=2406;k[f+4>>2]=a;k[f+8>>2]=h;Nb(2270,f)}else{k[h>>2]=2406;k[h+4>>2]=a;Nb(2315,h)}}Nb(2394,g)}function jc(){var a=0;a=r;r=r+16|0;if(!(Fa(188,6)|0)){r=a;return}else Nb(2167,a)}function kc(a){a=a|0;var b=0;b=r;r=r+16|0;Sc(a);if(!(wa(k[47]|0,0)|0)){r=b;return}else Nb(2217,b)}function lc(a){a=a|0;var b=0,c=0;b=0;while(1){if((l[2415+b>>0]|0)==(a|0)){c=2;break}b=b+1|0;if((b|0)==87){b=87;a=2503;c=5;break}}if((c|0)==2)if(!b)a=2503;else{a=2503;c=5}if((c|0)==5)while(1){c=a;while(1){a=c+1|0;if(!(i[c>>0]|0))break;else c=a}b=b+-1|0;if(!b)break;else c=5}return a|0}function mc(){var a=0;if(!0)a=248;else{a=(za()|0)+60|0;a=k[a>>2]|0}return a|0}function nc(a){a=a|0;var b=0;if(a>>>0>4294963200){b=mc()|0;k[b>>2]=0-a;a=-1}return a|0}function oc(a,b){a=+a;b=b|0;var c=0,d=0,e=0;p[t>>3]=a;c=k[t>>2]|0;d=k[t+4>>2]|0;e=$c(c|0,d|0,52)|0;e=e&2047;switch(e|0){case 0:{if(a!=0.0){a=+oc(a*18446744073709552.0e3,b);c=(k[b>>2]|0)+-64|0}else c=0;k[b>>2]=c;break}case 2047:break;default:{k[b>>2]=e+-1022;k[t>>2]=c;k[t+4>>2]=d&-2146435073|1071644672;a=+p[t>>3]}}return +a}function pc(a,b){a=+a;b=b|0;return +(+oc(a,b))}function qc(a,b,c){a=a|0;b=b|0;c=c|0;do if(a){if(b>>>0<128){i[a>>0]=b;a=1;break}if(b>>>0<2048){i[a>>0]=b>>>6|192;i[a+1>>0]=b&63|128;a=2;break}if(b>>>0<55296|(b&-8192|0)==57344){i[a>>0]=b>>>12|224;i[a+1>>0]=b>>>6&63|128;i[a+2>>0]=b&63|128;a=3;break}if((b+-65536|0)>>>0<1048576){i[a>>0]=b>>>18|240;i[a+1>>0]=b>>>12&63|128;i[a+2>>0]=b>>>6&63|128;i[a+3>>0]=b&63|128;a=4;break}else{a=mc()|0;k[a>>2]=84;a=-1;break}}else a=1;while(0);return a|0}function rc(a,b){a=a|0;b=b|0;if(!a)a=0;else a=qc(a,b,0)|0;return a|0}function sc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;if((k[b+76>>2]|0)>=0?(Bc(b)|0)!=0:0){if((i[b+75>>0]|0)!=(a|0)?(d=b+20|0,e=k[d>>2]|0,e>>>0<(k[b+16>>2]|0)>>>0):0){k[d>>2]=e+1;i[e>>0]=a;c=a&255}else c=Dc(b,a)|0;Cc(b)}else g=3;do if((g|0)==3){if((i[b+75>>0]|0)!=(a|0)?(f=b+20|0,c=k[f>>2]|0,c>>>0<(k[b+16>>2]|0)>>>0):0){k[f>>2]=c+1;i[c>>0]=a;c=a&255;break}c=Dc(b,a)|0}while(0);return c|0}function tc(a,b){a=a|0;b=b|0;return (vc(a,Kc(a)|0,1,b)|0)+-1|0}function uc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=c+16|0;e=k[d>>2]|0;if(!e)if(!(Ic(c)|0)){e=k[d>>2]|0;f=4}else d=0;else f=4;a:do if((f|0)==4){g=c+20|0;f=k[g>>2]|0;if((e-f|0)>>>0>>0){d=Ra[k[c+36>>2]&7](c,a,b)|0;break}b:do if((i[c+75>>0]|0)>-1){d=b;while(1){if(!d){e=f;d=0;break b}e=d+-1|0;if((i[a+e>>0]|0)==10)break;else d=e}if((Ra[k[c+36>>2]&7](c,a,d)|0)>>>0>>0)break a;b=b-d|0;a=a+d|0;e=k[g>>2]|0}else{e=f;d=0}while(0);bd(e|0,a|0,b|0)|0;k[g>>2]=(k[g>>2]|0)+b;d=d+b|0}while(0);return d|0}function vc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=ha(c,b)|0;if((k[d+76>>2]|0)>-1){f=(Bc(d)|0)==0;a=uc(a,e,d)|0;if(!f)Cc(d)}else a=uc(a,e,d)|0;if((a|0)!=(e|0))c=(a>>>0)/(b>>>0)|0;return c|0}function wc(a){a=a|0;var b=0,c=0,d=0,e=0;d=k[61]|0;if((k[d+76>>2]|0)>-1)e=Bc(d)|0;else e=0;do if((tc(a,d)|0)<0)b=1;else{if((i[d+75>>0]|0)!=10?(b=d+20|0,c=k[b>>2]|0,c>>>0<(k[d+16>>2]|0)>>>0):0){k[b>>2]=c+1;i[c>>0]=10;b=0;break}b=(Dc(d,10)|0)<0}while(0);if(e)Cc(d);return b<<31>>31|0}function xc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=r;r=r+16|0;e=d;k[e>>2]=c;c=Ac(a,b,e)|0;r=d;return c|0}function yc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0;s=r;r=r+224|0;n=s+120|0;q=s+80|0;p=s;o=s+136|0;d=q;e=d+40|0;do{k[d>>2]=0;d=d+4|0}while((d|0)<(e|0));k[n>>2]=k[c>>2];if((Lc(0,b,n,p,q)|0)<0)c=-1;else{if((k[a+76>>2]|0)>-1)l=Bc(a)|0;else l=0;c=k[a>>2]|0;m=c&32;if((i[a+74>>0]|0)<1)k[a>>2]=c&-33;c=a+48|0;if(!(k[c>>2]|0)){e=a+44|0;f=k[e>>2]|0;k[e>>2]=o;g=a+28|0;k[g>>2]=o;h=a+20|0;k[h>>2]=o;k[c>>2]=80;j=a+16|0;k[j>>2]=o+80;d=Lc(a,b,n,p,q)|0;if(f){Ra[k[a+36>>2]&7](a,0,0)|0;d=(k[h>>2]|0)==0?-1:d;k[e>>2]=f;k[c>>2]=0;k[j>>2]=0;k[g>>2]=0;k[h>>2]=0}}else d=Lc(a,b,n,p,q)|0;c=k[a>>2]|0;k[a>>2]=c|m;if(l)Cc(a);c=(c&32|0)==0?d:-1}r=s;return c|0}function zc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,l=0,m=0;m=r;r=r+128|0;e=m+112|0;l=m;f=l;g=252;h=f+112|0;do{k[f>>2]=k[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));if((b+-1|0)>>>0>2147483646)if(!b){b=1;j=4}else{b=mc()|0;k[b>>2]=75;b=-1}else{e=a;j=4}if((j|0)==4){j=-2-e|0;j=b>>>0>j>>>0?j:b;k[l+48>>2]=j;a=l+20|0;k[a>>2]=e;k[l+44>>2]=e;b=e+j|0;e=l+16|0;k[e>>2]=b;k[l+28>>2]=b;b=yc(l,c,d)|0;if(j){c=k[a>>2]|0;i[c+(((c|0)==(k[e>>2]|0))<<31>>31)>>0]=0}}r=m;return b|0}function Ac(a,b,c){a=a|0;b=b|0;c=c|0;return zc(a,2147483647,b,c)|0}function Bc(a){a=a|0;return 0}function Cc(a){a=a|0;return}function Dc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0;j=r;r=r+16|0;h=j;g=b&255;i[h>>0]=g;d=a+16|0;e=k[d>>2]|0;if(!e)if(!(Ic(a)|0)){e=k[d>>2]|0;f=4}else c=-1;else f=4;do if((f|0)==4){d=a+20|0;f=k[d>>2]|0;if(f>>>0>>0?(c=b&255,(c|0)!=(i[a+75>>0]|0)):0){k[d>>2]=f+1;i[f>>0]=g;break}if((Ra[k[a+36>>2]&7](a,h,1)|0)==1)c=l[h>>0]|0;else c=-1}while(0);r=j;return c|0}function Ec(a){a=a|0;var b=0,c=0;b=r;r=r+16|0;c=b;k[c>>2]=k[a+60>>2];a=nc(Ca(6,c|0)|0)|0;r=b;return a|0}function Fc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;e=r;r=r+32|0;f=e;d=e+20|0;k[f>>2]=k[a+60>>2];k[f+4>>2]=0;k[f+8>>2]=b;k[f+12>>2]=d;k[f+16>>2]=c;if((nc(Ja(140,f|0)|0)|0)<0){k[d>>2]=-1;a=-1}else a=k[d>>2]|0;r=e;return a|0}function Gc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;p=r;r=r+48|0;m=p+16|0;l=p;d=p+32|0;n=a+28|0;e=k[n>>2]|0;k[d>>2]=e;o=a+20|0;e=(k[o>>2]|0)-e|0;k[d+4>>2]=e;k[d+8>>2]=b;k[d+12>>2]=c;i=a+60|0;j=a+44|0;b=2;e=e+c|0;while(1){if(!(k[49]|0)){k[m>>2]=k[i>>2];k[m+4>>2]=d;k[m+8>>2]=b;g=nc(Na(146,m|0)|0)|0}else{Ba(7,a|0);k[l>>2]=k[i>>2];k[l+4>>2]=d;k[l+8>>2]=b;g=nc(Na(146,l|0)|0)|0;ua(0)}if((e|0)==(g|0)){e=6;break}if((g|0)<0){e=8;break}e=e-g|0;f=k[d+4>>2]|0;if(g>>>0<=f>>>0)if((b|0)==2){k[n>>2]=(k[n>>2]|0)+g;h=f;b=2}else h=f;else{h=k[j>>2]|0;k[n>>2]=h;k[o>>2]=h;h=k[d+12>>2]|0;g=g-f|0;d=d+8|0;b=b+-1|0}k[d>>2]=(k[d>>2]|0)+g;k[d+4>>2]=h-g}if((e|0)==6){m=k[j>>2]|0;k[a+16>>2]=m+(k[a+48>>2]|0);a=m;k[n>>2]=a;k[o>>2]=a}else if((e|0)==8){k[a+16>>2]=0;k[n>>2]=0;k[o>>2]=0;k[a>>2]=k[a>>2]|32;if((b|0)==2)c=0;else c=c-(k[d+4>>2]|0)|0}r=p;return c|0}function Hc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=r;r=r+80|0;d=e;k[a+36>>2]=3;if((k[a>>2]&64|0)==0?(k[d>>2]=k[a+60>>2],k[d+4>>2]=21505,k[d+8>>2]=e+12,(Ia(54,d|0)|0)!=0):0)i[a+75>>0]=-1;d=Gc(a,b,c)|0;r=e;return d|0}function Ic(a){a=a|0;var b=0,c=0;b=a+74|0;c=i[b>>0]|0;i[b>>0]=c+255|c;b=k[a>>2]|0;if(!(b&8)){k[a+8>>2]=0;k[a+4>>2]=0;b=k[a+44>>2]|0;k[a+28>>2]=b;k[a+20>>2]=b;k[a+16>>2]=b+(k[a+48>>2]|0);b=0}else{k[a>>2]=b|32;b=-1}return b|0}function Jc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;f=b&255;d=(c|0)!=0;a:do if(d&(a&3|0)!=0){e=b&255;while(1){if((i[a>>0]|0)==e<<24>>24){g=6;break a}a=a+1|0;c=c+-1|0;d=(c|0)!=0;if(!(d&(a&3|0)!=0)){g=5;break}}}else g=5;while(0);if((g|0)==5)if(d)g=6;else c=0;b:do if((g|0)==6){e=b&255;if((i[a>>0]|0)!=e<<24>>24){d=ha(f,16843009)|0;c:do if(c>>>0>3)while(1){f=k[a>>2]^d;if((f&-2139062144^-2139062144)&f+-16843009)break;a=a+4|0;c=c+-4|0;if(c>>>0<=3){g=11;break c}}else g=11;while(0);if((g|0)==11)if(!c){c=0;break}while(1){if((i[a>>0]|0)==e<<24>>24)break b;a=a+1|0;c=c+-1|0;if(!c){c=0;break}}}}while(0);return ((c|0)!=0?a:0)|0}function Kc(a){a=a|0;var b=0,c=0,d=0;d=a;a:do if(!(d&3))c=4;else{b=a;a=d;while(1){if(!(i[b>>0]|0))break a;b=b+1|0;a=b;if(!(a&3)){a=b;c=4;break}}}while(0);if((c|0)==4){while(1){b=k[a>>2]|0;if(!((b&-2139062144^-2139062144)&b+-16843009))a=a+4|0;else break}if((b&255)<<24>>24)do a=a+1|0;while((i[a>>0]|0)!=0)}return a-d|0}function Lc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,m=0,n=0.0,o=0,q=0,s=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0;ga=r;r=r+624|0;ba=ga+24|0;da=ga+16|0;ca=ga+588|0;Y=ga+576|0;aa=ga;V=ga+536|0;fa=ga+8|0;ea=ga+528|0;M=(a|0)!=0;N=V+40|0;U=N;V=V+39|0;W=fa+4|0;X=Y+12|0;Y=Y+11|0;Z=ca;_=X;$=_-Z|0;O=-2-Z|0;P=_+2|0;Q=ba+288|0;R=ca+9|0;S=R;T=ca+8|0;f=0;w=b;g=0;b=0;a:while(1){do if((f|0)>-1)if((g|0)>(2147483647-f|0)){f=mc()|0;k[f>>2]=75;f=-1;break}else{f=g+f|0;break}while(0);g=i[w>>0]|0;if(!(g<<24>>24)){K=245;break}else h=w;b:while(1){switch(g<<24>>24){case 37:{g=h;K=9;break b}case 0:{g=h;break b}default:{}}J=h+1|0;g=i[J>>0]|0;h=J}c:do if((K|0)==9)while(1){K=0;if((i[g+1>>0]|0)!=37)break c;h=h+1|0;g=g+2|0;if((i[g>>0]|0)==37)K=9;else break}while(0);y=h-w|0;if(M?(k[a>>2]&32|0)==0:0)uc(w,y,a)|0;if((h|0)!=(w|0)){w=g;g=y;continue}o=g+1|0;h=i[o>>0]|0;m=(h<<24>>24)+-48|0;if(m>>>0<10){J=(i[g+2>>0]|0)==36;o=J?g+3|0:o;h=i[o>>0]|0;u=J?m:-1;b=J?1:b}else u=-1;g=h<<24>>24;d:do if((g&-32|0)==32){m=0;while(1){if(!(1<>24)+-32|m;o=o+1|0;h=i[o>>0]|0;g=h<<24>>24;if((g&-32|0)!=32){q=m;g=o;break}}}else{q=0;g=o}while(0);do if(h<<24>>24==42){m=g+1|0;h=(i[m>>0]|0)+-48|0;if(h>>>0<10?(i[g+2>>0]|0)==36:0){k[e+(h<<2)>>2]=10;b=1;g=g+3|0;h=k[d+((i[m>>0]|0)+-48<<3)>>2]|0}else{if(b){f=-1;break a}if(!M){x=q;g=m;b=0;J=0;break}b=(k[c>>2]|0)+(4-1)&~(4-1);h=k[b>>2]|0;k[c>>2]=b+4;b=0;g=m}if((h|0)<0){x=q|8192;J=0-h|0}else{x=q;J=h}}else{m=(h<<24>>24)+-48|0;if(m>>>0<10){h=0;do{h=(h*10|0)+m|0;g=g+1|0;m=(i[g>>0]|0)+-48|0}while(m>>>0<10);if((h|0)<0){f=-1;break a}else{x=q;J=h}}else{x=q;J=0}}while(0);e:do if((i[g>>0]|0)==46){m=g+1|0;h=i[m>>0]|0;if(h<<24>>24!=42){o=(h<<24>>24)+-48|0;if(o>>>0<10){g=m;h=0}else{g=m;o=0;break}while(1){h=(h*10|0)+o|0;g=g+1|0;o=(i[g>>0]|0)+-48|0;if(o>>>0>=10){o=h;break e}}}m=g+2|0;h=(i[m>>0]|0)+-48|0;if(h>>>0<10?(i[g+3>>0]|0)==36:0){k[e+(h<<2)>>2]=10;g=g+4|0;o=k[d+((i[m>>0]|0)+-48<<3)>>2]|0;break}if(b){f=-1;break a}if(M){g=(k[c>>2]|0)+(4-1)&~(4-1);o=k[g>>2]|0;k[c>>2]=g+4;g=m}else{g=m;o=0}}else o=-1;while(0);s=0;while(1){h=(i[g>>0]|0)+-65|0;if(h>>>0>57){f=-1;break a}m=g+1|0;h=i[5347+(s*58|0)+h>>0]|0;q=h&255;if((q+-1|0)>>>0<8){g=m;s=q}else{I=m;break}}if(!(h<<24>>24)){f=-1;break}m=(u|0)>-1;do if(h<<24>>24==19)if(m){f=-1;break a}else K=52;else{if(m){k[e+(u<<2)>>2]=q;G=d+(u<<3)|0;H=k[G+4>>2]|0;K=aa;k[K>>2]=k[G>>2];k[K+4>>2]=H;K=52;break}if(!M){f=0;break a}Oc(aa,q,c)}while(0);if((K|0)==52?(K=0,!M):0){w=I;g=y;continue}u=i[g>>0]|0;u=(s|0)!=0&(u&15|0)==3?u&-33:u;m=x&-65537;H=(x&8192|0)==0?x:m;f:do switch(u|0){case 110:switch(s|0){case 0:{k[k[aa>>2]>>2]=f;w=I;g=y;continue a}case 1:{k[k[aa>>2]>>2]=f;w=I;g=y;continue a}case 2:{w=k[aa>>2]|0;k[w>>2]=f;k[w+4>>2]=((f|0)<0)<<31>>31;w=I;g=y;continue a}case 3:{j[k[aa>>2]>>1]=f;w=I;g=y;continue a}case 4:{i[k[aa>>2]>>0]=f;w=I;g=y;continue a}case 6:{k[k[aa>>2]>>2]=f;w=I;g=y;continue a}case 7:{w=k[aa>>2]|0;k[w>>2]=f;k[w+4>>2]=((f|0)<0)<<31>>31;w=I;g=y;continue a}default:{w=I;g=y;continue a}}case 112:{s=H|8;o=o>>>0>8?o:8;u=120;K=64;break}case 88:case 120:{s=H;K=64;break}case 111:{m=aa;h=k[m>>2]|0;m=k[m+4>>2]|0;if((h|0)==0&(m|0)==0)g=N;else{g=N;do{g=g+-1|0;i[g>>0]=h&7|48;h=$c(h|0,m|0,3)|0;m=L}while(!((h|0)==0&(m|0)==0))}if(!(H&8)){h=H;s=0;q=5827;K=77}else{s=U-g+1|0;h=H;o=(o|0)<(s|0)?s:o;s=0;q=5827;K=77}break}case 105:case 100:{h=aa;g=k[h>>2]|0;h=k[h+4>>2]|0;if((h|0)<0){g=Yc(0,0,g|0,h|0)|0;h=L;m=aa;k[m>>2]=g;k[m+4>>2]=h;m=1;q=5827;K=76;break f}if(!(H&2048)){q=H&1;m=q;q=(q|0)==0?5827:5829;K=76}else{m=1;q=5828;K=76}break}case 117:{h=aa;g=k[h>>2]|0;h=k[h+4>>2]|0;m=0;q=5827;K=76;break}case 99:{i[V>>0]=k[aa>>2];w=V;h=1;s=0;u=5827;g=N;break}case 109:{g=mc()|0;g=lc(k[g>>2]|0)|0;K=82;break}case 115:{g=k[aa>>2]|0;g=(g|0)!=0?g:5837;K=82;break}case 67:{k[fa>>2]=k[aa>>2];k[W>>2]=0;k[aa>>2]=fa;o=-1;K=86;break}case 83:{if(!o){Qc(a,32,J,0,H);g=0;K=98}else K=86;break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{n=+p[aa>>3];k[da>>2]=0;p[t>>3]=n;if((k[t+4>>2]|0)>=0)if(!(H&2048)){G=H&1;F=G;G=(G|0)==0?5845:5850}else{F=1;G=5847}else{n=-n;F=1;G=5844}p[t>>3]=n;E=k[t+4>>2]&2146435072;do if(E>>>0<2146435072|(E|0)==2146435072&0<0){v=+pc(n,da)*2.0;h=v!=0.0;if(h)k[da>>2]=(k[da>>2]|0)+-1;C=u|32;if((C|0)==97){w=u&32;y=(w|0)==0?G:G+9|0;x=F|2;g=12-o|0;do if(!(o>>>0>11|(g|0)==0)){n=8.0;do{g=g+-1|0;n=n*16.0}while((g|0)!=0);if((i[y>>0]|0)==45){n=-(n+(-v-n));break}else{n=v+n-n;break}}else n=v;while(0);h=k[da>>2]|0;g=(h|0)<0?0-h|0:h;g=Pc(g,((g|0)<0)<<31>>31,X)|0;if((g|0)==(X|0)){i[Y>>0]=48;g=Y}i[g+-1>>0]=(h>>31&2)+43;s=g+-2|0;i[s>>0]=u+15;q=(o|0)<1;m=(H&8|0)==0;h=ca;while(1){G=~~n;g=h+1|0;i[h>>0]=l[5811+G>>0]|w;n=(n-+(G|0))*16.0;do if((g-Z|0)==1){if(m&(q&n==0.0))break;i[g>>0]=46;g=h+2|0}while(0);if(!(n!=0.0))break;else h=g}o=(o|0)!=0&(O+g|0)<(o|0)?P+o-s|0:$-s+g|0;m=o+x|0;Qc(a,32,J,m,H);if(!(k[a>>2]&32))uc(y,x,a)|0;Qc(a,48,J,m,H^65536);g=g-Z|0;if(!(k[a>>2]&32))uc(ca,g,a)|0;h=_-s|0;Qc(a,48,o-(g+h)|0,0,0);if(!(k[a>>2]&32))uc(s,h,a)|0;Qc(a,32,J,m,H^8192);g=(m|0)<(J|0)?J:m;break}g=(o|0)<0?6:o;if(h){h=(k[da>>2]|0)+-28|0;k[da>>2]=h;n=v*268435456.0}else{n=v;h=k[da>>2]|0}E=(h|0)<0?ba:Q;D=E;h=E;do{B=~~n>>>0;k[h>>2]=B;h=h+4|0;n=(n-+(B>>>0))*1.0e9}while(n!=0.0);m=h;h=k[da>>2]|0;if((h|0)>0){q=E;while(1){s=(h|0)>29?29:h;o=m+-4|0;do if(o>>>0>>0)o=q;else{h=0;do{B=ad(k[o>>2]|0,0,s|0)|0;B=Zc(B|0,L|0,h|0,0)|0;h=L;A=jd(B|0,h|0,1e9,0)|0;k[o>>2]=A;h=id(B|0,h|0,1e9,0)|0;o=o+-4|0}while(o>>>0>=q>>>0);if(!h){o=q;break}o=q+-4|0;k[o>>2]=h}while(0);while(1){if(m>>>0<=o>>>0)break;h=m+-4|0;if(!(k[h>>2]|0))m=h;else break}h=(k[da>>2]|0)-s|0;k[da>>2]=h;if((h|0)>0)q=o;else break}}else o=E;if((h|0)<0){y=((g+25|0)/9|0)+1|0;z=(C|0)==102;w=o;while(1){x=0-h|0;x=(x|0)>9?9:x;do if(w>>>0>>0){h=(1<>>x;o=0;s=w;do{B=k[s>>2]|0;k[s>>2]=(B>>>x)+o;o=ha(B&h,q)|0;s=s+4|0}while(s>>>0>>0);h=(k[w>>2]|0)==0?w+4|0:w;if(!o){o=h;break}k[m>>2]=o;o=h;m=m+4|0}else o=(k[w>>2]|0)==0?w+4|0:w;while(0);h=z?E:o;m=(m-h>>2|0)>(y|0)?h+(y<<2)|0:m;h=(k[da>>2]|0)+x|0;k[da>>2]=h;if((h|0)>=0){w=o;break}else w=o}}else w=o;do if(w>>>0>>0){h=(D-w>>2)*9|0;q=k[w>>2]|0;if(q>>>0<10)break;else o=10;do{o=o*10|0;h=h+1|0}while(q>>>0>=o>>>0)}else h=0;while(0);A=(C|0)==103;B=(g|0)!=0;o=g-((C|0)!=102?h:0)+((B&A)<<31>>31)|0;if((o|0)<(((m-D>>2)*9|0)+-9|0)){s=o+9216|0;z=(s|0)/9|0;o=E+(z+-1023<<2)|0;s=((s|0)%9|0)+1|0;if((s|0)<9){q=10;do{q=q*10|0;s=s+1|0}while((s|0)!=9)}else q=10;x=k[o>>2]|0;y=(x>>>0)%(q>>>0)|0;if((y|0)==0?(E+(z+-1022<<2)|0)==(m|0):0)q=w;else K=163;do if((K|0)==163){K=0;v=(((x>>>0)/(q>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;s=(q|0)/2|0;do if(y>>>0>>0)n=.5;else{if((y|0)==(s|0)?(E+(z+-1022<<2)|0)==(m|0):0){n=1.0;break}n=1.5}while(0);do if(F){if((i[G>>0]|0)!=45)break;v=-v;n=-n}while(0);s=x-y|0;k[o>>2]=s;if(!(v+n!=v)){q=w;break}C=s+q|0;k[o>>2]=C;if(C>>>0>999999999){h=w;while(1){q=o+-4|0;k[o>>2]=0;if(q>>>0>>0){h=h+-4|0;k[h>>2]=0}C=(k[q>>2]|0)+1|0;k[q>>2]=C;if(C>>>0>999999999)o=q;else{w=h;o=q;break}}}h=(D-w>>2)*9|0;s=k[w>>2]|0;if(s>>>0<10){q=w;break}else q=10;do{q=q*10|0;h=h+1|0}while(s>>>0>=q>>>0);q=w}while(0);C=o+4|0;w=q;m=m>>>0>C>>>0?C:m}y=0-h|0;while(1){if(m>>>0<=w>>>0){z=0;C=m;break}o=m+-4|0;if(!(k[o>>2]|0))m=o;else{z=1;C=m;break}}do if(A){g=(B&1^1)+g|0;if((g|0)>(h|0)&(h|0)>-5){u=u+-1|0;g=g+-1-h|0}else{u=u+-2|0;g=g+-1|0}m=H&8;if(m)break;do if(z){m=k[C+-4>>2]|0;if(!m){o=9;break}if(!((m>>>0)%10|0)){q=10;o=0}else{o=0;break}do{q=q*10|0;o=o+1|0}while(((m>>>0)%(q>>>0)|0|0)==0)}else o=9;while(0);m=((C-D>>2)*9|0)+-9|0;if((u|32|0)==102){m=m-o|0;m=(m|0)<0?0:m;g=(g|0)<(m|0)?g:m;m=0;break}else{m=m+h-o|0;m=(m|0)<0?0:m;g=(g|0)<(m|0)?g:m;m=0;break}}else m=H&8;while(0);x=g|m;q=(x|0)!=0&1;s=(u|32|0)==102;if(s){h=(h|0)>0?h:0;u=0}else{o=(h|0)<0?y:h;o=Pc(o,((o|0)<0)<<31>>31,X)|0;if((_-o|0)<2)do{o=o+-1|0;i[o>>0]=48}while((_-o|0)<2);i[o+-1>>0]=(h>>31&2)+43;D=o+-2|0;i[D>>0]=u;h=_-D|0;u=D}y=F+1+g+q+h|0;Qc(a,32,J,y,H);if(!(k[a>>2]&32))uc(G,F,a)|0;Qc(a,48,J,y,H^65536);do if(s){o=w>>>0>E>>>0?E:w;h=o;do{m=Pc(k[h>>2]|0,0,R)|0;do if((h|0)==(o|0)){if((m|0)!=(R|0))break;i[T>>0]=48;m=T}else{if(m>>>0<=ca>>>0)break;do{m=m+-1|0;i[m>>0]=48}while(m>>>0>ca>>>0)}while(0);if(!(k[a>>2]&32))uc(m,S-m|0,a)|0;h=h+4|0}while(h>>>0<=E>>>0);do if(x){if(k[a>>2]&32)break;uc(5879,1,a)|0}while(0);if((g|0)>0&h>>>0>>0){m=h;while(1){h=Pc(k[m>>2]|0,0,R)|0;if(h>>>0>ca>>>0)do{h=h+-1|0;i[h>>0]=48}while(h>>>0>ca>>>0);if(!(k[a>>2]&32))uc(h,(g|0)>9?9:g,a)|0;m=m+4|0;h=g+-9|0;if(!((g|0)>9&m>>>0>>0)){g=h;break}else g=h}}Qc(a,48,g+9|0,9,0)}else{s=z?C:w+4|0;if((g|0)>-1){q=(m|0)==0;o=w;do{h=Pc(k[o>>2]|0,0,R)|0;if((h|0)==(R|0)){i[T>>0]=48;h=T}do if((o|0)==(w|0)){m=h+1|0;if(!(k[a>>2]&32))uc(h,1,a)|0;if(q&(g|0)<1){h=m;break}if(k[a>>2]&32){h=m;break}uc(5879,1,a)|0;h=m}else{if(h>>>0<=ca>>>0)break;do{h=h+-1|0;i[h>>0]=48}while(h>>>0>ca>>>0)}while(0);m=S-h|0;if(!(k[a>>2]&32))uc(h,(g|0)>(m|0)?m:g,a)|0;g=g-m|0;o=o+4|0}while(o>>>0>>0&(g|0)>-1)}Qc(a,48,g+18|0,18,0);if(k[a>>2]&32)break;uc(u,_-u|0,a)|0}while(0);Qc(a,32,J,y,H^8192);g=(y|0)<(J|0)?J:y}else{s=(u&32|0)!=0;q=n!=n|0.0!=0.0;h=q?0:F;o=h+3|0;Qc(a,32,J,o,m);g=k[a>>2]|0;if(!(g&32)){uc(G,h,a)|0;g=k[a>>2]|0}if(!(g&32))uc(q?(s?5871:5875):s?5863:5867,3,a)|0;Qc(a,32,J,o,H^8192);g=(o|0)<(J|0)?J:o}while(0);w=I;continue a}default:{m=H;h=o;s=0;u=5827;g=N}}while(0);g:do if((K|0)==64){m=aa;h=k[m>>2]|0;m=k[m+4>>2]|0;q=u&32;if(!((h|0)==0&(m|0)==0)){g=N;do{g=g+-1|0;i[g>>0]=l[5811+(h&15)>>0]|q;h=$c(h|0,m|0,4)|0;m=L}while(!((h|0)==0&(m|0)==0));K=aa;if((s&8|0)==0|(k[K>>2]|0)==0&(k[K+4>>2]|0)==0){h=s;s=0;q=5827;K=77}else{h=s;s=2;q=5827+(u>>4)|0;K=77}}else{g=N;h=s;s=0;q=5827;K=77}}else if((K|0)==76){g=Pc(g,h,N)|0;h=H;s=m;K=77}else if((K|0)==82){K=0;H=Jc(g,0,o)|0;G=(H|0)==0;w=g;h=G?o:H-g|0;s=0;u=5827;g=G?g+o|0:H}else if((K|0)==86){K=0;h=0;g=0;q=k[aa>>2]|0;while(1){m=k[q>>2]|0;if(!m)break;g=rc(ea,m)|0;if((g|0)<0|g>>>0>(o-h|0)>>>0)break;h=g+h|0;if(o>>>0>h>>>0)q=q+4|0;else break}if((g|0)<0){f=-1;break a}Qc(a,32,J,h,H);if(!h){g=0;K=98}else{m=0;o=k[aa>>2]|0;while(1){g=k[o>>2]|0;if(!g){g=h;K=98;break g}g=rc(ea,g)|0;m=g+m|0;if((m|0)>(h|0)){g=h;K=98;break g}if(!(k[a>>2]&32))uc(ea,g,a)|0;if(m>>>0>=h>>>0){g=h;K=98;break}else o=o+4|0}}}while(0);if((K|0)==98){K=0;Qc(a,32,J,g,H^8192);w=I;g=(J|0)>(g|0)?J:g;continue}if((K|0)==77){K=0;m=(o|0)>-1?h&-65537:h;h=aa;h=(k[h>>2]|0)!=0|(k[h+4>>2]|0)!=0;if((o|0)!=0|h){h=(h&1^1)+(U-g)|0;w=g;h=(o|0)>(h|0)?o:h;u=q;g=N}else{w=N;h=0;u=q;g=N}}q=g-w|0;h=(h|0)<(q|0)?q:h;o=s+h|0;g=(J|0)<(o|0)?o:J;Qc(a,32,g,o,m);if(!(k[a>>2]&32))uc(u,s,a)|0;Qc(a,48,g,o,m^65536);Qc(a,48,h,q,0);if(!(k[a>>2]&32))uc(w,q,a)|0;Qc(a,32,g,o,m^8192);w=I}h:do if((K|0)==245)if(!a)if(b){f=1;while(1){b=k[e+(f<<2)>>2]|0;if(!b)break;Oc(d+(f<<3)|0,b,c);f=f+1|0;if((f|0)>=10){f=1;break h}}if((f|0)<10)while(1){if(k[e+(f<<2)>>2]|0){f=-1;break h}f=f+1|0;if((f|0)>=10){f=1;break}}else f=1}else f=0;while(0);r=ga;return f|0}function Mc(a){a=a|0;if(!(k[a+68>>2]|0))Cc(a);return}function Nc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=a+20|0;e=k[d>>2]|0;a=(k[a+16>>2]|0)-e|0;a=a>>>0>c>>>0?c:a;bd(e|0,b|0,a|0)|0;k[d>>2]=(k[d>>2]|0)+a;return c|0}function Oc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;k[a>>2]=b;break a}case 10:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;d=a;k[d>>2]=b;k[d+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;d=a;k[d>>2]=b;k[d+4>>2]=0;break a}case 12:{d=(k[c>>2]|0)+(8-1)&~(8-1);b=d;e=k[b>>2]|0;b=k[b+4>>2]|0;k[c>>2]=d+8;d=a;k[d>>2]=e;k[d+4>>2]=b;break a}case 13:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;d=(d&65535)<<16>>16;e=a;k[e>>2]=d;k[e+4>>2]=((d|0)<0)<<31>>31;break a}case 14:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;e=a;k[e>>2]=d&65535;k[e+4>>2]=0;break a}case 15:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;d=(d&255)<<24>>24;e=a;k[e>>2]=d;k[e+4>>2]=((d|0)<0)<<31>>31;break a}case 16:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;e=a;k[e>>2]=d&255;k[e+4>>2]=0;break a}case 17:{e=(k[c>>2]|0)+(8-1)&~(8-1);f=+p[e>>3];k[c>>2]=e+8;p[a>>3]=f;break a}case 18:{e=(k[c>>2]|0)+(8-1)&~(8-1);f=+p[e>>3];k[c>>2]=e+8;p[a>>3]=f;break a}default:break a}while(0);while(0);return}function Pc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if(b>>>0>0|(b|0)==0&a>>>0>4294967295)while(1){d=jd(a|0,b|0,10,0)|0;c=c+-1|0;i[c>>0]=d|48;d=id(a|0,b|0,10,0)|0;if(b>>>0>9|(b|0)==9&a>>>0>4294967295){a=d;b=L}else{a=d;break}}if(a)while(1){c=c+-1|0;i[c>>0]=(a>>>0)%10|0|48;if(a>>>0<10)break;else a=(a>>>0)/10|0}return c|0}function Qc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=r;r=r+256|0;g=h;do if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;_c(g|0,b|0,(e>>>0>256?256:e)|0)|0;b=k[a>>2]|0;f=(b&32|0)==0;if(e>>>0>255){d=c-d|0;do{if(f){uc(g,256,a)|0;b=k[a>>2]|0}e=e+-256|0;f=(b&32|0)==0}while(e>>>0>255);if(f)e=d&255;else break}else if(!f)break;uc(g,e,a)|0}while(0);r=h;return}function Rc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;do if(a>>>0<245){o=a>>>0<11?16:a+11&-8;a=o>>>3;h=k[147]|0;c=h>>>a;if(c&3){a=(c&1^1)+a|0;d=a<<1;c=628+(d<<2)|0;d=628+(d+2<<2)|0;e=k[d>>2]|0;f=e+8|0;g=k[f>>2]|0;do if((c|0)!=(g|0)){if(g>>>0<(k[151]|0)>>>0)Aa();b=g+12|0;if((k[b>>2]|0)==(e|0)){k[b>>2]=c;k[d>>2]=g;break}else Aa()}else k[147]=h&~(1<>2]=M|3;M=e+(M|4)|0;k[M>>2]=k[M>>2]|1;M=f;return M|0}g=k[149]|0;if(o>>>0>g>>>0){if(c){d=2<>>12&16;d=d>>>i;e=d>>>5&8;d=d>>>e;f=d>>>2&4;d=d>>>f;c=d>>>1&2;d=d>>>c;a=d>>>1&1;a=(e|i|f|c|a)+(d>>>a)|0;d=a<<1;c=628+(d<<2)|0;d=628+(d+2<<2)|0;f=k[d>>2]|0;i=f+8|0;e=k[i>>2]|0;do if((c|0)!=(e|0)){if(e>>>0<(k[151]|0)>>>0)Aa();b=e+12|0;if((k[b>>2]|0)==(f|0)){k[b>>2]=c;k[d>>2]=e;j=k[149]|0;break}else Aa()}else{k[147]=h&~(1<>2]=o|3;h=f+o|0;k[f+(o|4)>>2]=g|1;k[f+M>>2]=g;if(j){e=k[152]|0;c=j>>>3;b=c<<1;d=628+(b<<2)|0;a=k[147]|0;c=1<>2]|0;if(b>>>0<(k[151]|0)>>>0)Aa();else{l=a;m=b}}else{k[147]=a|c;l=628+(b+2<<2)|0;m=d}k[l>>2]=e;k[m+12>>2]=e;k[e+8>>2]=m;k[e+12>>2]=d}k[149]=g;k[152]=h;M=i;return M|0}a=k[148]|0;if(a){c=(a&0-a)+-1|0;L=c>>>12&16;c=c>>>L;K=c>>>5&8;c=c>>>K;M=c>>>2&4;c=c>>>M;a=c>>>1&2;c=c>>>a;d=c>>>1&1;d=k[892+((K|L|M|a|d)+(c>>>d)<<2)>>2]|0;c=(k[d+4>>2]&-8)-o|0;a=d;while(1){b=k[a+16>>2]|0;if(!b){b=k[a+20>>2]|0;if(!b){i=c;break}}a=(k[b+4>>2]&-8)-o|0;M=a>>>0>>0;c=M?a:c;a=b;d=M?b:d}f=k[151]|0;if(d>>>0>>0)Aa();h=d+o|0;if(d>>>0>=h>>>0)Aa();g=k[d+24>>2]|0;c=k[d+12>>2]|0;do if((c|0)==(d|0)){a=d+20|0;b=k[a>>2]|0;if(!b){a=d+16|0;b=k[a>>2]|0;if(!b){n=0;break}}while(1){c=b+20|0;e=k[c>>2]|0;if(e){b=e;a=c;continue}c=b+16|0;e=k[c>>2]|0;if(!e)break;else{b=e;a=c}}if(a>>>0>>0)Aa();else{k[a>>2]=0;n=b;break}}else{e=k[d+8>>2]|0;if(e>>>0>>0)Aa();b=e+12|0;if((k[b>>2]|0)!=(d|0))Aa();a=c+8|0;if((k[a>>2]|0)==(d|0)){k[b>>2]=c;k[a>>2]=e;n=c;break}else Aa()}while(0);do if(g){b=k[d+28>>2]|0;a=892+(b<<2)|0;if((d|0)==(k[a>>2]|0)){k[a>>2]=n;if(!n){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();b=g+16|0;if((k[b>>2]|0)==(d|0))k[b>>2]=n;else k[g+20>>2]=n;if(!n)break}a=k[151]|0;if(n>>>0>>0)Aa();k[n+24>>2]=g;b=k[d+16>>2]|0;do if(b)if(b>>>0>>0)Aa();else{k[n+16>>2]=b;k[b+24>>2]=n;break}while(0);b=k[d+20>>2]|0;if(b)if(b>>>0<(k[151]|0)>>>0)Aa();else{k[n+20>>2]=b;k[b+24>>2]=n;break}}while(0);if(i>>>0<16){M=i+o|0;k[d+4>>2]=M|3;M=d+(M+4)|0;k[M>>2]=k[M>>2]|1}else{k[d+4>>2]=o|3;k[d+(o|4)>>2]=i|1;k[d+(i+o)>>2]=i;b=k[149]|0;if(b){f=k[152]|0;c=b>>>3;b=c<<1;e=628+(b<<2)|0;a=k[147]|0;c=1<>2]|0;if(a>>>0<(k[151]|0)>>>0)Aa();else{p=b;q=a}}else{k[147]=a|c;p=628+(b+2<<2)|0;q=e}k[p>>2]=f;k[q+12>>2]=f;k[f+8>>2]=q;k[f+12>>2]=e}k[149]=i;k[152]=h}M=d+8|0;return M|0}else q=o}else q=o}else if(a>>>0<=4294967231){a=a+11|0;m=a&-8;l=k[148]|0;if(l){c=0-m|0;a=a>>>8;if(a)if(m>>>0>16777215)j=31;else{q=(a+1048320|0)>>>16&8;v=a<>>16&4;v=v<>>16&2;j=14-(p|q|j)+(v<>>15)|0;j=m>>>(j+7|0)&1|j<<1}else j=0;a=k[892+(j<<2)>>2]|0;a:do if(!a){e=0;a=0;v=86}else{g=c;e=0;h=m<<((j|0)==31?0:25-(j>>>1)|0);i=a;a=0;while(1){f=k[i+4>>2]&-8;c=f-m|0;if(c>>>0>>0)if((f|0)==(m|0)){f=i;a=i;v=90;break a}else a=i;else c=g;v=k[i+20>>2]|0;i=k[i+16+(h>>>31<<2)>>2]|0;e=(v|0)==0|(v|0)==(i|0)?e:v;if(!i){v=86;break}else{g=c;h=h<<1}}}while(0);if((v|0)==86){if((e|0)==0&(a|0)==0){a=2<>>12&16;a=a>>>n;l=a>>>5&8;a=a>>>l;p=a>>>2&4;a=a>>>p;q=a>>>1&2;a=a>>>q;e=a>>>1&1;e=k[892+((l|n|p|q|e)+(a>>>e)<<2)>>2]|0;a=0}if(!e){h=c;i=a}else{f=e;v=90}}if((v|0)==90)while(1){v=0;q=(k[f+4>>2]&-8)-m|0;e=q>>>0>>0;c=e?q:c;a=e?f:a;e=k[f+16>>2]|0;if(e){f=e;v=90;continue}f=k[f+20>>2]|0;if(!f){h=c;i=a;break}else v=90}if((i|0)!=0?h>>>0<((k[149]|0)-m|0)>>>0:0){e=k[151]|0;if(i>>>0>>0)Aa();g=i+m|0;if(i>>>0>=g>>>0)Aa();f=k[i+24>>2]|0;c=k[i+12>>2]|0;do if((c|0)==(i|0)){a=i+20|0;b=k[a>>2]|0;if(!b){a=i+16|0;b=k[a>>2]|0;if(!b){o=0;break}}while(1){c=b+20|0;d=k[c>>2]|0;if(d){b=d;a=c;continue}c=b+16|0;d=k[c>>2]|0;if(!d)break;else{b=d;a=c}}if(a>>>0>>0)Aa();else{k[a>>2]=0;o=b;break}}else{d=k[i+8>>2]|0;if(d>>>0>>0)Aa();b=d+12|0;if((k[b>>2]|0)!=(i|0))Aa();a=c+8|0;if((k[a>>2]|0)==(i|0)){k[b>>2]=c;k[a>>2]=d;o=c;break}else Aa()}while(0);do if(f){b=k[i+28>>2]|0;a=892+(b<<2)|0;if((i|0)==(k[a>>2]|0)){k[a>>2]=o;if(!o){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();b=f+16|0;if((k[b>>2]|0)==(i|0))k[b>>2]=o;else k[f+20>>2]=o;if(!o)break}a=k[151]|0;if(o>>>0>>0)Aa();k[o+24>>2]=f;b=k[i+16>>2]|0;do if(b)if(b>>>0>>0)Aa();else{k[o+16>>2]=b;k[b+24>>2]=o;break}while(0);b=k[i+20>>2]|0;if(b)if(b>>>0<(k[151]|0)>>>0)Aa();else{k[o+20>>2]=b;k[b+24>>2]=o;break}}while(0);b:do if(h>>>0>=16){k[i+4>>2]=m|3;k[i+(m|4)>>2]=h|1;k[i+(h+m)>>2]=h;b=h>>>3;if(h>>>0<256){a=b<<1;d=628+(a<<2)|0;c=k[147]|0;b=1<>2]|0;if(a>>>0<(k[151]|0)>>>0)Aa();else{s=b;t=a}}else{k[147]=c|b;s=628+(a+2<<2)|0;t=d}k[s>>2]=g;k[t+12>>2]=g;k[i+(m+8)>>2]=t;k[i+(m+12)>>2]=d;break}b=h>>>8;if(b)if(h>>>0>16777215)d=31;else{L=(b+1048320|0)>>>16&8;M=b<>>16&4;M=M<>>16&2;d=14-(K|L|d)+(M<>>15)|0;d=h>>>(d+7|0)&1|d<<1}else d=0;b=892+(d<<2)|0;k[i+(m+28)>>2]=d;k[i+(m+20)>>2]=0;k[i+(m+16)>>2]=0;a=k[148]|0;c=1<>2]=g;k[i+(m+24)>>2]=b;k[i+(m+12)>>2]=g;k[i+(m+8)>>2]=g;break}b=k[b>>2]|0;c:do if((k[b+4>>2]&-8|0)!=(h|0)){d=h<<((d|0)==31?0:25-(d>>>1)|0);while(1){a=b+16+(d>>>31<<2)|0;c=k[a>>2]|0;if(!c)break;if((k[c+4>>2]&-8|0)==(h|0)){y=c;break c}else{d=d<<1;b=c}}if(a>>>0<(k[151]|0)>>>0)Aa();else{k[a>>2]=g;k[i+(m+24)>>2]=b;k[i+(m+12)>>2]=g;k[i+(m+8)>>2]=g;break b}}else y=b;while(0);b=y+8|0;a=k[b>>2]|0;M=k[151]|0;if(a>>>0>=M>>>0&y>>>0>=M>>>0){k[a+12>>2]=g;k[b>>2]=g;k[i+(m+8)>>2]=a;k[i+(m+12)>>2]=y;k[i+(m+24)>>2]=0;break}else Aa()}else{M=h+m|0;k[i+4>>2]=M|3;M=i+(M+4)|0;k[M>>2]=k[M>>2]|1}while(0);M=i+8|0;return M|0}else q=m}else q=m}else q=-1;while(0);c=k[149]|0;if(c>>>0>=q>>>0){b=c-q|0;a=k[152]|0;if(b>>>0>15){k[152]=a+q;k[149]=b;k[a+(q+4)>>2]=b|1;k[a+c>>2]=b;k[a+4>>2]=q|3}else{k[149]=0;k[152]=0;k[a+4>>2]=c|3;M=a+(c+4)|0;k[M>>2]=k[M>>2]|1}M=a+8|0;return M|0}a=k[150]|0;if(a>>>0>q>>>0){L=a-q|0;k[150]=L;M=k[153]|0;k[153]=M+q;k[M+(q+4)>>2]=L|1;k[M+4>>2]=q|3;M=M+8|0;return M|0}do if(!(k[265]|0)){a=Ma(30)|0;if(!(a+-1&a)){k[267]=a;k[266]=a;k[268]=-1;k[269]=-1;k[270]=0;k[258]=0;y=(Ea(0)|0)&-16^1431655768;k[265]=y;break}else Aa()}while(0);i=q+48|0;h=k[267]|0;j=q+47|0;g=h+j|0;h=0-h|0;l=g&h;if(l>>>0<=q>>>0){M=0;return M|0}a=k[257]|0;if((a|0)!=0?(t=k[255]|0,y=t+l|0,y>>>0<=t>>>0|y>>>0>a>>>0):0){M=0;return M|0}d:do if(!(k[258]&4)){a=k[153]|0;e:do if(a){e=1036;while(1){c=k[e>>2]|0;if(c>>>0<=a>>>0?(r=e+4|0,(c+(k[r>>2]|0)|0)>>>0>a>>>0):0){f=e;a=r;break}e=k[e+8>>2]|0;if(!e){v=174;break e}}c=g-(k[150]|0)&h;if(c>>>0<2147483647){e=Da(c|0)|0;y=(e|0)==((k[f>>2]|0)+(k[a>>2]|0)|0);a=y?c:0;if(y){if((e|0)!=(-1|0)){w=e;p=a;v=194;break d}}else v=184}else a=0}else v=174;while(0);do if((v|0)==174){f=Da(0)|0;if((f|0)!=(-1|0)){a=f;c=k[266]|0;e=c+-1|0;if(!(e&a))c=l;else c=l-a+(e+a&0-c)|0;a=k[255]|0;e=a+c|0;if(c>>>0>q>>>0&c>>>0<2147483647){y=k[257]|0;if((y|0)!=0?e>>>0<=a>>>0|e>>>0>y>>>0:0){a=0;break}e=Da(c|0)|0;y=(e|0)==(f|0);a=y?c:0;if(y){w=f;p=a;v=194;break d}else v=184}else a=0}else a=0}while(0);f:do if((v|0)==184){f=0-c|0;do if(i>>>0>c>>>0&(c>>>0<2147483647&(e|0)!=(-1|0))?(u=k[267]|0,u=j-c+u&0-u,u>>>0<2147483647):0)if((Da(u|0)|0)==(-1|0)){Da(f|0)|0;break f}else{c=u+c|0;break}while(0);if((e|0)!=(-1|0)){w=e;p=c;v=194;break d}}while(0);k[258]=k[258]|4;v=191}else{a=0;v=191}while(0);if((((v|0)==191?l>>>0<2147483647:0)?(w=Da(l|0)|0,x=Da(0)|0,w>>>0>>0&((w|0)!=(-1|0)&(x|0)!=(-1|0))):0)?(z=x-w|0,A=z>>>0>(q+40|0)>>>0,A):0){p=A?z:a;v=194}if((v|0)==194){a=(k[255]|0)+p|0;k[255]=a;if(a>>>0>(k[256]|0)>>>0)k[256]=a;g=k[153]|0;g:do if(g){f=1036;do{a=k[f>>2]|0;c=f+4|0;e=k[c>>2]|0;if((w|0)==(a+e|0)){B=a;C=c;D=e;E=f;v=204;break}f=k[f+8>>2]|0}while((f|0)!=0);if(((v|0)==204?(k[E+12>>2]&8|0)==0:0)?g>>>0>>0&g>>>0>=B>>>0:0){k[C>>2]=D+p;M=(k[150]|0)+p|0;L=g+8|0;L=(L&7|0)==0?0:0-L&7;K=M-L|0;k[153]=g+L;k[150]=K;k[g+(L+4)>>2]=K|1;k[g+(M+4)>>2]=40;k[154]=k[269];break}a=k[151]|0;if(w>>>0>>0){k[151]=w;a=w}c=w+p|0;f=1036;while(1){if((k[f>>2]|0)==(c|0)){e=f;c=f;v=212;break}f=k[f+8>>2]|0;if(!f){c=1036;break}}if((v|0)==212)if(!(k[c+12>>2]&8)){k[e>>2]=w;n=c+4|0;k[n>>2]=(k[n>>2]|0)+p;n=w+8|0;n=(n&7|0)==0?0:0-n&7;j=w+(p+8)|0;j=(j&7|0)==0?0:0-j&7;b=w+(j+p)|0;m=n+q|0;o=w+m|0;l=b-(w+n)-q|0;k[w+(n+4)>>2]=q|3;h:do if((b|0)!=(g|0)){if((b|0)==(k[152]|0)){M=(k[149]|0)+l|0;k[149]=M;k[152]=o;k[w+(m+4)>>2]=M|1;k[w+(M+m)>>2]=M;break}h=p+4|0;c=k[w+(h+j)>>2]|0;if((c&3|0)==1){i=c&-8;f=c>>>3;i:do if(c>>>0>=256){g=k[w+((j|24)+p)>>2]|0;d=k[w+(p+12+j)>>2]|0;do if((d|0)==(b|0)){e=j|16;d=w+(h+e)|0;c=k[d>>2]|0;if(!c){d=w+(e+p)|0;c=k[d>>2]|0;if(!c){J=0;break}}while(1){e=c+20|0;f=k[e>>2]|0;if(f){c=f;d=e;continue}e=c+16|0;f=k[e>>2]|0;if(!f)break;else{c=f;d=e}}if(d>>>0>>0)Aa();else{k[d>>2]=0;J=c;break}}else{e=k[w+((j|8)+p)>>2]|0;if(e>>>0>>0)Aa();a=e+12|0;if((k[a>>2]|0)!=(b|0))Aa();c=d+8|0;if((k[c>>2]|0)==(b|0)){k[a>>2]=d;k[c>>2]=e;J=d;break}else Aa()}while(0);if(!g)break;a=k[w+(p+28+j)>>2]|0;c=892+(a<<2)|0;do if((b|0)!=(k[c>>2]|0)){if(g>>>0<(k[151]|0)>>>0)Aa();a=g+16|0;if((k[a>>2]|0)==(b|0))k[a>>2]=J;else k[g+20>>2]=J;if(!J)break i}else{k[c>>2]=J;if(J)break;k[148]=k[148]&~(1<>>0>>0)Aa();k[J+24>>2]=g;b=j|16;a=k[w+(b+p)>>2]|0;do if(a)if(a>>>0>>0)Aa();else{k[J+16>>2]=a;k[a+24>>2]=J;break}while(0);b=k[w+(h+b)>>2]|0;if(!b)break;if(b>>>0<(k[151]|0)>>>0)Aa();else{k[J+20>>2]=b;k[b+24>>2]=J;break}}else{d=k[w+((j|8)+p)>>2]|0;e=k[w+(p+12+j)>>2]|0;c=628+(f<<1<<2)|0;do if((d|0)!=(c|0)){if(d>>>0>>0)Aa();if((k[d+12>>2]|0)==(b|0))break;Aa()}while(0);if((e|0)==(d|0)){k[147]=k[147]&~(1<>>0>>0)Aa();a=e+8|0;if((k[a>>2]|0)==(b|0)){F=a;break}Aa()}while(0);k[d+12>>2]=e;k[F>>2]=d}while(0);b=w+((i|j)+p)|0;e=i+l|0}else e=l;b=b+4|0;k[b>>2]=k[b>>2]&-2;k[w+(m+4)>>2]=e|1;k[w+(e+m)>>2]=e;b=e>>>3;if(e>>>0<256){a=b<<1;d=628+(a<<2)|0;c=k[147]|0;b=1<>2]|0;if(a>>>0>=(k[151]|0)>>>0){K=b;L=a;break}Aa()}while(0);k[K>>2]=o;k[L+12>>2]=o;k[w+(m+8)>>2]=L;k[w+(m+12)>>2]=d;break}b=e>>>8;do if(!b)d=0;else{if(e>>>0>16777215){d=31;break}K=(b+1048320|0)>>>16&8;L=b<>>16&4;L=L<>>16&2;d=14-(J|K|d)+(L<>>15)|0;d=e>>>(d+7|0)&1|d<<1}while(0);b=892+(d<<2)|0;k[w+(m+28)>>2]=d;k[w+(m+20)>>2]=0;k[w+(m+16)>>2]=0;a=k[148]|0;c=1<>2]=o;k[w+(m+24)>>2]=b;k[w+(m+12)>>2]=o;k[w+(m+8)>>2]=o;break}b=k[b>>2]|0;j:do if((k[b+4>>2]&-8|0)!=(e|0)){d=e<<((d|0)==31?0:25-(d>>>1)|0);while(1){a=b+16+(d>>>31<<2)|0;c=k[a>>2]|0;if(!c)break;if((k[c+4>>2]&-8|0)==(e|0)){M=c;break j}else{d=d<<1;b=c}}if(a>>>0<(k[151]|0)>>>0)Aa();else{k[a>>2]=o;k[w+(m+24)>>2]=b;k[w+(m+12)>>2]=o;k[w+(m+8)>>2]=o;break h}}else M=b;while(0);b=M+8|0;a=k[b>>2]|0;L=k[151]|0;if(a>>>0>=L>>>0&M>>>0>=L>>>0){k[a+12>>2]=o;k[b>>2]=o;k[w+(m+8)>>2]=a;k[w+(m+12)>>2]=M;k[w+(m+24)>>2]=0;break}else Aa()}else{M=(k[150]|0)+l|0;k[150]=M;k[153]=o;k[w+(m+4)>>2]=M|1}while(0);M=w+(n|8)|0;return M|0}else c=1036;while(1){a=k[c>>2]|0;if(a>>>0<=g>>>0?(b=k[c+4>>2]|0,d=a+b|0,d>>>0>g>>>0):0)break;c=k[c+8>>2]|0}e=a+(b+-39)|0;a=a+(b+-47+((e&7|0)==0?0:0-e&7))|0;e=g+16|0;a=a>>>0>>0?g:a;b=a+8|0;c=w+8|0;c=(c&7|0)==0?0:0-c&7;M=p+-40-c|0;k[153]=w+c;k[150]=M;k[w+(c+4)>>2]=M|1;k[w+(p+-36)>>2]=40;k[154]=k[269];c=a+4|0;k[c>>2]=27;k[b>>2]=k[259];k[b+4>>2]=k[260];k[b+8>>2]=k[261];k[b+12>>2]=k[262];k[259]=w;k[260]=p;k[262]=0;k[261]=b;b=a+28|0;k[b>>2]=7;if((a+32|0)>>>0>>0)do{M=b;b=b+4|0;k[b>>2]=7}while((M+8|0)>>>0>>0);if((a|0)!=(g|0)){f=a-g|0;k[c>>2]=k[c>>2]&-2;k[g+4>>2]=f|1;k[a>>2]=f;b=f>>>3;if(f>>>0<256){a=b<<1;d=628+(a<<2)|0;c=k[147]|0;b=1<>2]|0;if(a>>>0<(k[151]|0)>>>0)Aa();else{G=b;H=a}}else{k[147]=c|b;G=628+(a+2<<2)|0;H=d}k[G>>2]=g;k[H+12>>2]=g;k[g+8>>2]=H;k[g+12>>2]=d;break}b=f>>>8;if(b)if(f>>>0>16777215)d=31;else{L=(b+1048320|0)>>>16&8;M=b<>>16&4;M=M<>>16&2;d=14-(K|L|d)+(M<>>15)|0;d=f>>>(d+7|0)&1|d<<1}else d=0;c=892+(d<<2)|0;k[g+28>>2]=d;k[g+20>>2]=0;k[e>>2]=0;b=k[148]|0;a=1<>2]=g;k[g+24>>2]=c;k[g+12>>2]=g;k[g+8>>2]=g;break}b=k[c>>2]|0;k:do if((k[b+4>>2]&-8|0)!=(f|0)){d=f<<((d|0)==31?0:25-(d>>>1)|0);while(1){a=b+16+(d>>>31<<2)|0;c=k[a>>2]|0;if(!c)break;if((k[c+4>>2]&-8|0)==(f|0)){I=c;break k}else{d=d<<1;b=c}}if(a>>>0<(k[151]|0)>>>0)Aa();else{k[a>>2]=g;k[g+24>>2]=b;k[g+12>>2]=g;k[g+8>>2]=g;break g}}else I=b;while(0);b=I+8|0;a=k[b>>2]|0;M=k[151]|0;if(a>>>0>=M>>>0&I>>>0>=M>>>0){k[a+12>>2]=g;k[b>>2]=g;k[g+8>>2]=a;k[g+12>>2]=I;k[g+24>>2]=0;break}else Aa()}}else{M=k[151]|0;if((M|0)==0|w>>>0>>0)k[151]=w;k[259]=w;k[260]=p;k[262]=0;k[156]=k[265];k[155]=-1;b=0;do{M=b<<1;L=628+(M<<2)|0;k[628+(M+3<<2)>>2]=L;k[628+(M+2<<2)>>2]=L;b=b+1|0}while((b|0)!=32);M=w+8|0;M=(M&7|0)==0?0:0-M&7;L=p+-40-M|0;k[153]=w+M;k[150]=L;k[w+(M+4)>>2]=L|1;k[w+(p+-36)>>2]=40;k[154]=k[269]}while(0);b=k[150]|0;if(b>>>0>q>>>0){L=b-q|0;k[150]=L;M=k[153]|0;k[153]=M+q;k[M+(q+4)>>2]=L|1;k[M+4>>2]=q|3;M=M+8|0;return M|0}}M=mc()|0;k[M>>2]=12;M=0;return M|0}function Sc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;if(!a)return;b=a+-8|0;h=k[151]|0;if(b>>>0>>0)Aa();c=k[a+-4>>2]|0;d=c&3;if((d|0)==1)Aa();o=c&-8;q=a+(o+-8)|0;do if(!(c&1)){b=k[b>>2]|0;if(!d)return;i=-8-b|0;l=a+i|0;m=b+o|0;if(l>>>0>>0)Aa();if((l|0)==(k[152]|0)){b=a+(o+-4)|0;c=k[b>>2]|0;if((c&3|0)!=3){u=l;f=m;break}k[149]=m;k[b>>2]=c&-2;k[a+(i+4)>>2]=m|1;k[q>>2]=m;return}e=b>>>3;if(b>>>0<256){d=k[a+(i+8)>>2]|0;c=k[a+(i+12)>>2]|0;b=628+(e<<1<<2)|0;if((d|0)!=(b|0)){if(d>>>0>>0)Aa();if((k[d+12>>2]|0)!=(l|0))Aa()}if((c|0)==(d|0)){k[147]=k[147]&~(1<>>0>>0)Aa();b=c+8|0;if((k[b>>2]|0)==(l|0))g=b;else Aa()}else g=c+8|0;k[d+12>>2]=c;k[g>>2]=d;u=l;f=m;break}g=k[a+(i+24)>>2]|0;d=k[a+(i+12)>>2]|0;do if((d|0)==(l|0)){c=a+(i+20)|0;b=k[c>>2]|0;if(!b){c=a+(i+16)|0;b=k[c>>2]|0;if(!b){j=0;break}}while(1){d=b+20|0;e=k[d>>2]|0;if(e){b=e;c=d;continue}d=b+16|0;e=k[d>>2]|0;if(!e)break;else{b=e;c=d}}if(c>>>0>>0)Aa();else{k[c>>2]=0;j=b;break}}else{e=k[a+(i+8)>>2]|0;if(e>>>0>>0)Aa();b=e+12|0;if((k[b>>2]|0)!=(l|0))Aa();c=d+8|0;if((k[c>>2]|0)==(l|0)){k[b>>2]=d;k[c>>2]=e;j=d;break}else Aa()}while(0);if(g){b=k[a+(i+28)>>2]|0;c=892+(b<<2)|0;if((l|0)==(k[c>>2]|0)){k[c>>2]=j;if(!j){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();b=g+16|0;if((k[b>>2]|0)==(l|0))k[b>>2]=j;else k[g+20>>2]=j;if(!j){u=l;f=m;break}}c=k[151]|0;if(j>>>0>>0)Aa();k[j+24>>2]=g;b=k[a+(i+16)>>2]|0;do if(b)if(b>>>0>>0)Aa();else{k[j+16>>2]=b;k[b+24>>2]=j;break}while(0);b=k[a+(i+20)>>2]|0;if(b)if(b>>>0<(k[151]|0)>>>0)Aa();else{k[j+20>>2]=b;k[b+24>>2]=j;u=l;f=m;break}else{u=l;f=m}}else{u=l;f=m}}else{u=b;f=o}while(0);if(u>>>0>=q>>>0)Aa();b=a+(o+-4)|0;c=k[b>>2]|0;if(!(c&1))Aa();if(!(c&2)){if((q|0)==(k[153]|0)){t=(k[150]|0)+f|0;k[150]=t;k[153]=u;k[u+4>>2]=t|1;if((u|0)!=(k[152]|0))return;k[152]=0;k[149]=0;return}if((q|0)==(k[152]|0)){t=(k[149]|0)+f|0;k[149]=t;k[152]=u;k[u+4>>2]=t|1;k[u+t>>2]=t;return}f=(c&-8)+f|0;e=c>>>3;do if(c>>>0>=256){g=k[a+(o+16)>>2]|0;b=k[a+(o|4)>>2]|0;do if((b|0)==(q|0)){c=a+(o+12)|0;b=k[c>>2]|0;if(!b){c=a+(o+8)|0;b=k[c>>2]|0;if(!b){p=0;break}}while(1){d=b+20|0;e=k[d>>2]|0;if(e){b=e;c=d;continue}d=b+16|0;e=k[d>>2]|0;if(!e)break;else{b=e;c=d}}if(c>>>0<(k[151]|0)>>>0)Aa();else{k[c>>2]=0;p=b;break}}else{c=k[a+o>>2]|0;if(c>>>0<(k[151]|0)>>>0)Aa();d=c+12|0;if((k[d>>2]|0)!=(q|0))Aa();e=b+8|0;if((k[e>>2]|0)==(q|0)){k[d>>2]=b;k[e>>2]=c;p=b;break}else Aa()}while(0);if(g){b=k[a+(o+20)>>2]|0;c=892+(b<<2)|0;if((q|0)==(k[c>>2]|0)){k[c>>2]=p;if(!p){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();b=g+16|0;if((k[b>>2]|0)==(q|0))k[b>>2]=p;else k[g+20>>2]=p;if(!p)break}c=k[151]|0;if(p>>>0>>0)Aa();k[p+24>>2]=g;b=k[a+(o+8)>>2]|0;do if(b)if(b>>>0>>0)Aa();else{k[p+16>>2]=b;k[b+24>>2]=p;break}while(0);b=k[a+(o+12)>>2]|0;if(b)if(b>>>0<(k[151]|0)>>>0)Aa();else{k[p+20>>2]=b;k[b+24>>2]=p;break}}}else{d=k[a+o>>2]|0;c=k[a+(o|4)>>2]|0;b=628+(e<<1<<2)|0;if((d|0)!=(b|0)){if(d>>>0<(k[151]|0)>>>0)Aa();if((k[d+12>>2]|0)!=(q|0))Aa()}if((c|0)==(d|0)){k[147]=k[147]&~(1<>>0<(k[151]|0)>>>0)Aa();b=c+8|0;if((k[b>>2]|0)==(q|0))n=b;else Aa()}else n=c+8|0;k[d+12>>2]=c;k[n>>2]=d}while(0);k[u+4>>2]=f|1;k[u+f>>2]=f;if((u|0)==(k[152]|0)){k[149]=f;return}}else{k[b>>2]=c&-2;k[u+4>>2]=f|1;k[u+f>>2]=f}b=f>>>3;if(f>>>0<256){c=b<<1;e=628+(c<<2)|0;d=k[147]|0;b=1<>2]|0;if(c>>>0<(k[151]|0)>>>0)Aa();else{r=b;s=c}}else{k[147]=d|b;r=628+(c+2<<2)|0;s=e}k[r>>2]=u;k[s+12>>2]=u;k[u+8>>2]=s;k[u+12>>2]=e;return}b=f>>>8;if(b)if(f>>>0>16777215)e=31;else{r=(b+1048320|0)>>>16&8;s=b<>>16&4;s=s<>>16&2;e=14-(q|r|e)+(s<>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;b=892+(e<<2)|0;k[u+28>>2]=e;k[u+20>>2]=0;k[u+16>>2]=0;c=k[148]|0;d=1<>2]|0;b:do if((k[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){c=b+16+(e>>>31<<2)|0;d=k[c>>2]|0;if(!d)break;if((k[d+4>>2]&-8|0)==(f|0)){t=d;break b}else{e=e<<1;b=d}}if(c>>>0<(k[151]|0)>>>0)Aa();else{k[c>>2]=u;k[u+24>>2]=b;k[u+12>>2]=u;k[u+8>>2]=u;break a}}else t=b;while(0);b=t+8|0;c=k[b>>2]|0;s=k[151]|0;if(c>>>0>=s>>>0&t>>>0>=s>>>0){k[c+12>>2]=u;k[b>>2]=u;k[u+8>>2]=c;k[u+12>>2]=t;k[u+24>>2]=0;break}else Aa()}else{k[148]=c|d;k[b>>2]=u;k[u+24>>2]=b;k[u+12>>2]=u;k[u+8>>2]=u}while(0);u=(k[155]|0)+-1|0;k[155]=u;if(!u)b=1044;else return;while(1){b=k[b>>2]|0;if(!b)break;else b=b+8|0}k[155]=-1;return}function Tc(a,b){a=a|0;b=b|0;var c=0,d=0;if(!a){a=Rc(b)|0;return a|0}if(b>>>0>4294967231){a=mc()|0;k[a>>2]=12;a=0;return a|0}c=Vc(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(c){a=c+8|0;return a|0}c=Rc(b)|0;if(!c){a=0;return a|0}d=k[a+-4>>2]|0;d=(d&-8)-((d&3|0)==0?8:4)|0;bd(c|0,a|0,(d>>>0>>0?d:b)|0)|0;Sc(a);a=c;return a|0}function Uc(a){a=a|0;var b=0;if(!a){b=0;return b|0}a=k[a+-4>>2]|0;b=a&3;if((b|0)==1){b=0;return b|0}b=(a&-8)-((b|0)==0?8:4)|0;return b|0}function Vc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;o=a+4|0;p=k[o>>2]|0;i=p&-8;l=a+i|0;h=k[151]|0;c=p&3;if(!((c|0)!=1&a>>>0>=h>>>0&a>>>0>>0))Aa();d=a+(i|4)|0;e=k[d>>2]|0;if(!(e&1))Aa();if(!c){if(b>>>0<256){a=0;return a|0}if(i>>>0>=(b+4|0)>>>0?(i-b|0)>>>0<=k[267]<<1>>>0:0)return a|0;a=0;return a|0}if(i>>>0>=b>>>0){c=i-b|0;if(c>>>0<=15)return a|0;k[o>>2]=p&1|b|2;k[a+(b+4)>>2]=c|3;k[d>>2]=k[d>>2]|1;Wc(a+b|0,c);return a|0}if((l|0)==(k[153]|0)){c=(k[150]|0)+i|0;if(c>>>0<=b>>>0){a=0;return a|0}n=c-b|0;k[o>>2]=p&1|b|2;k[a+(b+4)>>2]=n|1;k[153]=a+b;k[150]=n;return a|0}if((l|0)==(k[152]|0)){d=(k[149]|0)+i|0;if(d>>>0>>0){a=0;return a|0}c=d-b|0;if(c>>>0>15){k[o>>2]=p&1|b|2;k[a+(b+4)>>2]=c|1;k[a+d>>2]=c;d=a+(d+4)|0;k[d>>2]=k[d>>2]&-2;d=a+b|0}else{k[o>>2]=p&1|d|2;d=a+(d+4)|0;k[d>>2]=k[d>>2]|1;d=0;c=0}k[149]=c;k[152]=d;return a|0}if(e&2){a=0;return a|0}m=(e&-8)+i|0;if(m>>>0>>0){a=0;return a|0}n=m-b|0;f=e>>>3;do if(e>>>0>=256){g=k[a+(i+24)>>2]|0;f=k[a+(i+12)>>2]|0;do if((f|0)==(l|0)){d=a+(i+20)|0;c=k[d>>2]|0;if(!c){d=a+(i+16)|0;c=k[d>>2]|0;if(!c){j=0;break}}while(1){e=c+20|0;f=k[e>>2]|0;if(f){c=f;d=e;continue}e=c+16|0;f=k[e>>2]|0;if(!f)break;else{c=f;d=e}}if(d>>>0>>0)Aa();else{k[d>>2]=0;j=c;break}}else{e=k[a+(i+8)>>2]|0;if(e>>>0>>0)Aa();c=e+12|0;if((k[c>>2]|0)!=(l|0))Aa();d=f+8|0;if((k[d>>2]|0)==(l|0)){k[c>>2]=f;k[d>>2]=e;j=f;break}else Aa()}while(0);if(g){c=k[a+(i+28)>>2]|0;d=892+(c<<2)|0;if((l|0)==(k[d>>2]|0)){k[d>>2]=j;if(!j){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();c=g+16|0;if((k[c>>2]|0)==(l|0))k[c>>2]=j;else k[g+20>>2]=j;if(!j)break}d=k[151]|0;if(j>>>0>>0)Aa();k[j+24>>2]=g;c=k[a+(i+16)>>2]|0;do if(c)if(c>>>0>>0)Aa();else{k[j+16>>2]=c;k[c+24>>2]=j;break}while(0);c=k[a+(i+20)>>2]|0;if(c)if(c>>>0<(k[151]|0)>>>0)Aa();else{k[j+20>>2]=c;k[c+24>>2]=j;break}}}else{e=k[a+(i+8)>>2]|0;d=k[a+(i+12)>>2]|0;c=628+(f<<1<<2)|0;if((e|0)!=(c|0)){if(e>>>0>>0)Aa();if((k[e+12>>2]|0)!=(l|0))Aa()}if((d|0)==(e|0)){k[147]=k[147]&~(1<>>0>>0)Aa();c=d+8|0;if((k[c>>2]|0)==(l|0))g=c;else Aa()}else g=d+8|0;k[e+12>>2]=d;k[g>>2]=e}while(0);if(n>>>0<16){k[o>>2]=m|p&1|2;b=a+(m|4)|0;k[b>>2]=k[b>>2]|1;return a|0}else{k[o>>2]=p&1|b|2;k[a+(b+4)>>2]=n|3;p=a+(m|4)|0;k[p>>2]=k[p>>2]|1;Wc(a+b|0,n);return a|0}return 0}function Wc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;q=a+b|0;c=k[a+4>>2]|0;do if(!(c&1)){j=k[a>>2]|0;if(!(c&3))return;n=a+(0-j)|0;m=j+b|0;i=k[151]|0;if(n>>>0>>0)Aa();if((n|0)==(k[152]|0)){d=a+(b+4)|0;c=k[d>>2]|0;if((c&3|0)!=3){t=n;g=m;break}k[149]=m;k[d>>2]=c&-2;k[a+(4-j)>>2]=m|1;k[q>>2]=m;return}f=j>>>3;if(j>>>0<256){e=k[a+(8-j)>>2]|0;d=k[a+(12-j)>>2]|0;c=628+(f<<1<<2)|0;if((e|0)!=(c|0)){if(e>>>0>>0)Aa();if((k[e+12>>2]|0)!=(n|0))Aa()}if((d|0)==(e|0)){k[147]=k[147]&~(1<>>0>>0)Aa();c=d+8|0;if((k[c>>2]|0)==(n|0))h=c;else Aa()}else h=d+8|0;k[e+12>>2]=d;k[h>>2]=e;t=n;g=m;break}h=k[a+(24-j)>>2]|0;e=k[a+(12-j)>>2]|0;do if((e|0)==(n|0)){e=16-j|0;d=a+(e+4)|0;c=k[d>>2]|0;if(!c){d=a+e|0;c=k[d>>2]|0;if(!c){l=0;break}}while(1){e=c+20|0;f=k[e>>2]|0;if(f){c=f;d=e;continue}e=c+16|0;f=k[e>>2]|0;if(!f)break;else{c=f;d=e}}if(d>>>0>>0)Aa();else{k[d>>2]=0;l=c;break}}else{f=k[a+(8-j)>>2]|0;if(f>>>0>>0)Aa();c=f+12|0;if((k[c>>2]|0)!=(n|0))Aa();d=e+8|0;if((k[d>>2]|0)==(n|0)){k[c>>2]=e;k[d>>2]=f;l=e;break}else Aa()}while(0);if(h){c=k[a+(28-j)>>2]|0;d=892+(c<<2)|0;if((n|0)==(k[d>>2]|0)){k[d>>2]=l;if(!l){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();c=h+16|0;if((k[c>>2]|0)==(n|0))k[c>>2]=l;else k[h+20>>2]=l;if(!l){t=n;g=m;break}}e=k[151]|0;if(l>>>0>>0)Aa();k[l+24>>2]=h;c=16-j|0;d=k[a+c>>2]|0;do if(d)if(d>>>0>>0)Aa();else{k[l+16>>2]=d;k[d+24>>2]=l;break}while(0);c=k[a+(c+4)>>2]|0;if(c)if(c>>>0<(k[151]|0)>>>0)Aa();else{k[l+20>>2]=c;k[c+24>>2]=l;t=n;g=m;break}else{t=n;g=m}}else{t=n;g=m}}else{t=a;g=b}while(0);i=k[151]|0;if(q>>>0>>0)Aa();c=a+(b+4)|0;d=k[c>>2]|0;if(!(d&2)){if((q|0)==(k[153]|0)){s=(k[150]|0)+g|0;k[150]=s;k[153]=t;k[t+4>>2]=s|1;if((t|0)!=(k[152]|0))return;k[152]=0;k[149]=0;return}if((q|0)==(k[152]|0)){s=(k[149]|0)+g|0;k[149]=s;k[152]=t;k[t+4>>2]=s|1;k[t+s>>2]=s;return}g=(d&-8)+g|0;f=d>>>3;do if(d>>>0>=256){h=k[a+(b+24)>>2]|0;e=k[a+(b+12)>>2]|0;do if((e|0)==(q|0)){d=a+(b+20)|0;c=k[d>>2]|0;if(!c){d=a+(b+16)|0;c=k[d>>2]|0;if(!c){p=0;break}}while(1){e=c+20|0;f=k[e>>2]|0;if(f){c=f;d=e;continue}e=c+16|0;f=k[e>>2]|0;if(!f)break;else{c=f;d=e}}if(d>>>0>>0)Aa();else{k[d>>2]=0;p=c;break}}else{f=k[a+(b+8)>>2]|0;if(f>>>0>>0)Aa();c=f+12|0;if((k[c>>2]|0)!=(q|0))Aa();d=e+8|0;if((k[d>>2]|0)==(q|0)){k[c>>2]=e;k[d>>2]=f;p=e;break}else Aa()}while(0);if(h){c=k[a+(b+28)>>2]|0;d=892+(c<<2)|0;if((q|0)==(k[d>>2]|0)){k[d>>2]=p;if(!p){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();c=h+16|0;if((k[c>>2]|0)==(q|0))k[c>>2]=p;else k[h+20>>2]=p;if(!p)break}d=k[151]|0;if(p>>>0>>0)Aa();k[p+24>>2]=h;c=k[a+(b+16)>>2]|0;do if(c)if(c>>>0>>0)Aa();else{k[p+16>>2]=c;k[c+24>>2]=p;break}while(0);c=k[a+(b+20)>>2]|0;if(c)if(c>>>0<(k[151]|0)>>>0)Aa();else{k[p+20>>2]=c;k[c+24>>2]=p;break}}}else{e=k[a+(b+8)>>2]|0;d=k[a+(b+12)>>2]|0;c=628+(f<<1<<2)|0;if((e|0)!=(c|0)){if(e>>>0>>0)Aa();if((k[e+12>>2]|0)!=(q|0))Aa()}if((d|0)==(e|0)){k[147]=k[147]&~(1<>>0>>0)Aa();c=d+8|0;if((k[c>>2]|0)==(q|0))o=c;else Aa()}else o=d+8|0;k[e+12>>2]=d;k[o>>2]=e}while(0);k[t+4>>2]=g|1;k[t+g>>2]=g;if((t|0)==(k[152]|0)){k[149]=g;return}}else{k[c>>2]=d&-2;k[t+4>>2]=g|1;k[t+g>>2]=g}c=g>>>3;if(g>>>0<256){d=c<<1;f=628+(d<<2)|0;e=k[147]|0;c=1<>2]|0;if(d>>>0<(k[151]|0)>>>0)Aa();else{r=c;s=d}}else{k[147]=e|c;r=628+(d+2<<2)|0;s=f}k[r>>2]=t;k[s+12>>2]=t;k[t+8>>2]=s;k[t+12>>2]=f;return}c=g>>>8;if(c)if(g>>>0>16777215)f=31;else{r=(c+1048320|0)>>>16&8;s=c<>>16&4;s=s<>>16&2;f=14-(q|r|f)+(s<>>15)|0;f=g>>>(f+7|0)&1|f<<1}else f=0;c=892+(f<<2)|0;k[t+28>>2]=f;k[t+20>>2]=0;k[t+16>>2]=0;d=k[148]|0;e=1<>2]=t;k[t+24>>2]=c;k[t+12>>2]=t;k[t+8>>2]=t;return}c=k[c>>2]|0;a:do if((k[c+4>>2]&-8|0)!=(g|0)){f=g<<((f|0)==31?0:25-(f>>>1)|0);while(1){d=c+16+(f>>>31<<2)|0;e=k[d>>2]|0;if(!e)break;if((k[e+4>>2]&-8|0)==(g|0)){c=e;break a}else{f=f<<1;c=e}}if(d>>>0<(k[151]|0)>>>0)Aa();k[d>>2]=t;k[t+24>>2]=c;k[t+12>>2]=t;k[t+8>>2]=t;return}while(0);d=c+8|0;e=k[d>>2]|0;s=k[151]|0;if(!(e>>>0>=s>>>0&c>>>0>=s>>>0))Aa();k[e+12>>2]=t;k[d>>2]=t;k[t+8>>2]=e;k[t+12>>2]=c;k[t+24>>2]=0;return}function Xc(){}function Yc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (L=d,a-c>>>0|0)|0}function Zc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (L=b+d+(c>>>0>>0|0)>>>0,c|0)|0}function _c(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=a+c|0;if((c|0)>=20){b=b&255;f=a&3;g=b|b<<8|b<<16|b<<24;e=d&~3;if(f){f=a+4-f|0;while((a|0)<(f|0)){i[a>>0]=b;a=a+1|0}}while((a|0)<(e|0)){k[a>>2]=g;a=a+4|0}}while((a|0)<(d|0)){i[a>>0]=b;a=a+1|0}return a-c|0}function $c(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b>>>c;return a>>>c|(b&(1<>>c-32|0}function ad(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b<>>32-c;return a<=4096)return Ha(a|0,b|0,c|0)|0;d=a|0;if((a&3)==(b&3)){while(a&3){if(!c)return d|0;i[a>>0]=i[b>>0]|0;a=a+1|0;b=b+1|0;c=c-1|0}while((c|0)>=4){k[a>>2]=k[b>>2];a=a+4|0;b=b+4|0;c=c-4|0}}while((c|0)>0){i[a>>0]=i[b>>0]|0;a=a+1|0;b=b+1|0;c=c-1|0}return d|0}function cd(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b>>c;return a>>>c|(b&(1<>c-32|0}function dd(a){a=a|0;var b=0;b=i[v+(a&255)>>0]|0;if((b|0)<8)return b|0;b=i[v+(a>>8&255)>>0]|0;if((b|0)<8)return b+8|0;b=i[v+(a>>16&255)>>0]|0;if((b|0)<8)return b+16|0;return (i[v+(a>>>24)>>0]|0)+24|0}function ed(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=ha(e,f)|0;d=a>>>16;a=(c>>>16)+(ha(e,d)|0)|0;e=b>>>16;b=ha(e,f)|0;return (L=(a>>>16)+(ha(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function fd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=Yc(j^a,i^b,j,i)|0;g=L;a=f^j;b=e^i;return Yc((kd(h,g,Yc(f^c,e^d,f,e)|0,L,0)|0)^a,L^b,a,b)|0}function gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=r;r=r+16|0;h=e|0;g=b>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;j=d>>31|((d|0)<0?-1:0)<<1;i=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;a=Yc(g^a,f^b,g,f)|0;b=L;kd(a,b,Yc(j^c,i^d,j,i)|0,L,h)|0;d=Yc(k[h>>2]^g,k[h+4>>2]^f,g,f)|0;c=L;r=e;return (L=c,d)|0}function hd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=ed(e,f)|0;a=L;return (L=(ha(b,f)|0)+(ha(d,e)|0)+a|a&0,c|0|0)|0}function id(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return kd(a,b,c,d,0)|0}function jd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=r;r=r+16|0;e=f|0;kd(a,b,c,d,e)|0;r=f;return (L=k[e+4>>2]|0,k[e>>2]|0)|0}function kd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;l=a;i=b;j=i;g=c;n=d;h=n;if(!j){f=(e|0)!=0;if(!h){if(f){k[e>>2]=(l>>>0)%(g>>>0);k[e+4>>2]=0}n=0;e=(l>>>0)/(g>>>0)>>>0;return (L=n,e)|0}else{if(!f){n=0;e=0;return (L=n,e)|0}k[e>>2]=a|0;k[e+4>>2]=b&0;n=0;e=0;return (L=n,e)|0}}f=(h|0)==0;do if(g){if(!f){f=(ja(h|0)|0)-(ja(j|0)|0)|0;if(f>>>0<=31){m=f+1|0;h=31-f|0;b=f-31>>31;g=m;a=l>>>(m>>>0)&b|j<>>(m>>>0)&b;f=0;h=l<>2]=a|0;k[e+4>>2]=i|b&0;n=0;e=0;return (L=n,e)|0}f=g-1|0;if(f&g){h=(ja(g|0)|0)+33-(ja(j|0)|0)|0;p=64-h|0;m=32-h|0;i=m>>31;o=h-32|0;b=o>>31;g=h;a=m-1>>31&j>>>(o>>>0)|(j<>>(h>>>0))&b;b=b&j>>>(h>>>0);f=l<>>(o>>>0))&i|l<>31;break}if(e){k[e>>2]=f&l;k[e+4>>2]=0}if((g|0)==1){o=i|b&0;p=a|0|0;return (L=o,p)|0}else{p=dd(g|0)|0;o=j>>>(p>>>0)|0;p=j<<32-p|l>>>(p>>>0)|0;return (L=o,p)|0}}else{if(f){if(e){k[e>>2]=(j>>>0)%(g>>>0);k[e+4>>2]=0}o=0;p=(j>>>0)/(g>>>0)>>>0;return (L=o,p)|0}if(!l){if(e){k[e>>2]=0;k[e+4>>2]=(j>>>0)%(h>>>0)}o=0;p=(j>>>0)/(h>>>0)>>>0;return (L=o,p)|0}f=h-1|0;if(!(f&h)){if(e){k[e>>2]=a|0;k[e+4>>2]=f&j|b&0}o=0;p=j>>>((dd(h|0)|0)>>>0);return (L=o,p)|0}f=(ja(h|0)|0)-(ja(j|0)|0)|0;if(f>>>0<=30){b=f+1|0;h=31-f|0;g=b;a=j<>>(b>>>0);b=j>>>(b>>>0);f=0;h=l<>2]=a|0;k[e+4>>2]=i|b&0;o=0;p=0;return (L=o,p)|0}while(0);if(!g){j=h;i=0;h=0}else{m=c|0|0;l=n|d&0;j=Zc(m|0,l|0,-1,-1)|0;c=L;i=h;h=0;do{d=i;i=f>>>31|i<<1;f=h|f<<1;d=a<<1|d>>>31|0;n=a>>>31|b<<1|0;Yc(j,c,d,n)|0;p=L;o=p>>31|((p|0)<0?-1:0)<<1;h=o&1;a=Yc(d,n,o&m,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l)|0;b=L;g=g-1|0}while((g|0)!=0);j=i;i=0}g=0;if(e){k[e>>2]=a;k[e+4>>2]=b}o=(f|0)>>>31|(j|g)<<1|(g<<1|f>>>31)&0|i;p=(f<<1|0>>>31)&-2|h;return (L=o,p)|0}function ld(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ra[a&7](b|0,c|0,d|0)|0}function md(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Sa[a&3](b|0,c|0,d|0,e|0,f|0)}function nd(a,b){a=a|0;b=b|0;Ta[a&7](b|0)}function od(a,b){a=a|0;b=b|0;return Ua[a&1](b|0)|0}function pd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Va[a&0](b|0,c|0,d|0)}function qd(a){a=a|0;Wa[a&3]()}function rd(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;Xa[a&3](b|0,c|0,d|0,e|0,f|0,g|0)}function sd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Ya[a&3](b|0,c|0,d|0,e|0)}function td(a,b,c){a=a|0;b=b|0;c=c|0;ka(0);return 0}function ud(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ka(1)}function vd(a){a=a|0;ka(2)}function wd(a){a=a|0;ka(3);return 0}function xd(a,b,c){a=a|0;b=b|0;c=c|0;ka(4)}function yd(){ka(5)}function zd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;ka(6)}function Ad(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ka(7)} + +// EMSCRIPTEN_END_FUNCS + var Ra=[td,Yb,Nc,Gc,Fc,Hc,td,td];var Sa=[ud,dc,cc,ud];var Ta=[vd,Tb,Wb,Ub,Vb,Xb,kc,Mc];var Ua=[wd,Ec];var Va=[xd];var Wa=[yd,ic,jc,yd];var Xa=[zd,fc,ec,zd];var Ya=[Ad,_b,$b,Ad];return{___cxa_can_catch:gc,_crn_get_levels:zb,_crn_get_uncompressed_size:Bb,_crn_decompress:Cb,_i64Add:Zc,_crn_get_width:xb,___cxa_is_pointer_type:hc,_i64Subtract:Yc,_memset:_c,_malloc:Rc,_memcpy:bd,_bitshift64Lshr:$c,_free:Sc,_bitshift64Shl:ad,_crn_get_height:yb,_crn_get_dxt_format:Ab,runPostSets:Xc,_emscripten_replace_memory:Qa,stackAlloc:Za,stackSave:_a,stackRestore:$a,establishStackSpace:ab,setThrew:bb,setTempRet0:eb,getTempRet0:fb,dynCall_iiii:ld,dynCall_viiiii:md,dynCall_vi:nd,dynCall_ii:od,dynCall_viii:pd,dynCall_v:qd,dynCall_viiiiii:rd,dynCall_viiii:sd}}) + + + // EMSCRIPTEN_END_ASM + (Module.asmGlobalArg,Module.asmLibraryArg,buffer);var ___cxa_can_catch=Module["___cxa_can_catch"]=asm["___cxa_can_catch"];var _crn_get_levels=Module["_crn_get_levels"]=asm["_crn_get_levels"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var _crn_get_uncompressed_size=Module["_crn_get_uncompressed_size"]=asm["_crn_get_uncompressed_size"];var _crn_decompress=Module["_crn_decompress"]=asm["_crn_decompress"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _crn_get_height=Module["_crn_get_height"]=asm["_crn_get_height"];var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=asm["___cxa_is_pointer_type"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _memset=Module["_memset"]=asm["_memset"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=asm["_emscripten_replace_memory"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _free=Module["_free"]=asm["_free"];var _crn_get_dxt_format=Module["_crn_get_dxt_format"]=asm["_crn_get_dxt_format"];var _crn_get_width=Module["_crn_get_width"]=asm["_crn_get_width"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];Runtime.stackAlloc=asm["stackAlloc"];Runtime.stackSave=asm["stackSave"];Runtime.stackRestore=asm["stackRestore"];Runtime.establishStackSpace=asm["establishStackSpace"];Runtime.setTempRet0=asm["setTempRet0"];Runtime.getTempRet0=asm["getTempRet0"];function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){assert(runDependencies==0,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");assert(__ATPRERUN__.length==0,"cannot call main when preRun functions remain to be called");args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["stdout"]["once"]("drain",(function(){process["exit"](status)}));console.log(" ");setTimeout((function(){process["exit"](status)}),500)}else if(ENVIRONMENT_IS_SHELL&&typeof quit==="function"){quit(status)}throw new ExitStatus(status)}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}Module["noExitRuntime"]=true;run() + + return Module; +}); \ No newline at end of file From c67a2ca30012f89282d28fe66deadbf5ab2a5ca4 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Thu, 5 Jan 2017 15:15:39 -0500 Subject: [PATCH 325/396] Fix issue with binary glTF compressed textures. --- Source/Core/loadKTX.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Source/Core/loadKTX.js b/Source/Core/loadKTX.js index 03622acc8819..85038080d13f 100644 --- a/Source/Core/loadKTX.js +++ b/Source/Core/loadKTX.js @@ -216,7 +216,12 @@ define([ var imageSize = view.getUint32(byteOffset, true); byteOffset += sizeOfUint32; - var texture = new Uint8Array(data, byteOffset, imageSize); + var texture; + if (defined(data.buffer)) { + texture = new Uint8Array(data.buffer, byteOffset, imageSize); + } else { + texture = new Uint8Array(data, byteOffset, imageSize); + } // Some tools use a sized internal format. // See table 2: https://www.opengl.org/sdk/docs/man/html/glTexImage2D.xhtml @@ -263,7 +268,7 @@ define([ // Only use the level 0 mipmap if (PixelFormat.isCompressedFormat(glInternalFormat) && numberOfMipmapLevels > 1) { var levelSize = PixelFormat.compressedTextureSize(glInternalFormat, pixelWidth, pixelHeight); - texture = new Uint8Array(texture.buffer, 0, levelSize); + texture = texture.slice(0, levelSize); } return new CompressedTextureBuffer(glInternalFormat, pixelWidth, pixelHeight, texture); From 2d672d7a54d689b140a1c710c427a64357a8d783 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Thu, 5 Jan 2017 15:48:02 -0500 Subject: [PATCH 326/396] octencode 32P --- Source/Core/GeometryPipeline.js | 18 +++++---- Source/Scene/GroundPrimitive.js | 4 +- .../Shaders/Builtin/Functions/octDecode.glsl | 38 +++++++++++++------ 3 files changed, 39 insertions(+), 21 deletions(-) diff --git a/Source/Core/GeometryPipeline.js b/Source/Core/GeometryPipeline.js index 13e121e2c431..23bbeb25a91a 100644 --- a/Source/Core/GeometryPipeline.js +++ b/Source/Core/GeometryPipeline.js @@ -1346,7 +1346,7 @@ define([ var toEncode1 = new Cartesian3(); var toEncode2 = new Cartesian3(); var toEncode3 = new Cartesian3(); - + var encodeResult2 = new Cartesian2(); /** * Compresses and packs geometry normal attribute values to save memory. * @@ -1365,26 +1365,28 @@ define([ var extrudeAttribute = geometry.attributes.extrudeDirection; var i; - var index; var numVertices; if (defined(extrudeAttribute)) { //only shadow volumes use extrudeDirection, and shadow volumes use vertexFormat: POSITION_ONLY so we don't need to check other attributes var extrudeDirections = extrudeAttribute.values; numVertices = extrudeDirections.length / 3.0; - var compressedDirections = new Float32Array(numVertices); + var compressedDirections = new Float32Array(numVertices * 2); + var i2 = 0; for (i = 0; i < numVertices; ++i) { - index = i * 3.0; - Cartesian3.fromArray(extrudeDirections, index, toEncode1); + Cartesian3.fromArray(extrudeDirections, i * 3.0, toEncode1); if (Cartesian3.equals(toEncode1, Cartesian3.ZERO)) { + i2 += 2; continue; } - compressedDirections[i] = AttributeCompression.octEncodeFloat(toEncode1); + encodeResult2 = AttributeCompression.octEncodeInRange(toEncode1, 65535, encodeResult2); + compressedDirections[i2++] = encodeResult2.x; + compressedDirections[i2++] = encodeResult2.y; } geometry.attributes.compressedAttributes = new GeometryAttribute({ componentDatatype : ComponentDatatype.FLOAT, - componentsPerAttribute : 1, + componentsPerAttribute : 2, values : compressedDirections }); delete geometry.attributes.extrudeDirection; @@ -1442,7 +1444,7 @@ define([ compressedAttributes[normalIndex++] = AttributeCompression.compressTextureCoordinates(scratchCartesian2); } - index = i * 3.0; + var index = i * 3.0; if (hasNormal && defined(tangents) && defined(binormals)) { Cartesian3.fromArray(normals, index, toEncode1); Cartesian3.fromArray(tangents, index, toEncode2); diff --git a/Source/Scene/GroundPrimitive.js b/Source/Scene/GroundPrimitive.js index d87ef7ed5bb4..eadf4b5cfe50 100644 --- a/Source/Scene/GroundPrimitive.js +++ b/Source/Scene/GroundPrimitive.js @@ -743,10 +743,10 @@ define([ var attributeName = 'compressedAttributes'; //only shadow volumes use extrudeDirection, and shadow volumes use vertexFormat: POSITION_ONLY so we don't need to check other attributes - var attributeDecl = 'attribute float ' + attributeName + ';'; + var attributeDecl = 'attribute vec2 ' + attributeName + ';'; var globalDecl = 'vec3 extrudeDirection;\n'; - var decode = ' extrudeDirection = czm_octDecode(' + attributeName + ');\n'; + var decode = ' extrudeDirection = czm_octDecode(' + attributeName + ', 65535.0);\n'; var modifiedVS = vertexShaderSource; modifiedVS = modifiedVS.replace(/attribute\s+vec3\s+extrudeDirection;/g, ''); diff --git a/Source/Shaders/Builtin/Functions/octDecode.glsl b/Source/Shaders/Builtin/Functions/octDecode.glsl index 5a224b9552c1..ce4df362da12 100644 --- a/Source/Shaders/Builtin/Functions/octDecode.glsl +++ b/Source/Shaders/Builtin/Functions/octDecode.glsl @@ -1,3 +1,29 @@ + /** + * Decodes a unit-length vector in 'oct' encoding to a normalized 3-component Cartesian vector. + * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", + * Cigolle et al 2014: http://jcgt.org/published/0003/02/01/ + * + * @name czm_octDecode + * @param {vec2} encoded The oct-encoded, unit-length vector + * @param {float} range The maximum value of the SNORM range. The encoded vector is stored in log2(rangeMax+1) bits. + * @returns {vec3} The decoded and normalized vector + */ + vec3 czm_octDecode(vec2 encoded, float range) + { + if (encoded.x == 0.0 && encoded.y == 0.0) { + return vec3(0.0, 0.0, 0.0); + } + + encoded = encoded / range * 2.0 - 1.0; + vec3 v = vec3(encoded.x, encoded.y, 1.0 - abs(encoded.x) - abs(encoded.y)); + if (v.z < 0.0) + { + v.xy = (1.0 - abs(v.yx)) * czm_signNotZero(v.xy); + } + + return normalize(v); + } + /** * Decodes a unit-length vector in 'oct' encoding to a normalized 3-component Cartesian vector. * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", @@ -9,14 +35,7 @@ */ vec3 czm_octDecode(vec2 encoded) { - encoded = encoded / 255.0 * 2.0 - 1.0; - vec3 v = vec3(encoded.x, encoded.y, 1.0 - abs(encoded.x) - abs(encoded.y)); - if (v.z < 0.0) - { - v.xy = (1.0 - abs(v.yx)) * czm_signNotZero(v.xy); - } - - return normalize(v); + return czm_octDecode(encoded, 255.0); } /** @@ -30,9 +49,6 @@ */ vec3 czm_octDecode(float encoded) { - if (encoded == 0.0) { - return vec3(0.0, 0.0, 0.0); - } float temp = encoded / 256.0; float x = floor(temp); float y = (temp - x) * 256.0; From 68082c21f6dec169654880049fab57b421630785 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Thu, 5 Jan 2017 15:58:39 -0500 Subject: [PATCH 327/396] Move transcoding CRN to DXT to a web worker. --- Source/Core/CompressedTextureBuffer.js | 16 +++ Source/Core/loadCRN.js | 138 +++---------------------- Source/Workers/transcodeCRNToDXT.js | 134 ++++++++++++++++++++++++ 3 files changed, 167 insertions(+), 121 deletions(-) create mode 100644 Source/Workers/transcodeCRNToDXT.js diff --git a/Source/Core/CompressedTextureBuffer.js b/Source/Core/CompressedTextureBuffer.js index dc0835944667..7a7251dfb2ec 100644 --- a/Source/Core/CompressedTextureBuffer.js +++ b/Source/Core/CompressedTextureBuffer.js @@ -1,7 +1,9 @@ /*global define*/ define([ + './defined', './defineProperties' ], function( + defined, defineProperties ) { 'use strict'; @@ -64,5 +66,19 @@ define([ } }); + /** + * Creates a shallow clone of a compressed texture buffer. + * + * @param {CompressedTextureBuffer} object The compressed texture buffer to be cloned. + * @return {CompressedTextureBuffer} A shallow clone of the compressed texture buffer. + */ + CompressedTextureBuffer.clone = function(object) { + if (!defined(object)) { + return undefined; + } + + return new CompressedTextureBuffer(object._format, object._width, object._height, object._buffer); + }; + return CompressedTextureBuffer; }); \ No newline at end of file diff --git a/Source/Core/loadCRN.js b/Source/Core/loadCRN.js index f7466f41ed66..679dfa0fa82c 100644 --- a/Source/Core/loadCRN.js +++ b/Source/Core/loadCRN.js @@ -2,137 +2,20 @@ define([ './CompressedTextureBuffer', './defined', - './defineProperties', './DeveloperError', './loadArrayBuffer', - './PixelFormat', - './RuntimeError', - '../ThirdParty/crunch', + './TaskProcessor', '../ThirdParty/when' ], function( CompressedTextureBuffer, defined, - defineProperties, DeveloperError, loadArrayBuffer, - PixelFormat, - RuntimeError, - crunch, + TaskProcessor, when) { 'use strict'; - // Modified from: https://github.com/toji/texture-tester/blob/master/js/webgl-texture-util.js - // Also see: http://toji.github.io/texture-tester/ - - /* Copyright (c) 2014, Brandon Jones. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - - // Taken from crnlib.h - var CRN_FORMAT = { - cCRNFmtInvalid: -1, - - cCRNFmtDXT1: 0, - // cCRNFmtDXT3 is not currently supported when writing to CRN - only DDS. - cCRNFmtDXT3: 1, - cCRNFmtDXT5: 2 - - // Crunch supports more formats than this, but we can't use them here. - }; - - // Mapping of Crunch formats to DXT formats. - var DXT_FORMAT_MAP = {}; - DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT1] = PixelFormat.RGB_DXT1; - DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT3] = PixelFormat.RGBA_DXT3; - DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT5] = PixelFormat.RGBA_DXT5; - - - var dst; - var dxtData; - var cachedDstSize = 0; - - // Copy an array of bytes into or out of the emscripten heap. - function arrayBufferCopy(src, dst, dstByteOffset, numBytes) { - var i; - var dst32Offset = dstByteOffset / 4; - var tail = (numBytes % 4); - var src32 = new Uint32Array(src.buffer, 0, (numBytes - tail) / 4); - var dst32 = new Uint32Array(dst.buffer); - for (i = 0; i < src32.length; i++) { - dst32[dst32Offset + i] = src32[i]; - } - for (i = numBytes - tail; i < numBytes; i++) { - dst[dstByteOffset + i] = src[i]; - } - } - - function decompressCRN(arrayBuffer) { - // Copy the contents of the arrayBuffer into emscriptens heap. - var srcSize = arrayBuffer.byteLength; - var bytes = new Uint8Array(arrayBuffer); - var src = crunch._malloc(srcSize); - arrayBufferCopy(bytes, crunch.HEAPU8, src, srcSize); - - // Determine what type of compressed data the file contains. - var crnFormat = crunch._crn_get_dxt_format(src, srcSize); - var format = DXT_FORMAT_MAP[crnFormat]; - if (!defined(format)) { - throw new RuntimeError("Unsupported DXT format"); - } - - // Gather basic metrics about the DXT data. - var levels = crunch._crn_get_levels(src, srcSize); - var width = crunch._crn_get_width(src, srcSize); - var height = crunch._crn_get_height(src, srcSize); - - // Determine the size of the decoded DXT data. - var dstSize = 0; - var i; - for (i = 0; i < levels; ++i) { - dstSize += PixelFormat.compressedTextureSize(format, width >> i, height >> i); - } - - // Allocate enough space on the emscripten heap to hold the decoded DXT data - // or reuse the existing allocation if a previous call to this function has - // already acquired a large enough buffer. - if(cachedDstSize < dstSize) { - if(defined(dst)) { - crunch._free(dst); - } - dst = crunch._malloc(dstSize); - dxtData = new Uint8Array(crunch.HEAPU8.buffer, dst, dstSize); - cachedDstSize = dstSize; - } - - // Decompress the DXT data from the Crunch file into the allocated space. - crunch._crn_decompress(src, srcSize, dst, dstSize, 0, levels); - - // Release the crunch file data from the emscripten heap. - crunch._free(src); - - // Mipmaps are unsupported, so copy the level 0 texture - // When mipmaps are supported, a copy will still be necessary as dxtData is a view on the heap. - var level0DXTData = dxtData.slice(0, PixelFormat.compressedTextureSize(format, width, height)); - return new CompressedTextureBuffer(format, width, height, level0DXTData); - } + var transcodeTaskProcessor = new TaskProcessor('transcodeCRNToDXT', Number.POSITIVE_INFINITY); function loadCRN(urlOrBuffer, headers) { //>>includeStart('debug', pragmas.debug); @@ -149,7 +32,20 @@ define([ } return loadPromise.then(function(data) { - return decompressCRN(data); + var transferrableObjects = []; + if (data instanceof ArrayBuffer) { + transferrableObjects.push(data); + } else if (data.byteOffset === 0 && data.byteLength === data.buffer.byteLength) { + transferrableObjects.push(data.buffer); + } else { + // data is a view of an array buffer. need to copy so it is transferrable to web worker + data = data.slice(0, data.length); + transferrableObjects.push(data.buffer); + } + + return transcodeTaskProcessor.scheduleTask(data, transferrableObjects); + }).then(function(compressedTextureBuffer) { + return CompressedTextureBuffer.clone(compressedTextureBuffer); }); } diff --git a/Source/Workers/transcodeCRNToDXT.js b/Source/Workers/transcodeCRNToDXT.js new file mode 100644 index 000000000000..094d93f1f69d --- /dev/null +++ b/Source/Workers/transcodeCRNToDXT.js @@ -0,0 +1,134 @@ +/*global define*/ +define([ + '../Core/CompressedTextureBuffer', + '../Core/defined', + '../Core/PixelFormat', + '../Core/RuntimeError', + '../ThirdParty/crunch', + './createTaskProcessorWorker' +], function( + CompressedTextureBuffer, + defined, + PixelFormat, + RuntimeError, + crunch, + createTaskProcessorWorker +) { + 'use strict'; + + // Modified from: https://github.com/toji/texture-tester/blob/master/js/webgl-texture-util.js + // Also see: http://toji.github.io/texture-tester/ + + /* Copyright (c) 2014, Brandon Jones. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + + // Taken from crnlib.h + var CRN_FORMAT = { + cCRNFmtInvalid: -1, + + cCRNFmtDXT1: 0, + // cCRNFmtDXT3 is not currently supported when writing to CRN - only DDS. + cCRNFmtDXT3: 1, + cCRNFmtDXT5: 2 + + // Crunch supports more formats than this, but we can't use them here. + }; + + // Mapping of Crunch formats to DXT formats. + var DXT_FORMAT_MAP = {}; + DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT1] = PixelFormat.RGB_DXT1; + DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT3] = PixelFormat.RGBA_DXT3; + DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT5] = PixelFormat.RGBA_DXT5; + + + var dst; + var dxtData; + var cachedDstSize = 0; + + // Copy an array of bytes into or out of the emscripten heap. + function arrayBufferCopy(src, dst, dstByteOffset, numBytes) { + var i; + var dst32Offset = dstByteOffset / 4; + var tail = (numBytes % 4); + var src32 = new Uint32Array(src.buffer, 0, (numBytes - tail) / 4); + var dst32 = new Uint32Array(dst.buffer); + for (i = 0; i < src32.length; i++) { + dst32[dst32Offset + i] = src32[i]; + } + for (i = numBytes - tail; i < numBytes; i++) { + dst[dstByteOffset + i] = src[i]; + } + } + + function transcodeCRNToDXT(arrayBuffer, transferableObjects) { + // Copy the contents of the arrayBuffer into emscriptens heap. + var srcSize = arrayBuffer.byteLength; + var bytes = new Uint8Array(arrayBuffer); + var src = crunch._malloc(srcSize); + arrayBufferCopy(bytes, crunch.HEAPU8, src, srcSize); + + // Determine what type of compressed data the file contains. + var crnFormat = crunch._crn_get_dxt_format(src, srcSize); + var format = DXT_FORMAT_MAP[crnFormat]; + if (!defined(format)) { + throw new RuntimeError("Unsupported DXT format"); + } + + // Gather basic metrics about the DXT data. + var levels = crunch._crn_get_levels(src, srcSize); + var width = crunch._crn_get_width(src, srcSize); + var height = crunch._crn_get_height(src, srcSize); + + // Determine the size of the decoded DXT data. + var dstSize = 0; + var i; + for (i = 0; i < levels; ++i) { + dstSize += PixelFormat.compressedTextureSize(format, width >> i, height >> i); + } + + // Allocate enough space on the emscripten heap to hold the decoded DXT data + // or reuse the existing allocation if a previous call to this function has + // already acquired a large enough buffer. + if(cachedDstSize < dstSize) { + if(defined(dst)) { + crunch._free(dst); + } + dst = crunch._malloc(dstSize); + dxtData = new Uint8Array(crunch.HEAPU8.buffer, dst, dstSize); + cachedDstSize = dstSize; + } + + // Decompress the DXT data from the Crunch file into the allocated space. + crunch._crn_decompress(src, srcSize, dst, dstSize, 0, levels); + + // Release the crunch file data from the emscripten heap. + crunch._free(src); + + // Mipmaps are unsupported, so copy the level 0 texture + // When mipmaps are supported, a copy will still be necessary as dxtData is a view on the heap. + var level0DXTData = dxtData.slice(0, PixelFormat.compressedTextureSize(format, width, height)); + transferableObjects.push(level0DXTData.buffer); + return new CompressedTextureBuffer(format, width, height, level0DXTData); + } + + return createTaskProcessorWorker(transcodeCRNToDXT); +}); From 5875390afaa078c52bb59435d88e995e69806643 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Thu, 5 Jan 2017 16:10:29 -0500 Subject: [PATCH 328/396] Add support for embedded crunch textures in binary glTF. Update the doc. --- Source/Core/loadCRN.js | 31 +++++++++++++++++++++++++++++ Source/Scene/Model.js | 3 +++ Source/Workers/transcodeCRNToDXT.js | 2 +- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/Source/Core/loadCRN.js b/Source/Core/loadCRN.js index 679dfa0fa82c..f50ebefbfb38 100644 --- a/Source/Core/loadCRN.js +++ b/Source/Core/loadCRN.js @@ -17,6 +17,37 @@ define([ var transcodeTaskProcessor = new TaskProcessor('transcodeCRNToDXT', Number.POSITIVE_INFINITY); + /** + * Asynchronously loads and parses the given URL to a CRN file or parses the raw binary data of a CRN file. + * Returns a promise that will resolve to an object containing the image buffer, width, height and format once loaded, + * or reject if the URL failed to load or failed to parse the data. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * + * @exports loadCRN + * + * @param {String|Promise.|ArrayBuffer} urlOrBuffer The URL of the binary data, a promise for the URL, or an ArrayBuffer. + * @param {Object} [headers] HTTP headers to send with the requests. + * @returns {Promise.} A promise that will resolve to the requested data when loaded. + * + * @exception {RuntimeError} Unsupported compressed format. + * + * @example + * // load a single URL asynchronously + * Cesium.loadCRN('some/url').then(function(textureData) { + * var width = textureData.width; + * var height = textureData.height; + * var format = textureData.internalFormat; + * var arrayBufferView = textureData.bufferView; + * // use the data to create a texture + * }).otherwise(function(error) { + * // an error occurred + * }); + * + * @see {@link https://github.com/BinomialLLC/crunch|crunch DXTc texture compression and transcoding library} + * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} + * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A} + */ function loadCRN(urlOrBuffer, headers) { //>>includeStart('debug', pragmas.debug); if (!defined(urlOrBuffer)) { diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 8ab54a42628f..791639eb9a75 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -1973,6 +1973,9 @@ define([ if (gltfTexture.mimeType === 'image/ktx') { loadKTX(loadResources.getBuffer(bufferView)).then(imageLoad(model, gltfTexture.id)).otherwise(onerror); ++model._loadResources.pendingTextureLoads; + } else if (gltfTexture.mimeType === 'image/crn') { + loadCRN(loadResources.getBuffer(bufferView)).then(imageLoad(model, gltfTexture.id)).otherwise(onerror); + ++model._loadResources.pendingTextureLoads; } else { var onload = getOnImageCreatedFromTypedArray(loadResources, gltfTexture); loadImageFromTypedArray(loadResources.getBuffer(bufferView), gltfTexture.mimeType) diff --git a/Source/Workers/transcodeCRNToDXT.js b/Source/Workers/transcodeCRNToDXT.js index 094d93f1f69d..4f6c4f1c2a8f 100644 --- a/Source/Workers/transcodeCRNToDXT.js +++ b/Source/Workers/transcodeCRNToDXT.js @@ -90,7 +90,7 @@ define([ var crnFormat = crunch._crn_get_dxt_format(src, srcSize); var format = DXT_FORMAT_MAP[crnFormat]; if (!defined(format)) { - throw new RuntimeError("Unsupported DXT format"); + throw new RuntimeError('Unsupported compressed format.'); } // Gather basic metrics about the DXT data. From ee6856c26b858e270e134640fa7a2158d1e817a8 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Thu, 5 Jan 2017 17:08:33 -0500 Subject: [PATCH 329/396] Add crunch support to imagery provider and material. Add loadCRN tests. Update CHANGES.md. --- CHANGES.md | 3 +- Source/Scene/ImageryProvider.js | 7 +- Source/Scene/Material.js | 26 +++--- Specs/Core/loadCRNSpec.js | 150 ++++++++++++++++++++++++++++++++ Specs/Data/Images/Green4x4.crn | Bin 0 -> 138 bytes Specs/Scene/MaterialSpec.js | 23 ++++- server.js | 1 + web.config | 2 + 8 files changed, 197 insertions(+), 15 deletions(-) create mode 100644 Specs/Core/loadCRNSpec.js create mode 100644 Specs/Data/Images/Green4x4.crn diff --git a/CHANGES.md b/CHANGES.md index 4f78f90c10fa..25f3aead0a3b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,8 +4,9 @@ Change Log ### TODO * Added compressed texture support. - * glTF models and imagery layers can now reference [KTX](https://www.khronos.org/opengles/sdk/tools/KTX/) textures. + * glTF models and imagery layers can now reference [KTX](https://www.khronos.org/opengles/sdk/tools/KTX/) textures and textures compressed with [crunch](https://github.com/BinomialLLC/crunch). * Added `loadKTX` to load KTX textures. + * Added `loadCRN` to load crunch compressed textures. * Added new `PixelFormat` and `WebGLConstants` enums from WebGL extensions `WEBGL_compressed_s3tc`, `WEBGL_compressed_texture_pvrtc`, and `WEBGL_compressed_texture_etc1`. [#4758](https://github.com/AnalyticalGraphicsInc/cesium/pull/4758) ### 1.30 - 2017-02-01 diff --git a/Source/Scene/ImageryProvider.js b/Source/Scene/ImageryProvider.js index 974e820a52a3..9525eebfc2d6 100644 --- a/Source/Scene/ImageryProvider.js +++ b/Source/Scene/ImageryProvider.js @@ -3,6 +3,7 @@ define([ '../Core/defined', '../Core/defineProperties', '../Core/DeveloperError', + '../Core/loadCRN', '../Core/loadImage', '../Core/loadImageViaBlob', '../Core/loadKTX', @@ -11,6 +12,7 @@ define([ defined, defineProperties, DeveloperError, + loadCRN, loadImage, loadImageViaBlob, loadKTX, @@ -296,7 +298,8 @@ define([ */ ImageryProvider.prototype.pickFeatures = DeveloperError.throwInstantiationError; - var ktxRegex = /(^data:image\/ktx)|(\.ktx$)/i; + var ktxRegex = /\.ktx$/i; + var crnRegex = /\.crn$/i; /** * Loads an image from a given URL. If the server referenced by the URL already has @@ -312,6 +315,8 @@ define([ ImageryProvider.loadImage = function(imageryProvider, url) { if (ktxRegex.test(url)) { return throttleRequestByServer(url, loadKTX); + } else if (crnRegex.test(url)) { + return throttleRequestByServer(url, loadCRN); } else if (defined(imageryProvider.tileDiscardPolicy)) { return throttleRequestByServer(url, loadImageViaBlob); } diff --git a/Source/Scene/Material.js b/Source/Scene/Material.js index 18596e6d8825..11a8bf488089 100644 --- a/Source/Scene/Material.js +++ b/Source/Scene/Material.js @@ -11,6 +11,7 @@ define([ '../Core/destroyObject', '../Core/DeveloperError', '../Core/isArray', + '../Core/loadCRN', '../Core/loadImage', '../Core/loadKTX', '../Core/Matrix2', @@ -43,6 +44,7 @@ define([ destroyObject, DeveloperError, isArray, + loadCRN, loadImage, loadKTX, Matrix2, @@ -679,6 +681,7 @@ define([ }; var ktxRegex = /\.ktx$/i; + var crnRegex = /\.crn$/i; function createTexture2DUpdateFunction(uniformId) { var oldUniformValue; @@ -758,21 +761,20 @@ define([ if (uniformValue !== material._texturePaths[uniformId]) { if (typeof uniformValue === 'string') { + var promise; if (ktxRegex.test(uniformValue)) { - when(loadKTX(uniformValue), function(image) { - material._loadedImages.push({ - id : uniformId, - image : image - }); - }); + promise = loadKTX(uniformValue); + } else if (crnRegex.test(uniformValue)) { + promise = loadCRN(uniformValue); } else { - when(loadImage(uniformValue), function(image) { - material._loadedImages.push({ - id : uniformId, - image : image - }); - }); + promise = loadImage(uniformValue); } + when(promise, function(image) { + material._loadedImages.push({ + id : uniformId, + image : image + }); + }); } else if (uniformValue instanceof HTMLCanvasElement) { material._loadedImages.push({ id : uniformId, diff --git a/Specs/Core/loadCRNSpec.js b/Specs/Core/loadCRNSpec.js new file mode 100644 index 000000000000..40164fe346aa --- /dev/null +++ b/Specs/Core/loadCRNSpec.js @@ -0,0 +1,150 @@ +/*global defineSuite*/ +defineSuite([ + 'Core/loadCRN', + 'Core/PixelFormat', + 'Core/RequestErrorEvent', + 'Core/RuntimeError' +], function( + loadCRN, + PixelFormat, + RequestErrorEvent, + RuntimeError) { + 'use strict'; + + var validCompressed = new Uint8Array([72, 120, 0, 74, 227, 123, 0, 0, 0, 138, 92, 167, 0, 4, 0, 4, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 22, 0, 1, 0, 0, 96, 0, 0, 12, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 108, 0, 0, 0, 137, 0, 10, 96, 0, 0, 0, 0, 0, 0, 16, 4, 9, 130, 0, 0, 0, 0, 0, 0, 109, 4, 0, 0, 198, 96, 128, 0, 0, 0, 0, 0, 26, 80, 0, 0, 6, 96, 0, 0, 0, 0, 0, 0, 16, 0, 51, 0, 0, 0, 0, 0, 0, 0, 128, 1, 152, 0, 0, 0, 0, 0, 0, 4, 0]); + var fakeXHR; + + beforeEach(function() { + fakeXHR = jasmine.createSpyObj('XMLHttpRequest', ['send', 'open', 'setRequestHeader', 'abort', 'getAllResponseHeaders']); + fakeXHR.simulateLoad = function(response) { + fakeXHR.status = 200; + fakeXHR.response = response; + if (typeof fakeXHR.onload === 'function') { + fakeXHR.onload(); + } + }; + fakeXHR.simulateError = function() { + fakeXHR.response = ''; + if (typeof fakeXHR.onerror === 'function') { + fakeXHR.onerror(); + } + }; + fakeXHR.simulateHttpError = function(statusCode, response) { + fakeXHR.status = statusCode; + fakeXHR.response = response; + if (typeof fakeXHR.onload === 'function') { + fakeXHR.onload(); + } + }; + + spyOn(window, 'XMLHttpRequest').and.returnValue(fakeXHR); + }); + + it('throws with no url', function() { + expect(function() { + loadCRN(); + }).toThrowDeveloperError(); + }); + + it('creates and sends request without any custom headers', function() { + var testUrl = 'http://example.invalid/testuri'; + loadCRN(testUrl); + + expect(fakeXHR.open).toHaveBeenCalledWith('GET', testUrl, true); + expect(fakeXHR.setRequestHeader).not.toHaveBeenCalled(); + expect(fakeXHR.send).toHaveBeenCalled(); + }); + + it('creates and sends request with custom headers', function() { + var testUrl = 'http://example.invalid/testuri'; + loadCRN(testUrl, { + 'Accept' : 'application/json', + 'Cache-Control' : 'no-cache' + }); + + expect(fakeXHR.open).toHaveBeenCalledWith('GET', testUrl, true); + expect(fakeXHR.setRequestHeader.calls.count()).toEqual(2); + expect(fakeXHR.setRequestHeader).toHaveBeenCalledWith('Accept', 'application/json'); + expect(fakeXHR.setRequestHeader).toHaveBeenCalledWith('Cache-Control', 'no-cache'); + expect(fakeXHR.send).toHaveBeenCalled(); + }); + + it('returns a promise that rejects when the request errors', function() { + var testUrl = 'http://example.invalid/testuri'; + var promise = loadCRN(testUrl); + + expect(promise).toBeDefined(); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError).toBeUndefined(); + + fakeXHR.simulateError(); + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RequestErrorEvent).toBe(true); + expect(rejectedError.statusCode).toBeUndefined(); + expect(rejectedError.response).toBeUndefined(); + }); + + it('returns a promise that rejects when the request results in an HTTP error code', function() { + var testUrl = 'http://example.invalid/testuri'; + var promise = loadCRN(testUrl); + + expect(promise).toBeDefined(); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError).toBeUndefined(); + + var error = 'some error'; + fakeXHR.simulateHttpError(404, error); + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RequestErrorEvent).toBe(true); + expect(rejectedError.statusCode).toEqual(404); + expect(rejectedError.response).toEqual(error); + }); + + it('returns a promise that resolves to an compressed texture when the request loads', function() { + var testUrl = 'http://example.invalid/testuri'; + var promise = loadCRN(testUrl); + + expect(promise).toBeDefined(); + + var resolvedValue; + var rejectedError; + var newPromise = promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError).toBeUndefined(); + + var response = validCompressed.buffer; + fakeXHR.simulateLoad(response); + + return newPromise.then(function() { + expect(resolvedValue).toBeDefined(); + expect(resolvedValue.width).toEqual(4); + expect(resolvedValue.height).toEqual(4); + expect(PixelFormat.isCompressedFormat(resolvedValue.internalFormat)).toEqual(true); + expect(resolvedValue.bufferView).toBeDefined(); + expect(rejectedError).toBeUndefined(); + }); + }); +}); diff --git a/Specs/Data/Images/Green4x4.crn b/Specs/Data/Images/Green4x4.crn new file mode 100644 index 0000000000000000000000000000000000000000..d32561e1af3095b0c99b9bfe763dd1f3cbc54e6f GIT binary patch literal 138 zcmeaMVDNfe&A`CW6| + + From 42ba8ec2f00d23eb663ff1617ba77a7d30e521d4 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Fri, 6 Jan 2017 09:22:14 +1100 Subject: [PATCH 330/396] Convert tabs to spaces. --- Specs/Scene/TileImagerySpec.js | 112 ++++++++++++++++----------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/Specs/Scene/TileImagerySpec.js b/Specs/Scene/TileImagerySpec.js index a715df4c1f92..5baaf57f95dd 100644 --- a/Specs/Scene/TileImagerySpec.js +++ b/Specs/Scene/TileImagerySpec.js @@ -1,66 +1,66 @@ /*global defineSuite*/ defineSuite([ - 'Scene/TileImagery', - 'Scene/ImageryState' - ], function( - TileImagery, - ImageryState) { - 'use strict'; + 'Scene/TileImagery', + 'Scene/ImageryState' + ], function( + TileImagery, + ImageryState) { + 'use strict'; - it('does not use ancestor ready imagery that needs to be reprojected', function() { - var imageryLayer = { - _calculateTextureTranslationAndScale: function() {} - }; + it('does not use ancestor ready imagery that needs to be reprojected', function() { + var imageryLayer = { + _calculateTextureTranslationAndScale: function() {} + }; - var grandparentImagery = { - imageryLayer: imageryLayer, - level: 0, - x: 0, - y: 0, - state: ImageryState.READY, - texture: {}, - textureWebMercator: {}, - addReference: function() {} - }; + var grandparentImagery = { + imageryLayer: imageryLayer, + level: 0, + x: 0, + y: 0, + state: ImageryState.READY, + texture: {}, + textureWebMercator: {}, + addReference: function() {} + }; - var parentImagery = { - imageryLayer: imageryLayer, - parent: grandparentImagery, - level: 1, - x: 0, - y: 0, - state: ImageryState.READY, - texture: undefined, - textureWebMercator: {}, - processStateMachine: function() { - ++this.processStateMachineCalls; - }, - processStateMachineCalls: 0, - addReference: function() {} - }; + var parentImagery = { + imageryLayer: imageryLayer, + parent: grandparentImagery, + level: 1, + x: 0, + y: 0, + state: ImageryState.READY, + texture: undefined, + textureWebMercator: {}, + processStateMachine: function() { + ++this.processStateMachineCalls; + }, + processStateMachineCalls: 0, + addReference: function() {} + }; - var thisImagery = { - imageryLayer: imageryLayer, - parent: parentImagery, - level: 2, - x: 0, - y: 0, - state: ImageryState.FAILED, - processStateMachine: function() {}, - addReference: function() {} - }; + var thisImagery = { + imageryLayer: imageryLayer, + parent: parentImagery, + level: 2, + x: 0, + y: 0, + state: ImageryState.FAILED, + processStateMachine: function() {}, + addReference: function() {} + }; - // This TileImagery needs reprojected imagery, and: - // * thisImagery has failed - // * parentImagery needs to be reprojected - // * grandparentImagery is good to go - // When we process the state machine, it should selected grandparentImagery for rendering - // and process the state machine of parentImagery. - var tileImagery = new TileImagery(thisImagery, undefined, false); + // This TileImagery needs reprojected imagery, and: + // * thisImagery has failed + // * parentImagery needs to be reprojected + // * grandparentImagery is good to go + // When we process the state machine, it should selected grandparentImagery for rendering + // and process the state machine of parentImagery. + var tileImagery = new TileImagery(thisImagery, undefined, false); - tileImagery.processStateMachine({}, {}); + tileImagery.processStateMachine({}, {}); - expect(tileImagery.readyImagery).toBe(grandparentImagery); - expect(parentImagery.processStateMachineCalls).toBe(1); - }); + expect(tileImagery.readyImagery).toBe(grandparentImagery); + expect(parentImagery.processStateMachineCalls).toBe(1); + }); }); From 6f76df36dc322a0e9b21eee8d5cec4a21e8f56d4 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Fri, 6 Jan 2017 09:24:56 +1100 Subject: [PATCH 331/396] Add .editorconfig. --- .editorconfig | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000000..9789b2bb80da --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 4 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[*.scss] +indent_size = 2 From c75a981c471f24d28bbe563fd87c74ee3ed920b9 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Fri, 6 Jan 2017 09:27:38 +1100 Subject: [PATCH 332/396] Remove unnecessary scss rule. --- .editorconfig | 3 --- 1 file changed, 3 deletions(-) diff --git a/.editorconfig b/.editorconfig index 9789b2bb80da..2536d66bf13a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,6 +10,3 @@ insert_final_newline = true [*.md] trim_trailing_whitespace = false - -[*.scss] -indent_size = 2 From 2945ed25f91ce2b28e08033bb342ff2d2b6bf565 Mon Sep 17 00:00:00 2001 From: Zsolt Simon Date: Fri, 6 Jan 2017 08:37:25 +1000 Subject: [PATCH 333/396] Don't clone color if it is not necessary --- Source/DataSources/ModelVisualizer.js | 4 ++-- Source/Scene/Model.js | 14 ++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Source/DataSources/ModelVisualizer.js b/Source/DataSources/ModelVisualizer.js index 9514d5ddf6e2..d2b7b0f7fbd9 100644 --- a/Source/DataSources/ModelVisualizer.js +++ b/Source/DataSources/ModelVisualizer.js @@ -148,9 +148,9 @@ define([ model.shadows = Property.getValueOrDefault(modelGraphics._shadows, time, defaultShadows); model.heightReference = Property.getValueOrDefault(modelGraphics._heightReference, time, defaultHeightReference); model.distanceDisplayCondition = Property.getValueOrUndefined(modelGraphics._distanceDisplayCondition, time); - model.silhouetteColor = Property.getValueOrClonedDefault(modelGraphics.silhouetteColor, time, defaultSilhouetteColor, model.silhouetteColor); + model.silhouetteColor = Property.getValueOrDefault(modelGraphics.silhouetteColor, time, defaultSilhouetteColor, model._silhouetteColor); model.silhouetteSize = Property.getValueOrDefault(modelGraphics.silhouetteSize, time, defaultSilhouetteSize); - model.color = Property.getValueOrClonedDefault(modelGraphics._color, time, defaultColor, model.color); + model.color = Property.getValueOrDefault(modelGraphics._color, time, defaultColor, model._color); model.colorBlendMode = Property.getValueOrDefault(modelGraphics._colorBlendMode, time, defaultColorBlendMode); model.colorBlendAmount = Property.getValueOrDefault(modelGraphics._colorBlendAmount, time, defaultColorBlendAmount); diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index a19e9f767d3f..fd2daaaf9c56 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -416,8 +416,9 @@ define([ * * @default Color.RED */ - this.silhouetteColor = Color.clone(defaultValue(options.silhouetteColor, Color.RED)); + this.silhouetteColor = defaultValue(options.silhouetteColor, Color.RED); this._silhouetteColor = new Color(); + this._silhouetteColorPrevAlpha = 1.0; this._normalAttributeName = undefined; /** @@ -554,8 +555,9 @@ define([ * * @default Color.WHITE */ - this.color = Color.clone(defaultValue(options.color, Color.WHITE)); + this.color = defaultValue(options.color, Color.WHITE); this._color = new Color(); + this._colorPrevAlpha = 1.0; /** * Defines how the color blends with the model. @@ -3800,12 +3802,12 @@ define([ } var nodeCommands = model._nodeCommands; - var dirty = alphaDirty(model.color.alpha, model._color.alpha) || - alphaDirty(model.silhouetteColor.alpha, model._silhouetteColor.alpha) || + var dirty = alphaDirty(model.color.alpha, model._colorPrevAlpha) || + alphaDirty(model.silhouetteColor.alpha, model._silhouetteColorPrevAlpha) || !defined(nodeCommands[0].silhouetteModelCommand); - Color.clone(model.color, model._color); - Color.clone(model.silhouetteColor, model._silhouetteColor); + model._colorPrevAlpha = model.color.alpha; + model._silhouetteColorPrevAlpha = model.silhouetteColor.alpha; if (dirty) { createSilhouetteCommands(model, frameState); From 252bb8b73691a0d8e82928ba4cd7dc8aeb733cab Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Thu, 5 Jan 2017 17:43:44 -0500 Subject: [PATCH 334/396] Add model tests with crunch compressed textures. --- .../CesiumTexturedBoxTest.glb | Bin 0 -> 10465 bytes .../Models/Box-Textured-CRN-Binary/Readme.txt | 1 + .../CesiumTexturedBoxTest.gltf | 275 ++++++++++++++ .../Box-Textured-CRN-Embedded/Readme.txt | 1 + .../CesiumTexturedBoxTest.bin | Bin 0 -> 840 bytes .../CesiumTexturedBoxTest.dae | 126 +++++++ .../CesiumTexturedBoxTest.gltf | 339 ++++++++++++++++++ .../CesiumTexturedBoxTest0FS.glsl | 18 + .../CesiumTexturedBoxTest0VS.glsl | 15 + .../Box-Textured-CRN/Cesium_Logo_Flat.crn | Bin 0 -> 5101 bytes .../Box-Textured-CRN/Cesium_Logo_Flat.png | Bin 0 -> 34222 bytes Specs/Scene/ModelSpec.js | 33 ++ 12 files changed, 808 insertions(+) create mode 100644 Specs/Data/Models/Box-Textured-CRN-Binary/CesiumTexturedBoxTest.glb create mode 100644 Specs/Data/Models/Box-Textured-CRN-Binary/Readme.txt create mode 100644 Specs/Data/Models/Box-Textured-CRN-Embedded/CesiumTexturedBoxTest.gltf create mode 100644 Specs/Data/Models/Box-Textured-CRN-Embedded/Readme.txt create mode 100644 Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.bin create mode 100644 Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.dae create mode 100644 Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.gltf create mode 100644 Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest0FS.glsl create mode 100644 Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest0VS.glsl create mode 100644 Specs/Data/Models/Box-Textured-CRN/Cesium_Logo_Flat.crn create mode 100644 Specs/Data/Models/Box-Textured-CRN/Cesium_Logo_Flat.png diff --git a/Specs/Data/Models/Box-Textured-CRN-Binary/CesiumTexturedBoxTest.glb b/Specs/Data/Models/Box-Textured-CRN-Binary/CesiumTexturedBoxTest.glb new file mode 100644 index 0000000000000000000000000000000000000000..1930d0d634ecaf095c743843fb17fb1069551ebe GIT binary patch literal 10465 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 literal 0 HcmV?d00001 diff --git a/Specs/Data/Models/Box-Textured-CRN-Binary/Readme.txt b/Specs/Data/Models/Box-Textured-CRN-Binary/Readme.txt new file mode 100644 index 000000000000..b0958ffb1be8 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-CRN-Binary/Readme.txt @@ -0,0 +1 @@ +This is the same as Box-Textured-CRN, except it is "Binary glTF" using the KHR_binary_glTF (CesiumTexturedBoxTest.glb) extensions. diff --git a/Specs/Data/Models/Box-Textured-CRN-Embedded/CesiumTexturedBoxTest.gltf b/Specs/Data/Models/Box-Textured-CRN-Embedded/CesiumTexturedBoxTest.gltf new file mode 100644 index 000000000000..2db727d6f041 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-CRN-Embedded/CesiumTexturedBoxTest.gltf @@ -0,0 +1,275 @@ +{ + "accessors": { + "accessor_21": { + "bufferView": "bufferView_1", + "byteOffset": 0, + "byteStride": 0, + "componentType": 5123, + "count": 36, + "type": "SCALAR", + "min": [ + 0 + ], + "max": [ + 23 + ] + }, + "accessor_23": { + "bufferView": "bufferView_0", + "byteOffset": 0, + "byteStride": 0, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + }, + "accessor_25": { + "bufferView": "bufferView_0", + "byteOffset": 288, + "byteStride": 0, + "componentType": 5126, + "count": 24, + "max": [ + 1, + 1, + 1 + ], + "min": [ + -1, + -1, + -1 + ], + "type": "VEC3" + }, + "accessor_27": { + "bufferView": "bufferView_0", + "byteOffset": 576, + "byteStride": 0, + "componentType": 5126, + "count": 24, + "max": [ + 6, + 1 + ], + "min": [ + 0, + 0 + ], + "type": "VEC2" + } + }, + "animations": {}, + "asset": { + "generator": "collada2gltf@", + "premultipliedAlpha": true, + "profile": { + "api": "WebGL", + "version": "1.0.2" + }, + "version": "1.0" + }, + "bufferViews": { + "bufferView_0": { + "buffer": "CesiumTexturedBoxTest", + "byteLength": 768, + "byteOffset": 0, + "target": 34962 + }, + "bufferView_1": { + "buffer": "CesiumTexturedBoxTest", + "byteLength": 72, + "byteOffset": 768, + "target": 34963 + } + }, + "buffers": { + "CesiumTexturedBoxTest": { + "type": "arraybuffer", + "byteLength": 840, + "uri": "data:application/octet-stream;base64,AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAvwAAAD8AAAC/AAAAPwAAAD8AAAC/AAAAPwAAAD8AAAC/AAAAPwAAAD8AAAA/AAAAPwAAAL8AAAC/AAAAPwAAAL8AAAA/AAAAvwAAAD8AAAC/AAAAPwAAAD8AAAC/AAAAvwAAAL8AAAC/AAAAPwAAAL8AAAC/AAAAPwAAAD8AAAA/AAAAvwAAAD8AAAA/AAAAPwAAAL8AAAA/AAAAvwAAAL8AAAA/AAAAvwAAAD8AAAA/AAAAvwAAAD8AAAC/AAAAvwAAAL8AAAA/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAA/AAAAvwAAAL8AAAC/AAAAPwAAAL8AAAA/AAAAPwAAAL8AAAC/AAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAADAQAAAAAAAAKBAAAAAAAAAwED+/38/AACgQP7/fz8AAIBAAAAAAAAAoEAAAAAAAACAQAAAgD8AAKBAAACAPwAAAEAAAAAAAACAPwAAAAAAAABAAACAPwAAgD8AAIA/AABAQAAAAAAAAIBAAAAAAAAAQEAAAIA/AACAQAAAgD8AAEBAAAAAAAAAAEAAAAAAAABAQAAAgD8AAABAAACAPwAAAAAAAAAAAAAAAP7/fz8AAIA/AAAAAAAAgD/+/38/AAABAAIAAwACAAEABAAFAAYABwAGAAUACAAJAAoACwAKAAkADAANAA4ADwAOAA0AEAARABIAEwASABEAFAAVABYAFwAWABUA" + } + }, + "images": { + "Image0001": { + "name": "Image0001", + "uri": "data:image/crn;base64,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" + } + }, + "materials": { + "Effect-Texture": { + "name": "Texture", + "technique": "technique0", + "values": { + "diffuse": "texture_Image0001", + "shininess": 256, + "specular": [ + 0.20000000298023224, + 0.20000000298023224, + 0.20000000298023224, + 1 + ] + } + } + }, + "meshes": { + "Geometry-mesh002": { + "name": "Mesh", + "primitives": [ + { + "attributes": { + "NORMAL": "accessor_25", + "POSITION": "accessor_23", + "TEXCOORD_0": "accessor_27" + }, + "indices": "accessor_21", + "material": "Effect-Texture", + "mode": 4 + } + ] + } + }, + "nodes": { + "rootNode": { + "children": [], + "meshes": [ + "Geometry-mesh002" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ] + } + }, + "programs": { + "program_0": { + "attributes": [ + "a_normal", + "a_position", + "a_texcoord0" + ], + "fragmentShader": "CesiumTexturedBoxTest0FS", + "vertexShader": "CesiumTexturedBoxTest0VS" + } + }, + "samplers": { + "sampler_0": { + "magFilter": 9729, + "minFilter": 9729, + "wrapS": 10497, + "wrapT": 10497 + } + }, + "scene": "defaultScene", + "scenes": { + "defaultScene": { + "nodes": [ + "rootNode" + ] + } + }, + "shaders": { + "CesiumTexturedBoxTest0FS": { + "type": 35632, + "uri": "data:text/plain;base64,cHJlY2lzaW9uIGhpZ2hwIGZsb2F0Ow0KdmFyeWluZyB2ZWMzIHZfbm9ybWFsOw0KdmFyeWluZyB2ZWMyIHZfdGV4Y29vcmQwOw0KdW5pZm9ybSBzYW1wbGVyMkQgdV9kaWZmdXNlOw0KdW5pZm9ybSB2ZWM0IHVfc3BlY3VsYXI7DQp1bmlmb3JtIGZsb2F0IHVfc2hpbmluZXNzOw0Kdm9pZCBtYWluKHZvaWQpIHsNCnZlYzMgbm9ybWFsID0gbm9ybWFsaXplKHZfbm9ybWFsKTsNCnZlYzQgY29sb3IgPSB2ZWM0KDAuLCAwLiwgMC4sIDAuKTsNCnZlYzQgZGlmZnVzZSA9IHZlYzQoMC4sIDAuLCAwLiwgMS4pOw0KdmVjNCBzcGVjdWxhcjsNCmRpZmZ1c2UgPSB0ZXh0dXJlMkQodV9kaWZmdXNlLCB2X3RleGNvb3JkMCk7DQpzcGVjdWxhciA9IHVfc3BlY3VsYXI7DQpkaWZmdXNlLnh5eiAqPSBtYXgoZG90KG5vcm1hbCx2ZWMzKDAuLDAuLDEuKSksIDAuKTsNCmNvbG9yLnh5eiArPSBkaWZmdXNlLnh5ejsNCmNvbG9yID0gdmVjNChjb2xvci5yZ2IgKiBkaWZmdXNlLmEsIGRpZmZ1c2UuYSk7DQpnbF9GcmFnQ29sb3IgPSBjb2xvcjsNCn0NCg==" + }, + "CesiumTexturedBoxTest0VS": { + "type": 35633, + "uri": "data:text/plain;base64,cHJlY2lzaW9uIGhpZ2hwIGZsb2F0Ow0KYXR0cmlidXRlIHZlYzMgYV9wb3NpdGlvbjsNCmF0dHJpYnV0ZSB2ZWMzIGFfbm9ybWFsOw0KdmFyeWluZyB2ZWMzIHZfbm9ybWFsOw0KdW5pZm9ybSBtYXQzIHVfbm9ybWFsTWF0cml4Ow0KdW5pZm9ybSBtYXQ0IHVfbW9kZWxWaWV3TWF0cml4Ow0KdW5pZm9ybSBtYXQ0IHVfcHJvamVjdGlvbk1hdHJpeDsNCmF0dHJpYnV0ZSB2ZWMyIGFfdGV4Y29vcmQwOw0KdmFyeWluZyB2ZWMyIHZfdGV4Y29vcmQwOw0Kdm9pZCBtYWluKHZvaWQpIHsNCnZlYzQgcG9zID0gdV9tb2RlbFZpZXdNYXRyaXggKiB2ZWM0KGFfcG9zaXRpb24sMS4wKTsNCnZfbm9ybWFsID0gdV9ub3JtYWxNYXRyaXggKiBhX25vcm1hbDsNCnZfdGV4Y29vcmQwID0gYV90ZXhjb29yZDA7DQpnbF9Qb3NpdGlvbiA9IHVfcHJvamVjdGlvbk1hdHJpeCAqIHBvczsNCn0NCg==" + } + }, + "skins": {}, + "techniques": { + "technique0": { + "attributes": { + "a_normal": "normal", + "a_position": "position", + "a_texcoord0": "texcoord0" + }, + "parameters": { + "diffuse": { + "type": 35678 + }, + "modelViewMatrix": { + "semantic": "MODELVIEW", + "type": 35676 + }, + "normal": { + "semantic": "NORMAL", + "type": 35665 + }, + "normalMatrix": { + "semantic": "MODELVIEWINVERSETRANSPOSE", + "type": 35675 + }, + "position": { + "semantic": "POSITION", + "type": 35665 + }, + "projectionMatrix": { + "semantic": "PROJECTION", + "type": 35676 + }, + "shininess": { + "type": 5126 + }, + "specular": { + "type": 35666 + }, + "texcoord0": { + "semantic": "TEXCOORD_0", + "type": 35664 + } + }, + "program": "program_0", + "states": { + "enable": [ + 2929, + 2884 + ] + }, + "uniforms": { + "u_diffuse": "diffuse", + "u_modelViewMatrix": "modelViewMatrix", + "u_normalMatrix": "normalMatrix", + "u_projectionMatrix": "projectionMatrix", + "u_shininess": "shininess", + "u_specular": "specular" + } + } + }, + "textures": { + "texture_Image0001": { + "format": 6408, + "internalFormat": 6408, + "sampler": "sampler_0", + "source": "Image0001", + "target": 3553, + "type": 5121 + } + }, + "extensionsUsed": [], + "cameras": {} +} diff --git a/Specs/Data/Models/Box-Textured-CRN-Embedded/Readme.txt b/Specs/Data/Models/Box-Textured-CRN-Embedded/Readme.txt new file mode 100644 index 000000000000..1dd27843c641 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-CRN-Embedded/Readme.txt @@ -0,0 +1 @@ +This is the same as Box-Textured-CRN, except the crunch compressed texture is embedded in the glTF. diff --git a/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.bin b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.bin new file mode 100644 index 0000000000000000000000000000000000000000..79f5db410b75a82000ca02da98dd8e7dc1900e78 GIT binary patch literal 840 zcmb7A2@Zll5GyJwDk`4OfuG4!_=&tsox+rC2!c-1blT2rb{B{+!`u*Iff!4y3^CS7 zu))@lV22cY91JOr$Z*2hkl}(WZnzt+uzEUjV}d$l`QKRc%B9JIvXGfki^E=+q-I-vu_mWrU)E^{JT%P~{ literal 0 HcmV?d00001 diff --git a/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.dae b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.dae new file mode 100644 index 000000000000..b07a87d4aa98 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.dae @@ -0,0 +1,126 @@ + + + + + modo 801 [Build 77509], Microsoft Windows 7 Service Pack 1 (6.1.7601 Service Pack 1) + Plug-in: [Build 77509]; Use Absolute Path: No; Merge Reference Items: No; Save Hidden Items: No; Save Cameras: No; Save Lights: No; Save Locators: Yes; Save Triangles as Triangles: Yes; Order Vertex Maps Alphabetically: Yes; Bake Matrices: No; Save Vertex Normals: Yes; Save UV Texture Coordinates: Yes; Save Vertex Colors: No; Save Vertex Weights: No; Save Animation: Yes; Sample Animation: No; Sample Animation Start: 0; Sample Animation End: 120; Save modo Profile: No; Save Maya Profile: No; Save 3ds Max Profile: No; Formatted Arrays: No; + file:///C:/Users/Branden/Creative%20Cloud%20Files/03-2015%20Cesium%20Test%20Models/CesiumTexturedBoxTest.lxo + + 2015-03-04T16:58:00Z + 2015-03-04T16:58:00Z + Z_UP + + + + Cesium_Logo_Flat.png + + + + + + + + + + + + + Image0001 + A8R8G8B8 + + + + + Image0001-surface + LINEAR_MIPMAP_LINEAR + LINEAR + + + + + + + + + 0.2 0.2 0.2 1 + + + 256 + + + + + + + + + + + -0.5 -0.5 -0.5 -0.5 0.5 -0.5 0.5 0.5 -0.5 0.5 -0.5 -0.5 -0.5 -0.5 0.5 -0.5 0.5 0.5 0.5 -0.5 0.5 0.5 0.5 0.5 + + + + + + + + + + 0 0 1 1 0 0 0 1 0 0 -1 0 -1 0 0 0 0 -1 + + + + + + + + + + 6 1 5 1 6 1.09011e-007 5 1.09011e-007 4 1 5 1 4 1.02033e-008 5 1.02033e-008 2 1 1 1 2 1.02033e-008 1 1.02033e-008 3 1 3 1.02033e-008 0 1 0 1.09011e-007 1 1 1 1.09011e-007 + + + + + + + + + + + + + + +

    4 0 0 6 0 1 5 0 2 7 0 3 5 0 2 6 0 1 7 1 4 6 1 5 2 1 6 3 1 7 2 1 6 6 1 5 5 2 8 7 2 9 1 2 10 2 2 11 1 2 10 7 2 9 6 3 12 4 3 4 3 3 13 0 3 6 3 3 13 4 3 4 4 4 12 5 4 8 0 4 13 1 4 10 0 4 13 5 4 8 0 5 14 1 5 15 3 5 16 2 5 17 3 5 16 1 5 15

    + + + + + + + + + + + + + + + + + + + + 0 0 0 + 0 1 0 0 + 1 0 0 0 + 0 0 1 0 + 1 1 1 + + + + + + + + diff --git a/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.gltf b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.gltf new file mode 100644 index 000000000000..72efec30c86e --- /dev/null +++ b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.gltf @@ -0,0 +1,339 @@ +{ + "accessors": { + "accessor_21": { + "bufferView": "bufferView_29", + "byteOffset": 0, + "byteStride": 0, + "componentType": 5123, + "count": 36, + "type": "SCALAR" + }, + "accessor_23": { + "bufferView": "bufferView_30", + "byteOffset": 0, + "byteStride": 12, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + }, + "accessor_25": { + "bufferView": "bufferView_30", + "byteOffset": 288, + "byteStride": 12, + "componentType": 5126, + "count": 24, + "max": [ + 1, + 1, + 1 + ], + "min": [ + -1, + -1, + -1 + ], + "type": "VEC3" + }, + "accessor_27": { + "bufferView": "bufferView_30", + "byteOffset": 576, + "byteStride": 8, + "componentType": 5126, + "count": 24, + "max": [ + 6, + 1 + ], + "min": [ + 0, + 0 + ], + "type": "VEC2" + } + }, + "animations": {}, + "asset": { + "generator": "collada2gltf@", + "premultipliedAlpha": true, + "profile": { + "api": "WebGL", + "version": "1.0.2" + }, + "version": "1.0" + }, + "bufferViews": { + "bufferView_29": { + "buffer": "CesiumTexturedBoxTest", + "byteLength": 72, + "byteOffset": 0, + "target": 34963 + }, + "bufferView_30": { + "buffer": "CesiumTexturedBoxTest", + "byteLength": 768, + "byteOffset": 72, + "target": 34962 + } + }, + "buffers": { + "CesiumTexturedBoxTest": { + "byteLength": 840, + "type": "arraybuffer", + "uri": "CesiumTexturedBoxTest.bin" + } + }, + "images": { + "Image0001": { + "name": "Image0001", + "uri": "Cesium_Logo_Flat.crn" + } + }, + "materials": { + "Effect-Texture": { + "name": "Texture", + "technique": "technique0", + "values": { + "diffuse": "texture_Image0001", + "shininess": 256, + "specular": [ + 0.20000000298023224, + 0.20000000298023224, + 0.20000000298023224, + 1 + ] + } + } + }, + "meshes": { + "Geometry-mesh002": { + "name": "Mesh", + "primitives": [ + { + "attributes": { + "NORMAL": "accessor_25", + "POSITION": "accessor_23", + "TEXCOORD_0": "accessor_27" + }, + "indices": "accessor_21", + "material": "Effect-Texture", + "mode": 4 + } + ] + } + }, + "nodes": { + "Geometry-mesh002Node": { + "children": [], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "meshes": [ + "Geometry-mesh002" + ], + "name": "Mesh" + }, + "groupLocator030Node": { + "children": [ + "txtrLocator026Node" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Texture_Group" + }, + "node_3": { + "children": [ + "Geometry-mesh002Node", + "groupLocator030Node" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + -1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Y_UP_Transform" + }, + "txtrLocator026Node": { + "children": [], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Cesium_Logo_Flat__Image___Texture_" + } + }, + "programs": { + "program_0": { + "attributes": [ + "a_normal", + "a_position", + "a_texcoord0" + ], + "fragmentShader": "CesiumTexturedBoxTest0FS", + "vertexShader": "CesiumTexturedBoxTest0VS" + } + }, + "samplers": { + "sampler_0": { + "magFilter": 9729, + "minFilter": 9729, + "wrapS": 10497, + "wrapT": 10497 + } + }, + "scene": "defaultScene", + "scenes": { + "defaultScene": { + "nodes": [ + "node_3" + ] + } + }, + "shaders": { + "CesiumTexturedBoxTest0FS": { + "type": 35632, + "uri": "CesiumTexturedBoxTest0FS.glsl" + }, + "CesiumTexturedBoxTest0VS": { + "type": 35633, + "uri": "CesiumTexturedBoxTest0VS.glsl" + } + }, + "skins": {}, + "techniques": { + "technique0": { + "attributes": { + "a_normal": "normal", + "a_position": "position", + "a_texcoord0": "texcoord0" + }, + "parameters": { + "diffuse": { + "type": 35678 + }, + "modelViewMatrix": { + "semantic": "MODELVIEW", + "type": 35676 + }, + "normal": { + "semantic": "NORMAL", + "type": 35665 + }, + "normalMatrix": { + "semantic": "MODELVIEWINVERSETRANSPOSE", + "type": 35675 + }, + "position": { + "semantic": "POSITION", + "type": 35665 + }, + "projectionMatrix": { + "semantic": "PROJECTION", + "type": 35676 + }, + "shininess": { + "type": 5126 + }, + "specular": { + "type": 35666 + }, + "texcoord0": { + "semantic": "TEXCOORD_0", + "type": 35664 + } + }, + "program": "program_0", + "states": { + "enable": [ + 2929, + 2884 + ] + }, + "uniforms": { + "u_diffuse": "diffuse", + "u_modelViewMatrix": "modelViewMatrix", + "u_normalMatrix": "normalMatrix", + "u_projectionMatrix": "projectionMatrix", + "u_shininess": "shininess", + "u_specular": "specular" + } + } + }, + "textures": { + "texture_Image0001": { + "format": 6408, + "internalFormat": 6408, + "sampler": "sampler_0", + "source": "Image0001", + "target": 3553, + "type": 5121 + } + } +} diff --git a/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest0FS.glsl b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest0FS.glsl new file mode 100644 index 000000000000..782e1f41628c --- /dev/null +++ b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest0FS.glsl @@ -0,0 +1,18 @@ +precision highp float; +varying vec3 v_normal; +varying vec2 v_texcoord0; +uniform sampler2D u_diffuse; +uniform vec4 u_specular; +uniform float u_shininess; +void main(void) { +vec3 normal = normalize(v_normal); +vec4 color = vec4(0., 0., 0., 0.); +vec4 diffuse = vec4(0., 0., 0., 1.); +vec4 specular; +diffuse = texture2D(u_diffuse, v_texcoord0); +specular = u_specular; +diffuse.xyz *= max(dot(normal,vec3(0.,0.,1.)), 0.); +color.xyz += diffuse.xyz; +color = vec4(color.rgb * diffuse.a, diffuse.a); +gl_FragColor = color; +} diff --git a/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest0VS.glsl b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest0VS.glsl new file mode 100644 index 000000000000..cacc9ed997a3 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest0VS.glsl @@ -0,0 +1,15 @@ +precision highp float; +attribute vec3 a_position; +attribute vec3 a_normal; +varying vec3 v_normal; +uniform mat3 u_normalMatrix; +uniform mat4 u_modelViewMatrix; +uniform mat4 u_projectionMatrix; +attribute vec2 a_texcoord0; +varying vec2 v_texcoord0; +void main(void) { +vec4 pos = u_modelViewMatrix * vec4(a_position,1.0); +v_normal = u_normalMatrix * a_normal; +v_texcoord0 = a_texcoord0; +gl_Position = u_projectionMatrix * pos; +} diff --git a/Specs/Data/Models/Box-Textured-CRN/Cesium_Logo_Flat.crn b/Specs/Data/Models/Box-Textured-CRN/Cesium_Logo_Flat.crn new file mode 100644 index 0000000000000000000000000000000000000000..5a5b9111152cfb1baa77a62c14bb7f9592826f60 GIT binary patch literal 5101 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 AO8@`> literal 0 HcmV?d00001 diff --git a/Specs/Data/Models/Box-Textured-CRN/Cesium_Logo_Flat.png b/Specs/Data/Models/Box-Textured-CRN/Cesium_Logo_Flat.png new file mode 100644 index 0000000000000000000000000000000000000000..a3a8cc9d60d0b6d48114b31057ba0ad7ec471852 GIT binary patch literal 34222 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 YAIvPT{2mlMlK=n!07*qoM6N<$g3Fl*bN~PV literal 0 HcmV?d00001 diff --git a/Specs/Scene/ModelSpec.js b/Specs/Scene/ModelSpec.js index 209ee97f8b31..864fc6acea1a 100644 --- a/Specs/Scene/ModelSpec.js +++ b/Specs/Scene/ModelSpec.js @@ -77,6 +77,9 @@ defineSuite([ var texturedBoxKTXUrl = './Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.gltf'; var texturedBoxKTXBinaryUrl = './Data/Models/Box-Textured-KTX-Binary/CesiumTexturedBoxTest.glb'; var texturedBoxKTXEmbeddedUrl = './Data/Models/Box-Textured-KTX-Embedded/CesiumTexturedBoxTest.gltf'; + var texturedBoxCRNUrl = './Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.gltf'; + var texturedBoxCRNBinaryUrl = './Data/Models/Box-Textured-CRN-Binary/CesiumTexturedBoxTest.glb'; + var texturedBoxCRNEmbeddedUrl = './Data/Models/Box-Textured-CRN-Embedded/CesiumTexturedBoxTest.gltf'; var texturedBoxCustomUrl = './Data/Models/Box-Textured-Custom/CesiumTexturedBoxTest.gltf'; var texturedBoxKhrBinaryUrl = './Data/Models/Box-Textured-Binary/CesiumTexturedBoxTest.glb'; var boxRtcUrl = './Data/Models/Box-RTC/Box.gltf'; @@ -764,6 +767,36 @@ defineSuite([ }); }); + it('renders textured box with external CRN texture', function() { + if (!(scene.context.s3tc)) { + return; + } + return loadModel(texturedBoxCRNUrl).then(function(m) { + verifyRender(m); + primitives.remove(m); + }); + }); + + it('renders textured box with embedded binary CRN texture', function() { + if (!(scene.context.s3tc)) { + return; + } + return loadModel(texturedBoxCRNBinaryUrl).then(function(m) { + verifyRender(m); + primitives.remove(m); + }); + }); + + it('renders textured box with embedded base64 encoded CRN texture', function() { + if (!(scene.context.s3tc)) { + return; + } + return loadModel(texturedBoxCRNEmbeddedUrl).then(function(m) { + verifyRender(m); + primitives.remove(m); + }); + }); + /////////////////////////////////////////////////////////////////////////// it('loads cesiumAir', function() { From 749cb6838ff401f9b33e803de754e38608133373 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 5 Jan 2017 21:30:59 -0500 Subject: [PATCH 335/396] Revert readyPromise change --- Source/Scene/Cesium3DTileset.js | 14 +++----------- Specs/Scene/Cesium3DTilesetSpec.js | 2 +- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/Source/Scene/Cesium3DTileset.js b/Source/Scene/Cesium3DTileset.js index 92b4b99b0bce..b54d91ed563e 100644 --- a/Source/Scene/Cesium3DTileset.js +++ b/Source/Scene/Cesium3DTileset.js @@ -355,7 +355,6 @@ define([ */ this.tileVisible = new Event(); - this._ready = false; this._readyPromise = when.defer(); var that = this; @@ -365,6 +364,7 @@ define([ that._properties = tilesetJson.properties; that._geometricError = tilesetJson.geometricError; that._root = data.root; + that._readyPromise.resolve(that); }).otherwise(function(error) { that._readyPromise.reject(error); }); @@ -459,7 +459,7 @@ define([ */ ready : { get : function() { - return this._ready; + return defined(this._root); } }, @@ -1523,16 +1523,8 @@ define([ * @exception {DeveloperError} The tileset must be 3D Tiles version 0.0. See https://github.com/AnalyticalGraphicsInc/3d-tiles#spec-status */ Cesium3DTileset.prototype.update = function(frameState) { - if (!this._ready && defined(this._root)) { - this._ready = true; - var that = this; - frameState.afterRender.push(function() { - that._readyPromise.resolve(that); - }); - } - // TODO: Support 2D and CV - if (!this.show || !this._ready || (frameState.mode !== SceneMode.SCENE3D)) { + if (!this.show || !this.ready || (frameState.mode !== SceneMode.SCENE3D)) { return; } diff --git a/Specs/Scene/Cesium3DTilesetSpec.js b/Specs/Scene/Cesium3DTilesetSpec.js index 456dc0b44844..78c76a0b2b26 100644 --- a/Specs/Scene/Cesium3DTilesetSpec.js +++ b/Specs/Scene/Cesium3DTilesetSpec.js @@ -1006,7 +1006,7 @@ defineSuite([ }); it('all tiles loaded event is raised', function() { - // Called first when the only the root is visible and it becomes loaded, and then again when + // Called first when only the root is visible and it becomes loaded, and then again when // the rest of the tileset is visible and all tiles are loaded. var spyUpdate = jasmine.createSpy('listener'); viewRootOnly(); From 6d85a3a0211c1b432eec72902a96bd603f1cb3f6 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 5 Jan 2017 22:32:46 -0500 Subject: [PATCH 336/396] Naming and other fix --- Source/DataSources/ModelVisualizer.js | 4 ++-- Source/Scene/Model.js | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/DataSources/ModelVisualizer.js b/Source/DataSources/ModelVisualizer.js index d2b7b0f7fbd9..a066931b4456 100644 --- a/Source/DataSources/ModelVisualizer.js +++ b/Source/DataSources/ModelVisualizer.js @@ -148,8 +148,8 @@ define([ model.shadows = Property.getValueOrDefault(modelGraphics._shadows, time, defaultShadows); model.heightReference = Property.getValueOrDefault(modelGraphics._heightReference, time, defaultHeightReference); model.distanceDisplayCondition = Property.getValueOrUndefined(modelGraphics._distanceDisplayCondition, time); - model.silhouetteColor = Property.getValueOrDefault(modelGraphics.silhouetteColor, time, defaultSilhouetteColor, model._silhouetteColor); - model.silhouetteSize = Property.getValueOrDefault(modelGraphics.silhouetteSize, time, defaultSilhouetteSize); + model.silhouetteColor = Property.getValueOrDefault(modelGraphics._silhouetteColor, time, defaultSilhouetteColor, model._silhouetteColor); + model.silhouetteSize = Property.getValueOrDefault(modelGraphics._silhouetteSize, time, defaultSilhouetteSize); model.color = Property.getValueOrDefault(modelGraphics._color, time, defaultColor, model._color); model.colorBlendMode = Property.getValueOrDefault(modelGraphics._colorBlendMode, time, defaultColorBlendMode); model.colorBlendAmount = Property.getValueOrDefault(modelGraphics._colorBlendAmount, time, defaultColorBlendAmount); diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index fd2daaaf9c56..3d6cc75f72eb 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -418,7 +418,7 @@ define([ */ this.silhouetteColor = defaultValue(options.silhouetteColor, Color.RED); this._silhouetteColor = new Color(); - this._silhouetteColorPrevAlpha = 1.0; + this._silhouetteColorPreviousAlpha = 1.0; this._normalAttributeName = undefined; /** @@ -557,7 +557,7 @@ define([ */ this.color = defaultValue(options.color, Color.WHITE); this._color = new Color(); - this._colorPrevAlpha = 1.0; + this._colorPreviousAlpha = 1.0; /** * Defines how the color blends with the model. @@ -3802,12 +3802,12 @@ define([ } var nodeCommands = model._nodeCommands; - var dirty = alphaDirty(model.color.alpha, model._colorPrevAlpha) || - alphaDirty(model.silhouetteColor.alpha, model._silhouetteColorPrevAlpha) || + var dirty = alphaDirty(model.color.alpha, model._colorPreviousAlpha) || + alphaDirty(model.silhouetteColor.alpha, model._silhouetteColorPreviousAlpha) || !defined(nodeCommands[0].silhouetteModelCommand); - model._colorPrevAlpha = model.color.alpha; - model._silhouetteColorPrevAlpha = model.silhouetteColor.alpha; + model._colorPreviousAlpha = model.color.alpha; + model._silhouetteColorPreviousAlpha = model.silhouetteColor.alpha; if (dirty) { createSilhouetteCommands(model, frameState); From 8e4ed81f48203e96080ec47c00cd00067b15ec7b Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 5 Jan 2017 22:43:45 -0500 Subject: [PATCH 337/396] Updated CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 8fd410376eef..cde676513b6e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ Change Log ### 1.30 - 2017-02-01 * Updated the morph so the default view in Columbus View is now angled. [#3878](https://github.com/AnalyticalGraphicsInc/cesium/issues/3878) +* Fixed a bug that caused all models to use the same highlight color. [#4798] (https://github.com/AnalyticalGraphicsInc/cesium/pull/4798) ### 1.29 - 2017-01-02 From dba77105b785d17da5dced5fe5c88493afcc7ebf Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 5 Jan 2017 22:48:39 -0500 Subject: [PATCH 338/396] Re-added to CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index d02ce5d9499a..11c266dbfa1d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -12,6 +12,7 @@ Change Log * Updated the morph so the default view in Columbus View is now angled. [#3878](https://github.com/AnalyticalGraphicsInc/cesium/issues/3878) * Fixed sky atmosphere from causing incorrect picking and hanging drill picking. [#4783](https://github.com/AnalyticalGraphicsInc/cesium/issues/4783) and [#4784](https://github.com/AnalyticalGraphicsInc/cesium/issues/4784) * Fixed a bug that could cause a "readyImagery is not actually ready" exception when quickly zooming past the maximum available imagery level of an imagery layer near the poles. +* Fixed a bug that caused all models to use the same highlight color. [#4798] (https://github.com/AnalyticalGraphicsInc/cesium/pull/4798) ### 1.29 - 2017-01-02 * Improved 3D Models From cabed45b123827cfb799fb7f6d563158be0e37dd Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 5 Jan 2017 23:11:59 -0500 Subject: [PATCH 339/396] Fix last problem and make tests more accurate --- Source/Scene/Cesium3DTileset.js | 11 ++++++++--- Specs/Scene/Cesium3DTilesetSpec.js | 17 ++++++++--------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Source/Scene/Cesium3DTileset.js b/Source/Scene/Cesium3DTileset.js index 459b447abafd..37a0a6642390 100644 --- a/Source/Scene/Cesium3DTileset.js +++ b/Source/Scene/Cesium3DTileset.js @@ -296,6 +296,8 @@ define([ lastPick : new Cesium3DTilesetStatistics() }; + this._tilesLoaded = false; + /** * This property is for debugging only; it is not optimized for production use. *

    @@ -604,8 +606,7 @@ define([ */ tilesLoaded : { get : function() { - var stats = this._statistics; - return this.ready && (stats.numberOfPendingRequests === 0) && (stats.numberProcessing === 0) && (stats.numberOfAttemptedRequests === 0); + return this._tilesLoaded; } }, @@ -1678,7 +1679,9 @@ define([ }); } - if (progressChanged && tileset.tilesLoaded) { + tileset._tilesLoaded = (stats.numberOfPendingRequests === 0) && (stats.numberProcessing === 0) && (stats.numberOfAttemptedRequests === 0); + + if (progressChanged && tileset._tilesLoaded) { frameState.afterRender.push(function() { tileset.allTilesLoaded.raiseEvent(); }); @@ -1757,6 +1760,8 @@ define([ unloadTiles(this, frameState); } + + // Events are raised (added to the afterRender queue) here since promises // may resolve outside of the update loop that then raise events, e.g., // model's readyPromise. diff --git a/Specs/Scene/Cesium3DTilesetSpec.js b/Specs/Scene/Cesium3DTilesetSpec.js index 95e01eee1a8e..d4dac7f52124 100644 --- a/Specs/Scene/Cesium3DTilesetSpec.js +++ b/Specs/Scene/Cesium3DTilesetSpec.js @@ -1056,7 +1056,7 @@ defineSuite([ url : tilesetUrl })); expect(tileset.tilesLoaded).toBe(false); - return Cesium3DTilesTester.waitForReady(scene, tileset).then(function() { + tileset.readyPromise.then(function() { expect(tileset.tilesLoaded).toBe(false); return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { expect(tileset.tilesLoaded).toBe(true); @@ -1069,15 +1069,14 @@ defineSuite([ // the rest of the tileset is visible and all tiles are loaded. var spyUpdate = jasmine.createSpy('listener'); viewRootOnly(); - return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { - tileset.allTilesLoaded.addEventListener(spyUpdate); + var tileset = scene.primitives.add(new Cesium3DTileset({ + url : tilesetUrl + })); + tileset.allTilesLoaded.addEventListener(spyUpdate); + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { + viewAllTiles(); return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { - scene.renderForSpecs(); - viewAllTiles(); - return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { - scene.renderForSpecs(); - expect(spyUpdate.calls.count()).toEqual(2); - }); + expect(spyUpdate.calls.count()).toEqual(2); }); }); }); From d15728de5890b02106a8372212efc318bb774364 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Thu, 5 Jan 2017 23:13:58 -0500 Subject: [PATCH 340/396] Whitespace --- Source/Scene/Cesium3DTileset.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/Source/Scene/Cesium3DTileset.js b/Source/Scene/Cesium3DTileset.js index 37a0a6642390..bd72f3668eca 100644 --- a/Source/Scene/Cesium3DTileset.js +++ b/Source/Scene/Cesium3DTileset.js @@ -1760,8 +1760,6 @@ define([ unloadTiles(this, frameState); } - - // Events are raised (added to the afterRender queue) here since promises // may resolve outside of the update loop that then raise events, e.g., // model's readyPromise. From d76dadef0b84a97d785af2c78bae93ee9beb1cb7 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Fri, 6 Jan 2017 10:43:08 -0500 Subject: [PATCH 341/396] Support vec2, vec3, and vec4 as distinct types --- .../gallery/3D Tiles Point Cloud Styling.html | 9 +- Source/Scene/Expression.js | 292 ++++++++++++----- Source/Scene/PointCloud3DTileContent.js | 27 +- Specs/Scene/ExpressionSpec.js | 309 ++++++++++++++---- 4 files changed, 470 insertions(+), 167 deletions(-) diff --git a/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html b/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html index 777721bc269f..733b9d6edc37 100644 --- a/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html +++ b/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html @@ -134,7 +134,6 @@ pointSize : "5" }); -// secondaryColor is originally a vec3 - so add vec4(0.0, 0.0, 0.0, 1.0) to make the point cloud opaque addStyle('Clamp and Mix', { color : "color() * clamp(${temperature}, 0.1, 0.2)", pointSize : "mix(${temperature}, 2.0, 0.5) * 0.2" @@ -143,9 +142,9 @@ addStyle('Secondary Color', { color : { conditions : [ - ["${id} < 250", "${secondaryColor} + vec4(0.0, 0.0, 0.0, 1.0)"], - ["${id} < 500", "${secondaryColor} * ${secondaryColor} + vec4(0.0, 0.0, 0.0, 1.0)"], - ["${id} < 750", "${secondaryColor} / 5.0 + vec4(0.0, 0.0, 0.0, 1.0)"], + ["${id} < 250", "vec4(${secondaryColor}, 1.0)"], + ["${id} < 500", "vec4(${secondaryColor} * ${secondaryColor}, 1.0)"], + ["${id} < 750", "vec4(${secondaryColor} / 5.0, 1.0)"], ["${id} < 1000", "rgb(0, 0, Number(${secondaryColor}.x < 0.5) * 255)"] ] } @@ -161,7 +160,7 @@ // POSITION contains 0 as its last component, so add 1.0 to make the point cloud opaque addStyle('Color based on position', { - color : "${POSITION} + vec4(0.0, 0.0, 0.0, 1.0)" + color : "vec4(${POSITION}, 1.0)" }); addStyle('Style point size', { diff --git a/Source/Scene/Expression.js b/Source/Scene/Expression.js index 47b024b292f0..17ae36798635 100644 --- a/Source/Scene/Expression.js +++ b/Source/Scene/Expression.js @@ -1,5 +1,7 @@ /*global define*/ define([ + '../Core/Cartesian2', + '../Core/Cartesian3', '../Core/Cartesian4', '../Core/Color', '../Core/defined', @@ -10,6 +12,8 @@ define([ '../ThirdParty/jsep', './ExpressionNodeType' ], function( + Cartesian2, + Cartesian3, Cartesian4, Color, defined, @@ -33,28 +37,53 @@ define([ var ScratchStorage = { scratchColorIndex : 0, - scratchColors : [new Color()], - scratchCartesianIndex : 0, - scratchCartesians : [new Cartesian4()], + scratchColorArray : [new Color()], + scratchArrayIndex : 0, + scratchArrayArray : [[]], + scratchCartesian2Index : 0, + scratchCartesian3Index : 0, + scratchCartesian4Index : 0, + scratchCartesian2Array : [new Cartesian2()], + scratchCartesian3Array : [new Cartesian3()], + scratchCartesian4Array : [new Cartesian4()], reset : function() { this.scratchColorIndex = 0; - this.scratchCartesianIndex = 0; + this.scratchArrayIndex = 0; + this.scratchCartesian2Index = 0; + this.scratchCartesian3Index = 0; + this.scratchCartesian4Index = 0; }, getColor : function() { - if (this.scratchColorIndex >= this.scratchColors.length) { - this.scratchColors.push(new Color()); + if (this.scratchColorIndex >= this.scratchColorArray.length) { + this.scratchColorArray.push(new Color()); } - var scratchColor = this.scratchColors[this.scratchColorIndex]; - ++this.scratchColorIndex; - return scratchColor; + return this.scratchColorArray[this.scratchColorIndex++]; }, - getCartesian : function() { - if (this.scratchCartesianIndex >= this.scratchCartesians.length) { - this.scratchCartesians.push(new Cartesian4()); + getArray : function() { + if (this.scratchArrayIndex >= this.scratchArrayArray.length) { + this.scratchArrayArray.push([]); } - var scratchCartesian = this.scratchCartesians[this.scratchCartesianIndex]; - ++this.scratchCartesianIndex; - return scratchCartesian; + var scratchArray = this.scratchArrayArray[this.scratchArrayIndex++]; + scratchArray.length = 0; + return scratchArray; + }, + getCartesian2 : function() { + if (this.scratchCartesian2Index >= this.scratchCartesian2Array.length) { + this.scratchCartesian2Array.push(new Cartesian2()); + } + return this.scratchCartesian2Array[this.scratchCartesian2Index++]; + }, + getCartesian3 : function() { + if (this.scratchCartesian3Index >= this.scratchCartesian3Array.length) { + this.scratchCartesian3Array.push(new Cartesian3()); + } + return this.scratchCartesian3Array[this.scratchCartesian3Index++]; + }, + getCartesian4 : function() { + if (this.scratchCartesian4Index >= this.scratchCartesian4Array.length) { + this.scratchCartesian4Array.push(new Cartesian4()); + } + return this.scratchCartesian4Array[this.scratchCartesian4Index++]; } }; @@ -156,19 +185,18 @@ define([ * is of type Boolean, Number, or String, the corresponding JavaScript * primitive type will be returned. If the result is a RegExp, a Javascript RegExp * object will be returned. If the result is a Color, a {@link Color} object will be returned. - * If the result is a Cartesian4, a {@link Cartesian4} object will be returned. + * If the result is a Cartesian2, Cartesian3, or Cartesian4, + * a {@link Cartesian2}, {@link Cartesian3}, or {@link Cartesian4} object will be returned. * * @param {FrameState} frameState The frame state. * @param {Cesium3DTileFeature} feature The feature who's properties may be used as variables in the expression. - * @returns {Boolean|Number|String|Color|Cartesian4|RegExp} The result of evaluating the expression. + * @returns {Boolean|Number|String|Color|Cartesian2|Cartesian3|Cartesian4|RegExp} The result of evaluating the expression. */ Expression.prototype.evaluate = function(frameState, feature) { ScratchStorage.reset(); var result = this._runtimeAst.evaluate(frameState, feature); - if (result instanceof Color) { - return Color.clone(result); - } else if (result instanceof Cartesian4) { - return Cartesian4.clone(result); + if ((result instanceof Color) || (result instanceof Cartesian2) || (result instanceof Cartesian3) || (result instanceof Cartesian4)) { + return result.clone(); } return result; }; @@ -302,6 +330,7 @@ define([ function parseCall(expression, ast) { var args = ast.arguments; + var argsLength = args.length; var call; var val, left, right; @@ -316,7 +345,7 @@ define([ throw new DeveloperError('Error: ' + call + ' is not a function.'); } //>>includeEnd('debug'); - if (args.length === 0) { + if (argsLength === 0) { if (call === 'test') { return new Node(ExpressionNodeType.LITERAL_BOOLEAN, false); } else { @@ -339,7 +368,7 @@ define([ // Non-member function calls call = ast.callee.name; if (call === 'color') { - if (args.length === 0) { + if (argsLength === 0) { return new Node(ExpressionNodeType.LITERAL_COLOR, call); } val = createRuntimeAst(expression, args[0]); @@ -350,7 +379,7 @@ define([ return new Node(ExpressionNodeType.LITERAL_COLOR, call, [val]); } else if (call === 'rgb' || call === 'hsl') { //>>includeStart('debug', pragmas.debug); - if (args.length < 3) { + if (argsLength < 3) { throw new DeveloperError('Error: ' + call + ' requires three arguments.'); } //>>includeEnd('debug'); @@ -362,7 +391,7 @@ define([ return new Node(ExpressionNodeType.LITERAL_COLOR, call, val); } else if (call === 'rgba' || call === 'hsla') { //>>includeStart('debug', pragmas.debug); - if (args.length < 4) { + if (argsLength < 4) { throw new DeveloperError('Error: ' + call + ' requires four arguments.'); } //>>includeEnd('debug'); @@ -374,15 +403,14 @@ define([ ]; return new Node(ExpressionNodeType.LITERAL_COLOR, call, val); } else if (call === 'vec2' || call === 'vec3' || call === 'vec4') { - val = [ - defined(args[0]) ? createRuntimeAst(expression, args[0]) : new Node(ExpressionNodeType.LITERAL_NUMBER, 0), - defined(args[1]) ? createRuntimeAst(expression, args[1]) : new Node(ExpressionNodeType.LITERAL_NUMBER, 0), - defined(args[2]) ? createRuntimeAst(expression, args[2]) : new Node(ExpressionNodeType.LITERAL_NUMBER, 0), - defined(args[3]) ? createRuntimeAst(expression, args[3]) : new Node(ExpressionNodeType.LITERAL_NUMBER, 0) - ]; + // Check for invalid constructors at evaluation time + val = new Array(argsLength); + for (var i = 0; i < argsLength; ++i) { + val[i] = createRuntimeAst(expression, args[i]); + } return new Node(ExpressionNodeType.LITERAL_VECTOR, call, val); } else if (call === 'isNaN' || call === 'isFinite') { - if (args.length === 0) { + if (argsLength === 0) { if (call === 'isNaN') { return new Node(ExpressionNodeType.LITERAL_BOOLEAN, true); } else { @@ -393,7 +421,7 @@ define([ return new Node(ExpressionNodeType.UNARY, call, val); } else if (call === 'isExactClass' || call === 'isClass') { //>>includeStart('debug', pragmas.debug); - if (args.length < 1 || args.length > 1) { + if (argsLength < 1 || argsLength > 1) { throw new DeveloperError('Error: ' + call + ' requires exactly one argument.'); } //>>includeEnd('debug'); @@ -401,14 +429,14 @@ define([ return new Node(ExpressionNodeType.UNARY, call, val); } else if (call === 'getExactClassName') { //>>includeStart('debug', pragmas.debug); - if (args.length > 0) { + if (argsLength > 0) { throw new DeveloperError('Error: ' + call + ' does not take any argument.'); } //>>includeEnd('debug'); return new Node(ExpressionNodeType.UNARY, call); } else if (defined(unaryFunctions[call])) { //>>includeStart('debug', pragmas.debug); - if (args.length !== 1) { + if (argsLength !== 1) { throw new DeveloperError('Error: ' + call + ' requires exactly one argument.'); } //>>includeEnd('debug'); @@ -416,7 +444,7 @@ define([ return new Node(ExpressionNodeType.UNARY, call, val); } else if (defined(binaryFunctions[call])) { //>>includeStart('debug', pragmas.debug); - if (args.length !== 2) { + if (argsLength !== 2) { throw new DeveloperError('Error: ' + call + ' requires exactly two arguments.'); } //>>includeEnd('debug'); @@ -425,7 +453,7 @@ define([ return new Node(ExpressionNodeType.BINARY, call, left, right); } else if (defined(ternaryFunctions[call])) { //>>includeStart('debug', pragmas.debug); - if (args.length !== 3) { + if (argsLength !== 3) { throw new DeveloperError('Error: ' + call + ' requires exactly three arguments.'); } //>>includeEnd('debug'); @@ -434,19 +462,19 @@ define([ var test = createRuntimeAst(expression, args[2]); return new Node(ExpressionNodeType.TERNARY, call, left, right, test); } else if (call === 'Boolean') { - if (args.length === 0) { + if (argsLength === 0) { return new Node(ExpressionNodeType.LITERAL_BOOLEAN, false); } val = createRuntimeAst(expression, args[0]); return new Node(ExpressionNodeType.UNARY, call, val); } else if (call === 'Number') { - if (args.length === 0) { + if (argsLength === 0) { return new Node(ExpressionNodeType.LITERAL_NUMBER, 0); } val = createRuntimeAst(expression, args[0]); return new Node(ExpressionNodeType.UNARY, call, val); } else if (call === 'String') { - if (args.length === 0) { + if (argsLength === 0) { return new Node(ExpressionNodeType.LITERAL_STRING, ''); } val = createRuntimeAst(expression, args[0]); @@ -791,14 +819,62 @@ define([ }; Node.prototype._evaluateLiteralVector = function(frameState, feature) { - var result = ScratchStorage.getCartesian(); + // Gather the components that make up the vector, which includes components from interior vectors. + // For example vec3(1, 2, 3) or vec3(vec2(1, 2), 3) are both valid. + // + // If the number of components does not equal the vector's size, then a DeveloperError is thrown - with two exceptions: + // 1. A vector may be constructed from a larger vector and drop the extra components. + // 2. A vector may be constructed from a single component - vec3(1) will become vec3(1, 1, 1). + // + // Examples of invalid constructors include: + // vec4(1, 2) // not enough components + // vec3(vec2(1, 2)) // not enough components + // vec3(1, 2, 3, 4) // too many components + // vec2(vec4(1), 1) // too many components + + var components = ScratchStorage.getArray(); var args = this._left; - return Cartesian4.fromElements( - args[0].evaluate(frameState, feature), - args[1].evaluate(frameState, feature), - args[2].evaluate(frameState, feature), - args[3].evaluate(frameState, feature), - result); + var argsLength = args.length; + for (var i = 0; i < argsLength; ++i) { + var value = args[i].evaluate(frameState, feature); + if (typeof(value) === 'number') { + components.push(value); + } else if (value instanceof Cartesian2) { + components.push(value.x, value.y); + } else if (value instanceof Cartesian3) { + components.push(value.x, value.y, value.z); + } else if (value instanceof Cartesian4) { + components.push(value.x, value.y, value.z, value.w); + } + } + + var componentsLength = components.length; + var call = this._value; + var vectorLength = parseInt(call.charAt(3)); + + //>>includeStart('debug', pragmas.debug); + if (componentsLength === 0) { + throw new DeveloperError('Error: Invalid ' + call + ' constructor. No valid arguments.'); + } else if ((componentsLength < vectorLength) && (componentsLength > 1)) { + throw new DeveloperError('Error: Invalid ' + call + ' constructor. Not enough arguments.'); + } else if ((componentsLength > vectorLength) && (argsLength > 1)) { + throw new DeveloperError('Error: Invalid ' + call + ' constructor. Too many arguments.'); + } + //>>includeEnd('debug'); + + if (componentsLength === 1) { + // Add the same component 3 more times + var component = components[0]; + components.push(component, component, component); + } + + if (call === 'vec2') { + return Cartesian2.fromArray(components, 0, ScratchStorage.getCartesian2()); + } else if (call === 'vec3') { + return Cartesian3.fromArray(components, 0, ScratchStorage.getCartesian3()); + } else if (call === 'vec4') { + return Cartesian4.fromArray(components, 0, ScratchStorage.getCartesian4()); + } }; Node.prototype._evaluateLiteralString = function(frameState, feature) { @@ -878,8 +954,9 @@ define([ } else if (member === 3 || member === 'w') { return property.alpha; } - } else if (property instanceof Cartesian4) { + } else if ((property instanceof Cartesian2) || (property instanceof Cartesian3) || (property instanceof Cartesian4)) { // Vector components may be accessed with [0][1][2][3] and implicitly with ['x']['y']['z']['w'] + // For Cartesian2 and Cartesian3 out-of-range components will just return undefined if (member === 0) { return property.x; } else if (member === 1) { @@ -910,15 +987,19 @@ define([ Node.prototype._evaluateNegative = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); - if (left instanceof Cartesian4) { - return Cartesian4.negate(left, ScratchStorage.getCartesian()); + if (left instanceof Cartesian2) { + return Cartesian2.negate(left, ScratchStorage.getCartesian2()); + } else if (left instanceof Cartesian3) { + return Cartesian3.negate(left, ScratchStorage.getCartesian3()); + } else if (left instanceof Cartesian4) { + return Cartesian4.negate(left, ScratchStorage.getCartesian4()); } return -left; }; Node.prototype._evaluatePositive = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); - if ((left instanceof Color) || (left instanceof Cartesian4)) { + if ((left instanceof Color) || (left instanceof Cartesian2) || (left instanceof Cartesian3) || (left instanceof Cartesian4)) { return left; } return +left; @@ -997,8 +1078,12 @@ define([ var right = this._right.evaluate(frameState, feature); if ((right instanceof Color) && (left instanceof Color)) { return Color.add(left, right, ScratchStorage.getColor()); + } else if ((right instanceof Cartesian2) && (left instanceof Cartesian2)) { + return Cartesian2.add(left, right, ScratchStorage.getCartesian2()); + } else if ((right instanceof Cartesian3) && (left instanceof Cartesian3)) { + return Cartesian3.add(left, right, ScratchStorage.getCartesian3()); } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { - return Cartesian4.add(left, right, ScratchStorage.getCartesian()); + return Cartesian4.add(left, right, ScratchStorage.getCartesian4()); } return left + right; }; @@ -1008,8 +1093,12 @@ define([ var right = this._right.evaluate(frameState, feature); if ((right instanceof Color) && (left instanceof Color)) { return Color.subtract(left, right, ScratchStorage.getColor()); + } else if ((right instanceof Cartesian2) && (left instanceof Cartesian2)) { + return Cartesian2.subtract(left, right, ScratchStorage.getCartesian2()); + } else if ((right instanceof Cartesian3) && (left instanceof Cartesian3)) { + return Cartesian3.subtract(left, right, ScratchStorage.getCartesian3()); } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { - return Cartesian4.subtract(left, right, ScratchStorage.getCartesian()); + return Cartesian4.subtract(left, right, ScratchStorage.getCartesian4()); } return left - right; }; @@ -1023,12 +1112,24 @@ define([ return Color.multiplyByScalar(right, left, ScratchStorage.getColor()); } else if ((left instanceof Color) && (typeof(right) === 'number')) { return Color.multiplyByScalar(left, right, ScratchStorage.getColor()); + } else if ((right instanceof Cartesian2) && (left instanceof Cartesian2)) { + return Cartesian2.multiplyComponents(left, right, ScratchStorage.getCartesian2()); + } else if ((right instanceof Cartesian2) && (typeof(left) === 'number')) { + return Cartesian2.multiplyByScalar(right, left, ScratchStorage.getCartesian2()); + } else if ((left instanceof Cartesian2) && (typeof(right) === 'number')) { + return Cartesian2.multiplyByScalar(left, right, ScratchStorage.getCartesian2()); + } else if ((right instanceof Cartesian3) && (left instanceof Cartesian3)) { + return Cartesian3.multiplyComponents(left, right, ScratchStorage.getCartesian3()); + } else if ((right instanceof Cartesian3) && (typeof(left) === 'number')) { + return Cartesian3.multiplyByScalar(right, left, ScratchStorage.getCartesian3()); + } else if ((left instanceof Cartesian3) && (typeof(right) === 'number')) { + return Cartesian3.multiplyByScalar(left, right, ScratchStorage.getCartesian3()); } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { - return Cartesian4.multiplyComponents(left, right, ScratchStorage.getCartesian()); + return Cartesian4.multiplyComponents(left, right, ScratchStorage.getCartesian4()); } else if ((right instanceof Cartesian4) && (typeof(left) === 'number')) { - return Cartesian4.multiplyByScalar(right, left, ScratchStorage.getCartesian()); + return Cartesian4.multiplyByScalar(right, left, ScratchStorage.getCartesian4()); } else if ((left instanceof Cartesian4) && (typeof(right) === 'number')) { - return Cartesian4.multiplyByScalar(left, right, ScratchStorage.getCartesian()); + return Cartesian4.multiplyByScalar(left, right, ScratchStorage.getCartesian4()); } return left * right; }; @@ -1040,10 +1141,18 @@ define([ return Color.divide(left, right, ScratchStorage.getColor()); } else if ((left instanceof Color) && (typeof(right) === 'number')) { return Color.divideByScalar(left, right, ScratchStorage.getColor()); + } else if ((right instanceof Cartesian2) && (left instanceof Cartesian2)) { + return Cartesian2.divideComponents(left, right, ScratchStorage.getCartesian2()); + } else if ((left instanceof Cartesian2) && (typeof(right) === 'number')) { + return Cartesian2.divideByScalar(left, right, ScratchStorage.getCartesian2()); + } else if ((right instanceof Cartesian3) && (left instanceof Cartesian3)) { + return Cartesian3.divideComponents(left, right, ScratchStorage.getCartesian3()); + } else if ((left instanceof Cartesian3) && (typeof(right) === 'number')) { + return Cartesian3.divideByScalar(left, right, ScratchStorage.getCartesian3()); } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { - return Cartesian4.divideComponents(left, right, ScratchStorage.getCartesian()); + return Cartesian4.divideComponents(left, right, ScratchStorage.getCartesian4()); } else if ((left instanceof Cartesian4) && (typeof(right) === 'number')) { - return Cartesian4.divideByScalar(left, right, ScratchStorage.getCartesian()); + return Cartesian4.divideByScalar(left, right, ScratchStorage.getCartesian4()); } return left / right; }; @@ -1053,10 +1162,12 @@ define([ var right = this._right.evaluate(frameState, feature); if ((right instanceof Color) && (left instanceof Color)) { return Color.mod(left, right, ScratchStorage.getColor()); + } else if ((right instanceof Cartesian2) && (left instanceof Cartesian2)) { + return Cartesian2.fromElements(left.x % right.x, left.y % right.y, ScratchStorage.getCartesian2()); + } else if ((right instanceof Cartesian3) && (left instanceof Cartesian3)) { + return Cartesian3.fromElements(left.x % right.x, left.y % right.y, left.z % right.z, ScratchStorage.getCartesian3()); } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { - // TODO : make mod a built-in Cartesian function? - // TODO : modByScalar? - return Cartesian4.fromElements(left.x % right.x, left.y % right.y, left.z % right.z, left.w % right.w, ScratchStorage.getCartesian()); + return Cartesian4.fromElements(left.x % right.x, left.y % right.y, left.z % right.z, left.w % right.w, ScratchStorage.getCartesian4()); } return left % right; }; @@ -1064,10 +1175,11 @@ define([ Node.prototype._evaluateEqualsStrict = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); var right = this._right.evaluate(frameState, feature); - if ((right instanceof Color) && (left instanceof Color)) { - return Color.equals(left, right); - } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { - return Cartesian4.equals(left, right); + if ((right instanceof Color) && (left instanceof Color) || + (right instanceof Cartesian2) && (left instanceof Cartesian2) || + (right instanceof Cartesian3) && (left instanceof Cartesian3) || + (right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return left.equals(right); } return left === right; }; @@ -1075,10 +1187,11 @@ define([ Node.prototype._evaluateEquals = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); var right = this._right.evaluate(frameState, feature); - if ((right instanceof Color) && (left instanceof Color)) { - return Color.equals(left, right); - } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { - return Cartesian4.equals(left, right); + if ((right instanceof Color) && (left instanceof Color) || + (right instanceof Cartesian2) && (left instanceof Cartesian2) || + (right instanceof Cartesian3) && (left instanceof Cartesian3) || + (right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return left.equals(right); } // Specifically want to do an abstract equality comparison (==) instead of a strict equality comparison (===) @@ -1089,10 +1202,11 @@ define([ Node.prototype._evaluateNotEqualsStrict = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); var right = this._right.evaluate(frameState, feature); - if ((right instanceof Color) && (left instanceof Color)) { - return !Color.equals(left, right); - } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { - return !Cartesian4.equals(left, right); + if ((right instanceof Color) && (left instanceof Color) || + (right instanceof Cartesian2) && (left instanceof Cartesian2) || + (right instanceof Cartesian3) && (left instanceof Cartesian3) || + (right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return !left.equals(right); } return left !== right; }; @@ -1100,10 +1214,11 @@ define([ Node.prototype._evaluateNotEquals = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); var right = this._right.evaluate(frameState, feature); - if ((right instanceof Color) && (left instanceof Color)) { - return !Color.equals(left, right); - } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { - return !Cartesian4.equals(left, right); + if ((right instanceof Color) && (left instanceof Color) || + (right instanceof Cartesian2) && (left instanceof Cartesian2) || + (right instanceof Cartesian3) && (left instanceof Cartesian3) || + (right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return !left.equals(right); } // Specifically want to do an abstract inequality comparison (!=) instead of a strict inequality comparison (!==) // so that cases like "5 != '5'" return false. Tell jsHint to ignore this line. @@ -1206,7 +1321,7 @@ define([ Node.prototype._evaluateToString = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); - if ((left instanceof RegExp) || (left instanceof Color) || (left instanceof Cartesian4)) { + if ((left instanceof RegExp) || (left instanceof Color) || (left instanceof Cartesian2) || (left instanceof Cartesian3) || (left instanceof Cartesian4)) { return String(left); } //>>includeStart('debug', pragmas.debug); @@ -1275,11 +1390,11 @@ define([ return 'vec4(' + r + ', ' + g + ', ' + b + ', ' + a + ')'; } - function getExpressionArray(array, attributePrefix, shaderState) { + function getExpressionArray(array, attributePrefix, shaderState, parent) { var length = array.length; var expressions = new Array(length); for (var i = 0; i < length; ++i) { - var shader = array[i].getShaderExpression(attributePrefix, shaderState); + var shader = array[i].getShaderExpression(attributePrefix, shaderState, parent); if (!defined(shader)) { // If any of the expressions are not valid, the array is not valid return undefined; @@ -1301,7 +1416,7 @@ define([ if (defined(this._left)) { if (isArray(this._left)) { // Left can be an array if the type is LITERAL_COLOR or LITERAL_VECTOR - left = getExpressionArray(this._left, attributePrefix, shaderState); + left = getExpressionArray(this._left, attributePrefix, shaderState, this); } else { left = this._left.getShaderExpression(attributePrefix, shaderState, this); } @@ -1329,7 +1444,7 @@ define([ if (isArray(this._value)) { // For ARRAY type - value = getExpressionArray(this._value, attributePrefix, shaderState); + value = getExpressionArray(this._value, attributePrefix, shaderState, this); if (!defined(value)) { // If the values are not valid shader code, then the expression is not valid return undefined; @@ -1383,7 +1498,7 @@ define([ case ExpressionNodeType.CONDITIONAL: return '(' + test + ' ? ' + left + ' : ' + right + ')'; case ExpressionNodeType.MEMBER: - // This is intended for accessing the components of vec4 properties. String members aren't supported. + // This is intended for accessing the components of vector properties. String members aren't supported. // Check for 0.0 rather than 0 because all numbers are previously converted to decimals. // In this shader there is not much distinction between colors and vectors so allow .red to access the 0th component for both. if (right === 'red' || right === 'x' || right === '0.0') { @@ -1502,7 +1617,16 @@ define([ } break; case ExpressionNodeType.LITERAL_VECTOR: - return 'vec4(' + left[0] + ', ' + left[1] + ', ' + left[2] + ', ' + left[3] + ')'; + var length = left.length; + var vectorExpression = value + '('; + for (var i = 0; i < length; ++i) { + vectorExpression += left[i]; + if (i < (length - 1)) { + vectorExpression += ', '; + } + } + vectorExpression += ')'; + return vectorExpression; case ExpressionNodeType.LITERAL_REGEX: //>>includeStart('debug', pragmas.debug); throw new DeveloperError('Error generating style shader: Regular expressions are not supported.'); diff --git a/Source/Scene/PointCloud3DTileContent.js b/Source/Scene/PointCloud3DTileContent.js index bfb377eeb02f..e00cea225aec 100644 --- a/Source/Scene/PointCloud3DTileContent.js +++ b/Source/Scene/PointCloud3DTileContent.js @@ -800,8 +800,7 @@ define([ } // Edit the function header to accept the point position, color, and normal - // The styling language expects all vectors to be vec4 - return source.replace('()', '(vec4 position, vec4 color, vec4 normal)'); + return source.replace('()', '(vec3 position, vec4 color, vec3 normal)'); } function createShaders(content, frameState, style) { @@ -910,8 +909,6 @@ define([ } var attributeDeclarations = ''; - var attributeGlobals = ''; - var attributeDefaults = ''; var length = styleableProperties.length; for (i = 0; i < length; ++i) { @@ -928,19 +925,8 @@ define([ var attributeType; if (componentCount === 1) { attributeType = 'float'; - } else if (componentCount === 4) { - attributeType = 'vec4'; } else { - // The styling language expects all vectors to be vec4. GLSL can cast vertex attributes to vec4 but sets - // the w component to 1.0, while the styling language expects 0.0. Since vertex attributes are read-only, - // create global variables and set their w component to 0.0 in main(). - attributeType = 'vec4'; - if (componentCount < 4) { - var globalName = 'czm_tiles3d_style_' + name; - attributeName = 'czm_tiles3d_attribute_' + name; - attributeGlobals = 'vec4 ' + globalName + '; \n'; - attributeDefaults += ' ' + globalName + ' = vec4(' + attributeName + '.xyz, 0.0); \n'; - } + attributeType = 'vec' + componentCount; } attributeDeclarations += 'attribute ' + attributeType + ' ' + attributeName + '; \n'; @@ -955,7 +941,6 @@ define([ 'uniform float u_tilesetTime; \n'; vs += attributeDeclarations; - vs += attributeGlobals; if (usesColors) { if (isTranslucent) { @@ -1003,8 +988,6 @@ define([ vs += 'void main() \n' + '{ \n'; - vs += attributeDefaults; - if (usesColors) { if (isTranslucent) { vs += ' vec4 color = a_color; \n'; @@ -1041,15 +1024,15 @@ define([ } if (hasColorStyle) { - vs += ' color = getColorFromStyle(vec4(position, 0.0), color, vec4(normal, 0.0)); \n'; + vs += ' color = getColorFromStyle(position, color, normal); \n'; } if (hasShowStyle) { - vs += ' float show = float(getShowFromStyle(vec4(position, 0.0), color, vec4(normal, 0.0))); \n'; + vs += ' float show = float(getShowFromStyle(position, color, normal)); \n'; } if (hasPointSizeStyle) { - vs += ' gl_PointSize = getPointSizeFromStyle(vec4(position, 0.0), color, vec4(normal, 0.0)); \n'; + vs += ' gl_PointSize = getPointSizeFromStyle(position, color, normal); \n'; } else { vs += ' gl_PointSize = u_pointSize; \n'; } diff --git a/Specs/Scene/ExpressionSpec.js b/Specs/Scene/ExpressionSpec.js index a39a449f1341..078761b40a2e 100644 --- a/Specs/Scene/ExpressionSpec.js +++ b/Specs/Scene/ExpressionSpec.js @@ -1,12 +1,16 @@ /*global defineSuite*/ defineSuite([ 'Scene/Expression', + 'Core/Cartesian2', + 'Core/Cartesian3', 'Core/Cartesian4', 'Core/Color', 'Core/Math', 'Scene/ExpressionNodeType' ], function( Expression, + Cartesian2, + Cartesian3, Cartesian4, Color, CesiumMath, @@ -557,24 +561,138 @@ defineSuite([ expect(expression.evaluate(frameState, undefined)).toEqual(0.5); }); - it('evaluates vector', function() { + it('evaluates vec2', function() { + var expression = new Expression('vec2(2.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(2.0, 2.0)); + + expression = new Expression('vec2(3.0, 4.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(3.0, 4.0)); + + expression = new Expression('vec2(vec2(3.0, 4.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(3.0, 4.0)); + + expression = new Expression('vec2(vec3(3.0, 4.0, 5.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(3.0, 4.0)); + + expression = new Expression('vec2(vec4(3.0, 4.0, 5.0, 6.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(3.0, 4.0)); + }); + + it('throws if vec2 has invalid number of arguments', function() { var expression = new Expression('vec2()'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(0.0, 0.0, 0.0, 0.0)); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec2(3.0, 4.0, 5.0)'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec2(vec2(3.0, 4.0), 5.0)'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + }); + + it('evaluates vec3', function() { + var expression = new Expression('vec3(2.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(2.0, 2.0, 2.0)); + + expression = new Expression('vec3(3.0, 4.0, 5.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(3.0, 4.0, 5.0)); + + expression = new Expression('vec3(vec2(3.0, 4.0), 5.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(3.0, 4.0, 5.0)); + + expression = new Expression('vec3(3.0, vec2(4.0, 5.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(3.0, 4.0, 5.0)); + + expression = new Expression('vec3(vec3(3.0, 4.0, 5.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(3.0, 4.0, 5.0)); + + expression = new Expression('vec3(vec4(3.0, 4.0, 5.0, 6.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(3.0, 4.0, 5.0)); + }); + + it ('throws if vec3 has invalid number of arguments', function() { + var expression = new Expression('vec3()'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec3(3.0, 4.0)'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec3(3.0, 4.0, 5.0, 6.0)'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec3(vec2(3.0, 4.0), vec2(5.0, 6.0))'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec3(vec4(3.0, 4.0, 5.0, 6.0), 1.0)'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + }); + + it('evaluates vec4', function() { + var expression = new Expression('vec4(2.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(2.0, 2.0, 2.0, 2.0)); - expression = new Expression('vec3()'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(0.0, 0.0, 0.0, 0.0)); + expression = new Expression('vec4(3.0, 4.0, 5.0, 6.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3.0, 4.0, 5.0, 6.0)); - expression = new Expression('vec4()'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(0.0, 0.0, 0.0, 0.0)); + expression = new Expression('vec4(vec2(3.0, 4.0), 5.0, 6.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3.0, 4.0, 5.0, 6.0)); - expression = new Expression('vec2(1.0, 2.0)'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(1.0, 2.0, 0.0, 0.0)); + expression = new Expression('vec4(3.0, vec2(4.0, 5.0), 6.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3.0, 4.0, 5.0, 6.0)); + + expression = new Expression('vec4(3.0, 4.0, vec2(5.0, 6.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3.0, 4.0, 5.0, 6.0)); + + expression = new Expression('vec4(vec3(3.0, 4.0, 5.0), 6.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3.0, 4.0, 5.0, 6.0)); + + expression = new Expression('vec4(3.0, vec3(4.0, 5.0, 6.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3.0, 4.0, 5.0, 6.0)); + + expression = new Expression('vec4(vec4(3.0, 4.0, 5.0, 6.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3.0, 4.0, 5.0, 6.0)); + }); + + it ('throws if vec4 has invalid number of arguments', function() { + var expression = new Expression('vec4()'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec4(3.0, 4.0)'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec4(3.0, 4.0, 5.0)'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); - expression = new Expression('vec3(1.0, 2.0, 3.0)'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(1.0, 2.0, 3.0, 0.0)); + expression = new Expression('vec4(3.0, 4.0, 5.0, 6.0, 7.0)'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); - expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(1.0, 2.0, 3.0, 4.0)); + expression = new Expression('vec4(vec3(3.0, 4.0, 5.0))'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); }); it('evaluates vector with expressions as arguments', function() { @@ -589,8 +707,8 @@ defineSuite([ }); it('evaluates expression with multiple nested vectors', function() { - var expression = new Expression('vec4(vec2(1, 2)[vec3(6, 1, 5).y], 2, vec4().w, 5)'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(2.0, 2.0, 0.0, 5.0)); + var expression = new Expression('vec4(vec2(1, 2)[vec3(6, 1, 5).y], 2, vec4(1.0).w, 5)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(2.0, 2.0, 1.0, 5.0)); }); it('evaluates vector properties (x, y, z, w)', function() { @@ -607,7 +725,7 @@ defineSuite([ expect(expression.evaluate(frameState, undefined)).toEqual(4.0); }); - it('evaluates vector properties ([0], [1], [2]. [3])', function() { + it('evaluates vector properties ([0], [1], [2], [3])', function() { var expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)[0]'); expect(expression.evaluate(frameState, undefined)).toEqual(1.0); @@ -928,50 +1046,134 @@ defineSuite([ }); it('evaluates vector operations', function() { - var expression = new Expression('+vec3(1, 2, 3)'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(1, 2, 3, 0)); + var expression = new Expression('+vec2(1, 2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(1, 2)); + + expression = new Expression('+vec3(1, 2, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(1, 2, 3)); + + expression = new Expression('+vec4(1, 2, 3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(1, 2, 3, 4)); + + expression = new Expression('-vec2(1, 2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(-1, -2)); expression = new Expression('-vec3(1, 2, 3)'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(-1, -2, -3, 0)); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(-1, -2, -3)); - expression = new Expression('vec2(1, 2) + vec4(3, 4, 5, 6)'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(4, 6, 5, 6)); + expression = new Expression('-vec4(1, 2, 3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(-1, -2, -3, -4)); - expression = new Expression('vec2(1, 2) - vec4(3, 4, 5, 6)'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(-2, -2, -5, -6)); + expression = new Expression('vec2(1, 2) + vec2(3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(4, 6)); - expression = new Expression('vec4(1, 2, 3, 4) * vec4(3, 4, 5, 6)'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3, 8, 15, 24)); + expression = new Expression('vec3(1, 2, 3) + vec3(3, 4, 5)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(4, 6, 8)); + + expression = new Expression('vec4(1, 2, 3, 4) + vec4(3, 4, 5, 6)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(4, 6, 8, 10)); + + expression = new Expression('vec2(1, 2) - vec2(3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(-2, -2)); + + expression = new Expression('vec3(1, 2, 3) - vec3(3, 4, 5)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(-2, -2, -2)); + + expression = new Expression('vec4(1, 2, 3, 4) - vec4(3, 4, 5, 6)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(-2, -2, -2, -2)); + + expression = new Expression('vec2(1, 2) * vec2(3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(3, 8)); + + expression = new Expression('vec2(1, 2) * 3.0'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(3, 6)); + + expression = new Expression('3.0 * vec2(1, 2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(3, 6)); + + expression = new Expression('vec3(1, 2, 3) * vec3(3, 4, 5)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(3, 8, 15)); expression = new Expression('vec3(1, 2, 3) * 3.0'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3, 6, 9, 0)); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(3, 6, 9)); expression = new Expression('3.0 * vec3(1, 2, 3)'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3, 6, 9, 0)); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(3, 6, 9)); + + expression = new Expression('vec4(1, 2, 3, 4) * vec4(3, 4, 5, 6)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3, 8, 15, 24)); - expression = new Expression('vec3(1, 2, 3) / vec4(2, 5, 3, 1)'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(0.5, 0.4, 1.0, 0.0)); + expression = new Expression('vec4(1, 2, 3, 4) * 3.0'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3, 6, 9, 12)); + + expression = new Expression('3.0 * vec4(1, 2, 3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3, 6, 9, 12)); + + expression = new Expression('vec2(1, 2) / vec2(2, 5)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(0.5, 0.4)); + + expression = new Expression('vec2(1, 2) / 2.0'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(0.5, 1.0)); + + expression = new Expression('vec3(1, 2, 3) / vec3(2, 5, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(0.5, 0.4, 1.0)); expression = new Expression('vec3(1, 2, 3) / 2.0'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(0.5, 1.0, 1.5, 0.0)); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(0.5, 1.0, 1.5)); + + expression = new Expression('vec4(1, 2, 3, 4) / vec4(2, 5, 3, 2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(0.5, 0.4, 1.0, 2.0)); + + expression = new Expression('vec4(1, 2, 3, 4) / 2.0'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(0.5, 1.0, 1.5, 2.0)); + + expression = new Expression('vec2(2, 3) % vec2(3, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(2, 0)); - expression = new Expression('vec4(2, 3, 4, 5) % vec3(3, 3, 3, 2)'); + expression = new Expression('vec3(2, 3, 4) % vec3(3, 3, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(2, 0, 1)); + + expression = new Expression('vec4(2, 3, 4, 5) % vec4(3, 3, 3, 2)'); expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(2, 0, 1, 1)); - expression = new Expression('vec2(1, 3) == vec4(1, 3, 0, 0)'); + expression = new Expression('vec2(1, 3) == vec2(1, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('vec3(1, 3, 4) == vec3(1, 3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('vec4(1, 3, 4, 6) == vec4(1, 3, 4, 6)'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('vec2(1, 2) === vec2(1, 2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('vec3(1, 2, 3) === vec3(1, 2, 3)'); expect(expression.evaluate(frameState, undefined)).toEqual(true); - expression = new Expression('vec2(1, 3) === vec4(1, 3, 0, 0)'); + expression = new Expression('vec4(1, 2, 3, 4) === vec4(1, 2, 3, 4)'); expect(expression.evaluate(frameState, undefined)).toEqual(true); - expression = new Expression('!!vec4() == true'); + expression = new Expression('!!vec4(1.0) == true'); expect(expression.evaluate(frameState, undefined)).toEqual(true); + expression = new Expression('vec2(1, 2) != vec2(1, 2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + expression = new Expression('vec3(1, 2, 3) != vec3(1, 2, 3)'); expect(expression.evaluate(frameState, undefined)).toEqual(false); + expression = new Expression('vec4(1, 2, 3, 4) != vec4(1, 2, 3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('vec2(1, 2) !== vec2(1, 2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + expression = new Expression('vec3(1, 2, 3) !== vec3(1, 2, 3)'); expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('vec4(1, 2, 3, 4) !== vec4(1, 2, 3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); }); it('evaluates color toString function', function() { @@ -992,7 +1194,13 @@ defineSuite([ var feature = new MockFeature(); feature.addProperty('property', new Cartesian4(1, 2, 3, 4)); - var expression = new Expression('vec4(1, 2, 3, 4).toString()'); + var expression = new Expression('vec2(1, 2).toString()'); + expect(expression.evaluate(frameState, undefined)).toEqual('(1, 2)'); + + expression = new Expression('vec3(1, 2, 3).toString()'); + expect(expression.evaluate(frameState, undefined)).toEqual('(1, 2, 3)'); + + expression = new Expression('vec4(1, 2, 3, 4).toString()'); expect(expression.evaluate(frameState, undefined)).toEqual('(1, 2, 3, 4)'); expression = new Expression('${property}.toString()'); @@ -2160,16 +2368,6 @@ defineSuite([ expression = new Expression('color()[0] + color()[1] + color()[2] + color()[3]'); shaderExpression = expression.getShaderExpression('', {}); expect(shaderExpression).toEqual(expected); - - // ['red'], ['green'], ['blue'], ['alpha'] - expression = new Expression('color()["red"] + color()["green"] + color()["blue"] + color()["alpha"]'); - shaderExpression = expression.getShaderExpression('', {}); - expect(shaderExpression).toEqual(expected); - - // ['x'], ['y'], ['z'], ['w'] - expression = new Expression('color()["x"] + color()["y"] + color()["z"] + color()["w"]'); - shaderExpression = expression.getShaderExpression('', {}); - expect(shaderExpression).toEqual(expected); }); it('gets shader expression for vector', function() { @@ -2177,29 +2375,28 @@ defineSuite([ var shaderExpression = expression.getShaderExpression('', {}); expect(shaderExpression).toEqual('vec4(1.0, 2.0, 3.0, 4.0)'); - expression = new Expression('vec2() + vec3() + vec4()'); + expression = new Expression('vec4(1) + vec4(2)'); + shaderExpression = expression.getShaderExpression('', {}); + expect(shaderExpression).toEqual('(vec4(1.0) + vec4(2.0))'); + + expression = new Expression('vec4(1, ${property}, vec2(1, 2).x, 0)'); shaderExpression = expression.getShaderExpression('', {}); - expect(shaderExpression).toEqual('((vec4(0.0, 0.0, 0.0, 0.0) + vec4(0.0, 0.0, 0.0, 0.0)) + vec4(0.0, 0.0, 0.0, 0.0))'); + expect(shaderExpression).toEqual('vec4(1.0, property, vec2(1.0, 2.0)[0], 0.0)'); - expression = new Expression('vec4(1, ${property}, vec2(1, 2).x)'); + expression = new Expression('vec4(vec3(2), 1.0)'); shaderExpression = expression.getShaderExpression('', {}); - expect(shaderExpression).toEqual('vec4(1.0, property, vec4(1.0, 2.0, 0.0, 0.0)[0], 0.0)'); + expect(shaderExpression).toEqual('vec4(vec3(2.0), 1.0)'); }); it('gets shader expression for vector components', function() { // .x, .y, .z, .w - var expression = new Expression('vec4().x + vec4().y + vec4().z + vec4().w'); + var expression = new Expression('vec4(1).x + vec4(1).y + vec4(1).z + vec4(1).w'); var shaderExpression = expression.getShaderExpression('', {}); - var expected = '(((vec4(0.0, 0.0, 0.0, 0.0)[0] + vec4(0.0, 0.0, 0.0, 0.0)[1]) + vec4(0.0, 0.0, 0.0, 0.0)[2]) + vec4(0.0, 0.0, 0.0, 0.0)[3])'; + var expected = '(((vec4(1.0)[0] + vec4(1.0)[1]) + vec4(1.0)[2]) + vec4(1.0)[3])'; expect(shaderExpression).toEqual(expected); // [0], [1], [2], [3] - expression = new Expression('vec4()[0] + vec4()[1] + vec4()[2] + vec4()[3]'); - shaderExpression = expression.getShaderExpression('', {}); - expect(shaderExpression).toEqual(expected); - - // ['x'], ['y'], ['z'], ['w'] - expression = new Expression('vec4()["x"] + vec4()["y"] + vec4()["z"] + vec4()["w"]'); + expression = new Expression('vec4(1)[0] + vec4(1)[1] + vec4(1)[2] + vec4(1)[3]'); shaderExpression = expression.getShaderExpression('', {}); expect(shaderExpression).toEqual(expected); }); From b7eb7f19e62f51aa561d71248acc32b5d4fc1acc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lozier?= Date: Fri, 6 Jan 2017 15:14:09 -0500 Subject: [PATCH 342/396] Documentation fix --- Source/DataSources/DataSourceCollection.js | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/DataSources/DataSourceCollection.js b/Source/DataSources/DataSourceCollection.js index 374b8a0dbe62..ca2e44f2e0a7 100644 --- a/Source/DataSources/DataSourceCollection.js +++ b/Source/DataSources/DataSourceCollection.js @@ -166,6 +166,7 @@ define([ * Gets a data source by index from the collection. * * @param {Number} index the index to retrieve. + * @returns {DataSource} The data source at the specified index. */ DataSourceCollection.prototype.get = function(index) { //>>includeStart('debug', pragmas.debug); From 4d3648fc8f8b2a271a5c49eb33a7b840999df468 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Fri, 6 Jan 2017 15:22:00 -0500 Subject: [PATCH 343/396] fade material, fade polyline development example --- .../gallery/development/Polylines.html | 18 ++++++++++++++++++ .../gallery/development/Polylines.jpg | Bin 16889 -> 16704 bytes Source/Scene/Material.js | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Apps/Sandcastle/gallery/development/Polylines.html b/Apps/Sandcastle/gallery/development/Polylines.html index 697aa0324ec8..3d50c88d4d2c 100644 --- a/Apps/Sandcastle/gallery/development/Polylines.html +++ b/Apps/Sandcastle/gallery/development/Polylines.html @@ -99,6 +99,24 @@ material : Cesium.Material.fromType(Cesium.Material.PolylineArrowType) }); Sandcastle.declare(localPolyline); // For highlighting on mouseover in Sandcastle. + + //Polyline using the fade material + var fadingPolyline = polylines.add({ + positions : Cesium.Cartesian3.fromDegreesArrayHeights([-75, 43, 500000, + -125, 43, 500000]), + width : 5, + material : Cesium.Material.fromType(Cesium.Material.FadeType, { + repeat: false, + fadeInColor: Cesium.Color.BLUE, + fadeOutColor: Cesium.Color.TRANSPARENT, + time: new Cesium.Cartesian2(1.0, 0.0), + fadeDirection: { + x: true, + y: false + } + }) + }); + Sandcastle.declare(fadingPolyline); // For highlighting on mouseover in Sandcastle. } var viewer = new Cesium.Viewer('cesiumContainer'); diff --git a/Apps/Sandcastle/gallery/development/Polylines.jpg b/Apps/Sandcastle/gallery/development/Polylines.jpg index 85eda029f90b9f1722781bfa69ea3b6989f7f25f..9845d2140f65870676369340896f26c434df8dae 100644 GIT binary patch delta 16116 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 Date: Fri, 6 Jan 2017 17:08:18 -0500 Subject: [PATCH 344/396] sandcaste example tweaks --- .../gallery/development/Polylines.html | 10 ++++++---- .../gallery/development/Polylines.jpg | Bin 16704 -> 18924 bytes 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Apps/Sandcastle/gallery/development/Polylines.html b/Apps/Sandcastle/gallery/development/Polylines.html index 3d50c88d4d2c..51668cdd8931 100644 --- a/Apps/Sandcastle/gallery/development/Polylines.html +++ b/Apps/Sandcastle/gallery/development/Polylines.html @@ -102,13 +102,15 @@ //Polyline using the fade material var fadingPolyline = polylines.add({ - positions : Cesium.Cartesian3.fromDegreesArrayHeights([-75, 43, 500000, - -125, 43, 500000]), + positions : Cesium.PolylinePipeline.generateCartesianArc({ + positions : Cesium.Cartesian3.fromDegreesArrayHeights([-75, 43, 500000, + -125, 43, 500000]) + }), width : 5, material : Cesium.Material.fromType(Cesium.Material.FadeType, { repeat: false, - fadeInColor: Cesium.Color.BLUE, - fadeOutColor: Cesium.Color.TRANSPARENT, + fadeInColor: Cesium.Color.CYAN, + fadeOutColor: Cesium.Color.CYAN.withAlpha(0), time: new Cesium.Cartesian2(1.0, 0.0), fadeDirection: { x: true, diff --git a/Apps/Sandcastle/gallery/development/Polylines.jpg b/Apps/Sandcastle/gallery/development/Polylines.jpg index 9845d2140f65870676369340896f26c434df8dae..01030ac4a65ba022c2626df9e5ffefe24b6ce01b 100644 GIT binary patch delta 18349 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 I?sOmj+00APp#T5? delta 16111 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 From 7d8ee10f86794e8009f834f4529a54c36442f298 Mon Sep 17 00:00:00 2001 From: hpinkos Date: Fri, 6 Jan 2017 17:26:04 -0500 Subject: [PATCH 345/396] fix time in polylines sandcastle example --- .../gallery/development/Polylines.html | 4 ++-- .../gallery/development/Polylines.jpg | Bin 18924 -> 18837 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Apps/Sandcastle/gallery/development/Polylines.html b/Apps/Sandcastle/gallery/development/Polylines.html index 51668cdd8931..8f55cb627d88 100644 --- a/Apps/Sandcastle/gallery/development/Polylines.html +++ b/Apps/Sandcastle/gallery/development/Polylines.html @@ -99,7 +99,7 @@ material : Cesium.Material.fromType(Cesium.Material.PolylineArrowType) }); Sandcastle.declare(localPolyline); // For highlighting on mouseover in Sandcastle. - + //Polyline using the fade material var fadingPolyline = polylines.add({ positions : Cesium.PolylinePipeline.generateCartesianArc({ @@ -111,7 +111,7 @@ repeat: false, fadeInColor: Cesium.Color.CYAN, fadeOutColor: Cesium.Color.CYAN.withAlpha(0), - time: new Cesium.Cartesian2(1.0, 0.0), + time: new Cesium.Cartesian2(0.0, 0.0), fadeDirection: { x: true, y: false diff --git a/Apps/Sandcastle/gallery/development/Polylines.jpg b/Apps/Sandcastle/gallery/development/Polylines.jpg index 01030ac4a65ba022c2626df9e5ffefe24b6ce01b..cb57daf7a81dbf5134f6e832fd2909e037b35d98 100644 GIT binary patch delta 17104 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 LN3@r7s>lD?r>8~G delta 17212 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 P01-tLQ})yDbRYlO Date: Sun, 8 Jan 2017 19:17:16 -0500 Subject: [PATCH 346/396] For WMS 1.3, use CRS rather than SRS for coordinate system --- Source/Scene/WebMapServiceImageryProvider.js | 14 +- .../Scene/WebMapServiceImageryProviderSpec.js | 261 +++++++++++++++++- 2 files changed, 272 insertions(+), 3 deletions(-) diff --git a/Source/Scene/WebMapServiceImageryProvider.js b/Source/Scene/WebMapServiceImageryProvider.js index f7882cbb021d..9de05226af25 100644 --- a/Source/Scene/WebMapServiceImageryProvider.js +++ b/Source/Scene/WebMapServiceImageryProvider.js @@ -132,7 +132,19 @@ define([ } setParameter('layers', options.layers); - setParameter('srs', options.tilingScheme instanceof WebMercatorTilingScheme ? 'EPSG:3857' : 'EPSG:4326'); + + // Use SRS or CRS based on the WMS version. + if (parseFloat(parameters.version) >= 1.3) { + // Use CRS with 1.3.0 and going forward. + // For GeographicTilingScheme, use CRS:84 vice EPSG:4326 to specify lon, lat (x, y) ordering for + // bbox requests. + setParameter('crs', options.tilingScheme instanceof WebMercatorTilingScheme ? 'EPSG:3857' : 'CRS:84'); + } + else { + // SRS for WMS 1.1.0 or 1.1.1. + setParameter('srs', options.tilingScheme instanceof WebMercatorTilingScheme ? 'EPSG:3857' : 'EPSG:4326'); + } + setParameter('bbox', '{westProjected},{southProjected},{eastProjected},{northProjected}'); setParameter('width', '{width}'); setParameter('height', '{height}'); diff --git a/Specs/Scene/WebMapServiceImageryProviderSpec.js b/Specs/Scene/WebMapServiceImageryProviderSpec.js index 462499999dbc..d55572ed361e 100644 --- a/Specs/Scene/WebMapServiceImageryProviderSpec.js +++ b/Specs/Scene/WebMapServiceImageryProviderSpec.js @@ -114,7 +114,8 @@ defineSuite([ layers : 'someLayer', parameters : { something : 'foo', - another : false + another : false, + version: '1.3.0' } }); @@ -126,6 +127,10 @@ defineSuite([ var params = queryToObject(uri.query); expect(params.something).toEqual('foo'); expect(params.another).toEqual('false'); + expect(params.version).toEqual('1.3.0'); + + // Don't need to actually load image, but satisfy the request. + deferred.resolve(true); }); provider.requestImage(0, 0, 0); @@ -172,6 +177,9 @@ defineSuite([ spyOn(loadImage, 'createImage').and.callFake(function(url, crossOrigin, deferred) { var questionMarkCount = url.match(/\?/g).length; expect(questionMarkCount).toEqual(1); + + // Don't need to actually load image, but satisfy the request. + deferred.resolve(true); }); provider.requestImage(0, 0, 0); @@ -194,6 +202,9 @@ defineSuite([ expect(questionMarkCount).toEqual(1); expect(url).not.toContain('&&'); + + // Don't need to actually load image, but satisfy the request. + deferred.resolve(true); }); provider.requestImage(0, 0, 0); @@ -218,6 +229,35 @@ defineSuite([ var uri = new Uri(url); var params = queryToObject(uri.query); expect(params.foo).toEqual('bar'); + + // Don't need to actually load image, but satisfy the request. + deferred.resolve(true); + }); + + provider.requestImage(0, 0, 0); + + expect(loadImage.createImage).toHaveBeenCalled(); + }); + }); + + it('defaults WMS version to 1.1.1', function() { + + var provider = new WebMapServiceImageryProvider({ + url : 'made/up/wms/server?foo=bar', + layers : 'someLayer' + }); + + return pollToPromise(function() { + return provider.ready; + }).then(function() { + spyOn(loadImage, 'createImage').and.callFake(function(url, crossOrigin, deferred) { + + var uri = new Uri(url); + var params = queryToObject(uri.query); + expect(params.version).toEqual('1.1.1'); + + // Don't need to actually load image, but satisfy the request. + deferred.resolve(true); }); provider.requestImage(0, 0, 0); @@ -256,7 +296,7 @@ defineSuite([ }); }); - it('requestImage requests tiles with SRS EPSG:3857 when tiling scheme is WebMercatorTilingScheme', function() { + it('requestImage requests tiles with SRS EPSG:3857 when tiling scheme is WebMercatorTilingScheme, WMS 1.1.1', function() { var tilingScheme = new WebMercatorTilingScheme(); var provider = new WebMapServiceImageryProvider({ url : 'made/up/wms/server', @@ -281,6 +321,219 @@ defineSuite([ var params = queryToObject(uri.query); expect(params.srs).toEqual('EPSG:3857'); + expect(params.version).toEqual('1.1.1'); + + var rect = tilingScheme.tileXYToNativeRectangle(0, 0, 0); + expect(params.bbox).toEqual(rect.west + ',' + rect.south + ',' + rect.east + ',' + rect.north); + + loadImage.defaultCreateImage('Data/Images/Red16x16.png', crossOrigin, deferred); + }); + + return provider.requestImage(0, 0, 0).then(function(image) { + expect(loadImage.createImage).toHaveBeenCalled(); + expect(image).toBeInstanceOf(Image); + }); + }); + }); + + it('requestImage requests tiles with CRS EPSG:3857 when tiling scheme is WebMercatorTilingScheme, WMS 1.3.0', function() { + var tilingScheme = new WebMercatorTilingScheme(); + var provider = new WebMapServiceImageryProvider({ + url : 'made/up/wms/server', + layers : 'someLayer', + tilingScheme : tilingScheme, + parameters: { + version: '1.3.0' + } + }); + + expect(provider.url).toEqual('made/up/wms/server'); + expect(provider.layers).toEqual('someLayer'); + + return pollToPromise(function() { + return provider.ready; + }).then(function() { + expect(provider.tileWidth).toEqual(256); + expect(provider.tileHeight).toEqual(256); + expect(provider.maximumLevel).toBeUndefined(); + expect(provider.tilingScheme).toBeInstanceOf(WebMercatorTilingScheme); + expect(provider.rectangle).toEqual(new WebMercatorTilingScheme().rectangle); + + spyOn(loadImage, 'createImage').and.callFake(function(url, crossOrigin, deferred) { + var uri = new Uri(url); + var params = queryToObject(uri.query); + + expect(params.crs).toEqual('EPSG:3857'); + expect(params.version).toEqual('1.3.0'); + + var rect = tilingScheme.tileXYToNativeRectangle(0, 0, 0); + expect(params.bbox).toEqual(rect.west + ',' + rect.south + ',' + rect.east + ',' + rect.north); + + loadImage.defaultCreateImage('Data/Images/Red16x16.png', crossOrigin, deferred); + }); + + return provider.requestImage(0, 0, 0).then(function(image) { + expect(loadImage.createImage).toHaveBeenCalled(); + expect(image).toBeInstanceOf(Image); + }); + }); + }); + + it('requestImage requests tiles with SRS EPSG:4326 when tiling scheme is GeographicTilingScheme, WMS 1.1.1', function() { + var tilingScheme = new GeographicTilingScheme(); + var provider = new WebMapServiceImageryProvider({ + url : 'made/up/wms/server', + layers : 'someLayer', + tilingScheme : tilingScheme + }); + + expect(provider.url).toEqual('made/up/wms/server'); + expect(provider.layers).toEqual('someLayer'); + + return pollToPromise(function() { + return provider.ready; + }).then(function() { + expect(provider.tileWidth).toEqual(256); + expect(provider.tileHeight).toEqual(256); + expect(provider.maximumLevel).toBeUndefined(); + expect(provider.tilingScheme).toBeInstanceOf(GeographicTilingScheme); + expect(provider.rectangle).toEqual(new GeographicTilingScheme().rectangle); + + spyOn(loadImage, 'createImage').and.callFake(function(url, crossOrigin, deferred) { + var uri = new Uri(url); + var params = queryToObject(uri.query); + + expect(params.srs).toEqual('EPSG:4326'); + expect(params.version).toEqual('1.1.1'); + + var rect = tilingScheme.tileXYToNativeRectangle(0, 0, 0); + expect(params.bbox).toEqual(rect.west + ',' + rect.south + ',' + rect.east + ',' + rect.north); + + loadImage.defaultCreateImage('Data/Images/Red16x16.png', crossOrigin, deferred); + }); + + return provider.requestImage(0, 0, 0).then(function(image) { + expect(loadImage.createImage).toHaveBeenCalled(); + expect(image).toBeInstanceOf(Image); + }); + }); + }); + + it('requestImage requests tiles with SRS EPSG:4326 when tiling scheme is GeographicTilingScheme, WMS 1.1.0', function() { + var tilingScheme = new GeographicTilingScheme(); + var provider = new WebMapServiceImageryProvider({ + url : 'made/up/wms/server', + layers : 'someLayer', + tilingScheme : tilingScheme, + parameters: { + version: '1.1.0' + } + }); + + expect(provider.url).toEqual('made/up/wms/server'); + expect(provider.layers).toEqual('someLayer'); + + return pollToPromise(function() { + return provider.ready; + }).then(function() { + expect(provider.tileWidth).toEqual(256); + expect(provider.tileHeight).toEqual(256); + expect(provider.maximumLevel).toBeUndefined(); + expect(provider.tilingScheme).toBeInstanceOf(GeographicTilingScheme); + expect(provider.rectangle).toEqual(new GeographicTilingScheme().rectangle); + + spyOn(loadImage, 'createImage').and.callFake(function(url, crossOrigin, deferred) { + var uri = new Uri(url); + var params = queryToObject(uri.query); + + expect(params.srs).toEqual('EPSG:4326'); + expect(params.version).toEqual('1.1.0'); + + var rect = tilingScheme.tileXYToNativeRectangle(0, 0, 0); + expect(params.bbox).toEqual(rect.west + ',' + rect.south + ',' + rect.east + ',' + rect.north); + + loadImage.defaultCreateImage('Data/Images/Red16x16.png', crossOrigin, deferred); + }); + + return provider.requestImage(0, 0, 0).then(function(image) { + expect(loadImage.createImage).toHaveBeenCalled(); + expect(image).toBeInstanceOf(Image); + }); + }); + }); + + it('requestImage requests tiles with CRS CRS:84 when tiling scheme is GeographicTilingScheme, WMS 1.3.0', function() { + var tilingScheme = new GeographicTilingScheme(); + var provider = new WebMapServiceImageryProvider({ + url : 'made/up/wms/server', + layers : 'someLayer', + tilingScheme : tilingScheme, + parameters: { + version: '1.3.0' + } + }); + + expect(provider.url).toEqual('made/up/wms/server'); + expect(provider.layers).toEqual('someLayer'); + + return pollToPromise(function() { + return provider.ready; + }).then(function() { + expect(provider.tileWidth).toEqual(256); + expect(provider.tileHeight).toEqual(256); + expect(provider.maximumLevel).toBeUndefined(); + expect(provider.tilingScheme).toBeInstanceOf(GeographicTilingScheme); + expect(provider.rectangle).toEqual(new GeographicTilingScheme().rectangle); + + spyOn(loadImage, 'createImage').and.callFake(function(url, crossOrigin, deferred) { + var uri = new Uri(url); + var params = queryToObject(uri.query); + + expect(params.crs).toEqual('CRS:84'); + expect(params.version).toEqual('1.3.0'); + + var rect = tilingScheme.tileXYToNativeRectangle(0, 0, 0); + expect(params.bbox).toEqual(rect.west + ',' + rect.south + ',' + rect.east + ',' + rect.north); + + loadImage.defaultCreateImage('Data/Images/Red16x16.png', crossOrigin, deferred); + }); + + return provider.requestImage(0, 0, 0).then(function(image) { + expect(loadImage.createImage).toHaveBeenCalled(); + expect(image).toBeInstanceOf(Image); + }); + }); + }); + + it('requestImage requests tiles with CRS CRS:84 when tiling scheme is GeographicTilingScheme, WMS 1.3.1', function() { + var tilingScheme = new GeographicTilingScheme(); + var provider = new WebMapServiceImageryProvider({ + url : 'made/up/wms/server', + layers : 'someLayer', + tilingScheme : tilingScheme, + parameters: { + version: '1.3.1' + } + }); + + expect(provider.url).toEqual('made/up/wms/server'); + expect(provider.layers).toEqual('someLayer'); + + return pollToPromise(function() { + return provider.ready; + }).then(function() { + expect(provider.tileWidth).toEqual(256); + expect(provider.tileHeight).toEqual(256); + expect(provider.maximumLevel).toBeUndefined(); + expect(provider.tilingScheme).toBeInstanceOf(GeographicTilingScheme); + expect(provider.rectangle).toEqual(new GeographicTilingScheme().rectangle); + + spyOn(loadImage, 'createImage').and.callFake(function(url, crossOrigin, deferred) { + var uri = new Uri(url); + var params = queryToObject(uri.query); + + expect(params.crs).toEqual('CRS:84'); + expect(params.version).toEqual('1.3.1'); var rect = tilingScheme.tileXYToNativeRectangle(0, 0, 0); expect(params.bbox).toEqual(rect.west + ',' + rect.south + ',' + rect.east + ',' + rect.north); @@ -669,6 +922,8 @@ defineSuite([ enablePickFeatures : false }); + expect(provider.enablePickFeatures).toBe(false); + return pollToPromise(function() { return provider.ready; }).then(function() { @@ -684,6 +939,7 @@ defineSuite([ }); provider.enablePickFeatures = false; + expect(provider.enablePickFeatures).toBe(false); return pollToPromise(function() { return provider.ready; @@ -700,6 +956,7 @@ defineSuite([ }); provider.enablePickFeatures = true; + expect(provider.enablePickFeatures).toBe(true); return pollToPromise(function() { return provider.ready; From 7f45c5d69a1576737555abaaf9b30442be88237e Mon Sep 17 00:00:00 2001 From: cwgrant Date: Sun, 8 Jan 2017 19:21:33 -0500 Subject: [PATCH 347/396] Update CHANGES/CONTRIBUTORS for WMS 1.3 --- CHANGES.md | 1 + CONTRIBUTORS.md | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 019d879189ff..6943199a9821 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -14,6 +14,7 @@ Change Log * Fixed sky atmosphere from causing incorrect picking and hanging drill picking. [#4783](https://github.com/AnalyticalGraphicsInc/cesium/issues/4783) and [#4784](https://github.com/AnalyticalGraphicsInc/cesium/issues/4784) * Fixed a bug that could cause a "readyImagery is not actually ready" exception when quickly zooming past the maximum available imagery level of an imagery layer near the poles. * Fixed a bug that caused all models to use the same highlight color. [#4798] (https://github.com/AnalyticalGraphicsInc/cesium/pull/4798) +* Added support for WMS version 1.3 by using CRS vice SRS query string parameter to request projection. SRS is still used for older versions. ### 1.29 - 2017-01-02 * Improved 3D Models diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index a48712cd0bef..2a3cf8344167 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -118,3 +118,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu * [Brad Hover](https://github.com/tekhaus) * [Hüseyin Ateş](https://github.com/ateshuseyin) * [Zsolt Simon](https://github.com/szsolt) +* [Chris Grant](https://github.com/cwgrant) From 34008506cae28ddbb7bb75ebc4cf4a975b6144b8 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Mon, 9 Jan 2017 11:17:33 +0100 Subject: [PATCH 348/396] Remove unused imports --- Source/Core/Check.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Source/Core/Check.js b/Source/Core/Check.js index 5bf150dcab79..3c0e8c00fed3 100644 --- a/Source/Core/Check.js +++ b/Source/Core/Check.js @@ -1,14 +1,10 @@ /*global define*/ define([ - './defaultValue', './defined', - './DeveloperError', - './isArray' + './DeveloperError' ], function( - defaultValue, defined, - DeveloperError, - isArray) { + DeveloperError) { 'use strict'; /** From 18c84a68581a4a9dc82f83e3e813e52a9e4b05d4 Mon Sep 17 00:00:00 2001 From: Erik Andersson Date: Mon, 9 Jan 2017 11:19:20 +0100 Subject: [PATCH 349/396] Rename Check.typeOf.boolean -> Check.typeOf.bool --- Source/Core/Check.js | 2 +- Specs/Core/CheckSpec.js | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/Core/Check.js b/Source/Core/Check.js index 3c0e8c00fed3..f3ce7708f2b7 100644 --- a/Source/Core/Check.js +++ b/Source/Core/Check.js @@ -136,7 +136,7 @@ define([ * @param {String} name The name of the variable being tested * @exception {DeveloperError} test must be typeof 'boolean' */ - Check.typeOf.boolean = function (test, name) { + Check.typeOf.bool = function (test, name) { if (typeof test !== 'boolean') { throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'boolean', name)); } diff --git a/Specs/Core/CheckSpec.js b/Specs/Core/CheckSpec.js index 54bcc1cd304b..36c06c062063 100644 --- a/Specs/Core/CheckSpec.js +++ b/Specs/Core/CheckSpec.js @@ -6,27 +6,27 @@ defineSuite([ 'use strict'; describe('type checks', function () { - it('Check.typeOf.boolean does not throw when passed a boolean', function () { + it('Check.typeOf.bool does not throw when passed a boolean', function () { expect(function () { - Check.typeOf.boolean(true); + Check.typeOf.bool(true); }).not.toThrowDeveloperError(); }); it('Check.typeOf.boolean throws when passed a non-boolean', function () { expect(function () { - Check.typeOf.boolean({}, 'mockName'); + Check.typeOf.bool({}, 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.boolean([], 'mockName'); + Check.typeOf.bool([], 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.boolean(1, 'mockName'); + Check.typeOf.bool(1, 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.boolean('snth', 'mockName'); + Check.typeOf.bool('snth', 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.boolean(function () {return true;}, 'mockName'); + Check.typeOf.bool(function () {return true;}, 'mockName'); }).toThrowDeveloperError(); }); From bd964f3c8d0e14f06232dc6079c22c2b3324305f Mon Sep 17 00:00:00 2001 From: hpinkos Date: Mon, 9 Jan 2017 08:27:43 -0500 Subject: [PATCH 350/396] kml iconstyle empty color --- Source/DataSources/KmlDataSource.js | 2 +- Specs/DataSources/KmlDataSourceSpec.js | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Source/DataSources/KmlDataSource.js b/Source/DataSources/KmlDataSource.js index 0df12a27e333..3050beb61ca8 100644 --- a/Source/DataSources/KmlDataSource.js +++ b/Source/DataSources/KmlDataSource.js @@ -487,7 +487,7 @@ define([ var colorOptions = {}; function parseColorString(value, isRandom) { - if (!defined(value)) { + if (!defined(value) || /^\s*$/gm.test(value)) { return undefined; } diff --git a/Specs/DataSources/KmlDataSourceSpec.js b/Specs/DataSources/KmlDataSourceSpec.js index 6047c568d1a1..5745748e366a 100644 --- a/Specs/DataSources/KmlDataSourceSpec.js +++ b/Specs/DataSources/KmlDataSourceSpec.js @@ -1014,6 +1014,23 @@ defineSuite([ }); }); + it('Styles: empty color', function() { + CesiumMath.setRandomNumberSeed(0); + + var kml = '\ + \ + \ + '; + + return KmlDataSource.load(parser.parseFromString(kml, "text/xml"), options).then(function(dataSource) { + expect(dataSource.entities.values[0].billboard.color).toBeUndefined(); + }); + }); + it('Styles: Applies expected styles to Point geometry', function() { var kml = '\ Date: Mon, 9 Jan 2017 08:40:40 -0500 Subject: [PATCH 351/396] picth --- Apps/Sandcastle/gallery/CZML.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Apps/Sandcastle/gallery/CZML.html b/Apps/Sandcastle/gallery/CZML.html index 0cafcad8932f..5a02e79f2bbb 100644 --- a/Apps/Sandcastle/gallery/CZML.html +++ b/Apps/Sandcastle/gallery/CZML.html @@ -42,8 +42,7 @@ viewer.scene.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(-116.52, 35.02, 95000), orientation: { - heading: 6, - picth: -Cesium.Math.PI_OVER_TWO + heading: 6 } }); }); From 668d722a154bfba8497661ba923fd54e8097f681 Mon Sep 17 00:00:00 2001 From: Hannah Date: Mon, 9 Jan 2017 09:27:27 -0500 Subject: [PATCH 352/396] Update CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 019d879189ff..b428377b4264 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -14,6 +14,7 @@ Change Log * Fixed sky atmosphere from causing incorrect picking and hanging drill picking. [#4783](https://github.com/AnalyticalGraphicsInc/cesium/issues/4783) and [#4784](https://github.com/AnalyticalGraphicsInc/cesium/issues/4784) * Fixed a bug that could cause a "readyImagery is not actually ready" exception when quickly zooming past the maximum available imagery level of an imagery layer near the poles. * Fixed a bug that caused all models to use the same highlight color. [#4798] (https://github.com/AnalyticalGraphicsInc/cesium/pull/4798) +* Fixed KML for when color is an empty string [#4826](https://github.com/AnalyticalGraphicsInc/cesium/pull/4826) ### 1.29 - 2017-01-02 * Improved 3D Models From ce77e8455558793d120693325a75401a4f0e54ae Mon Sep 17 00:00:00 2001 From: "duvi.fn" Date: Mon, 9 Jan 2017 18:19:39 +0200 Subject: [PATCH 353/396] fixes #4566 --- Specs/Scene/LabelCollectionSpec.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Specs/Scene/LabelCollectionSpec.js b/Specs/Scene/LabelCollectionSpec.js index 1477b8a87b0f..a83fb94b3f52 100644 --- a/Specs/Scene/LabelCollectionSpec.js +++ b/Specs/Scene/LabelCollectionSpec.js @@ -1715,6 +1715,12 @@ defineSuite([ }); it('computes bounding sphere in Columbus view', function() { + + // Disable collision detection to allow controlled camera position, + // hence predictable bounding sphere size + var originalEnableCollisionDetection = scene.screenSpaceCameraController.enableCollisionDetection; + scene.screenSpaceCameraController.enableCollisionDetection = false; + var projection = scene.mapProjection; var ellipsoid = projection.ellipsoid; @@ -1740,6 +1746,7 @@ defineSuite([ expected.center = new Cartesian3(0.0, expected.center.x, expected.center.y); expect(actual.center).toEqualEpsilon(expected.center, CesiumMath.EPSILON8); expect(actual.radius).toBeGreaterThan(expected.radius); + scene.screenSpaceCameraController.enableCollisionDetection = originalEnableCollisionDetection; }); it('computes bounding sphere in 2D', function() { From f6cf9553aa335973760433a2a720791de68acfc2 Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Mon, 9 Jan 2017 14:00:22 -0500 Subject: [PATCH 354/396] Updates from review. --- CHANGES.md | 1 + LICENSE.md | 53 ++++++++++++++++++++++++++ Source/Core/CompressedTextureBuffer.js | 9 +++++ Source/Workers/transcodeCRNToDXT.js | 32 ++++------------ 4 files changed, 70 insertions(+), 25 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 25f3aead0a3b..2ec80ff51a8b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,6 +8,7 @@ Change Log * Added `loadKTX` to load KTX textures. * Added `loadCRN` to load crunch compressed textures. * Added new `PixelFormat` and `WebGLConstants` enums from WebGL extensions `WEBGL_compressed_s3tc`, `WEBGL_compressed_texture_pvrtc`, and `WEBGL_compressed_texture_etc1`. [#4758](https://github.com/AnalyticalGraphicsInc/cesium/pull/4758) + * Added `CompressedTextureBuffer`. ### 1.30 - 2017-02-01 diff --git a/LICENSE.md b/LICENSE.md index 4fe332029945..8ac1d62e7e55 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -288,6 +288,59 @@ OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +### crunch + +https://github.com/BinomialLLC/crunch + +>crunch/crnlib uses the ZLIB license: +>http://opensource.org/licenses/Zlib +> +>Copyright (c) 2010-2016 Richard Geldreich, Jr. and Binomial LLC +> +>This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. +> +>Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: +> +>1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +> +>2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +> +>3. This notice may not be removed or altered from any source distribution. + +### texture-tester + +https://github.com/toji/texture-tester + +>Copyright (c) 2014, Brandon Jones. All rights reserved. +> +>Redistribution and use in source and binary forms, with or without modification, +>are permitted provided that the following conditions are met: +> +>* Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. +>* Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. +> +>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Tests ===== diff --git a/Source/Core/CompressedTextureBuffer.js b/Source/Core/CompressedTextureBuffer.js index 7a7251dfb2ec..2bee0c470813 100644 --- a/Source/Core/CompressedTextureBuffer.js +++ b/Source/Core/CompressedTextureBuffer.js @@ -80,5 +80,14 @@ define([ return new CompressedTextureBuffer(object._format, object._width, object._height, object._buffer); }; + /** + * Creates a shallow clone of this compressed texture buffer. + * + * @return {CompressedTextureBuffer} A shallow clone of the compressed texture buffer. + */ + CompressedTextureBuffer.prototype.clone = function() { + return CompressedTextureBuffer.clone(this); + }; + return CompressedTextureBuffer; }); \ No newline at end of file diff --git a/Source/Workers/transcodeCRNToDXT.js b/Source/Workers/transcodeCRNToDXT.js index 4f6c4f1c2a8f..985e68fe9fbf 100644 --- a/Source/Workers/transcodeCRNToDXT.js +++ b/Source/Workers/transcodeCRNToDXT.js @@ -16,30 +16,10 @@ define([ ) { 'use strict'; - // Modified from: https://github.com/toji/texture-tester/blob/master/js/webgl-texture-util.js - // Also see: http://toji.github.io/texture-tester/ - - /* Copyright (c) 2014, Brandon Jones. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + // Modified from texture-tester + // See: + // https://github.com/toji/texture-tester/blob/master/js/webgl-texture-util.js + // http://toji.github.io/texture-tester/ // Taken from crnlib.h var CRN_FORMAT = { @@ -59,7 +39,6 @@ define([ DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT3] = PixelFormat.RGBA_DXT3; DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT5] = PixelFormat.RGBA_DXT5; - var dst; var dxtData; var cachedDstSize = 0; @@ -79,6 +58,9 @@ define([ } } + /** + * @private + */ function transcodeCRNToDXT(arrayBuffer, transferableObjects) { // Copy the contents of the arrayBuffer into emscriptens heap. var srcSize = arrayBuffer.byteLength; From 73fc5890920b8a752bda7770e0988036457e35dd Mon Sep 17 00:00:00 2001 From: Dan Bagnell Date: Mon, 9 Jan 2017 14:56:21 -0500 Subject: [PATCH 355/396] Update crunch.js and update licenses. --- LICENSE.md | 26 ++++++++++++++ Source/ThirdParty/crunch.js | 55 ++++++++++++++++++++++------- Source/Workers/transcodeCRNToDXT.js | 26 ++++++++++++++ 3 files changed, 94 insertions(+), 13 deletions(-) diff --git a/LICENSE.md b/LICENSE.md index 8ac1d62e7e55..62984317a872 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -315,6 +315,32 @@ misrepresented as being the original software. > >3. This notice may not be removed or altered from any source distribution. +### crunch_lib.cpp + +https://github.com/Apress/html5-game-dev-insights/blob/master/jones_ch21/crunch_webgl/crunch_js/crunch_lib.cpp + +>Copyright (c) 2013, Evan Parker, Brandon Jones. All rights reserved. +> +>Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: +> +> * Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. +> * Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. +> +>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + ### texture-tester https://github.com/toji/texture-tester diff --git a/Source/ThirdParty/crunch.js b/Source/ThirdParty/crunch.js index 48b28bc45c8c..9bc5362a1ce9 100644 --- a/Source/ThirdParty/crunch.js +++ b/Source/ThirdParty/crunch.js @@ -1,28 +1,57 @@ +/** + * @licence + * + * crunch/crnlib v1.04 - Advanced DXTn texture compression library + * Copyright (C) 2010-2016 Richard Geldreich, Jr. and Binomial LLC http://binomial.info + */ + +/** + * @license + * + * crunch_lib.cpp + * + * Copyright (c) 2013, Evan Parker, Brandon Jones. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// The C++ code was compiled to Javascript with Emcripten. +// For instructions, see: +// https://github.com/AnalyticalGraphicsInc/crunch + /*global define*/ define([], function() { - // crunch/crnlib v1.04 - Advanced DXTn texture compression library - // Copyright (C) 2010-2016 Richard Geldreich, Jr. and Binomial LLC http://binomial.info - - // This software uses the ZLIB license, which is located in license.txt. - // http://opensource.org/licenses/Zlib - - // The crunch C++ code was compiled to Javascript with Emcripten: - // emcc -O3 crn.cpp -I./inc -s EXPORTED_FUNCTIONS="['_malloc', '_free', '_crn_get_width', '_crn_get_height', '_crn_get_levels', '_crn_get_dxt_format', '_crn_get_bytes_per_block', '_crn_get_uncompressed_size', '_crn_decompress']" -s NO_EXIT_RUNTIME=1 -s NO_FILESYSTEM=1 -s ELIMINATE_DUPLICATE_FUNCTIONS=1 -s ALLOW_MEMORY_GROWTH=1 --memory-init-file 0 -o crunch.js - - var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=function print(x){process["stdout"].write(x+"\n")};if(!Module["printErr"])Module["printErr"]=function printErr(x){process["stderr"].write(x+"\n")};var nodeFS=require("fs");var nodePath=require("path");Module["read"]=function read(filename,binary){filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);if(!ret&&filename!=nodePath["resolve"](filename)){filename=path.join(__dirname,"..","src",filename);ret=nodeFS["readFileSync"](filename)}if(ret&&!binary)ret=ret.toString();return ret};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f))};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function read(){throw"no read() available (jsc?)"}}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function printErr(x){console.log(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){eval.call(null,x)}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}var Runtime={setTempRet0:(function(value){tempRet0=value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){if(!args.splice)args=Array.prototype.slice.call(args);args.splice(0,0,ptr);return Module["dynCall_"+sig].apply(null,args)}else{return Module["dynCall_"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i=TOTAL_MEMORY){var success=enlargeMemory();if(!success){DYNAMICTOP=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module["Runtime"]=Runtime;var __THREW__=0;var ABORT=false;var EXITSTATUS=0;var undef=0;var tempValue,tempInt,tempBigInt,tempInt2,tempBigInt2,tempPair,tempBigIntI,tempBigIntR,tempBigIntS,tempBigIntP,tempBigIntD,tempDouble,tempFloat;var tempI64,tempI64b;var tempRet0,tempRet1,tempRet2,tempRet3,tempRet4,tempRet5,tempRet6,tempRet7,tempRet8,tempRet9;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var globalScope=this;function getCFunc(ident){var func=Module["_"+ident];if(!func){try{func=eval("_"+ident)}catch(e){}}assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)");return func}var cwrap,ccall;((function(){var JSfuncs={"stackSave":(function(){Runtime.stackSave()}),"stackRestore":(function(){Runtime.stackRestore()}),"arrayToC":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=Runtime.stackAlloc((str.length<<2)+1);writeStringToMemory(str,ret)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}Module["setValue"]=setValue;function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type)}return null}Module["getValue"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module["ALLOC_NORMAL"]=ALLOC_NORMAL;Module["ALLOC_STACK"]=ALLOC_STACK;Module["ALLOC_STATIC"]=ALLOC_STATIC;Module["ALLOC_DYNAMIC"]=ALLOC_DYNAMIC;Module["ALLOC_NONE"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[_malloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module["UTF8ToString"](ptr)}Module["Pointer_stringify"]=Pointer_stringify;function AsciiToString(ptr){var str="";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module["AsciiToString"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module["stringToAscii"]=stringToAscii;function UTF8ArrayToString(u8Array,idx){var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}Module["UTF8ArrayToString"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module["UTF8ToString"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module["stringToUTF8Array"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module["stringToUTF8"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module["lengthBytesUTF8"]=lengthBytesUTF8;function UTF16ToString(ptr){var i=0;var str="";while(1){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)return str;++i;str+=String.fromCharCode(codeUnit)}}Module["UTF16ToString"]=UTF16ToString;function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}Module["stringToUTF16"]=stringToUTF16;function lengthBytesUTF16(str){return str.length*2}Module["lengthBytesUTF16"]=lengthBytesUTF16;function UTF32ToString(ptr){var i=0;var str="";while(1){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)return str;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}}Module["UTF32ToString"]=UTF32ToString;function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}Module["stringToUTF32"]=stringToUTF32;function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}Module["lengthBytesUTF32"]=lengthBytesUTF32;function demangle(func){var hasLibcxxabi=!!Module["___cxa_demangle"];if(hasLibcxxabi){try{var buf=_malloc(func.length);writeStringToMemory(func.substr(1),buf);var status=_malloc(4);var ret=Module["___cxa_demangle"](buf,0,0,status);if(getValue(status,"i32")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}}var i=3;var basicTypes={"v":"void","b":"bool","c":"char","s":"short","i":"int","l":"long","f":"float","d":"double","w":"wchar_t","a":"signed char","h":"unsigned char","t":"unsigned short","j":"unsigned int","m":"unsigned long","x":"long long","y":"unsigned long long","z":"..."};var subs=[];var first=true;function dump(x){if(x)Module.print(x);Module.print(func);var pre="";for(var a=0;a"}else{ret=name}paramLoop:while(i0){var c=func[i++];if(c in basicTypes){list.push(basicTypes[c])}else{switch(c){case"P":list.push(parse(true,1,true)[0]+"*");break;case"R":list.push(parse(true,1,true)[0]+"&");break;case"L":{i++;var end=func.indexOf("E",i);var size=end-i;list.push(func.substr(i,size));i+=size+2;break};case"A":{var size=parseInt(func.substr(i));i+=size.toString().length;if(func[i]!=="_")throw"?";i++;list.push(parse(true,1,true)[0]+" ["+size+"]");break};case"E":break paramLoop;default:ret+="?"+c;break paramLoop}}}if(!allowVoid&&list.length===1&&list[0]==="void")list=[];if(rawList){if(ret){list.push(ret+"?")}return list}else{return ret+flushList()}}var parsed=func;try{if(func=="Object._main"||func=="_main"){return"main()"}if(typeof func==="number")func=Pointer_stringify(func);if(func[0]!=="_")return func;if(func[1]!=="_")return func;if(func[2]!=="Z")return func;switch(func[3]){case"n":return"operator new()";case"d":return"operator delete()"}parsed=parse()}catch(e){parsed+="?"}if(parsed.indexOf("?")>=0&&!hasLibcxxabi){Runtime.warnOnce("warning: a problem occurred in builtin C++ name demangling; build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling")}return parsed}function demangleAll(text){return text.replace(/__Z[\w\d_]+/g,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){return demangleAll(jsStackTrace())}Module["stackTrace"]=stackTrace;var PAGE_SIZE=4096;function alignMemoryPage(x){if(x%4096>0){x+=4096-x%4096}return x}var HEAP;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var STATIC_BASE=0,STATICTOP=0,staticSealed=false;var STACK_BASE=0,STACKTOP=0,STACK_MAX=0;var DYNAMIC_BASE=0,DYNAMICTOP=0;function enlargeMemory(){var OLD_TOTAL_MEMORY=TOTAL_MEMORY;var LIMIT=Math.pow(2,31);if(DYNAMICTOP>=LIMIT)return false;while(TOTAL_MEMORY<=DYNAMICTOP){if(TOTAL_MEMORY=LIMIT)return false;try{if(ArrayBuffer.transfer){buffer=ArrayBuffer.transfer(buffer,TOTAL_MEMORY)}else{var oldHEAP8=HEAP8;buffer=new ArrayBuffer(TOTAL_MEMORY)}}catch(e){return false}var success=_emscripten_replace_memory(buffer);if(!success)return false;Module["buffer"]=buffer;Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer);if(!ArrayBuffer.transfer){HEAP8.set(oldHEAP8)}return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;var totalMemory=64*1024;while(totalMemory0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Runtime.dynCall("v",func)}else{Runtime.dynCall("vi",func,[callback.arg])}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module["addOnPreRun"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module["addOnInit"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module["addOnPreMain"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module["addOnExit"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module["addOnPostRun"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["intArrayFromString"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}Module["intArrayToString"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){var array=intArrayFromString(string,dontAddNull);var i=0;while(i>0]=chr;i=i+1}}Module["writeStringToMemory"]=writeStringToMemory;function writeArrayToMemory(array,buffer){for(var i=0;i>0]=array[i]}}Module["writeArrayToMemory"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module["writeAsciiToMemory"]=writeAsciiToMemory;function unSign(value,bits,ignore){if(value>=0){return value}return bits<=32?2*Math.abs(1<=half&&(bits<=32||value>half)){value=-2*half+value}return value}if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math["imul"];if(!Math["clz32"])Math["clz32"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math["clz32"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_min=Math.min;var Math_clz32=Math.clz32;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}Module["addRunDependency"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["removeRunDependency"]=removeRunDependency;Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var ASM_CONSTS=[];STATIC_BASE=8;STATICTOP=STATIC_BASE+5888;__ATINIT__.push();allocate([116,0,0,0,86,7,0,0,116,0,0,0,99,7,0,0,156,0,0,0,112,7,0,0,16,0,0,0,0,0,0,0,156,0,0,0,145,7,0,0,24,0,0,0,0,0,0,0,156,0,0,0,215,7,0,0,24,0,0,0,0,0,0,0,156,0,0,0,179,7,0,0,56,0,0,0,0,0,0,0,156,0,0,0,249,7,0,0,40,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,40,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,88,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,4,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,1,0,0,220,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0,0,227,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,4,0,0,0,219,16,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,115,40,37,117,41,58,32,65,115,115,101,114,116,105,111,110,32,102,97,105,108,117,114,101,58,32,34,37,115,34,10,0,109,95,115,105,122,101,32,60,61,32,109,95,99,97,112,97,99,105,116,121,0,46,47,105,110,99,92,99,114,110,95,100,101,99,111,109,112,46,104,0,109,105,110,95,110,101,119,95,99,97,112,97,99,105,116,121,32,60,32,40,48,120,55,70,70,70,48,48,48,48,85,32,47,32,101,108,101,109,101,110,116,95,115,105,122,101,41,0,110,101,119,95,99,97,112,97,99,105,116,121,32,38,38,32,40,110,101,119,95,99,97,112,97,99,105,116,121,32,62,32,109,95,99,97,112,97,99,105,116,121,41,0,110,117,109,95,99,111,100,101,115,91,99,93,0,115,111,114,116,101,100,95,112,111,115,32,60,32,116,111,116,97,108,95,117,115,101,100,95,115,121,109,115,0,112,67,111,100,101,115,105,122,101,115,91,115,121,109,95,105,110,100,101,120,93,32,61,61,32,99,111,100,101,115,105,122,101,0,116,32,60,32,40,49,85,32,60,60,32,116,97,98,108,101,95,98,105,116,115,41,0,109,95,108,111,111,107,117,112,91,116,93,32,61,61,32,99,85,73,78,84,51,50,95,77,65,88,0,99,114,110,100,95,109,97,108,108,111,99,58,32,115,105,122,101,32,116,111,111,32,98,105,103,0,99,114,110,100,95,109,97,108,108,111,99,58,32,111,117,116,32,111,102,32,109,101,109,111,114,121,0,40,40,117,105,110,116,51,50,41,112,95,110,101,119,32,38,32,40,67,82,78,68,95,77,73,78,95,65,76,76,79,67,95,65,76,73,71,78,77,69,78,84,32,45,32,49,41,41,32,61,61,32,48,0,99,114,110,100,95,114,101,97,108,108,111,99,58,32,98,97,100,32,112,116,114,0,99,114,110,100,95,102,114,101,101,58,32,98,97,100,32,112,116,114,0,102,97,108,115,101,0,40,116,111,116,97,108,95,115,121,109,115,32,62,61,32,49,41,32,38,38,32,40,116,111,116,97,108,95,115,121,109,115,32,60,61,32,112,114,101,102,105,120,95,99,111,100,105,110,103,58,58,99,77,97,120,83,117,112,112,111,114,116,101,100,83,121,109,115,41,0,17,18,19,20,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15,16,48,0,110,117,109,95,98,105,116,115,32,60,61,32,51,50,85,0,109,95,98,105,116,95,99,111,117,110,116,32,60,61,32,99,66,105,116,66,117,102,83,105,122,101,0,116,32,33,61,32,99,85,73,78,84,51,50,95,77,65,88,0,109,111,100,101,108,46,109,95,99,111,100,101,95,115,105,122,101,115,91,115,121,109,93,32,61,61,32,108,101,110,0,0,2,3,1,0,2,3,4,5,6,7,1,40,108,101,110,32,62,61,32,49,41,32,38,38,32,40,108,101,110,32,60,61,32,99,77,97,120,69,120,112,101,99,116,101,100,67,111,100,101,83,105,122,101,41,0,105,32,60,32,109,95,115,105,122,101,0,110,101,120,116,95,108,101,118,101,108,95,111,102,115,32,62,32,99,117,114,95,108,101,118,101,108,95,111,102,115,0,1,2,2,3,3,3,3,4,0,0,0,0,0,0,1,1,0,1,0,1,0,0,1,2,1,2,0,0,0,1,0,2,1,0,2,0,0,1,2,3,110,117,109,32,38,38,32,40,110,117,109,32,61,61,32,126,110,117,109,95,99,104,101,99,107,41,0,83,116,57,101,120,99,101,112,116,105,111,110,0,83,116,57,116,121,112,101,95,105,110,102,111,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,57,95,95,112,111,105,110,116,101,114,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,112,98,97,115,101,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,112,116,104,114,101,97,100,95,111,110,99,101,32,102,97,105,108,117,114,101,32,105,110,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,95,102,97,115,116,40,41,0,116,101,114,109,105,110,97,116,101,95,104,97,110,100,108,101,114,32,117,110,101,120,112,101,99,116,101,100,108,121,32,114,101,116,117,114,110,101,100,0,99,97,110,110,111,116,32,99,114,101,97,116,101,32,112,116,104,114,101,97,100,32,107,101,121,32,102,111,114,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,40,41,0,99,97,110,110,111,116,32,122,101,114,111,32,111,117,116,32,116,104,114,101,97,100,32,118,97,108,117,101,32,102,111,114,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,40,41,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,121,112,101,32,37,115,58,32,37,115,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,121,112,101,32,37,115,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,102,111,114,101,105,103,110,32,101,120,99,101,112,116,105,111,110,0,116,101,114,109,105,110,97,116,105,110,103,0,117,110,99,97,117,103,104,116,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,46,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=Runtime.alignMemory(allocate(12,"i8",ALLOC_STATIC),8);assert(tempDoublePtr%8==0);function copyTempFloat(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3]}function copyTempDouble(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3];HEAP8[tempDoublePtr+4]=HEAP8[ptr+4];HEAP8[tempDoublePtr+5]=HEAP8[ptr+5];HEAP8[tempDoublePtr+6]=HEAP8[ptr+6];HEAP8[tempDoublePtr+7]=HEAP8[ptr+7]}var _BDtoIHigh=true;Module["_i64Subtract"]=_i64Subtract;Module["_i64Add"]=_i64Add;function _pthread_cleanup_push(routine,arg){__ATEXIT__.push((function(){Runtime.dynCall("vi",routine,[arg])}));_pthread_cleanup_push.level=__ATEXIT__.length}Module["_memset"]=_memset;var _BDtoILow=true;Module["_bitshift64Lshr"]=_bitshift64Lshr;Module["_bitshift64Shl"]=_bitshift64Shl;function _pthread_cleanup_pop(){assert(_pthread_cleanup_push.level==__ATEXIT__.length,"cannot pop if something else added meanwhile!");__ATEXIT__.pop();_pthread_cleanup_push.level=__ATEXIT__.length}function _abort(){Module["abort"]()}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:(function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var ptr in EXCEPTIONS.infos){var info=EXCEPTIONS.infos[ptr];if(info.adjusted===adjusted){return ptr}}return adjusted}),addRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount++}),decRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0);info.refcount--;if(info.refcount===0){if(info.destructor){Runtime.dynCall("vi",info.destructor,[ptr])}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___cxa_begin_catch(ptr){__ZSt18uncaught_exceptionv.uncaught_exception--;EXCEPTIONS.caught.push(ptr);EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr));return ptr}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Runtime.dynCall("v",func);_pthread_once.seen[ptr]=1}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module["_memcpy"]=_memcpy;var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _sysconf(name){switch(name){case 30:return PAGE_SIZE;case 85:return totalMemory/PAGE_SIZE;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 79:return 0;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:{if(typeof navigator==="object")return navigator["hardwareConcurrency"]||1;return 1}}___setErrNo(ERRNO_CODES.EINVAL);return-1}function _sbrk(bytes){var self=_sbrk;if(!self.called){DYNAMICTOP=alignMemoryPage(DYNAMICTOP);self.called=true;assert(Runtime.dynamicAlloc);self.alloc=Runtime.dynamicAlloc;Runtime.dynamicAlloc=(function(){abort("cannot dynamically allocate, sbrk now has control")})}var ret=DYNAMICTOP;if(bytes!=0){var success=self.alloc(bytes);if(!success)return-1>>>0}return ret}var PTHREAD_SPECIFIC_NEXT_KEY=1;function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}var _BItoD=true;var PATH=undefined;function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){setTimeout(Browser.mainLoop.runner,value)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(!window["setImmediate"]){var setImmediates=[];var emscriptenMainLoopMessageId="__emcc";function Browser_setImmediate_messageHandler(event){if(event.source===window&&event.data===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}}window.addEventListener("message",Browser_setImmediate_messageHandler,true);window["setImmediate"]=function Browser_emulated_setImmediate(func){setImmediates.push(func);window.postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){window["setImmediate"](Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop,arg,noSetTiming){Module["noExitRuntime"]=true;assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=func;Browser.mainLoop.arg=arg;var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;Browser.mainLoop.runner=function Browser_mainLoop_runner(){if(ABORT)return;if(Browser.mainLoop.queue.length>0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();setTimeout(Browser.mainLoop.runner,0);return}if(thisMainLoopId1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}if(Browser.mainLoop.method==="timeout"&&Module.ctx){Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!");Browser.mainLoop.method=""}Browser.mainLoop.runIter((function(){if(typeof arg!=="undefined"){Runtime.dynCall("vi",func,[arg])}else{Runtime.dynCall("v",func)}}));if(thisMainLoopId0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"SimulateInfiniteLoop"}}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:(function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++}),resume:(function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;_emscripten_set_main_loop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()}),updateStatus:(function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);var canvas=Module["canvas"];function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===canvas||document["mozPointerLockElement"]===canvas||document["webkitPointerLockElement"]===canvas||document["msPointerLockElement"]===canvas}if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",(function(ev){if(!Browser.pointerLock&&canvas.requestPointerLock){canvas.requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}canvas.style.backgroundColor="black"}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx==="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach((function(callback){callback()}));Browser.init()}return ctx}),destroyContext:(function(canvas,useWebGL,setInModule){}),fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:(function(lockPointer,resizeCanvas,vrDevice){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;Browser.vrDevice=vrDevice;if(typeof Browser.lockPointer==="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas==="undefined")Browser.resizeCanvas=false;if(typeof Browser.vrDevice==="undefined")Browser.vrDevice=null;var canvas=Module["canvas"];function fullScreenChange(){Browser.isFullScreen=false;var canvasContainer=canvas.parentNode;if((document["webkitFullScreenElement"]||document["webkitFullscreenElement"]||document["mozFullScreenElement"]||document["mozFullscreenElement"]||document["fullScreenElement"]||document["fullscreenElement"]||document["msFullScreenElement"]||document["msFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.cancelFullScreen=document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["webkitCancelFullScreen"]||document["msExitFullscreen"]||document["exitFullscreen"]||(function(){});canvas.cancelFullScreen=canvas.cancelFullScreen.bind(document);if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullScreen=true;if(Browser.resizeCanvas)Browser.setFullScreenCanvasSize()}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas)Browser.setWindowedCanvasSize()}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullScreen);Browser.updateCanvasDimensions(canvas)}if(!Browser.fullScreenHandlersInstalled){Browser.fullScreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullScreenChange,false);document.addEventListener("mozfullscreenchange",fullScreenChange,false);document.addEventListener("webkitfullscreenchange",fullScreenChange,false);document.addEventListener("MSFullscreenChange",fullScreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullScreen=canvasContainer["requestFullScreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullScreen"]?(function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null);if(vrDevice){canvasContainer.requestFullScreen({vrDisplay:vrDevice})}else{canvasContainer.requestFullScreen()}}),nextRAF:0,fakeRequestAnimationFrame:(function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){Browser.fakeRequestAnimationFrame(func)}else{if(!window.requestAnimationFrame){window.requestAnimationFrame=window["requestAnimationFrame"]||window["mozRequestAnimationFrame"]||window["webkitRequestAnimationFrame"]||window["msRequestAnimationFrame"]||window["oRequestAnimationFrame"]||Browser.fakeRequestAnimationFrame}window.requestAnimationFrame(func)}},safeCallback:(function(func){return(function(){if(!ABORT)return func.apply(null,arguments)})}),allowAsyncCallbacks:true,queuedAsyncCallbacks:[],pauseAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=false}),resumeAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=true;if(Browser.queuedAsyncCallbacks.length>0){var callbacks=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[];callbacks.forEach((function(func){func()}))}}),safeRequestAnimationFrame:(function(func){return Browser.requestAnimationFrame((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}))}),safeSetTimeout:(function(func,timeout){Module["noExitRuntime"]=true;return setTimeout((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}),timeout)}),safeSetInterval:(function(func,timeout){Module["noExitRuntime"]=true;return setInterval((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}}),timeout)}),getMimetype:(function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]}),getUserMedia:(function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)}),getMovementX:(function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0}),getMovementY:(function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0}),getMouseWheelDelta:(function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail;break;case"mousewheel":delta=event.wheelDelta;break;case"wheel":delta=event["deltaY"];break;default:throw"unrecognized mouse wheel event: "+event.type}return delta}),mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:(function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!=="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!=="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}}),xhrLoad:(function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)}),asyncLoad:(function(url,onload,onerror,noRunDep){Browser.xhrLoad(url,(function(arrayBuffer){assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(!noRunDep)removeRunDependency("al "+url)}),(function(event){if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}}));if(!noRunDep)addRunDependency("al "+url)}),resizeListeners:[],updateResizeListeners:(function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach((function(listener){listener(canvas.width,canvas.height)}))}),setCanvasSize:(function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()}),windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];flags=flags|8388608;HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=flags}Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];flags=flags&~8388608;HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=flags}Browser.updateResizeListeners()}),updateCanvasDimensions:(function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h>2]=ret}return ret}function _pthread_self(){return 0}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffer)___syscall146.buffer=[];var buffer=___syscall146.buffer;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j2147483648)return false;i=new a(newBuffer);j=new b(newBuffer);k=new c(newBuffer);l=new d(newBuffer);m=new e(newBuffer);n=new f(newBuffer);o=new g(newBuffer);p=new h(newBuffer);buffer=newBuffer;return true} // EMSCRIPTEN_START_FUNCS - function Za(a){a=a|0;var b=0;b=r;r=r+a|0;r=r+15&-16;return b|0}function _a(){return r|0}function $a(a){a=a|0;r=a}function ab(a,b){a=a|0;b=b|0;r=a;s=b}function bb(a,b){a=a|0;b=b|0;if(!w){w=a;x=b}}function cb(a){a=a|0;i[t>>0]=i[a>>0];i[t+1>>0]=i[a+1>>0];i[t+2>>0]=i[a+2>>0];i[t+3>>0]=i[a+3>>0]}function db(a){a=a|0;i[t>>0]=i[a>>0];i[t+1>>0]=i[a+1>>0];i[t+2>>0]=i[a+2>>0];i[t+3>>0]=i[a+3>>0];i[t+4>>0]=i[a+4>>0];i[t+5>>0]=i[a+5>>0];i[t+6>>0]=i[a+6>>0];i[t+7>>0]=i[a+7>>0]}function eb(a){a=a|0;L=a}function fb(){return L|0}function gb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0;o=r;r=r+576|0;l=o+48|0;h=o+32|0;g=o+16|0;f=o;j=o+64|0;m=o+60|0;i=a+4|0;n=a+8|0;if((k[i>>2]|0)>>>0>(k[n>>2]|0)>>>0){k[f>>2]=1138;k[f+4>>2]=2119;k[f+8>>2]=1117;xc(j,1084,f)|0;wc(j)|0}if((2147418112/(d>>>0)|0)>>>0<=b>>>0){k[g>>2]=1138;k[g+4>>2]=2120;k[g+8>>2]=1157;xc(j,1084,g)|0;wc(j)|0}g=k[n>>2]|0;if(g>>>0>=b>>>0){n=1;r=o;return n|0}do if(c){if(b){f=b+-1|0;if(!(f&b)){f=11;break}else b=f}else b=-1;b=b>>>16|b;b=b>>>8|b;b=b>>>4|b;b=b>>>2|b;b=(b>>>1|b)+1|0;f=10}else f=10;while(0);if((f|0)==10)if(!b){b=0;f=12}else f=11;if((f|0)==11)if(b>>>0<=g>>>0)f=12;if((f|0)==12){k[h>>2]=1138;k[h+4>>2]=2129;k[h+8>>2]=1205;xc(j,1084,h)|0;wc(j)|0}c=ha(b,d)|0;do if(!e){f=hb(k[a>>2]|0,c,m,1)|0;if(!f){n=0;r=o;return n|0}else{k[a>>2]=f;break}}else{g=ib(c,m)|0;if(!g){n=0;r=o;return n|0}Va[e&0](g,k[a>>2]|0,k[i>>2]|0);f=k[a>>2]|0;do if(f)if(!(f&7)){kb(f,0,0,1,0)|0;break}else{k[l>>2]=1138;k[l+4>>2]=2502;k[l+8>>2]=1504;xc(j,1084,l)|0;wc(j)|0;break}while(0);k[a>>2]=g}while(0);f=k[m>>2]|0;if(f>>>0>c>>>0)b=(f>>>0)/(d>>>0)|0;k[n>>2]=b;n=1;r=o;return n|0}function hb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=r;r=r+560|0;i=j+32|0;f=j+16|0;e=j;h=j+48|0;g=j+44|0;if(a&7){k[e>>2]=1138;k[e+4>>2]=2502;k[e+8>>2]=1482;xc(h,1084,e)|0;wc(h)|0;i=0;r=j;return i|0}if(b>>>0>2147418112){k[f>>2]=1138;k[f+4>>2]=2502;k[f+8>>2]=1375;xc(h,1084,f)|0;wc(h)|0;i=0;r=j;return i|0}k[g>>2]=b;d=kb(a,b,g,d,0)|0;if(c)k[c>>2]=k[g>>2];if(!(d&7)){i=d;r=j;return i|0}k[i>>2]=1138;k[i+4>>2]=2554;k[i+8>>2]=1428;xc(h,1084,i)|0;wc(h)|0;i=d;r=j;return i|0}function ib(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;i=r;r=r+560|0;h=i+32|0;g=i+16|0;c=i;f=i+48|0;e=i+44|0;d=a+3&-4;d=(d|0)!=0?d:4;if(d>>>0>2147418112){k[c>>2]=1138;k[c+4>>2]=2502;k[c+8>>2]=1375;xc(f,1084,c)|0;wc(f)|0;h=0;r=i;return h|0}k[e>>2]=d;c=kb(0,d,e,1,0)|0;a=k[e>>2]|0;if(b)k[b>>2]=a;if((c|0)==0|a>>>0>>0){k[g>>2]=1138;k[g+4>>2]=2502;k[g+8>>2]=1401;xc(f,1084,g)|0;wc(f)|0;h=0;r=i;return h|0}if(!(c&7)){h=c;r=i;return h|0}k[h>>2]=1138;k[h+4>>2]=2529;k[h+8>>2]=1428;xc(f,1084,h)|0;wc(f)|0;h=c;r=i;return h|0}function jb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;L=r;r=r+880|0;I=L+144|0;H=L+128|0;G=L+112|0;F=L+96|0;C=L+80|0;w=L+64|0;u=L+48|0;v=L+32|0;q=L+16|0;p=L;E=L+360|0;J=L+296|0;K=L+224|0;t=L+156|0;if((b|0)==0|d>>>0>11){a=0;r=L;return a|0}k[a>>2]=b;e=K;f=e+68|0;do{k[e>>2]=0;e=e+4|0}while((e|0)<(f|0));f=0;do{e=i[c+f>>0]|0;if(e<<24>>24){D=K+((e&255)<<2)|0;k[D>>2]=(k[D>>2]|0)+1}f=f+1|0}while((f|0)!=(b|0));f=0;o=1;g=0;h=-1;n=0;while(1){e=k[K+(o<<2)>>2]|0;if(!e)k[a+28+(o+-1<<2)>>2]=0;else{D=o+-1|0;k[J+(D<<2)>>2]=f;f=e+f|0;B=16-o|0;k[a+28+(D<<2)>>2]=(f+-1<>2]=n;k[t+(o<<2)>>2]=n;g=g>>>0>o>>>0?g:o;h=h>>>0>>0?h:o;n=e+n|0}o=o+1|0;if((o|0)==17){D=g;break}else f=f<<1}k[a+4>>2]=n;f=a+172|0;do if(n>>>0>(k[f>>2]|0)>>>0){k[f>>2]=n;if(n){e=n+-1|0;if(e&n)s=14}else{e=-1;s=14}if((s|0)==14){B=e>>>16|e;B=B>>>8|B;B=B>>>4|B;B=B>>>2|B;B=(B>>>1|B)+1|0;k[f>>2]=B>>>0>b>>>0?b:B}g=a+176|0;e=k[g>>2]|0;do if(e){B=k[e+-4>>2]|0;e=e+-8|0;if(!((B|0)!=0?(B|0)==(~k[e>>2]|0):0)){k[p>>2]=1138;k[p+4>>2]=647;k[p+8>>2]=1851;xc(E,1084,p)|0;wc(E)|0}if(!(e&7)){kb(e,0,0,1,0)|0;break}else{k[q>>2]=1138;k[q+4>>2]=2502;k[q+8>>2]=1504;xc(E,1084,q)|0;wc(E)|0;break}}while(0);f=k[f>>2]|0;f=(f|0)!=0?f:1;e=ib((f<<1)+8|0,0)|0;if(!e){k[g>>2]=0;e=0;break}else{k[e+4>>2]=f;k[e>>2]=~f;k[g>>2]=e+8;s=25;break}}else s=25;while(0);a:do if((s|0)==25){B=a+24|0;i[B>>0]=h;i[a+25>>0]=D;f=a+176|0;g=0;do{A=i[c+g>>0]|0;e=A&255;if(A<<24>>24){if(!(k[K+(e<<2)>>2]|0)){k[v>>2]=1138;k[v+4>>2]=2272;k[v+8>>2]=1249;xc(E,1084,v)|0;wc(E)|0}A=t+(e<<2)|0;e=k[A>>2]|0;k[A>>2]=e+1;if(e>>>0>=n>>>0){k[u>>2]=1138;k[u+4>>2]=2276;k[u+8>>2]=1262;xc(E,1084,u)|0;wc(E)|0}j[(k[f>>2]|0)+(e<<1)>>1]=g}g=g+1|0}while((g|0)!=(b|0));e=i[B>>0]|0;z=(e&255)>>>0>>0?d:0;A=a+8|0;k[A>>2]=z;y=(z|0)!=0;if(y){x=1<>>0>(k[e>>2]|0)>>>0){k[e>>2]=x;g=a+168|0;e=k[g>>2]|0;do if(e){v=k[e+-4>>2]|0;e=e+-8|0;if(!((v|0)!=0?(v|0)==(~k[e>>2]|0):0)){k[w>>2]=1138;k[w+4>>2]=647;k[w+8>>2]=1851;xc(E,1084,w)|0;wc(E)|0}if(!(e&7)){kb(e,0,0,1,0)|0;break}else{k[C>>2]=1138;k[C+4>>2]=2502;k[C+8>>2]=1504;xc(E,1084,C)|0;wc(E)|0;break}}while(0);e=x<<2;f=ib(e+8|0,0)|0;if(!f){k[g>>2]=0;e=0;break a}else{C=f+8|0;k[f+4>>2]=x;k[f>>2]=~x;k[g>>2]=C;f=C;break}}else{f=a+168|0;e=x<<2;g=f;f=k[f>>2]|0}while(0);_c(f|0,-1,e|0)|0;t=a+176|0;w=1;do{if(k[K+(w<<2)>>2]|0){u=z-w|0;v=1<>2]|0;if(f>>>0>=16){k[F>>2]=1138;k[F+4>>2]=1956;k[F+8>>2]=1725;xc(E,1084,F)|0;wc(E)|0}e=k[a+28+(f<<2)>>2]|0;if(!e)b=-1;else b=(e+-1|0)>>>(16-w|0);if(h>>>0<=b>>>0){q=(k[a+96+(f<<2)>>2]|0)-h|0;s=w<<16;do{e=m[(k[t>>2]|0)+(q+h<<1)>>1]|0;if((l[c+e>>0]|0|0)!=(w|0)){k[G>>2]=1138;k[G+4>>2]=2318;k[G+8>>2]=1291;xc(E,1084,G)|0;wc(E)|0}p=h<>>0>=x>>>0){k[H>>2]=1138;k[H+4>>2]=2324;k[H+8>>2]=1325;xc(E,1084,H)|0;wc(E)|0}e=k[g>>2]|0;if((k[e+(n<<2)>>2]|0)!=-1){k[I>>2]=1138;k[I+4>>2]=2326;k[I+8>>2]=1348;xc(E,1084,I)|0;wc(E)|0;e=k[g>>2]|0}k[e+(n<<2)>>2]=f;o=o+1|0}while(o>>>0>>0);h=h+1|0}while(h>>>0<=b>>>0)}}w=w+1|0}while(z>>>0>=w>>>0);e=i[B>>0]|0}f=a+96|0;k[f>>2]=(k[f>>2]|0)-(k[J>>2]|0);f=a+100|0;k[f>>2]=(k[f>>2]|0)-(k[J+4>>2]|0);f=a+104|0;k[f>>2]=(k[f>>2]|0)-(k[J+8>>2]|0);f=a+108|0;k[f>>2]=(k[f>>2]|0)-(k[J+12>>2]|0);f=a+112|0;k[f>>2]=(k[f>>2]|0)-(k[J+16>>2]|0);f=a+116|0;k[f>>2]=(k[f>>2]|0)-(k[J+20>>2]|0);f=a+120|0;k[f>>2]=(k[f>>2]|0)-(k[J+24>>2]|0);f=a+124|0;k[f>>2]=(k[f>>2]|0)-(k[J+28>>2]|0);f=a+128|0;k[f>>2]=(k[f>>2]|0)-(k[J+32>>2]|0);f=a+132|0;k[f>>2]=(k[f>>2]|0)-(k[J+36>>2]|0);f=a+136|0;k[f>>2]=(k[f>>2]|0)-(k[J+40>>2]|0);f=a+140|0;k[f>>2]=(k[f>>2]|0)-(k[J+44>>2]|0);f=a+144|0;k[f>>2]=(k[f>>2]|0)-(k[J+48>>2]|0);f=a+148|0;k[f>>2]=(k[f>>2]|0)-(k[J+52>>2]|0);f=a+152|0;k[f>>2]=(k[f>>2]|0)-(k[J+56>>2]|0);f=a+156|0;k[f>>2]=(k[f>>2]|0)-(k[J+60>>2]|0);f=a+16|0;k[f>>2]=0;g=a+20|0;k[g>>2]=e&255;b:do if(y){while(1){if(!d)break b;e=d+-1|0;if(!(k[K+(d<<2)>>2]|0))d=e;else break}k[f>>2]=k[a+28+(e<<2)>>2];e=z+1|0;k[g>>2]=e;if(e>>>0<=D>>>0){while(1){if(k[K+(e<<2)>>2]|0)break;e=e+1|0;if(e>>>0>D>>>0)break b}k[g>>2]=e}}while(0);k[a+92>>2]=-1;k[a+160>>2]=1048575;k[a+12>>2]=32-(k[A>>2]|0);e=1}while(0);a=e;r=L;return a|0}function kb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;do if(!a){d=Rc(b)|0;if(c){if(!d)a=0;else a=Uc(d)|0;k[c>>2]=a}}else{if(!b){Sc(a);if(!c){d=0;break}k[c>>2]=0;d=0;break}if(d){d=Tc(a,b)|0;a=(d|0)==0?a:d}else d=0;if(c){b=Uc(a)|0;k[c>>2]=b}}while(0);return d|0}function lb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if(!((a|0)!=0&b>>>0>73&(c|0)!=0)){c=0;return c|0}if((k[c>>2]|0)!=40|b>>>0<74){c=0;return c|0}if(((l[a>>0]|0)<<8|(l[a+1>>0]|0)|0)!=18552){c=0;return c|0}if(((l[a+2>>0]|0)<<8|(l[a+3>>0]|0))>>>0<74){c=0;return c|0}if(((l[a+7>>0]|0)<<16|(l[a+6>>0]|0)<<24|(l[a+8>>0]|0)<<8|(l[a+9>>0]|0))>>>0>b>>>0){c=0;return c|0}k[c+4>>2]=(l[a+12>>0]|0)<<8|(l[a+13>>0]|0);k[c+8>>2]=(l[a+14>>0]|0)<<8|(l[a+15>>0]|0);k[c+12>>2]=l[a+16>>0];k[c+16>>2]=l[a+17>>0];b=a+18|0;d=c+32|0;k[d>>2]=l[b>>0];k[d+4>>2]=0;b=i[b>>0]|0;k[c+20>>2]=b<<24>>24==0|b<<24>>24==9?8:16;k[c+24>>2]=(l[a+26>>0]|0)<<16|(l[a+25>>0]|0)<<24|(l[a+27>>0]|0)<<8|(l[a+28>>0]|0);k[c+28>>2]=(l[a+30>>0]|0)<<16|(l[a+29>>0]|0)<<24|(l[a+31>>0]|0)<<8|(l[a+32>>0]|0);c=1;return c|0}function mb(a){a=a|0;Oa(a|0)|0;Rb()}function nb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;f=r;r=r+528|0;e=f;d=f+16|0;b=k[a+20>>2]|0;if(b)ob(b);b=a+4|0;c=k[b>>2]|0;if(!c){e=a+16|0;i[e>>0]=0;r=f;return}if(!(c&7))kb(c,0,0,1,0)|0;else{k[e>>2]=1138;k[e+4>>2]=2502;k[e+8>>2]=1504;xc(d,1084,e)|0;wc(d)|0}k[b>>2]=0;k[a+8>>2]=0;k[a+12>>2]=0;e=a+16|0;i[e>>0]=0;r=f;return}function ob(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;i=r;r=r+592|0;g=i+64|0;f=i+48|0;h=i+32|0;d=i+16|0;c=i;e=i+80|0;if(!a){r=i;return}b=k[a+168>>2]|0;do if(b){j=k[b+-4>>2]|0;b=b+-8|0;if(!((j|0)!=0?(j|0)==(~k[b>>2]|0):0)){k[c>>2]=1138;k[c+4>>2]=647;k[c+8>>2]=1851;xc(e,1084,c)|0;wc(e)|0}if(!(b&7)){kb(b,0,0,1,0)|0;break}else{k[d>>2]=1138;k[d+4>>2]=2502;k[d+8>>2]=1504;xc(e,1084,d)|0;wc(e)|0;break}}while(0);b=k[a+176>>2]|0;do if(b){j=k[b+-4>>2]|0;b=b+-8|0;if(!((j|0)!=0?(j|0)==(~k[b>>2]|0):0)){k[h>>2]=1138;k[h+4>>2]=647;k[h+8>>2]=1851;xc(e,1084,h)|0;wc(e)|0}if(!(b&7)){kb(b,0,0,1,0)|0;break}else{k[f>>2]=1138;k[f+4>>2]=2502;k[f+8>>2]=1504;xc(e,1084,f)|0;wc(e)|0;break}}while(0);if(!(a&7)){kb(a,0,0,1,0)|0;r=i;return}else{k[g>>2]=1138;k[g+4>>2]=2502;k[g+8>>2]=1504;xc(e,1084,g)|0;wc(e)|0;r=i;return}}function pb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;i=r;r=r+544|0;g=i+16|0;b=i;f=i+32|0;e=a+8|0;c=k[e>>2]|0;if((c+-1|0)>>>0>=8192){k[b>>2]=1138;k[b+4>>2]=3002;k[b+8>>2]=1529;xc(f,1084,b)|0;wc(f)|0}k[a>>2]=c;d=a+20|0;b=k[d>>2]|0;if(!b){b=ib(180,0)|0;if(!b)b=0;else{h=b+164|0;k[h>>2]=0;k[h+4>>2]=0;k[h+8>>2]=0;k[h+12>>2]=0}k[d>>2]=b;h=k[a>>2]|0}else h=c;if(!(k[e>>2]|0)){k[g>>2]=1138;k[g+4>>2]=906;k[g+8>>2]=1769;xc(f,1084,g)|0;wc(f)|0;g=k[a>>2]|0}else g=h;f=k[a+4>>2]|0;if(g>>>0>16){d=g;c=0}else{a=0;a=jb(b,h,f,a)|0;r=i;return a|0}while(1){e=c+1|0;if(d>>>0>3){d=d>>>1;c=e}else{d=e;break}}a=c+2+((d|0)!=32&1<>>0>>0&1)|0;a=a>>>0<11?a&255:11;a=jb(b,h,f,a)|0;r=i;return a|0}function qb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=r;r=r+720|0;z=E+160|0;y=E+144|0;x=E+128|0;w=E+112|0;v=E+96|0;u=E+80|0;t=E+64|0;s=E+48|0;n=E+32|0;h=E+16|0;e=E;C=E+200|0;D=E+176|0;A=rb(a,14)|0;if(!A){k[b>>2]=0;c=b+4|0;d=k[c>>2]|0;if(d){if(!(d&7))kb(d,0,0,1,0)|0;else{k[e>>2]=1138;k[e+4>>2]=2502;k[e+8>>2]=1504;xc(C,1084,e)|0;wc(C)|0}k[c>>2]=0;k[b+8>>2]=0;k[b+12>>2]=0}i[b+16>>0]=0;c=b+20|0;d=k[c>>2]|0;if(!d){b=1;r=E;return b|0}ob(d);k[c>>2]=0;b=1;r=E;return b|0}p=b+4|0;q=b+8|0;c=k[q>>2]|0;if((c|0)!=(A|0)){if(c>>>0<=A>>>0){do if((k[b+12>>2]|0)>>>0>>0){if(gb(p,A,(c+1|0)==(A|0),1,0)|0){c=k[q>>2]|0;break}i[b+16>>0]=1;b=0;r=E;return b|0}while(0);_c((k[p>>2]|0)+c|0,0,A-c|0)|0}k[q>>2]=A}_c(k[p>>2]|0,0,A|0)|0;o=a+20|0;c=k[o>>2]|0;if((c|0)<5){f=a+4|0;g=a+8|0;e=a+16|0;do{d=k[f>>2]|0;if((d|0)==(k[g>>2]|0))d=0;else{k[f>>2]=d+1;d=l[d>>0]|0}c=c+8|0;k[o>>2]=c;if((c|0)>=33){k[h>>2]=1138;k[h+4>>2]=3204;k[h+8>>2]=1638;xc(C,1084,h)|0;wc(C)|0;c=k[o>>2]|0}d=d<<32-c|k[e>>2];k[e>>2]=d}while((c|0)<5)}else{d=a+16|0;e=d;d=k[d>>2]|0}m=d>>>27;k[e>>2]=d<<5;k[o>>2]=c+-5;if((m+-1|0)>>>0>20){b=0;r=E;return b|0}k[D+20>>2]=0;k[D>>2]=0;k[D+4>>2]=0;k[D+8>>2]=0;k[D+12>>2]=0;i[D+16>>0]=0;c=D+4|0;d=D+8|0;a:do if(gb(c,21,0,1,0)|0){h=k[d>>2]|0;j=k[c>>2]|0;_c(j+h|0,0,21-h|0)|0;k[d>>2]=21;if(m){e=a+4|0;f=a+8|0;g=a+16|0;h=0;do{c=k[o>>2]|0;if((c|0)<3)do{d=k[e>>2]|0;if((d|0)==(k[f>>2]|0))d=0;else{k[e>>2]=d+1;d=l[d>>0]|0}c=c+8|0;k[o>>2]=c;if((c|0)>=33){k[n>>2]=1138;k[n+4>>2]=3204;k[n+8>>2]=1638;xc(C,1084,n)|0;wc(C)|0;c=k[o>>2]|0}d=d<<32-c|k[g>>2];k[g>>2]=d}while((c|0)<3);else d=k[g>>2]|0;k[g>>2]=d<<3;k[o>>2]=c+-3;i[j+(l[1599+h>>0]|0)>>0]=d>>>29;h=h+1|0}while((h|0)!=(m|0))}if(pb(D)|0){m=a+4|0;h=a+8|0;j=a+16|0;d=0;b:while(1){g=A-d|0;c=sb(a,D)|0;c:do if(c>>>0<17){if((k[q>>2]|0)>>>0<=d>>>0){k[s>>2]=1138;k[s+4>>2]=906;k[s+8>>2]=1769;xc(C,1084,s)|0;wc(C)|0}i[(k[p>>2]|0)+d>>0]=c;c=d+1|0}else switch(c|0){case 17:{c=k[o>>2]|0;if((c|0)<3)do{e=k[m>>2]|0;if((e|0)==(k[h>>2]|0))e=0;else{k[m>>2]=e+1;e=l[e>>0]|0}c=c+8|0;k[o>>2]=c;if((c|0)>=33){k[t>>2]=1138;k[t+4>>2]=3204;k[t+8>>2]=1638;xc(C,1084,t)|0;wc(C)|0;c=k[o>>2]|0}e=e<<32-c|k[j>>2];k[j>>2]=e}while((c|0)<3);else e=k[j>>2]|0;k[j>>2]=e<<3;k[o>>2]=c+-3;c=(e>>>29)+3|0;if(c>>>0>g>>>0){c=0;break a}c=c+d|0;break c}case 18:{c=k[o>>2]|0;if((c|0)<7)do{e=k[m>>2]|0;if((e|0)==(k[h>>2]|0))e=0;else{k[m>>2]=e+1;e=l[e>>0]|0}c=c+8|0;k[o>>2]=c;if((c|0)>=33){k[u>>2]=1138;k[u+4>>2]=3204;k[u+8>>2]=1638;xc(C,1084,u)|0;wc(C)|0;c=k[o>>2]|0}e=e<<32-c|k[j>>2];k[j>>2]=e}while((c|0)<7);else e=k[j>>2]|0;k[j>>2]=e<<7;k[o>>2]=c+-7;c=(e>>>25)+11|0;if(c>>>0>g>>>0){c=0;break a}c=c+d|0;break c}default:{if((c+-19|0)>>>0>=2){B=90;break b}f=k[o>>2]|0;if((c|0)==19){if((f|0)<2){e=f;while(1){c=k[m>>2]|0;if((c|0)==(k[h>>2]|0))f=0;else{k[m>>2]=c+1;f=l[c>>0]|0}c=e+8|0;k[o>>2]=c;if((c|0)>=33){k[v>>2]=1138;k[v+4>>2]=3204;k[v+8>>2]=1638;xc(C,1084,v)|0;wc(C)|0;c=k[o>>2]|0}e=f<<32-c|k[j>>2];k[j>>2]=e;if((c|0)<2)e=c;else break}}else{e=k[j>>2]|0;c=f}k[j>>2]=e<<2;k[o>>2]=c+-2;f=(e>>>30)+3|0}else{if((f|0)<6){e=f;while(1){c=k[m>>2]|0;if((c|0)==(k[h>>2]|0))f=0;else{k[m>>2]=c+1;f=l[c>>0]|0}c=e+8|0;k[o>>2]=c;if((c|0)>=33){k[w>>2]=1138;k[w+4>>2]=3204;k[w+8>>2]=1638;xc(C,1084,w)|0;wc(C)|0;c=k[o>>2]|0}e=f<<32-c|k[j>>2];k[j>>2]=e;if((c|0)<6)e=c;else break}}else{e=k[j>>2]|0;c=f}k[j>>2]=e<<6;k[o>>2]=c+-6;f=(e>>>26)+7|0}if((d|0)==0|f>>>0>g>>>0){c=0;break a}c=d+-1|0;if((k[q>>2]|0)>>>0<=c>>>0){k[x>>2]=1138;k[x+4>>2]=906;k[x+8>>2]=1769;xc(C,1084,x)|0;wc(C)|0}e=i[(k[p>>2]|0)+c>>0]|0;if(!(e<<24>>24)){c=0;break a}c=f+d|0;if(d>>>0>=c>>>0){c=d;break c}do{if((k[q>>2]|0)>>>0<=d>>>0){k[y>>2]=1138;k[y+4>>2]=906;k[y+8>>2]=1769;xc(C,1084,y)|0;wc(C)|0}i[(k[p>>2]|0)+d>>0]=e;d=d+1|0}while((d|0)!=(c|0))}}while(0);if(A>>>0>c>>>0)d=c;else break}if((B|0)==90){k[z>>2]=1138;k[z+4>>2]=3145;k[z+8>>2]=1620;xc(C,1084,z)|0;wc(C)|0;c=0;break}if((A|0)==(c|0))c=pb(b)|0;else c=0}else c=0}else{i[D+16>>0]=1;c=0}while(0);nb(D);b=c;r=E;return b|0}function rb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=r;r=r+528|0;g=j;f=j+16|0;if(!b){i=0;r=j;return i|0}if(b>>>0<=16){i=tb(a,b)|0;r=j;return i|0}h=tb(a,b+-16|0)|0;i=a+20|0;b=k[i>>2]|0;if((b|0)<16){d=a+4|0;e=a+8|0;c=a+16|0;do{a=k[d>>2]|0;if((a|0)==(k[e>>2]|0))a=0;else{k[d>>2]=a+1;a=l[a>>0]|0}b=b+8|0;k[i>>2]=b;if((b|0)>=33){k[g>>2]=1138;k[g+4>>2]=3204;k[g+8>>2]=1638;xc(f,1084,g)|0;wc(f)|0;b=k[i>>2]|0}a=a<<32-b|k[c>>2];k[c>>2]=a}while((b|0)<16)}else{a=a+16|0;c=a;a=k[a>>2]|0}k[c>>2]=a<<16;k[i>>2]=b+-16;i=a>>>16|h<<16;r=j;return i|0}function sb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,n=0,o=0,p=0,q=0,s=0,t=0;t=r;r=r+576|0;o=t+48|0;n=t+32|0;j=t+16|0;i=t;q=t+64|0;p=k[b+20>>2]|0;s=a+20|0;h=k[s>>2]|0;do if((h|0)<24){g=a+4|0;d=k[g>>2]|0;e=k[a+8>>2]|0;c=d>>>0>>0;if((h|0)>=16){if(c){k[g>>2]=d+1;c=l[d>>0]|0}else c=0;k[s>>2]=h+8;g=a+16|0;f=c<<24-h|k[g>>2];k[g>>2]=f;break}if(c){f=(l[d>>0]|0)<<8;c=d+1|0}else{f=0;c=d}if(c>>>0>>0){d=l[c>>0]|0;c=c+1|0}else d=0;k[g>>2]=c;k[s>>2]=h+16;g=a+16|0;f=(d|f)<<16-h|k[g>>2];k[g>>2]=f}else{f=a+16|0;g=f;f=k[f>>2]|0}while(0);e=(f>>>16)+1|0;do if(e>>>0<=(k[p+16>>2]|0)>>>0){d=k[(k[p+168>>2]|0)+(f>>>(32-(k[p+8>>2]|0)|0)<<2)>>2]|0;if((d|0)==-1){k[i>>2]=1138;k[i+4>>2]=3249;k[i+8>>2]=1665;xc(q,1084,i)|0;wc(q)|0}c=d&65535;d=d>>>16;if((k[b+8>>2]|0)>>>0<=c>>>0){k[j>>2]=1138;k[j+4>>2]=905;k[j+8>>2]=1769;xc(q,1084,j)|0;wc(q)|0}if((l[(k[b+4>>2]|0)+c>>0]|0|0)!=(d|0)){k[n>>2]=1138;k[n+4>>2]=3253;k[n+8>>2]=1682;xc(q,1084,n)|0;wc(q)|0}}else{d=k[p+20>>2]|0;while(1){c=d+-1|0;if(e>>>0>(k[p+28+(c<<2)>>2]|0)>>>0)d=d+1|0;else break}c=(f>>>(32-d|0))+(k[p+96+(c<<2)>>2]|0)|0;if(c>>>0<(k[b>>2]|0)>>>0){c=m[(k[p+176>>2]|0)+(c<<1)>>1]|0;break}k[o>>2]=1138;k[o+4>>2]=3271;k[o+8>>2]=1620;xc(q,1084,o)|0;wc(q)|0;s=0;r=t;return s|0}while(0);k[g>>2]=k[g>>2]<>2]=(k[s>>2]|0)-d;s=c;r=t;return s|0}function tb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=r;r=r+544|0;h=j+16|0;c=j;g=j+32|0;if(b>>>0>=33){k[c>>2]=1138;k[c+4>>2]=3195;k[c+8>>2]=1622;xc(g,1084,c)|0;wc(g)|0}i=a+20|0;c=k[i>>2]|0;if((c|0)>=(b|0)){e=a+16|0;f=e;e=k[e>>2]|0;g=c;h=32-b|0;h=e>>>h;e=e<>2]=e;b=g-b|0;k[i>>2]=b;r=j;return h|0}e=a+4|0;f=a+8|0;d=a+16|0;do{a=k[e>>2]|0;if((a|0)==(k[f>>2]|0))a=0;else{k[e>>2]=a+1;a=l[a>>0]|0}c=c+8|0;k[i>>2]=c;if((c|0)>=33){k[h>>2]=1138;k[h+4>>2]=3204;k[h+8>>2]=1638;xc(g,1084,h)|0;wc(g)|0;c=k[i>>2]|0}a=a<<32-c|k[d>>2];k[d>>2]=a}while((c|0)<(b|0));h=32-b|0;h=a>>>h;g=a<>2]=g;b=c-b|0;k[i>>2]=b;r=j;return h|0}function ub(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0;q=r;r=r+528|0;o=q;n=q+16|0;if((a|0)==0|b>>>0<62){p=0;r=q;return p|0}m=ib(300,0)|0;if(!m){p=0;r=q;return p|0}k[m>>2]=519686845;c=m+4|0;k[c>>2]=0;d=m+8|0;k[d>>2]=0;j=m+88|0;e=m+136|0;f=m+160|0;g=j;h=g+44|0;do{k[g>>2]=0;g=g+4|0}while((g|0)<(h|0));i[j+44>>0]=0;s=m+184|0;g=m+208|0;h=m+232|0;t=m+252|0;k[t>>2]=0;k[t+4>>2]=0;k[t+8>>2]=0;i[t+12>>0]=0;t=m+268|0;k[t>>2]=0;k[t+4>>2]=0;k[t+8>>2]=0;i[t+12>>0]=0;t=m+284|0;k[t>>2]=0;k[t+4>>2]=0;k[t+8>>2]=0;i[t+12>>0]=0;k[e>>2]=0;k[e+4>>2]=0;k[e+8>>2]=0;k[e+12>>2]=0;k[e+16>>2]=0;i[e+20>>0]=0;k[f>>2]=0;k[f+4>>2]=0;k[f+8>>2]=0;k[f+12>>2]=0;k[f+16>>2]=0;i[f+20>>0]=0;k[s>>2]=0;k[s+4>>2]=0;k[s+8>>2]=0;k[s+12>>2]=0;k[s+16>>2]=0;i[s+20>>0]=0;k[g>>2]=0;k[g+4>>2]=0;k[g+8>>2]=0;k[g+12>>2]=0;k[g+16>>2]=0;i[g+20>>0]=0;k[h>>2]=0;k[h+4>>2]=0;k[h+8>>2]=0;k[h+12>>2]=0;i[h+16>>0]=0;do if(((b>>>0>=74?((l[a>>0]|0)<<8|(l[a+1>>0]|0)|0)==18552:0)?((l[a+2>>0]|0)<<8|(l[a+3>>0]|0))>>>0>=74:0)?((l[a+7>>0]|0)<<16|(l[a+6>>0]|0)<<24|(l[a+8>>0]|0)<<8|(l[a+9>>0]|0))>>>0<=b>>>0:0){k[j>>2]=a;k[c>>2]=a;k[d>>2]=b;if(Db(m)|0){c=k[j>>2]|0;if((l[c+39>>0]|0)<<8|(l[c+40>>0]|0)){if(!(Eb(m)|0))break;if(!(Fb(m)|0))break;c=k[j>>2]|0}if(!((l[c+55>>0]|0)<<8|(l[c+56>>0]|0))){t=m;r=q;return t|0}if(Gb(m)|0?Hb(m)|0:0){t=m;r=q;return t|0}}}else p=7;while(0);if((p|0)==7)k[j>>2]=0;Mb(m);if(!(m&7)){kb(m,0,0,1,0)|0;t=0;r=q;return t|0}else{k[o>>2]=1138;k[o+4>>2]=2502;k[o+8>>2]=1504;xc(n,1084,o)|0;wc(n)|0;t=0;r=q;return t|0}return 0}function vb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,m=0;m=r;r=r+528|0;j=m;i=m+16|0;f=k[a+88>>2]|0;h=(l[f+70+(e<<2)+1>>0]|0)<<16|(l[f+70+(e<<2)>>0]|0)<<24|(l[f+70+(e<<2)+2>>0]|0)<<8|(l[f+70+(e<<2)+3>>0]|0);g=e+1|0;if(g>>>0<(l[f+16>>0]|0)>>>0)f=(l[f+70+(g<<2)+1>>0]|0)<<16|(l[f+70+(g<<2)>>0]|0)<<24|(l[f+70+(g<<2)+2>>0]|0)<<8|(l[f+70+(g<<2)+3>>0]|0);else f=k[a+8>>2]|0;if(f>>>0>h>>>0){i=a+4|0;i=k[i>>2]|0;i=i+h|0;j=f-h|0;j=wb(a,i,j,b,c,d,e)|0;r=m;return j|0}k[j>>2]=1138;k[j+4>>2]=3690;k[j+8>>2]=1780;xc(i,1084,j)|0;wc(i)|0;i=a+4|0;i=k[i>>2]|0;i=i+h|0;j=f-h|0;j=wb(a,i,j,b,c,d,e)|0;r=m;return j|0}function wb(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,m=0,n=0;n=k[a+88>>2]|0;j=((l[n+12>>0]|0)<<8|(l[n+13>>0]|0))>>>g;m=((l[n+14>>0]|0)<<8|(l[n+15>>0]|0))>>>g;j=j>>>0>1?(j+3|0)>>>2:1;m=m>>>0>1?(m+3|0)>>>2:1;n=n+18|0;g=i[n>>0]|0;g=ha(g<<24>>24==0|g<<24>>24==9?8:16,j)|0;if(f)if((f&3|0)==0&g>>>0<=f>>>0)g=f;else{a=0;return a|0}if((ha(g,m)|0)>>>0>e>>>0){a=0;return a|0}f=(j+1|0)>>>1;h=(m+1|0)>>>1;if(!c){a=0;return a|0}k[a+92>>2]=b;k[a+96>>2]=b;k[a+104>>2]=c;k[a+100>>2]=b+c;k[a+108>>2]=0;k[a+112>>2]=0;switch(l[n>>0]|0|0){case 0:{Ib(a,d,e,g,j,m,f,h)|0;a=1;return a|0}case 4:case 6:case 5:case 3:case 2:{Jb(a,d,e,g,j,m,f,h)|0;a=1;return a|0}case 9:{Kb(a,d,e,g,j,m,f,h)|0;a=1;return a|0}case 8:case 7:{Lb(a,d,e,g,j,m,f,h)|0;a=1;return a|0}default:{a=0;return a|0}}return 0}function xb(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+48|0;c=d;k[c>>2]=40;lb(a,b,c)|0;r=d;return k[c+4>>2]|0}function yb(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+48|0;c=d;k[c>>2]=40;lb(a,b,c)|0;r=d;return k[c+8>>2]|0}function zb(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+48|0;c=d;k[c>>2]=40;lb(a,b,c)|0;r=d;return k[c+12>>2]|0}function Ab(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+48|0;c=d;k[c>>2]=40;lb(a,b,c)|0;r=d;return k[c+32>>2]|0}function Bb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;g=r;r=r+576|0;e=g+40|0;d=g+56|0;h=g;k[h>>2]=40;lb(a,b,h)|0;b=((k[h+4>>2]|0)+3|0)>>>2;c=((k[h+8>>2]|0)+3|0)>>>2;h=h+32|0;a=k[h+4>>2]|0;do switch(k[h>>2]|0){case 0:{if(!a)a=8;else f=14;break}case 1:{if(!a)f=13;else f=14;break}case 2:{if(!a)f=13;else f=14;break}case 3:{if(!a)f=13;else f=14;break}case 4:{if(!a)f=13;else f=14;break}case 5:{if(!a)f=13;else f=14;break}case 6:{if(!a)f=13;else f=14;break}case 7:{if(!a)f=13;else f=14;break}case 8:{if(!a)f=13;else f=14;break}case 9:{if(!a)a=8;else f=14;break}case 10:{if(!a)a=8;else f=14;break}default:f=14}while(0);if((f|0)==13)a=16;else if((f|0)==14){k[e>>2]=1138;k[e+4>>2]=2668;k[e+8>>2]=1523;xc(d,1084,e)|0;wc(d)|0;a=0}h=ha(ha(c,b)|0,a)|0;r=g;return h|0}function Cb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0;m=r;r=r+592|0;l=m+56|0;f=m+40|0;i=m+72|0;n=m;j=m+68|0;k[n>>2]=40;lb(a,b,n)|0;g=((k[n+4>>2]|0)+3|0)>>>2;n=n+32|0;e=k[n+4>>2]|0;do switch(k[n>>2]|0){case 0:{if(!e)e=8;else h=14;break}case 1:{if(!e)h=13;else h=14;break}case 2:{if(!e)h=13;else h=14;break}case 3:{if(!e)h=13;else h=14;break}case 4:{if(!e)h=13;else h=14;break}case 5:{if(!e)h=13;else h=14;break}case 6:{if(!e)h=13;else h=14;break}case 7:{if(!e)h=13;else h=14;break}case 8:{if(!e)h=13;else h=14;break}case 9:{if(!e)e=8;else h=14;break}case 10:{if(!e)e=8;else h=14;break}default:h=14}while(0);if((h|0)==13)e=16;else if((h|0)==14){k[f>>2]=1138;k[f+4>>2]=2668;k[f+8>>2]=1523;xc(i,1084,f)|0;wc(i)|0;e=0}g=ha(e,g)|0;f=ub(a,b)|0;k[j>>2]=c;e=(f|0)==0;if(!(d>>>0<8|e)?(k[f>>2]|0)==519686845:0)vb(f,j,d,g,0)|0;if(e){r=m;return}if((k[f>>2]|0)!=519686845){r=m;return}Mb(f);if(!(f&7)){kb(f,0,0,1,0)|0;r=m;return}else{k[l>>2]=1138;k[l+4>>2]=2502;k[l+8>>2]=1504;xc(i,1084,l)|0;wc(i)|0;r=m;return}}function Db(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;g=a+92|0;d=k[a+4>>2]|0;f=a+88|0;e=k[f>>2]|0;b=(l[e+68>>0]|0)<<8|(l[e+67>>0]|0)<<16|(l[e+69>>0]|0);c=d+b|0;e=(l[e+65>>0]|0)<<8|(l[e+66>>0]|0);if(!e){a=0;return a|0}k[g>>2]=c;k[a+96>>2]=c;k[a+104>>2]=e;k[a+100>>2]=d+(e+b);k[a+108>>2]=0;k[a+112>>2]=0;if(!(qb(g,a+116|0)|0)){a=0;return a|0}b=k[f>>2]|0;do if(!((l[b+39>>0]|0)<<8|(l[b+40>>0]|0))){if(!((l[b+55>>0]|0)<<8|(l[b+56>>0]|0))){a=0;return a|0}}else{if(!(qb(g,a+140|0)|0)){a=0;return a|0}if(qb(g,a+188|0)|0){b=k[f>>2]|0;break}else{a=0;return a|0}}while(0);if((l[b+55>>0]|0)<<8|(l[b+56>>0]|0)){if(!(qb(g,a+164|0)|0)){a=0;return a|0}if(!(qb(g,a+212|0)|0)){a=0;return a|0}}a=1;return a|0}function Eb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0;q=r;r=r+576|0;h=q;g=q+64|0;p=q+16|0;d=a+88|0;b=k[d>>2]|0;o=(l[b+39>>0]|0)<<8|(l[b+40>>0]|0);m=a+236|0;f=a+240|0;c=k[f>>2]|0;if((c|0)!=(o|0)){if(c>>>0<=o>>>0){do if((k[a+244>>2]|0)>>>0>>0){if(gb(m,o,(c+1|0)==(o|0),4,0)|0){b=k[f>>2]|0;break}i[a+248>>0]=1;p=0;r=q;return p|0}else b=c;while(0);_c((k[m>>2]|0)+(b<<2)|0,0,o-b<<2|0)|0;b=k[d>>2]|0}k[f>>2]=o}j=a+92|0;c=k[a+4>>2]|0;d=(l[b+34>>0]|0)<<8|(l[b+33>>0]|0)<<16|(l[b+35>>0]|0);e=c+d|0;b=(l[b+37>>0]|0)<<8|(l[b+36>>0]|0)<<16|(l[b+38>>0]|0);if(!b){p=0;r=q;return p|0}k[j>>2]=e;k[a+96>>2]=e;k[a+104>>2]=b;k[a+100>>2]=c+(b+d);k[a+108>>2]=0;k[a+112>>2]=0;k[p+20>>2]=0;k[p>>2]=0;k[p+4>>2]=0;k[p+8>>2]=0;k[p+12>>2]=0;i[p+16>>0]=0;a=p+24|0;k[p+44>>2]=0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;k[a+12>>2]=0;i[a+16>>0]=0;if(qb(j,p)|0?(n=p+24|0,qb(j,n)|0):0){if(!(k[f>>2]|0)){k[h>>2]=1138;k[h+4>>2]=906;k[h+8>>2]=1769;xc(g,1084,h)|0;wc(g)|0}if(!o)b=1;else{d=0;e=0;f=0;b=0;g=0;a=0;h=0;c=k[m>>2]|0;while(1){d=(sb(j,p)|0)+d&31;e=(sb(j,n)|0)+e&63;f=(sb(j,p)|0)+f&31;b=(sb(j,p)|0)+b|0;g=(sb(j,n)|0)+g&63;a=(sb(j,p)|0)+a&31;k[c>>2]=e<<5|d<<11|f|b<<27|g<<21|a<<16;h=h+1|0;if((h|0)==(o|0)){b=1;break}else{b=b&31;c=c+4|0}}}}else b=0;nb(p+24|0);nb(p);p=b;r=q;return p|0}function Fb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;D=r;r=r+1008|0;g=D;f=D+496|0;C=D+472|0;A=D+276|0;B=D+80|0;z=D+16|0;e=k[a+88>>2]|0;y=(l[e+47>>0]|0)<<8|(l[e+48>>0]|0);x=a+92|0;b=k[a+4>>2]|0;c=(l[e+42>>0]|0)<<8|(l[e+41>>0]|0)<<16|(l[e+43>>0]|0);d=b+c|0;e=(l[e+45>>0]|0)<<8|(l[e+44>>0]|0)<<16|(l[e+46>>0]|0);if(!e){C=0;r=D;return C|0}k[x>>2]=d;k[a+96>>2]=d;k[a+104>>2]=e;k[a+100>>2]=b+(e+c);k[a+108>>2]=0;k[a+112>>2]=0;k[C+20>>2]=0;k[C>>2]=0;k[C+4>>2]=0;k[C+8>>2]=0;k[C+12>>2]=0;i[C+16>>0]=0;if(qb(x,C)|0){c=0;d=-3;e=-3;while(1){k[A+(c<<2)>>2]=d;k[B+(c<<2)>>2]=e;b=(d|0)>2;c=c+1|0;if((c|0)==49)break;else{d=b?-3:d+1|0;e=(b&1)+e|0}}b=z;c=b+64|0;do{k[b>>2]=0;b=b+4|0}while((b|0)<(c|0));w=a+252|0;c=a+256|0;b=k[c>>2]|0;a:do if((b|0)==(y|0))h=13;else{if(b>>>0<=y>>>0){do if((k[a+260>>2]|0)>>>0>>0)if(gb(w,y,(b+1|0)==(y|0),4,0)|0){b=k[c>>2]|0;break}else{i[a+264>>0]=1;b=0;break a}while(0);_c((k[w>>2]|0)+(b<<2)|0,0,y-b<<2|0)|0}k[c>>2]=y;h=13}while(0);do if((h|0)==13){if(!y){k[g>>2]=1138;k[g+4>>2]=906;k[g+8>>2]=1769;xc(f,1084,g)|0;wc(f)|0;b=1;break}d=z+4|0;e=z+8|0;a=z+12|0;f=z+16|0;g=z+20|0;h=z+24|0;j=z+28|0;m=z+32|0;n=z+36|0;o=z+40|0;p=z+44|0;q=z+48|0;s=z+52|0;t=z+56|0;u=z+60|0;v=0;c=k[w>>2]|0;while(1){b=0;do{E=sb(x,C)|0;w=b<<1;F=z+(w<<2)|0;k[F>>2]=(k[F>>2]|0)+(k[A+(E<<2)>>2]|0)&3;w=z+((w|1)<<2)|0;k[w>>2]=(k[w>>2]|0)+(k[B+(E<<2)>>2]|0)&3;b=b+1|0}while((b|0)!=8);k[c>>2]=(l[1713+(k[d>>2]|0)>>0]|0)<<2|(l[1713+(k[z>>2]|0)>>0]|0)|(l[1713+(k[e>>2]|0)>>0]|0)<<4|(l[1713+(k[a>>2]|0)>>0]|0)<<6|(l[1713+(k[f>>2]|0)>>0]|0)<<8|(l[1713+(k[g>>2]|0)>>0]|0)<<10|(l[1713+(k[h>>2]|0)>>0]|0)<<12|(l[1713+(k[j>>2]|0)>>0]|0)<<14|(l[1713+(k[m>>2]|0)>>0]|0)<<16|(l[1713+(k[n>>2]|0)>>0]|0)<<18|(l[1713+(k[o>>2]|0)>>0]|0)<<20|(l[1713+(k[p>>2]|0)>>0]|0)<<22|(l[1713+(k[q>>2]|0)>>0]|0)<<24|(l[1713+(k[s>>2]|0)>>0]|0)<<26|(l[1713+(k[t>>2]|0)>>0]|0)<<28|(l[1713+(k[u>>2]|0)>>0]|0)<<30;v=v+1|0;if((v|0)==(y|0)){b=1;break}else c=c+4|0}}while(0)}else b=0;nb(C);F=b;r=D;return F|0}function Gb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,m=0,n=0,o=0,p=0;p=r;r=r+560|0;h=p;g=p+40|0;o=p+16|0;e=k[a+88>>2]|0;n=(l[e+55>>0]|0)<<8|(l[e+56>>0]|0);m=a+92|0;b=k[a+4>>2]|0;c=(l[e+50>>0]|0)<<8|(l[e+49>>0]|0)<<16|(l[e+51>>0]|0);d=b+c|0;e=(l[e+53>>0]|0)<<8|(l[e+52>>0]|0)<<16|(l[e+54>>0]|0);if(!e){o=0;r=p;return o|0}k[m>>2]=d;k[a+96>>2]=d;k[a+104>>2]=e;k[a+100>>2]=b+(e+c);k[a+108>>2]=0;k[a+112>>2]=0;k[o+20>>2]=0;k[o>>2]=0;k[o+4>>2]=0;k[o+8>>2]=0;k[o+12>>2]=0;i[o+16>>0]=0;a:do if(qb(m,o)|0){f=a+268|0;c=a+272|0;b=k[c>>2]|0;if((b|0)!=(n|0)){if(b>>>0<=n>>>0){do if((k[a+276>>2]|0)>>>0>>0)if(gb(f,n,(b+1|0)==(n|0),2,0)|0){b=k[c>>2]|0;break}else{i[a+280>>0]=1;b=0;break a}while(0);_c((k[f>>2]|0)+(b<<1)|0,0,n-b<<1|0)|0}k[c>>2]=n}if(!n){k[h>>2]=1138;k[h+4>>2]=906;k[h+8>>2]=1769;xc(g,1084,h)|0;wc(g)|0;b=1;break}c=0;d=0;e=0;b=k[f>>2]|0;while(1){h=sb(m,o)|0;c=h+c&255;d=(sb(m,o)|0)+d&255;j[b>>1]=d<<8|c;e=e+1|0;if((e|0)==(n|0)){b=1;break}else b=b+2|0}}else b=0;while(0);nb(o);o=b;r=p;return o|0}function Hb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;E=r;r=r+2416|0;g=E;f=E+1904|0;D=E+1880|0;B=E+980|0;C=E+80|0;A=E+16|0;e=k[a+88>>2]|0;z=(l[e+63>>0]|0)<<8|(l[e+64>>0]|0);y=a+92|0;b=k[a+4>>2]|0;c=(l[e+58>>0]|0)<<8|(l[e+57>>0]|0)<<16|(l[e+59>>0]|0);d=b+c|0;e=(l[e+61>>0]|0)<<8|(l[e+60>>0]|0)<<16|(l[e+62>>0]|0);if(!e){D=0;r=E;return D|0}k[y>>2]=d;k[a+96>>2]=d;k[a+104>>2]=e;k[a+100>>2]=b+(e+c);k[a+108>>2]=0;k[a+112>>2]=0;k[D+20>>2]=0;k[D>>2]=0;k[D+4>>2]=0;k[D+8>>2]=0;k[D+12>>2]=0;i[D+16>>0]=0;if(qb(y,D)|0){c=0;d=-7;e=-7;while(1){k[B+(c<<2)>>2]=d;k[C+(c<<2)>>2]=e;b=(d|0)>6;c=c+1|0;if((c|0)==225)break;else{d=b?-7:d+1|0;e=(b&1)+e|0}}b=A;c=b+64|0;do{k[b>>2]=0;b=b+4|0}while((b|0)<(c|0));x=a+284|0;c=z*3|0;d=a+288|0;b=k[d>>2]|0;a:do if((b|0)==(c|0))h=13;else{if(b>>>0<=c>>>0){do if((k[a+292>>2]|0)>>>0>>0)if(gb(x,c,(b+1|0)==(c|0),2,0)|0){b=k[d>>2]|0;break}else{i[a+296>>0]=1;b=0;break a}while(0);_c((k[x>>2]|0)+(b<<1)|0,0,c-b<<1|0)|0}k[d>>2]=c;h=13}while(0);do if((h|0)==13){if(!z){k[g>>2]=1138;k[g+4>>2]=906;k[g+8>>2]=1769;xc(f,1084,g)|0;wc(f)|0;b=1;break}d=A+4|0;e=A+8|0;a=A+12|0;f=A+16|0;g=A+20|0;h=A+24|0;m=A+28|0;n=A+32|0;o=A+36|0;p=A+40|0;q=A+44|0;s=A+48|0;t=A+52|0;u=A+56|0;v=A+60|0;w=0;c=k[x>>2]|0;while(1){b=0;do{F=sb(y,D)|0;x=b<<1;G=A+(x<<2)|0;k[G>>2]=(k[G>>2]|0)+(k[B+(F<<2)>>2]|0)&7;x=A+((x|1)<<2)|0;k[x>>2]=(k[x>>2]|0)+(k[C+(F<<2)>>2]|0)&7;b=b+1|0}while((b|0)!=8);F=l[1717+(k[g>>2]|0)>>0]|0;j[c>>1]=(l[1717+(k[d>>2]|0)>>0]|0)<<3|(l[1717+(k[A>>2]|0)>>0]|0)|(l[1717+(k[e>>2]|0)>>0]|0)<<6|(l[1717+(k[a>>2]|0)>>0]|0)<<9|(l[1717+(k[f>>2]|0)>>0]|0)<<12|F<<15;G=l[1717+(k[p>>2]|0)>>0]|0;j[c+2>>1]=(l[1717+(k[h>>2]|0)>>0]|0)<<2|F>>>1|(l[1717+(k[m>>2]|0)>>0]|0)<<5|(l[1717+(k[n>>2]|0)>>0]|0)<<8|(l[1717+(k[o>>2]|0)>>0]|0)<<11|G<<14;j[c+4>>1]=(l[1717+(k[q>>2]|0)>>0]|0)<<1|G>>>2|(l[1717+(k[s>>2]|0)>>0]|0)<<4|(l[1717+(k[t>>2]|0)>>0]|0)<<7|(l[1717+(k[u>>2]|0)>>0]|0)<<10|(l[1717+(k[v>>2]|0)>>0]|0)<<13;w=w+1|0;if((w|0)==(z|0)){b=1;break}else c=c+6|0}}while(0)}else b=0;nb(D);G=b;r=E;return G|0}function Ib(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ia=0,ja=0;ga=r;r=r+656|0;ea=ga+112|0;ca=ga+96|0;ba=ga+80|0;aa=ga+64|0;$=ga+48|0;fa=ga+32|0;da=ga+16|0;_=ga;Y=ga+144|0;Z=ga+128|0;R=a+240|0;S=k[R>>2]|0;V=a+256|0;W=k[V>>2]|0;c=i[(k[a+88>>2]|0)+17>>0]|0;X=d>>>2;if(!(c<<24>>24)){r=ga;return 1}T=(h|0)==0;U=h+-1|0;K=(f&1|0)!=0;L=d<<1;M=a+92|0;N=a+116|0;O=a+140|0;P=a+236|0;Q=g+-1|0;J=(e&1|0)!=0;I=a+188|0;D=a+252|0;E=X+1|0;F=X+2|0;G=X+3|0;H=Q<<4;B=c&255;c=0;f=0;e=1;C=0;do{if(!T){z=k[b+(C<<2)>>2]|0;A=0;while(1){w=A&1;j=(w|0)==0;v=(w<<5^32)+-16|0;w=(w<<1^2)+-1|0;y=j?g:-1;m=j?0:Q;a=(A|0)==(U|0);x=K&a;if((m|0)!=(y|0)){u=K&a^1;t=j?z:z+H|0;while(1){if((e|0)==1)e=sb(M,N)|0|512;s=e&7;e=e>>>3;j=l[1811+s>>0]|0;a=0;do{p=(sb(M,O)|0)+f|0;q=p-S|0;f=q>>31;f=f&p|q&~f;if((k[R>>2]|0)>>>0<=f>>>0){k[_>>2]=1138;k[_+4>>2]=906;k[_+8>>2]=1769;xc(Y,1084,_)|0;wc(Y)|0}k[Z+(a<<2)>>2]=k[(k[P>>2]|0)+(f<<2)>>2];a=a+1|0}while(a>>>0>>0);q=J&(m|0)==(Q|0);if(x|q){p=0;do{n=ha(p,d)|0;a=t+n|0;j=(p|0)==0|u;o=p<<1;ja=(sb(M,I)|0)+c|0;ia=ja-W|0;c=ia>>31;c=c&ja|ia&~c;do if(q){if(!j){ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;break}k[a>>2]=k[Z+((l[1819+(s<<2)+o>>0]|0)<<2)>>2];if((k[V>>2]|0)>>>0<=c>>>0){k[ca>>2]=1138;k[ca+4>>2]=906;k[ca+8>>2]=1769;xc(Y,1084,ca)|0;wc(Y)|0}k[t+(n+4)>>2]=k[(k[D>>2]|0)+(c<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c}else{if(!j){ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;break}k[a>>2]=k[Z+((l[1819+(s<<2)+o>>0]|0)<<2)>>2];if((k[V>>2]|0)>>>0<=c>>>0){k[ba>>2]=1138;k[ba+4>>2]=906;k[ba+8>>2]=1769;xc(Y,1084,ba)|0;wc(Y)|0}k[t+(n+4)>>2]=k[(k[D>>2]|0)+(c<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;k[t+(n+8)>>2]=k[Z+((l[(o|1)+(1819+(s<<2))>>0]|0)<<2)>>2];if((k[V>>2]|0)>>>0<=c>>>0){k[ea>>2]=1138;k[ea+4>>2]=906;k[ea+8>>2]=1769;xc(Y,1084,ea)|0;wc(Y)|0}k[t+(n+12)>>2]=k[(k[D>>2]|0)+(c<<2)>>2]}while(0);p=p+1|0}while((p|0)!=2)}else{k[t>>2]=k[Z+((l[1819+(s<<2)>>0]|0)<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;if((k[V>>2]|0)>>>0<=c>>>0){k[da>>2]=1138;k[da+4>>2]=906;k[da+8>>2]=1769;xc(Y,1084,da)|0;wc(Y)|0}k[t+4>>2]=k[(k[D>>2]|0)+(c<<2)>>2];k[t+8>>2]=k[Z+((l[1819+(s<<2)+1>>0]|0)<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;if((k[V>>2]|0)>>>0<=c>>>0){k[fa>>2]=1138;k[fa+4>>2]=906;k[fa+8>>2]=1769;xc(Y,1084,fa)|0;wc(Y)|0}k[t+12>>2]=k[(k[D>>2]|0)+(c<<2)>>2];k[t+(X<<2)>>2]=k[Z+((l[1819+(s<<2)+2>>0]|0)<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;if((k[V>>2]|0)>>>0<=c>>>0){k[$>>2]=1138;k[$+4>>2]=906;k[$+8>>2]=1769;xc(Y,1084,$)|0;wc(Y)|0}k[t+(E<<2)>>2]=k[(k[D>>2]|0)+(c<<2)>>2];k[t+(F<<2)>>2]=k[Z+((l[1819+(s<<2)+3>>0]|0)<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;if((k[V>>2]|0)>>>0<=c>>>0){k[aa>>2]=1138;k[aa+4>>2]=906;k[aa+8>>2]=1769;xc(Y,1084,aa)|0;wc(Y)|0}k[t+(G<<2)>>2]=k[(k[D>>2]|0)+(c<<2)>>2]}m=m+w|0;if((m|0)==(y|0))break;else t=t+v|0}}A=A+1|0;if((A|0)==(h|0))break;else z=z+L|0}}C=C+1|0}while((C|0)!=(B|0));r=ga;return 1}function Jb(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0;ma=r;r=r+608|0;ja=ma+48|0;la=ma+32|0;ka=ma+16|0;ia=ma;ga=ma+96|0;ha=ma+80|0;fa=ma+64|0;S=a+240|0;T=k[S>>2]|0;W=a+256|0;ca=k[W>>2]|0;da=a+272|0;ea=k[da>>2]|0;c=k[a+88>>2]|0;U=(l[c+63>>0]|0)<<8|(l[c+64>>0]|0);c=i[c+17>>0]|0;if(!(c<<24>>24)){r=ma;return 1}V=(h|0)==0;X=h+-1|0;Y=d<<1;Z=a+92|0;_=a+116|0;$=g+-1|0;aa=a+212|0;ba=a+188|0;R=(e&1|0)==0;Q=(f&1|0)==0;K=a+288|0;L=a+284|0;M=a+252|0;N=a+140|0;O=a+236|0;P=a+164|0;I=a+268|0;J=$<<5;G=c&255;c=0;e=0;f=0;a=0;j=1;H=0;do{if(!V){E=k[b+(H<<2)>>2]|0;F=0;while(1){C=F&1;n=(C|0)==0;B=(C<<6^64)+-32|0;C=(C<<1^2)+-1|0;D=n?g:-1;o=n?0:$;if((o|0)!=(D|0)){A=Q|(F|0)!=(X|0);z=n?E:E+J|0;while(1){if((j|0)==1)j=sb(Z,_)|0|512;y=j&7;j=j>>>3;p=l[1811+y>>0]|0;n=0;do{w=(sb(Z,P)|0)+e|0;x=w-ea|0;e=x>>31;e=e&w|x&~e;if((k[da>>2]|0)>>>0<=e>>>0){k[ia>>2]=1138;k[ia+4>>2]=906;k[ia+8>>2]=1769;xc(ga,1084,ia)|0;wc(ga)|0}k[fa+(n<<2)>>2]=m[(k[I>>2]|0)+(e<<1)>>1];n=n+1|0}while(n>>>0

    >>0);n=0;do{w=(sb(Z,N)|0)+a|0;x=w-T|0;a=x>>31;a=a&w|x&~a;if((k[S>>2]|0)>>>0<=a>>>0){k[ka>>2]=1138;k[ka+4>>2]=906;k[ka+8>>2]=1769;xc(ga,1084,ka)|0;wc(ga)|0}k[ha+(n<<2)>>2]=k[(k[O>>2]|0)+(a<<2)>>2];n=n+1|0}while(n>>>0

    >>0);x=R|(o|0)!=($|0);v=0;w=z;while(1){u=A|(v|0)==0;t=v<<1;q=0;s=w;while(1){p=(sb(Z,aa)|0)+c|0;n=p-U|0;c=n>>31;c=c&p|n&~c;n=(sb(Z,ba)|0)+f|0;p=n-ca|0;f=p>>31;f=f&n|p&~f;if((x|(q|0)==0)&u){n=l[q+t+(1819+(y<<2))>>0]|0;p=c*3|0;if((k[K>>2]|0)>>>0<=p>>>0){k[la>>2]=1138;k[la+4>>2]=906;k[la+8>>2]=1769;xc(ga,1084,la)|0;wc(ga)|0}na=k[L>>2]|0;k[s>>2]=(m[na+(p<<1)>>1]|0)<<16|k[fa+(n<<2)>>2];k[s+4>>2]=(m[na+(p+2<<1)>>1]|0)<<16|(m[na+(p+1<<1)>>1]|0);k[s+8>>2]=k[ha+(n<<2)>>2];if((k[W>>2]|0)>>>0<=f>>>0){k[ja>>2]=1138;k[ja+4>>2]=906;k[ja+8>>2]=1769;xc(ga,1084,ja)|0;wc(ga)|0}k[s+12>>2]=k[(k[M>>2]|0)+(f<<2)>>2]}q=q+1|0;if((q|0)==2)break;else s=s+16|0}v=v+1|0;if((v|0)==2)break;else w=w+d|0}o=o+C|0;if((o|0)==(D|0))break;else z=z+B|0}}F=F+1|0;if((F|0)==(h|0))break;else E=E+Y|0}}H=H+1|0}while((H|0)!=(G|0));r=ma;return 1}function Kb(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;$=r;r=r+576|0;_=$+32|0;Z=$+16|0;Y=$;X=$+64|0;W=$+48|0;M=a+272|0;N=k[M>>2]|0;c=k[a+88>>2]|0;O=(l[c+63>>0]|0)<<8|(l[c+64>>0]|0);c=i[c+17>>0]|0;if(!(c<<24>>24)){r=$;return 1}P=(h|0)==0;Q=h+-1|0;R=d<<1;S=a+92|0;T=a+116|0;U=g+-1|0;V=a+212|0;L=(f&1|0)==0;I=a+288|0;J=a+284|0;K=a+164|0;G=a+268|0;H=U<<4;F=c&255;E=(e&1|0)!=0;c=0;f=0;a=1;D=0;do{if(!P){B=k[b+(D<<2)>>2]|0;C=0;while(1){z=C&1;e=(z|0)==0;y=(z<<5^32)+-16|0;z=(z<<1^2)+-1|0;A=e?g:-1;j=e?0:U;if((j|0)!=(A|0)){x=L|(C|0)!=(Q|0);w=e?B:B+H|0;while(1){if((a|0)==1)a=sb(S,T)|0|512;v=a&7;a=a>>>3;n=l[1811+v>>0]|0;e=0;do{t=(sb(S,K)|0)+f|0;u=t-N|0;f=u>>31;f=f&t|u&~f;if((k[M>>2]|0)>>>0<=f>>>0){k[Y>>2]=1138;k[Y+4>>2]=906;k[Y+8>>2]=1769;xc(X,1084,Y)|0;wc(X)|0}k[W+(e<<2)>>2]=m[(k[G>>2]|0)+(f<<1)>>1];e=e+1|0}while(e>>>0>>0);u=(j|0)==(U|0)&E;s=0;t=w;while(1){q=x|(s|0)==0;p=s<<1;e=(sb(S,V)|0)+c|0;o=e-O|0;n=o>>31;n=n&e|o&~n;if(q){c=l[1819+(v<<2)+p>>0]|0;e=n*3|0;if((k[I>>2]|0)>>>0<=e>>>0){k[Z>>2]=1138;k[Z+4>>2]=906;k[Z+8>>2]=1769;xc(X,1084,Z)|0;wc(X)|0}o=k[J>>2]|0;k[t>>2]=(m[o+(e<<1)>>1]|0)<<16|k[W+(c<<2)>>2];k[t+4>>2]=(m[o+(e+2<<1)>>1]|0)<<16|(m[o+(e+1<<1)>>1]|0)}o=t+8|0;e=(sb(S,V)|0)+n|0;n=e-O|0;c=n>>31;c=c&e|n&~c;if(!(u|q^1)){e=l[(p|1)+(1819+(v<<2))>>0]|0;n=c*3|0;if((k[I>>2]|0)>>>0<=n>>>0){k[_>>2]=1138;k[_+4>>2]=906;k[_+8>>2]=1769;xc(X,1084,_)|0;wc(X)|0}q=k[J>>2]|0;k[o>>2]=(m[q+(n<<1)>>1]|0)<<16|k[W+(e<<2)>>2];k[t+12>>2]=(m[q+(n+2<<1)>>1]|0)<<16|(m[q+(n+1<<1)>>1]|0)}s=s+1|0;if((s|0)==2)break;else t=t+d|0}j=j+z|0;if((j|0)==(A|0))break;else w=w+y|0}}C=C+1|0;if((C|0)==(h|0))break;else B=B+R|0}}D=D+1|0}while((D|0)!=(F|0));r=$;return 1}function Lb(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;ha=r;r=r+608|0;ea=ha+48|0;ga=ha+32|0;fa=ha+16|0;da=ha;ca=ha+96|0;aa=ha+80|0;ba=ha+64|0;S=a+272|0;T=k[S>>2]|0;c=k[a+88>>2]|0;U=(l[c+63>>0]|0)<<8|(l[c+64>>0]|0);c=i[c+17>>0]|0;if(!(c<<24>>24)){r=ha;return 1}V=(h|0)==0;W=h+-1|0;X=d<<1;Y=a+92|0;Z=a+116|0;_=g+-1|0;$=a+212|0;R=(e&1|0)==0;Q=(f&1|0)==0;N=a+288|0;O=a+284|0;P=a+164|0;L=a+268|0;M=_<<5;J=c&255;c=0;e=0;f=0;a=0;j=1;K=0;do{if(!V){H=k[b+(K<<2)>>2]|0;I=0;while(1){F=I&1;n=(F|0)==0;E=(F<<6^64)+-32|0;F=(F<<1^2)+-1|0;G=n?g:-1;o=n?0:_;if((o|0)!=(G|0)){D=Q|(I|0)!=(W|0);C=n?H:H+M|0;while(1){if((j|0)==1)j=sb(Y,Z)|0|512;B=j&7;j=j>>>3;p=l[1811+B>>0]|0;n=0;do{z=(sb(Y,P)|0)+a|0;A=z-T|0;a=A>>31;a=a&z|A&~a;if((k[S>>2]|0)>>>0<=a>>>0){k[da>>2]=1138;k[da+4>>2]=906;k[da+8>>2]=1769;xc(ca,1084,da)|0;wc(ca)|0}k[aa+(n<<2)>>2]=m[(k[L>>2]|0)+(a<<1)>>1];n=n+1|0}while(n>>>0

    >>0);n=0;do{z=(sb(Y,P)|0)+e|0;A=z-T|0;e=A>>31;e=e&z|A&~e;if((k[S>>2]|0)>>>0<=e>>>0){k[fa>>2]=1138;k[fa+4>>2]=906;k[fa+8>>2]=1769;xc(ca,1084,fa)|0;wc(ca)|0}k[ba+(n<<2)>>2]=m[(k[L>>2]|0)+(e<<1)>>1];n=n+1|0}while(n>>>0

    >>0);A=R|(o|0)!=(_|0);y=0;z=C;while(1){x=D|(y|0)==0;w=y<<1;u=0;v=z;while(1){t=(sb(Y,$)|0)+f|0;s=t-U|0;f=s>>31;f=f&t|s&~f;s=(sb(Y,$)|0)+c|0;t=s-U|0;c=t>>31;c=c&s|t&~c;if((A|(u|0)==0)&x){s=l[u+w+(1819+(B<<2))>>0]|0;t=f*3|0;n=k[N>>2]|0;if(n>>>0<=t>>>0){k[ga>>2]=1138;k[ga+4>>2]=906;k[ga+8>>2]=1769;xc(ca,1084,ga)|0;wc(ca)|0;n=k[N>>2]|0}p=k[O>>2]|0;q=c*3|0;if(n>>>0>q>>>0)n=p;else{k[ea>>2]=1138;k[ea+4>>2]=906;k[ea+8>>2]=1769;xc(ca,1084,ea)|0;wc(ca)|0;n=k[O>>2]|0}k[v>>2]=(m[p+(t<<1)>>1]|0)<<16|k[aa+(s<<2)>>2];k[v+4>>2]=(m[p+(t+2<<1)>>1]|0)<<16|(m[p+(t+1<<1)>>1]|0);k[v+8>>2]=(m[n+(q<<1)>>1]|0)<<16|k[ba+(s<<2)>>2];k[v+12>>2]=(m[n+(q+2<<1)>>1]|0)<<16|(m[n+(q+1<<1)>>1]|0)}u=u+1|0;if((u|0)==2)break;else v=v+16|0}y=y+1|0;if((y|0)==2)break;else z=z+d|0}o=o+F|0;if((o|0)==(G|0))break;else C=C+E|0}}I=I+1|0;if((I|0)==(h|0))break;else H=H+X|0}}K=K+1|0}while((K|0)!=(J|0));r=ha;return 1}function Mb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0;j=r;r=r+576|0;h=j+48|0;f=j+32|0;e=j+16|0;d=j;g=j+64|0;k[a>>2]=0;b=a+284|0;c=k[b>>2]|0;if(c){if(!(c&7))kb(c,0,0,1,0)|0;else{k[d>>2]=1138;k[d+4>>2]=2502;k[d+8>>2]=1504;xc(g,1084,d)|0;wc(g)|0}k[b>>2]=0;k[a+288>>2]=0;k[a+292>>2]=0}i[a+296>>0]=0;c=a+268|0;b=k[c>>2]|0;if(b){if(!(b&7))kb(b,0,0,1,0)|0;else{k[e>>2]=1138;k[e+4>>2]=2502;k[e+8>>2]=1504;xc(g,1084,e)|0;wc(g)|0}k[c>>2]=0;k[a+272>>2]=0;k[a+276>>2]=0}i[a+280>>0]=0;b=a+252|0;c=k[b>>2]|0;if(c){if(!(c&7))kb(c,0,0,1,0)|0;else{k[f>>2]=1138;k[f+4>>2]=2502;k[f+8>>2]=1504;xc(g,1084,f)|0;wc(g)|0}k[b>>2]=0;k[a+256>>2]=0;k[a+260>>2]=0}i[a+264>>0]=0;b=a+236|0;c=k[b>>2]|0;if(!c){h=a+248|0;i[h>>0]=0;h=a+212|0;nb(h);h=a+188|0;nb(h);h=a+164|0;nb(h);h=a+140|0;nb(h);h=a+116|0;nb(h);r=j;return}if(!(c&7))kb(c,0,0,1,0)|0;else{k[h>>2]=1138;k[h+4>>2]=2502;k[h+8>>2]=1504;xc(g,1084,h)|0;wc(g)|0}k[b>>2]=0;k[a+240>>2]=0;k[a+244>>2]=0;h=a+248|0;i[h>>0]=0;h=a+212|0;nb(h);h=a+188|0;nb(h);h=a+164|0;nb(h);h=a+140|0;nb(h);h=a+116|0;nb(h);r=j;return}function Nb(a,b){a=a|0;b=b|0;var c=0;c=r;r=r+16|0;k[c>>2]=b;b=k[60]|0;yc(b,a,c)|0;sc(10,b)|0;Aa()}function Ob(){var a=0,b=0;a=r;r=r+16|0;if(!(Ka(192,2)|0)){b=va(k[47]|0)|0;r=a;return b|0}else Nb(2078,a);return 0}function Pb(a){a=a|0;Sc(a);return}function Qb(a){a=a|0;var b=0;b=r;r=r+16|0;Wa[a&3]();Nb(2127,b)}function Rb(){var a=0,b=0;a=Ob()|0;if(((a|0)!=0?(b=k[a>>2]|0,(b|0)!=0):0)?(a=b+48|0,(k[a>>2]&-256|0)==1126902528?(k[a+4>>2]|0)==1129074247:0):0)Qb(k[b+12>>2]|0);b=k[26]|0;k[26]=b+0;Qb(b)}function Sb(a){a=a|0;return}function Tb(a){a=a|0;return}function Ub(a){a=a|0;return}function Vb(a){a=a|0;return}function Wb(a){a=a|0;Pb(a);return}function Xb(a){a=a|0;Pb(a);return}function Yb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;g=r;r=r+64|0;f=g;if((a|0)!=(b|0))if((b|0)!=0?(e=ac(b,24,40,0)|0,(e|0)!=0):0){b=f;d=b+56|0;do{k[b>>2]=0;b=b+4|0}while((b|0)<(d|0));k[f>>2]=e;k[f+8>>2]=a;k[f+12>>2]=-1;k[f+48>>2]=1;Ya[k[(k[e>>2]|0)+28>>2]&3](e,f,k[c>>2]|0,1);if((k[f+24>>2]|0)==1){k[c>>2]=k[f+16>>2];b=1}else b=0}else b=0;else b=1;r=g;return b|0}function Zb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;a=b+16|0;e=k[a>>2]|0;do if(e){if((e|0)!=(c|0)){d=b+36|0;k[d>>2]=(k[d>>2]|0)+1;k[b+24>>2]=2;i[b+54>>0]=1;break}a=b+24|0;if((k[a>>2]|0)==2)k[a>>2]=d}else{k[a>>2]=c;k[b+24>>2]=d;k[b+36>>2]=1}while(0);return}function _b(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((a|0)==(k[b+8>>2]|0))Zb(0,b,c,d);return}function $b(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((a|0)==(k[b+8>>2]|0))Zb(0,b,c,d);else{a=k[a+8>>2]|0;Ya[k[(k[a>>2]|0)+28>>2]&3](a,b,c,d)}return}function ac(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,l=0,m=0,n=0,o=0,p=0,q=0;q=r;r=r+64|0;p=q;o=k[a>>2]|0;n=a+(k[o+-8>>2]|0)|0;o=k[o+-4>>2]|0;k[p>>2]=c;k[p+4>>2]=a;k[p+8>>2]=b;k[p+12>>2]=d;d=p+16|0;a=p+20|0;b=p+24|0;e=p+28|0;f=p+32|0;g=p+40|0;h=(o|0)==(c|0);l=d;m=l+36|0;do{k[l>>2]=0;l=l+4|0}while((l|0)<(m|0));j[d+36>>1]=0;i[d+38>>0]=0;a:do if(h){k[p+48>>2]=1;Xa[k[(k[c>>2]|0)+20>>2]&3](c,p,n,n,1,0);d=(k[b>>2]|0)==1?n:0}else{Sa[k[(k[o>>2]|0)+24>>2]&3](o,p,n,1,0);switch(k[p+36>>2]|0){case 0:{d=(k[g>>2]|0)==1&(k[e>>2]|0)==1&(k[f>>2]|0)==1?k[a>>2]|0:0;break a}case 1:break;default:{d=0;break a}}if((k[b>>2]|0)!=1?!((k[g>>2]|0)==0&(k[e>>2]|0)==1&(k[f>>2]|0)==1):0){d=0;break}d=k[d>>2]|0}while(0);r=q;return d|0}function bc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;i[b+53>>0]=1;do if((k[b+4>>2]|0)==(d|0)){i[b+52>>0]=1;d=b+16|0;a=k[d>>2]|0;if(!a){k[d>>2]=c;k[b+24>>2]=e;k[b+36>>2]=1;if(!((e|0)==1?(k[b+48>>2]|0)==1:0))break;i[b+54>>0]=1;break}if((a|0)!=(c|0)){e=b+36|0;k[e>>2]=(k[e>>2]|0)+1;i[b+54>>0]=1;break}a=b+24|0;d=k[a>>2]|0;if((d|0)==2){k[a>>2]=e;d=e}if((d|0)==1?(k[b+48>>2]|0)==1:0)i[b+54>>0]=1}while(0);return}function cc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;a:do if((a|0)==(k[b+8>>2]|0)){if((k[b+4>>2]|0)==(c|0)?(f=b+28|0,(k[f>>2]|0)!=1):0)k[f>>2]=d}else{if((a|0)!=(k[b>>2]|0)){h=k[a+8>>2]|0;Sa[k[(k[h>>2]|0)+24>>2]&3](h,b,c,d,e);break}if((k[b+16>>2]|0)!=(c|0)?(g=b+20|0,(k[g>>2]|0)!=(c|0)):0){k[b+32>>2]=d;d=b+44|0;if((k[d>>2]|0)==4)break;f=b+52|0;i[f>>0]=0;j=b+53|0;i[j>>0]=0;a=k[a+8>>2]|0;Xa[k[(k[a>>2]|0)+20>>2]&3](a,b,c,c,1,e);if(i[j>>0]|0){if(!(i[f>>0]|0)){f=1;h=13}}else{f=0;h=13}do if((h|0)==13){k[g>>2]=c;j=b+40|0;k[j>>2]=(k[j>>2]|0)+1;if((k[b+36>>2]|0)==1?(k[b+24>>2]|0)==2:0){i[b+54>>0]=1;if(f)break}else h=16;if((h|0)==16?f:0)break;k[d>>2]=4;break a}while(0);k[d>>2]=3;break}if((d|0)==1)k[b+32>>2]=1}while(0);return}function dc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;do if((a|0)==(k[b+8>>2]|0)){if((k[b+4>>2]|0)==(c|0)?(g=b+28|0,(k[g>>2]|0)!=1):0)k[g>>2]=d}else if((a|0)==(k[b>>2]|0)){if((k[b+16>>2]|0)!=(c|0)?(f=b+20|0,(k[f>>2]|0)!=(c|0)):0){k[b+32>>2]=d;k[f>>2]=c;e=b+40|0;k[e>>2]=(k[e>>2]|0)+1;if((k[b+36>>2]|0)==1?(k[b+24>>2]|0)==2:0)i[b+54>>0]=1;k[b+44>>2]=4;break}if((d|0)==1)k[b+32>>2]=1}while(0);return}function ec(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if((a|0)==(k[b+8>>2]|0))bc(0,b,c,d,e);else{a=k[a+8>>2]|0;Xa[k[(k[a>>2]|0)+20>>2]&3](a,b,c,d,e,f)}return}function fc(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if((a|0)==(k[b+8>>2]|0))bc(0,b,c,d,e);return}function gc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=r;r=r+16|0;d=e;k[d>>2]=k[c>>2];a=Ra[k[(k[a>>2]|0)+16>>2]&7](a,b,d)|0;if(a)k[c>>2]=k[d>>2];r=e;return a&1|0}function hc(a){a=a|0;if(!a)a=0;else a=(ac(a,24,72,0)|0)!=0;return a&1|0}function ic(){var a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;e=r;r=r+48|0;g=e+32|0;c=e+24|0;h=e+16|0;f=e;e=e+36|0;a=Ob()|0;if((a|0)!=0?(d=k[a>>2]|0,(d|0)!=0):0){a=d+48|0;b=k[a>>2]|0;a=k[a+4>>2]|0;if(!((b&-256|0)==1126902528&(a|0)==1129074247)){k[c>>2]=2406;Nb(2356,c)}if((b|0)==1126902529&(a|0)==1129074247)a=k[d+44>>2]|0;else a=d+80|0;k[e>>2]=a;d=k[d>>2]|0;a=k[d+4>>2]|0;if(Ra[k[(k[8>>2]|0)+16>>2]&7](8,d,e)|0){h=k[e>>2]|0;h=Ua[k[(k[h>>2]|0)+8>>2]&1](h)|0;k[f>>2]=2406;k[f+4>>2]=a;k[f+8>>2]=h;Nb(2270,f)}else{k[h>>2]=2406;k[h+4>>2]=a;Nb(2315,h)}}Nb(2394,g)}function jc(){var a=0;a=r;r=r+16|0;if(!(Fa(188,6)|0)){r=a;return}else Nb(2167,a)}function kc(a){a=a|0;var b=0;b=r;r=r+16|0;Sc(a);if(!(wa(k[47]|0,0)|0)){r=b;return}else Nb(2217,b)}function lc(a){a=a|0;var b=0,c=0;b=0;while(1){if((l[2415+b>>0]|0)==(a|0)){c=2;break}b=b+1|0;if((b|0)==87){b=87;a=2503;c=5;break}}if((c|0)==2)if(!b)a=2503;else{a=2503;c=5}if((c|0)==5)while(1){c=a;while(1){a=c+1|0;if(!(i[c>>0]|0))break;else c=a}b=b+-1|0;if(!b)break;else c=5}return a|0}function mc(){var a=0;if(!0)a=248;else{a=(za()|0)+60|0;a=k[a>>2]|0}return a|0}function nc(a){a=a|0;var b=0;if(a>>>0>4294963200){b=mc()|0;k[b>>2]=0-a;a=-1}return a|0}function oc(a,b){a=+a;b=b|0;var c=0,d=0,e=0;p[t>>3]=a;c=k[t>>2]|0;d=k[t+4>>2]|0;e=$c(c|0,d|0,52)|0;e=e&2047;switch(e|0){case 0:{if(a!=0.0){a=+oc(a*18446744073709552.0e3,b);c=(k[b>>2]|0)+-64|0}else c=0;k[b>>2]=c;break}case 2047:break;default:{k[b>>2]=e+-1022;k[t>>2]=c;k[t+4>>2]=d&-2146435073|1071644672;a=+p[t>>3]}}return +a}function pc(a,b){a=+a;b=b|0;return +(+oc(a,b))}function qc(a,b,c){a=a|0;b=b|0;c=c|0;do if(a){if(b>>>0<128){i[a>>0]=b;a=1;break}if(b>>>0<2048){i[a>>0]=b>>>6|192;i[a+1>>0]=b&63|128;a=2;break}if(b>>>0<55296|(b&-8192|0)==57344){i[a>>0]=b>>>12|224;i[a+1>>0]=b>>>6&63|128;i[a+2>>0]=b&63|128;a=3;break}if((b+-65536|0)>>>0<1048576){i[a>>0]=b>>>18|240;i[a+1>>0]=b>>>12&63|128;i[a+2>>0]=b>>>6&63|128;i[a+3>>0]=b&63|128;a=4;break}else{a=mc()|0;k[a>>2]=84;a=-1;break}}else a=1;while(0);return a|0}function rc(a,b){a=a|0;b=b|0;if(!a)a=0;else a=qc(a,b,0)|0;return a|0}function sc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;if((k[b+76>>2]|0)>=0?(Bc(b)|0)!=0:0){if((i[b+75>>0]|0)!=(a|0)?(d=b+20|0,e=k[d>>2]|0,e>>>0<(k[b+16>>2]|0)>>>0):0){k[d>>2]=e+1;i[e>>0]=a;c=a&255}else c=Dc(b,a)|0;Cc(b)}else g=3;do if((g|0)==3){if((i[b+75>>0]|0)!=(a|0)?(f=b+20|0,c=k[f>>2]|0,c>>>0<(k[b+16>>2]|0)>>>0):0){k[f>>2]=c+1;i[c>>0]=a;c=a&255;break}c=Dc(b,a)|0}while(0);return c|0}function tc(a,b){a=a|0;b=b|0;return (vc(a,Kc(a)|0,1,b)|0)+-1|0}function uc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=c+16|0;e=k[d>>2]|0;if(!e)if(!(Ic(c)|0)){e=k[d>>2]|0;f=4}else d=0;else f=4;a:do if((f|0)==4){g=c+20|0;f=k[g>>2]|0;if((e-f|0)>>>0>>0){d=Ra[k[c+36>>2]&7](c,a,b)|0;break}b:do if((i[c+75>>0]|0)>-1){d=b;while(1){if(!d){e=f;d=0;break b}e=d+-1|0;if((i[a+e>>0]|0)==10)break;else d=e}if((Ra[k[c+36>>2]&7](c,a,d)|0)>>>0>>0)break a;b=b-d|0;a=a+d|0;e=k[g>>2]|0}else{e=f;d=0}while(0);bd(e|0,a|0,b|0)|0;k[g>>2]=(k[g>>2]|0)+b;d=d+b|0}while(0);return d|0}function vc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=ha(c,b)|0;if((k[d+76>>2]|0)>-1){f=(Bc(d)|0)==0;a=uc(a,e,d)|0;if(!f)Cc(d)}else a=uc(a,e,d)|0;if((a|0)!=(e|0))c=(a>>>0)/(b>>>0)|0;return c|0}function wc(a){a=a|0;var b=0,c=0,d=0,e=0;d=k[61]|0;if((k[d+76>>2]|0)>-1)e=Bc(d)|0;else e=0;do if((tc(a,d)|0)<0)b=1;else{if((i[d+75>>0]|0)!=10?(b=d+20|0,c=k[b>>2]|0,c>>>0<(k[d+16>>2]|0)>>>0):0){k[b>>2]=c+1;i[c>>0]=10;b=0;break}b=(Dc(d,10)|0)<0}while(0);if(e)Cc(d);return b<<31>>31|0}function xc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=r;r=r+16|0;e=d;k[e>>2]=c;c=Ac(a,b,e)|0;r=d;return c|0}function yc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0;s=r;r=r+224|0;n=s+120|0;q=s+80|0;p=s;o=s+136|0;d=q;e=d+40|0;do{k[d>>2]=0;d=d+4|0}while((d|0)<(e|0));k[n>>2]=k[c>>2];if((Lc(0,b,n,p,q)|0)<0)c=-1;else{if((k[a+76>>2]|0)>-1)l=Bc(a)|0;else l=0;c=k[a>>2]|0;m=c&32;if((i[a+74>>0]|0)<1)k[a>>2]=c&-33;c=a+48|0;if(!(k[c>>2]|0)){e=a+44|0;f=k[e>>2]|0;k[e>>2]=o;g=a+28|0;k[g>>2]=o;h=a+20|0;k[h>>2]=o;k[c>>2]=80;j=a+16|0;k[j>>2]=o+80;d=Lc(a,b,n,p,q)|0;if(f){Ra[k[a+36>>2]&7](a,0,0)|0;d=(k[h>>2]|0)==0?-1:d;k[e>>2]=f;k[c>>2]=0;k[j>>2]=0;k[g>>2]=0;k[h>>2]=0}}else d=Lc(a,b,n,p,q)|0;c=k[a>>2]|0;k[a>>2]=c|m;if(l)Cc(a);c=(c&32|0)==0?d:-1}r=s;return c|0}function zc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,l=0,m=0;m=r;r=r+128|0;e=m+112|0;l=m;f=l;g=252;h=f+112|0;do{k[f>>2]=k[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));if((b+-1|0)>>>0>2147483646)if(!b){b=1;j=4}else{b=mc()|0;k[b>>2]=75;b=-1}else{e=a;j=4}if((j|0)==4){j=-2-e|0;j=b>>>0>j>>>0?j:b;k[l+48>>2]=j;a=l+20|0;k[a>>2]=e;k[l+44>>2]=e;b=e+j|0;e=l+16|0;k[e>>2]=b;k[l+28>>2]=b;b=yc(l,c,d)|0;if(j){c=k[a>>2]|0;i[c+(((c|0)==(k[e>>2]|0))<<31>>31)>>0]=0}}r=m;return b|0}function Ac(a,b,c){a=a|0;b=b|0;c=c|0;return zc(a,2147483647,b,c)|0}function Bc(a){a=a|0;return 0}function Cc(a){a=a|0;return}function Dc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0;j=r;r=r+16|0;h=j;g=b&255;i[h>>0]=g;d=a+16|0;e=k[d>>2]|0;if(!e)if(!(Ic(a)|0)){e=k[d>>2]|0;f=4}else c=-1;else f=4;do if((f|0)==4){d=a+20|0;f=k[d>>2]|0;if(f>>>0>>0?(c=b&255,(c|0)!=(i[a+75>>0]|0)):0){k[d>>2]=f+1;i[f>>0]=g;break}if((Ra[k[a+36>>2]&7](a,h,1)|0)==1)c=l[h>>0]|0;else c=-1}while(0);r=j;return c|0}function Ec(a){a=a|0;var b=0,c=0;b=r;r=r+16|0;c=b;k[c>>2]=k[a+60>>2];a=nc(Ca(6,c|0)|0)|0;r=b;return a|0}function Fc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;e=r;r=r+32|0;f=e;d=e+20|0;k[f>>2]=k[a+60>>2];k[f+4>>2]=0;k[f+8>>2]=b;k[f+12>>2]=d;k[f+16>>2]=c;if((nc(Ja(140,f|0)|0)|0)<0){k[d>>2]=-1;a=-1}else a=k[d>>2]|0;r=e;return a|0}function Gc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;p=r;r=r+48|0;m=p+16|0;l=p;d=p+32|0;n=a+28|0;e=k[n>>2]|0;k[d>>2]=e;o=a+20|0;e=(k[o>>2]|0)-e|0;k[d+4>>2]=e;k[d+8>>2]=b;k[d+12>>2]=c;i=a+60|0;j=a+44|0;b=2;e=e+c|0;while(1){if(!(k[49]|0)){k[m>>2]=k[i>>2];k[m+4>>2]=d;k[m+8>>2]=b;g=nc(Na(146,m|0)|0)|0}else{Ba(7,a|0);k[l>>2]=k[i>>2];k[l+4>>2]=d;k[l+8>>2]=b;g=nc(Na(146,l|0)|0)|0;ua(0)}if((e|0)==(g|0)){e=6;break}if((g|0)<0){e=8;break}e=e-g|0;f=k[d+4>>2]|0;if(g>>>0<=f>>>0)if((b|0)==2){k[n>>2]=(k[n>>2]|0)+g;h=f;b=2}else h=f;else{h=k[j>>2]|0;k[n>>2]=h;k[o>>2]=h;h=k[d+12>>2]|0;g=g-f|0;d=d+8|0;b=b+-1|0}k[d>>2]=(k[d>>2]|0)+g;k[d+4>>2]=h-g}if((e|0)==6){m=k[j>>2]|0;k[a+16>>2]=m+(k[a+48>>2]|0);a=m;k[n>>2]=a;k[o>>2]=a}else if((e|0)==8){k[a+16>>2]=0;k[n>>2]=0;k[o>>2]=0;k[a>>2]=k[a>>2]|32;if((b|0)==2)c=0;else c=c-(k[d+4>>2]|0)|0}r=p;return c|0}function Hc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=r;r=r+80|0;d=e;k[a+36>>2]=3;if((k[a>>2]&64|0)==0?(k[d>>2]=k[a+60>>2],k[d+4>>2]=21505,k[d+8>>2]=e+12,(Ia(54,d|0)|0)!=0):0)i[a+75>>0]=-1;d=Gc(a,b,c)|0;r=e;return d|0}function Ic(a){a=a|0;var b=0,c=0;b=a+74|0;c=i[b>>0]|0;i[b>>0]=c+255|c;b=k[a>>2]|0;if(!(b&8)){k[a+8>>2]=0;k[a+4>>2]=0;b=k[a+44>>2]|0;k[a+28>>2]=b;k[a+20>>2]=b;k[a+16>>2]=b+(k[a+48>>2]|0);b=0}else{k[a>>2]=b|32;b=-1}return b|0}function Jc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;f=b&255;d=(c|0)!=0;a:do if(d&(a&3|0)!=0){e=b&255;while(1){if((i[a>>0]|0)==e<<24>>24){g=6;break a}a=a+1|0;c=c+-1|0;d=(c|0)!=0;if(!(d&(a&3|0)!=0)){g=5;break}}}else g=5;while(0);if((g|0)==5)if(d)g=6;else c=0;b:do if((g|0)==6){e=b&255;if((i[a>>0]|0)!=e<<24>>24){d=ha(f,16843009)|0;c:do if(c>>>0>3)while(1){f=k[a>>2]^d;if((f&-2139062144^-2139062144)&f+-16843009)break;a=a+4|0;c=c+-4|0;if(c>>>0<=3){g=11;break c}}else g=11;while(0);if((g|0)==11)if(!c){c=0;break}while(1){if((i[a>>0]|0)==e<<24>>24)break b;a=a+1|0;c=c+-1|0;if(!c){c=0;break}}}}while(0);return ((c|0)!=0?a:0)|0}function Kc(a){a=a|0;var b=0,c=0,d=0;d=a;a:do if(!(d&3))c=4;else{b=a;a=d;while(1){if(!(i[b>>0]|0))break a;b=b+1|0;a=b;if(!(a&3)){a=b;c=4;break}}}while(0);if((c|0)==4){while(1){b=k[a>>2]|0;if(!((b&-2139062144^-2139062144)&b+-16843009))a=a+4|0;else break}if((b&255)<<24>>24)do a=a+1|0;while((i[a>>0]|0)!=0)}return a-d|0}function Lc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,m=0,n=0.0,o=0,q=0,s=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0;ga=r;r=r+624|0;ba=ga+24|0;da=ga+16|0;ca=ga+588|0;Y=ga+576|0;aa=ga;V=ga+536|0;fa=ga+8|0;ea=ga+528|0;M=(a|0)!=0;N=V+40|0;U=N;V=V+39|0;W=fa+4|0;X=Y+12|0;Y=Y+11|0;Z=ca;_=X;$=_-Z|0;O=-2-Z|0;P=_+2|0;Q=ba+288|0;R=ca+9|0;S=R;T=ca+8|0;f=0;w=b;g=0;b=0;a:while(1){do if((f|0)>-1)if((g|0)>(2147483647-f|0)){f=mc()|0;k[f>>2]=75;f=-1;break}else{f=g+f|0;break}while(0);g=i[w>>0]|0;if(!(g<<24>>24)){K=245;break}else h=w;b:while(1){switch(g<<24>>24){case 37:{g=h;K=9;break b}case 0:{g=h;break b}default:{}}J=h+1|0;g=i[J>>0]|0;h=J}c:do if((K|0)==9)while(1){K=0;if((i[g+1>>0]|0)!=37)break c;h=h+1|0;g=g+2|0;if((i[g>>0]|0)==37)K=9;else break}while(0);y=h-w|0;if(M?(k[a>>2]&32|0)==0:0)uc(w,y,a)|0;if((h|0)!=(w|0)){w=g;g=y;continue}o=g+1|0;h=i[o>>0]|0;m=(h<<24>>24)+-48|0;if(m>>>0<10){J=(i[g+2>>0]|0)==36;o=J?g+3|0:o;h=i[o>>0]|0;u=J?m:-1;b=J?1:b}else u=-1;g=h<<24>>24;d:do if((g&-32|0)==32){m=0;while(1){if(!(1<>24)+-32|m;o=o+1|0;h=i[o>>0]|0;g=h<<24>>24;if((g&-32|0)!=32){q=m;g=o;break}}}else{q=0;g=o}while(0);do if(h<<24>>24==42){m=g+1|0;h=(i[m>>0]|0)+-48|0;if(h>>>0<10?(i[g+2>>0]|0)==36:0){k[e+(h<<2)>>2]=10;b=1;g=g+3|0;h=k[d+((i[m>>0]|0)+-48<<3)>>2]|0}else{if(b){f=-1;break a}if(!M){x=q;g=m;b=0;J=0;break}b=(k[c>>2]|0)+(4-1)&~(4-1);h=k[b>>2]|0;k[c>>2]=b+4;b=0;g=m}if((h|0)<0){x=q|8192;J=0-h|0}else{x=q;J=h}}else{m=(h<<24>>24)+-48|0;if(m>>>0<10){h=0;do{h=(h*10|0)+m|0;g=g+1|0;m=(i[g>>0]|0)+-48|0}while(m>>>0<10);if((h|0)<0){f=-1;break a}else{x=q;J=h}}else{x=q;J=0}}while(0);e:do if((i[g>>0]|0)==46){m=g+1|0;h=i[m>>0]|0;if(h<<24>>24!=42){o=(h<<24>>24)+-48|0;if(o>>>0<10){g=m;h=0}else{g=m;o=0;break}while(1){h=(h*10|0)+o|0;g=g+1|0;o=(i[g>>0]|0)+-48|0;if(o>>>0>=10){o=h;break e}}}m=g+2|0;h=(i[m>>0]|0)+-48|0;if(h>>>0<10?(i[g+3>>0]|0)==36:0){k[e+(h<<2)>>2]=10;g=g+4|0;o=k[d+((i[m>>0]|0)+-48<<3)>>2]|0;break}if(b){f=-1;break a}if(M){g=(k[c>>2]|0)+(4-1)&~(4-1);o=k[g>>2]|0;k[c>>2]=g+4;g=m}else{g=m;o=0}}else o=-1;while(0);s=0;while(1){h=(i[g>>0]|0)+-65|0;if(h>>>0>57){f=-1;break a}m=g+1|0;h=i[5347+(s*58|0)+h>>0]|0;q=h&255;if((q+-1|0)>>>0<8){g=m;s=q}else{I=m;break}}if(!(h<<24>>24)){f=-1;break}m=(u|0)>-1;do if(h<<24>>24==19)if(m){f=-1;break a}else K=52;else{if(m){k[e+(u<<2)>>2]=q;G=d+(u<<3)|0;H=k[G+4>>2]|0;K=aa;k[K>>2]=k[G>>2];k[K+4>>2]=H;K=52;break}if(!M){f=0;break a}Oc(aa,q,c)}while(0);if((K|0)==52?(K=0,!M):0){w=I;g=y;continue}u=i[g>>0]|0;u=(s|0)!=0&(u&15|0)==3?u&-33:u;m=x&-65537;H=(x&8192|0)==0?x:m;f:do switch(u|0){case 110:switch(s|0){case 0:{k[k[aa>>2]>>2]=f;w=I;g=y;continue a}case 1:{k[k[aa>>2]>>2]=f;w=I;g=y;continue a}case 2:{w=k[aa>>2]|0;k[w>>2]=f;k[w+4>>2]=((f|0)<0)<<31>>31;w=I;g=y;continue a}case 3:{j[k[aa>>2]>>1]=f;w=I;g=y;continue a}case 4:{i[k[aa>>2]>>0]=f;w=I;g=y;continue a}case 6:{k[k[aa>>2]>>2]=f;w=I;g=y;continue a}case 7:{w=k[aa>>2]|0;k[w>>2]=f;k[w+4>>2]=((f|0)<0)<<31>>31;w=I;g=y;continue a}default:{w=I;g=y;continue a}}case 112:{s=H|8;o=o>>>0>8?o:8;u=120;K=64;break}case 88:case 120:{s=H;K=64;break}case 111:{m=aa;h=k[m>>2]|0;m=k[m+4>>2]|0;if((h|0)==0&(m|0)==0)g=N;else{g=N;do{g=g+-1|0;i[g>>0]=h&7|48;h=$c(h|0,m|0,3)|0;m=L}while(!((h|0)==0&(m|0)==0))}if(!(H&8)){h=H;s=0;q=5827;K=77}else{s=U-g+1|0;h=H;o=(o|0)<(s|0)?s:o;s=0;q=5827;K=77}break}case 105:case 100:{h=aa;g=k[h>>2]|0;h=k[h+4>>2]|0;if((h|0)<0){g=Yc(0,0,g|0,h|0)|0;h=L;m=aa;k[m>>2]=g;k[m+4>>2]=h;m=1;q=5827;K=76;break f}if(!(H&2048)){q=H&1;m=q;q=(q|0)==0?5827:5829;K=76}else{m=1;q=5828;K=76}break}case 117:{h=aa;g=k[h>>2]|0;h=k[h+4>>2]|0;m=0;q=5827;K=76;break}case 99:{i[V>>0]=k[aa>>2];w=V;h=1;s=0;u=5827;g=N;break}case 109:{g=mc()|0;g=lc(k[g>>2]|0)|0;K=82;break}case 115:{g=k[aa>>2]|0;g=(g|0)!=0?g:5837;K=82;break}case 67:{k[fa>>2]=k[aa>>2];k[W>>2]=0;k[aa>>2]=fa;o=-1;K=86;break}case 83:{if(!o){Qc(a,32,J,0,H);g=0;K=98}else K=86;break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{n=+p[aa>>3];k[da>>2]=0;p[t>>3]=n;if((k[t+4>>2]|0)>=0)if(!(H&2048)){G=H&1;F=G;G=(G|0)==0?5845:5850}else{F=1;G=5847}else{n=-n;F=1;G=5844}p[t>>3]=n;E=k[t+4>>2]&2146435072;do if(E>>>0<2146435072|(E|0)==2146435072&0<0){v=+pc(n,da)*2.0;h=v!=0.0;if(h)k[da>>2]=(k[da>>2]|0)+-1;C=u|32;if((C|0)==97){w=u&32;y=(w|0)==0?G:G+9|0;x=F|2;g=12-o|0;do if(!(o>>>0>11|(g|0)==0)){n=8.0;do{g=g+-1|0;n=n*16.0}while((g|0)!=0);if((i[y>>0]|0)==45){n=-(n+(-v-n));break}else{n=v+n-n;break}}else n=v;while(0);h=k[da>>2]|0;g=(h|0)<0?0-h|0:h;g=Pc(g,((g|0)<0)<<31>>31,X)|0;if((g|0)==(X|0)){i[Y>>0]=48;g=Y}i[g+-1>>0]=(h>>31&2)+43;s=g+-2|0;i[s>>0]=u+15;q=(o|0)<1;m=(H&8|0)==0;h=ca;while(1){G=~~n;g=h+1|0;i[h>>0]=l[5811+G>>0]|w;n=(n-+(G|0))*16.0;do if((g-Z|0)==1){if(m&(q&n==0.0))break;i[g>>0]=46;g=h+2|0}while(0);if(!(n!=0.0))break;else h=g}o=(o|0)!=0&(O+g|0)<(o|0)?P+o-s|0:$-s+g|0;m=o+x|0;Qc(a,32,J,m,H);if(!(k[a>>2]&32))uc(y,x,a)|0;Qc(a,48,J,m,H^65536);g=g-Z|0;if(!(k[a>>2]&32))uc(ca,g,a)|0;h=_-s|0;Qc(a,48,o-(g+h)|0,0,0);if(!(k[a>>2]&32))uc(s,h,a)|0;Qc(a,32,J,m,H^8192);g=(m|0)<(J|0)?J:m;break}g=(o|0)<0?6:o;if(h){h=(k[da>>2]|0)+-28|0;k[da>>2]=h;n=v*268435456.0}else{n=v;h=k[da>>2]|0}E=(h|0)<0?ba:Q;D=E;h=E;do{B=~~n>>>0;k[h>>2]=B;h=h+4|0;n=(n-+(B>>>0))*1.0e9}while(n!=0.0);m=h;h=k[da>>2]|0;if((h|0)>0){q=E;while(1){s=(h|0)>29?29:h;o=m+-4|0;do if(o>>>0>>0)o=q;else{h=0;do{B=ad(k[o>>2]|0,0,s|0)|0;B=Zc(B|0,L|0,h|0,0)|0;h=L;A=jd(B|0,h|0,1e9,0)|0;k[o>>2]=A;h=id(B|0,h|0,1e9,0)|0;o=o+-4|0}while(o>>>0>=q>>>0);if(!h){o=q;break}o=q+-4|0;k[o>>2]=h}while(0);while(1){if(m>>>0<=o>>>0)break;h=m+-4|0;if(!(k[h>>2]|0))m=h;else break}h=(k[da>>2]|0)-s|0;k[da>>2]=h;if((h|0)>0)q=o;else break}}else o=E;if((h|0)<0){y=((g+25|0)/9|0)+1|0;z=(C|0)==102;w=o;while(1){x=0-h|0;x=(x|0)>9?9:x;do if(w>>>0>>0){h=(1<>>x;o=0;s=w;do{B=k[s>>2]|0;k[s>>2]=(B>>>x)+o;o=ha(B&h,q)|0;s=s+4|0}while(s>>>0>>0);h=(k[w>>2]|0)==0?w+4|0:w;if(!o){o=h;break}k[m>>2]=o;o=h;m=m+4|0}else o=(k[w>>2]|0)==0?w+4|0:w;while(0);h=z?E:o;m=(m-h>>2|0)>(y|0)?h+(y<<2)|0:m;h=(k[da>>2]|0)+x|0;k[da>>2]=h;if((h|0)>=0){w=o;break}else w=o}}else w=o;do if(w>>>0>>0){h=(D-w>>2)*9|0;q=k[w>>2]|0;if(q>>>0<10)break;else o=10;do{o=o*10|0;h=h+1|0}while(q>>>0>=o>>>0)}else h=0;while(0);A=(C|0)==103;B=(g|0)!=0;o=g-((C|0)!=102?h:0)+((B&A)<<31>>31)|0;if((o|0)<(((m-D>>2)*9|0)+-9|0)){s=o+9216|0;z=(s|0)/9|0;o=E+(z+-1023<<2)|0;s=((s|0)%9|0)+1|0;if((s|0)<9){q=10;do{q=q*10|0;s=s+1|0}while((s|0)!=9)}else q=10;x=k[o>>2]|0;y=(x>>>0)%(q>>>0)|0;if((y|0)==0?(E+(z+-1022<<2)|0)==(m|0):0)q=w;else K=163;do if((K|0)==163){K=0;v=(((x>>>0)/(q>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;s=(q|0)/2|0;do if(y>>>0>>0)n=.5;else{if((y|0)==(s|0)?(E+(z+-1022<<2)|0)==(m|0):0){n=1.0;break}n=1.5}while(0);do if(F){if((i[G>>0]|0)!=45)break;v=-v;n=-n}while(0);s=x-y|0;k[o>>2]=s;if(!(v+n!=v)){q=w;break}C=s+q|0;k[o>>2]=C;if(C>>>0>999999999){h=w;while(1){q=o+-4|0;k[o>>2]=0;if(q>>>0>>0){h=h+-4|0;k[h>>2]=0}C=(k[q>>2]|0)+1|0;k[q>>2]=C;if(C>>>0>999999999)o=q;else{w=h;o=q;break}}}h=(D-w>>2)*9|0;s=k[w>>2]|0;if(s>>>0<10){q=w;break}else q=10;do{q=q*10|0;h=h+1|0}while(s>>>0>=q>>>0);q=w}while(0);C=o+4|0;w=q;m=m>>>0>C>>>0?C:m}y=0-h|0;while(1){if(m>>>0<=w>>>0){z=0;C=m;break}o=m+-4|0;if(!(k[o>>2]|0))m=o;else{z=1;C=m;break}}do if(A){g=(B&1^1)+g|0;if((g|0)>(h|0)&(h|0)>-5){u=u+-1|0;g=g+-1-h|0}else{u=u+-2|0;g=g+-1|0}m=H&8;if(m)break;do if(z){m=k[C+-4>>2]|0;if(!m){o=9;break}if(!((m>>>0)%10|0)){q=10;o=0}else{o=0;break}do{q=q*10|0;o=o+1|0}while(((m>>>0)%(q>>>0)|0|0)==0)}else o=9;while(0);m=((C-D>>2)*9|0)+-9|0;if((u|32|0)==102){m=m-o|0;m=(m|0)<0?0:m;g=(g|0)<(m|0)?g:m;m=0;break}else{m=m+h-o|0;m=(m|0)<0?0:m;g=(g|0)<(m|0)?g:m;m=0;break}}else m=H&8;while(0);x=g|m;q=(x|0)!=0&1;s=(u|32|0)==102;if(s){h=(h|0)>0?h:0;u=0}else{o=(h|0)<0?y:h;o=Pc(o,((o|0)<0)<<31>>31,X)|0;if((_-o|0)<2)do{o=o+-1|0;i[o>>0]=48}while((_-o|0)<2);i[o+-1>>0]=(h>>31&2)+43;D=o+-2|0;i[D>>0]=u;h=_-D|0;u=D}y=F+1+g+q+h|0;Qc(a,32,J,y,H);if(!(k[a>>2]&32))uc(G,F,a)|0;Qc(a,48,J,y,H^65536);do if(s){o=w>>>0>E>>>0?E:w;h=o;do{m=Pc(k[h>>2]|0,0,R)|0;do if((h|0)==(o|0)){if((m|0)!=(R|0))break;i[T>>0]=48;m=T}else{if(m>>>0<=ca>>>0)break;do{m=m+-1|0;i[m>>0]=48}while(m>>>0>ca>>>0)}while(0);if(!(k[a>>2]&32))uc(m,S-m|0,a)|0;h=h+4|0}while(h>>>0<=E>>>0);do if(x){if(k[a>>2]&32)break;uc(5879,1,a)|0}while(0);if((g|0)>0&h>>>0>>0){m=h;while(1){h=Pc(k[m>>2]|0,0,R)|0;if(h>>>0>ca>>>0)do{h=h+-1|0;i[h>>0]=48}while(h>>>0>ca>>>0);if(!(k[a>>2]&32))uc(h,(g|0)>9?9:g,a)|0;m=m+4|0;h=g+-9|0;if(!((g|0)>9&m>>>0>>0)){g=h;break}else g=h}}Qc(a,48,g+9|0,9,0)}else{s=z?C:w+4|0;if((g|0)>-1){q=(m|0)==0;o=w;do{h=Pc(k[o>>2]|0,0,R)|0;if((h|0)==(R|0)){i[T>>0]=48;h=T}do if((o|0)==(w|0)){m=h+1|0;if(!(k[a>>2]&32))uc(h,1,a)|0;if(q&(g|0)<1){h=m;break}if(k[a>>2]&32){h=m;break}uc(5879,1,a)|0;h=m}else{if(h>>>0<=ca>>>0)break;do{h=h+-1|0;i[h>>0]=48}while(h>>>0>ca>>>0)}while(0);m=S-h|0;if(!(k[a>>2]&32))uc(h,(g|0)>(m|0)?m:g,a)|0;g=g-m|0;o=o+4|0}while(o>>>0>>0&(g|0)>-1)}Qc(a,48,g+18|0,18,0);if(k[a>>2]&32)break;uc(u,_-u|0,a)|0}while(0);Qc(a,32,J,y,H^8192);g=(y|0)<(J|0)?J:y}else{s=(u&32|0)!=0;q=n!=n|0.0!=0.0;h=q?0:F;o=h+3|0;Qc(a,32,J,o,m);g=k[a>>2]|0;if(!(g&32)){uc(G,h,a)|0;g=k[a>>2]|0}if(!(g&32))uc(q?(s?5871:5875):s?5863:5867,3,a)|0;Qc(a,32,J,o,H^8192);g=(o|0)<(J|0)?J:o}while(0);w=I;continue a}default:{m=H;h=o;s=0;u=5827;g=N}}while(0);g:do if((K|0)==64){m=aa;h=k[m>>2]|0;m=k[m+4>>2]|0;q=u&32;if(!((h|0)==0&(m|0)==0)){g=N;do{g=g+-1|0;i[g>>0]=l[5811+(h&15)>>0]|q;h=$c(h|0,m|0,4)|0;m=L}while(!((h|0)==0&(m|0)==0));K=aa;if((s&8|0)==0|(k[K>>2]|0)==0&(k[K+4>>2]|0)==0){h=s;s=0;q=5827;K=77}else{h=s;s=2;q=5827+(u>>4)|0;K=77}}else{g=N;h=s;s=0;q=5827;K=77}}else if((K|0)==76){g=Pc(g,h,N)|0;h=H;s=m;K=77}else if((K|0)==82){K=0;H=Jc(g,0,o)|0;G=(H|0)==0;w=g;h=G?o:H-g|0;s=0;u=5827;g=G?g+o|0:H}else if((K|0)==86){K=0;h=0;g=0;q=k[aa>>2]|0;while(1){m=k[q>>2]|0;if(!m)break;g=rc(ea,m)|0;if((g|0)<0|g>>>0>(o-h|0)>>>0)break;h=g+h|0;if(o>>>0>h>>>0)q=q+4|0;else break}if((g|0)<0){f=-1;break a}Qc(a,32,J,h,H);if(!h){g=0;K=98}else{m=0;o=k[aa>>2]|0;while(1){g=k[o>>2]|0;if(!g){g=h;K=98;break g}g=rc(ea,g)|0;m=g+m|0;if((m|0)>(h|0)){g=h;K=98;break g}if(!(k[a>>2]&32))uc(ea,g,a)|0;if(m>>>0>=h>>>0){g=h;K=98;break}else o=o+4|0}}}while(0);if((K|0)==98){K=0;Qc(a,32,J,g,H^8192);w=I;g=(J|0)>(g|0)?J:g;continue}if((K|0)==77){K=0;m=(o|0)>-1?h&-65537:h;h=aa;h=(k[h>>2]|0)!=0|(k[h+4>>2]|0)!=0;if((o|0)!=0|h){h=(h&1^1)+(U-g)|0;w=g;h=(o|0)>(h|0)?o:h;u=q;g=N}else{w=N;h=0;u=q;g=N}}q=g-w|0;h=(h|0)<(q|0)?q:h;o=s+h|0;g=(J|0)<(o|0)?o:J;Qc(a,32,g,o,m);if(!(k[a>>2]&32))uc(u,s,a)|0;Qc(a,48,g,o,m^65536);Qc(a,48,h,q,0);if(!(k[a>>2]&32))uc(w,q,a)|0;Qc(a,32,g,o,m^8192);w=I}h:do if((K|0)==245)if(!a)if(b){f=1;while(1){b=k[e+(f<<2)>>2]|0;if(!b)break;Oc(d+(f<<3)|0,b,c);f=f+1|0;if((f|0)>=10){f=1;break h}}if((f|0)<10)while(1){if(k[e+(f<<2)>>2]|0){f=-1;break h}f=f+1|0;if((f|0)>=10){f=1;break}}else f=1}else f=0;while(0);r=ga;return f|0}function Mc(a){a=a|0;if(!(k[a+68>>2]|0))Cc(a);return}function Nc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=a+20|0;e=k[d>>2]|0;a=(k[a+16>>2]|0)-e|0;a=a>>>0>c>>>0?c:a;bd(e|0,b|0,a|0)|0;k[d>>2]=(k[d>>2]|0)+a;return c|0}function Oc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;k[a>>2]=b;break a}case 10:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;d=a;k[d>>2]=b;k[d+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;d=a;k[d>>2]=b;k[d+4>>2]=0;break a}case 12:{d=(k[c>>2]|0)+(8-1)&~(8-1);b=d;e=k[b>>2]|0;b=k[b+4>>2]|0;k[c>>2]=d+8;d=a;k[d>>2]=e;k[d+4>>2]=b;break a}case 13:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;d=(d&65535)<<16>>16;e=a;k[e>>2]=d;k[e+4>>2]=((d|0)<0)<<31>>31;break a}case 14:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;e=a;k[e>>2]=d&65535;k[e+4>>2]=0;break a}case 15:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;d=(d&255)<<24>>24;e=a;k[e>>2]=d;k[e+4>>2]=((d|0)<0)<<31>>31;break a}case 16:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;e=a;k[e>>2]=d&255;k[e+4>>2]=0;break a}case 17:{e=(k[c>>2]|0)+(8-1)&~(8-1);f=+p[e>>3];k[c>>2]=e+8;p[a>>3]=f;break a}case 18:{e=(k[c>>2]|0)+(8-1)&~(8-1);f=+p[e>>3];k[c>>2]=e+8;p[a>>3]=f;break a}default:break a}while(0);while(0);return}function Pc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if(b>>>0>0|(b|0)==0&a>>>0>4294967295)while(1){d=jd(a|0,b|0,10,0)|0;c=c+-1|0;i[c>>0]=d|48;d=id(a|0,b|0,10,0)|0;if(b>>>0>9|(b|0)==9&a>>>0>4294967295){a=d;b=L}else{a=d;break}}if(a)while(1){c=c+-1|0;i[c>>0]=(a>>>0)%10|0|48;if(a>>>0<10)break;else a=(a>>>0)/10|0}return c|0}function Qc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=r;r=r+256|0;g=h;do if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;_c(g|0,b|0,(e>>>0>256?256:e)|0)|0;b=k[a>>2]|0;f=(b&32|0)==0;if(e>>>0>255){d=c-d|0;do{if(f){uc(g,256,a)|0;b=k[a>>2]|0}e=e+-256|0;f=(b&32|0)==0}while(e>>>0>255);if(f)e=d&255;else break}else if(!f)break;uc(g,e,a)|0}while(0);r=h;return}function Rc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;do if(a>>>0<245){o=a>>>0<11?16:a+11&-8;a=o>>>3;h=k[147]|0;c=h>>>a;if(c&3){a=(c&1^1)+a|0;d=a<<1;c=628+(d<<2)|0;d=628+(d+2<<2)|0;e=k[d>>2]|0;f=e+8|0;g=k[f>>2]|0;do if((c|0)!=(g|0)){if(g>>>0<(k[151]|0)>>>0)Aa();b=g+12|0;if((k[b>>2]|0)==(e|0)){k[b>>2]=c;k[d>>2]=g;break}else Aa()}else k[147]=h&~(1<>2]=M|3;M=e+(M|4)|0;k[M>>2]=k[M>>2]|1;M=f;return M|0}g=k[149]|0;if(o>>>0>g>>>0){if(c){d=2<>>12&16;d=d>>>i;e=d>>>5&8;d=d>>>e;f=d>>>2&4;d=d>>>f;c=d>>>1&2;d=d>>>c;a=d>>>1&1;a=(e|i|f|c|a)+(d>>>a)|0;d=a<<1;c=628+(d<<2)|0;d=628+(d+2<<2)|0;f=k[d>>2]|0;i=f+8|0;e=k[i>>2]|0;do if((c|0)!=(e|0)){if(e>>>0<(k[151]|0)>>>0)Aa();b=e+12|0;if((k[b>>2]|0)==(f|0)){k[b>>2]=c;k[d>>2]=e;j=k[149]|0;break}else Aa()}else{k[147]=h&~(1<>2]=o|3;h=f+o|0;k[f+(o|4)>>2]=g|1;k[f+M>>2]=g;if(j){e=k[152]|0;c=j>>>3;b=c<<1;d=628+(b<<2)|0;a=k[147]|0;c=1<>2]|0;if(b>>>0<(k[151]|0)>>>0)Aa();else{l=a;m=b}}else{k[147]=a|c;l=628+(b+2<<2)|0;m=d}k[l>>2]=e;k[m+12>>2]=e;k[e+8>>2]=m;k[e+12>>2]=d}k[149]=g;k[152]=h;M=i;return M|0}a=k[148]|0;if(a){c=(a&0-a)+-1|0;L=c>>>12&16;c=c>>>L;K=c>>>5&8;c=c>>>K;M=c>>>2&4;c=c>>>M;a=c>>>1&2;c=c>>>a;d=c>>>1&1;d=k[892+((K|L|M|a|d)+(c>>>d)<<2)>>2]|0;c=(k[d+4>>2]&-8)-o|0;a=d;while(1){b=k[a+16>>2]|0;if(!b){b=k[a+20>>2]|0;if(!b){i=c;break}}a=(k[b+4>>2]&-8)-o|0;M=a>>>0>>0;c=M?a:c;a=b;d=M?b:d}f=k[151]|0;if(d>>>0>>0)Aa();h=d+o|0;if(d>>>0>=h>>>0)Aa();g=k[d+24>>2]|0;c=k[d+12>>2]|0;do if((c|0)==(d|0)){a=d+20|0;b=k[a>>2]|0;if(!b){a=d+16|0;b=k[a>>2]|0;if(!b){n=0;break}}while(1){c=b+20|0;e=k[c>>2]|0;if(e){b=e;a=c;continue}c=b+16|0;e=k[c>>2]|0;if(!e)break;else{b=e;a=c}}if(a>>>0>>0)Aa();else{k[a>>2]=0;n=b;break}}else{e=k[d+8>>2]|0;if(e>>>0>>0)Aa();b=e+12|0;if((k[b>>2]|0)!=(d|0))Aa();a=c+8|0;if((k[a>>2]|0)==(d|0)){k[b>>2]=c;k[a>>2]=e;n=c;break}else Aa()}while(0);do if(g){b=k[d+28>>2]|0;a=892+(b<<2)|0;if((d|0)==(k[a>>2]|0)){k[a>>2]=n;if(!n){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();b=g+16|0;if((k[b>>2]|0)==(d|0))k[b>>2]=n;else k[g+20>>2]=n;if(!n)break}a=k[151]|0;if(n>>>0>>0)Aa();k[n+24>>2]=g;b=k[d+16>>2]|0;do if(b)if(b>>>0>>0)Aa();else{k[n+16>>2]=b;k[b+24>>2]=n;break}while(0);b=k[d+20>>2]|0;if(b)if(b>>>0<(k[151]|0)>>>0)Aa();else{k[n+20>>2]=b;k[b+24>>2]=n;break}}while(0);if(i>>>0<16){M=i+o|0;k[d+4>>2]=M|3;M=d+(M+4)|0;k[M>>2]=k[M>>2]|1}else{k[d+4>>2]=o|3;k[d+(o|4)>>2]=i|1;k[d+(i+o)>>2]=i;b=k[149]|0;if(b){f=k[152]|0;c=b>>>3;b=c<<1;e=628+(b<<2)|0;a=k[147]|0;c=1<>2]|0;if(a>>>0<(k[151]|0)>>>0)Aa();else{p=b;q=a}}else{k[147]=a|c;p=628+(b+2<<2)|0;q=e}k[p>>2]=f;k[q+12>>2]=f;k[f+8>>2]=q;k[f+12>>2]=e}k[149]=i;k[152]=h}M=d+8|0;return M|0}else q=o}else q=o}else if(a>>>0<=4294967231){a=a+11|0;m=a&-8;l=k[148]|0;if(l){c=0-m|0;a=a>>>8;if(a)if(m>>>0>16777215)j=31;else{q=(a+1048320|0)>>>16&8;v=a<>>16&4;v=v<>>16&2;j=14-(p|q|j)+(v<>>15)|0;j=m>>>(j+7|0)&1|j<<1}else j=0;a=k[892+(j<<2)>>2]|0;a:do if(!a){e=0;a=0;v=86}else{g=c;e=0;h=m<<((j|0)==31?0:25-(j>>>1)|0);i=a;a=0;while(1){f=k[i+4>>2]&-8;c=f-m|0;if(c>>>0>>0)if((f|0)==(m|0)){f=i;a=i;v=90;break a}else a=i;else c=g;v=k[i+20>>2]|0;i=k[i+16+(h>>>31<<2)>>2]|0;e=(v|0)==0|(v|0)==(i|0)?e:v;if(!i){v=86;break}else{g=c;h=h<<1}}}while(0);if((v|0)==86){if((e|0)==0&(a|0)==0){a=2<>>12&16;a=a>>>n;l=a>>>5&8;a=a>>>l;p=a>>>2&4;a=a>>>p;q=a>>>1&2;a=a>>>q;e=a>>>1&1;e=k[892+((l|n|p|q|e)+(a>>>e)<<2)>>2]|0;a=0}if(!e){h=c;i=a}else{f=e;v=90}}if((v|0)==90)while(1){v=0;q=(k[f+4>>2]&-8)-m|0;e=q>>>0>>0;c=e?q:c;a=e?f:a;e=k[f+16>>2]|0;if(e){f=e;v=90;continue}f=k[f+20>>2]|0;if(!f){h=c;i=a;break}else v=90}if((i|0)!=0?h>>>0<((k[149]|0)-m|0)>>>0:0){e=k[151]|0;if(i>>>0>>0)Aa();g=i+m|0;if(i>>>0>=g>>>0)Aa();f=k[i+24>>2]|0;c=k[i+12>>2]|0;do if((c|0)==(i|0)){a=i+20|0;b=k[a>>2]|0;if(!b){a=i+16|0;b=k[a>>2]|0;if(!b){o=0;break}}while(1){c=b+20|0;d=k[c>>2]|0;if(d){b=d;a=c;continue}c=b+16|0;d=k[c>>2]|0;if(!d)break;else{b=d;a=c}}if(a>>>0>>0)Aa();else{k[a>>2]=0;o=b;break}}else{d=k[i+8>>2]|0;if(d>>>0>>0)Aa();b=d+12|0;if((k[b>>2]|0)!=(i|0))Aa();a=c+8|0;if((k[a>>2]|0)==(i|0)){k[b>>2]=c;k[a>>2]=d;o=c;break}else Aa()}while(0);do if(f){b=k[i+28>>2]|0;a=892+(b<<2)|0;if((i|0)==(k[a>>2]|0)){k[a>>2]=o;if(!o){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();b=f+16|0;if((k[b>>2]|0)==(i|0))k[b>>2]=o;else k[f+20>>2]=o;if(!o)break}a=k[151]|0;if(o>>>0>>0)Aa();k[o+24>>2]=f;b=k[i+16>>2]|0;do if(b)if(b>>>0>>0)Aa();else{k[o+16>>2]=b;k[b+24>>2]=o;break}while(0);b=k[i+20>>2]|0;if(b)if(b>>>0<(k[151]|0)>>>0)Aa();else{k[o+20>>2]=b;k[b+24>>2]=o;break}}while(0);b:do if(h>>>0>=16){k[i+4>>2]=m|3;k[i+(m|4)>>2]=h|1;k[i+(h+m)>>2]=h;b=h>>>3;if(h>>>0<256){a=b<<1;d=628+(a<<2)|0;c=k[147]|0;b=1<>2]|0;if(a>>>0<(k[151]|0)>>>0)Aa();else{s=b;t=a}}else{k[147]=c|b;s=628+(a+2<<2)|0;t=d}k[s>>2]=g;k[t+12>>2]=g;k[i+(m+8)>>2]=t;k[i+(m+12)>>2]=d;break}b=h>>>8;if(b)if(h>>>0>16777215)d=31;else{L=(b+1048320|0)>>>16&8;M=b<>>16&4;M=M<>>16&2;d=14-(K|L|d)+(M<>>15)|0;d=h>>>(d+7|0)&1|d<<1}else d=0;b=892+(d<<2)|0;k[i+(m+28)>>2]=d;k[i+(m+20)>>2]=0;k[i+(m+16)>>2]=0;a=k[148]|0;c=1<>2]=g;k[i+(m+24)>>2]=b;k[i+(m+12)>>2]=g;k[i+(m+8)>>2]=g;break}b=k[b>>2]|0;c:do if((k[b+4>>2]&-8|0)!=(h|0)){d=h<<((d|0)==31?0:25-(d>>>1)|0);while(1){a=b+16+(d>>>31<<2)|0;c=k[a>>2]|0;if(!c)break;if((k[c+4>>2]&-8|0)==(h|0)){y=c;break c}else{d=d<<1;b=c}}if(a>>>0<(k[151]|0)>>>0)Aa();else{k[a>>2]=g;k[i+(m+24)>>2]=b;k[i+(m+12)>>2]=g;k[i+(m+8)>>2]=g;break b}}else y=b;while(0);b=y+8|0;a=k[b>>2]|0;M=k[151]|0;if(a>>>0>=M>>>0&y>>>0>=M>>>0){k[a+12>>2]=g;k[b>>2]=g;k[i+(m+8)>>2]=a;k[i+(m+12)>>2]=y;k[i+(m+24)>>2]=0;break}else Aa()}else{M=h+m|0;k[i+4>>2]=M|3;M=i+(M+4)|0;k[M>>2]=k[M>>2]|1}while(0);M=i+8|0;return M|0}else q=m}else q=m}else q=-1;while(0);c=k[149]|0;if(c>>>0>=q>>>0){b=c-q|0;a=k[152]|0;if(b>>>0>15){k[152]=a+q;k[149]=b;k[a+(q+4)>>2]=b|1;k[a+c>>2]=b;k[a+4>>2]=q|3}else{k[149]=0;k[152]=0;k[a+4>>2]=c|3;M=a+(c+4)|0;k[M>>2]=k[M>>2]|1}M=a+8|0;return M|0}a=k[150]|0;if(a>>>0>q>>>0){L=a-q|0;k[150]=L;M=k[153]|0;k[153]=M+q;k[M+(q+4)>>2]=L|1;k[M+4>>2]=q|3;M=M+8|0;return M|0}do if(!(k[265]|0)){a=Ma(30)|0;if(!(a+-1&a)){k[267]=a;k[266]=a;k[268]=-1;k[269]=-1;k[270]=0;k[258]=0;y=(Ea(0)|0)&-16^1431655768;k[265]=y;break}else Aa()}while(0);i=q+48|0;h=k[267]|0;j=q+47|0;g=h+j|0;h=0-h|0;l=g&h;if(l>>>0<=q>>>0){M=0;return M|0}a=k[257]|0;if((a|0)!=0?(t=k[255]|0,y=t+l|0,y>>>0<=t>>>0|y>>>0>a>>>0):0){M=0;return M|0}d:do if(!(k[258]&4)){a=k[153]|0;e:do if(a){e=1036;while(1){c=k[e>>2]|0;if(c>>>0<=a>>>0?(r=e+4|0,(c+(k[r>>2]|0)|0)>>>0>a>>>0):0){f=e;a=r;break}e=k[e+8>>2]|0;if(!e){v=174;break e}}c=g-(k[150]|0)&h;if(c>>>0<2147483647){e=Da(c|0)|0;y=(e|0)==((k[f>>2]|0)+(k[a>>2]|0)|0);a=y?c:0;if(y){if((e|0)!=(-1|0)){w=e;p=a;v=194;break d}}else v=184}else a=0}else v=174;while(0);do if((v|0)==174){f=Da(0)|0;if((f|0)!=(-1|0)){a=f;c=k[266]|0;e=c+-1|0;if(!(e&a))c=l;else c=l-a+(e+a&0-c)|0;a=k[255]|0;e=a+c|0;if(c>>>0>q>>>0&c>>>0<2147483647){y=k[257]|0;if((y|0)!=0?e>>>0<=a>>>0|e>>>0>y>>>0:0){a=0;break}e=Da(c|0)|0;y=(e|0)==(f|0);a=y?c:0;if(y){w=f;p=a;v=194;break d}else v=184}else a=0}else a=0}while(0);f:do if((v|0)==184){f=0-c|0;do if(i>>>0>c>>>0&(c>>>0<2147483647&(e|0)!=(-1|0))?(u=k[267]|0,u=j-c+u&0-u,u>>>0<2147483647):0)if((Da(u|0)|0)==(-1|0)){Da(f|0)|0;break f}else{c=u+c|0;break}while(0);if((e|0)!=(-1|0)){w=e;p=c;v=194;break d}}while(0);k[258]=k[258]|4;v=191}else{a=0;v=191}while(0);if((((v|0)==191?l>>>0<2147483647:0)?(w=Da(l|0)|0,x=Da(0)|0,w>>>0>>0&((w|0)!=(-1|0)&(x|0)!=(-1|0))):0)?(z=x-w|0,A=z>>>0>(q+40|0)>>>0,A):0){p=A?z:a;v=194}if((v|0)==194){a=(k[255]|0)+p|0;k[255]=a;if(a>>>0>(k[256]|0)>>>0)k[256]=a;g=k[153]|0;g:do if(g){f=1036;do{a=k[f>>2]|0;c=f+4|0;e=k[c>>2]|0;if((w|0)==(a+e|0)){B=a;C=c;D=e;E=f;v=204;break}f=k[f+8>>2]|0}while((f|0)!=0);if(((v|0)==204?(k[E+12>>2]&8|0)==0:0)?g>>>0>>0&g>>>0>=B>>>0:0){k[C>>2]=D+p;M=(k[150]|0)+p|0;L=g+8|0;L=(L&7|0)==0?0:0-L&7;K=M-L|0;k[153]=g+L;k[150]=K;k[g+(L+4)>>2]=K|1;k[g+(M+4)>>2]=40;k[154]=k[269];break}a=k[151]|0;if(w>>>0>>0){k[151]=w;a=w}c=w+p|0;f=1036;while(1){if((k[f>>2]|0)==(c|0)){e=f;c=f;v=212;break}f=k[f+8>>2]|0;if(!f){c=1036;break}}if((v|0)==212)if(!(k[c+12>>2]&8)){k[e>>2]=w;n=c+4|0;k[n>>2]=(k[n>>2]|0)+p;n=w+8|0;n=(n&7|0)==0?0:0-n&7;j=w+(p+8)|0;j=(j&7|0)==0?0:0-j&7;b=w+(j+p)|0;m=n+q|0;o=w+m|0;l=b-(w+n)-q|0;k[w+(n+4)>>2]=q|3;h:do if((b|0)!=(g|0)){if((b|0)==(k[152]|0)){M=(k[149]|0)+l|0;k[149]=M;k[152]=o;k[w+(m+4)>>2]=M|1;k[w+(M+m)>>2]=M;break}h=p+4|0;c=k[w+(h+j)>>2]|0;if((c&3|0)==1){i=c&-8;f=c>>>3;i:do if(c>>>0>=256){g=k[w+((j|24)+p)>>2]|0;d=k[w+(p+12+j)>>2]|0;do if((d|0)==(b|0)){e=j|16;d=w+(h+e)|0;c=k[d>>2]|0;if(!c){d=w+(e+p)|0;c=k[d>>2]|0;if(!c){J=0;break}}while(1){e=c+20|0;f=k[e>>2]|0;if(f){c=f;d=e;continue}e=c+16|0;f=k[e>>2]|0;if(!f)break;else{c=f;d=e}}if(d>>>0>>0)Aa();else{k[d>>2]=0;J=c;break}}else{e=k[w+((j|8)+p)>>2]|0;if(e>>>0>>0)Aa();a=e+12|0;if((k[a>>2]|0)!=(b|0))Aa();c=d+8|0;if((k[c>>2]|0)==(b|0)){k[a>>2]=d;k[c>>2]=e;J=d;break}else Aa()}while(0);if(!g)break;a=k[w+(p+28+j)>>2]|0;c=892+(a<<2)|0;do if((b|0)!=(k[c>>2]|0)){if(g>>>0<(k[151]|0)>>>0)Aa();a=g+16|0;if((k[a>>2]|0)==(b|0))k[a>>2]=J;else k[g+20>>2]=J;if(!J)break i}else{k[c>>2]=J;if(J)break;k[148]=k[148]&~(1<>>0>>0)Aa();k[J+24>>2]=g;b=j|16;a=k[w+(b+p)>>2]|0;do if(a)if(a>>>0>>0)Aa();else{k[J+16>>2]=a;k[a+24>>2]=J;break}while(0);b=k[w+(h+b)>>2]|0;if(!b)break;if(b>>>0<(k[151]|0)>>>0)Aa();else{k[J+20>>2]=b;k[b+24>>2]=J;break}}else{d=k[w+((j|8)+p)>>2]|0;e=k[w+(p+12+j)>>2]|0;c=628+(f<<1<<2)|0;do if((d|0)!=(c|0)){if(d>>>0>>0)Aa();if((k[d+12>>2]|0)==(b|0))break;Aa()}while(0);if((e|0)==(d|0)){k[147]=k[147]&~(1<>>0>>0)Aa();a=e+8|0;if((k[a>>2]|0)==(b|0)){F=a;break}Aa()}while(0);k[d+12>>2]=e;k[F>>2]=d}while(0);b=w+((i|j)+p)|0;e=i+l|0}else e=l;b=b+4|0;k[b>>2]=k[b>>2]&-2;k[w+(m+4)>>2]=e|1;k[w+(e+m)>>2]=e;b=e>>>3;if(e>>>0<256){a=b<<1;d=628+(a<<2)|0;c=k[147]|0;b=1<>2]|0;if(a>>>0>=(k[151]|0)>>>0){K=b;L=a;break}Aa()}while(0);k[K>>2]=o;k[L+12>>2]=o;k[w+(m+8)>>2]=L;k[w+(m+12)>>2]=d;break}b=e>>>8;do if(!b)d=0;else{if(e>>>0>16777215){d=31;break}K=(b+1048320|0)>>>16&8;L=b<>>16&4;L=L<>>16&2;d=14-(J|K|d)+(L<>>15)|0;d=e>>>(d+7|0)&1|d<<1}while(0);b=892+(d<<2)|0;k[w+(m+28)>>2]=d;k[w+(m+20)>>2]=0;k[w+(m+16)>>2]=0;a=k[148]|0;c=1<>2]=o;k[w+(m+24)>>2]=b;k[w+(m+12)>>2]=o;k[w+(m+8)>>2]=o;break}b=k[b>>2]|0;j:do if((k[b+4>>2]&-8|0)!=(e|0)){d=e<<((d|0)==31?0:25-(d>>>1)|0);while(1){a=b+16+(d>>>31<<2)|0;c=k[a>>2]|0;if(!c)break;if((k[c+4>>2]&-8|0)==(e|0)){M=c;break j}else{d=d<<1;b=c}}if(a>>>0<(k[151]|0)>>>0)Aa();else{k[a>>2]=o;k[w+(m+24)>>2]=b;k[w+(m+12)>>2]=o;k[w+(m+8)>>2]=o;break h}}else M=b;while(0);b=M+8|0;a=k[b>>2]|0;L=k[151]|0;if(a>>>0>=L>>>0&M>>>0>=L>>>0){k[a+12>>2]=o;k[b>>2]=o;k[w+(m+8)>>2]=a;k[w+(m+12)>>2]=M;k[w+(m+24)>>2]=0;break}else Aa()}else{M=(k[150]|0)+l|0;k[150]=M;k[153]=o;k[w+(m+4)>>2]=M|1}while(0);M=w+(n|8)|0;return M|0}else c=1036;while(1){a=k[c>>2]|0;if(a>>>0<=g>>>0?(b=k[c+4>>2]|0,d=a+b|0,d>>>0>g>>>0):0)break;c=k[c+8>>2]|0}e=a+(b+-39)|0;a=a+(b+-47+((e&7|0)==0?0:0-e&7))|0;e=g+16|0;a=a>>>0>>0?g:a;b=a+8|0;c=w+8|0;c=(c&7|0)==0?0:0-c&7;M=p+-40-c|0;k[153]=w+c;k[150]=M;k[w+(c+4)>>2]=M|1;k[w+(p+-36)>>2]=40;k[154]=k[269];c=a+4|0;k[c>>2]=27;k[b>>2]=k[259];k[b+4>>2]=k[260];k[b+8>>2]=k[261];k[b+12>>2]=k[262];k[259]=w;k[260]=p;k[262]=0;k[261]=b;b=a+28|0;k[b>>2]=7;if((a+32|0)>>>0>>0)do{M=b;b=b+4|0;k[b>>2]=7}while((M+8|0)>>>0>>0);if((a|0)!=(g|0)){f=a-g|0;k[c>>2]=k[c>>2]&-2;k[g+4>>2]=f|1;k[a>>2]=f;b=f>>>3;if(f>>>0<256){a=b<<1;d=628+(a<<2)|0;c=k[147]|0;b=1<>2]|0;if(a>>>0<(k[151]|0)>>>0)Aa();else{G=b;H=a}}else{k[147]=c|b;G=628+(a+2<<2)|0;H=d}k[G>>2]=g;k[H+12>>2]=g;k[g+8>>2]=H;k[g+12>>2]=d;break}b=f>>>8;if(b)if(f>>>0>16777215)d=31;else{L=(b+1048320|0)>>>16&8;M=b<>>16&4;M=M<>>16&2;d=14-(K|L|d)+(M<>>15)|0;d=f>>>(d+7|0)&1|d<<1}else d=0;c=892+(d<<2)|0;k[g+28>>2]=d;k[g+20>>2]=0;k[e>>2]=0;b=k[148]|0;a=1<>2]=g;k[g+24>>2]=c;k[g+12>>2]=g;k[g+8>>2]=g;break}b=k[c>>2]|0;k:do if((k[b+4>>2]&-8|0)!=(f|0)){d=f<<((d|0)==31?0:25-(d>>>1)|0);while(1){a=b+16+(d>>>31<<2)|0;c=k[a>>2]|0;if(!c)break;if((k[c+4>>2]&-8|0)==(f|0)){I=c;break k}else{d=d<<1;b=c}}if(a>>>0<(k[151]|0)>>>0)Aa();else{k[a>>2]=g;k[g+24>>2]=b;k[g+12>>2]=g;k[g+8>>2]=g;break g}}else I=b;while(0);b=I+8|0;a=k[b>>2]|0;M=k[151]|0;if(a>>>0>=M>>>0&I>>>0>=M>>>0){k[a+12>>2]=g;k[b>>2]=g;k[g+8>>2]=a;k[g+12>>2]=I;k[g+24>>2]=0;break}else Aa()}}else{M=k[151]|0;if((M|0)==0|w>>>0>>0)k[151]=w;k[259]=w;k[260]=p;k[262]=0;k[156]=k[265];k[155]=-1;b=0;do{M=b<<1;L=628+(M<<2)|0;k[628+(M+3<<2)>>2]=L;k[628+(M+2<<2)>>2]=L;b=b+1|0}while((b|0)!=32);M=w+8|0;M=(M&7|0)==0?0:0-M&7;L=p+-40-M|0;k[153]=w+M;k[150]=L;k[w+(M+4)>>2]=L|1;k[w+(p+-36)>>2]=40;k[154]=k[269]}while(0);b=k[150]|0;if(b>>>0>q>>>0){L=b-q|0;k[150]=L;M=k[153]|0;k[153]=M+q;k[M+(q+4)>>2]=L|1;k[M+4>>2]=q|3;M=M+8|0;return M|0}}M=mc()|0;k[M>>2]=12;M=0;return M|0}function Sc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;if(!a)return;b=a+-8|0;h=k[151]|0;if(b>>>0>>0)Aa();c=k[a+-4>>2]|0;d=c&3;if((d|0)==1)Aa();o=c&-8;q=a+(o+-8)|0;do if(!(c&1)){b=k[b>>2]|0;if(!d)return;i=-8-b|0;l=a+i|0;m=b+o|0;if(l>>>0>>0)Aa();if((l|0)==(k[152]|0)){b=a+(o+-4)|0;c=k[b>>2]|0;if((c&3|0)!=3){u=l;f=m;break}k[149]=m;k[b>>2]=c&-2;k[a+(i+4)>>2]=m|1;k[q>>2]=m;return}e=b>>>3;if(b>>>0<256){d=k[a+(i+8)>>2]|0;c=k[a+(i+12)>>2]|0;b=628+(e<<1<<2)|0;if((d|0)!=(b|0)){if(d>>>0>>0)Aa();if((k[d+12>>2]|0)!=(l|0))Aa()}if((c|0)==(d|0)){k[147]=k[147]&~(1<>>0>>0)Aa();b=c+8|0;if((k[b>>2]|0)==(l|0))g=b;else Aa()}else g=c+8|0;k[d+12>>2]=c;k[g>>2]=d;u=l;f=m;break}g=k[a+(i+24)>>2]|0;d=k[a+(i+12)>>2]|0;do if((d|0)==(l|0)){c=a+(i+20)|0;b=k[c>>2]|0;if(!b){c=a+(i+16)|0;b=k[c>>2]|0;if(!b){j=0;break}}while(1){d=b+20|0;e=k[d>>2]|0;if(e){b=e;c=d;continue}d=b+16|0;e=k[d>>2]|0;if(!e)break;else{b=e;c=d}}if(c>>>0>>0)Aa();else{k[c>>2]=0;j=b;break}}else{e=k[a+(i+8)>>2]|0;if(e>>>0>>0)Aa();b=e+12|0;if((k[b>>2]|0)!=(l|0))Aa();c=d+8|0;if((k[c>>2]|0)==(l|0)){k[b>>2]=d;k[c>>2]=e;j=d;break}else Aa()}while(0);if(g){b=k[a+(i+28)>>2]|0;c=892+(b<<2)|0;if((l|0)==(k[c>>2]|0)){k[c>>2]=j;if(!j){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();b=g+16|0;if((k[b>>2]|0)==(l|0))k[b>>2]=j;else k[g+20>>2]=j;if(!j){u=l;f=m;break}}c=k[151]|0;if(j>>>0>>0)Aa();k[j+24>>2]=g;b=k[a+(i+16)>>2]|0;do if(b)if(b>>>0>>0)Aa();else{k[j+16>>2]=b;k[b+24>>2]=j;break}while(0);b=k[a+(i+20)>>2]|0;if(b)if(b>>>0<(k[151]|0)>>>0)Aa();else{k[j+20>>2]=b;k[b+24>>2]=j;u=l;f=m;break}else{u=l;f=m}}else{u=l;f=m}}else{u=b;f=o}while(0);if(u>>>0>=q>>>0)Aa();b=a+(o+-4)|0;c=k[b>>2]|0;if(!(c&1))Aa();if(!(c&2)){if((q|0)==(k[153]|0)){t=(k[150]|0)+f|0;k[150]=t;k[153]=u;k[u+4>>2]=t|1;if((u|0)!=(k[152]|0))return;k[152]=0;k[149]=0;return}if((q|0)==(k[152]|0)){t=(k[149]|0)+f|0;k[149]=t;k[152]=u;k[u+4>>2]=t|1;k[u+t>>2]=t;return}f=(c&-8)+f|0;e=c>>>3;do if(c>>>0>=256){g=k[a+(o+16)>>2]|0;b=k[a+(o|4)>>2]|0;do if((b|0)==(q|0)){c=a+(o+12)|0;b=k[c>>2]|0;if(!b){c=a+(o+8)|0;b=k[c>>2]|0;if(!b){p=0;break}}while(1){d=b+20|0;e=k[d>>2]|0;if(e){b=e;c=d;continue}d=b+16|0;e=k[d>>2]|0;if(!e)break;else{b=e;c=d}}if(c>>>0<(k[151]|0)>>>0)Aa();else{k[c>>2]=0;p=b;break}}else{c=k[a+o>>2]|0;if(c>>>0<(k[151]|0)>>>0)Aa();d=c+12|0;if((k[d>>2]|0)!=(q|0))Aa();e=b+8|0;if((k[e>>2]|0)==(q|0)){k[d>>2]=b;k[e>>2]=c;p=b;break}else Aa()}while(0);if(g){b=k[a+(o+20)>>2]|0;c=892+(b<<2)|0;if((q|0)==(k[c>>2]|0)){k[c>>2]=p;if(!p){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();b=g+16|0;if((k[b>>2]|0)==(q|0))k[b>>2]=p;else k[g+20>>2]=p;if(!p)break}c=k[151]|0;if(p>>>0>>0)Aa();k[p+24>>2]=g;b=k[a+(o+8)>>2]|0;do if(b)if(b>>>0>>0)Aa();else{k[p+16>>2]=b;k[b+24>>2]=p;break}while(0);b=k[a+(o+12)>>2]|0;if(b)if(b>>>0<(k[151]|0)>>>0)Aa();else{k[p+20>>2]=b;k[b+24>>2]=p;break}}}else{d=k[a+o>>2]|0;c=k[a+(o|4)>>2]|0;b=628+(e<<1<<2)|0;if((d|0)!=(b|0)){if(d>>>0<(k[151]|0)>>>0)Aa();if((k[d+12>>2]|0)!=(q|0))Aa()}if((c|0)==(d|0)){k[147]=k[147]&~(1<>>0<(k[151]|0)>>>0)Aa();b=c+8|0;if((k[b>>2]|0)==(q|0))n=b;else Aa()}else n=c+8|0;k[d+12>>2]=c;k[n>>2]=d}while(0);k[u+4>>2]=f|1;k[u+f>>2]=f;if((u|0)==(k[152]|0)){k[149]=f;return}}else{k[b>>2]=c&-2;k[u+4>>2]=f|1;k[u+f>>2]=f}b=f>>>3;if(f>>>0<256){c=b<<1;e=628+(c<<2)|0;d=k[147]|0;b=1<>2]|0;if(c>>>0<(k[151]|0)>>>0)Aa();else{r=b;s=c}}else{k[147]=d|b;r=628+(c+2<<2)|0;s=e}k[r>>2]=u;k[s+12>>2]=u;k[u+8>>2]=s;k[u+12>>2]=e;return}b=f>>>8;if(b)if(f>>>0>16777215)e=31;else{r=(b+1048320|0)>>>16&8;s=b<>>16&4;s=s<>>16&2;e=14-(q|r|e)+(s<>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;b=892+(e<<2)|0;k[u+28>>2]=e;k[u+20>>2]=0;k[u+16>>2]=0;c=k[148]|0;d=1<>2]|0;b:do if((k[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){c=b+16+(e>>>31<<2)|0;d=k[c>>2]|0;if(!d)break;if((k[d+4>>2]&-8|0)==(f|0)){t=d;break b}else{e=e<<1;b=d}}if(c>>>0<(k[151]|0)>>>0)Aa();else{k[c>>2]=u;k[u+24>>2]=b;k[u+12>>2]=u;k[u+8>>2]=u;break a}}else t=b;while(0);b=t+8|0;c=k[b>>2]|0;s=k[151]|0;if(c>>>0>=s>>>0&t>>>0>=s>>>0){k[c+12>>2]=u;k[b>>2]=u;k[u+8>>2]=c;k[u+12>>2]=t;k[u+24>>2]=0;break}else Aa()}else{k[148]=c|d;k[b>>2]=u;k[u+24>>2]=b;k[u+12>>2]=u;k[u+8>>2]=u}while(0);u=(k[155]|0)+-1|0;k[155]=u;if(!u)b=1044;else return;while(1){b=k[b>>2]|0;if(!b)break;else b=b+8|0}k[155]=-1;return}function Tc(a,b){a=a|0;b=b|0;var c=0,d=0;if(!a){a=Rc(b)|0;return a|0}if(b>>>0>4294967231){a=mc()|0;k[a>>2]=12;a=0;return a|0}c=Vc(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(c){a=c+8|0;return a|0}c=Rc(b)|0;if(!c){a=0;return a|0}d=k[a+-4>>2]|0;d=(d&-8)-((d&3|0)==0?8:4)|0;bd(c|0,a|0,(d>>>0>>0?d:b)|0)|0;Sc(a);a=c;return a|0}function Uc(a){a=a|0;var b=0;if(!a){b=0;return b|0}a=k[a+-4>>2]|0;b=a&3;if((b|0)==1){b=0;return b|0}b=(a&-8)-((b|0)==0?8:4)|0;return b|0}function Vc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;o=a+4|0;p=k[o>>2]|0;i=p&-8;l=a+i|0;h=k[151]|0;c=p&3;if(!((c|0)!=1&a>>>0>=h>>>0&a>>>0>>0))Aa();d=a+(i|4)|0;e=k[d>>2]|0;if(!(e&1))Aa();if(!c){if(b>>>0<256){a=0;return a|0}if(i>>>0>=(b+4|0)>>>0?(i-b|0)>>>0<=k[267]<<1>>>0:0)return a|0;a=0;return a|0}if(i>>>0>=b>>>0){c=i-b|0;if(c>>>0<=15)return a|0;k[o>>2]=p&1|b|2;k[a+(b+4)>>2]=c|3;k[d>>2]=k[d>>2]|1;Wc(a+b|0,c);return a|0}if((l|0)==(k[153]|0)){c=(k[150]|0)+i|0;if(c>>>0<=b>>>0){a=0;return a|0}n=c-b|0;k[o>>2]=p&1|b|2;k[a+(b+4)>>2]=n|1;k[153]=a+b;k[150]=n;return a|0}if((l|0)==(k[152]|0)){d=(k[149]|0)+i|0;if(d>>>0>>0){a=0;return a|0}c=d-b|0;if(c>>>0>15){k[o>>2]=p&1|b|2;k[a+(b+4)>>2]=c|1;k[a+d>>2]=c;d=a+(d+4)|0;k[d>>2]=k[d>>2]&-2;d=a+b|0}else{k[o>>2]=p&1|d|2;d=a+(d+4)|0;k[d>>2]=k[d>>2]|1;d=0;c=0}k[149]=c;k[152]=d;return a|0}if(e&2){a=0;return a|0}m=(e&-8)+i|0;if(m>>>0>>0){a=0;return a|0}n=m-b|0;f=e>>>3;do if(e>>>0>=256){g=k[a+(i+24)>>2]|0;f=k[a+(i+12)>>2]|0;do if((f|0)==(l|0)){d=a+(i+20)|0;c=k[d>>2]|0;if(!c){d=a+(i+16)|0;c=k[d>>2]|0;if(!c){j=0;break}}while(1){e=c+20|0;f=k[e>>2]|0;if(f){c=f;d=e;continue}e=c+16|0;f=k[e>>2]|0;if(!f)break;else{c=f;d=e}}if(d>>>0>>0)Aa();else{k[d>>2]=0;j=c;break}}else{e=k[a+(i+8)>>2]|0;if(e>>>0>>0)Aa();c=e+12|0;if((k[c>>2]|0)!=(l|0))Aa();d=f+8|0;if((k[d>>2]|0)==(l|0)){k[c>>2]=f;k[d>>2]=e;j=f;break}else Aa()}while(0);if(g){c=k[a+(i+28)>>2]|0;d=892+(c<<2)|0;if((l|0)==(k[d>>2]|0)){k[d>>2]=j;if(!j){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();c=g+16|0;if((k[c>>2]|0)==(l|0))k[c>>2]=j;else k[g+20>>2]=j;if(!j)break}d=k[151]|0;if(j>>>0>>0)Aa();k[j+24>>2]=g;c=k[a+(i+16)>>2]|0;do if(c)if(c>>>0>>0)Aa();else{k[j+16>>2]=c;k[c+24>>2]=j;break}while(0);c=k[a+(i+20)>>2]|0;if(c)if(c>>>0<(k[151]|0)>>>0)Aa();else{k[j+20>>2]=c;k[c+24>>2]=j;break}}}else{e=k[a+(i+8)>>2]|0;d=k[a+(i+12)>>2]|0;c=628+(f<<1<<2)|0;if((e|0)!=(c|0)){if(e>>>0>>0)Aa();if((k[e+12>>2]|0)!=(l|0))Aa()}if((d|0)==(e|0)){k[147]=k[147]&~(1<>>0>>0)Aa();c=d+8|0;if((k[c>>2]|0)==(l|0))g=c;else Aa()}else g=d+8|0;k[e+12>>2]=d;k[g>>2]=e}while(0);if(n>>>0<16){k[o>>2]=m|p&1|2;b=a+(m|4)|0;k[b>>2]=k[b>>2]|1;return a|0}else{k[o>>2]=p&1|b|2;k[a+(b+4)>>2]=n|3;p=a+(m|4)|0;k[p>>2]=k[p>>2]|1;Wc(a+b|0,n);return a|0}return 0}function Wc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;q=a+b|0;c=k[a+4>>2]|0;do if(!(c&1)){j=k[a>>2]|0;if(!(c&3))return;n=a+(0-j)|0;m=j+b|0;i=k[151]|0;if(n>>>0>>0)Aa();if((n|0)==(k[152]|0)){d=a+(b+4)|0;c=k[d>>2]|0;if((c&3|0)!=3){t=n;g=m;break}k[149]=m;k[d>>2]=c&-2;k[a+(4-j)>>2]=m|1;k[q>>2]=m;return}f=j>>>3;if(j>>>0<256){e=k[a+(8-j)>>2]|0;d=k[a+(12-j)>>2]|0;c=628+(f<<1<<2)|0;if((e|0)!=(c|0)){if(e>>>0>>0)Aa();if((k[e+12>>2]|0)!=(n|0))Aa()}if((d|0)==(e|0)){k[147]=k[147]&~(1<>>0>>0)Aa();c=d+8|0;if((k[c>>2]|0)==(n|0))h=c;else Aa()}else h=d+8|0;k[e+12>>2]=d;k[h>>2]=e;t=n;g=m;break}h=k[a+(24-j)>>2]|0;e=k[a+(12-j)>>2]|0;do if((e|0)==(n|0)){e=16-j|0;d=a+(e+4)|0;c=k[d>>2]|0;if(!c){d=a+e|0;c=k[d>>2]|0;if(!c){l=0;break}}while(1){e=c+20|0;f=k[e>>2]|0;if(f){c=f;d=e;continue}e=c+16|0;f=k[e>>2]|0;if(!f)break;else{c=f;d=e}}if(d>>>0>>0)Aa();else{k[d>>2]=0;l=c;break}}else{f=k[a+(8-j)>>2]|0;if(f>>>0>>0)Aa();c=f+12|0;if((k[c>>2]|0)!=(n|0))Aa();d=e+8|0;if((k[d>>2]|0)==(n|0)){k[c>>2]=e;k[d>>2]=f;l=e;break}else Aa()}while(0);if(h){c=k[a+(28-j)>>2]|0;d=892+(c<<2)|0;if((n|0)==(k[d>>2]|0)){k[d>>2]=l;if(!l){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();c=h+16|0;if((k[c>>2]|0)==(n|0))k[c>>2]=l;else k[h+20>>2]=l;if(!l){t=n;g=m;break}}e=k[151]|0;if(l>>>0>>0)Aa();k[l+24>>2]=h;c=16-j|0;d=k[a+c>>2]|0;do if(d)if(d>>>0>>0)Aa();else{k[l+16>>2]=d;k[d+24>>2]=l;break}while(0);c=k[a+(c+4)>>2]|0;if(c)if(c>>>0<(k[151]|0)>>>0)Aa();else{k[l+20>>2]=c;k[c+24>>2]=l;t=n;g=m;break}else{t=n;g=m}}else{t=n;g=m}}else{t=a;g=b}while(0);i=k[151]|0;if(q>>>0>>0)Aa();c=a+(b+4)|0;d=k[c>>2]|0;if(!(d&2)){if((q|0)==(k[153]|0)){s=(k[150]|0)+g|0;k[150]=s;k[153]=t;k[t+4>>2]=s|1;if((t|0)!=(k[152]|0))return;k[152]=0;k[149]=0;return}if((q|0)==(k[152]|0)){s=(k[149]|0)+g|0;k[149]=s;k[152]=t;k[t+4>>2]=s|1;k[t+s>>2]=s;return}g=(d&-8)+g|0;f=d>>>3;do if(d>>>0>=256){h=k[a+(b+24)>>2]|0;e=k[a+(b+12)>>2]|0;do if((e|0)==(q|0)){d=a+(b+20)|0;c=k[d>>2]|0;if(!c){d=a+(b+16)|0;c=k[d>>2]|0;if(!c){p=0;break}}while(1){e=c+20|0;f=k[e>>2]|0;if(f){c=f;d=e;continue}e=c+16|0;f=k[e>>2]|0;if(!f)break;else{c=f;d=e}}if(d>>>0>>0)Aa();else{k[d>>2]=0;p=c;break}}else{f=k[a+(b+8)>>2]|0;if(f>>>0>>0)Aa();c=f+12|0;if((k[c>>2]|0)!=(q|0))Aa();d=e+8|0;if((k[d>>2]|0)==(q|0)){k[c>>2]=e;k[d>>2]=f;p=e;break}else Aa()}while(0);if(h){c=k[a+(b+28)>>2]|0;d=892+(c<<2)|0;if((q|0)==(k[d>>2]|0)){k[d>>2]=p;if(!p){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();c=h+16|0;if((k[c>>2]|0)==(q|0))k[c>>2]=p;else k[h+20>>2]=p;if(!p)break}d=k[151]|0;if(p>>>0>>0)Aa();k[p+24>>2]=h;c=k[a+(b+16)>>2]|0;do if(c)if(c>>>0>>0)Aa();else{k[p+16>>2]=c;k[c+24>>2]=p;break}while(0);c=k[a+(b+20)>>2]|0;if(c)if(c>>>0<(k[151]|0)>>>0)Aa();else{k[p+20>>2]=c;k[c+24>>2]=p;break}}}else{e=k[a+(b+8)>>2]|0;d=k[a+(b+12)>>2]|0;c=628+(f<<1<<2)|0;if((e|0)!=(c|0)){if(e>>>0>>0)Aa();if((k[e+12>>2]|0)!=(q|0))Aa()}if((d|0)==(e|0)){k[147]=k[147]&~(1<>>0>>0)Aa();c=d+8|0;if((k[c>>2]|0)==(q|0))o=c;else Aa()}else o=d+8|0;k[e+12>>2]=d;k[o>>2]=e}while(0);k[t+4>>2]=g|1;k[t+g>>2]=g;if((t|0)==(k[152]|0)){k[149]=g;return}}else{k[c>>2]=d&-2;k[t+4>>2]=g|1;k[t+g>>2]=g}c=g>>>3;if(g>>>0<256){d=c<<1;f=628+(d<<2)|0;e=k[147]|0;c=1<>2]|0;if(d>>>0<(k[151]|0)>>>0)Aa();else{r=c;s=d}}else{k[147]=e|c;r=628+(d+2<<2)|0;s=f}k[r>>2]=t;k[s+12>>2]=t;k[t+8>>2]=s;k[t+12>>2]=f;return}c=g>>>8;if(c)if(g>>>0>16777215)f=31;else{r=(c+1048320|0)>>>16&8;s=c<>>16&4;s=s<>>16&2;f=14-(q|r|f)+(s<>>15)|0;f=g>>>(f+7|0)&1|f<<1}else f=0;c=892+(f<<2)|0;k[t+28>>2]=f;k[t+20>>2]=0;k[t+16>>2]=0;d=k[148]|0;e=1<>2]=t;k[t+24>>2]=c;k[t+12>>2]=t;k[t+8>>2]=t;return}c=k[c>>2]|0;a:do if((k[c+4>>2]&-8|0)!=(g|0)){f=g<<((f|0)==31?0:25-(f>>>1)|0);while(1){d=c+16+(f>>>31<<2)|0;e=k[d>>2]|0;if(!e)break;if((k[e+4>>2]&-8|0)==(g|0)){c=e;break a}else{f=f<<1;c=e}}if(d>>>0<(k[151]|0)>>>0)Aa();k[d>>2]=t;k[t+24>>2]=c;k[t+12>>2]=t;k[t+8>>2]=t;return}while(0);d=c+8|0;e=k[d>>2]|0;s=k[151]|0;if(!(e>>>0>=s>>>0&c>>>0>=s>>>0))Aa();k[e+12>>2]=t;k[d>>2]=t;k[t+8>>2]=e;k[t+12>>2]=c;k[t+24>>2]=0;return}function Xc(){}function Yc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (L=d,a-c>>>0|0)|0}function Zc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (L=b+d+(c>>>0>>0|0)>>>0,c|0)|0}function _c(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=a+c|0;if((c|0)>=20){b=b&255;f=a&3;g=b|b<<8|b<<16|b<<24;e=d&~3;if(f){f=a+4-f|0;while((a|0)<(f|0)){i[a>>0]=b;a=a+1|0}}while((a|0)<(e|0)){k[a>>2]=g;a=a+4|0}}while((a|0)<(d|0)){i[a>>0]=b;a=a+1|0}return a-c|0}function $c(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b>>>c;return a>>>c|(b&(1<>>c-32|0}function ad(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b<>>32-c;return a<=4096)return Ha(a|0,b|0,c|0)|0;d=a|0;if((a&3)==(b&3)){while(a&3){if(!c)return d|0;i[a>>0]=i[b>>0]|0;a=a+1|0;b=b+1|0;c=c-1|0}while((c|0)>=4){k[a>>2]=k[b>>2];a=a+4|0;b=b+4|0;c=c-4|0}}while((c|0)>0){i[a>>0]=i[b>>0]|0;a=a+1|0;b=b+1|0;c=c-1|0}return d|0}function cd(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b>>c;return a>>>c|(b&(1<>c-32|0}function dd(a){a=a|0;var b=0;b=i[v+(a&255)>>0]|0;if((b|0)<8)return b|0;b=i[v+(a>>8&255)>>0]|0;if((b|0)<8)return b+8|0;b=i[v+(a>>16&255)>>0]|0;if((b|0)<8)return b+16|0;return (i[v+(a>>>24)>>0]|0)+24|0}function ed(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=ha(e,f)|0;d=a>>>16;a=(c>>>16)+(ha(e,d)|0)|0;e=b>>>16;b=ha(e,f)|0;return (L=(a>>>16)+(ha(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function fd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=Yc(j^a,i^b,j,i)|0;g=L;a=f^j;b=e^i;return Yc((kd(h,g,Yc(f^c,e^d,f,e)|0,L,0)|0)^a,L^b,a,b)|0}function gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=r;r=r+16|0;h=e|0;g=b>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;j=d>>31|((d|0)<0?-1:0)<<1;i=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;a=Yc(g^a,f^b,g,f)|0;b=L;kd(a,b,Yc(j^c,i^d,j,i)|0,L,h)|0;d=Yc(k[h>>2]^g,k[h+4>>2]^f,g,f)|0;c=L;r=e;return (L=c,d)|0}function hd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=ed(e,f)|0;a=L;return (L=(ha(b,f)|0)+(ha(d,e)|0)+a|a&0,c|0|0)|0}function id(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return kd(a,b,c,d,0)|0}function jd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=r;r=r+16|0;e=f|0;kd(a,b,c,d,e)|0;r=f;return (L=k[e+4>>2]|0,k[e>>2]|0)|0}function kd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;l=a;i=b;j=i;g=c;n=d;h=n;if(!j){f=(e|0)!=0;if(!h){if(f){k[e>>2]=(l>>>0)%(g>>>0);k[e+4>>2]=0}n=0;e=(l>>>0)/(g>>>0)>>>0;return (L=n,e)|0}else{if(!f){n=0;e=0;return (L=n,e)|0}k[e>>2]=a|0;k[e+4>>2]=b&0;n=0;e=0;return (L=n,e)|0}}f=(h|0)==0;do if(g){if(!f){f=(ja(h|0)|0)-(ja(j|0)|0)|0;if(f>>>0<=31){m=f+1|0;h=31-f|0;b=f-31>>31;g=m;a=l>>>(m>>>0)&b|j<>>(m>>>0)&b;f=0;h=l<>2]=a|0;k[e+4>>2]=i|b&0;n=0;e=0;return (L=n,e)|0}f=g-1|0;if(f&g){h=(ja(g|0)|0)+33-(ja(j|0)|0)|0;p=64-h|0;m=32-h|0;i=m>>31;o=h-32|0;b=o>>31;g=h;a=m-1>>31&j>>>(o>>>0)|(j<>>(h>>>0))&b;b=b&j>>>(h>>>0);f=l<>>(o>>>0))&i|l<>31;break}if(e){k[e>>2]=f&l;k[e+4>>2]=0}if((g|0)==1){o=i|b&0;p=a|0|0;return (L=o,p)|0}else{p=dd(g|0)|0;o=j>>>(p>>>0)|0;p=j<<32-p|l>>>(p>>>0)|0;return (L=o,p)|0}}else{if(f){if(e){k[e>>2]=(j>>>0)%(g>>>0);k[e+4>>2]=0}o=0;p=(j>>>0)/(g>>>0)>>>0;return (L=o,p)|0}if(!l){if(e){k[e>>2]=0;k[e+4>>2]=(j>>>0)%(h>>>0)}o=0;p=(j>>>0)/(h>>>0)>>>0;return (L=o,p)|0}f=h-1|0;if(!(f&h)){if(e){k[e>>2]=a|0;k[e+4>>2]=f&j|b&0}o=0;p=j>>>((dd(h|0)|0)>>>0);return (L=o,p)|0}f=(ja(h|0)|0)-(ja(j|0)|0)|0;if(f>>>0<=30){b=f+1|0;h=31-f|0;g=b;a=j<>>(b>>>0);b=j>>>(b>>>0);f=0;h=l<>2]=a|0;k[e+4>>2]=i|b&0;o=0;p=0;return (L=o,p)|0}while(0);if(!g){j=h;i=0;h=0}else{m=c|0|0;l=n|d&0;j=Zc(m|0,l|0,-1,-1)|0;c=L;i=h;h=0;do{d=i;i=f>>>31|i<<1;f=h|f<<1;d=a<<1|d>>>31|0;n=a>>>31|b<<1|0;Yc(j,c,d,n)|0;p=L;o=p>>31|((p|0)<0?-1:0)<<1;h=o&1;a=Yc(d,n,o&m,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l)|0;b=L;g=g-1|0}while((g|0)!=0);j=i;i=0}g=0;if(e){k[e>>2]=a;k[e+4>>2]=b}o=(f|0)>>>31|(j|g)<<1|(g<<1|f>>>31)&0|i;p=(f<<1|0>>>31)&-2|h;return (L=o,p)|0}function ld(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ra[a&7](b|0,c|0,d|0)|0}function md(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Sa[a&3](b|0,c|0,d|0,e|0,f|0)}function nd(a,b){a=a|0;b=b|0;Ta[a&7](b|0)}function od(a,b){a=a|0;b=b|0;return Ua[a&1](b|0)|0}function pd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Va[a&0](b|0,c|0,d|0)}function qd(a){a=a|0;Wa[a&3]()}function rd(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;Xa[a&3](b|0,c|0,d|0,e|0,f|0,g|0)}function sd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Ya[a&3](b|0,c|0,d|0,e|0)}function td(a,b,c){a=a|0;b=b|0;c=c|0;ka(0);return 0}function ud(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ka(1)}function vd(a){a=a|0;ka(2)}function wd(a){a=a|0;ka(3);return 0}function xd(a,b,c){a=a|0;b=b|0;c=c|0;ka(4)}function yd(){ka(5)}function zd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;ka(6)}function Ad(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ka(7)} + function Za(a){a=a|0;var b=0;b=r;r=r+a|0;r=r+15&-16;return b|0}function _a(){return r|0}function $a(a){a=a|0;r=a}function ab(a,b){a=a|0;b=b|0;r=a;s=b}function bb(a,b){a=a|0;b=b|0;if(!w){w=a;x=b}}function cb(a){a=a|0;i[t>>0]=i[a>>0];i[t+1>>0]=i[a+1>>0];i[t+2>>0]=i[a+2>>0];i[t+3>>0]=i[a+3>>0]}function db(a){a=a|0;i[t>>0]=i[a>>0];i[t+1>>0]=i[a+1>>0];i[t+2>>0]=i[a+2>>0];i[t+3>>0]=i[a+3>>0];i[t+4>>0]=i[a+4>>0];i[t+5>>0]=i[a+5>>0];i[t+6>>0]=i[a+6>>0];i[t+7>>0]=i[a+7>>0]}function eb(a){a=a|0;L=a}function fb(){return L|0}function gb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0;o=r;r=r+576|0;l=o+48|0;h=o+32|0;g=o+16|0;f=o;j=o+64|0;m=o+60|0;i=a+4|0;n=a+8|0;if((k[i>>2]|0)>>>0>(k[n>>2]|0)>>>0){k[f>>2]=1138;k[f+4>>2]=2119;k[f+8>>2]=1117;yc(j,1084,f)|0;xc(j)|0}if((2147418112/(d>>>0)|0)>>>0<=b>>>0){k[g>>2]=1138;k[g+4>>2]=2120;k[g+8>>2]=1157;yc(j,1084,g)|0;xc(j)|0}g=k[n>>2]|0;if(g>>>0>=b>>>0){n=1;r=o;return n|0}do if(c){if(b){f=b+-1|0;if(!(f&b)){f=11;break}else b=f}else b=-1;b=b>>>16|b;b=b>>>8|b;b=b>>>4|b;b=b>>>2|b;b=(b>>>1|b)+1|0;f=10}else f=10;while(0);if((f|0)==10)if(!b){b=0;f=12}else f=11;if((f|0)==11)if(b>>>0<=g>>>0)f=12;if((f|0)==12){k[h>>2]=1138;k[h+4>>2]=2129;k[h+8>>2]=1205;yc(j,1084,h)|0;xc(j)|0}c=ha(b,d)|0;do if(!e){f=hb(k[a>>2]|0,c,m,1)|0;if(!f){n=0;r=o;return n|0}else{k[a>>2]=f;break}}else{g=ib(c,m)|0;if(!g){n=0;r=o;return n|0}Va[e&0](g,k[a>>2]|0,k[i>>2]|0);f=k[a>>2]|0;do if(f)if(!(f&7)){kb(f,0,0,1,0)|0;break}else{k[l>>2]=1138;k[l+4>>2]=2502;k[l+8>>2]=1504;yc(j,1084,l)|0;xc(j)|0;break}while(0);k[a>>2]=g}while(0);f=k[m>>2]|0;if(f>>>0>c>>>0)b=(f>>>0)/(d>>>0)|0;k[n>>2]=b;n=1;r=o;return n|0}function hb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=r;r=r+560|0;i=j+32|0;f=j+16|0;e=j;h=j+48|0;g=j+44|0;if(a&7){k[e>>2]=1138;k[e+4>>2]=2502;k[e+8>>2]=1482;yc(h,1084,e)|0;xc(h)|0;i=0;r=j;return i|0}if(b>>>0>2147418112){k[f>>2]=1138;k[f+4>>2]=2502;k[f+8>>2]=1375;yc(h,1084,f)|0;xc(h)|0;i=0;r=j;return i|0}k[g>>2]=b;d=kb(a,b,g,d,0)|0;if(c)k[c>>2]=k[g>>2];if(!(d&7)){i=d;r=j;return i|0}k[i>>2]=1138;k[i+4>>2]=2554;k[i+8>>2]=1428;yc(h,1084,i)|0;xc(h)|0;i=d;r=j;return i|0}function ib(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;i=r;r=r+560|0;h=i+32|0;g=i+16|0;c=i;f=i+48|0;e=i+44|0;d=a+3&-4;d=(d|0)!=0?d:4;if(d>>>0>2147418112){k[c>>2]=1138;k[c+4>>2]=2502;k[c+8>>2]=1375;yc(f,1084,c)|0;xc(f)|0;h=0;r=i;return h|0}k[e>>2]=d;c=kb(0,d,e,1,0)|0;a=k[e>>2]|0;if(b)k[b>>2]=a;if((c|0)==0|a>>>0>>0){k[g>>2]=1138;k[g+4>>2]=2502;k[g+8>>2]=1401;yc(f,1084,g)|0;xc(f)|0;h=0;r=i;return h|0}if(!(c&7)){h=c;r=i;return h|0}k[h>>2]=1138;k[h+4>>2]=2529;k[h+8>>2]=1428;yc(f,1084,h)|0;xc(f)|0;h=c;r=i;return h|0}function jb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;L=r;r=r+880|0;I=L+144|0;H=L+128|0;G=L+112|0;F=L+96|0;C=L+80|0;w=L+64|0;u=L+48|0;v=L+32|0;q=L+16|0;p=L;E=L+360|0;J=L+296|0;K=L+224|0;t=L+156|0;if((b|0)==0|d>>>0>11){a=0;r=L;return a|0}k[a>>2]=b;e=K;f=e+68|0;do{k[e>>2]=0;e=e+4|0}while((e|0)<(f|0));f=0;do{e=i[c+f>>0]|0;if(e<<24>>24){D=K+((e&255)<<2)|0;k[D>>2]=(k[D>>2]|0)+1}f=f+1|0}while((f|0)!=(b|0));f=0;o=1;g=0;h=-1;n=0;while(1){e=k[K+(o<<2)>>2]|0;if(!e)k[a+28+(o+-1<<2)>>2]=0;else{D=o+-1|0;k[J+(D<<2)>>2]=f;f=e+f|0;B=16-o|0;k[a+28+(D<<2)>>2]=(f+-1<>2]=n;k[t+(o<<2)>>2]=n;g=g>>>0>o>>>0?g:o;h=h>>>0>>0?h:o;n=e+n|0}o=o+1|0;if((o|0)==17){D=g;break}else f=f<<1}k[a+4>>2]=n;f=a+172|0;do if(n>>>0>(k[f>>2]|0)>>>0){k[f>>2]=n;if(n){e=n+-1|0;if(e&n)s=14}else{e=-1;s=14}if((s|0)==14){B=e>>>16|e;B=B>>>8|B;B=B>>>4|B;B=B>>>2|B;B=(B>>>1|B)+1|0;k[f>>2]=B>>>0>b>>>0?b:B}g=a+176|0;e=k[g>>2]|0;do if(e){B=k[e+-4>>2]|0;e=e+-8|0;if(!((B|0)!=0?(B|0)==(~k[e>>2]|0):0)){k[p>>2]=1138;k[p+4>>2]=647;k[p+8>>2]=1851;yc(E,1084,p)|0;xc(E)|0}if(!(e&7)){kb(e,0,0,1,0)|0;break}else{k[q>>2]=1138;k[q+4>>2]=2502;k[q+8>>2]=1504;yc(E,1084,q)|0;xc(E)|0;break}}while(0);f=k[f>>2]|0;f=(f|0)!=0?f:1;e=ib((f<<1)+8|0,0)|0;if(!e){k[g>>2]=0;e=0;break}else{k[e+4>>2]=f;k[e>>2]=~f;k[g>>2]=e+8;s=25;break}}else s=25;while(0);a:do if((s|0)==25){B=a+24|0;i[B>>0]=h;i[a+25>>0]=D;f=a+176|0;g=0;do{A=i[c+g>>0]|0;e=A&255;if(A<<24>>24){if(!(k[K+(e<<2)>>2]|0)){k[v>>2]=1138;k[v+4>>2]=2272;k[v+8>>2]=1249;yc(E,1084,v)|0;xc(E)|0}A=t+(e<<2)|0;e=k[A>>2]|0;k[A>>2]=e+1;if(e>>>0>=n>>>0){k[u>>2]=1138;k[u+4>>2]=2276;k[u+8>>2]=1262;yc(E,1084,u)|0;xc(E)|0}j[(k[f>>2]|0)+(e<<1)>>1]=g}g=g+1|0}while((g|0)!=(b|0));e=i[B>>0]|0;z=(e&255)>>>0>>0?d:0;A=a+8|0;k[A>>2]=z;y=(z|0)!=0;if(y){x=1<>>0>(k[e>>2]|0)>>>0){k[e>>2]=x;g=a+168|0;e=k[g>>2]|0;do if(e){v=k[e+-4>>2]|0;e=e+-8|0;if(!((v|0)!=0?(v|0)==(~k[e>>2]|0):0)){k[w>>2]=1138;k[w+4>>2]=647;k[w+8>>2]=1851;yc(E,1084,w)|0;xc(E)|0}if(!(e&7)){kb(e,0,0,1,0)|0;break}else{k[C>>2]=1138;k[C+4>>2]=2502;k[C+8>>2]=1504;yc(E,1084,C)|0;xc(E)|0;break}}while(0);e=x<<2;f=ib(e+8|0,0)|0;if(!f){k[g>>2]=0;e=0;break a}else{C=f+8|0;k[f+4>>2]=x;k[f>>2]=~x;k[g>>2]=C;f=C;break}}else{f=a+168|0;e=x<<2;g=f;f=k[f>>2]|0}while(0);$c(f|0,-1,e|0)|0;t=a+176|0;w=1;do{if(k[K+(w<<2)>>2]|0){u=z-w|0;v=1<>2]|0;if(f>>>0>=16){k[F>>2]=1138;k[F+4>>2]=1956;k[F+8>>2]=1725;yc(E,1084,F)|0;xc(E)|0}e=k[a+28+(f<<2)>>2]|0;if(!e)b=-1;else b=(e+-1|0)>>>(16-w|0);if(h>>>0<=b>>>0){q=(k[a+96+(f<<2)>>2]|0)-h|0;s=w<<16;do{e=m[(k[t>>2]|0)+(q+h<<1)>>1]|0;if((l[c+e>>0]|0|0)!=(w|0)){k[G>>2]=1138;k[G+4>>2]=2318;k[G+8>>2]=1291;yc(E,1084,G)|0;xc(E)|0}p=h<>>0>=x>>>0){k[H>>2]=1138;k[H+4>>2]=2324;k[H+8>>2]=1325;yc(E,1084,H)|0;xc(E)|0}e=k[g>>2]|0;if((k[e+(n<<2)>>2]|0)!=-1){k[I>>2]=1138;k[I+4>>2]=2326;k[I+8>>2]=1348;yc(E,1084,I)|0;xc(E)|0;e=k[g>>2]|0}k[e+(n<<2)>>2]=f;o=o+1|0}while(o>>>0>>0);h=h+1|0}while(h>>>0<=b>>>0)}}w=w+1|0}while(z>>>0>=w>>>0);e=i[B>>0]|0}f=a+96|0;k[f>>2]=(k[f>>2]|0)-(k[J>>2]|0);f=a+100|0;k[f>>2]=(k[f>>2]|0)-(k[J+4>>2]|0);f=a+104|0;k[f>>2]=(k[f>>2]|0)-(k[J+8>>2]|0);f=a+108|0;k[f>>2]=(k[f>>2]|0)-(k[J+12>>2]|0);f=a+112|0;k[f>>2]=(k[f>>2]|0)-(k[J+16>>2]|0);f=a+116|0;k[f>>2]=(k[f>>2]|0)-(k[J+20>>2]|0);f=a+120|0;k[f>>2]=(k[f>>2]|0)-(k[J+24>>2]|0);f=a+124|0;k[f>>2]=(k[f>>2]|0)-(k[J+28>>2]|0);f=a+128|0;k[f>>2]=(k[f>>2]|0)-(k[J+32>>2]|0);f=a+132|0;k[f>>2]=(k[f>>2]|0)-(k[J+36>>2]|0);f=a+136|0;k[f>>2]=(k[f>>2]|0)-(k[J+40>>2]|0);f=a+140|0;k[f>>2]=(k[f>>2]|0)-(k[J+44>>2]|0);f=a+144|0;k[f>>2]=(k[f>>2]|0)-(k[J+48>>2]|0);f=a+148|0;k[f>>2]=(k[f>>2]|0)-(k[J+52>>2]|0);f=a+152|0;k[f>>2]=(k[f>>2]|0)-(k[J+56>>2]|0);f=a+156|0;k[f>>2]=(k[f>>2]|0)-(k[J+60>>2]|0);f=a+16|0;k[f>>2]=0;g=a+20|0;k[g>>2]=e&255;b:do if(y){while(1){if(!d)break b;e=d+-1|0;if(!(k[K+(d<<2)>>2]|0))d=e;else break}k[f>>2]=k[a+28+(e<<2)>>2];e=z+1|0;k[g>>2]=e;if(e>>>0<=D>>>0){while(1){if(k[K+(e<<2)>>2]|0)break;e=e+1|0;if(e>>>0>D>>>0)break b}k[g>>2]=e}}while(0);k[a+92>>2]=-1;k[a+160>>2]=1048575;k[a+12>>2]=32-(k[A>>2]|0);e=1}while(0);a=e;r=L;return a|0}function kb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;do if(!a){d=Sc(b)|0;if(c){if(!d)a=0;else a=Vc(d)|0;k[c>>2]=a}}else{if(!b){Tc(a);if(!c){d=0;break}k[c>>2]=0;d=0;break}if(d){d=Uc(a,b)|0;a=(d|0)==0?a:d}else d=0;if(c){b=Vc(a)|0;k[c>>2]=b}}while(0);return d|0}function lb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if(!((a|0)!=0&b>>>0>73&(c|0)!=0)){c=0;return c|0}if((k[c>>2]|0)!=40|b>>>0<74){c=0;return c|0}if(((l[a>>0]|0)<<8|(l[a+1>>0]|0)|0)!=18552){c=0;return c|0}if(((l[a+2>>0]|0)<<8|(l[a+3>>0]|0))>>>0<74){c=0;return c|0}if(((l[a+7>>0]|0)<<16|(l[a+6>>0]|0)<<24|(l[a+8>>0]|0)<<8|(l[a+9>>0]|0))>>>0>b>>>0){c=0;return c|0}k[c+4>>2]=(l[a+12>>0]|0)<<8|(l[a+13>>0]|0);k[c+8>>2]=(l[a+14>>0]|0)<<8|(l[a+15>>0]|0);k[c+12>>2]=l[a+16>>0];k[c+16>>2]=l[a+17>>0];b=a+18|0;d=c+32|0;k[d>>2]=l[b>>0];k[d+4>>2]=0;b=i[b>>0]|0;k[c+20>>2]=b<<24>>24==0|b<<24>>24==9?8:16;k[c+24>>2]=(l[a+26>>0]|0)<<16|(l[a+25>>0]|0)<<24|(l[a+27>>0]|0)<<8|(l[a+28>>0]|0);k[c+28>>2]=(l[a+30>>0]|0)<<16|(l[a+29>>0]|0)<<24|(l[a+31>>0]|0)<<8|(l[a+32>>0]|0);c=1;return c|0}function mb(a){a=a|0;Oa(a|0)|0;Sb()}function nb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;f=r;r=r+528|0;e=f;d=f+16|0;b=k[a+20>>2]|0;if(b)ob(b);b=a+4|0;c=k[b>>2]|0;if(!c){e=a+16|0;i[e>>0]=0;r=f;return}if(!(c&7))kb(c,0,0,1,0)|0;else{k[e>>2]=1138;k[e+4>>2]=2502;k[e+8>>2]=1504;yc(d,1084,e)|0;xc(d)|0}k[b>>2]=0;k[a+8>>2]=0;k[a+12>>2]=0;e=a+16|0;i[e>>0]=0;r=f;return}function ob(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;i=r;r=r+592|0;g=i+64|0;f=i+48|0;h=i+32|0;d=i+16|0;c=i;e=i+80|0;if(!a){r=i;return}b=k[a+168>>2]|0;do if(b){j=k[b+-4>>2]|0;b=b+-8|0;if(!((j|0)!=0?(j|0)==(~k[b>>2]|0):0)){k[c>>2]=1138;k[c+4>>2]=647;k[c+8>>2]=1851;yc(e,1084,c)|0;xc(e)|0}if(!(b&7)){kb(b,0,0,1,0)|0;break}else{k[d>>2]=1138;k[d+4>>2]=2502;k[d+8>>2]=1504;yc(e,1084,d)|0;xc(e)|0;break}}while(0);b=k[a+176>>2]|0;do if(b){j=k[b+-4>>2]|0;b=b+-8|0;if(!((j|0)!=0?(j|0)==(~k[b>>2]|0):0)){k[h>>2]=1138;k[h+4>>2]=647;k[h+8>>2]=1851;yc(e,1084,h)|0;xc(e)|0}if(!(b&7)){kb(b,0,0,1,0)|0;break}else{k[f>>2]=1138;k[f+4>>2]=2502;k[f+8>>2]=1504;yc(e,1084,f)|0;xc(e)|0;break}}while(0);if(!(a&7)){kb(a,0,0,1,0)|0;r=i;return}else{k[g>>2]=1138;k[g+4>>2]=2502;k[g+8>>2]=1504;yc(e,1084,g)|0;xc(e)|0;r=i;return}}function pb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;i=r;r=r+544|0;g=i+16|0;b=i;f=i+32|0;e=a+8|0;c=k[e>>2]|0;if((c+-1|0)>>>0>=8192){k[b>>2]=1138;k[b+4>>2]=3002;k[b+8>>2]=1529;yc(f,1084,b)|0;xc(f)|0}k[a>>2]=c;d=a+20|0;b=k[d>>2]|0;if(!b){b=ib(180,0)|0;if(!b)b=0;else{h=b+164|0;k[h>>2]=0;k[h+4>>2]=0;k[h+8>>2]=0;k[h+12>>2]=0}k[d>>2]=b;h=k[a>>2]|0}else h=c;if(!(k[e>>2]|0)){k[g>>2]=1138;k[g+4>>2]=906;k[g+8>>2]=1769;yc(f,1084,g)|0;xc(f)|0;g=k[a>>2]|0}else g=h;f=k[a+4>>2]|0;if(g>>>0>16){d=g;c=0}else{a=0;a=jb(b,h,f,a)|0;r=i;return a|0}while(1){e=c+1|0;if(d>>>0>3){d=d>>>1;c=e}else{d=e;break}}a=c+2+((d|0)!=32&1<>>0>>0&1)|0;a=a>>>0<11?a&255:11;a=jb(b,h,f,a)|0;r=i;return a|0}function qb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=r;r=r+720|0;z=E+160|0;y=E+144|0;x=E+128|0;w=E+112|0;v=E+96|0;u=E+80|0;t=E+64|0;s=E+48|0;n=E+32|0;h=E+16|0;e=E;C=E+200|0;D=E+176|0;A=rb(a,14)|0;if(!A){k[b>>2]=0;c=b+4|0;d=k[c>>2]|0;if(d){if(!(d&7))kb(d,0,0,1,0)|0;else{k[e>>2]=1138;k[e+4>>2]=2502;k[e+8>>2]=1504;yc(C,1084,e)|0;xc(C)|0}k[c>>2]=0;k[b+8>>2]=0;k[b+12>>2]=0}i[b+16>>0]=0;c=b+20|0;d=k[c>>2]|0;if(!d){b=1;r=E;return b|0}ob(d);k[c>>2]=0;b=1;r=E;return b|0}p=b+4|0;q=b+8|0;c=k[q>>2]|0;if((c|0)!=(A|0)){if(c>>>0<=A>>>0){do if((k[b+12>>2]|0)>>>0>>0){if(gb(p,A,(c+1|0)==(A|0),1,0)|0){c=k[q>>2]|0;break}i[b+16>>0]=1;b=0;r=E;return b|0}while(0);$c((k[p>>2]|0)+c|0,0,A-c|0)|0}k[q>>2]=A}$c(k[p>>2]|0,0,A|0)|0;o=a+20|0;c=k[o>>2]|0;if((c|0)<5){f=a+4|0;g=a+8|0;e=a+16|0;do{d=k[f>>2]|0;if((d|0)==(k[g>>2]|0))d=0;else{k[f>>2]=d+1;d=l[d>>0]|0}c=c+8|0;k[o>>2]=c;if((c|0)>=33){k[h>>2]=1138;k[h+4>>2]=3204;k[h+8>>2]=1638;yc(C,1084,h)|0;xc(C)|0;c=k[o>>2]|0}d=d<<32-c|k[e>>2];k[e>>2]=d}while((c|0)<5)}else{d=a+16|0;e=d;d=k[d>>2]|0}m=d>>>27;k[e>>2]=d<<5;k[o>>2]=c+-5;if((m+-1|0)>>>0>20){b=0;r=E;return b|0}k[D+20>>2]=0;k[D>>2]=0;k[D+4>>2]=0;k[D+8>>2]=0;k[D+12>>2]=0;i[D+16>>0]=0;c=D+4|0;d=D+8|0;a:do if(gb(c,21,0,1,0)|0){h=k[d>>2]|0;j=k[c>>2]|0;$c(j+h|0,0,21-h|0)|0;k[d>>2]=21;if(m){e=a+4|0;f=a+8|0;g=a+16|0;h=0;do{c=k[o>>2]|0;if((c|0)<3)do{d=k[e>>2]|0;if((d|0)==(k[f>>2]|0))d=0;else{k[e>>2]=d+1;d=l[d>>0]|0}c=c+8|0;k[o>>2]=c;if((c|0)>=33){k[n>>2]=1138;k[n+4>>2]=3204;k[n+8>>2]=1638;yc(C,1084,n)|0;xc(C)|0;c=k[o>>2]|0}d=d<<32-c|k[g>>2];k[g>>2]=d}while((c|0)<3);else d=k[g>>2]|0;k[g>>2]=d<<3;k[o>>2]=c+-3;i[j+(l[1599+h>>0]|0)>>0]=d>>>29;h=h+1|0}while((h|0)!=(m|0))}if(pb(D)|0){m=a+4|0;h=a+8|0;j=a+16|0;d=0;b:while(1){g=A-d|0;c=sb(a,D)|0;c:do if(c>>>0<17){if((k[q>>2]|0)>>>0<=d>>>0){k[s>>2]=1138;k[s+4>>2]=906;k[s+8>>2]=1769;yc(C,1084,s)|0;xc(C)|0}i[(k[p>>2]|0)+d>>0]=c;c=d+1|0}else switch(c|0){case 17:{c=k[o>>2]|0;if((c|0)<3)do{e=k[m>>2]|0;if((e|0)==(k[h>>2]|0))e=0;else{k[m>>2]=e+1;e=l[e>>0]|0}c=c+8|0;k[o>>2]=c;if((c|0)>=33){k[t>>2]=1138;k[t+4>>2]=3204;k[t+8>>2]=1638;yc(C,1084,t)|0;xc(C)|0;c=k[o>>2]|0}e=e<<32-c|k[j>>2];k[j>>2]=e}while((c|0)<3);else e=k[j>>2]|0;k[j>>2]=e<<3;k[o>>2]=c+-3;c=(e>>>29)+3|0;if(c>>>0>g>>>0){c=0;break a}c=c+d|0;break c}case 18:{c=k[o>>2]|0;if((c|0)<7)do{e=k[m>>2]|0;if((e|0)==(k[h>>2]|0))e=0;else{k[m>>2]=e+1;e=l[e>>0]|0}c=c+8|0;k[o>>2]=c;if((c|0)>=33){k[u>>2]=1138;k[u+4>>2]=3204;k[u+8>>2]=1638;yc(C,1084,u)|0;xc(C)|0;c=k[o>>2]|0}e=e<<32-c|k[j>>2];k[j>>2]=e}while((c|0)<7);else e=k[j>>2]|0;k[j>>2]=e<<7;k[o>>2]=c+-7;c=(e>>>25)+11|0;if(c>>>0>g>>>0){c=0;break a}c=c+d|0;break c}default:{if((c+-19|0)>>>0>=2){B=90;break b}f=k[o>>2]|0;if((c|0)==19){if((f|0)<2){e=f;while(1){c=k[m>>2]|0;if((c|0)==(k[h>>2]|0))f=0;else{k[m>>2]=c+1;f=l[c>>0]|0}c=e+8|0;k[o>>2]=c;if((c|0)>=33){k[v>>2]=1138;k[v+4>>2]=3204;k[v+8>>2]=1638;yc(C,1084,v)|0;xc(C)|0;c=k[o>>2]|0}e=f<<32-c|k[j>>2];k[j>>2]=e;if((c|0)<2)e=c;else break}}else{e=k[j>>2]|0;c=f}k[j>>2]=e<<2;k[o>>2]=c+-2;f=(e>>>30)+3|0}else{if((f|0)<6){e=f;while(1){c=k[m>>2]|0;if((c|0)==(k[h>>2]|0))f=0;else{k[m>>2]=c+1;f=l[c>>0]|0}c=e+8|0;k[o>>2]=c;if((c|0)>=33){k[w>>2]=1138;k[w+4>>2]=3204;k[w+8>>2]=1638;yc(C,1084,w)|0;xc(C)|0;c=k[o>>2]|0}e=f<<32-c|k[j>>2];k[j>>2]=e;if((c|0)<6)e=c;else break}}else{e=k[j>>2]|0;c=f}k[j>>2]=e<<6;k[o>>2]=c+-6;f=(e>>>26)+7|0}if((d|0)==0|f>>>0>g>>>0){c=0;break a}c=d+-1|0;if((k[q>>2]|0)>>>0<=c>>>0){k[x>>2]=1138;k[x+4>>2]=906;k[x+8>>2]=1769;yc(C,1084,x)|0;xc(C)|0}e=i[(k[p>>2]|0)+c>>0]|0;if(!(e<<24>>24)){c=0;break a}c=f+d|0;if(d>>>0>=c>>>0){c=d;break c}do{if((k[q>>2]|0)>>>0<=d>>>0){k[y>>2]=1138;k[y+4>>2]=906;k[y+8>>2]=1769;yc(C,1084,y)|0;xc(C)|0}i[(k[p>>2]|0)+d>>0]=e;d=d+1|0}while((d|0)!=(c|0))}}while(0);if(A>>>0>c>>>0)d=c;else break}if((B|0)==90){k[z>>2]=1138;k[z+4>>2]=3145;k[z+8>>2]=1620;yc(C,1084,z)|0;xc(C)|0;c=0;break}if((A|0)==(c|0))c=pb(b)|0;else c=0}else c=0}else{i[D+16>>0]=1;c=0}while(0);nb(D);b=c;r=E;return b|0}function rb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=r;r=r+528|0;g=j;f=j+16|0;if(!b){i=0;r=j;return i|0}if(b>>>0<=16){i=tb(a,b)|0;r=j;return i|0}h=tb(a,b+-16|0)|0;i=a+20|0;b=k[i>>2]|0;if((b|0)<16){d=a+4|0;e=a+8|0;c=a+16|0;do{a=k[d>>2]|0;if((a|0)==(k[e>>2]|0))a=0;else{k[d>>2]=a+1;a=l[a>>0]|0}b=b+8|0;k[i>>2]=b;if((b|0)>=33){k[g>>2]=1138;k[g+4>>2]=3204;k[g+8>>2]=1638;yc(f,1084,g)|0;xc(f)|0;b=k[i>>2]|0}a=a<<32-b|k[c>>2];k[c>>2]=a}while((b|0)<16)}else{a=a+16|0;c=a;a=k[a>>2]|0}k[c>>2]=a<<16;k[i>>2]=b+-16;i=a>>>16|h<<16;r=j;return i|0}function sb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,n=0,o=0,p=0,q=0,s=0,t=0;t=r;r=r+576|0;o=t+48|0;n=t+32|0;j=t+16|0;i=t;q=t+64|0;p=k[b+20>>2]|0;s=a+20|0;h=k[s>>2]|0;do if((h|0)<24){g=a+4|0;d=k[g>>2]|0;e=k[a+8>>2]|0;c=d>>>0>>0;if((h|0)>=16){if(c){k[g>>2]=d+1;c=l[d>>0]|0}else c=0;k[s>>2]=h+8;g=a+16|0;f=c<<24-h|k[g>>2];k[g>>2]=f;break}if(c){f=(l[d>>0]|0)<<8;c=d+1|0}else{f=0;c=d}if(c>>>0>>0){d=l[c>>0]|0;c=c+1|0}else d=0;k[g>>2]=c;k[s>>2]=h+16;g=a+16|0;f=(d|f)<<16-h|k[g>>2];k[g>>2]=f}else{f=a+16|0;g=f;f=k[f>>2]|0}while(0);e=(f>>>16)+1|0;do if(e>>>0<=(k[p+16>>2]|0)>>>0){d=k[(k[p+168>>2]|0)+(f>>>(32-(k[p+8>>2]|0)|0)<<2)>>2]|0;if((d|0)==-1){k[i>>2]=1138;k[i+4>>2]=3249;k[i+8>>2]=1665;yc(q,1084,i)|0;xc(q)|0}c=d&65535;d=d>>>16;if((k[b+8>>2]|0)>>>0<=c>>>0){k[j>>2]=1138;k[j+4>>2]=905;k[j+8>>2]=1769;yc(q,1084,j)|0;xc(q)|0}if((l[(k[b+4>>2]|0)+c>>0]|0|0)!=(d|0)){k[n>>2]=1138;k[n+4>>2]=3253;k[n+8>>2]=1682;yc(q,1084,n)|0;xc(q)|0}}else{d=k[p+20>>2]|0;while(1){c=d+-1|0;if(e>>>0>(k[p+28+(c<<2)>>2]|0)>>>0)d=d+1|0;else break}c=(f>>>(32-d|0))+(k[p+96+(c<<2)>>2]|0)|0;if(c>>>0<(k[b>>2]|0)>>>0){c=m[(k[p+176>>2]|0)+(c<<1)>>1]|0;break}k[o>>2]=1138;k[o+4>>2]=3271;k[o+8>>2]=1620;yc(q,1084,o)|0;xc(q)|0;s=0;r=t;return s|0}while(0);k[g>>2]=k[g>>2]<>2]=(k[s>>2]|0)-d;s=c;r=t;return s|0}function tb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=r;r=r+544|0;h=j+16|0;c=j;g=j+32|0;if(b>>>0>=33){k[c>>2]=1138;k[c+4>>2]=3195;k[c+8>>2]=1622;yc(g,1084,c)|0;xc(g)|0}i=a+20|0;c=k[i>>2]|0;if((c|0)>=(b|0)){e=a+16|0;f=e;e=k[e>>2]|0;g=c;h=32-b|0;h=e>>>h;e=e<>2]=e;b=g-b|0;k[i>>2]=b;r=j;return h|0}e=a+4|0;f=a+8|0;d=a+16|0;do{a=k[e>>2]|0;if((a|0)==(k[f>>2]|0))a=0;else{k[e>>2]=a+1;a=l[a>>0]|0}c=c+8|0;k[i>>2]=c;if((c|0)>=33){k[h>>2]=1138;k[h+4>>2]=3204;k[h+8>>2]=1638;yc(g,1084,h)|0;xc(g)|0;c=k[i>>2]|0}a=a<<32-c|k[d>>2];k[d>>2]=a}while((c|0)<(b|0));h=32-b|0;h=a>>>h;g=a<>2]=g;b=c-b|0;k[i>>2]=b;r=j;return h|0}function ub(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0;q=r;r=r+528|0;o=q;n=q+16|0;if((a|0)==0|b>>>0<62){p=0;r=q;return p|0}m=ib(300,0)|0;if(!m){p=0;r=q;return p|0}k[m>>2]=519686845;c=m+4|0;k[c>>2]=0;d=m+8|0;k[d>>2]=0;j=m+88|0;e=m+136|0;f=m+160|0;g=j;h=g+44|0;do{k[g>>2]=0;g=g+4|0}while((g|0)<(h|0));i[j+44>>0]=0;s=m+184|0;g=m+208|0;h=m+232|0;t=m+252|0;k[t>>2]=0;k[t+4>>2]=0;k[t+8>>2]=0;i[t+12>>0]=0;t=m+268|0;k[t>>2]=0;k[t+4>>2]=0;k[t+8>>2]=0;i[t+12>>0]=0;t=m+284|0;k[t>>2]=0;k[t+4>>2]=0;k[t+8>>2]=0;i[t+12>>0]=0;k[e>>2]=0;k[e+4>>2]=0;k[e+8>>2]=0;k[e+12>>2]=0;k[e+16>>2]=0;i[e+20>>0]=0;k[f>>2]=0;k[f+4>>2]=0;k[f+8>>2]=0;k[f+12>>2]=0;k[f+16>>2]=0;i[f+20>>0]=0;k[s>>2]=0;k[s+4>>2]=0;k[s+8>>2]=0;k[s+12>>2]=0;k[s+16>>2]=0;i[s+20>>0]=0;k[g>>2]=0;k[g+4>>2]=0;k[g+8>>2]=0;k[g+12>>2]=0;k[g+16>>2]=0;i[g+20>>0]=0;k[h>>2]=0;k[h+4>>2]=0;k[h+8>>2]=0;k[h+12>>2]=0;i[h+16>>0]=0;do if(((b>>>0>=74?((l[a>>0]|0)<<8|(l[a+1>>0]|0)|0)==18552:0)?((l[a+2>>0]|0)<<8|(l[a+3>>0]|0))>>>0>=74:0)?((l[a+7>>0]|0)<<16|(l[a+6>>0]|0)<<24|(l[a+8>>0]|0)<<8|(l[a+9>>0]|0))>>>0<=b>>>0:0){k[j>>2]=a;k[c>>2]=a;k[d>>2]=b;if(Eb(m)|0){c=k[j>>2]|0;if((l[c+39>>0]|0)<<8|(l[c+40>>0]|0)){if(!(Fb(m)|0))break;if(!(Gb(m)|0))break;c=k[j>>2]|0}if(!((l[c+55>>0]|0)<<8|(l[c+56>>0]|0))){t=m;r=q;return t|0}if(Hb(m)|0?Ib(m)|0:0){t=m;r=q;return t|0}}}else p=7;while(0);if((p|0)==7)k[j>>2]=0;Nb(m);if(!(m&7)){kb(m,0,0,1,0)|0;t=0;r=q;return t|0}else{k[o>>2]=1138;k[o+4>>2]=2502;k[o+8>>2]=1504;yc(n,1084,o)|0;xc(n)|0;t=0;r=q;return t|0}return 0}function vb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,m=0;m=r;r=r+528|0;j=m;i=m+16|0;f=k[a+88>>2]|0;h=(l[f+70+(e<<2)+1>>0]|0)<<16|(l[f+70+(e<<2)>>0]|0)<<24|(l[f+70+(e<<2)+2>>0]|0)<<8|(l[f+70+(e<<2)+3>>0]|0);g=e+1|0;if(g>>>0<(l[f+16>>0]|0)>>>0)f=(l[f+70+(g<<2)+1>>0]|0)<<16|(l[f+70+(g<<2)>>0]|0)<<24|(l[f+70+(g<<2)+2>>0]|0)<<8|(l[f+70+(g<<2)+3>>0]|0);else f=k[a+8>>2]|0;if(f>>>0>h>>>0){i=a+4|0;i=k[i>>2]|0;i=i+h|0;j=f-h|0;j=wb(a,i,j,b,c,d,e)|0;r=m;return j|0}k[j>>2]=1138;k[j+4>>2]=3690;k[j+8>>2]=1780;yc(i,1084,j)|0;xc(i)|0;i=a+4|0;i=k[i>>2]|0;i=i+h|0;j=f-h|0;j=wb(a,i,j,b,c,d,e)|0;r=m;return j|0}function wb(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,m=0,n=0;n=k[a+88>>2]|0;j=((l[n+12>>0]|0)<<8|(l[n+13>>0]|0))>>>g;m=((l[n+14>>0]|0)<<8|(l[n+15>>0]|0))>>>g;j=j>>>0>1?(j+3|0)>>>2:1;m=m>>>0>1?(m+3|0)>>>2:1;n=n+18|0;g=i[n>>0]|0;g=ha(g<<24>>24==0|g<<24>>24==9?8:16,j)|0;if(f)if((f&3|0)==0&g>>>0<=f>>>0)g=f;else{a=0;return a|0}if((ha(g,m)|0)>>>0>e>>>0){a=0;return a|0}f=(j+1|0)>>>1;h=(m+1|0)>>>1;if(!c){a=0;return a|0}k[a+92>>2]=b;k[a+96>>2]=b;k[a+104>>2]=c;k[a+100>>2]=b+c;k[a+108>>2]=0;k[a+112>>2]=0;switch(l[n>>0]|0|0){case 0:{Jb(a,d,e,g,j,m,f,h)|0;a=1;return a|0}case 4:case 6:case 5:case 3:case 2:{Kb(a,d,e,g,j,m,f,h)|0;a=1;return a|0}case 9:{Lb(a,d,e,g,j,m,f,h)|0;a=1;return a|0}case 8:case 7:{Mb(a,d,e,g,j,m,f,h)|0;a=1;return a|0}default:{a=0;return a|0}}return 0}function xb(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+48|0;c=d;k[c>>2]=40;lb(a,b,c)|0;r=d;return k[c+4>>2]|0}function yb(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+48|0;c=d;k[c>>2]=40;lb(a,b,c)|0;r=d;return k[c+8>>2]|0}function zb(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+48|0;c=d;k[c>>2]=40;lb(a,b,c)|0;r=d;return k[c+12>>2]|0}function Ab(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+48|0;c=d;k[c>>2]=40;lb(a,b,c)|0;r=d;return k[c+32>>2]|0}function Bb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;e=r;r=r+576|0;d=e+40|0;c=e+56|0;f=e;k[f>>2]=40;lb(a,b,f)|0;b=f+32|0;a=k[b+4>>2]|0;do switch(k[b>>2]|0){case 0:{if(!a){f=8;r=e;return f|0}else a=14;break}case 1:{if(!a)a=13;else a=14;break}case 2:{if(!a)a=13;else a=14;break}case 3:{if(!a)a=13;else a=14;break}case 4:{if(!a)a=13;else a=14;break}case 5:{if(!a)a=13;else a=14;break}case 6:{if(!a)a=13;else a=14;break}case 7:{if(!a)a=13;else a=14;break}case 8:{if(!a)a=13;else a=14;break}case 9:{if(!a){f=8;r=e;return f|0}else a=14;break}case 10:{if(!a){f=8;r=e;return f|0}else a=14;break}default:a=14}while(0);if((a|0)==13){f=16;r=e;return f|0}else if((a|0)==14){k[d>>2]=1138;k[d+4>>2]=2668;k[d+8>>2]=1523;yc(c,1084,d)|0;xc(c)|0;f=0;r=e;return f|0}return 0}function Cb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=r;r=r+576|0;f=h+40|0;e=h+56|0;i=h;k[i>>2]=40;lb(a,b,i)|0;d=(((k[i+4>>2]|0)>>>c)+3|0)>>>2;b=(((k[i+8>>2]|0)>>>c)+3|0)>>>2;c=i+32|0;a=k[c+4>>2]|0;do switch(k[c>>2]|0){case 0:{if(!a)a=8;else g=14;break}case 1:{if(!a)g=13;else g=14;break}case 2:{if(!a)g=13;else g=14;break}case 3:{if(!a)g=13;else g=14;break}case 4:{if(!a)g=13;else g=14;break}case 5:{if(!a)g=13;else g=14;break}case 6:{if(!a)g=13;else g=14;break}case 7:{if(!a)g=13;else g=14;break}case 8:{if(!a)g=13;else g=14;break}case 9:{if(!a)a=8;else g=14;break}case 10:{if(!a)a=8;else g=14;break}default:g=14}while(0);if((g|0)==13)a=16;else if((g|0)==14){k[f>>2]=1138;k[f+4>>2]=2668;k[f+8>>2]=1523;yc(e,1084,f)|0;xc(e)|0;a=0}i=ha(ha(b,d)|0,a)|0;r=h;return i|0}function Db(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0;q=r;r=r+592|0;p=q+56|0;g=q+40|0;n=q+72|0;m=q;o=q+68|0;k[m>>2]=40;lb(a,b,m)|0;h=(k[m+4>>2]|0)>>>e;i=(k[m+8>>2]|0)>>>e;m=m+32|0;d=k[m+4>>2]|0;do switch(k[m>>2]|0){case 0:{if(!d)m=8;else j=14;break}case 1:{if(!d)j=13;else j=14;break}case 2:{if(!d)j=13;else j=14;break}case 3:{if(!d)j=13;else j=14;break}case 4:{if(!d)j=13;else j=14;break}case 5:{if(!d)j=13;else j=14;break}case 6:{if(!d)j=13;else j=14;break}case 7:{if(!d)j=13;else j=14;break}case 8:{if(!d)j=13;else j=14;break}case 9:{if(!d)m=8;else j=14;break}case 10:{if(!d)m=8;else j=14;break}default:j=14}while(0);if((j|0)==13)m=16;else if((j|0)==14){k[g>>2]=1138;k[g+4>>2]=2668;k[g+8>>2]=1523;yc(n,1084,g)|0;xc(n)|0;m=0}k[o>>2]=c;l=ub(a,b)|0;b=f+e|0;if(b>>>0>e>>>0){j=(l|0)==0;a=c;while(1){d=ha((h+3|0)>>>2,m)|0;g=ha(d,(i+3|0)>>>2)|0;if(!(e>>>0>15|(j|g>>>0<8))?(k[l>>2]|0)==519686845:0)vb(l,o,g,d,e)|0;a=a+g|0;k[o>>2]=a;e=e+1|0;if((e|0)==(b|0))break;else{i=i>>>1;h=h>>>1}}}if(!l){r=q;return}if((k[l>>2]|0)!=519686845){r=q;return}Nb(l);if(!(l&7)){kb(l,0,0,1,0)|0;r=q;return}else{k[p>>2]=1138;k[p+4>>2]=2502;k[p+8>>2]=1504;yc(n,1084,p)|0;xc(n)|0;r=q;return}}function Eb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;g=a+92|0;d=k[a+4>>2]|0;f=a+88|0;e=k[f>>2]|0;b=(l[e+68>>0]|0)<<8|(l[e+67>>0]|0)<<16|(l[e+69>>0]|0);c=d+b|0;e=(l[e+65>>0]|0)<<8|(l[e+66>>0]|0);if(!e){a=0;return a|0}k[g>>2]=c;k[a+96>>2]=c;k[a+104>>2]=e;k[a+100>>2]=d+(e+b);k[a+108>>2]=0;k[a+112>>2]=0;if(!(qb(g,a+116|0)|0)){a=0;return a|0}b=k[f>>2]|0;do if(!((l[b+39>>0]|0)<<8|(l[b+40>>0]|0))){if(!((l[b+55>>0]|0)<<8|(l[b+56>>0]|0))){a=0;return a|0}}else{if(!(qb(g,a+140|0)|0)){a=0;return a|0}if(qb(g,a+188|0)|0){b=k[f>>2]|0;break}else{a=0;return a|0}}while(0);if((l[b+55>>0]|0)<<8|(l[b+56>>0]|0)){if(!(qb(g,a+164|0)|0)){a=0;return a|0}if(!(qb(g,a+212|0)|0)){a=0;return a|0}}a=1;return a|0}function Fb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0;q=r;r=r+576|0;h=q;g=q+64|0;p=q+16|0;d=a+88|0;b=k[d>>2]|0;o=(l[b+39>>0]|0)<<8|(l[b+40>>0]|0);m=a+236|0;f=a+240|0;c=k[f>>2]|0;if((c|0)!=(o|0)){if(c>>>0<=o>>>0){do if((k[a+244>>2]|0)>>>0>>0){if(gb(m,o,(c+1|0)==(o|0),4,0)|0){b=k[f>>2]|0;break}i[a+248>>0]=1;p=0;r=q;return p|0}else b=c;while(0);$c((k[m>>2]|0)+(b<<2)|0,0,o-b<<2|0)|0;b=k[d>>2]|0}k[f>>2]=o}j=a+92|0;c=k[a+4>>2]|0;d=(l[b+34>>0]|0)<<8|(l[b+33>>0]|0)<<16|(l[b+35>>0]|0);e=c+d|0;b=(l[b+37>>0]|0)<<8|(l[b+36>>0]|0)<<16|(l[b+38>>0]|0);if(!b){p=0;r=q;return p|0}k[j>>2]=e;k[a+96>>2]=e;k[a+104>>2]=b;k[a+100>>2]=c+(b+d);k[a+108>>2]=0;k[a+112>>2]=0;k[p+20>>2]=0;k[p>>2]=0;k[p+4>>2]=0;k[p+8>>2]=0;k[p+12>>2]=0;i[p+16>>0]=0;a=p+24|0;k[p+44>>2]=0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;k[a+12>>2]=0;i[a+16>>0]=0;if(qb(j,p)|0?(n=p+24|0,qb(j,n)|0):0){if(!(k[f>>2]|0)){k[h>>2]=1138;k[h+4>>2]=906;k[h+8>>2]=1769;yc(g,1084,h)|0;xc(g)|0}if(!o)b=1;else{d=0;e=0;f=0;b=0;g=0;a=0;h=0;c=k[m>>2]|0;while(1){d=(sb(j,p)|0)+d&31;e=(sb(j,n)|0)+e&63;f=(sb(j,p)|0)+f&31;b=(sb(j,p)|0)+b|0;g=(sb(j,n)|0)+g&63;a=(sb(j,p)|0)+a&31;k[c>>2]=e<<5|d<<11|f|b<<27|g<<21|a<<16;h=h+1|0;if((h|0)==(o|0)){b=1;break}else{b=b&31;c=c+4|0}}}}else b=0;nb(p+24|0);nb(p);p=b;r=q;return p|0}function Gb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;D=r;r=r+1008|0;g=D;f=D+496|0;C=D+472|0;A=D+276|0;B=D+80|0;z=D+16|0;e=k[a+88>>2]|0;y=(l[e+47>>0]|0)<<8|(l[e+48>>0]|0);x=a+92|0;b=k[a+4>>2]|0;c=(l[e+42>>0]|0)<<8|(l[e+41>>0]|0)<<16|(l[e+43>>0]|0);d=b+c|0;e=(l[e+45>>0]|0)<<8|(l[e+44>>0]|0)<<16|(l[e+46>>0]|0);if(!e){C=0;r=D;return C|0}k[x>>2]=d;k[a+96>>2]=d;k[a+104>>2]=e;k[a+100>>2]=b+(e+c);k[a+108>>2]=0;k[a+112>>2]=0;k[C+20>>2]=0;k[C>>2]=0;k[C+4>>2]=0;k[C+8>>2]=0;k[C+12>>2]=0;i[C+16>>0]=0;if(qb(x,C)|0){c=0;d=-3;e=-3;while(1){k[A+(c<<2)>>2]=d;k[B+(c<<2)>>2]=e;b=(d|0)>2;c=c+1|0;if((c|0)==49)break;else{d=b?-3:d+1|0;e=(b&1)+e|0}}b=z;c=b+64|0;do{k[b>>2]=0;b=b+4|0}while((b|0)<(c|0));w=a+252|0;c=a+256|0;b=k[c>>2]|0;a:do if((b|0)==(y|0))h=13;else{if(b>>>0<=y>>>0){do if((k[a+260>>2]|0)>>>0>>0)if(gb(w,y,(b+1|0)==(y|0),4,0)|0){b=k[c>>2]|0;break}else{i[a+264>>0]=1;b=0;break a}while(0);$c((k[w>>2]|0)+(b<<2)|0,0,y-b<<2|0)|0}k[c>>2]=y;h=13}while(0);do if((h|0)==13){if(!y){k[g>>2]=1138;k[g+4>>2]=906;k[g+8>>2]=1769;yc(f,1084,g)|0;xc(f)|0;b=1;break}d=z+4|0;e=z+8|0;a=z+12|0;f=z+16|0;g=z+20|0;h=z+24|0;j=z+28|0;m=z+32|0;n=z+36|0;o=z+40|0;p=z+44|0;q=z+48|0;s=z+52|0;t=z+56|0;u=z+60|0;v=0;c=k[w>>2]|0;while(1){b=0;do{E=sb(x,C)|0;w=b<<1;F=z+(w<<2)|0;k[F>>2]=(k[F>>2]|0)+(k[A+(E<<2)>>2]|0)&3;w=z+((w|1)<<2)|0;k[w>>2]=(k[w>>2]|0)+(k[B+(E<<2)>>2]|0)&3;b=b+1|0}while((b|0)!=8);k[c>>2]=(l[1713+(k[d>>2]|0)>>0]|0)<<2|(l[1713+(k[z>>2]|0)>>0]|0)|(l[1713+(k[e>>2]|0)>>0]|0)<<4|(l[1713+(k[a>>2]|0)>>0]|0)<<6|(l[1713+(k[f>>2]|0)>>0]|0)<<8|(l[1713+(k[g>>2]|0)>>0]|0)<<10|(l[1713+(k[h>>2]|0)>>0]|0)<<12|(l[1713+(k[j>>2]|0)>>0]|0)<<14|(l[1713+(k[m>>2]|0)>>0]|0)<<16|(l[1713+(k[n>>2]|0)>>0]|0)<<18|(l[1713+(k[o>>2]|0)>>0]|0)<<20|(l[1713+(k[p>>2]|0)>>0]|0)<<22|(l[1713+(k[q>>2]|0)>>0]|0)<<24|(l[1713+(k[s>>2]|0)>>0]|0)<<26|(l[1713+(k[t>>2]|0)>>0]|0)<<28|(l[1713+(k[u>>2]|0)>>0]|0)<<30;v=v+1|0;if((v|0)==(y|0)){b=1;break}else c=c+4|0}}while(0)}else b=0;nb(C);F=b;r=D;return F|0}function Hb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,m=0,n=0,o=0,p=0;p=r;r=r+560|0;h=p;g=p+40|0;o=p+16|0;e=k[a+88>>2]|0;n=(l[e+55>>0]|0)<<8|(l[e+56>>0]|0);m=a+92|0;b=k[a+4>>2]|0;c=(l[e+50>>0]|0)<<8|(l[e+49>>0]|0)<<16|(l[e+51>>0]|0);d=b+c|0;e=(l[e+53>>0]|0)<<8|(l[e+52>>0]|0)<<16|(l[e+54>>0]|0);if(!e){o=0;r=p;return o|0}k[m>>2]=d;k[a+96>>2]=d;k[a+104>>2]=e;k[a+100>>2]=b+(e+c);k[a+108>>2]=0;k[a+112>>2]=0;k[o+20>>2]=0;k[o>>2]=0;k[o+4>>2]=0;k[o+8>>2]=0;k[o+12>>2]=0;i[o+16>>0]=0;a:do if(qb(m,o)|0){f=a+268|0;c=a+272|0;b=k[c>>2]|0;if((b|0)!=(n|0)){if(b>>>0<=n>>>0){do if((k[a+276>>2]|0)>>>0>>0)if(gb(f,n,(b+1|0)==(n|0),2,0)|0){b=k[c>>2]|0;break}else{i[a+280>>0]=1;b=0;break a}while(0);$c((k[f>>2]|0)+(b<<1)|0,0,n-b<<1|0)|0}k[c>>2]=n}if(!n){k[h>>2]=1138;k[h+4>>2]=906;k[h+8>>2]=1769;yc(g,1084,h)|0;xc(g)|0;b=1;break}c=0;d=0;e=0;b=k[f>>2]|0;while(1){h=sb(m,o)|0;c=h+c&255;d=(sb(m,o)|0)+d&255;j[b>>1]=d<<8|c;e=e+1|0;if((e|0)==(n|0)){b=1;break}else b=b+2|0}}else b=0;while(0);nb(o);o=b;r=p;return o|0}function Ib(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;E=r;r=r+2416|0;g=E;f=E+1904|0;D=E+1880|0;B=E+980|0;C=E+80|0;A=E+16|0;e=k[a+88>>2]|0;z=(l[e+63>>0]|0)<<8|(l[e+64>>0]|0);y=a+92|0;b=k[a+4>>2]|0;c=(l[e+58>>0]|0)<<8|(l[e+57>>0]|0)<<16|(l[e+59>>0]|0);d=b+c|0;e=(l[e+61>>0]|0)<<8|(l[e+60>>0]|0)<<16|(l[e+62>>0]|0);if(!e){D=0;r=E;return D|0}k[y>>2]=d;k[a+96>>2]=d;k[a+104>>2]=e;k[a+100>>2]=b+(e+c);k[a+108>>2]=0;k[a+112>>2]=0;k[D+20>>2]=0;k[D>>2]=0;k[D+4>>2]=0;k[D+8>>2]=0;k[D+12>>2]=0;i[D+16>>0]=0;if(qb(y,D)|0){c=0;d=-7;e=-7;while(1){k[B+(c<<2)>>2]=d;k[C+(c<<2)>>2]=e;b=(d|0)>6;c=c+1|0;if((c|0)==225)break;else{d=b?-7:d+1|0;e=(b&1)+e|0}}b=A;c=b+64|0;do{k[b>>2]=0;b=b+4|0}while((b|0)<(c|0));x=a+284|0;c=z*3|0;d=a+288|0;b=k[d>>2]|0;a:do if((b|0)==(c|0))h=13;else{if(b>>>0<=c>>>0){do if((k[a+292>>2]|0)>>>0>>0)if(gb(x,c,(b+1|0)==(c|0),2,0)|0){b=k[d>>2]|0;break}else{i[a+296>>0]=1;b=0;break a}while(0);$c((k[x>>2]|0)+(b<<1)|0,0,c-b<<1|0)|0}k[d>>2]=c;h=13}while(0);do if((h|0)==13){if(!z){k[g>>2]=1138;k[g+4>>2]=906;k[g+8>>2]=1769;yc(f,1084,g)|0;xc(f)|0;b=1;break}d=A+4|0;e=A+8|0;a=A+12|0;f=A+16|0;g=A+20|0;h=A+24|0;m=A+28|0;n=A+32|0;o=A+36|0;p=A+40|0;q=A+44|0;s=A+48|0;t=A+52|0;u=A+56|0;v=A+60|0;w=0;c=k[x>>2]|0;while(1){b=0;do{F=sb(y,D)|0;x=b<<1;G=A+(x<<2)|0;k[G>>2]=(k[G>>2]|0)+(k[B+(F<<2)>>2]|0)&7;x=A+((x|1)<<2)|0;k[x>>2]=(k[x>>2]|0)+(k[C+(F<<2)>>2]|0)&7;b=b+1|0}while((b|0)!=8);F=l[1717+(k[g>>2]|0)>>0]|0;j[c>>1]=(l[1717+(k[d>>2]|0)>>0]|0)<<3|(l[1717+(k[A>>2]|0)>>0]|0)|(l[1717+(k[e>>2]|0)>>0]|0)<<6|(l[1717+(k[a>>2]|0)>>0]|0)<<9|(l[1717+(k[f>>2]|0)>>0]|0)<<12|F<<15;G=l[1717+(k[p>>2]|0)>>0]|0;j[c+2>>1]=(l[1717+(k[h>>2]|0)>>0]|0)<<2|F>>>1|(l[1717+(k[m>>2]|0)>>0]|0)<<5|(l[1717+(k[n>>2]|0)>>0]|0)<<8|(l[1717+(k[o>>2]|0)>>0]|0)<<11|G<<14;j[c+4>>1]=(l[1717+(k[q>>2]|0)>>0]|0)<<1|G>>>2|(l[1717+(k[s>>2]|0)>>0]|0)<<4|(l[1717+(k[t>>2]|0)>>0]|0)<<7|(l[1717+(k[u>>2]|0)>>0]|0)<<10|(l[1717+(k[v>>2]|0)>>0]|0)<<13;w=w+1|0;if((w|0)==(z|0)){b=1;break}else c=c+6|0}}while(0)}else b=0;nb(D);G=b;r=E;return G|0}function Jb(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ia=0,ja=0;ga=r;r=r+656|0;ea=ga+112|0;ca=ga+96|0;ba=ga+80|0;aa=ga+64|0;$=ga+48|0;fa=ga+32|0;da=ga+16|0;_=ga;Y=ga+144|0;Z=ga+128|0;R=a+240|0;S=k[R>>2]|0;V=a+256|0;W=k[V>>2]|0;c=i[(k[a+88>>2]|0)+17>>0]|0;X=d>>>2;if(!(c<<24>>24)){r=ga;return 1}T=(h|0)==0;U=h+-1|0;K=(f&1|0)!=0;L=d<<1;M=a+92|0;N=a+116|0;O=a+140|0;P=a+236|0;Q=g+-1|0;J=(e&1|0)!=0;I=a+188|0;D=a+252|0;E=X+1|0;F=X+2|0;G=X+3|0;H=Q<<4;B=c&255;c=0;f=0;e=1;C=0;do{if(!T){z=k[b+(C<<2)>>2]|0;A=0;while(1){w=A&1;j=(w|0)==0;v=(w<<5^32)+-16|0;w=(w<<1^2)+-1|0;y=j?g:-1;m=j?0:Q;a=(A|0)==(U|0);x=K&a;if((m|0)!=(y|0)){u=K&a^1;t=j?z:z+H|0;while(1){if((e|0)==1)e=sb(M,N)|0|512;s=e&7;e=e>>>3;j=l[1811+s>>0]|0;a=0;do{p=(sb(M,O)|0)+f|0;q=p-S|0;f=q>>31;f=f&p|q&~f;if((k[R>>2]|0)>>>0<=f>>>0){k[_>>2]=1138;k[_+4>>2]=906;k[_+8>>2]=1769;yc(Y,1084,_)|0;xc(Y)|0}k[Z+(a<<2)>>2]=k[(k[P>>2]|0)+(f<<2)>>2];a=a+1|0}while(a>>>0>>0);q=J&(m|0)==(Q|0);if(x|q){p=0;do{n=ha(p,d)|0;a=t+n|0;j=(p|0)==0|u;o=p<<1;ja=(sb(M,I)|0)+c|0;ia=ja-W|0;c=ia>>31;c=c&ja|ia&~c;do if(q){if(!j){ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;break}k[a>>2]=k[Z+((l[1819+(s<<2)+o>>0]|0)<<2)>>2];if((k[V>>2]|0)>>>0<=c>>>0){k[ca>>2]=1138;k[ca+4>>2]=906;k[ca+8>>2]=1769;yc(Y,1084,ca)|0;xc(Y)|0}k[t+(n+4)>>2]=k[(k[D>>2]|0)+(c<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c}else{if(!j){ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;break}k[a>>2]=k[Z+((l[1819+(s<<2)+o>>0]|0)<<2)>>2];if((k[V>>2]|0)>>>0<=c>>>0){k[ba>>2]=1138;k[ba+4>>2]=906;k[ba+8>>2]=1769;yc(Y,1084,ba)|0;xc(Y)|0}k[t+(n+4)>>2]=k[(k[D>>2]|0)+(c<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;k[t+(n+8)>>2]=k[Z+((l[(o|1)+(1819+(s<<2))>>0]|0)<<2)>>2];if((k[V>>2]|0)>>>0<=c>>>0){k[ea>>2]=1138;k[ea+4>>2]=906;k[ea+8>>2]=1769;yc(Y,1084,ea)|0;xc(Y)|0}k[t+(n+12)>>2]=k[(k[D>>2]|0)+(c<<2)>>2]}while(0);p=p+1|0}while((p|0)!=2)}else{k[t>>2]=k[Z+((l[1819+(s<<2)>>0]|0)<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;if((k[V>>2]|0)>>>0<=c>>>0){k[da>>2]=1138;k[da+4>>2]=906;k[da+8>>2]=1769;yc(Y,1084,da)|0;xc(Y)|0}k[t+4>>2]=k[(k[D>>2]|0)+(c<<2)>>2];k[t+8>>2]=k[Z+((l[1819+(s<<2)+1>>0]|0)<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;if((k[V>>2]|0)>>>0<=c>>>0){k[fa>>2]=1138;k[fa+4>>2]=906;k[fa+8>>2]=1769;yc(Y,1084,fa)|0;xc(Y)|0}k[t+12>>2]=k[(k[D>>2]|0)+(c<<2)>>2];k[t+(X<<2)>>2]=k[Z+((l[1819+(s<<2)+2>>0]|0)<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;if((k[V>>2]|0)>>>0<=c>>>0){k[$>>2]=1138;k[$+4>>2]=906;k[$+8>>2]=1769;yc(Y,1084,$)|0;xc(Y)|0}k[t+(E<<2)>>2]=k[(k[D>>2]|0)+(c<<2)>>2];k[t+(F<<2)>>2]=k[Z+((l[1819+(s<<2)+3>>0]|0)<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;if((k[V>>2]|0)>>>0<=c>>>0){k[aa>>2]=1138;k[aa+4>>2]=906;k[aa+8>>2]=1769;yc(Y,1084,aa)|0;xc(Y)|0}k[t+(G<<2)>>2]=k[(k[D>>2]|0)+(c<<2)>>2]}m=m+w|0;if((m|0)==(y|0))break;else t=t+v|0}}A=A+1|0;if((A|0)==(h|0))break;else z=z+L|0}}C=C+1|0}while((C|0)!=(B|0));r=ga;return 1}function Kb(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0;ma=r;r=r+608|0;ja=ma+48|0;la=ma+32|0;ka=ma+16|0;ia=ma;ga=ma+96|0;ha=ma+80|0;fa=ma+64|0;S=a+240|0;T=k[S>>2]|0;W=a+256|0;ca=k[W>>2]|0;da=a+272|0;ea=k[da>>2]|0;c=k[a+88>>2]|0;U=(l[c+63>>0]|0)<<8|(l[c+64>>0]|0);c=i[c+17>>0]|0;if(!(c<<24>>24)){r=ma;return 1}V=(h|0)==0;X=h+-1|0;Y=d<<1;Z=a+92|0;_=a+116|0;$=g+-1|0;aa=a+212|0;ba=a+188|0;R=(e&1|0)==0;Q=(f&1|0)==0;K=a+288|0;L=a+284|0;M=a+252|0;N=a+140|0;O=a+236|0;P=a+164|0;I=a+268|0;J=$<<5;G=c&255;c=0;e=0;f=0;a=0;j=1;H=0;do{if(!V){E=k[b+(H<<2)>>2]|0;F=0;while(1){C=F&1;n=(C|0)==0;B=(C<<6^64)+-32|0;C=(C<<1^2)+-1|0;D=n?g:-1;o=n?0:$;if((o|0)!=(D|0)){A=Q|(F|0)!=(X|0);z=n?E:E+J|0;while(1){if((j|0)==1)j=sb(Z,_)|0|512;y=j&7;j=j>>>3;p=l[1811+y>>0]|0;n=0;do{w=(sb(Z,P)|0)+e|0;x=w-ea|0;e=x>>31;e=e&w|x&~e;if((k[da>>2]|0)>>>0<=e>>>0){k[ia>>2]=1138;k[ia+4>>2]=906;k[ia+8>>2]=1769;yc(ga,1084,ia)|0;xc(ga)|0}k[fa+(n<<2)>>2]=m[(k[I>>2]|0)+(e<<1)>>1];n=n+1|0}while(n>>>0

    >>0);n=0;do{w=(sb(Z,N)|0)+a|0;x=w-T|0;a=x>>31;a=a&w|x&~a;if((k[S>>2]|0)>>>0<=a>>>0){k[ka>>2]=1138;k[ka+4>>2]=906;k[ka+8>>2]=1769;yc(ga,1084,ka)|0;xc(ga)|0}k[ha+(n<<2)>>2]=k[(k[O>>2]|0)+(a<<2)>>2];n=n+1|0}while(n>>>0

    >>0);x=R|(o|0)!=($|0);v=0;w=z;while(1){u=A|(v|0)==0;t=v<<1;q=0;s=w;while(1){p=(sb(Z,aa)|0)+c|0;n=p-U|0;c=n>>31;c=c&p|n&~c;n=(sb(Z,ba)|0)+f|0;p=n-ca|0;f=p>>31;f=f&n|p&~f;if((x|(q|0)==0)&u){n=l[q+t+(1819+(y<<2))>>0]|0;p=c*3|0;if((k[K>>2]|0)>>>0<=p>>>0){k[la>>2]=1138;k[la+4>>2]=906;k[la+8>>2]=1769;yc(ga,1084,la)|0;xc(ga)|0}na=k[L>>2]|0;k[s>>2]=(m[na+(p<<1)>>1]|0)<<16|k[fa+(n<<2)>>2];k[s+4>>2]=(m[na+(p+2<<1)>>1]|0)<<16|(m[na+(p+1<<1)>>1]|0);k[s+8>>2]=k[ha+(n<<2)>>2];if((k[W>>2]|0)>>>0<=f>>>0){k[ja>>2]=1138;k[ja+4>>2]=906;k[ja+8>>2]=1769;yc(ga,1084,ja)|0;xc(ga)|0}k[s+12>>2]=k[(k[M>>2]|0)+(f<<2)>>2]}q=q+1|0;if((q|0)==2)break;else s=s+16|0}v=v+1|0;if((v|0)==2)break;else w=w+d|0}o=o+C|0;if((o|0)==(D|0))break;else z=z+B|0}}F=F+1|0;if((F|0)==(h|0))break;else E=E+Y|0}}H=H+1|0}while((H|0)!=(G|0));r=ma;return 1}function Lb(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;$=r;r=r+576|0;_=$+32|0;Z=$+16|0;Y=$;X=$+64|0;W=$+48|0;M=a+272|0;N=k[M>>2]|0;c=k[a+88>>2]|0;O=(l[c+63>>0]|0)<<8|(l[c+64>>0]|0);c=i[c+17>>0]|0;if(!(c<<24>>24)){r=$;return 1}P=(h|0)==0;Q=h+-1|0;R=d<<1;S=a+92|0;T=a+116|0;U=g+-1|0;V=a+212|0;L=(f&1|0)==0;I=a+288|0;J=a+284|0;K=a+164|0;G=a+268|0;H=U<<4;F=c&255;E=(e&1|0)!=0;c=0;f=0;a=1;D=0;do{if(!P){B=k[b+(D<<2)>>2]|0;C=0;while(1){z=C&1;e=(z|0)==0;y=(z<<5^32)+-16|0;z=(z<<1^2)+-1|0;A=e?g:-1;j=e?0:U;if((j|0)!=(A|0)){x=L|(C|0)!=(Q|0);w=e?B:B+H|0;while(1){if((a|0)==1)a=sb(S,T)|0|512;v=a&7;a=a>>>3;n=l[1811+v>>0]|0;e=0;do{t=(sb(S,K)|0)+f|0;u=t-N|0;f=u>>31;f=f&t|u&~f;if((k[M>>2]|0)>>>0<=f>>>0){k[Y>>2]=1138;k[Y+4>>2]=906;k[Y+8>>2]=1769;yc(X,1084,Y)|0;xc(X)|0}k[W+(e<<2)>>2]=m[(k[G>>2]|0)+(f<<1)>>1];e=e+1|0}while(e>>>0>>0);u=(j|0)==(U|0)&E;s=0;t=w;while(1){q=x|(s|0)==0;p=s<<1;e=(sb(S,V)|0)+c|0;o=e-O|0;n=o>>31;n=n&e|o&~n;if(q){c=l[1819+(v<<2)+p>>0]|0;e=n*3|0;if((k[I>>2]|0)>>>0<=e>>>0){k[Z>>2]=1138;k[Z+4>>2]=906;k[Z+8>>2]=1769;yc(X,1084,Z)|0;xc(X)|0}o=k[J>>2]|0;k[t>>2]=(m[o+(e<<1)>>1]|0)<<16|k[W+(c<<2)>>2];k[t+4>>2]=(m[o+(e+2<<1)>>1]|0)<<16|(m[o+(e+1<<1)>>1]|0)}o=t+8|0;e=(sb(S,V)|0)+n|0;n=e-O|0;c=n>>31;c=c&e|n&~c;if(!(u|q^1)){e=l[(p|1)+(1819+(v<<2))>>0]|0;n=c*3|0;if((k[I>>2]|0)>>>0<=n>>>0){k[_>>2]=1138;k[_+4>>2]=906;k[_+8>>2]=1769;yc(X,1084,_)|0;xc(X)|0}q=k[J>>2]|0;k[o>>2]=(m[q+(n<<1)>>1]|0)<<16|k[W+(e<<2)>>2];k[t+12>>2]=(m[q+(n+2<<1)>>1]|0)<<16|(m[q+(n+1<<1)>>1]|0)}s=s+1|0;if((s|0)==2)break;else t=t+d|0}j=j+z|0;if((j|0)==(A|0))break;else w=w+y|0}}C=C+1|0;if((C|0)==(h|0))break;else B=B+R|0}}D=D+1|0}while((D|0)!=(F|0));r=$;return 1}function Mb(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;ha=r;r=r+608|0;ea=ha+48|0;ga=ha+32|0;fa=ha+16|0;da=ha;ca=ha+96|0;aa=ha+80|0;ba=ha+64|0;S=a+272|0;T=k[S>>2]|0;c=k[a+88>>2]|0;U=(l[c+63>>0]|0)<<8|(l[c+64>>0]|0);c=i[c+17>>0]|0;if(!(c<<24>>24)){r=ha;return 1}V=(h|0)==0;W=h+-1|0;X=d<<1;Y=a+92|0;Z=a+116|0;_=g+-1|0;$=a+212|0;R=(e&1|0)==0;Q=(f&1|0)==0;N=a+288|0;O=a+284|0;P=a+164|0;L=a+268|0;M=_<<5;J=c&255;c=0;e=0;f=0;a=0;j=1;K=0;do{if(!V){H=k[b+(K<<2)>>2]|0;I=0;while(1){F=I&1;n=(F|0)==0;E=(F<<6^64)+-32|0;F=(F<<1^2)+-1|0;G=n?g:-1;o=n?0:_;if((o|0)!=(G|0)){D=Q|(I|0)!=(W|0);C=n?H:H+M|0;while(1){if((j|0)==1)j=sb(Y,Z)|0|512;B=j&7;j=j>>>3;p=l[1811+B>>0]|0;n=0;do{z=(sb(Y,P)|0)+a|0;A=z-T|0;a=A>>31;a=a&z|A&~a;if((k[S>>2]|0)>>>0<=a>>>0){k[da>>2]=1138;k[da+4>>2]=906;k[da+8>>2]=1769;yc(ca,1084,da)|0;xc(ca)|0}k[aa+(n<<2)>>2]=m[(k[L>>2]|0)+(a<<1)>>1];n=n+1|0}while(n>>>0

    >>0);n=0;do{z=(sb(Y,P)|0)+e|0;A=z-T|0;e=A>>31;e=e&z|A&~e;if((k[S>>2]|0)>>>0<=e>>>0){k[fa>>2]=1138;k[fa+4>>2]=906;k[fa+8>>2]=1769;yc(ca,1084,fa)|0;xc(ca)|0}k[ba+(n<<2)>>2]=m[(k[L>>2]|0)+(e<<1)>>1];n=n+1|0}while(n>>>0

    >>0);A=R|(o|0)!=(_|0);y=0;z=C;while(1){x=D|(y|0)==0;w=y<<1;u=0;v=z;while(1){t=(sb(Y,$)|0)+f|0;s=t-U|0;f=s>>31;f=f&t|s&~f;s=(sb(Y,$)|0)+c|0;t=s-U|0;c=t>>31;c=c&s|t&~c;if((A|(u|0)==0)&x){s=l[u+w+(1819+(B<<2))>>0]|0;t=f*3|0;n=k[N>>2]|0;if(n>>>0<=t>>>0){k[ga>>2]=1138;k[ga+4>>2]=906;k[ga+8>>2]=1769;yc(ca,1084,ga)|0;xc(ca)|0;n=k[N>>2]|0}p=k[O>>2]|0;q=c*3|0;if(n>>>0>q>>>0)n=p;else{k[ea>>2]=1138;k[ea+4>>2]=906;k[ea+8>>2]=1769;yc(ca,1084,ea)|0;xc(ca)|0;n=k[O>>2]|0}k[v>>2]=(m[p+(t<<1)>>1]|0)<<16|k[aa+(s<<2)>>2];k[v+4>>2]=(m[p+(t+2<<1)>>1]|0)<<16|(m[p+(t+1<<1)>>1]|0);k[v+8>>2]=(m[n+(q<<1)>>1]|0)<<16|k[ba+(s<<2)>>2];k[v+12>>2]=(m[n+(q+2<<1)>>1]|0)<<16|(m[n+(q+1<<1)>>1]|0)}u=u+1|0;if((u|0)==2)break;else v=v+16|0}y=y+1|0;if((y|0)==2)break;else z=z+d|0}o=o+F|0;if((o|0)==(G|0))break;else C=C+E|0}}I=I+1|0;if((I|0)==(h|0))break;else H=H+X|0}}K=K+1|0}while((K|0)!=(J|0));r=ha;return 1}function Nb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0;j=r;r=r+576|0;h=j+48|0;f=j+32|0;e=j+16|0;d=j;g=j+64|0;k[a>>2]=0;b=a+284|0;c=k[b>>2]|0;if(c){if(!(c&7))kb(c,0,0,1,0)|0;else{k[d>>2]=1138;k[d+4>>2]=2502;k[d+8>>2]=1504;yc(g,1084,d)|0;xc(g)|0}k[b>>2]=0;k[a+288>>2]=0;k[a+292>>2]=0}i[a+296>>0]=0;c=a+268|0;b=k[c>>2]|0;if(b){if(!(b&7))kb(b,0,0,1,0)|0;else{k[e>>2]=1138;k[e+4>>2]=2502;k[e+8>>2]=1504;yc(g,1084,e)|0;xc(g)|0}k[c>>2]=0;k[a+272>>2]=0;k[a+276>>2]=0}i[a+280>>0]=0;b=a+252|0;c=k[b>>2]|0;if(c){if(!(c&7))kb(c,0,0,1,0)|0;else{k[f>>2]=1138;k[f+4>>2]=2502;k[f+8>>2]=1504;yc(g,1084,f)|0;xc(g)|0}k[b>>2]=0;k[a+256>>2]=0;k[a+260>>2]=0}i[a+264>>0]=0;b=a+236|0;c=k[b>>2]|0;if(!c){h=a+248|0;i[h>>0]=0;h=a+212|0;nb(h);h=a+188|0;nb(h);h=a+164|0;nb(h);h=a+140|0;nb(h);h=a+116|0;nb(h);r=j;return}if(!(c&7))kb(c,0,0,1,0)|0;else{k[h>>2]=1138;k[h+4>>2]=2502;k[h+8>>2]=1504;yc(g,1084,h)|0;xc(g)|0}k[b>>2]=0;k[a+240>>2]=0;k[a+244>>2]=0;h=a+248|0;i[h>>0]=0;h=a+212|0;nb(h);h=a+188|0;nb(h);h=a+164|0;nb(h);h=a+140|0;nb(h);h=a+116|0;nb(h);r=j;return}function Ob(a,b){a=a|0;b=b|0;var c=0;c=r;r=r+16|0;k[c>>2]=b;b=k[60]|0;zc(b,a,c)|0;tc(10,b)|0;Aa()}function Pb(){var a=0,b=0;a=r;r=r+16|0;if(!(Ka(192,2)|0)){b=va(k[47]|0)|0;r=a;return b|0}else Ob(2078,a);return 0}function Qb(a){a=a|0;Tc(a);return}function Rb(a){a=a|0;var b=0;b=r;r=r+16|0;Wa[a&3]();Ob(2127,b)}function Sb(){var a=0,b=0;a=Pb()|0;if(((a|0)!=0?(b=k[a>>2]|0,(b|0)!=0):0)?(a=b+48|0,(k[a>>2]&-256|0)==1126902528?(k[a+4>>2]|0)==1129074247:0):0)Rb(k[b+12>>2]|0);b=k[26]|0;k[26]=b+0;Rb(b)}function Tb(a){a=a|0;return}function Ub(a){a=a|0;return}function Vb(a){a=a|0;return}function Wb(a){a=a|0;return}function Xb(a){a=a|0;Qb(a);return}function Yb(a){a=a|0;Qb(a);return}function Zb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;g=r;r=r+64|0;f=g;if((a|0)!=(b|0))if((b|0)!=0?(e=bc(b,24,40,0)|0,(e|0)!=0):0){b=f;d=b+56|0;do{k[b>>2]=0;b=b+4|0}while((b|0)<(d|0));k[f>>2]=e;k[f+8>>2]=a;k[f+12>>2]=-1;k[f+48>>2]=1;Ya[k[(k[e>>2]|0)+28>>2]&3](e,f,k[c>>2]|0,1);if((k[f+24>>2]|0)==1){k[c>>2]=k[f+16>>2];b=1}else b=0}else b=0;else b=1;r=g;return b|0}function _b(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;a=b+16|0;e=k[a>>2]|0;do if(e){if((e|0)!=(c|0)){d=b+36|0;k[d>>2]=(k[d>>2]|0)+1;k[b+24>>2]=2;i[b+54>>0]=1;break}a=b+24|0;if((k[a>>2]|0)==2)k[a>>2]=d}else{k[a>>2]=c;k[b+24>>2]=d;k[b+36>>2]=1}while(0);return}function $b(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((a|0)==(k[b+8>>2]|0))_b(0,b,c,d);return}function ac(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((a|0)==(k[b+8>>2]|0))_b(0,b,c,d);else{a=k[a+8>>2]|0;Ya[k[(k[a>>2]|0)+28>>2]&3](a,b,c,d)}return}function bc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,l=0,m=0,n=0,o=0,p=0,q=0;q=r;r=r+64|0;p=q;o=k[a>>2]|0;n=a+(k[o+-8>>2]|0)|0;o=k[o+-4>>2]|0;k[p>>2]=c;k[p+4>>2]=a;k[p+8>>2]=b;k[p+12>>2]=d;d=p+16|0;a=p+20|0;b=p+24|0;e=p+28|0;f=p+32|0;g=p+40|0;h=(o|0)==(c|0);l=d;m=l+36|0;do{k[l>>2]=0;l=l+4|0}while((l|0)<(m|0));j[d+36>>1]=0;i[d+38>>0]=0;a:do if(h){k[p+48>>2]=1;Xa[k[(k[c>>2]|0)+20>>2]&3](c,p,n,n,1,0);d=(k[b>>2]|0)==1?n:0}else{Sa[k[(k[o>>2]|0)+24>>2]&3](o,p,n,1,0);switch(k[p+36>>2]|0){case 0:{d=(k[g>>2]|0)==1&(k[e>>2]|0)==1&(k[f>>2]|0)==1?k[a>>2]|0:0;break a}case 1:break;default:{d=0;break a}}if((k[b>>2]|0)!=1?!((k[g>>2]|0)==0&(k[e>>2]|0)==1&(k[f>>2]|0)==1):0){d=0;break}d=k[d>>2]|0}while(0);r=q;return d|0}function cc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;i[b+53>>0]=1;do if((k[b+4>>2]|0)==(d|0)){i[b+52>>0]=1;d=b+16|0;a=k[d>>2]|0;if(!a){k[d>>2]=c;k[b+24>>2]=e;k[b+36>>2]=1;if(!((e|0)==1?(k[b+48>>2]|0)==1:0))break;i[b+54>>0]=1;break}if((a|0)!=(c|0)){e=b+36|0;k[e>>2]=(k[e>>2]|0)+1;i[b+54>>0]=1;break}a=b+24|0;d=k[a>>2]|0;if((d|0)==2){k[a>>2]=e;d=e}if((d|0)==1?(k[b+48>>2]|0)==1:0)i[b+54>>0]=1}while(0);return}function dc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;a:do if((a|0)==(k[b+8>>2]|0)){if((k[b+4>>2]|0)==(c|0)?(f=b+28|0,(k[f>>2]|0)!=1):0)k[f>>2]=d}else{if((a|0)!=(k[b>>2]|0)){h=k[a+8>>2]|0;Sa[k[(k[h>>2]|0)+24>>2]&3](h,b,c,d,e);break}if((k[b+16>>2]|0)!=(c|0)?(g=b+20|0,(k[g>>2]|0)!=(c|0)):0){k[b+32>>2]=d;d=b+44|0;if((k[d>>2]|0)==4)break;f=b+52|0;i[f>>0]=0;j=b+53|0;i[j>>0]=0;a=k[a+8>>2]|0;Xa[k[(k[a>>2]|0)+20>>2]&3](a,b,c,c,1,e);if(i[j>>0]|0){if(!(i[f>>0]|0)){f=1;h=13}}else{f=0;h=13}do if((h|0)==13){k[g>>2]=c;j=b+40|0;k[j>>2]=(k[j>>2]|0)+1;if((k[b+36>>2]|0)==1?(k[b+24>>2]|0)==2:0){i[b+54>>0]=1;if(f)break}else h=16;if((h|0)==16?f:0)break;k[d>>2]=4;break a}while(0);k[d>>2]=3;break}if((d|0)==1)k[b+32>>2]=1}while(0);return}function ec(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;do if((a|0)==(k[b+8>>2]|0)){if((k[b+4>>2]|0)==(c|0)?(g=b+28|0,(k[g>>2]|0)!=1):0)k[g>>2]=d}else if((a|0)==(k[b>>2]|0)){if((k[b+16>>2]|0)!=(c|0)?(f=b+20|0,(k[f>>2]|0)!=(c|0)):0){k[b+32>>2]=d;k[f>>2]=c;e=b+40|0;k[e>>2]=(k[e>>2]|0)+1;if((k[b+36>>2]|0)==1?(k[b+24>>2]|0)==2:0)i[b+54>>0]=1;k[b+44>>2]=4;break}if((d|0)==1)k[b+32>>2]=1}while(0);return}function fc(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if((a|0)==(k[b+8>>2]|0))cc(0,b,c,d,e);else{a=k[a+8>>2]|0;Xa[k[(k[a>>2]|0)+20>>2]&3](a,b,c,d,e,f)}return}function gc(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if((a|0)==(k[b+8>>2]|0))cc(0,b,c,d,e);return}function hc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=r;r=r+16|0;d=e;k[d>>2]=k[c>>2];a=Ra[k[(k[a>>2]|0)+16>>2]&7](a,b,d)|0;if(a)k[c>>2]=k[d>>2];r=e;return a&1|0}function ic(a){a=a|0;if(!a)a=0;else a=(bc(a,24,72,0)|0)!=0;return a&1|0}function jc(){var a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;e=r;r=r+48|0;g=e+32|0;c=e+24|0;h=e+16|0;f=e;e=e+36|0;a=Pb()|0;if((a|0)!=0?(d=k[a>>2]|0,(d|0)!=0):0){a=d+48|0;b=k[a>>2]|0;a=k[a+4>>2]|0;if(!((b&-256|0)==1126902528&(a|0)==1129074247)){k[c>>2]=2406;Ob(2356,c)}if((b|0)==1126902529&(a|0)==1129074247)a=k[d+44>>2]|0;else a=d+80|0;k[e>>2]=a;d=k[d>>2]|0;a=k[d+4>>2]|0;if(Ra[k[(k[8>>2]|0)+16>>2]&7](8,d,e)|0){h=k[e>>2]|0;h=Ua[k[(k[h>>2]|0)+8>>2]&1](h)|0;k[f>>2]=2406;k[f+4>>2]=a;k[f+8>>2]=h;Ob(2270,f)}else{k[h>>2]=2406;k[h+4>>2]=a;Ob(2315,h)}}Ob(2394,g)}function kc(){var a=0;a=r;r=r+16|0;if(!(Fa(188,6)|0)){r=a;return}else Ob(2167,a)}function lc(a){a=a|0;var b=0;b=r;r=r+16|0;Tc(a);if(!(wa(k[47]|0,0)|0)){r=b;return}else Ob(2217,b)}function mc(a){a=a|0;var b=0,c=0;b=0;while(1){if((l[2415+b>>0]|0)==(a|0)){c=2;break}b=b+1|0;if((b|0)==87){b=87;a=2503;c=5;break}}if((c|0)==2)if(!b)a=2503;else{a=2503;c=5}if((c|0)==5)while(1){c=a;while(1){a=c+1|0;if(!(i[c>>0]|0))break;else c=a}b=b+-1|0;if(!b)break;else c=5}return a|0}function nc(){var a=0;if(!0)a=248;else{a=(za()|0)+60|0;a=k[a>>2]|0}return a|0}function oc(a){a=a|0;var b=0;if(a>>>0>4294963200){b=nc()|0;k[b>>2]=0-a;a=-1}return a|0}function pc(a,b){a=+a;b=b|0;var c=0,d=0,e=0;p[t>>3]=a;c=k[t>>2]|0;d=k[t+4>>2]|0;e=ad(c|0,d|0,52)|0;e=e&2047;switch(e|0){case 0:{if(a!=0.0){a=+pc(a*18446744073709552.0e3,b);c=(k[b>>2]|0)+-64|0}else c=0;k[b>>2]=c;break}case 2047:break;default:{k[b>>2]=e+-1022;k[t>>2]=c;k[t+4>>2]=d&-2146435073|1071644672;a=+p[t>>3]}}return +a}function qc(a,b){a=+a;b=b|0;return +(+pc(a,b))}function rc(a,b,c){a=a|0;b=b|0;c=c|0;do if(a){if(b>>>0<128){i[a>>0]=b;a=1;break}if(b>>>0<2048){i[a>>0]=b>>>6|192;i[a+1>>0]=b&63|128;a=2;break}if(b>>>0<55296|(b&-8192|0)==57344){i[a>>0]=b>>>12|224;i[a+1>>0]=b>>>6&63|128;i[a+2>>0]=b&63|128;a=3;break}if((b+-65536|0)>>>0<1048576){i[a>>0]=b>>>18|240;i[a+1>>0]=b>>>12&63|128;i[a+2>>0]=b>>>6&63|128;i[a+3>>0]=b&63|128;a=4;break}else{a=nc()|0;k[a>>2]=84;a=-1;break}}else a=1;while(0);return a|0}function sc(a,b){a=a|0;b=b|0;if(!a)a=0;else a=rc(a,b,0)|0;return a|0}function tc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;if((k[b+76>>2]|0)>=0?(Cc(b)|0)!=0:0){if((i[b+75>>0]|0)!=(a|0)?(d=b+20|0,e=k[d>>2]|0,e>>>0<(k[b+16>>2]|0)>>>0):0){k[d>>2]=e+1;i[e>>0]=a;c=a&255}else c=Ec(b,a)|0;Dc(b)}else g=3;do if((g|0)==3){if((i[b+75>>0]|0)!=(a|0)?(f=b+20|0,c=k[f>>2]|0,c>>>0<(k[b+16>>2]|0)>>>0):0){k[f>>2]=c+1;i[c>>0]=a;c=a&255;break}c=Ec(b,a)|0}while(0);return c|0}function uc(a,b){a=a|0;b=b|0;return (wc(a,Lc(a)|0,1,b)|0)+-1|0}function vc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=c+16|0;e=k[d>>2]|0;if(!e)if(!(Jc(c)|0)){e=k[d>>2]|0;f=4}else d=0;else f=4;a:do if((f|0)==4){g=c+20|0;f=k[g>>2]|0;if((e-f|0)>>>0>>0){d=Ra[k[c+36>>2]&7](c,a,b)|0;break}b:do if((i[c+75>>0]|0)>-1){d=b;while(1){if(!d){e=f;d=0;break b}e=d+-1|0;if((i[a+e>>0]|0)==10)break;else d=e}if((Ra[k[c+36>>2]&7](c,a,d)|0)>>>0>>0)break a;b=b-d|0;a=a+d|0;e=k[g>>2]|0}else{e=f;d=0}while(0);cd(e|0,a|0,b|0)|0;k[g>>2]=(k[g>>2]|0)+b;d=d+b|0}while(0);return d|0}function wc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=ha(c,b)|0;if((k[d+76>>2]|0)>-1){f=(Cc(d)|0)==0;a=vc(a,e,d)|0;if(!f)Dc(d)}else a=vc(a,e,d)|0;if((a|0)!=(e|0))c=(a>>>0)/(b>>>0)|0;return c|0}function xc(a){a=a|0;var b=0,c=0,d=0,e=0;d=k[61]|0;if((k[d+76>>2]|0)>-1)e=Cc(d)|0;else e=0;do if((uc(a,d)|0)<0)b=1;else{if((i[d+75>>0]|0)!=10?(b=d+20|0,c=k[b>>2]|0,c>>>0<(k[d+16>>2]|0)>>>0):0){k[b>>2]=c+1;i[c>>0]=10;b=0;break}b=(Ec(d,10)|0)<0}while(0);if(e)Dc(d);return b<<31>>31|0}function yc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=r;r=r+16|0;e=d;k[e>>2]=c;c=Bc(a,b,e)|0;r=d;return c|0}function zc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0;s=r;r=r+224|0;n=s+120|0;q=s+80|0;p=s;o=s+136|0;d=q;e=d+40|0;do{k[d>>2]=0;d=d+4|0}while((d|0)<(e|0));k[n>>2]=k[c>>2];if((Mc(0,b,n,p,q)|0)<0)c=-1;else{if((k[a+76>>2]|0)>-1)l=Cc(a)|0;else l=0;c=k[a>>2]|0;m=c&32;if((i[a+74>>0]|0)<1)k[a>>2]=c&-33;c=a+48|0;if(!(k[c>>2]|0)){e=a+44|0;f=k[e>>2]|0;k[e>>2]=o;g=a+28|0;k[g>>2]=o;h=a+20|0;k[h>>2]=o;k[c>>2]=80;j=a+16|0;k[j>>2]=o+80;d=Mc(a,b,n,p,q)|0;if(f){Ra[k[a+36>>2]&7](a,0,0)|0;d=(k[h>>2]|0)==0?-1:d;k[e>>2]=f;k[c>>2]=0;k[j>>2]=0;k[g>>2]=0;k[h>>2]=0}}else d=Mc(a,b,n,p,q)|0;c=k[a>>2]|0;k[a>>2]=c|m;if(l)Dc(a);c=(c&32|0)==0?d:-1}r=s;return c|0}function Ac(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,l=0,m=0;m=r;r=r+128|0;e=m+112|0;l=m;f=l;g=252;h=f+112|0;do{k[f>>2]=k[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));if((b+-1|0)>>>0>2147483646)if(!b){b=1;j=4}else{b=nc()|0;k[b>>2]=75;b=-1}else{e=a;j=4}if((j|0)==4){j=-2-e|0;j=b>>>0>j>>>0?j:b;k[l+48>>2]=j;a=l+20|0;k[a>>2]=e;k[l+44>>2]=e;b=e+j|0;e=l+16|0;k[e>>2]=b;k[l+28>>2]=b;b=zc(l,c,d)|0;if(j){c=k[a>>2]|0;i[c+(((c|0)==(k[e>>2]|0))<<31>>31)>>0]=0}}r=m;return b|0}function Bc(a,b,c){a=a|0;b=b|0;c=c|0;return Ac(a,2147483647,b,c)|0}function Cc(a){a=a|0;return 0}function Dc(a){a=a|0;return}function Ec(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0;j=r;r=r+16|0;h=j;g=b&255;i[h>>0]=g;d=a+16|0;e=k[d>>2]|0;if(!e)if(!(Jc(a)|0)){e=k[d>>2]|0;f=4}else c=-1;else f=4;do if((f|0)==4){d=a+20|0;f=k[d>>2]|0;if(f>>>0>>0?(c=b&255,(c|0)!=(i[a+75>>0]|0)):0){k[d>>2]=f+1;i[f>>0]=g;break}if((Ra[k[a+36>>2]&7](a,h,1)|0)==1)c=l[h>>0]|0;else c=-1}while(0);r=j;return c|0}function Fc(a){a=a|0;var b=0,c=0;b=r;r=r+16|0;c=b;k[c>>2]=k[a+60>>2];a=oc(Ca(6,c|0)|0)|0;r=b;return a|0}function Gc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;e=r;r=r+32|0;f=e;d=e+20|0;k[f>>2]=k[a+60>>2];k[f+4>>2]=0;k[f+8>>2]=b;k[f+12>>2]=d;k[f+16>>2]=c;if((oc(Ja(140,f|0)|0)|0)<0){k[d>>2]=-1;a=-1}else a=k[d>>2]|0;r=e;return a|0}function Hc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;p=r;r=r+48|0;m=p+16|0;l=p;d=p+32|0;n=a+28|0;e=k[n>>2]|0;k[d>>2]=e;o=a+20|0;e=(k[o>>2]|0)-e|0;k[d+4>>2]=e;k[d+8>>2]=b;k[d+12>>2]=c;i=a+60|0;j=a+44|0;b=2;e=e+c|0;while(1){if(!(k[49]|0)){k[m>>2]=k[i>>2];k[m+4>>2]=d;k[m+8>>2]=b;g=oc(Na(146,m|0)|0)|0}else{Ba(7,a|0);k[l>>2]=k[i>>2];k[l+4>>2]=d;k[l+8>>2]=b;g=oc(Na(146,l|0)|0)|0;ua(0)}if((e|0)==(g|0)){e=6;break}if((g|0)<0){e=8;break}e=e-g|0;f=k[d+4>>2]|0;if(g>>>0<=f>>>0)if((b|0)==2){k[n>>2]=(k[n>>2]|0)+g;h=f;b=2}else h=f;else{h=k[j>>2]|0;k[n>>2]=h;k[o>>2]=h;h=k[d+12>>2]|0;g=g-f|0;d=d+8|0;b=b+-1|0}k[d>>2]=(k[d>>2]|0)+g;k[d+4>>2]=h-g}if((e|0)==6){m=k[j>>2]|0;k[a+16>>2]=m+(k[a+48>>2]|0);a=m;k[n>>2]=a;k[o>>2]=a}else if((e|0)==8){k[a+16>>2]=0;k[n>>2]=0;k[o>>2]=0;k[a>>2]=k[a>>2]|32;if((b|0)==2)c=0;else c=c-(k[d+4>>2]|0)|0}r=p;return c|0}function Ic(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=r;r=r+80|0;d=e;k[a+36>>2]=3;if((k[a>>2]&64|0)==0?(k[d>>2]=k[a+60>>2],k[d+4>>2]=21505,k[d+8>>2]=e+12,(Ia(54,d|0)|0)!=0):0)i[a+75>>0]=-1;d=Hc(a,b,c)|0;r=e;return d|0}function Jc(a){a=a|0;var b=0,c=0;b=a+74|0;c=i[b>>0]|0;i[b>>0]=c+255|c;b=k[a>>2]|0;if(!(b&8)){k[a+8>>2]=0;k[a+4>>2]=0;b=k[a+44>>2]|0;k[a+28>>2]=b;k[a+20>>2]=b;k[a+16>>2]=b+(k[a+48>>2]|0);b=0}else{k[a>>2]=b|32;b=-1}return b|0}function Kc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;f=b&255;d=(c|0)!=0;a:do if(d&(a&3|0)!=0){e=b&255;while(1){if((i[a>>0]|0)==e<<24>>24){g=6;break a}a=a+1|0;c=c+-1|0;d=(c|0)!=0;if(!(d&(a&3|0)!=0)){g=5;break}}}else g=5;while(0);if((g|0)==5)if(d)g=6;else c=0;b:do if((g|0)==6){e=b&255;if((i[a>>0]|0)!=e<<24>>24){d=ha(f,16843009)|0;c:do if(c>>>0>3)while(1){f=k[a>>2]^d;if((f&-2139062144^-2139062144)&f+-16843009)break;a=a+4|0;c=c+-4|0;if(c>>>0<=3){g=11;break c}}else g=11;while(0);if((g|0)==11)if(!c){c=0;break}while(1){if((i[a>>0]|0)==e<<24>>24)break b;a=a+1|0;c=c+-1|0;if(!c){c=0;break}}}}while(0);return ((c|0)!=0?a:0)|0}function Lc(a){a=a|0;var b=0,c=0,d=0;d=a;a:do if(!(d&3))c=4;else{b=a;a=d;while(1){if(!(i[b>>0]|0))break a;b=b+1|0;a=b;if(!(a&3)){a=b;c=4;break}}}while(0);if((c|0)==4){while(1){b=k[a>>2]|0;if(!((b&-2139062144^-2139062144)&b+-16843009))a=a+4|0;else break}if((b&255)<<24>>24)do a=a+1|0;while((i[a>>0]|0)!=0)}return a-d|0}function Mc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,m=0,n=0.0,o=0,q=0,s=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0;ga=r;r=r+624|0;ba=ga+24|0;da=ga+16|0;ca=ga+588|0;Y=ga+576|0;aa=ga;V=ga+536|0;fa=ga+8|0;ea=ga+528|0;M=(a|0)!=0;N=V+40|0;U=N;V=V+39|0;W=fa+4|0;X=Y+12|0;Y=Y+11|0;Z=ca;_=X;$=_-Z|0;O=-2-Z|0;P=_+2|0;Q=ba+288|0;R=ca+9|0;S=R;T=ca+8|0;f=0;w=b;g=0;b=0;a:while(1){do if((f|0)>-1)if((g|0)>(2147483647-f|0)){f=nc()|0;k[f>>2]=75;f=-1;break}else{f=g+f|0;break}while(0);g=i[w>>0]|0;if(!(g<<24>>24)){K=245;break}else h=w;b:while(1){switch(g<<24>>24){case 37:{g=h;K=9;break b}case 0:{g=h;break b}default:{}}J=h+1|0;g=i[J>>0]|0;h=J}c:do if((K|0)==9)while(1){K=0;if((i[g+1>>0]|0)!=37)break c;h=h+1|0;g=g+2|0;if((i[g>>0]|0)==37)K=9;else break}while(0);y=h-w|0;if(M?(k[a>>2]&32|0)==0:0)vc(w,y,a)|0;if((h|0)!=(w|0)){w=g;g=y;continue}o=g+1|0;h=i[o>>0]|0;m=(h<<24>>24)+-48|0;if(m>>>0<10){J=(i[g+2>>0]|0)==36;o=J?g+3|0:o;h=i[o>>0]|0;u=J?m:-1;b=J?1:b}else u=-1;g=h<<24>>24;d:do if((g&-32|0)==32){m=0;while(1){if(!(1<>24)+-32|m;o=o+1|0;h=i[o>>0]|0;g=h<<24>>24;if((g&-32|0)!=32){q=m;g=o;break}}}else{q=0;g=o}while(0);do if(h<<24>>24==42){m=g+1|0;h=(i[m>>0]|0)+-48|0;if(h>>>0<10?(i[g+2>>0]|0)==36:0){k[e+(h<<2)>>2]=10;b=1;g=g+3|0;h=k[d+((i[m>>0]|0)+-48<<3)>>2]|0}else{if(b){f=-1;break a}if(!M){x=q;g=m;b=0;J=0;break}b=(k[c>>2]|0)+(4-1)&~(4-1);h=k[b>>2]|0;k[c>>2]=b+4;b=0;g=m}if((h|0)<0){x=q|8192;J=0-h|0}else{x=q;J=h}}else{m=(h<<24>>24)+-48|0;if(m>>>0<10){h=0;do{h=(h*10|0)+m|0;g=g+1|0;m=(i[g>>0]|0)+-48|0}while(m>>>0<10);if((h|0)<0){f=-1;break a}else{x=q;J=h}}else{x=q;J=0}}while(0);e:do if((i[g>>0]|0)==46){m=g+1|0;h=i[m>>0]|0;if(h<<24>>24!=42){o=(h<<24>>24)+-48|0;if(o>>>0<10){g=m;h=0}else{g=m;o=0;break}while(1){h=(h*10|0)+o|0;g=g+1|0;o=(i[g>>0]|0)+-48|0;if(o>>>0>=10){o=h;break e}}}m=g+2|0;h=(i[m>>0]|0)+-48|0;if(h>>>0<10?(i[g+3>>0]|0)==36:0){k[e+(h<<2)>>2]=10;g=g+4|0;o=k[d+((i[m>>0]|0)+-48<<3)>>2]|0;break}if(b){f=-1;break a}if(M){g=(k[c>>2]|0)+(4-1)&~(4-1);o=k[g>>2]|0;k[c>>2]=g+4;g=m}else{g=m;o=0}}else o=-1;while(0);s=0;while(1){h=(i[g>>0]|0)+-65|0;if(h>>>0>57){f=-1;break a}m=g+1|0;h=i[5347+(s*58|0)+h>>0]|0;q=h&255;if((q+-1|0)>>>0<8){g=m;s=q}else{I=m;break}}if(!(h<<24>>24)){f=-1;break}m=(u|0)>-1;do if(h<<24>>24==19)if(m){f=-1;break a}else K=52;else{if(m){k[e+(u<<2)>>2]=q;G=d+(u<<3)|0;H=k[G+4>>2]|0;K=aa;k[K>>2]=k[G>>2];k[K+4>>2]=H;K=52;break}if(!M){f=0;break a}Pc(aa,q,c)}while(0);if((K|0)==52?(K=0,!M):0){w=I;g=y;continue}u=i[g>>0]|0;u=(s|0)!=0&(u&15|0)==3?u&-33:u;m=x&-65537;H=(x&8192|0)==0?x:m;f:do switch(u|0){case 110:switch(s|0){case 0:{k[k[aa>>2]>>2]=f;w=I;g=y;continue a}case 1:{k[k[aa>>2]>>2]=f;w=I;g=y;continue a}case 2:{w=k[aa>>2]|0;k[w>>2]=f;k[w+4>>2]=((f|0)<0)<<31>>31;w=I;g=y;continue a}case 3:{j[k[aa>>2]>>1]=f;w=I;g=y;continue a}case 4:{i[k[aa>>2]>>0]=f;w=I;g=y;continue a}case 6:{k[k[aa>>2]>>2]=f;w=I;g=y;continue a}case 7:{w=k[aa>>2]|0;k[w>>2]=f;k[w+4>>2]=((f|0)<0)<<31>>31;w=I;g=y;continue a}default:{w=I;g=y;continue a}}case 112:{s=H|8;o=o>>>0>8?o:8;u=120;K=64;break}case 88:case 120:{s=H;K=64;break}case 111:{m=aa;h=k[m>>2]|0;m=k[m+4>>2]|0;if((h|0)==0&(m|0)==0)g=N;else{g=N;do{g=g+-1|0;i[g>>0]=h&7|48;h=ad(h|0,m|0,3)|0;m=L}while(!((h|0)==0&(m|0)==0))}if(!(H&8)){h=H;s=0;q=5827;K=77}else{s=U-g+1|0;h=H;o=(o|0)<(s|0)?s:o;s=0;q=5827;K=77}break}case 105:case 100:{h=aa;g=k[h>>2]|0;h=k[h+4>>2]|0;if((h|0)<0){g=Zc(0,0,g|0,h|0)|0;h=L;m=aa;k[m>>2]=g;k[m+4>>2]=h;m=1;q=5827;K=76;break f}if(!(H&2048)){q=H&1;m=q;q=(q|0)==0?5827:5829;K=76}else{m=1;q=5828;K=76}break}case 117:{h=aa;g=k[h>>2]|0;h=k[h+4>>2]|0;m=0;q=5827;K=76;break}case 99:{i[V>>0]=k[aa>>2];w=V;h=1;s=0;u=5827;g=N;break}case 109:{g=nc()|0;g=mc(k[g>>2]|0)|0;K=82;break}case 115:{g=k[aa>>2]|0;g=(g|0)!=0?g:5837;K=82;break}case 67:{k[fa>>2]=k[aa>>2];k[W>>2]=0;k[aa>>2]=fa;o=-1;K=86;break}case 83:{if(!o){Rc(a,32,J,0,H);g=0;K=98}else K=86;break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{n=+p[aa>>3];k[da>>2]=0;p[t>>3]=n;if((k[t+4>>2]|0)>=0)if(!(H&2048)){G=H&1;F=G;G=(G|0)==0?5845:5850}else{F=1;G=5847}else{n=-n;F=1;G=5844}p[t>>3]=n;E=k[t+4>>2]&2146435072;do if(E>>>0<2146435072|(E|0)==2146435072&0<0){v=+qc(n,da)*2.0;h=v!=0.0;if(h)k[da>>2]=(k[da>>2]|0)+-1;C=u|32;if((C|0)==97){w=u&32;y=(w|0)==0?G:G+9|0;x=F|2;g=12-o|0;do if(!(o>>>0>11|(g|0)==0)){n=8.0;do{g=g+-1|0;n=n*16.0}while((g|0)!=0);if((i[y>>0]|0)==45){n=-(n+(-v-n));break}else{n=v+n-n;break}}else n=v;while(0);h=k[da>>2]|0;g=(h|0)<0?0-h|0:h;g=Qc(g,((g|0)<0)<<31>>31,X)|0;if((g|0)==(X|0)){i[Y>>0]=48;g=Y}i[g+-1>>0]=(h>>31&2)+43;s=g+-2|0;i[s>>0]=u+15;q=(o|0)<1;m=(H&8|0)==0;h=ca;while(1){G=~~n;g=h+1|0;i[h>>0]=l[5811+G>>0]|w;n=(n-+(G|0))*16.0;do if((g-Z|0)==1){if(m&(q&n==0.0))break;i[g>>0]=46;g=h+2|0}while(0);if(!(n!=0.0))break;else h=g}o=(o|0)!=0&(O+g|0)<(o|0)?P+o-s|0:$-s+g|0;m=o+x|0;Rc(a,32,J,m,H);if(!(k[a>>2]&32))vc(y,x,a)|0;Rc(a,48,J,m,H^65536);g=g-Z|0;if(!(k[a>>2]&32))vc(ca,g,a)|0;h=_-s|0;Rc(a,48,o-(g+h)|0,0,0);if(!(k[a>>2]&32))vc(s,h,a)|0;Rc(a,32,J,m,H^8192);g=(m|0)<(J|0)?J:m;break}g=(o|0)<0?6:o;if(h){h=(k[da>>2]|0)+-28|0;k[da>>2]=h;n=v*268435456.0}else{n=v;h=k[da>>2]|0}E=(h|0)<0?ba:Q;D=E;h=E;do{B=~~n>>>0;k[h>>2]=B;h=h+4|0;n=(n-+(B>>>0))*1.0e9}while(n!=0.0);m=h;h=k[da>>2]|0;if((h|0)>0){q=E;while(1){s=(h|0)>29?29:h;o=m+-4|0;do if(o>>>0>>0)o=q;else{h=0;do{B=bd(k[o>>2]|0,0,s|0)|0;B=_c(B|0,L|0,h|0,0)|0;h=L;A=kd(B|0,h|0,1e9,0)|0;k[o>>2]=A;h=jd(B|0,h|0,1e9,0)|0;o=o+-4|0}while(o>>>0>=q>>>0);if(!h){o=q;break}o=q+-4|0;k[o>>2]=h}while(0);while(1){if(m>>>0<=o>>>0)break;h=m+-4|0;if(!(k[h>>2]|0))m=h;else break}h=(k[da>>2]|0)-s|0;k[da>>2]=h;if((h|0)>0)q=o;else break}}else o=E;if((h|0)<0){y=((g+25|0)/9|0)+1|0;z=(C|0)==102;w=o;while(1){x=0-h|0;x=(x|0)>9?9:x;do if(w>>>0>>0){h=(1<>>x;o=0;s=w;do{B=k[s>>2]|0;k[s>>2]=(B>>>x)+o;o=ha(B&h,q)|0;s=s+4|0}while(s>>>0>>0);h=(k[w>>2]|0)==0?w+4|0:w;if(!o){o=h;break}k[m>>2]=o;o=h;m=m+4|0}else o=(k[w>>2]|0)==0?w+4|0:w;while(0);h=z?E:o;m=(m-h>>2|0)>(y|0)?h+(y<<2)|0:m;h=(k[da>>2]|0)+x|0;k[da>>2]=h;if((h|0)>=0){w=o;break}else w=o}}else w=o;do if(w>>>0>>0){h=(D-w>>2)*9|0;q=k[w>>2]|0;if(q>>>0<10)break;else o=10;do{o=o*10|0;h=h+1|0}while(q>>>0>=o>>>0)}else h=0;while(0);A=(C|0)==103;B=(g|0)!=0;o=g-((C|0)!=102?h:0)+((B&A)<<31>>31)|0;if((o|0)<(((m-D>>2)*9|0)+-9|0)){s=o+9216|0;z=(s|0)/9|0;o=E+(z+-1023<<2)|0;s=((s|0)%9|0)+1|0;if((s|0)<9){q=10;do{q=q*10|0;s=s+1|0}while((s|0)!=9)}else q=10;x=k[o>>2]|0;y=(x>>>0)%(q>>>0)|0;if((y|0)==0?(E+(z+-1022<<2)|0)==(m|0):0)q=w;else K=163;do if((K|0)==163){K=0;v=(((x>>>0)/(q>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;s=(q|0)/2|0;do if(y>>>0>>0)n=.5;else{if((y|0)==(s|0)?(E+(z+-1022<<2)|0)==(m|0):0){n=1.0;break}n=1.5}while(0);do if(F){if((i[G>>0]|0)!=45)break;v=-v;n=-n}while(0);s=x-y|0;k[o>>2]=s;if(!(v+n!=v)){q=w;break}C=s+q|0;k[o>>2]=C;if(C>>>0>999999999){h=w;while(1){q=o+-4|0;k[o>>2]=0;if(q>>>0>>0){h=h+-4|0;k[h>>2]=0}C=(k[q>>2]|0)+1|0;k[q>>2]=C;if(C>>>0>999999999)o=q;else{w=h;o=q;break}}}h=(D-w>>2)*9|0;s=k[w>>2]|0;if(s>>>0<10){q=w;break}else q=10;do{q=q*10|0;h=h+1|0}while(s>>>0>=q>>>0);q=w}while(0);C=o+4|0;w=q;m=m>>>0>C>>>0?C:m}y=0-h|0;while(1){if(m>>>0<=w>>>0){z=0;C=m;break}o=m+-4|0;if(!(k[o>>2]|0))m=o;else{z=1;C=m;break}}do if(A){g=(B&1^1)+g|0;if((g|0)>(h|0)&(h|0)>-5){u=u+-1|0;g=g+-1-h|0}else{u=u+-2|0;g=g+-1|0}m=H&8;if(m)break;do if(z){m=k[C+-4>>2]|0;if(!m){o=9;break}if(!((m>>>0)%10|0)){q=10;o=0}else{o=0;break}do{q=q*10|0;o=o+1|0}while(((m>>>0)%(q>>>0)|0|0)==0)}else o=9;while(0);m=((C-D>>2)*9|0)+-9|0;if((u|32|0)==102){m=m-o|0;m=(m|0)<0?0:m;g=(g|0)<(m|0)?g:m;m=0;break}else{m=m+h-o|0;m=(m|0)<0?0:m;g=(g|0)<(m|0)?g:m;m=0;break}}else m=H&8;while(0);x=g|m;q=(x|0)!=0&1;s=(u|32|0)==102;if(s){h=(h|0)>0?h:0;u=0}else{o=(h|0)<0?y:h;o=Qc(o,((o|0)<0)<<31>>31,X)|0;if((_-o|0)<2)do{o=o+-1|0;i[o>>0]=48}while((_-o|0)<2);i[o+-1>>0]=(h>>31&2)+43;D=o+-2|0;i[D>>0]=u;h=_-D|0;u=D}y=F+1+g+q+h|0;Rc(a,32,J,y,H);if(!(k[a>>2]&32))vc(G,F,a)|0;Rc(a,48,J,y,H^65536);do if(s){o=w>>>0>E>>>0?E:w;h=o;do{m=Qc(k[h>>2]|0,0,R)|0;do if((h|0)==(o|0)){if((m|0)!=(R|0))break;i[T>>0]=48;m=T}else{if(m>>>0<=ca>>>0)break;do{m=m+-1|0;i[m>>0]=48}while(m>>>0>ca>>>0)}while(0);if(!(k[a>>2]&32))vc(m,S-m|0,a)|0;h=h+4|0}while(h>>>0<=E>>>0);do if(x){if(k[a>>2]&32)break;vc(5879,1,a)|0}while(0);if((g|0)>0&h>>>0>>0){m=h;while(1){h=Qc(k[m>>2]|0,0,R)|0;if(h>>>0>ca>>>0)do{h=h+-1|0;i[h>>0]=48}while(h>>>0>ca>>>0);if(!(k[a>>2]&32))vc(h,(g|0)>9?9:g,a)|0;m=m+4|0;h=g+-9|0;if(!((g|0)>9&m>>>0>>0)){g=h;break}else g=h}}Rc(a,48,g+9|0,9,0)}else{s=z?C:w+4|0;if((g|0)>-1){q=(m|0)==0;o=w;do{h=Qc(k[o>>2]|0,0,R)|0;if((h|0)==(R|0)){i[T>>0]=48;h=T}do if((o|0)==(w|0)){m=h+1|0;if(!(k[a>>2]&32))vc(h,1,a)|0;if(q&(g|0)<1){h=m;break}if(k[a>>2]&32){h=m;break}vc(5879,1,a)|0;h=m}else{if(h>>>0<=ca>>>0)break;do{h=h+-1|0;i[h>>0]=48}while(h>>>0>ca>>>0)}while(0);m=S-h|0;if(!(k[a>>2]&32))vc(h,(g|0)>(m|0)?m:g,a)|0;g=g-m|0;o=o+4|0}while(o>>>0>>0&(g|0)>-1)}Rc(a,48,g+18|0,18,0);if(k[a>>2]&32)break;vc(u,_-u|0,a)|0}while(0);Rc(a,32,J,y,H^8192);g=(y|0)<(J|0)?J:y}else{s=(u&32|0)!=0;q=n!=n|0.0!=0.0;h=q?0:F;o=h+3|0;Rc(a,32,J,o,m);g=k[a>>2]|0;if(!(g&32)){vc(G,h,a)|0;g=k[a>>2]|0}if(!(g&32))vc(q?(s?5871:5875):s?5863:5867,3,a)|0;Rc(a,32,J,o,H^8192);g=(o|0)<(J|0)?J:o}while(0);w=I;continue a}default:{m=H;h=o;s=0;u=5827;g=N}}while(0);g:do if((K|0)==64){m=aa;h=k[m>>2]|0;m=k[m+4>>2]|0;q=u&32;if(!((h|0)==0&(m|0)==0)){g=N;do{g=g+-1|0;i[g>>0]=l[5811+(h&15)>>0]|q;h=ad(h|0,m|0,4)|0;m=L}while(!((h|0)==0&(m|0)==0));K=aa;if((s&8|0)==0|(k[K>>2]|0)==0&(k[K+4>>2]|0)==0){h=s;s=0;q=5827;K=77}else{h=s;s=2;q=5827+(u>>4)|0;K=77}}else{g=N;h=s;s=0;q=5827;K=77}}else if((K|0)==76){g=Qc(g,h,N)|0;h=H;s=m;K=77}else if((K|0)==82){K=0;H=Kc(g,0,o)|0;G=(H|0)==0;w=g;h=G?o:H-g|0;s=0;u=5827;g=G?g+o|0:H}else if((K|0)==86){K=0;h=0;g=0;q=k[aa>>2]|0;while(1){m=k[q>>2]|0;if(!m)break;g=sc(ea,m)|0;if((g|0)<0|g>>>0>(o-h|0)>>>0)break;h=g+h|0;if(o>>>0>h>>>0)q=q+4|0;else break}if((g|0)<0){f=-1;break a}Rc(a,32,J,h,H);if(!h){g=0;K=98}else{m=0;o=k[aa>>2]|0;while(1){g=k[o>>2]|0;if(!g){g=h;K=98;break g}g=sc(ea,g)|0;m=g+m|0;if((m|0)>(h|0)){g=h;K=98;break g}if(!(k[a>>2]&32))vc(ea,g,a)|0;if(m>>>0>=h>>>0){g=h;K=98;break}else o=o+4|0}}}while(0);if((K|0)==98){K=0;Rc(a,32,J,g,H^8192);w=I;g=(J|0)>(g|0)?J:g;continue}if((K|0)==77){K=0;m=(o|0)>-1?h&-65537:h;h=aa;h=(k[h>>2]|0)!=0|(k[h+4>>2]|0)!=0;if((o|0)!=0|h){h=(h&1^1)+(U-g)|0;w=g;h=(o|0)>(h|0)?o:h;u=q;g=N}else{w=N;h=0;u=q;g=N}}q=g-w|0;h=(h|0)<(q|0)?q:h;o=s+h|0;g=(J|0)<(o|0)?o:J;Rc(a,32,g,o,m);if(!(k[a>>2]&32))vc(u,s,a)|0;Rc(a,48,g,o,m^65536);Rc(a,48,h,q,0);if(!(k[a>>2]&32))vc(w,q,a)|0;Rc(a,32,g,o,m^8192);w=I}h:do if((K|0)==245)if(!a)if(b){f=1;while(1){b=k[e+(f<<2)>>2]|0;if(!b)break;Pc(d+(f<<3)|0,b,c);f=f+1|0;if((f|0)>=10){f=1;break h}}if((f|0)<10)while(1){if(k[e+(f<<2)>>2]|0){f=-1;break h}f=f+1|0;if((f|0)>=10){f=1;break}}else f=1}else f=0;while(0);r=ga;return f|0}function Nc(a){a=a|0;if(!(k[a+68>>2]|0))Dc(a);return}function Oc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=a+20|0;e=k[d>>2]|0;a=(k[a+16>>2]|0)-e|0;a=a>>>0>c>>>0?c:a;cd(e|0,b|0,a|0)|0;k[d>>2]=(k[d>>2]|0)+a;return c|0}function Pc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;k[a>>2]=b;break a}case 10:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;d=a;k[d>>2]=b;k[d+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;d=a;k[d>>2]=b;k[d+4>>2]=0;break a}case 12:{d=(k[c>>2]|0)+(8-1)&~(8-1);b=d;e=k[b>>2]|0;b=k[b+4>>2]|0;k[c>>2]=d+8;d=a;k[d>>2]=e;k[d+4>>2]=b;break a}case 13:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;d=(d&65535)<<16>>16;e=a;k[e>>2]=d;k[e+4>>2]=((d|0)<0)<<31>>31;break a}case 14:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;e=a;k[e>>2]=d&65535;k[e+4>>2]=0;break a}case 15:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;d=(d&255)<<24>>24;e=a;k[e>>2]=d;k[e+4>>2]=((d|0)<0)<<31>>31;break a}case 16:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;e=a;k[e>>2]=d&255;k[e+4>>2]=0;break a}case 17:{e=(k[c>>2]|0)+(8-1)&~(8-1);f=+p[e>>3];k[c>>2]=e+8;p[a>>3]=f;break a}case 18:{e=(k[c>>2]|0)+(8-1)&~(8-1);f=+p[e>>3];k[c>>2]=e+8;p[a>>3]=f;break a}default:break a}while(0);while(0);return}function Qc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if(b>>>0>0|(b|0)==0&a>>>0>4294967295)while(1){d=kd(a|0,b|0,10,0)|0;c=c+-1|0;i[c>>0]=d|48;d=jd(a|0,b|0,10,0)|0;if(b>>>0>9|(b|0)==9&a>>>0>4294967295){a=d;b=L}else{a=d;break}}if(a)while(1){c=c+-1|0;i[c>>0]=(a>>>0)%10|0|48;if(a>>>0<10)break;else a=(a>>>0)/10|0}return c|0}function Rc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=r;r=r+256|0;g=h;do if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;$c(g|0,b|0,(e>>>0>256?256:e)|0)|0;b=k[a>>2]|0;f=(b&32|0)==0;if(e>>>0>255){d=c-d|0;do{if(f){vc(g,256,a)|0;b=k[a>>2]|0}e=e+-256|0;f=(b&32|0)==0}while(e>>>0>255);if(f)e=d&255;else break}else if(!f)break;vc(g,e,a)|0}while(0);r=h;return}function Sc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;do if(a>>>0<245){o=a>>>0<11?16:a+11&-8;a=o>>>3;h=k[147]|0;c=h>>>a;if(c&3){a=(c&1^1)+a|0;d=a<<1;c=628+(d<<2)|0;d=628+(d+2<<2)|0;e=k[d>>2]|0;f=e+8|0;g=k[f>>2]|0;do if((c|0)!=(g|0)){if(g>>>0<(k[151]|0)>>>0)Aa();b=g+12|0;if((k[b>>2]|0)==(e|0)){k[b>>2]=c;k[d>>2]=g;break}else Aa()}else k[147]=h&~(1<>2]=M|3;M=e+(M|4)|0;k[M>>2]=k[M>>2]|1;M=f;return M|0}g=k[149]|0;if(o>>>0>g>>>0){if(c){d=2<>>12&16;d=d>>>i;e=d>>>5&8;d=d>>>e;f=d>>>2&4;d=d>>>f;c=d>>>1&2;d=d>>>c;a=d>>>1&1;a=(e|i|f|c|a)+(d>>>a)|0;d=a<<1;c=628+(d<<2)|0;d=628+(d+2<<2)|0;f=k[d>>2]|0;i=f+8|0;e=k[i>>2]|0;do if((c|0)!=(e|0)){if(e>>>0<(k[151]|0)>>>0)Aa();b=e+12|0;if((k[b>>2]|0)==(f|0)){k[b>>2]=c;k[d>>2]=e;j=k[149]|0;break}else Aa()}else{k[147]=h&~(1<>2]=o|3;h=f+o|0;k[f+(o|4)>>2]=g|1;k[f+M>>2]=g;if(j){e=k[152]|0;c=j>>>3;b=c<<1;d=628+(b<<2)|0;a=k[147]|0;c=1<>2]|0;if(b>>>0<(k[151]|0)>>>0)Aa();else{l=a;m=b}}else{k[147]=a|c;l=628+(b+2<<2)|0;m=d}k[l>>2]=e;k[m+12>>2]=e;k[e+8>>2]=m;k[e+12>>2]=d}k[149]=g;k[152]=h;M=i;return M|0}a=k[148]|0;if(a){c=(a&0-a)+-1|0;L=c>>>12&16;c=c>>>L;K=c>>>5&8;c=c>>>K;M=c>>>2&4;c=c>>>M;a=c>>>1&2;c=c>>>a;d=c>>>1&1;d=k[892+((K|L|M|a|d)+(c>>>d)<<2)>>2]|0;c=(k[d+4>>2]&-8)-o|0;a=d;while(1){b=k[a+16>>2]|0;if(!b){b=k[a+20>>2]|0;if(!b){i=c;break}}a=(k[b+4>>2]&-8)-o|0;M=a>>>0>>0;c=M?a:c;a=b;d=M?b:d}f=k[151]|0;if(d>>>0>>0)Aa();h=d+o|0;if(d>>>0>=h>>>0)Aa();g=k[d+24>>2]|0;c=k[d+12>>2]|0;do if((c|0)==(d|0)){a=d+20|0;b=k[a>>2]|0;if(!b){a=d+16|0;b=k[a>>2]|0;if(!b){n=0;break}}while(1){c=b+20|0;e=k[c>>2]|0;if(e){b=e;a=c;continue}c=b+16|0;e=k[c>>2]|0;if(!e)break;else{b=e;a=c}}if(a>>>0>>0)Aa();else{k[a>>2]=0;n=b;break}}else{e=k[d+8>>2]|0;if(e>>>0>>0)Aa();b=e+12|0;if((k[b>>2]|0)!=(d|0))Aa();a=c+8|0;if((k[a>>2]|0)==(d|0)){k[b>>2]=c;k[a>>2]=e;n=c;break}else Aa()}while(0);do if(g){b=k[d+28>>2]|0;a=892+(b<<2)|0;if((d|0)==(k[a>>2]|0)){k[a>>2]=n;if(!n){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();b=g+16|0;if((k[b>>2]|0)==(d|0))k[b>>2]=n;else k[g+20>>2]=n;if(!n)break}a=k[151]|0;if(n>>>0>>0)Aa();k[n+24>>2]=g;b=k[d+16>>2]|0;do if(b)if(b>>>0>>0)Aa();else{k[n+16>>2]=b;k[b+24>>2]=n;break}while(0);b=k[d+20>>2]|0;if(b)if(b>>>0<(k[151]|0)>>>0)Aa();else{k[n+20>>2]=b;k[b+24>>2]=n;break}}while(0);if(i>>>0<16){M=i+o|0;k[d+4>>2]=M|3;M=d+(M+4)|0;k[M>>2]=k[M>>2]|1}else{k[d+4>>2]=o|3;k[d+(o|4)>>2]=i|1;k[d+(i+o)>>2]=i;b=k[149]|0;if(b){f=k[152]|0;c=b>>>3;b=c<<1;e=628+(b<<2)|0;a=k[147]|0;c=1<>2]|0;if(a>>>0<(k[151]|0)>>>0)Aa();else{p=b;q=a}}else{k[147]=a|c;p=628+(b+2<<2)|0;q=e}k[p>>2]=f;k[q+12>>2]=f;k[f+8>>2]=q;k[f+12>>2]=e}k[149]=i;k[152]=h}M=d+8|0;return M|0}else q=o}else q=o}else if(a>>>0<=4294967231){a=a+11|0;m=a&-8;l=k[148]|0;if(l){c=0-m|0;a=a>>>8;if(a)if(m>>>0>16777215)j=31;else{q=(a+1048320|0)>>>16&8;v=a<>>16&4;v=v<>>16&2;j=14-(p|q|j)+(v<>>15)|0;j=m>>>(j+7|0)&1|j<<1}else j=0;a=k[892+(j<<2)>>2]|0;a:do if(!a){e=0;a=0;v=86}else{g=c;e=0;h=m<<((j|0)==31?0:25-(j>>>1)|0);i=a;a=0;while(1){f=k[i+4>>2]&-8;c=f-m|0;if(c>>>0>>0)if((f|0)==(m|0)){f=i;a=i;v=90;break a}else a=i;else c=g;v=k[i+20>>2]|0;i=k[i+16+(h>>>31<<2)>>2]|0;e=(v|0)==0|(v|0)==(i|0)?e:v;if(!i){v=86;break}else{g=c;h=h<<1}}}while(0);if((v|0)==86){if((e|0)==0&(a|0)==0){a=2<>>12&16;a=a>>>n;l=a>>>5&8;a=a>>>l;p=a>>>2&4;a=a>>>p;q=a>>>1&2;a=a>>>q;e=a>>>1&1;e=k[892+((l|n|p|q|e)+(a>>>e)<<2)>>2]|0;a=0}if(!e){h=c;i=a}else{f=e;v=90}}if((v|0)==90)while(1){v=0;q=(k[f+4>>2]&-8)-m|0;e=q>>>0>>0;c=e?q:c;a=e?f:a;e=k[f+16>>2]|0;if(e){f=e;v=90;continue}f=k[f+20>>2]|0;if(!f){h=c;i=a;break}else v=90}if((i|0)!=0?h>>>0<((k[149]|0)-m|0)>>>0:0){e=k[151]|0;if(i>>>0>>0)Aa();g=i+m|0;if(i>>>0>=g>>>0)Aa();f=k[i+24>>2]|0;c=k[i+12>>2]|0;do if((c|0)==(i|0)){a=i+20|0;b=k[a>>2]|0;if(!b){a=i+16|0;b=k[a>>2]|0;if(!b){o=0;break}}while(1){c=b+20|0;d=k[c>>2]|0;if(d){b=d;a=c;continue}c=b+16|0;d=k[c>>2]|0;if(!d)break;else{b=d;a=c}}if(a>>>0>>0)Aa();else{k[a>>2]=0;o=b;break}}else{d=k[i+8>>2]|0;if(d>>>0>>0)Aa();b=d+12|0;if((k[b>>2]|0)!=(i|0))Aa();a=c+8|0;if((k[a>>2]|0)==(i|0)){k[b>>2]=c;k[a>>2]=d;o=c;break}else Aa()}while(0);do if(f){b=k[i+28>>2]|0;a=892+(b<<2)|0;if((i|0)==(k[a>>2]|0)){k[a>>2]=o;if(!o){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();b=f+16|0;if((k[b>>2]|0)==(i|0))k[b>>2]=o;else k[f+20>>2]=o;if(!o)break}a=k[151]|0;if(o>>>0>>0)Aa();k[o+24>>2]=f;b=k[i+16>>2]|0;do if(b)if(b>>>0>>0)Aa();else{k[o+16>>2]=b;k[b+24>>2]=o;break}while(0);b=k[i+20>>2]|0;if(b)if(b>>>0<(k[151]|0)>>>0)Aa();else{k[o+20>>2]=b;k[b+24>>2]=o;break}}while(0);b:do if(h>>>0>=16){k[i+4>>2]=m|3;k[i+(m|4)>>2]=h|1;k[i+(h+m)>>2]=h;b=h>>>3;if(h>>>0<256){a=b<<1;d=628+(a<<2)|0;c=k[147]|0;b=1<>2]|0;if(a>>>0<(k[151]|0)>>>0)Aa();else{s=b;t=a}}else{k[147]=c|b;s=628+(a+2<<2)|0;t=d}k[s>>2]=g;k[t+12>>2]=g;k[i+(m+8)>>2]=t;k[i+(m+12)>>2]=d;break}b=h>>>8;if(b)if(h>>>0>16777215)d=31;else{L=(b+1048320|0)>>>16&8;M=b<>>16&4;M=M<>>16&2;d=14-(K|L|d)+(M<>>15)|0;d=h>>>(d+7|0)&1|d<<1}else d=0;b=892+(d<<2)|0;k[i+(m+28)>>2]=d;k[i+(m+20)>>2]=0;k[i+(m+16)>>2]=0;a=k[148]|0;c=1<>2]=g;k[i+(m+24)>>2]=b;k[i+(m+12)>>2]=g;k[i+(m+8)>>2]=g;break}b=k[b>>2]|0;c:do if((k[b+4>>2]&-8|0)!=(h|0)){d=h<<((d|0)==31?0:25-(d>>>1)|0);while(1){a=b+16+(d>>>31<<2)|0;c=k[a>>2]|0;if(!c)break;if((k[c+4>>2]&-8|0)==(h|0)){y=c;break c}else{d=d<<1;b=c}}if(a>>>0<(k[151]|0)>>>0)Aa();else{k[a>>2]=g;k[i+(m+24)>>2]=b;k[i+(m+12)>>2]=g;k[i+(m+8)>>2]=g;break b}}else y=b;while(0);b=y+8|0;a=k[b>>2]|0;M=k[151]|0;if(a>>>0>=M>>>0&y>>>0>=M>>>0){k[a+12>>2]=g;k[b>>2]=g;k[i+(m+8)>>2]=a;k[i+(m+12)>>2]=y;k[i+(m+24)>>2]=0;break}else Aa()}else{M=h+m|0;k[i+4>>2]=M|3;M=i+(M+4)|0;k[M>>2]=k[M>>2]|1}while(0);M=i+8|0;return M|0}else q=m}else q=m}else q=-1;while(0);c=k[149]|0;if(c>>>0>=q>>>0){b=c-q|0;a=k[152]|0;if(b>>>0>15){k[152]=a+q;k[149]=b;k[a+(q+4)>>2]=b|1;k[a+c>>2]=b;k[a+4>>2]=q|3}else{k[149]=0;k[152]=0;k[a+4>>2]=c|3;M=a+(c+4)|0;k[M>>2]=k[M>>2]|1}M=a+8|0;return M|0}a=k[150]|0;if(a>>>0>q>>>0){L=a-q|0;k[150]=L;M=k[153]|0;k[153]=M+q;k[M+(q+4)>>2]=L|1;k[M+4>>2]=q|3;M=M+8|0;return M|0}do if(!(k[265]|0)){a=Ma(30)|0;if(!(a+-1&a)){k[267]=a;k[266]=a;k[268]=-1;k[269]=-1;k[270]=0;k[258]=0;y=(Ea(0)|0)&-16^1431655768;k[265]=y;break}else Aa()}while(0);i=q+48|0;h=k[267]|0;j=q+47|0;g=h+j|0;h=0-h|0;l=g&h;if(l>>>0<=q>>>0){M=0;return M|0}a=k[257]|0;if((a|0)!=0?(t=k[255]|0,y=t+l|0,y>>>0<=t>>>0|y>>>0>a>>>0):0){M=0;return M|0}d:do if(!(k[258]&4)){a=k[153]|0;e:do if(a){e=1036;while(1){c=k[e>>2]|0;if(c>>>0<=a>>>0?(r=e+4|0,(c+(k[r>>2]|0)|0)>>>0>a>>>0):0){f=e;a=r;break}e=k[e+8>>2]|0;if(!e){v=174;break e}}c=g-(k[150]|0)&h;if(c>>>0<2147483647){e=Da(c|0)|0;y=(e|0)==((k[f>>2]|0)+(k[a>>2]|0)|0);a=y?c:0;if(y){if((e|0)!=(-1|0)){w=e;p=a;v=194;break d}}else v=184}else a=0}else v=174;while(0);do if((v|0)==174){f=Da(0)|0;if((f|0)!=(-1|0)){a=f;c=k[266]|0;e=c+-1|0;if(!(e&a))c=l;else c=l-a+(e+a&0-c)|0;a=k[255]|0;e=a+c|0;if(c>>>0>q>>>0&c>>>0<2147483647){y=k[257]|0;if((y|0)!=0?e>>>0<=a>>>0|e>>>0>y>>>0:0){a=0;break}e=Da(c|0)|0;y=(e|0)==(f|0);a=y?c:0;if(y){w=f;p=a;v=194;break d}else v=184}else a=0}else a=0}while(0);f:do if((v|0)==184){f=0-c|0;do if(i>>>0>c>>>0&(c>>>0<2147483647&(e|0)!=(-1|0))?(u=k[267]|0,u=j-c+u&0-u,u>>>0<2147483647):0)if((Da(u|0)|0)==(-1|0)){Da(f|0)|0;break f}else{c=u+c|0;break}while(0);if((e|0)!=(-1|0)){w=e;p=c;v=194;break d}}while(0);k[258]=k[258]|4;v=191}else{a=0;v=191}while(0);if((((v|0)==191?l>>>0<2147483647:0)?(w=Da(l|0)|0,x=Da(0)|0,w>>>0>>0&((w|0)!=(-1|0)&(x|0)!=(-1|0))):0)?(z=x-w|0,A=z>>>0>(q+40|0)>>>0,A):0){p=A?z:a;v=194}if((v|0)==194){a=(k[255]|0)+p|0;k[255]=a;if(a>>>0>(k[256]|0)>>>0)k[256]=a;g=k[153]|0;g:do if(g){f=1036;do{a=k[f>>2]|0;c=f+4|0;e=k[c>>2]|0;if((w|0)==(a+e|0)){B=a;C=c;D=e;E=f;v=204;break}f=k[f+8>>2]|0}while((f|0)!=0);if(((v|0)==204?(k[E+12>>2]&8|0)==0:0)?g>>>0>>0&g>>>0>=B>>>0:0){k[C>>2]=D+p;M=(k[150]|0)+p|0;L=g+8|0;L=(L&7|0)==0?0:0-L&7;K=M-L|0;k[153]=g+L;k[150]=K;k[g+(L+4)>>2]=K|1;k[g+(M+4)>>2]=40;k[154]=k[269];break}a=k[151]|0;if(w>>>0>>0){k[151]=w;a=w}c=w+p|0;f=1036;while(1){if((k[f>>2]|0)==(c|0)){e=f;c=f;v=212;break}f=k[f+8>>2]|0;if(!f){c=1036;break}}if((v|0)==212)if(!(k[c+12>>2]&8)){k[e>>2]=w;n=c+4|0;k[n>>2]=(k[n>>2]|0)+p;n=w+8|0;n=(n&7|0)==0?0:0-n&7;j=w+(p+8)|0;j=(j&7|0)==0?0:0-j&7;b=w+(j+p)|0;m=n+q|0;o=w+m|0;l=b-(w+n)-q|0;k[w+(n+4)>>2]=q|3;h:do if((b|0)!=(g|0)){if((b|0)==(k[152]|0)){M=(k[149]|0)+l|0;k[149]=M;k[152]=o;k[w+(m+4)>>2]=M|1;k[w+(M+m)>>2]=M;break}h=p+4|0;c=k[w+(h+j)>>2]|0;if((c&3|0)==1){i=c&-8;f=c>>>3;i:do if(c>>>0>=256){g=k[w+((j|24)+p)>>2]|0;d=k[w+(p+12+j)>>2]|0;do if((d|0)==(b|0)){e=j|16;d=w+(h+e)|0;c=k[d>>2]|0;if(!c){d=w+(e+p)|0;c=k[d>>2]|0;if(!c){J=0;break}}while(1){e=c+20|0;f=k[e>>2]|0;if(f){c=f;d=e;continue}e=c+16|0;f=k[e>>2]|0;if(!f)break;else{c=f;d=e}}if(d>>>0>>0)Aa();else{k[d>>2]=0;J=c;break}}else{e=k[w+((j|8)+p)>>2]|0;if(e>>>0>>0)Aa();a=e+12|0;if((k[a>>2]|0)!=(b|0))Aa();c=d+8|0;if((k[c>>2]|0)==(b|0)){k[a>>2]=d;k[c>>2]=e;J=d;break}else Aa()}while(0);if(!g)break;a=k[w+(p+28+j)>>2]|0;c=892+(a<<2)|0;do if((b|0)!=(k[c>>2]|0)){if(g>>>0<(k[151]|0)>>>0)Aa();a=g+16|0;if((k[a>>2]|0)==(b|0))k[a>>2]=J;else k[g+20>>2]=J;if(!J)break i}else{k[c>>2]=J;if(J)break;k[148]=k[148]&~(1<>>0>>0)Aa();k[J+24>>2]=g;b=j|16;a=k[w+(b+p)>>2]|0;do if(a)if(a>>>0>>0)Aa();else{k[J+16>>2]=a;k[a+24>>2]=J;break}while(0);b=k[w+(h+b)>>2]|0;if(!b)break;if(b>>>0<(k[151]|0)>>>0)Aa();else{k[J+20>>2]=b;k[b+24>>2]=J;break}}else{d=k[w+((j|8)+p)>>2]|0;e=k[w+(p+12+j)>>2]|0;c=628+(f<<1<<2)|0;do if((d|0)!=(c|0)){if(d>>>0>>0)Aa();if((k[d+12>>2]|0)==(b|0))break;Aa()}while(0);if((e|0)==(d|0)){k[147]=k[147]&~(1<>>0>>0)Aa();a=e+8|0;if((k[a>>2]|0)==(b|0)){F=a;break}Aa()}while(0);k[d+12>>2]=e;k[F>>2]=d}while(0);b=w+((i|j)+p)|0;e=i+l|0}else e=l;b=b+4|0;k[b>>2]=k[b>>2]&-2;k[w+(m+4)>>2]=e|1;k[w+(e+m)>>2]=e;b=e>>>3;if(e>>>0<256){a=b<<1;d=628+(a<<2)|0;c=k[147]|0;b=1<>2]|0;if(a>>>0>=(k[151]|0)>>>0){K=b;L=a;break}Aa()}while(0);k[K>>2]=o;k[L+12>>2]=o;k[w+(m+8)>>2]=L;k[w+(m+12)>>2]=d;break}b=e>>>8;do if(!b)d=0;else{if(e>>>0>16777215){d=31;break}K=(b+1048320|0)>>>16&8;L=b<>>16&4;L=L<>>16&2;d=14-(J|K|d)+(L<>>15)|0;d=e>>>(d+7|0)&1|d<<1}while(0);b=892+(d<<2)|0;k[w+(m+28)>>2]=d;k[w+(m+20)>>2]=0;k[w+(m+16)>>2]=0;a=k[148]|0;c=1<>2]=o;k[w+(m+24)>>2]=b;k[w+(m+12)>>2]=o;k[w+(m+8)>>2]=o;break}b=k[b>>2]|0;j:do if((k[b+4>>2]&-8|0)!=(e|0)){d=e<<((d|0)==31?0:25-(d>>>1)|0);while(1){a=b+16+(d>>>31<<2)|0;c=k[a>>2]|0;if(!c)break;if((k[c+4>>2]&-8|0)==(e|0)){M=c;break j}else{d=d<<1;b=c}}if(a>>>0<(k[151]|0)>>>0)Aa();else{k[a>>2]=o;k[w+(m+24)>>2]=b;k[w+(m+12)>>2]=o;k[w+(m+8)>>2]=o;break h}}else M=b;while(0);b=M+8|0;a=k[b>>2]|0;L=k[151]|0;if(a>>>0>=L>>>0&M>>>0>=L>>>0){k[a+12>>2]=o;k[b>>2]=o;k[w+(m+8)>>2]=a;k[w+(m+12)>>2]=M;k[w+(m+24)>>2]=0;break}else Aa()}else{M=(k[150]|0)+l|0;k[150]=M;k[153]=o;k[w+(m+4)>>2]=M|1}while(0);M=w+(n|8)|0;return M|0}else c=1036;while(1){a=k[c>>2]|0;if(a>>>0<=g>>>0?(b=k[c+4>>2]|0,d=a+b|0,d>>>0>g>>>0):0)break;c=k[c+8>>2]|0}e=a+(b+-39)|0;a=a+(b+-47+((e&7|0)==0?0:0-e&7))|0;e=g+16|0;a=a>>>0>>0?g:a;b=a+8|0;c=w+8|0;c=(c&7|0)==0?0:0-c&7;M=p+-40-c|0;k[153]=w+c;k[150]=M;k[w+(c+4)>>2]=M|1;k[w+(p+-36)>>2]=40;k[154]=k[269];c=a+4|0;k[c>>2]=27;k[b>>2]=k[259];k[b+4>>2]=k[260];k[b+8>>2]=k[261];k[b+12>>2]=k[262];k[259]=w;k[260]=p;k[262]=0;k[261]=b;b=a+28|0;k[b>>2]=7;if((a+32|0)>>>0>>0)do{M=b;b=b+4|0;k[b>>2]=7}while((M+8|0)>>>0>>0);if((a|0)!=(g|0)){f=a-g|0;k[c>>2]=k[c>>2]&-2;k[g+4>>2]=f|1;k[a>>2]=f;b=f>>>3;if(f>>>0<256){a=b<<1;d=628+(a<<2)|0;c=k[147]|0;b=1<>2]|0;if(a>>>0<(k[151]|0)>>>0)Aa();else{G=b;H=a}}else{k[147]=c|b;G=628+(a+2<<2)|0;H=d}k[G>>2]=g;k[H+12>>2]=g;k[g+8>>2]=H;k[g+12>>2]=d;break}b=f>>>8;if(b)if(f>>>0>16777215)d=31;else{L=(b+1048320|0)>>>16&8;M=b<>>16&4;M=M<>>16&2;d=14-(K|L|d)+(M<>>15)|0;d=f>>>(d+7|0)&1|d<<1}else d=0;c=892+(d<<2)|0;k[g+28>>2]=d;k[g+20>>2]=0;k[e>>2]=0;b=k[148]|0;a=1<>2]=g;k[g+24>>2]=c;k[g+12>>2]=g;k[g+8>>2]=g;break}b=k[c>>2]|0;k:do if((k[b+4>>2]&-8|0)!=(f|0)){d=f<<((d|0)==31?0:25-(d>>>1)|0);while(1){a=b+16+(d>>>31<<2)|0;c=k[a>>2]|0;if(!c)break;if((k[c+4>>2]&-8|0)==(f|0)){I=c;break k}else{d=d<<1;b=c}}if(a>>>0<(k[151]|0)>>>0)Aa();else{k[a>>2]=g;k[g+24>>2]=b;k[g+12>>2]=g;k[g+8>>2]=g;break g}}else I=b;while(0);b=I+8|0;a=k[b>>2]|0;M=k[151]|0;if(a>>>0>=M>>>0&I>>>0>=M>>>0){k[a+12>>2]=g;k[b>>2]=g;k[g+8>>2]=a;k[g+12>>2]=I;k[g+24>>2]=0;break}else Aa()}}else{M=k[151]|0;if((M|0)==0|w>>>0>>0)k[151]=w;k[259]=w;k[260]=p;k[262]=0;k[156]=k[265];k[155]=-1;b=0;do{M=b<<1;L=628+(M<<2)|0;k[628+(M+3<<2)>>2]=L;k[628+(M+2<<2)>>2]=L;b=b+1|0}while((b|0)!=32);M=w+8|0;M=(M&7|0)==0?0:0-M&7;L=p+-40-M|0;k[153]=w+M;k[150]=L;k[w+(M+4)>>2]=L|1;k[w+(p+-36)>>2]=40;k[154]=k[269]}while(0);b=k[150]|0;if(b>>>0>q>>>0){L=b-q|0;k[150]=L;M=k[153]|0;k[153]=M+q;k[M+(q+4)>>2]=L|1;k[M+4>>2]=q|3;M=M+8|0;return M|0}}M=nc()|0;k[M>>2]=12;M=0;return M|0}function Tc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;if(!a)return;b=a+-8|0;h=k[151]|0;if(b>>>0>>0)Aa();c=k[a+-4>>2]|0;d=c&3;if((d|0)==1)Aa();o=c&-8;q=a+(o+-8)|0;do if(!(c&1)){b=k[b>>2]|0;if(!d)return;i=-8-b|0;l=a+i|0;m=b+o|0;if(l>>>0>>0)Aa();if((l|0)==(k[152]|0)){b=a+(o+-4)|0;c=k[b>>2]|0;if((c&3|0)!=3){u=l;f=m;break}k[149]=m;k[b>>2]=c&-2;k[a+(i+4)>>2]=m|1;k[q>>2]=m;return}e=b>>>3;if(b>>>0<256){d=k[a+(i+8)>>2]|0;c=k[a+(i+12)>>2]|0;b=628+(e<<1<<2)|0;if((d|0)!=(b|0)){if(d>>>0>>0)Aa();if((k[d+12>>2]|0)!=(l|0))Aa()}if((c|0)==(d|0)){k[147]=k[147]&~(1<>>0>>0)Aa();b=c+8|0;if((k[b>>2]|0)==(l|0))g=b;else Aa()}else g=c+8|0;k[d+12>>2]=c;k[g>>2]=d;u=l;f=m;break}g=k[a+(i+24)>>2]|0;d=k[a+(i+12)>>2]|0;do if((d|0)==(l|0)){c=a+(i+20)|0;b=k[c>>2]|0;if(!b){c=a+(i+16)|0;b=k[c>>2]|0;if(!b){j=0;break}}while(1){d=b+20|0;e=k[d>>2]|0;if(e){b=e;c=d;continue}d=b+16|0;e=k[d>>2]|0;if(!e)break;else{b=e;c=d}}if(c>>>0>>0)Aa();else{k[c>>2]=0;j=b;break}}else{e=k[a+(i+8)>>2]|0;if(e>>>0>>0)Aa();b=e+12|0;if((k[b>>2]|0)!=(l|0))Aa();c=d+8|0;if((k[c>>2]|0)==(l|0)){k[b>>2]=d;k[c>>2]=e;j=d;break}else Aa()}while(0);if(g){b=k[a+(i+28)>>2]|0;c=892+(b<<2)|0;if((l|0)==(k[c>>2]|0)){k[c>>2]=j;if(!j){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();b=g+16|0;if((k[b>>2]|0)==(l|0))k[b>>2]=j;else k[g+20>>2]=j;if(!j){u=l;f=m;break}}c=k[151]|0;if(j>>>0>>0)Aa();k[j+24>>2]=g;b=k[a+(i+16)>>2]|0;do if(b)if(b>>>0>>0)Aa();else{k[j+16>>2]=b;k[b+24>>2]=j;break}while(0);b=k[a+(i+20)>>2]|0;if(b)if(b>>>0<(k[151]|0)>>>0)Aa();else{k[j+20>>2]=b;k[b+24>>2]=j;u=l;f=m;break}else{u=l;f=m}}else{u=l;f=m}}else{u=b;f=o}while(0);if(u>>>0>=q>>>0)Aa();b=a+(o+-4)|0;c=k[b>>2]|0;if(!(c&1))Aa();if(!(c&2)){if((q|0)==(k[153]|0)){t=(k[150]|0)+f|0;k[150]=t;k[153]=u;k[u+4>>2]=t|1;if((u|0)!=(k[152]|0))return;k[152]=0;k[149]=0;return}if((q|0)==(k[152]|0)){t=(k[149]|0)+f|0;k[149]=t;k[152]=u;k[u+4>>2]=t|1;k[u+t>>2]=t;return}f=(c&-8)+f|0;e=c>>>3;do if(c>>>0>=256){g=k[a+(o+16)>>2]|0;b=k[a+(o|4)>>2]|0;do if((b|0)==(q|0)){c=a+(o+12)|0;b=k[c>>2]|0;if(!b){c=a+(o+8)|0;b=k[c>>2]|0;if(!b){p=0;break}}while(1){d=b+20|0;e=k[d>>2]|0;if(e){b=e;c=d;continue}d=b+16|0;e=k[d>>2]|0;if(!e)break;else{b=e;c=d}}if(c>>>0<(k[151]|0)>>>0)Aa();else{k[c>>2]=0;p=b;break}}else{c=k[a+o>>2]|0;if(c>>>0<(k[151]|0)>>>0)Aa();d=c+12|0;if((k[d>>2]|0)!=(q|0))Aa();e=b+8|0;if((k[e>>2]|0)==(q|0)){k[d>>2]=b;k[e>>2]=c;p=b;break}else Aa()}while(0);if(g){b=k[a+(o+20)>>2]|0;c=892+(b<<2)|0;if((q|0)==(k[c>>2]|0)){k[c>>2]=p;if(!p){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();b=g+16|0;if((k[b>>2]|0)==(q|0))k[b>>2]=p;else k[g+20>>2]=p;if(!p)break}c=k[151]|0;if(p>>>0>>0)Aa();k[p+24>>2]=g;b=k[a+(o+8)>>2]|0;do if(b)if(b>>>0>>0)Aa();else{k[p+16>>2]=b;k[b+24>>2]=p;break}while(0);b=k[a+(o+12)>>2]|0;if(b)if(b>>>0<(k[151]|0)>>>0)Aa();else{k[p+20>>2]=b;k[b+24>>2]=p;break}}}else{d=k[a+o>>2]|0;c=k[a+(o|4)>>2]|0;b=628+(e<<1<<2)|0;if((d|0)!=(b|0)){if(d>>>0<(k[151]|0)>>>0)Aa();if((k[d+12>>2]|0)!=(q|0))Aa()}if((c|0)==(d|0)){k[147]=k[147]&~(1<>>0<(k[151]|0)>>>0)Aa();b=c+8|0;if((k[b>>2]|0)==(q|0))n=b;else Aa()}else n=c+8|0;k[d+12>>2]=c;k[n>>2]=d}while(0);k[u+4>>2]=f|1;k[u+f>>2]=f;if((u|0)==(k[152]|0)){k[149]=f;return}}else{k[b>>2]=c&-2;k[u+4>>2]=f|1;k[u+f>>2]=f}b=f>>>3;if(f>>>0<256){c=b<<1;e=628+(c<<2)|0;d=k[147]|0;b=1<>2]|0;if(c>>>0<(k[151]|0)>>>0)Aa();else{r=b;s=c}}else{k[147]=d|b;r=628+(c+2<<2)|0;s=e}k[r>>2]=u;k[s+12>>2]=u;k[u+8>>2]=s;k[u+12>>2]=e;return}b=f>>>8;if(b)if(f>>>0>16777215)e=31;else{r=(b+1048320|0)>>>16&8;s=b<>>16&4;s=s<>>16&2;e=14-(q|r|e)+(s<>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;b=892+(e<<2)|0;k[u+28>>2]=e;k[u+20>>2]=0;k[u+16>>2]=0;c=k[148]|0;d=1<>2]|0;b:do if((k[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){c=b+16+(e>>>31<<2)|0;d=k[c>>2]|0;if(!d)break;if((k[d+4>>2]&-8|0)==(f|0)){t=d;break b}else{e=e<<1;b=d}}if(c>>>0<(k[151]|0)>>>0)Aa();else{k[c>>2]=u;k[u+24>>2]=b;k[u+12>>2]=u;k[u+8>>2]=u;break a}}else t=b;while(0);b=t+8|0;c=k[b>>2]|0;s=k[151]|0;if(c>>>0>=s>>>0&t>>>0>=s>>>0){k[c+12>>2]=u;k[b>>2]=u;k[u+8>>2]=c;k[u+12>>2]=t;k[u+24>>2]=0;break}else Aa()}else{k[148]=c|d;k[b>>2]=u;k[u+24>>2]=b;k[u+12>>2]=u;k[u+8>>2]=u}while(0);u=(k[155]|0)+-1|0;k[155]=u;if(!u)b=1044;else return;while(1){b=k[b>>2]|0;if(!b)break;else b=b+8|0}k[155]=-1;return}function Uc(a,b){a=a|0;b=b|0;var c=0,d=0;if(!a){a=Sc(b)|0;return a|0}if(b>>>0>4294967231){a=nc()|0;k[a>>2]=12;a=0;return a|0}c=Wc(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(c){a=c+8|0;return a|0}c=Sc(b)|0;if(!c){a=0;return a|0}d=k[a+-4>>2]|0;d=(d&-8)-((d&3|0)==0?8:4)|0;cd(c|0,a|0,(d>>>0>>0?d:b)|0)|0;Tc(a);a=c;return a|0}function Vc(a){a=a|0;var b=0;if(!a){b=0;return b|0}a=k[a+-4>>2]|0;b=a&3;if((b|0)==1){b=0;return b|0}b=(a&-8)-((b|0)==0?8:4)|0;return b|0}function Wc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;o=a+4|0;p=k[o>>2]|0;i=p&-8;l=a+i|0;h=k[151]|0;c=p&3;if(!((c|0)!=1&a>>>0>=h>>>0&a>>>0>>0))Aa();d=a+(i|4)|0;e=k[d>>2]|0;if(!(e&1))Aa();if(!c){if(b>>>0<256){a=0;return a|0}if(i>>>0>=(b+4|0)>>>0?(i-b|0)>>>0<=k[267]<<1>>>0:0)return a|0;a=0;return a|0}if(i>>>0>=b>>>0){c=i-b|0;if(c>>>0<=15)return a|0;k[o>>2]=p&1|b|2;k[a+(b+4)>>2]=c|3;k[d>>2]=k[d>>2]|1;Xc(a+b|0,c);return a|0}if((l|0)==(k[153]|0)){c=(k[150]|0)+i|0;if(c>>>0<=b>>>0){a=0;return a|0}n=c-b|0;k[o>>2]=p&1|b|2;k[a+(b+4)>>2]=n|1;k[153]=a+b;k[150]=n;return a|0}if((l|0)==(k[152]|0)){d=(k[149]|0)+i|0;if(d>>>0>>0){a=0;return a|0}c=d-b|0;if(c>>>0>15){k[o>>2]=p&1|b|2;k[a+(b+4)>>2]=c|1;k[a+d>>2]=c;d=a+(d+4)|0;k[d>>2]=k[d>>2]&-2;d=a+b|0}else{k[o>>2]=p&1|d|2;d=a+(d+4)|0;k[d>>2]=k[d>>2]|1;d=0;c=0}k[149]=c;k[152]=d;return a|0}if(e&2){a=0;return a|0}m=(e&-8)+i|0;if(m>>>0>>0){a=0;return a|0}n=m-b|0;f=e>>>3;do if(e>>>0>=256){g=k[a+(i+24)>>2]|0;f=k[a+(i+12)>>2]|0;do if((f|0)==(l|0)){d=a+(i+20)|0;c=k[d>>2]|0;if(!c){d=a+(i+16)|0;c=k[d>>2]|0;if(!c){j=0;break}}while(1){e=c+20|0;f=k[e>>2]|0;if(f){c=f;d=e;continue}e=c+16|0;f=k[e>>2]|0;if(!f)break;else{c=f;d=e}}if(d>>>0>>0)Aa();else{k[d>>2]=0;j=c;break}}else{e=k[a+(i+8)>>2]|0;if(e>>>0>>0)Aa();c=e+12|0;if((k[c>>2]|0)!=(l|0))Aa();d=f+8|0;if((k[d>>2]|0)==(l|0)){k[c>>2]=f;k[d>>2]=e;j=f;break}else Aa()}while(0);if(g){c=k[a+(i+28)>>2]|0;d=892+(c<<2)|0;if((l|0)==(k[d>>2]|0)){k[d>>2]=j;if(!j){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();c=g+16|0;if((k[c>>2]|0)==(l|0))k[c>>2]=j;else k[g+20>>2]=j;if(!j)break}d=k[151]|0;if(j>>>0>>0)Aa();k[j+24>>2]=g;c=k[a+(i+16)>>2]|0;do if(c)if(c>>>0>>0)Aa();else{k[j+16>>2]=c;k[c+24>>2]=j;break}while(0);c=k[a+(i+20)>>2]|0;if(c)if(c>>>0<(k[151]|0)>>>0)Aa();else{k[j+20>>2]=c;k[c+24>>2]=j;break}}}else{e=k[a+(i+8)>>2]|0;d=k[a+(i+12)>>2]|0;c=628+(f<<1<<2)|0;if((e|0)!=(c|0)){if(e>>>0>>0)Aa();if((k[e+12>>2]|0)!=(l|0))Aa()}if((d|0)==(e|0)){k[147]=k[147]&~(1<>>0>>0)Aa();c=d+8|0;if((k[c>>2]|0)==(l|0))g=c;else Aa()}else g=d+8|0;k[e+12>>2]=d;k[g>>2]=e}while(0);if(n>>>0<16){k[o>>2]=m|p&1|2;b=a+(m|4)|0;k[b>>2]=k[b>>2]|1;return a|0}else{k[o>>2]=p&1|b|2;k[a+(b+4)>>2]=n|3;p=a+(m|4)|0;k[p>>2]=k[p>>2]|1;Xc(a+b|0,n);return a|0}return 0}function Xc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;q=a+b|0;c=k[a+4>>2]|0;do if(!(c&1)){j=k[a>>2]|0;if(!(c&3))return;n=a+(0-j)|0;m=j+b|0;i=k[151]|0;if(n>>>0>>0)Aa();if((n|0)==(k[152]|0)){d=a+(b+4)|0;c=k[d>>2]|0;if((c&3|0)!=3){t=n;g=m;break}k[149]=m;k[d>>2]=c&-2;k[a+(4-j)>>2]=m|1;k[q>>2]=m;return}f=j>>>3;if(j>>>0<256){e=k[a+(8-j)>>2]|0;d=k[a+(12-j)>>2]|0;c=628+(f<<1<<2)|0;if((e|0)!=(c|0)){if(e>>>0>>0)Aa();if((k[e+12>>2]|0)!=(n|0))Aa()}if((d|0)==(e|0)){k[147]=k[147]&~(1<>>0>>0)Aa();c=d+8|0;if((k[c>>2]|0)==(n|0))h=c;else Aa()}else h=d+8|0;k[e+12>>2]=d;k[h>>2]=e;t=n;g=m;break}h=k[a+(24-j)>>2]|0;e=k[a+(12-j)>>2]|0;do if((e|0)==(n|0)){e=16-j|0;d=a+(e+4)|0;c=k[d>>2]|0;if(!c){d=a+e|0;c=k[d>>2]|0;if(!c){l=0;break}}while(1){e=c+20|0;f=k[e>>2]|0;if(f){c=f;d=e;continue}e=c+16|0;f=k[e>>2]|0;if(!f)break;else{c=f;d=e}}if(d>>>0>>0)Aa();else{k[d>>2]=0;l=c;break}}else{f=k[a+(8-j)>>2]|0;if(f>>>0>>0)Aa();c=f+12|0;if((k[c>>2]|0)!=(n|0))Aa();d=e+8|0;if((k[d>>2]|0)==(n|0)){k[c>>2]=e;k[d>>2]=f;l=e;break}else Aa()}while(0);if(h){c=k[a+(28-j)>>2]|0;d=892+(c<<2)|0;if((n|0)==(k[d>>2]|0)){k[d>>2]=l;if(!l){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();c=h+16|0;if((k[c>>2]|0)==(n|0))k[c>>2]=l;else k[h+20>>2]=l;if(!l){t=n;g=m;break}}e=k[151]|0;if(l>>>0>>0)Aa();k[l+24>>2]=h;c=16-j|0;d=k[a+c>>2]|0;do if(d)if(d>>>0>>0)Aa();else{k[l+16>>2]=d;k[d+24>>2]=l;break}while(0);c=k[a+(c+4)>>2]|0;if(c)if(c>>>0<(k[151]|0)>>>0)Aa();else{k[l+20>>2]=c;k[c+24>>2]=l;t=n;g=m;break}else{t=n;g=m}}else{t=n;g=m}}else{t=a;g=b}while(0);i=k[151]|0;if(q>>>0>>0)Aa();c=a+(b+4)|0;d=k[c>>2]|0;if(!(d&2)){if((q|0)==(k[153]|0)){s=(k[150]|0)+g|0;k[150]=s;k[153]=t;k[t+4>>2]=s|1;if((t|0)!=(k[152]|0))return;k[152]=0;k[149]=0;return}if((q|0)==(k[152]|0)){s=(k[149]|0)+g|0;k[149]=s;k[152]=t;k[t+4>>2]=s|1;k[t+s>>2]=s;return}g=(d&-8)+g|0;f=d>>>3;do if(d>>>0>=256){h=k[a+(b+24)>>2]|0;e=k[a+(b+12)>>2]|0;do if((e|0)==(q|0)){d=a+(b+20)|0;c=k[d>>2]|0;if(!c){d=a+(b+16)|0;c=k[d>>2]|0;if(!c){p=0;break}}while(1){e=c+20|0;f=k[e>>2]|0;if(f){c=f;d=e;continue}e=c+16|0;f=k[e>>2]|0;if(!f)break;else{c=f;d=e}}if(d>>>0>>0)Aa();else{k[d>>2]=0;p=c;break}}else{f=k[a+(b+8)>>2]|0;if(f>>>0>>0)Aa();c=f+12|0;if((k[c>>2]|0)!=(q|0))Aa();d=e+8|0;if((k[d>>2]|0)==(q|0)){k[c>>2]=e;k[d>>2]=f;p=e;break}else Aa()}while(0);if(h){c=k[a+(b+28)>>2]|0;d=892+(c<<2)|0;if((q|0)==(k[d>>2]|0)){k[d>>2]=p;if(!p){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();c=h+16|0;if((k[c>>2]|0)==(q|0))k[c>>2]=p;else k[h+20>>2]=p;if(!p)break}d=k[151]|0;if(p>>>0>>0)Aa();k[p+24>>2]=h;c=k[a+(b+16)>>2]|0;do if(c)if(c>>>0>>0)Aa();else{k[p+16>>2]=c;k[c+24>>2]=p;break}while(0);c=k[a+(b+20)>>2]|0;if(c)if(c>>>0<(k[151]|0)>>>0)Aa();else{k[p+20>>2]=c;k[c+24>>2]=p;break}}}else{e=k[a+(b+8)>>2]|0;d=k[a+(b+12)>>2]|0;c=628+(f<<1<<2)|0;if((e|0)!=(c|0)){if(e>>>0>>0)Aa();if((k[e+12>>2]|0)!=(q|0))Aa()}if((d|0)==(e|0)){k[147]=k[147]&~(1<>>0>>0)Aa();c=d+8|0;if((k[c>>2]|0)==(q|0))o=c;else Aa()}else o=d+8|0;k[e+12>>2]=d;k[o>>2]=e}while(0);k[t+4>>2]=g|1;k[t+g>>2]=g;if((t|0)==(k[152]|0)){k[149]=g;return}}else{k[c>>2]=d&-2;k[t+4>>2]=g|1;k[t+g>>2]=g}c=g>>>3;if(g>>>0<256){d=c<<1;f=628+(d<<2)|0;e=k[147]|0;c=1<>2]|0;if(d>>>0<(k[151]|0)>>>0)Aa();else{r=c;s=d}}else{k[147]=e|c;r=628+(d+2<<2)|0;s=f}k[r>>2]=t;k[s+12>>2]=t;k[t+8>>2]=s;k[t+12>>2]=f;return}c=g>>>8;if(c)if(g>>>0>16777215)f=31;else{r=(c+1048320|0)>>>16&8;s=c<>>16&4;s=s<>>16&2;f=14-(q|r|f)+(s<>>15)|0;f=g>>>(f+7|0)&1|f<<1}else f=0;c=892+(f<<2)|0;k[t+28>>2]=f;k[t+20>>2]=0;k[t+16>>2]=0;d=k[148]|0;e=1<>2]=t;k[t+24>>2]=c;k[t+12>>2]=t;k[t+8>>2]=t;return}c=k[c>>2]|0;a:do if((k[c+4>>2]&-8|0)!=(g|0)){f=g<<((f|0)==31?0:25-(f>>>1)|0);while(1){d=c+16+(f>>>31<<2)|0;e=k[d>>2]|0;if(!e)break;if((k[e+4>>2]&-8|0)==(g|0)){c=e;break a}else{f=f<<1;c=e}}if(d>>>0<(k[151]|0)>>>0)Aa();k[d>>2]=t;k[t+24>>2]=c;k[t+12>>2]=t;k[t+8>>2]=t;return}while(0);d=c+8|0;e=k[d>>2]|0;s=k[151]|0;if(!(e>>>0>=s>>>0&c>>>0>=s>>>0))Aa();k[e+12>>2]=t;k[d>>2]=t;k[t+8>>2]=e;k[t+12>>2]=c;k[t+24>>2]=0;return}function Yc(){}function Zc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (L=d,a-c>>>0|0)|0}function _c(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (L=b+d+(c>>>0>>0|0)>>>0,c|0)|0}function $c(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=a+c|0;if((c|0)>=20){b=b&255;f=a&3;g=b|b<<8|b<<16|b<<24;e=d&~3;if(f){f=a+4-f|0;while((a|0)<(f|0)){i[a>>0]=b;a=a+1|0}}while((a|0)<(e|0)){k[a>>2]=g;a=a+4|0}}while((a|0)<(d|0)){i[a>>0]=b;a=a+1|0}return a-c|0}function ad(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b>>>c;return a>>>c|(b&(1<>>c-32|0}function bd(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b<>>32-c;return a<=4096)return Ha(a|0,b|0,c|0)|0;d=a|0;if((a&3)==(b&3)){while(a&3){if(!c)return d|0;i[a>>0]=i[b>>0]|0;a=a+1|0;b=b+1|0;c=c-1|0}while((c|0)>=4){k[a>>2]=k[b>>2];a=a+4|0;b=b+4|0;c=c-4|0}}while((c|0)>0){i[a>>0]=i[b>>0]|0;a=a+1|0;b=b+1|0;c=c-1|0}return d|0}function dd(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b>>c;return a>>>c|(b&(1<>c-32|0}function ed(a){a=a|0;var b=0;b=i[v+(a&255)>>0]|0;if((b|0)<8)return b|0;b=i[v+(a>>8&255)>>0]|0;if((b|0)<8)return b+8|0;b=i[v+(a>>16&255)>>0]|0;if((b|0)<8)return b+16|0;return (i[v+(a>>>24)>>0]|0)+24|0}function fd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=ha(e,f)|0;d=a>>>16;a=(c>>>16)+(ha(e,d)|0)|0;e=b>>>16;b=ha(e,f)|0;return (L=(a>>>16)+(ha(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=Zc(j^a,i^b,j,i)|0;g=L;a=f^j;b=e^i;return Zc((ld(h,g,Zc(f^c,e^d,f,e)|0,L,0)|0)^a,L^b,a,b)|0}function hd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=r;r=r+16|0;h=e|0;g=b>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;j=d>>31|((d|0)<0?-1:0)<<1;i=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;a=Zc(g^a,f^b,g,f)|0;b=L;ld(a,b,Zc(j^c,i^d,j,i)|0,L,h)|0;d=Zc(k[h>>2]^g,k[h+4>>2]^f,g,f)|0;c=L;r=e;return (L=c,d)|0}function id(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=fd(e,f)|0;a=L;return (L=(ha(b,f)|0)+(ha(d,e)|0)+a|a&0,c|0|0)|0}function jd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ld(a,b,c,d,0)|0}function kd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=r;r=r+16|0;e=f|0;ld(a,b,c,d,e)|0;r=f;return (L=k[e+4>>2]|0,k[e>>2]|0)|0}function ld(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;l=a;i=b;j=i;g=c;n=d;h=n;if(!j){f=(e|0)!=0;if(!h){if(f){k[e>>2]=(l>>>0)%(g>>>0);k[e+4>>2]=0}n=0;e=(l>>>0)/(g>>>0)>>>0;return (L=n,e)|0}else{if(!f){n=0;e=0;return (L=n,e)|0}k[e>>2]=a|0;k[e+4>>2]=b&0;n=0;e=0;return (L=n,e)|0}}f=(h|0)==0;do if(g){if(!f){f=(ja(h|0)|0)-(ja(j|0)|0)|0;if(f>>>0<=31){m=f+1|0;h=31-f|0;b=f-31>>31;g=m;a=l>>>(m>>>0)&b|j<>>(m>>>0)&b;f=0;h=l<>2]=a|0;k[e+4>>2]=i|b&0;n=0;e=0;return (L=n,e)|0}f=g-1|0;if(f&g){h=(ja(g|0)|0)+33-(ja(j|0)|0)|0;p=64-h|0;m=32-h|0;i=m>>31;o=h-32|0;b=o>>31;g=h;a=m-1>>31&j>>>(o>>>0)|(j<>>(h>>>0))&b;b=b&j>>>(h>>>0);f=l<>>(o>>>0))&i|l<>31;break}if(e){k[e>>2]=f&l;k[e+4>>2]=0}if((g|0)==1){o=i|b&0;p=a|0|0;return (L=o,p)|0}else{p=ed(g|0)|0;o=j>>>(p>>>0)|0;p=j<<32-p|l>>>(p>>>0)|0;return (L=o,p)|0}}else{if(f){if(e){k[e>>2]=(j>>>0)%(g>>>0);k[e+4>>2]=0}o=0;p=(j>>>0)/(g>>>0)>>>0;return (L=o,p)|0}if(!l){if(e){k[e>>2]=0;k[e+4>>2]=(j>>>0)%(h>>>0)}o=0;p=(j>>>0)/(h>>>0)>>>0;return (L=o,p)|0}f=h-1|0;if(!(f&h)){if(e){k[e>>2]=a|0;k[e+4>>2]=f&j|b&0}o=0;p=j>>>((ed(h|0)|0)>>>0);return (L=o,p)|0}f=(ja(h|0)|0)-(ja(j|0)|0)|0;if(f>>>0<=30){b=f+1|0;h=31-f|0;g=b;a=j<>>(b>>>0);b=j>>>(b>>>0);f=0;h=l<>2]=a|0;k[e+4>>2]=i|b&0;o=0;p=0;return (L=o,p)|0}while(0);if(!g){j=h;i=0;h=0}else{m=c|0|0;l=n|d&0;j=_c(m|0,l|0,-1,-1)|0;c=L;i=h;h=0;do{d=i;i=f>>>31|i<<1;f=h|f<<1;d=a<<1|d>>>31|0;n=a>>>31|b<<1|0;Zc(j,c,d,n)|0;p=L;o=p>>31|((p|0)<0?-1:0)<<1;h=o&1;a=Zc(d,n,o&m,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l)|0;b=L;g=g-1|0}while((g|0)!=0);j=i;i=0}g=0;if(e){k[e>>2]=a;k[e+4>>2]=b}o=(f|0)>>>31|(j|g)<<1|(g<<1|f>>>31)&0|i;p=(f<<1|0>>>31)&-2|h;return (L=o,p)|0}function md(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ra[a&7](b|0,c|0,d|0)|0}function nd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Sa[a&3](b|0,c|0,d|0,e|0,f|0)}function od(a,b){a=a|0;b=b|0;Ta[a&7](b|0)}function pd(a,b){a=a|0;b=b|0;return Ua[a&1](b|0)|0}function qd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Va[a&0](b|0,c|0,d|0)}function rd(a){a=a|0;Wa[a&3]()}function sd(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;Xa[a&3](b|0,c|0,d|0,e|0,f|0,g|0)}function td(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Ya[a&3](b|0,c|0,d|0,e|0)}function ud(a,b,c){a=a|0;b=b|0;c=c|0;ka(0);return 0}function vd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ka(1)}function wd(a){a=a|0;ka(2)}function xd(a){a=a|0;ka(3);return 0}function yd(a,b,c){a=a|0;b=b|0;c=c|0;ka(4)}function zd(){ka(5)}function Ad(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;ka(6)}function Bd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ka(7)} // EMSCRIPTEN_END_FUNCS - var Ra=[td,Yb,Nc,Gc,Fc,Hc,td,td];var Sa=[ud,dc,cc,ud];var Ta=[vd,Tb,Wb,Ub,Vb,Xb,kc,Mc];var Ua=[wd,Ec];var Va=[xd];var Wa=[yd,ic,jc,yd];var Xa=[zd,fc,ec,zd];var Ya=[Ad,_b,$b,Ad];return{___cxa_can_catch:gc,_crn_get_levels:zb,_crn_get_uncompressed_size:Bb,_crn_decompress:Cb,_i64Add:Zc,_crn_get_width:xb,___cxa_is_pointer_type:hc,_i64Subtract:Yc,_memset:_c,_malloc:Rc,_memcpy:bd,_bitshift64Lshr:$c,_free:Sc,_bitshift64Shl:ad,_crn_get_height:yb,_crn_get_dxt_format:Ab,runPostSets:Xc,_emscripten_replace_memory:Qa,stackAlloc:Za,stackSave:_a,stackRestore:$a,establishStackSpace:ab,setThrew:bb,setTempRet0:eb,getTempRet0:fb,dynCall_iiii:ld,dynCall_viiiii:md,dynCall_vi:nd,dynCall_ii:od,dynCall_viii:pd,dynCall_v:qd,dynCall_viiiiii:rd,dynCall_viiii:sd}}) + var Ra=[ud,Zb,Oc,Hc,Gc,Ic,ud,ud];var Sa=[vd,ec,dc,vd];var Ta=[wd,Ub,Xb,Vb,Wb,Yb,lc,Nc];var Ua=[xd,Fc];var Va=[yd];var Wa=[zd,jc,kc,zd];var Xa=[Ad,gc,fc,Ad];var Ya=[Bd,$b,ac,Bd];return{___cxa_can_catch:hc,_crn_get_levels:zb,_crn_get_uncompressed_size:Cb,_crn_decompress:Db,_i64Add:_c,_crn_get_width:xb,___cxa_is_pointer_type:ic,_crn_get_bytes_per_block:Bb,_memset:$c,_malloc:Sc,_memcpy:cd,_i64Subtract:Zc,_bitshift64Lshr:ad,_free:Tc,_bitshift64Shl:bd,_crn_get_height:yb,_crn_get_dxt_format:Ab,runPostSets:Yc,_emscripten_replace_memory:Qa,stackAlloc:Za,stackSave:_a,stackRestore:$a,establishStackSpace:ab,setThrew:bb,setTempRet0:eb,getTempRet0:fb,dynCall_iiii:md,dynCall_viiiii:nd,dynCall_vi:od,dynCall_ii:pd,dynCall_viii:qd,dynCall_v:rd,dynCall_viiiiii:sd,dynCall_viiii:td}}) // EMSCRIPTEN_END_ASM - (Module.asmGlobalArg,Module.asmLibraryArg,buffer);var ___cxa_can_catch=Module["___cxa_can_catch"]=asm["___cxa_can_catch"];var _crn_get_levels=Module["_crn_get_levels"]=asm["_crn_get_levels"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var _crn_get_uncompressed_size=Module["_crn_get_uncompressed_size"]=asm["_crn_get_uncompressed_size"];var _crn_decompress=Module["_crn_decompress"]=asm["_crn_decompress"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _crn_get_height=Module["_crn_get_height"]=asm["_crn_get_height"];var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=asm["___cxa_is_pointer_type"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _memset=Module["_memset"]=asm["_memset"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=asm["_emscripten_replace_memory"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _free=Module["_free"]=asm["_free"];var _crn_get_dxt_format=Module["_crn_get_dxt_format"]=asm["_crn_get_dxt_format"];var _crn_get_width=Module["_crn_get_width"]=asm["_crn_get_width"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];Runtime.stackAlloc=asm["stackAlloc"];Runtime.stackSave=asm["stackSave"];Runtime.stackRestore=asm["stackRestore"];Runtime.establishStackSpace=asm["establishStackSpace"];Runtime.setTempRet0=asm["setTempRet0"];Runtime.getTempRet0=asm["getTempRet0"];function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){assert(runDependencies==0,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");assert(__ATPRERUN__.length==0,"cannot call main when preRun functions remain to be called");args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["stdout"]["once"]("drain",(function(){process["exit"](status)}));console.log(" ");setTimeout((function(){process["exit"](status)}),500)}else if(ENVIRONMENT_IS_SHELL&&typeof quit==="function"){quit(status)}throw new ExitStatus(status)}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}Module["noExitRuntime"]=true;run() + (Module.asmGlobalArg,Module.asmLibraryArg,buffer);var ___cxa_can_catch=Module["___cxa_can_catch"]=asm["___cxa_can_catch"];var _crn_get_levels=Module["_crn_get_levels"]=asm["_crn_get_levels"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var _crn_get_uncompressed_size=Module["_crn_get_uncompressed_size"]=asm["_crn_get_uncompressed_size"];var _crn_decompress=Module["_crn_decompress"]=asm["_crn_decompress"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _crn_get_height=Module["_crn_get_height"]=asm["_crn_get_height"];var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=asm["___cxa_is_pointer_type"];var _crn_get_bytes_per_block=Module["_crn_get_bytes_per_block"]=asm["_crn_get_bytes_per_block"];var _memset=Module["_memset"]=asm["_memset"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=asm["_emscripten_replace_memory"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _free=Module["_free"]=asm["_free"];var _crn_get_dxt_format=Module["_crn_get_dxt_format"]=asm["_crn_get_dxt_format"];var _crn_get_width=Module["_crn_get_width"]=asm["_crn_get_width"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];Runtime.stackAlloc=asm["stackAlloc"];Runtime.stackSave=asm["stackSave"];Runtime.stackRestore=asm["stackRestore"];Runtime.establishStackSpace=asm["establishStackSpace"];Runtime.setTempRet0=asm["setTempRet0"];Runtime.getTempRet0=asm["getTempRet0"];function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){assert(runDependencies==0,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");assert(__ATPRERUN__.length==0,"cannot call main when preRun functions remain to be called");args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["stdout"]["once"]("drain",(function(){process["exit"](status)}));console.log(" ");setTimeout((function(){process["exit"](status)}),500)}else if(ENVIRONMENT_IS_SHELL&&typeof quit==="function"){quit(status)}throw new ExitStatus(status)}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}Module["noExitRuntime"]=true;run() return Module; }); \ No newline at end of file diff --git a/Source/Workers/transcodeCRNToDXT.js b/Source/Workers/transcodeCRNToDXT.js index 985e68fe9fbf..c1f57876e457 100644 --- a/Source/Workers/transcodeCRNToDXT.js +++ b/Source/Workers/transcodeCRNToDXT.js @@ -21,6 +21,32 @@ define([ // https://github.com/toji/texture-tester/blob/master/js/webgl-texture-util.js // http://toji.github.io/texture-tester/ + /** + * @license + * + * Copyright (c) 2014, Brandon Jones. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + // Taken from crnlib.h var CRN_FORMAT = { cCRNFmtInvalid: -1, From a86bdf74feb0128d2e4fa0b64b7382d7aecdca00 Mon Sep 17 00:00:00 2001 From: Austin Eng <213reeses@gmail.com> Date: Mon, 9 Jan 2017 15:35:42 -0500 Subject: [PATCH 356/396] switch not defined checks to use Check module --- Source/Core/Matrix3.js | 265 ++++++++++++----------------------------- 1 file changed, 77 insertions(+), 188 deletions(-) diff --git a/Source/Core/Matrix3.js b/Source/Core/Matrix3.js index 2faff37a7283..d01ad2324cbb 100644 --- a/Source/Core/Matrix3.js +++ b/Source/Core/Matrix3.js @@ -1,6 +1,7 @@ /*global define*/ define([ './Cartesian3', + './Check', './defaultValue', './defined', './defineProperties', @@ -9,6 +10,7 @@ define([ './Math' ], function( Cartesian3, + Check, defaultValue, defined, defineProperties, @@ -72,13 +74,8 @@ define([ */ Matrix3.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.typeOf.object(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -106,9 +103,7 @@ define([ */ Matrix3.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -180,9 +175,7 @@ define([ */ Matrix3.fromArray = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -212,9 +205,7 @@ define([ */ Matrix3.fromColumnMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values parameter is required'); - } + Check.typeOf.object(values, 'values'); //>>includeEnd('debug'); return Matrix3.clone(values, result); @@ -230,9 +221,7 @@ define([ */ Matrix3.fromRowMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values is required.'); - } + Check.typeOf.object(values, 'values'); //>>includeEnd('debug'); if (!defined(result)) { @@ -261,9 +250,7 @@ define([ */ Matrix3.fromQuaternion = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); //>>includeEnd('debug'); var x2 = quaternion.x * quaternion.x; @@ -315,10 +302,9 @@ define([ */ Matrix3.fromHeadingPitchRoll = function(headingPitchRoll, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(headingPitchRoll)) { - throw new DeveloperError('headingPitchRoll is required'); - } + Check.typeOf.object(headingPitchRoll, 'headingPitchRoll'); //>>includeEnd('debug'); + var cosTheta = Math.cos(-headingPitchRoll.pitch); var cosPsi = Math.cos(-headingPitchRoll.heading); var cosPhi = Math.cos(headingPitchRoll.roll); @@ -371,9 +357,7 @@ define([ */ Matrix3.fromScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(scale)) { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.object(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -411,9 +395,7 @@ define([ */ Matrix3.fromUniformScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (typeof scale !== 'number') { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.number(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -451,9 +433,7 @@ define([ */ Matrix3.fromCrossProduct = function(vector, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(vector)) { - throw new DeveloperError('vector is required.'); - } + Check.typeOf.object(vector, 'vector'); //>>includeEnd('debug'); if (!defined(result)) { @@ -490,9 +470,7 @@ define([ */ Matrix3.fromRotationX = function(angle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(angle)) { - throw new DeveloperError('angle is required.'); - } + Check.typeOf.number(angle, 'angle'); //>>includeEnd('debug'); var cosAngle = Math.cos(angle); @@ -533,9 +511,7 @@ define([ */ Matrix3.fromRotationY = function(angle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(angle)) { - throw new DeveloperError('angle is required.'); - } + Check.typeOf.number(angle, 'angle'); //>>includeEnd('debug'); var cosAngle = Math.cos(angle); @@ -576,9 +552,7 @@ define([ */ Matrix3.fromRotationZ = function(angle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(angle)) { - throw new DeveloperError('angle is required.'); - } + Check.typeOf.number(angle, 'angle'); //>>includeEnd('debug'); var cosAngle = Math.cos(angle); @@ -614,9 +588,7 @@ define([ */ Matrix3.toArray = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); if (!defined(result)) { @@ -652,12 +624,12 @@ define([ */ Matrix3.getElementIndex = function(column, row) { //>>includeStart('debug', pragmas.debug); - if (typeof row !== 'number' || row < 0 || row > 2) { - throw new DeveloperError('row must be 0, 1, or 2.'); - } - if (typeof column !== 'number' || column < 0 || column > 2) { - throw new DeveloperError('column must be 0, 1, or 2.'); - } + Check.typeOf.number(column, 'column'); + Check.typeOf.number(row, 'row'); + Check.numeric.minimum(row, 0); + Check.numeric.maximum(row, 2); + Check.numeric.minimum(column, 0); + Check.numeric.maximum(column, 2); //>>includeEnd('debug'); return column * 3 + row; @@ -675,16 +647,11 @@ define([ */ Matrix3.getColumn = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - - if (typeof index !== 'number' || index < 0 || index > 2) { - throw new DeveloperError('index must be 0, 1, or 2.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 2); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var startIndex = index * 3; @@ -711,18 +678,12 @@ define([ */ Matrix3.setColumn = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof index !== 'number' || index < 0 || index > 2) { - throw new DeveloperError('index must be 0, 1, or 2.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 2); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix3.clone(matrix, result); @@ -745,15 +706,11 @@ define([ */ Matrix3.getRow = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - if (typeof index !== 'number' || index < 0 || index > 2) { - throw new DeveloperError('index must be 0, 1, or 2.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 2); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = matrix[index]; @@ -779,18 +736,12 @@ define([ */ Matrix3.setRow = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof index !== 'number' || index < 0 || index > 2) { - throw new DeveloperError('index must be 0, 1, or 2.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 2); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix3.clone(matrix, result); @@ -811,12 +762,8 @@ define([ */ Matrix3.getScale = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Cartesian3.magnitude(Cartesian3.fromElements(matrix[0], matrix[1], matrix[2], scratchColumn)); @@ -849,15 +796,9 @@ define([ */ Matrix3.multiply = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = left[0] * right[0] + left[3] * right[1] + left[6] * right[2]; @@ -894,15 +835,9 @@ define([ */ Matrix3.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] + right[0]; @@ -927,15 +862,9 @@ define([ */ Matrix3.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] - right[0]; @@ -960,15 +889,9 @@ define([ */ Matrix3.multiplyByVector = function(matrix, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var vX = cartesian.x; @@ -995,15 +918,9 @@ define([ */ Matrix3.multiplyByScalar = function(matrix, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar must be a number'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0] * scalar; @@ -1036,15 +953,9 @@ define([ */ Matrix3.multiplyByScale = function(matrix, scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(scale)) { - throw new DeveloperError('scale is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(scale, 'scale'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0] * scale.x; @@ -1068,12 +979,8 @@ define([ */ Matrix3.negate = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = -matrix[0]; @@ -1097,12 +1004,8 @@ define([ */ Matrix3.transpose = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = matrix[0]; @@ -1244,9 +1147,7 @@ define([ */ Matrix3.computeEigenDecomposition = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); // This routine was created based upon Matrix Computations, 3rd ed., by Golub and Van Loan, @@ -1292,12 +1193,8 @@ define([ */ Matrix3.abs = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = Math.abs(matrix[0]); @@ -1321,9 +1218,7 @@ define([ */ Matrix3.determinant = function(matrix) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); var m11 = matrix[0]; @@ -1350,12 +1245,8 @@ define([ */ Matrix3.inverse = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var m11 = matrix[0]; @@ -1425,9 +1316,7 @@ define([ */ Matrix3.equalsEpsilon = function(left, right, epsilon) { //>>includeStart('debug', pragmas.debug); - if (typeof epsilon !== 'number') { - throw new DeveloperError('epsilon must be a number'); - } + Check.typeOf.number(epsilon, 'epsilon'); //>>includeEnd('debug'); return (left === right) || From c0c3877ba7bb399ab5d5ae9e13972698e04a3d62 Mon Sep 17 00:00:00 2001 From: Austin Eng <213reeses@gmail.com> Date: Mon, 9 Jan 2017 15:44:39 -0500 Subject: [PATCH 357/396] add myself to CONTRIBUTORS.md --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index a48712cd0bef..e931bf2557cd 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -35,6 +35,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu * [Josh Becker](https://github.com/JoshuaStorm) * [Kangning Li](https://github.com/likangning93) * [Erik Andersson](https://github.com/erikmaarten) + * [Austin Eng](https://github.com/austinEng) * [NICTA](http://www.nicta.com.au/) * [Chris Cooper](https://github.com/chris-cooper) * [Kevin Ring](https://github.com/kring) From c42d19ba5a7c610245e73a37d13b9de00dbd53cd Mon Sep 17 00:00:00 2001 From: Austin Eng <213reeses@gmail.com> Date: Mon, 9 Jan 2017 15:56:39 -0500 Subject: [PATCH 358/396] switch Check.typeOf.object to Check.defined for array types --- Source/Core/Matrix3.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/Core/Matrix3.js b/Source/Core/Matrix3.js index d01ad2324cbb..5fc86c1cff85 100644 --- a/Source/Core/Matrix3.js +++ b/Source/Core/Matrix3.js @@ -75,7 +75,7 @@ define([ Matrix3.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); Check.typeOf.object(value, 'value'); - Check.typeOf.object(array, 'array'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -103,7 +103,7 @@ define([ */ Matrix3.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(array, 'array'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -175,7 +175,7 @@ define([ */ Matrix3.fromArray = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(array, 'array'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -205,7 +205,7 @@ define([ */ Matrix3.fromColumnMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(values, 'values'); + Check.defined(values, 'values'); //>>includeEnd('debug'); return Matrix3.clone(values, result); @@ -221,7 +221,7 @@ define([ */ Matrix3.fromRowMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(values, 'values'); + Check.defined(values, 'values'); //>>includeEnd('debug'); if (!defined(result)) { From 4fcd0d99805db87b985c4d743d6397e2723cb675 Mon Sep 17 00:00:00 2001 From: Austin Eng <213reeses@gmail.com> Date: Mon, 9 Jan 2017 16:11:55 -0500 Subject: [PATCH 359/396] update Cartesian2 to use Check --- Source/Core/Cartesian2.js | 194 ++++++++++---------------------------- 1 file changed, 50 insertions(+), 144 deletions(-) diff --git a/Source/Core/Cartesian2.js b/Source/Core/Cartesian2.js index 92e6d6715b8f..d44ed87c4a0f 100644 --- a/Source/Core/Cartesian2.js +++ b/Source/Core/Cartesian2.js @@ -1,11 +1,13 @@ /*global define*/ define([ + './Check', './defaultValue', './defined', './DeveloperError', './freezeObject', './Math' ], function( + Check, defaultValue, defined, DeveloperError, @@ -118,12 +120,8 @@ define([ */ Cartesian2.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -144,9 +142,7 @@ define([ */ Cartesian2.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -168,9 +164,7 @@ define([ */ Cartesian2.packArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); var length = array.length; @@ -195,9 +189,7 @@ define([ */ Cartesian2.unpackArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); var length = array.length; @@ -242,9 +234,7 @@ define([ */ Cartesian2.maximumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.max(cartesian.x, cartesian.y); @@ -258,9 +248,7 @@ define([ */ Cartesian2.minimumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.min(cartesian.x, cartesian.y); @@ -276,15 +264,9 @@ define([ */ Cartesian2.minimumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(first)) { - throw new DeveloperError('first is required.'); - } - if (!defined(second)) { - throw new DeveloperError('second is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(first, 'first'); + Check.typeOf.object(second, 'second'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); @@ -304,15 +286,9 @@ define([ */ Cartesian2.maximumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(first)) { - throw new DeveloperError('first is required.'); - } - if (!defined(second)) { - throw new DeveloperError('second is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(first, 'first'); + Check.typeOf.object(second, 'second'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.max(first.x, second.x); @@ -328,9 +304,7 @@ define([ */ Cartesian2.magnitudeSquared = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return cartesian.x * cartesian.x + cartesian.y * cartesian.y; @@ -402,12 +376,8 @@ define([ */ Cartesian2.normalize = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var magnitude = Cartesian2.magnitude(cartesian); @@ -433,12 +403,8 @@ define([ */ Cartesian2.dot = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); return left.x * right.x + left.y * right.y; @@ -454,15 +420,9 @@ define([ */ Cartesian2.multiplyComponents = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x * right.x; @@ -480,15 +440,9 @@ define([ */ Cartesian2.divideComponents = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x / right.x; @@ -506,15 +460,9 @@ define([ */ Cartesian2.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x + right.x; @@ -532,15 +480,9 @@ define([ */ Cartesian2.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x - right.x; @@ -558,15 +500,9 @@ define([ */ Cartesian2.multiplyByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x * scalar; @@ -584,15 +520,9 @@ define([ */ Cartesian2.divideByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x / scalar; @@ -609,12 +539,8 @@ define([ */ Cartesian2.negate = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = -cartesian.x; @@ -631,12 +557,8 @@ define([ */ Cartesian2.abs = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.abs(cartesian.x); @@ -656,18 +578,10 @@ define([ */ Cartesian2.lerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(start)) { - throw new DeveloperError('start is required.'); - } - if (!defined(end)) { - throw new DeveloperError('end is required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(start, 'start'); + Check.typeOf.object(end, 'end'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); Cartesian2.multiplyByScalar(end, t, lerpScratch); @@ -686,12 +600,8 @@ define([ */ Cartesian2.angleBetween = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); Cartesian2.normalize(left, angleBetweenScratch); @@ -709,12 +619,8 @@ define([ */ Cartesian2.mostOrthogonalAxis = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var f = Cartesian2.normalize(cartesian, mostOrthogonalAxisScratch); From 0009ca2e2b7dac80400f739bd52a55abd1d856da Mon Sep 17 00:00:00 2001 From: Austin Eng <213reeses@gmail.com> Date: Mon, 9 Jan 2017 16:28:09 -0500 Subject: [PATCH 360/396] update Quaternion to use Check --- Source/Core/Quaternion.js | 235 ++++++++++---------------------------- 1 file changed, 60 insertions(+), 175 deletions(-) diff --git a/Source/Core/Quaternion.js b/Source/Core/Quaternion.js index bef64c819ff8..da163667bbac 100644 --- a/Source/Core/Quaternion.js +++ b/Source/Core/Quaternion.js @@ -1,6 +1,7 @@ /*global define*/ define([ './Cartesian3', + './Check', './defaultValue', './defined', './DeveloperError', @@ -10,6 +11,7 @@ define([ './Matrix3' ], function( Cartesian3, + Check, defaultValue, defined, DeveloperError, @@ -73,12 +75,8 @@ define([ */ Quaternion.fromAxisAngle = function(axis, angle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(axis)) { - throw new DeveloperError('axis is required.'); - } - if (typeof angle !== 'number') { - throw new DeveloperError('angle is required and must be a number.'); - } + Check.typeOf.object(axis, 'axis'); + Check.typeOf.number(angle, 'angle'); //>>includeEnd('debug'); var halfAngle = angle / 2.0; @@ -112,9 +110,7 @@ define([ */ Quaternion.fromRotationMatrix = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); var root; @@ -190,15 +186,9 @@ define([ */ Quaternion.fromHeadingPitchRoll = function(heading, pitch, roll, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(heading)) { - throw new DeveloperError('heading is required.'); - } - if (!defined(pitch)) { - throw new DeveloperError('pitch is required.'); - } - if (!defined(roll)) { - throw new DeveloperError('roll is required.'); - } + Check.typeOf.number(heading, 'heading'); + Check.typeOf.number(pitch, 'pitch'); + Check.typeOf.number(roll, 'roll'); //>>includeEnd('debug'); var rollQuaternion = Quaternion.fromAxisAngle(Cartesian3.UNIT_X, roll, scratchHPRQuaternion); @@ -231,13 +221,8 @@ define([ */ Quaternion.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -260,9 +245,7 @@ define([ */ Quaternion.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -373,12 +356,8 @@ define([ */ Quaternion.conjugate = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = -quaternion.x; @@ -396,9 +375,7 @@ define([ */ Quaternion.magnitudeSquared = function(quaternion) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); //>>includeEnd('debug'); return quaternion.x * quaternion.x + quaternion.y * quaternion.y + quaternion.z * quaternion.z + quaternion.w * quaternion.w; @@ -423,9 +400,7 @@ define([ */ Quaternion.normalize = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var inverseMagnitude = 1.0 / Quaternion.magnitude(quaternion); @@ -450,9 +425,7 @@ define([ */ Quaternion.inverse = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var magnitudeSquared = Quaternion.magnitudeSquared(quaternion); @@ -470,15 +443,9 @@ define([ */ Quaternion.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x + right.x; @@ -498,15 +465,9 @@ define([ */ Quaternion.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x - right.x; @@ -525,12 +486,8 @@ define([ */ Quaternion.negate = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = -quaternion.x; @@ -549,12 +506,8 @@ define([ */ Quaternion.dot = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; @@ -570,15 +523,9 @@ define([ */ Quaternion.multiply = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var leftX = left.x; @@ -613,15 +560,9 @@ define([ */ Quaternion.multiplyByScalar = function(quaternion, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = quaternion.x * scalar; @@ -641,15 +582,9 @@ define([ */ Quaternion.divideByScalar = function(quaternion, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = quaternion.x / scalar; @@ -668,12 +603,8 @@ define([ */ Quaternion.computeAxis = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var w = quaternion.w; @@ -698,9 +629,7 @@ define([ */ Quaternion.computeAngle = function(quaternion) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); //>>includeEnd('debug'); if (Math.abs(quaternion.w - 1.0) < CesiumMath.EPSILON6) { @@ -721,18 +650,10 @@ define([ */ Quaternion.lerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(start)) { - throw new DeveloperError('start is required.'); - } - if (!defined(end)) { - throw new DeveloperError('end is required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(start, 'start'); + Check.typeOf.object(end, 'end'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); lerpScratch = Quaternion.multiplyByScalar(end, t, lerpScratch); @@ -756,18 +677,10 @@ define([ */ Quaternion.slerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(start)) { - throw new DeveloperError('start is required.'); - } - if (!defined(end)) { - throw new DeveloperError('end is required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(start, 'start'); + Check.typeOf.object(end, 'end'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var dot = Quaternion.dot(start, end); @@ -802,12 +715,8 @@ define([ */ Quaternion.log = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var theta = CesiumMath.acosClamped(quaternion.w); @@ -829,12 +738,8 @@ define([ */ Quaternion.exp = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var theta = Cartesian3.magnitude(cartesian); @@ -874,9 +779,7 @@ define([ if (!defined(q0) || !defined(q1) || !defined(q2)) { throw new DeveloperError('q0, q1, and q2 are required.'); } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var qInv = Quaternion.conjugate(q1, squadScratchQuaternion0); @@ -923,12 +826,8 @@ define([ if (!defined(q0) || !defined(q1) || !defined(s0) || !defined(s1)) { throw new DeveloperError('q0, q1, s0, and s1 are required.'); } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var slerp0 = Quaternion.slerp(q0, q1, t, squadScratchQuaternion0); @@ -967,18 +866,10 @@ define([ */ Quaternion.fastSlerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(start)) { - throw new DeveloperError('start is required.'); - } - if (!defined(end)) { - throw new DeveloperError('end is required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(start, 'start'); + Check.typeOf.object(end, 'end'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = Quaternion.dot(start, end); @@ -1032,12 +923,8 @@ define([ if (!defined(q0) || !defined(q1) || !defined(s0) || !defined(s1)) { throw new DeveloperError('q0, q1, s0, and s1 are required.'); } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var slerp0 = Quaternion.fastSlerp(q0, q1, t, squadScratchQuaternion0); @@ -1075,9 +962,7 @@ define([ */ Quaternion.equalsEpsilon = function(left, right, epsilon) { //>>includeStart('debug', pragmas.debug); - if (typeof epsilon !== 'number') { - throw new DeveloperError('epsilon is required and must be a number.'); - } + Check.typeOf.number(epsilon, 'epsilon') //>>includeEnd('debug'); return (left === right) || From e2c3151d44e25965c6803cd301a472dd801bebd5 Mon Sep 17 00:00:00 2001 From: Austin Eng <213reeses@gmail.com> Date: Mon, 9 Jan 2017 16:29:24 -0500 Subject: [PATCH 361/396] check index before cartesian in Matrix3.setColumn --- Source/Core/Matrix3.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/Matrix3.js b/Source/Core/Matrix3.js index 5fc86c1cff85..6f86104aa011 100644 --- a/Source/Core/Matrix3.js +++ b/Source/Core/Matrix3.js @@ -679,10 +679,10 @@ define([ Matrix3.setColumn = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); Check.typeOf.object(matrix, 'matrix'); - Check.typeOf.object(cartesian, 'cartesian'); Check.typeOf.number(index, 'index'); Check.numeric.minimum(index, 0); Check.numeric.maximum(index, 2); + Check.typeOf.object(cartesian, 'cartesian'); Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); From ce03c7ede0a67ee8b0cafcf090b0ec51e53edba0 Mon Sep 17 00:00:00 2001 From: Austin Eng <213reeses@gmail.com> Date: Mon, 9 Jan 2017 16:59:27 -0500 Subject: [PATCH 362/396] fix missing semicolon --- Source/Core/Quaternion.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/Quaternion.js b/Source/Core/Quaternion.js index da163667bbac..e4161beaa382 100644 --- a/Source/Core/Quaternion.js +++ b/Source/Core/Quaternion.js @@ -962,7 +962,7 @@ define([ */ Quaternion.equalsEpsilon = function(left, right, epsilon) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.number(epsilon, 'epsilon') + Check.typeOf.number(epsilon, 'epsilon'); //>>includeEnd('debug'); return (left === right) || From 90a3445a7e3862ae9e02bf50c79d386f4a4d82b5 Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Mon, 9 Jan 2017 16:39:04 -0500 Subject: [PATCH 363/396] Replace DeveloperError with Check in Matrix4.js --- Source/Core/Matrix4.js | 491 ++++++++++++----------------------------- 1 file changed, 138 insertions(+), 353 deletions(-) diff --git a/Source/Core/Matrix4.js b/Source/Core/Matrix4.js index 53ed1241f682..0ea3319be262 100644 --- a/Source/Core/Matrix4.js +++ b/Source/Core/Matrix4.js @@ -2,6 +2,7 @@ define([ './Cartesian3', './Cartesian4', + './Check', './defaultValue', './defined', './defineProperties', @@ -13,6 +14,7 @@ define([ ], function( Cartesian3, Cartesian4, + Check, defaultValue, defined, defineProperties, @@ -104,13 +106,8 @@ define([ */ Matrix4.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -145,9 +142,7 @@ define([ */ Matrix4.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -245,9 +240,7 @@ define([ */ Matrix4.fromColumnMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values is required'); - } + Check.defined(values, 'values'); //>>includeEnd('debug'); return Matrix4.clone(values, result); @@ -263,9 +256,7 @@ define([ */ Matrix4.fromRowMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values is required.'); - } + Check.defined(values, 'values'); //>>includeEnd('debug'); if (!defined(result)) { @@ -304,9 +295,7 @@ define([ */ Matrix4.fromRotationTranslation = function(rotation, translation, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rotation)) { - throw new DeveloperError('rotation is required.'); - } + Check.typeOf.object(rotation, 'rotation'); //>>includeEnd('debug'); translation = defaultValue(translation, Cartesian3.ZERO); @@ -356,15 +345,9 @@ define([ */ Matrix4.fromTranslationQuaternionRotationScale = function(translation, rotation, scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(translation)) { - throw new DeveloperError('translation is required.'); - } - if (!defined(rotation)) { - throw new DeveloperError('rotation is required.'); - } - if (!defined(scale)) { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.object(translation, 'translation'); + Check.typeOf.object(rotation, 'rotation'); + Check.typeOf.object(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -427,9 +410,7 @@ define([ */ Matrix4.fromTranslationRotationScale = function(translationRotationScale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(translationRotationScale)) { - throw new DeveloperError('translationRotationScale is required.'); - } + Check.typeOf.object(translationRotationScale, 'translationRotationScale'); //>>includeEnd('debug'); return Matrix4.fromTranslationQuaternionRotationScale(translationRotationScale.translation, translationRotationScale.rotation, translationRotationScale.scale, result); @@ -446,9 +427,7 @@ define([ */ Matrix4.fromTranslation = function(translation, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(translation)) { - throw new DeveloperError('translation is required.'); - } + Check.typeOf.object(translation, 'translation'); //>>includeEnd('debug'); return Matrix4.fromRotationTranslation(Matrix3.IDENTITY, translation, result); @@ -471,9 +450,7 @@ define([ */ Matrix4.fromScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(scale)) { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.object(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -520,9 +497,7 @@ define([ */ Matrix4.fromUniformScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (typeof scale !== 'number') { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.number(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -564,9 +539,7 @@ define([ */ Matrix4.fromCamera = function(camera, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(camera)) { - throw new DeveloperError('camera is required.'); - } + Check.typeOf.object(camera, 'camera'); //>>includeEnd('debug'); var position = camera.position; @@ -574,15 +547,9 @@ define([ var up = camera.up; //>>includeStart('debug', pragmas.debug); - if (!defined(position)) { - throw new DeveloperError('camera.position is required.'); - } - if (!defined(direction)) { - throw new DeveloperError('camera.direction is required.'); - } - if (!defined(up)) { - throw new DeveloperError('camera.up is required.'); - } + Check.typeOf.object(position, 'camera.position'); + Check.typeOf.object(direction, 'camera.direction'); + Check.typeOf.object(up, 'camera.up'); //>>includeEnd('debug'); Cartesian3.normalize(direction, fromCameraF); @@ -675,9 +642,7 @@ define([ if (far <= 0.0) { throw new DeveloperError('far must be greater than zero.'); } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var bottom = Math.tan(fovY * 0.5); @@ -720,27 +685,13 @@ define([ */ Matrix4.computeOrthographicOffCenter = function(left, right, bottom, top, near, far, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required.'); - } - if (!defined(right)) { - throw new DeveloperError('right is required.'); - } - if (!defined(bottom)) { - throw new DeveloperError('bottom is required.'); - } - if (!defined(top)) { - throw new DeveloperError('top is required.'); - } - if (!defined(near)) { - throw new DeveloperError('near is required.'); - } - if (!defined(far)) { - throw new DeveloperError('far is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.number(left, 'left'); + Check.typeOf.number(right, 'right'); + Check.typeOf.number(bottom, 'bottom'); + Check.typeOf.number(top, 'top'); + Check.typeOf.number(near, 'near'); + Check.typeOf.number(far, 'far'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var a = 1.0 / (right - left); @@ -787,27 +738,13 @@ define([ */ Matrix4.computePerspectiveOffCenter = function(left, right, bottom, top, near, far, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required.'); - } - if (!defined(right)) { - throw new DeveloperError('right is required.'); - } - if (!defined(bottom)) { - throw new DeveloperError('bottom is required.'); - } - if (!defined(top)) { - throw new DeveloperError('top is required.'); - } - if (!defined(near)) { - throw new DeveloperError('near is required.'); - } - if (!defined(far)) { - throw new DeveloperError('far is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.number(left, 'left'); + Check.typeOf.number(right, 'right'); + Check.typeOf.number(bottom, 'bottom'); + Check.typeOf.number(top, 'top'); + Check.typeOf.number(near, 'near'); + Check.typeOf.number(far, 'far'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = 2.0 * near / (right - left); @@ -850,24 +787,12 @@ define([ */ Matrix4.computeInfinitePerspectiveOffCenter = function(left, right, bottom, top, near, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required.'); - } - if (!defined(right)) { - throw new DeveloperError('right is required.'); - } - if (!defined(bottom)) { - throw new DeveloperError('bottom is required.'); - } - if (!defined(top)) { - throw new DeveloperError('top is required.'); - } - if (!defined(near)) { - throw new DeveloperError('near is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.number(left, 'left'); + Check.typeOf.number(right, 'right'); + Check.typeOf.number(bottom, 'bottom'); + Check.typeOf.number(top, 'top'); + Check.typeOf.number(near, 'near'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = 2.0 * near / (right - left); @@ -917,9 +842,7 @@ define([ */ Matrix4.computeViewportTransformation = function(viewport, nearDepthRange, farDepthRange, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); viewport = defaultValue(viewport, defaultValue.EMPTY_OBJECT); @@ -973,21 +896,11 @@ define([ */ Matrix4.computeView = function(position, direction, up, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(position)) { - throw new DeveloperError('position is required'); - } - if (!defined(direction)) { - throw new DeveloperError('direction is required'); - } - if (!defined(up)) { - throw new DeveloperError('up is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(position, 'position'); + Check.typeOf.object(direction, 'direction'); + Check.typeOf.object(up, 'up'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = right.x; @@ -1030,9 +943,7 @@ define([ */ Matrix4.toArray = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); if (!defined(result)) { @@ -1078,12 +989,13 @@ define([ */ Matrix4.getElementIndex = function(column, row) { //>>includeStart('debug', pragmas.debug); - if (typeof row !== 'number' || row < 0 || row > 3) { - throw new DeveloperError('row must be 0, 1, 2, or 3.'); - } - if (typeof column !== 'number' || column < 0 || column > 3) { - throw new DeveloperError('column must be 0, 1, 2, or 3.'); - } + Check.typeOf.number(row, 'row'); + Check.numeric.minimum(row, 0); + Check.numeric.maximum(row, 3); + + Check.typeOf.number(column, 'column'); + Check.numeric.minimum(column, 0); + Check.numeric.maximum(column, 3); //>>includeEnd('debug'); return column * 4 + row; @@ -1118,16 +1030,13 @@ define([ */ Matrix4.getColumn = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } + Check.typeOf.object(matrix, 'matrix'); - if (typeof index !== 'number' || index < 0 || index > 3) { - throw new DeveloperError('index must be 0, 1, 2, or 3.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 3); + + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var startIndex = index * 4; @@ -1171,18 +1080,14 @@ define([ */ Matrix4.setColumn = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof index !== 'number' || index < 0 || index > 3) { - throw new DeveloperError('index must be 0, 1, 2, or 3.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 3); + + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix4.clone(matrix, result); @@ -1205,15 +1110,9 @@ define([ */ Matrix4.setTranslation = function(matrix, translation, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(translation)) { - throw new DeveloperError('translation is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(translation, 'translation'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0]; @@ -1268,16 +1167,13 @@ define([ */ Matrix4.getRow = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } + Check.typeOf.object(matrix, 'matrix'); - if (typeof index !== 'number' || index < 0 || index > 3) { - throw new DeveloperError('index must be 0, 1, 2, or 3.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 3); + + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = matrix[index]; @@ -1320,18 +1216,14 @@ define([ */ Matrix4.setRow = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof index !== 'number' || index < 0 || index > 3) { - throw new DeveloperError('index must be 0, 1, 2, or 3.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 3); + + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix4.clone(matrix, result); @@ -1353,12 +1245,8 @@ define([ */ Matrix4.getScale = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Cartesian3.magnitude(Cartesian3.fromElements(matrix[0], matrix[1], matrix[2], scratchColumn)); @@ -1392,15 +1280,9 @@ define([ */ Matrix4.multiply = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var left0 = left[0]; @@ -1486,15 +1368,9 @@ define([ */ Matrix4.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] + right[0]; @@ -1526,15 +1402,9 @@ define([ */ Matrix4.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] - right[0]; @@ -1577,15 +1447,9 @@ define([ */ Matrix4.multiplyTransformation = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var left0 = left[0]; @@ -1665,15 +1529,9 @@ define([ */ Matrix4.multiplyByMatrix3 = function(matrix, rotation, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(rotation)) { - throw new DeveloperError('rotation is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(rotation, 'rotation'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var left0 = matrix[0]; @@ -1743,15 +1601,9 @@ define([ */ Matrix4.multiplyByTranslation = function(matrix, translation, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(translation)) { - throw new DeveloperError('translation is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(translation, 'translation'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = translation.x; @@ -1805,15 +1657,9 @@ define([ */ Matrix4.multiplyByUniformScale = function(matrix, scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (typeof scale !== 'number') { - throw new DeveloperError('scale is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(scale, 'scale'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); uniformScaleScratch.x = scale; @@ -1844,15 +1690,9 @@ define([ */ Matrix4.multiplyByScale = function(matrix, scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(scale)) { - throw new DeveloperError('scale is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(scale, 'scale'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var scaleX = scale.x; @@ -1893,15 +1733,9 @@ define([ */ Matrix4.multiplyByVector = function(matrix, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var vX = cartesian.x; @@ -1939,15 +1773,9 @@ define([ */ Matrix4.multiplyByPointAsVector = function(matrix, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var vX = cartesian.x; @@ -1979,16 +1807,9 @@ define([ */ Matrix4.multiplyByPoint = function(matrix, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var vX = cartesian.x; @@ -2030,15 +1851,9 @@ define([ */ Matrix4.multiplyByScalar = function(matrix, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar must be a number'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0] * scalar; @@ -2084,12 +1899,8 @@ define([ */ Matrix4.negate = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = -matrix[0]; @@ -2135,12 +1946,8 @@ define([ */ Matrix4.transpose = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var matrix1 = matrix[1]; @@ -2178,12 +1985,8 @@ define([ */ Matrix4.abs = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = Math.abs(matrix[0]); @@ -2299,9 +2102,7 @@ define([ */ Matrix4.equalsEpsilon = function(left, right, epsilon) { //>>includeStart('debug', pragmas.debug); - if (typeof epsilon !== 'number') { - throw new DeveloperError('epsilon must be a number'); - } + Check.typeOf.number(epsilon, 'epsilon'); //>>includeEnd('debug'); return (left === right) || @@ -2334,12 +2135,8 @@ define([ */ Matrix4.getTranslation = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = matrix[12]; @@ -2372,12 +2169,8 @@ define([ */ Matrix4.getRotation = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0]; @@ -2411,12 +2204,8 @@ define([ */ Matrix4.inverse = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); // Special case for a zero scale matrix that can occur, for example, @@ -2556,12 +2345,8 @@ define([ */ Matrix4.inverseTransformation = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); //This function is an optimized version of the below 4 lines. From 6205e93d6c4f07136ad77d4b52a4822c442f3e39 Mon Sep 17 00:00:00 2001 From: Austin Eng <213reeses@gmail.com> Date: Mon, 9 Jan 2017 17:48:22 -0500 Subject: [PATCH 364/396] update Rectangle to use Check --- Source/Core/Rectangle.js | 142 +++++++++++---------------------------- 1 file changed, 39 insertions(+), 103 deletions(-) diff --git a/Source/Core/Rectangle.js b/Source/Core/Rectangle.js index 57fae37e1001..0e16bc4fdcdc 100644 --- a/Source/Core/Rectangle.js +++ b/Source/Core/Rectangle.js @@ -1,6 +1,7 @@ /*global define*/ define([ './Cartographic', + './Check', './defaultValue', './defined', './defineProperties', @@ -10,6 +11,7 @@ define([ './Math' ], function( Cartographic, + Check, defaultValue, defined, defineProperties, @@ -107,13 +109,8 @@ define([ */ Rectangle.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -136,9 +133,7 @@ define([ */ Rectangle.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -161,9 +156,7 @@ define([ */ Rectangle.computeWidth = function(rectangle) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); var east = rectangle.east; var west = rectangle.west; @@ -180,9 +173,7 @@ define([ */ Rectangle.computeHeight = function(rectangle) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); return rectangle.north - rectangle.south; }; @@ -227,9 +218,7 @@ define([ */ Rectangle.fromCartographicArray = function(cartographics, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartographics)) { - throw new DeveloperError('cartographics is required.'); - } + Check.typeOf.object(cartographics, 'cartographics'); //>>includeEnd('debug'); var west = Number.MAX_VALUE; @@ -284,9 +273,7 @@ define([ */ Rectangle.fromCartesianArray = function(cartesians, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesians)) { - throw new DeveloperError('cartesians is required.'); - } + Check.typeOf.object(cartesians, 'cartesians'); //>>includeEnd('debug'); var west = Number.MAX_VALUE; @@ -404,9 +391,7 @@ define([ */ Rectangle.prototype.equalsEpsilon = function(other, epsilon) { //>>includeStart('debug', pragmas.debug); - if (typeof epsilon !== 'number') { - throw new DeveloperError('epsilon is required and must be a number.'); - } + Check.typeOf.number(epsilon, 'epsilon'); //>>includeEnd('debug'); return defined(other) && @@ -428,45 +413,28 @@ define([ */ Rectangle.validate = function(rectangle) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); var north = rectangle.north; - if (typeof north !== 'number') { - throw new DeveloperError('north is required to be a number.'); - } + Check.typeOf.number(north, 'north'); + Check.numeric.minimum(north, -CesiumMath.PI_OVER_TWO); + Check.numeric.maximum(north, CesiumMath.PI_OVER_TWO); - if (north < -CesiumMath.PI_OVER_TWO || north > CesiumMath.PI_OVER_TWO) { - throw new DeveloperError('north must be in the interval [-Pi/2, Pi/2].'); - } var south = rectangle.south; - if (typeof south !== 'number') { - throw new DeveloperError('south is required to be a number.'); - } - - if (south < -CesiumMath.PI_OVER_TWO || south > CesiumMath.PI_OVER_TWO) { - throw new DeveloperError('south must be in the interval [-Pi/2, Pi/2].'); - } + Check.typeOf.number(south, 'south'); + Check.numeric.minimum(south, -CesiumMath.PI_OVER_TWO); + Check.numeric.maximum(south, CesiumMath.PI_OVER_TWO); var west = rectangle.west; - if (typeof west !== 'number') { - throw new DeveloperError('west is required to be a number.'); - } - - if (west < -Math.PI || west > Math.PI) { - throw new DeveloperError('west must be in the interval [-Pi, Pi].'); - } + Check.typeOf.number(west, 'west'); + Check.numeric.minimum(west, -Math.PI); + Check.numeric.maximum(west, Math.PI); var east = rectangle.east; - if (typeof east !== 'number') { - throw new DeveloperError('east is required to be a number.'); - } - - if (east < -Math.PI || east > Math.PI) { - throw new DeveloperError('east must be in the interval [-Pi, Pi].'); - } + Check.typeOf.number(east, 'east'); + Check.numeric.minimum(east, -Math.PI); + Check.numeric.maximum(east, Math.PI); //>>includeEnd('debug'); }; @@ -479,9 +447,7 @@ define([ */ Rectangle.southwest = function(rectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); if (!defined(result)) { @@ -502,9 +468,7 @@ define([ */ Rectangle.northwest = function(rectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); if (!defined(result)) { @@ -525,9 +489,7 @@ define([ */ Rectangle.northeast = function(rectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); if (!defined(result)) { @@ -548,9 +510,7 @@ define([ */ Rectangle.southeast = function(rectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); if (!defined(result)) { @@ -571,9 +531,7 @@ define([ */ Rectangle.center = function(rectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); var east = rectangle.east; @@ -610,12 +568,8 @@ define([ */ Rectangle.intersection = function(rectangle, otherRectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } - if (!defined(otherRectangle)) { - throw new DeveloperError('otherRectangle is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); + Check.typeOf.object(otherRectangle, 'otherRectangle'); //>>includeEnd('debug'); var rectangleEast = rectangle.east; @@ -673,12 +627,8 @@ define([ */ Rectangle.simpleIntersection = function(rectangle, otherRectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } - if (!defined(otherRectangle)) { - throw new DeveloperError('otherRectangle is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); + Check.typeOf.object(otherRectangle, 'otherRectangle'); //>>includeEnd('debug'); var west = Math.max(rectangle.west, otherRectangle.west); @@ -711,12 +661,8 @@ define([ */ Rectangle.union = function(rectangle, otherRectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } - if (!defined(otherRectangle)) { - throw new DeveloperError('otherRectangle is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); + Check.typeOf.object(otherRectangle, 'otherRectangle'); //>>includeEnd('debug'); if (!defined(result)) { @@ -762,12 +708,8 @@ define([ */ Rectangle.expand = function(rectangle, cartographic, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required.'); - } - if (!defined(cartographic)) { - throw new DeveloperError('cartographic is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); + Check.typeOf.object(cartographic, 'cartographic'); //>>includeEnd('debug'); if (!defined(result)) { @@ -791,12 +733,8 @@ define([ */ Rectangle.contains = function(rectangle, cartographic) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } - if (!defined(cartographic)) { - throw new DeveloperError('cartographic is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); + Check.typeOf.object(cartographic, 'cartographic'); //>>includeEnd('debug'); var longitude = cartographic.longitude; @@ -831,9 +769,7 @@ define([ */ Rectangle.subsample = function(rectangle, ellipsoid, surfaceHeight, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); ellipsoid = defaultValue(ellipsoid, Ellipsoid.WGS84); From 19bf2eb7c1c9198c5692c7da5e806d4ed9e91d5b Mon Sep 17 00:00:00 2001 From: Austin Eng <213reeses@gmail.com> Date: Mon, 9 Jan 2017 17:51:58 -0500 Subject: [PATCH 365/396] separate or'd defined checks to use Check --- Source/Core/Quaternion.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Source/Core/Quaternion.js b/Source/Core/Quaternion.js index e4161beaa382..b2fa29ca2bd4 100644 --- a/Source/Core/Quaternion.js +++ b/Source/Core/Quaternion.js @@ -776,9 +776,9 @@ define([ */ Quaternion.computeInnerQuadrangle = function(q0, q1, q2, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(q0) || !defined(q1) || !defined(q2)) { - throw new DeveloperError('q0, q1, and q2 are required.'); - } + Check.typeOf.object(q0, 'q0'); + Check.typeOf.object(q1, 'q1'); + Check.typeOf.object(q2, 'q2'); Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); @@ -823,9 +823,10 @@ define([ */ Quaternion.squad = function(q0, q1, s0, s1, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(q0) || !defined(q1) || !defined(s0) || !defined(s1)) { - throw new DeveloperError('q0, q1, s0, and s1 are required.'); - } + Check.typeOf.object(q0, 'q0'); + Check.typeOf.object(q1, 'q1'); + Check.typeOf.object(s0, 's0'); + Check.typeOf.object(s1, 's1'); Check.typeOf.number(t, 't'); Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); @@ -920,9 +921,10 @@ define([ */ Quaternion.fastSquad = function(q0, q1, s0, s1, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(q0) || !defined(q1) || !defined(s0) || !defined(s1)) { - throw new DeveloperError('q0, q1, s0, and s1 are required.'); - } + Check.typeOf.object(q0, 'q0'); + Check.typeOf.object(q1, 'q1'); + Check.typeOf.object(s0, 's0'); + Check.typeOf.object(s1, 's1'); Check.typeOf.number(t, 't'); Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); From 0a286068f897647881b9b7bbddaf1352b638a967 Mon Sep 17 00:00:00 2001 From: Austin Eng <213reeses@gmail.com> Date: Tue, 10 Jan 2017 10:03:06 -0500 Subject: [PATCH 366/396] fix Rectangle use of Check with array types --- Source/Core/Rectangle.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Source/Core/Rectangle.js b/Source/Core/Rectangle.js index 0e16bc4fdcdc..0478a43bfc16 100644 --- a/Source/Core/Rectangle.js +++ b/Source/Core/Rectangle.js @@ -218,7 +218,7 @@ define([ */ Rectangle.fromCartographicArray = function(cartographics, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(cartographics, 'cartographics'); + Check.defined(cartographics, 'cartographics'); //>>includeEnd('debug'); var west = Number.MAX_VALUE; @@ -273,7 +273,7 @@ define([ */ Rectangle.fromCartesianArray = function(cartesians, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - Check.typeOf.object(cartesians, 'cartesians'); + Check.defined(cartesians, 'cartesians'); //>>includeEnd('debug'); var west = Number.MAX_VALUE; @@ -420,7 +420,6 @@ define([ Check.numeric.minimum(north, -CesiumMath.PI_OVER_TWO); Check.numeric.maximum(north, CesiumMath.PI_OVER_TWO); - var south = rectangle.south; Check.typeOf.number(south, 'south'); Check.numeric.minimum(south, -CesiumMath.PI_OVER_TWO); From 5c3e9032a80ea9bec427106518ba6bbf41d7caa3 Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Tue, 10 Jan 2017 10:05:34 -0500 Subject: [PATCH 367/396] Replace DeveloperError with Check in Cartesian4 --- Source/Core/Cartesian4.js | 200 ++++++++++---------------------------- 1 file changed, 53 insertions(+), 147 deletions(-) diff --git a/Source/Core/Cartesian4.js b/Source/Core/Cartesian4.js index 33627bf01915..a9c8cf13ed32 100644 --- a/Source/Core/Cartesian4.js +++ b/Source/Core/Cartesian4.js @@ -1,11 +1,13 @@ /*global define*/ define([ + './Check', './defaultValue', './defined', './DeveloperError', './freezeObject', './Math' ], function( + Check, defaultValue, defined, DeveloperError, @@ -89,9 +91,7 @@ define([ */ Cartesian4.fromColor = function(color, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(color)) { - throw new DeveloperError('color is required'); - } + Check.typeOf.object(color, 'color'); //>>includeEnd('debug'); if (!defined(result)) { return new Cartesian4(color.red, color.green, color.blue, color.alpha); @@ -145,12 +145,8 @@ define([ */ Cartesian4.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -173,9 +169,7 @@ define([ */ Cartesian4.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -199,9 +193,7 @@ define([ */ Cartesian4.packArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); var length = array.length; @@ -226,9 +218,7 @@ define([ */ Cartesian4.unpackArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); var length = array.length; @@ -273,9 +263,7 @@ define([ */ Cartesian4.maximumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.max(cartesian.x, cartesian.y, cartesian.z, cartesian.w); @@ -289,9 +277,7 @@ define([ */ Cartesian4.minimumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.min(cartesian.x, cartesian.y, cartesian.z, cartesian.w); @@ -307,15 +293,9 @@ define([ */ Cartesian4.minimumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(first)) { - throw new DeveloperError('first is required.'); - } - if (!defined(second)) { - throw new DeveloperError('second is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(first, 'first'); + Check.typeOf.object(second, 'second'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.min(first.x, second.x); @@ -336,15 +316,9 @@ define([ */ Cartesian4.maximumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(first)) { - throw new DeveloperError('first is required.'); - } - if (!defined(second)) { - throw new DeveloperError('second is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(first, 'first'); + Check.typeOf.object(second, 'second'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.max(first.x, second.x); @@ -363,9 +337,7 @@ define([ */ Cartesian4.magnitudeSquared = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return cartesian.x * cartesian.x + cartesian.y * cartesian.y + cartesian.z * cartesian.z + cartesian.w * cartesian.w; @@ -398,9 +370,8 @@ define([ */ Cartesian4.distance = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left) || !defined(right)) { - throw new DeveloperError('left and right are required.'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); Cartesian4.subtract(left, right, distanceScratch); @@ -423,9 +394,8 @@ define([ */ Cartesian4.distanceSquared = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left) || !defined(right)) { - throw new DeveloperError('left and right are required.'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); Cartesian4.subtract(left, right, distanceScratch); @@ -441,12 +411,8 @@ define([ */ Cartesian4.normalize = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var magnitude = Cartesian4.magnitude(cartesian); @@ -474,12 +440,8 @@ define([ */ Cartesian4.dot = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; @@ -495,15 +457,9 @@ define([ */ Cartesian4.multiplyComponents = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x * right.x; @@ -523,15 +479,9 @@ define([ */ Cartesian4.divideComponents = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x / right.x; @@ -551,15 +501,9 @@ define([ */ Cartesian4.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x + right.x; @@ -579,15 +523,9 @@ define([ */ Cartesian4.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x - right.x; @@ -607,15 +545,9 @@ define([ */ Cartesian4.multiplyByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x * scalar; @@ -635,15 +567,9 @@ define([ */ Cartesian4.divideByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x / scalar; @@ -662,12 +588,8 @@ define([ */ Cartesian4.negate = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = -cartesian.x; @@ -686,12 +608,8 @@ define([ */ Cartesian4.abs = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.abs(cartesian.x); @@ -713,18 +631,10 @@ define([ */ Cartesian4.lerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(start)) { - throw new DeveloperError('start is required.'); - } - if (!defined(end)) { - throw new DeveloperError('end is required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(start, 'start'); + Check.typeOf.object(end, 'end'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); Cartesian4.multiplyByScalar(end, t, lerpScratch); @@ -742,12 +652,8 @@ define([ */ Cartesian4.mostOrthogonalAxis = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var f = Cartesian4.normalize(cartesian, mostOrthogonalAxisScratch); From f8a2b6d257da64227c7474caf43887bccbd2f122 Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Tue, 10 Jan 2017 10:24:10 -0500 Subject: [PATCH 368/396] Replace DeveloperError with Check in SphereGeometry --- Source/Core/SphereGeometry.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Core/SphereGeometry.js b/Source/Core/SphereGeometry.js index 4e8ac00ca349..a05f58a854a4 100644 --- a/Source/Core/SphereGeometry.js +++ b/Source/Core/SphereGeometry.js @@ -1,6 +1,7 @@ /*global define*/ define([ './Cartesian3', + './Check', './defaultValue', './defined', './DeveloperError', @@ -8,6 +9,7 @@ define([ './VertexFormat' ], function( Cartesian3, + Check, defaultValue, defined, DeveloperError, @@ -70,9 +72,7 @@ define([ */ SphereGeometry.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } + Check.typeOf.object(value, 'value'); //>>includeEnd('debug'); return EllipsoidGeometry.pack(value._ellipsoidGeometry, array, startingIndex); From 429c5ce75afc88c4e9ed97b11abf08baecbacefc Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Tue, 10 Jan 2017 10:24:20 -0500 Subject: [PATCH 369/396] Replace DeveloperError with Check in SphereOutlineGeometry --- Source/Core/SphereOutlineGeometry.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Core/SphereOutlineGeometry.js b/Source/Core/SphereOutlineGeometry.js index 1d1a627d19fa..e74f9961e727 100644 --- a/Source/Core/SphereOutlineGeometry.js +++ b/Source/Core/SphereOutlineGeometry.js @@ -1,12 +1,14 @@ /*global define*/ define([ './Cartesian3', + './Check', './defaultValue', './defined', './DeveloperError', './EllipsoidOutlineGeometry' ], function( Cartesian3, + Check, defaultValue, defined, DeveloperError, @@ -68,9 +70,7 @@ define([ */ SphereOutlineGeometry.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } + Check.typeOf.object(value, 'value'); //>>includeEnd('debug'); return EllipsoidOutlineGeometry.pack(value._ellipsoidGeometry, array, startingIndex); From 0a6deb472be3052014d5dd925e3b5f4c0689ccb4 Mon Sep 17 00:00:00 2001 From: Austin Eng <213reeses@gmail.com> Date: Tue, 10 Jan 2017 10:26:55 -0500 Subject: [PATCH 370/396] update IntersectionTests to use explicit Interval type --- Source/Core/IntersectionTests.js | 34 +++++++++++--------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/Source/Core/IntersectionTests.js b/Source/Core/IntersectionTests.js index e468763c9ff0..3bde8428fed3 100644 --- a/Source/Core/IntersectionTests.js +++ b/Source/Core/IntersectionTests.js @@ -5,6 +5,7 @@ define([ './defaultValue', './defined', './DeveloperError', + './Interval', './Math', './Matrix3', './QuadraticRealPolynomial', @@ -16,6 +17,7 @@ define([ defaultValue, defined, DeveloperError, + Interval, CesiumMath, Matrix3, QuadraticRealPolynomial, @@ -293,7 +295,7 @@ define([ function raySphere(ray, sphere, result) { if (!defined(result)) { - result = {}; + result = new Interval(); } var origin = ray.origin; @@ -324,8 +326,8 @@ define([ * * @param {Ray} ray The ray. * @param {BoundingSphere} sphere The sphere. - * @param {Object} [result] The result onto which to store the result. - * @returns {Object} An object with the first (start) and the second (stop) intersection scalars for points along the ray or undefined if there are no intersections. + * @param {Interval} [result] The result onto which to store the result. + * @returns {Interval} The interval containing scalar points along the ray or undefined if there are no intersections. */ IntersectionTests.raySphere = function(ray, sphere, result) { //>>includeStart('debug', pragmas.debug); @@ -355,8 +357,8 @@ define([ * @param {Cartesian3} p0 An end point of the line segment. * @param {Cartesian3} p1 The other end point of the line segment. * @param {BoundingSphere} sphere The sphere. - * @param {Object} [result] The result onto which to store the result. - * @returns {Object} An object with the first (start) and the second (stop) intersection scalars for points along the line segment or undefined if there are no intersections. + * @param {Interval} [result] The result onto which to store the result. + * @returns {Interval} The interval containing scalar points along the ray or undefined if there are no intersections. */ IntersectionTests.lineSegmentSphere = function(p0, p1, sphere, result) { //>>includeStart('debug', pragmas.debug); @@ -396,7 +398,7 @@ define([ * * @param {Ray} ray The ray. * @param {Ellipsoid} ellipsoid The ellipsoid. - * @returns {Object} An object with the first (start) and the second (stop) intersection scalars for points along the ray or undefined if there are no intersections. + * @returns {Interval} The interval containing scalar points along the ray or undefined if there are no intersections. */ IntersectionTests.rayEllipsoid = function(ray, ellipsoid) { //>>includeStart('debug', pragmas.debug); @@ -440,10 +442,7 @@ define([ var root0 = temp / w2; var root1 = difference / temp; if (root0 < root1) { - return { - start : root0, - stop : root1 - }; + return new Interval(root0, root1); } return { @@ -453,10 +452,7 @@ define([ } else { // qw2 == product. Repeated roots (2 intersections). var root = Math.sqrt(difference / w2); - return { - start : root, - stop : root - }; + return new Interval(root, root); } } else if (q2 < 1.0) { // Inside ellipsoid (2 intersections). @@ -466,19 +462,13 @@ define([ discriminant = qw * qw - product; temp = -qw + Math.sqrt(discriminant); // Positively valued. - return { - start : 0.0, - stop : temp / w2 - }; + return new Interval(0.0, temp / w2); } else { // q2 == 1.0. On ellipsoid. if (qw < 0.0) { // Looking inward. w2 = Cartesian3.magnitudeSquared(w); - return { - start : 0.0, - stop : -qw / w2 - }; + return new Interval(0.0, -qw / w2); } // qw >= 0.0. Looking outward or tangent. From 4b4f887fc3b64999e9615e6cc9eacf931e64088a Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Tue, 10 Jan 2017 10:29:02 -0500 Subject: [PATCH 371/396] Replace DeveloperError with Check in Spherical --- Source/Core/Spherical.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Source/Core/Spherical.js b/Source/Core/Spherical.js index 0222c247a6cb..31243a057159 100644 --- a/Source/Core/Spherical.js +++ b/Source/Core/Spherical.js @@ -1,9 +1,11 @@ /*global define*/ define([ + './Check', './defaultValue', './defined', './DeveloperError' ], function( + Check, defaultValue, defined, DeveloperError) { @@ -34,9 +36,7 @@ define([ */ Spherical.fromCartesian3 = function(cartesian3, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian3)) { - throw new DeveloperError('cartesian3 is required'); - } + Check.typeOf.object(cartesian3, 'cartesian3'); //>>includeEnd('debug'); var x = cartesian3.x; @@ -85,9 +85,7 @@ define([ */ Spherical.normalize = function(spherical, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(spherical)) { - throw new DeveloperError('spherical is required'); - } + Check.typeOf.object(spherical, 'spherical'); //>>includeEnd('debug'); if (!defined(result)) { From f348b6eb7fd0b5106221234e4370ebf6ea8a7b4d Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Mon, 9 Jan 2017 15:35:29 -0500 Subject: [PATCH 372/396] Replace DeveloperError with Check in Matrix2.js --- Source/Core/Matrix2.js | 213 ++++++++++++----------------------------- 1 file changed, 62 insertions(+), 151 deletions(-) diff --git a/Source/Core/Matrix2.js b/Source/Core/Matrix2.js index ead1b25b2aa8..45ae1bc6f0ad 100644 --- a/Source/Core/Matrix2.js +++ b/Source/Core/Matrix2.js @@ -1,6 +1,7 @@ /*global define*/ define([ './Cartesian2', + './Check', './defaultValue', './defined', './defineProperties', @@ -8,6 +9,7 @@ define([ './freezeObject' ], function( Cartesian2, + Check, defaultValue, defined, defineProperties, @@ -57,13 +59,8 @@ define([ */ Matrix2.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -86,9 +83,7 @@ define([ */ Matrix2.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -148,9 +143,7 @@ define([ */ Matrix2.fromArray = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -175,9 +168,7 @@ define([ */ Matrix2.fromColumnMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values parameter is required'); - } + Check.defined(values, 'values'); //>>includeEnd('debug'); return Matrix2.clone(values, result); @@ -193,9 +184,7 @@ define([ */ Matrix2.fromRowMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values is required.'); - } + Check.defined(values, 'values'); //>>includeEnd('debug'); if (!defined(result)) { @@ -224,9 +213,7 @@ define([ */ Matrix2.fromScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(scale)) { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.object(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -257,9 +244,7 @@ define([ */ Matrix2.fromUniformScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (typeof scale !== 'number') { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.number(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -290,9 +275,7 @@ define([ */ Matrix2.fromRotation = function(angle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(angle)) { - throw new DeveloperError('angle is required.'); - } + Check.typeOf.number(angle, 'angle'); //>>includeEnd('debug'); var cosAngle = Math.cos(angle); @@ -320,9 +303,7 @@ define([ */ Matrix2.toArray = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); if (!defined(result)) { @@ -353,12 +334,14 @@ define([ */ Matrix2.getElementIndex = function(column, row) { //>>includeStart('debug', pragmas.debug); - if (typeof row !== 'number' || row < 0 || row > 1) { - throw new DeveloperError('row must be 0 or 1.'); - } - if (typeof column !== 'number' || column < 0 || column > 1) { - throw new DeveloperError('column must be 0 or 1.'); - } + Check.typeOf.number(row, 'row'); + Check.numeric.minimum(row, 0); + Check.numeric.maximum(row, 1); + + Check.typeOf.number(column, 'column'); + Check.numeric.minimum(column, 0); + Check.numeric.maximum(column, 1); + //>>includeEnd('debug'); return column * 2 + row; @@ -376,15 +359,13 @@ define([ */ Matrix2.getColumn = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - if (typeof index !== 'number' || index < 0 || index > 1) { - throw new DeveloperError('index must be 0 or 1.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 1); + + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var startIndex = index * 2; @@ -409,18 +390,12 @@ define([ */ Matrix2.setColumn = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); if (typeof index !== 'number' || index < 0 || index > 1) { throw new DeveloperError('index must be 0 or 1.'); } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix2.clone(matrix, result); @@ -442,15 +417,11 @@ define([ */ Matrix2.getRow = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } + Check.typeOf.object(matrix, 'matrix'); if (typeof index !== 'number' || index < 0 || index > 1) { throw new DeveloperError('index must be 0 or 1.'); } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = matrix[index]; @@ -474,18 +445,12 @@ define([ */ Matrix2.setRow = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); if (typeof index !== 'number' || index < 0 || index > 1) { throw new DeveloperError('index must be 0 or 1.'); } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix2.clone(matrix, result); @@ -505,12 +470,8 @@ define([ */ Matrix2.getScale = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Cartesian2.magnitude(Cartesian2.fromElements(matrix[0], matrix[1], scratchColumn)); @@ -542,15 +503,9 @@ define([ */ Matrix2.multiply = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = left[0] * right[0] + left[2] * right[1]; @@ -575,15 +530,9 @@ define([ */ Matrix2.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] + right[0]; @@ -603,15 +552,9 @@ define([ */ Matrix2.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] - right[0]; @@ -631,15 +574,9 @@ define([ */ Matrix2.multiplyByVector = function(matrix, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = matrix[0] * cartesian.x + matrix[2] * cartesian.y; @@ -660,15 +597,9 @@ define([ */ Matrix2.multiplyByScalar = function(matrix, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0] * scalar; @@ -696,15 +627,9 @@ define([ */ Matrix2.multiplyByScale = function(matrix, scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(scale)) { - throw new DeveloperError('scale is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(scale, 'scale'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0] * scale.x; @@ -723,12 +648,8 @@ define([ */ Matrix2.negate = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = -matrix[0]; @@ -747,12 +668,8 @@ define([ */ Matrix2.transpose = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = matrix[0]; @@ -776,12 +693,8 @@ define([ */ Matrix2.abs = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = Math.abs(matrix[0]); @@ -832,9 +745,7 @@ define([ */ Matrix2.equalsEpsilon = function(left, right, epsilon) { //>>includeStart('debug', pragmas.debug); - if (typeof epsilon !== 'number') { - throw new DeveloperError('epsilon must be a number'); - } + Check.typeOf.number(epsilon, 'epsilon'); //>>includeEnd('debug'); return (left === right) || From 0703c1cc40b8ce96720bbbd57c46d649964edcc7 Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Mon, 9 Jan 2017 15:44:29 -0500 Subject: [PATCH 373/396] Add shehzan10 to CONTRIBUTORS.md --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 3f937c955db8..7dab44b7218e 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -36,6 +36,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu * [Kangning Li](https://github.com/likangning93) * [Erik Andersson](https://github.com/erikmaarten) * [Austin Eng](https://github.com/austinEng) + * [Shehzan Mohammed](https://github.com/shehzan10) * [NICTA](http://www.nicta.com.au/) * [Chris Cooper](https://github.com/chris-cooper) * [Kevin Ring](https://github.com/kring) From 6eb7808f8b62487e53e679d565caa685395c23fb Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Mon, 9 Jan 2017 16:35:41 -0500 Subject: [PATCH 374/396] Fix missing index checks --- Source/Core/Matrix2.js | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/Source/Core/Matrix2.js b/Source/Core/Matrix2.js index 45ae1bc6f0ad..47a907541533 100644 --- a/Source/Core/Matrix2.js +++ b/Source/Core/Matrix2.js @@ -341,7 +341,6 @@ define([ Check.typeOf.number(column, 'column'); Check.numeric.minimum(column, 0); Check.numeric.maximum(column, 1); - //>>includeEnd('debug'); return column * 2 + row; @@ -392,9 +391,11 @@ define([ //>>includeStart('debug', pragmas.debug); Check.typeOf.object(matrix, 'matrix'); Check.typeOf.object(cartesian, 'cartesian'); - if (typeof index !== 'number' || index < 0 || index > 1) { - throw new DeveloperError('index must be 0 or 1.'); - } + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 1); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); @@ -418,9 +419,11 @@ define([ Matrix2.getRow = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); Check.typeOf.object(matrix, 'matrix'); - if (typeof index !== 'number' || index < 0 || index > 1) { - throw new DeveloperError('index must be 0 or 1.'); - } + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 1); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); @@ -447,9 +450,11 @@ define([ //>>includeStart('debug', pragmas.debug); Check.typeOf.object(matrix, 'matrix'); Check.typeOf.object(cartesian, 'cartesian'); - if (typeof index !== 'number' || index < 0 || index > 1) { - throw new DeveloperError('index must be 0 or 1.'); - } + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 1); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); From b92def60fd493f043428d81beb4971aef58b0113 Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Mon, 9 Jan 2017 22:09:34 -0500 Subject: [PATCH 375/396] Maintain order of arguments for error checks --- Source/Core/Matrix2.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Core/Matrix2.js b/Source/Core/Matrix2.js index 47a907541533..6fc6f8512d8b 100644 --- a/Source/Core/Matrix2.js +++ b/Source/Core/Matrix2.js @@ -390,12 +390,12 @@ define([ Matrix2.setColumn = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); Check.typeOf.object(matrix, 'matrix'); - Check.typeOf.object(cartesian, 'cartesian'); Check.typeOf.number(index, 'index'); Check.numeric.minimum(index, 0); Check.numeric.maximum(index, 1); + Check.typeOf.object(cartesian, 'cartesian'); Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); @@ -449,12 +449,12 @@ define([ Matrix2.setRow = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); Check.typeOf.object(matrix, 'matrix'); - Check.typeOf.object(cartesian, 'cartesian'); Check.typeOf.number(index, 'index'); Check.numeric.minimum(index, 0); Check.numeric.maximum(index, 1); + Check.typeOf.object(cartesian, 'cartesian'); Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); From 20881125db8071dbfb93de01557a48a3b3409e87 Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Tue, 10 Jan 2017 14:34:20 -0500 Subject: [PATCH 376/396] Remove separate heading, pitch, roll support from transform --- Source/Core/Transforms.js | 39 +++++++++++---------------------------- 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/Source/Core/Transforms.js b/Source/Core/Transforms.js index b02cd3eb6af2..740f194aa387 100644 --- a/Source/Core/Transforms.js +++ b/Source/Core/Transforms.js @@ -5,6 +5,7 @@ define([ './Cartesian3', './Cartesian4', './Cartographic', + './Check', './defaultValue', './defined', './deprecationWarning', @@ -27,6 +28,7 @@ define([ Cartesian3, Cartesian4, Cartographic, + Check, defaultValue, defined, deprecationWarning, @@ -473,19 +475,12 @@ define([ * var hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll); * var transform = Cesium.Transforms.headingPitchRollToFixedFrame(center, hpr); */ - Transforms.headingPitchRollToFixedFrame = function(origin, headingPitchRoll, pitch, roll, ellipsoid, result) { - var heading; - if (typeof headingPitchRoll === 'object') { - // Shift arguments using assignments to encourage JIT optimization. - ellipsoid = pitch; - result = roll; - heading = headingPitchRoll.heading; - pitch = headingPitchRoll.pitch; - roll = headingPitchRoll.roll; - } else { - deprecationWarning('headingPitchRollToFixedFrame', 'headingPitchRollToFixedFrame with separate heading, pitch, and roll arguments was deprecated in 1.27. It will be removed in 1.30. Use a HeadingPitchRoll object.'); - heading = headingPitchRoll; - } + Transforms.headingPitchRollToFixedFrame = function(origin, headingPitchRoll, ellipsoid, result) { + Check.typeOf.object(headingPitchRoll, 'headingPitchRoll'); + var heading = headingPitchRoll.heading; + var pitch = headingPitchRoll.pitch; + var roll = headingPitchRoll.roll; + // checks for required parameters happen in the called functions var hprQuaternion = Quaternion.fromHeadingPitchRoll(heading, pitch, roll, scratchHPRQuaternion); var hprMatrix = Matrix4.fromTranslationQuaternionRotationScale(Cartesian3.ZERO, hprQuaternion, scratchScale, scratchHPRMatrix4); @@ -518,22 +513,10 @@ define([ * var hpr = new HeadingPitchRoll(heading, pitch, roll); * var quaternion = Cesium.Transforms.headingPitchRollQuaternion(center, hpr); */ - Transforms.headingPitchRollQuaternion = function(origin, headingPitchRoll, pitch, roll, ellipsoid, result) { - var hpr; - if (typeof headingPitchRoll === 'object') { - // Shift arguments using assignment to encourage JIT optimization. - hpr = headingPitchRoll; - ellipsoid = pitch; - result = roll; - } else { - deprecationWarning('headingPitchRollQuaternion', 'headingPitchRollQuaternion with separate heading, pitch, and roll arguments was deprecated in 1.27. It will be removed in 1.30. Use a HeadingPitchRoll object.'); - scratchHPR.heading = headingPitchRoll; - scratchHPR.pitch = pitch; - scratchHPR.roll = roll; - hpr = scratchHPR; - } + Transforms.headingPitchRollQuaternion = function(origin, headingPitchRoll, ellipsoid, result) { // checks for required parameters happen in the called functions - var transform = Transforms.headingPitchRollToFixedFrame(origin, hpr, ellipsoid, scratchENUMatrix4); + Check.typeOf.object(headingPitchRoll, 'headingPitchRoll'); + var transform = Transforms.headingPitchRollToFixedFrame(origin, headingPitchRoll, ellipsoid, scratchENUMatrix4); var rotation = Matrix4.getRotation(transform, scratchHPRMatrix3); return Quaternion.fromRotationMatrix(rotation, result); }; From 12dfb1460fc4c4b60a1c31b62075731c94ac43c2 Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Tue, 10 Jan 2017 14:34:54 -0500 Subject: [PATCH 377/396] Update transform test after removing searate heading, pitch, roll support --- Specs/Core/TransformsSpec.js | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/Specs/Core/TransformsSpec.js b/Specs/Core/TransformsSpec.js index de42f2f68270..abf8c0b9af1e 100644 --- a/Specs/Core/TransformsSpec.js +++ b/Specs/Core/TransformsSpec.js @@ -357,7 +357,7 @@ defineSuite([ var transform = Transforms.headingPitchRollToFixedFrame(origin, hpr, Ellipsoid.UNIT_SPHERE); var expected = Matrix4.getRotation(transform, new Matrix3()); - var quaternion = Transforms.headingPitchRollQuaternion(origin, heading, pitch, roll, Ellipsoid.UNIT_SPHERE); + var quaternion = Transforms.headingPitchRollQuaternion(origin, hpr, Ellipsoid.UNIT_SPHERE); var actual = Matrix3.fromQuaternion(quaternion); expect(actual).toEqualEpsilon(expected, CesiumMath.EPSILON11); }); @@ -388,7 +388,7 @@ defineSuite([ var expected = Matrix4.getRotation(transform, new Matrix3()); var result = new Quaternion(); - var quaternion = Transforms.headingPitchRollQuaternion(origin, heading, pitch, roll, Ellipsoid.UNIT_SPHERE, result); + var quaternion = Transforms.headingPitchRollQuaternion(origin, hpr, Ellipsoid.UNIT_SPHERE, result); var actual = Matrix3.fromQuaternion(quaternion); expect(quaternion).toBe(result); expect(actual).toEqualEpsilon(expected, CesiumMath.EPSILON11); @@ -923,21 +923,9 @@ defineSuite([ }).toThrowDeveloperError(); }); - it('headingPitchRollToFixedFrame throws without an heading', function() { - expect(function() { - Transforms.headingPitchRollToFixedFrame(Cartesian3.ZERO, undefined, 0.0, 0.0); - }).toThrowDeveloperError(); - }); - - it('headingPitchRollToFixedFrame throws without an pitch', function() { - expect(function() { - Transforms.headingPitchRollToFixedFrame(Cartesian3.ZERO, 0.0, undefined, 0.0); - }).toThrowDeveloperError(); - }); - - it('headingPitchRollToFixedFrame throws without an roll', function() { + it('headingPitchRollToFixedFrame throws without an headingPitchRoll', function() { expect(function() { - Transforms.headingPitchRollToFixedFrame(Cartesian3.ZERO, 0.0, 0.0, undefined); + Transforms.headingPitchRollToFixedFrame(Cartesian3.ZERO, undefined); }).toThrowDeveloperError(); }); From 2b15a9a49cc4556efa7701884063db2adcf1686a Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Tue, 10 Jan 2017 14:35:11 -0500 Subject: [PATCH 378/396] Remove deprecationWarning module --- Source/Core/Transforms.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/Source/Core/Transforms.js b/Source/Core/Transforms.js index 740f194aa387..aa064fc3a071 100644 --- a/Source/Core/Transforms.js +++ b/Source/Core/Transforms.js @@ -8,7 +8,6 @@ define([ './Check', './defaultValue', './defined', - './deprecationWarning', './DeveloperError', './EarthOrientationParameters', './EarthOrientationParametersSample', @@ -31,7 +30,6 @@ define([ Check, defaultValue, defined, - deprecationWarning, DeveloperError, EarthOrientationParameters, EarthOrientationParametersSample, From 0c0a0e0b303629a0ca83dca037aed548d578c43a Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Tue, 10 Jan 2017 14:36:27 -0500 Subject: [PATCH 379/396] Remove unused scratchHPR variable from Transform --- Source/Core/Transforms.js | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/Core/Transforms.js b/Source/Core/Transforms.js index aa064fc3a071..b9ebfef6f1ff 100644 --- a/Source/Core/Transforms.js +++ b/Source/Core/Transforms.js @@ -486,7 +486,6 @@ define([ return Matrix4.multiply(result, hprMatrix, result); }; - var scratchHPR = new HeadingPitchRoll(); var scratchENUMatrix4 = new Matrix4(); var scratchHPRMatrix3 = new Matrix3(); From dac906c9e493fbc1911253228293adbb37a9d340 Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Tue, 10 Jan 2017 14:43:07 -0500 Subject: [PATCH 380/396] Updated CHANGES.md with removal of heading, pitch, roll for transform --- CHANGES.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 5ebeb5ff1481..d39d7c6dd3dc 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,9 @@ Change Log ### 1.30 - 2017-02-01 * Deprecated * The properties `url` and `key` will be removed from `GeocoderViewModel` in 1.31. These properties will be available on geocoder services that support them, like `BingMapsGeocoderService`. +* Breaking + * Removed separate `heading`, `pitch`, `roll` from `Transform.headingPitchRollToFixedFrame` and `Transform.headingPitchRollQuaternion`. [#4843](https://github.com/AnalyticalGraphicsInc/cesium/pull/4843) + * Use `headingPitchRoll` object instead. * Added support for custom geocoder services and autocomplete [#4723](https://github.com/AnalyticalGraphicsInc/cesium/pull/4723). * Added [Custom Geocoder Sandcastle example](http://localhost:8080/Apps/Sandcastle/index.html?src=Custom%20Geocoder.html) * Added `GeocoderService`, an interface for geocoders. From 916947a2143c754146b393b310d760190d039d2b Mon Sep 17 00:00:00 2001 From: Austin Eng <213reeses@gmail.com> Date: Tue, 10 Jan 2017 13:47:55 -0500 Subject: [PATCH 381/396] add functions to apply wireframe to 3DTilesets --- Apps/Sandcastle/gallery/3D Tiles.html | 4 ++++ Source/Scene/Batched3DModel3DTileContent.js | 5 +++++ Source/Scene/Cesium3DTile.js | 9 +++++++++ Source/Scene/Cesium3DTileBatchTable.js | 10 ++++++++++ Source/Scene/Cesium3DTileContent.js | 13 +++++++++++++ Source/Scene/Cesium3DTileset.js | 12 ++++++++++++ Source/Scene/Composite3DTileContent.js | 11 +++++++++++ Source/Scene/Empty3DTileContent.js | 6 ++++++ Source/Scene/Instanced3DModel3DTileContent.js | 7 +++++++ Source/Scene/PointCloud3DTileContent.js | 6 ++++++ Source/Scene/Tileset3DTileContent.js | 6 ++++++ 11 files changed, 89 insertions(+) diff --git a/Apps/Sandcastle/gallery/3D Tiles.html b/Apps/Sandcastle/gallery/3D Tiles.html index 02d63e7a2564..8ea2b02afe50 100644 --- a/Apps/Sandcastle/gallery/3D Tiles.html +++ b/Apps/Sandcastle/gallery/3D Tiles.html @@ -375,6 +375,10 @@ tileset.debugColorizeTiles = !tileset.debugColorizeTiles; }); +Sandcastle.addToolbarButton('Wireframe on/off', function() { + tileset.debugWireframe = !tileset.debugWireframe; +}); + Sandcastle.addToolbarButton('BV on/off', function() { tileset.debugShowBoundingVolume = !tileset.debugShowBoundingVolume; }); diff --git a/Source/Scene/Batched3DModel3DTileContent.js b/Source/Scene/Batched3DModel3DTileContent.js index d51112ba0ed6..662adb0bef5d 100644 --- a/Source/Scene/Batched3DModel3DTileContent.js +++ b/Source/Scene/Batched3DModel3DTileContent.js @@ -343,6 +343,11 @@ define([ this.batchTable.setAllColor(color); }; + Batched3DModel3DTileContent.prototype.applyWireframe = function(enabled) { + this._model.debugWireframe = enabled; + + }; + /** * Part of the {@link Cesium3DTileContent} interface. */ diff --git a/Source/Scene/Cesium3DTile.js b/Source/Scene/Cesium3DTile.js index fbfa74444225..b8af69c43086 100644 --- a/Source/Scene/Cesium3DTile.js +++ b/Source/Scene/Cesium3DTile.js @@ -325,6 +325,7 @@ define([ this._debugViewerRequestVolume = undefined; this._debugColor = new Color.fromRandom({ alpha : 1.0 }); this._debugColorizeTiles = false; + this._debugWireframe = false; } defineProperties(Cesium3DTile.prototype, { @@ -701,6 +702,14 @@ define([ tile._debugColorizeTiles = false; tile._content.applyDebugSettings(false, tile._debugColor); } + + if (tileset.debugWireframe && !tile._debugWireframe) { + tile._debugWireframe = true; + tile._content.applyWireframe(true); + } else if (!tileset.debugWireframe && tile._debugWireframe) { + tile._debugWireframe = false; + tile._content.applyWireframe(false); + } } /** diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index efe89fd96694..55e2af4e68f7 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -1202,6 +1202,15 @@ define([ } } + function updateDerivedCommandsWireframe(derivedCommands, command) { + for (var name in derivedCommands) { + if (derivedCommands.hasOwnProperty(name)) { + var derivedCommand = derivedCommands[name]; + derivedCommand.primitiveType = command.primitiveType; + } + } + } + Cesium3DTileBatchTable.prototype.getAddCommand = function() { var styleCommandsNeeded = getStyleCommandsNeeded(this); @@ -1220,6 +1229,7 @@ define([ } updateDerivedCommandsShadows(derivedCommands, command); + updateDerivedCommandsWireframe(derivedCommands, command); // If the command was originally opaque: // * If the styling applied to the tile is all opaque, use the original command diff --git a/Source/Scene/Cesium3DTileContent.js b/Source/Scene/Cesium3DTileContent.js index e63d77075858..3800efbb51e8 100644 --- a/Source/Scene/Cesium3DTileContent.js +++ b/Source/Scene/Cesium3DTileContent.js @@ -199,6 +199,19 @@ define([ DeveloperError.throwInstantiationError(); }; + /** + * Called when {@link Cesium3DTileset#debugWireframe} changes. + *

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

    + * + * @private + */ + Cesium3DTileContent.prototype.applyWireframe = function(enabled) { + DeveloperError.throwInstantiationError(); + }; + /** * Apply a style to the content using a shader instead of a batch table. Currently this is only * applicable for {@link PointCloud3DTileContent}. diff --git a/Source/Scene/Cesium3DTileset.js b/Source/Scene/Cesium3DTileset.js index 4379f3724184..386d48a25b52 100644 --- a/Source/Scene/Cesium3DTileset.js +++ b/Source/Scene/Cesium3DTileset.js @@ -94,6 +94,7 @@ define([ * @param {Boolean} [options.debugShowPickStatistics=false] For debugging only. Determines if rendering statistics for picking are output to the console. * @param {Boolean} [options.debugFreezeFrame=false] For debugging only. Determines if only the tiles from last frame should be used for rendering. * @param {Boolean} [options.debugColorizeTiles=false] For debugging only. When true, assigns a random color to each tile. + * @param {Boolean} [options.debugWireframe=false] For debugging only. When true, render's each tile's content as a wireframe. * @param {Boolean} [options.debugShowBoundingVolume=false] For debugging only. When true, renders the bounding volume for each tile. * @param {Boolean} [options.debugShowContentBoundingVolume=false] For debugging only. When true, renders the bounding volume for each tile's content. * @param {Boolean} [options.debugShowViewerRequestVolume=false] For debugging only. When true, renders the viewer request volume for each tile. @@ -323,6 +324,17 @@ define([ */ this.debugColorizeTiles = defaultValue(options.debugColorizeTiles, false); + /** + * This property is for debugging only; it is not optimized for production use. + *

    + * When true, renders each tile's content as a wireframe + *

    + * + * @type {Boolean} + * @default false + */ + this.debugWireframe = defaultValue(options.debugWireframe, false); + /** * This property is for debugging only; it is not optimized for production use. *

    diff --git a/Source/Scene/Composite3DTileContent.js b/Source/Scene/Composite3DTileContent.js index 6dd61495b387..6e406e3afd1f 100644 --- a/Source/Scene/Composite3DTileContent.js +++ b/Source/Scene/Composite3DTileContent.js @@ -245,6 +245,17 @@ define([ } }; + /** + * Part of the {@link Cesium3DTileContent} interface. + */ + Composite3DTileContent.prototype.applyWireframe = function(enabled) { + var contents = this._contents; + var length = contents.length; + for (var i = 0; i < length; ++i) { + contents[i].applyWireframe(enabled); + } + }; + /** * Part of the {@link Cesium3DTileContent} interface. */ diff --git a/Source/Scene/Empty3DTileContent.js b/Source/Scene/Empty3DTileContent.js index 65b45ade6d1b..52c20fc312d1 100644 --- a/Source/Scene/Empty3DTileContent.js +++ b/Source/Scene/Empty3DTileContent.js @@ -113,6 +113,12 @@ define([ Empty3DTileContent.prototype.applyDebugSettings = function(enabled, color) { }; + /** + * Part of the {@link Cesium3DTileContent} interface. + */ + Empty3DTileContent.prototype.applyWireframe = function(enabled) { + }; + /** * Part of the {@link Cesium3DTileContent} interface. */ diff --git a/Source/Scene/Instanced3DModel3DTileContent.js b/Source/Scene/Instanced3DModel3DTileContent.js index ba28211378ab..a126f6062f88 100644 --- a/Source/Scene/Instanced3DModel3DTileContent.js +++ b/Source/Scene/Instanced3DModel3DTileContent.js @@ -470,6 +470,13 @@ define([ this.batchTable.setAllColor(color); }; + /** + * Part of the {@link Cesium3DTileContent} interface. + */ + Instanced3DModel3DTileContent.prototype.applyWireframe = function(enabled) { + this._modelInstanceCollection.debugWireframe = enabled; + }; + /** * Part of the {@link Cesium3DTileContent} interface. */ diff --git a/Source/Scene/PointCloud3DTileContent.js b/Source/Scene/PointCloud3DTileContent.js index e00cea225aec..3898a88bc6a3 100644 --- a/Source/Scene/PointCloud3DTileContent.js +++ b/Source/Scene/PointCloud3DTileContent.js @@ -1117,6 +1117,12 @@ define([ this._highlightColor = enabled ? color : Color.WHITE; }; + /** + * Part of the {@link Cesium3DTileContent} interface. + */ + PointCloud3DTileContent.prototype.applyWireframe = function(enabled) { + }; + /** * Part of the {@link Cesium3DTileContent} interface. */ diff --git a/Source/Scene/Tileset3DTileContent.js b/Source/Scene/Tileset3DTileContent.js index 49a7daba114a..c74e6222789e 100644 --- a/Source/Scene/Tileset3DTileContent.js +++ b/Source/Scene/Tileset3DTileContent.js @@ -124,6 +124,12 @@ define([ Tileset3DTileContent.prototype.applyDebugSettings = function(enabled, color) { }; + /** + * Part of the {@link Cesium3DTileContent} interface. + */ + Tileset3DTileContent.prototype.applyWireframe = function(enabled) { + }; + /** * Part of the {@link Cesium3DTileContent} interface. */ From 188cae7fa939614f7d78f16e4cecb1178491a62b Mon Sep 17 00:00:00 2001 From: Austin Eng <213reeses@gmail.com> Date: Tue, 10 Jan 2017 15:02:30 -0500 Subject: [PATCH 382/396] add debugWireframe test for 3DTileset --- Source/Scene/Batched3DModel3DTileContent.js | 1 - Specs/Scene/Cesium3DTilesetSpec.js | 23 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Source/Scene/Batched3DModel3DTileContent.js b/Source/Scene/Batched3DModel3DTileContent.js index 662adb0bef5d..5ce08e047213 100644 --- a/Source/Scene/Batched3DModel3DTileContent.js +++ b/Source/Scene/Batched3DModel3DTileContent.js @@ -345,7 +345,6 @@ define([ Batched3DModel3DTileContent.prototype.applyWireframe = function(enabled) { this._model.debugWireframe = enabled; - }; /** diff --git a/Specs/Scene/Cesium3DTilesetSpec.js b/Specs/Scene/Cesium3DTilesetSpec.js index 9d4139bc8a5d..c02a1aa0ab37 100644 --- a/Specs/Scene/Cesium3DTilesetSpec.js +++ b/Specs/Scene/Cesium3DTilesetSpec.js @@ -7,6 +7,7 @@ defineSuite([ 'Core/HeadingPitchRange', 'Core/loadWithXhr', 'Core/Matrix4', + 'Core/PrimitiveType', 'Core/RequestScheduler', 'Renderer/ContextLimits', 'Scene/Cesium3DTile', @@ -27,6 +28,7 @@ defineSuite([ HeadingPitchRange, loadWithXhr, Matrix4, + PrimitiveType, RequestScheduler, ContextLimits, Cesium3DTile, @@ -939,6 +941,27 @@ defineSuite([ }); }); + it('debugWireframe', function() { + // More precise test is in Cesium3DTileBatchTableSpec + return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { + viewRootOnly(); + tileset.debugWireframe = true; + scene.renderForSpecs(); + var commands = scene.frameState.commandList; + var i; + for (i = 0; i < commands.length; ++i) { + expect(commands[i].primitiveType).toEqual(PrimitiveType.LINES); + } + + tileset.debugWireframe = false; + scene.renderForSpecs(); + commands = scene.frameState.commandList; + for (i = 0; i < commands.length; ++i) { + expect(commands[i].primitiveType).toEqual(PrimitiveType.TRIANGLES); + } + }); + }); + it('debugShowBoundingVolume', function() { return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { viewRootOnly(); From 6d78df83feb7f82492a4aeaf542ff5ee4fe4b66a Mon Sep 17 00:00:00 2001 From: Austin Eng <213reeses@gmail.com> Date: Tue, 10 Jan 2017 15:45:28 -0500 Subject: [PATCH 383/396] update TileOrientedBoundingBox debug volume size to match OrientedBoundingBox --- Source/Scene/TileOrientedBoundingBox.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Scene/TileOrientedBoundingBox.js b/Source/Scene/TileOrientedBoundingBox.js index 1f5db032b50a..cf1e05efcfe5 100644 --- a/Source/Scene/TileOrientedBoundingBox.js +++ b/Source/Scene/TileOrientedBoundingBox.js @@ -121,9 +121,9 @@ define([ //>>includeEnd('debug'); var geometry = new BoxOutlineGeometry({ - // Make a cube of unit size -- all sides of length 1.0 - minimum: new Cartesian3(-0.5, -0.5, -0.5), - maximum: new Cartesian3(0.5, 0.5, 0.5) + // Make a 2x2x2 cube + minimum: new Cartesian3(-1.0, -1.0, -1.0), + maximum: new Cartesian3(1.0, 1.0, 1.0) }); var modelMatrix = Matrix4.fromRotationTranslation(this.boundingVolume.halfAxes, this.boundingVolume.center); var instance = new GeometryInstance({ From b4b7d1a63a8f782e0634cb1dd1a945d3497d6bb0 Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Tue, 10 Jan 2017 16:56:07 -0500 Subject: [PATCH 384/396] Tweak CHANGES.md --- CHANGES.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index d39d7c6dd3dc..3337b7a86ba8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,9 +4,8 @@ Change Log ### 1.30 - 2017-02-01 * Deprecated * The properties `url` and `key` will be removed from `GeocoderViewModel` in 1.31. These properties will be available on geocoder services that support them, like `BingMapsGeocoderService`. -* Breaking - * Removed separate `heading`, `pitch`, `roll` from `Transform.headingPitchRollToFixedFrame` and `Transform.headingPitchRollQuaternion`. [#4843](https://github.com/AnalyticalGraphicsInc/cesium/pull/4843) - * Use `headingPitchRoll` object instead. +* Breaking changes + * Removed separate `heading`, `pitch`, `roll` parameters from `Transform.headingPitchRollToFixedFrame` and `Transform.headingPitchRollQuaternion`. Pass a `headingPitchRoll` object instead. [#4843](https://github.com/AnalyticalGraphicsInc/cesium/pull/4843) * Added support for custom geocoder services and autocomplete [#4723](https://github.com/AnalyticalGraphicsInc/cesium/pull/4723). * Added [Custom Geocoder Sandcastle example](http://localhost:8080/Apps/Sandcastle/index.html?src=Custom%20Geocoder.html) * Added `GeocoderService`, an interface for geocoders. From 9fe21efe9adc3fbccf94b4e8b764a1f6b6b1147a Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Tue, 10 Jan 2017 16:57:37 -0500 Subject: [PATCH 385/396] Fix typo --- Specs/Core/TransformsSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Specs/Core/TransformsSpec.js b/Specs/Core/TransformsSpec.js index abf8c0b9af1e..1d4682ca3b7a 100644 --- a/Specs/Core/TransformsSpec.js +++ b/Specs/Core/TransformsSpec.js @@ -923,7 +923,7 @@ defineSuite([ }).toThrowDeveloperError(); }); - it('headingPitchRollToFixedFrame throws without an headingPitchRoll', function() { + it('headingPitchRollToFixedFrame throws without a headingPitchRoll', function() { expect(function() { Transforms.headingPitchRollToFixedFrame(Cartesian3.ZERO, undefined); }).toThrowDeveloperError(); From 0b80f7c2254c0ffe6231b8c1fb45143352d952cd Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Tue, 10 Jan 2017 16:55:57 -0500 Subject: [PATCH 386/396] Replace DeveloperError with Check in BoundingRectangle --- Source/Core/BoundingRectangle.js | 40 +++++++++----------------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/Source/Core/BoundingRectangle.js b/Source/Core/BoundingRectangle.js index 029a75298f67..241fa4958f41 100644 --- a/Source/Core/BoundingRectangle.js +++ b/Source/Core/BoundingRectangle.js @@ -2,18 +2,18 @@ define([ './Cartesian2', './Cartographic', + './Check', './defaultValue', './defined', - './DeveloperError', './GeographicProjection', './Intersect', './Rectangle' ], function( Cartesian2, Cartographic, + Check, defaultValue, defined, - DeveloperError, GeographicProjection, Intersect, Rectangle) { @@ -79,12 +79,8 @@ define([ */ BoundingRectangle.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -107,9 +103,7 @@ define([ */ BoundingRectangle.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -242,12 +236,8 @@ define([ */ BoundingRectangle.union = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required.'); - } - if (!defined(right)) { - throw new DeveloperError('right is required.'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); if (!defined(result)) { @@ -276,12 +266,8 @@ define([ */ BoundingRectangle.expand = function(rectangle, point, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required.'); - } - if (!defined(point)) { - throw new DeveloperError('point is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); + Check.typeOf.object(point, 'point'); //>>includeEnd('debug'); result = BoundingRectangle.clone(rectangle, result); @@ -315,12 +301,8 @@ define([ */ BoundingRectangle.intersect = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required.'); - } - if (!defined(right)) { - throw new DeveloperError('right is required.'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); var leftX = left.x; From 3010fce6f26c7a8e825457fe87619875dc938ad9 Mon Sep 17 00:00:00 2001 From: Austin Eng <213reeses@gmail.com> Date: Wed, 11 Jan 2017 09:22:26 -0500 Subject: [PATCH 387/396] simplify debugWireframe to update every frame --- Source/Scene/Batched3DModel3DTileContent.js | 8 +++----- Source/Scene/Cesium3DTile.js | 8 -------- Source/Scene/Cesium3DTileBatchTable.js | 13 ++----------- Source/Scene/Cesium3DTileContent.js | 13 ------------- Source/Scene/Composite3DTileContent.js | 11 ----------- Source/Scene/Empty3DTileContent.js | 6 ------ Source/Scene/Instanced3DModel3DTileContent.js | 8 +------- Source/Scene/PointCloud3DTileContent.js | 6 ------ Source/Scene/Tileset3DTileContent.js | 7 +------ Specs/Scene/Cesium3DTilesetSpec.js | 6 +++--- 10 files changed, 10 insertions(+), 76 deletions(-) diff --git a/Source/Scene/Batched3DModel3DTileContent.js b/Source/Scene/Batched3DModel3DTileContent.js index 5ce08e047213..2200331a1cdf 100644 --- a/Source/Scene/Batched3DModel3DTileContent.js +++ b/Source/Scene/Batched3DModel3DTileContent.js @@ -310,6 +310,7 @@ define([ basePath : getBaseUri(this._url), modelMatrix : this._tile.computedTransform, shadows: this._tileset.shadows, + debugWireframe: this._tileset.debugWireframe, incrementallyLoadTextures : false, vertexShaderLoaded : getVertexShaderCallback(this), fragmentShaderLoaded : getFragmentShaderCallback(this), @@ -342,11 +343,7 @@ define([ color = enabled ? color : Color.WHITE; this.batchTable.setAllColor(color); }; - - Batched3DModel3DTileContent.prototype.applyWireframe = function(enabled) { - this._model.debugWireframe = enabled; - }; - + /** * Part of the {@link Cesium3DTileContent} interface. */ @@ -369,6 +366,7 @@ define([ this.batchTable.update(tileset, frameState); this._model.modelMatrix = this._tile.computedTransform; this._model.shadows = this._tileset.shadows; + this._model.debugWireframe = this._tileset.debugWireframe; this._model.update(frameState); frameState.addCommand = oldAddCommand; diff --git a/Source/Scene/Cesium3DTile.js b/Source/Scene/Cesium3DTile.js index b8af69c43086..a492d8577559 100644 --- a/Source/Scene/Cesium3DTile.js +++ b/Source/Scene/Cesium3DTile.js @@ -702,14 +702,6 @@ define([ tile._debugColorizeTiles = false; tile._content.applyDebugSettings(false, tile._debugColor); } - - if (tileset.debugWireframe && !tile._debugWireframe) { - tile._debugWireframe = true; - tile._content.applyWireframe(true); - } else if (!tileset.debugWireframe && tile._debugWireframe) { - tile._debugWireframe = false; - tile._content.applyWireframe(false); - } } /** diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index 55e2af4e68f7..481d7140e591 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -1192,20 +1192,12 @@ define([ OPAQUE_AND_TRANSLUCENT : 2 }; - function updateDerivedCommandsShadows(derivedCommands, command) { + function updateDerivedCommands(derivedCommands, command) { for (var name in derivedCommands) { if (derivedCommands.hasOwnProperty(name)) { var derivedCommand = derivedCommands[name]; derivedCommand.castShadows = command.castShadows; derivedCommand.receiveShadows = command.receiveShadows; - } - } - } - - function updateDerivedCommandsWireframe(derivedCommands, command) { - for (var name in derivedCommands) { - if (derivedCommands.hasOwnProperty(name)) { - var derivedCommand = derivedCommands[name]; derivedCommand.primitiveType = command.primitiveType; } } @@ -1228,8 +1220,7 @@ define([ derivedCommands.front = deriveTranslucentCommand(command, CullFace.BACK); } - updateDerivedCommandsShadows(derivedCommands, command); - updateDerivedCommandsWireframe(derivedCommands, command); + updateDerivedCommands(derivedCommands, command); // If the command was originally opaque: // * If the styling applied to the tile is all opaque, use the original command diff --git a/Source/Scene/Cesium3DTileContent.js b/Source/Scene/Cesium3DTileContent.js index 3800efbb51e8..e63d77075858 100644 --- a/Source/Scene/Cesium3DTileContent.js +++ b/Source/Scene/Cesium3DTileContent.js @@ -199,19 +199,6 @@ define([ DeveloperError.throwInstantiationError(); }; - /** - * Called when {@link Cesium3DTileset#debugWireframe} changes. - *

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

    - * - * @private - */ - Cesium3DTileContent.prototype.applyWireframe = function(enabled) { - DeveloperError.throwInstantiationError(); - }; - /** * Apply a style to the content using a shader instead of a batch table. Currently this is only * applicable for {@link PointCloud3DTileContent}. diff --git a/Source/Scene/Composite3DTileContent.js b/Source/Scene/Composite3DTileContent.js index 6e406e3afd1f..6dd61495b387 100644 --- a/Source/Scene/Composite3DTileContent.js +++ b/Source/Scene/Composite3DTileContent.js @@ -245,17 +245,6 @@ define([ } }; - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - Composite3DTileContent.prototype.applyWireframe = function(enabled) { - var contents = this._contents; - var length = contents.length; - for (var i = 0; i < length; ++i) { - contents[i].applyWireframe(enabled); - } - }; - /** * Part of the {@link Cesium3DTileContent} interface. */ diff --git a/Source/Scene/Empty3DTileContent.js b/Source/Scene/Empty3DTileContent.js index 52c20fc312d1..65b45ade6d1b 100644 --- a/Source/Scene/Empty3DTileContent.js +++ b/Source/Scene/Empty3DTileContent.js @@ -113,12 +113,6 @@ define([ Empty3DTileContent.prototype.applyDebugSettings = function(enabled, color) { }; - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - Empty3DTileContent.prototype.applyWireframe = function(enabled) { - }; - /** * Part of the {@link Cesium3DTileContent} interface. */ diff --git a/Source/Scene/Instanced3DModel3DTileContent.js b/Source/Scene/Instanced3DModel3DTileContent.js index a126f6062f88..572a5e5a632c 100644 --- a/Source/Scene/Instanced3DModel3DTileContent.js +++ b/Source/Scene/Instanced3DModel3DTileContent.js @@ -470,13 +470,6 @@ define([ this.batchTable.setAllColor(color); }; - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - Instanced3DModel3DTileContent.prototype.applyWireframe = function(enabled) { - this._modelInstanceCollection.debugWireframe = enabled; - }; - /** * Part of the {@link Cesium3DTileContent} interface. */ @@ -499,6 +492,7 @@ define([ this.batchTable.update(tileset, frameState); this._modelInstanceCollection.transform = this._tile.computedTransform; this._modelInstanceCollection.shadows = this._tileset.shadows; + this._modelInstanceCollection.debugWireframe = this._tileset.debugWireframe; this._modelInstanceCollection.update(frameState); frameState.addCommand = oldAddCommand; diff --git a/Source/Scene/PointCloud3DTileContent.js b/Source/Scene/PointCloud3DTileContent.js index 3898a88bc6a3..e00cea225aec 100644 --- a/Source/Scene/PointCloud3DTileContent.js +++ b/Source/Scene/PointCloud3DTileContent.js @@ -1117,12 +1117,6 @@ define([ this._highlightColor = enabled ? color : Color.WHITE; }; - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - PointCloud3DTileContent.prototype.applyWireframe = function(enabled) { - }; - /** * Part of the {@link Cesium3DTileContent} interface. */ diff --git a/Source/Scene/Tileset3DTileContent.js b/Source/Scene/Tileset3DTileContent.js index c74e6222789e..fda851413943 100644 --- a/Source/Scene/Tileset3DTileContent.js +++ b/Source/Scene/Tileset3DTileContent.js @@ -123,12 +123,7 @@ define([ */ Tileset3DTileContent.prototype.applyDebugSettings = function(enabled, color) { }; - - /** - * Part of the {@link Cesium3DTileContent} interface. - */ - Tileset3DTileContent.prototype.applyWireframe = function(enabled) { - }; + /** * Part of the {@link Cesium3DTileContent} interface. diff --git a/Specs/Scene/Cesium3DTilesetSpec.js b/Specs/Scene/Cesium3DTilesetSpec.js index c02a1aa0ab37..3fbb5271d2ec 100644 --- a/Specs/Scene/Cesium3DTilesetSpec.js +++ b/Specs/Scene/Cesium3DTilesetSpec.js @@ -942,21 +942,21 @@ defineSuite([ }); it('debugWireframe', function() { - // More precise test is in Cesium3DTileBatchTableSpec return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { viewRootOnly(); tileset.debugWireframe = true; scene.renderForSpecs(); var commands = scene.frameState.commandList; + var length = commands.length; var i; - for (i = 0; i < commands.length; ++i) { + for (i = 0; i < length; ++i) { expect(commands[i].primitiveType).toEqual(PrimitiveType.LINES); } tileset.debugWireframe = false; scene.renderForSpecs(); commands = scene.frameState.commandList; - for (i = 0; i < commands.length; ++i) { + for (i = 0; i < length; ++i) { expect(commands[i].primitiveType).toEqual(PrimitiveType.TRIANGLES); } }); From 364a4197e0f2f88d469f283370d57b4b55190b64 Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Tue, 10 Jan 2017 16:58:07 -0500 Subject: [PATCH 388/396] Replace DeveloperError with Check in BoundingSphere --- Source/Core/BoundingSphere.js | 109 +++++++++------------------------- 1 file changed, 27 insertions(+), 82 deletions(-) diff --git a/Source/Core/BoundingSphere.js b/Source/Core/BoundingSphere.js index 5c729fd38142..48d826808896 100644 --- a/Source/Core/BoundingSphere.js +++ b/Source/Core/BoundingSphere.js @@ -2,9 +2,9 @@ define([ './Cartesian3', './Cartographic', + './Check', './defaultValue', './defined', - './DeveloperError', './Ellipsoid', './GeographicProjection', './Intersect', @@ -15,9 +15,9 @@ define([ ], function( Cartesian3, Cartographic, + Check, defaultValue, defined, - DeveloperError, Ellipsoid, GeographicProjection, Intersect, @@ -348,9 +348,7 @@ define([ stride = defaultValue(stride, 3); //>>includeStart('debug', pragmas.debug); - if (stride < 3) { - throw new DeveloperError('stride must be 3 or greater.'); - } + Check.numeric.minimum(stride, 3); //>>includeEnd('debug'); var currentPos = fromPointsCurrentPos; @@ -656,9 +654,8 @@ define([ */ BoundingSphere.fromCornerPoints = function(corner, oppositeCorner, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(corner) || !defined(oppositeCorner)) { - throw new DeveloperError('corner and oppositeCorner are required.'); - } + Check.typeOf.object(corner, 'corner'); + Check.typeOf.object(oppositeCorner, 'oppositeCorner'); //>>includeEnd('debug'); if (!defined(result)) { @@ -684,9 +681,7 @@ define([ */ BoundingSphere.fromEllipsoid = function(ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(ellipsoid)) { - throw new DeveloperError('ellipsoid is required.'); - } + Check.typeOf.object(ellipsoid, 'ellipsoid'); //>>includeEnd('debug'); if (!defined(result)) { @@ -814,13 +809,8 @@ define([ */ BoundingSphere.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -844,9 +834,7 @@ define([ */ BoundingSphere.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -875,13 +863,8 @@ define([ */ BoundingSphere.union = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required.'); - } - - if (!defined(right)) { - throw new DeveloperError('right is required.'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); if (!defined(result)) { @@ -932,13 +915,8 @@ define([ */ BoundingSphere.expand = function(sphere, point, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(sphere)) { - throw new DeveloperError('sphere is required.'); - } - - if (!defined(point)) { - throw new DeveloperError('point is required.'); - } + Check.typeOf.object(sphere, 'sphere'); + Check.typeOf.object(point, 'point'); //>>includeEnd('debug'); result = BoundingSphere.clone(sphere, result); @@ -963,13 +941,8 @@ define([ */ BoundingSphere.intersectPlane = function(sphere, plane) { //>>includeStart('debug', pragmas.debug); - if (!defined(sphere)) { - throw new DeveloperError('sphere is required.'); - } - - if (!defined(plane)) { - throw new DeveloperError('plane is required.'); - } + Check.typeOf.object(sphere, 'sphere'); + Check.typeOf.object(plane, 'plane'); //>>includeEnd('debug'); var center = sphere.center; @@ -997,13 +970,8 @@ define([ */ BoundingSphere.transform = function(sphere, transform, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(sphere)) { - throw new DeveloperError('sphere is required.'); - } - - if (!defined(transform)) { - throw new DeveloperError('transform is required.'); - } + Check.typeOf.object(sphere, 'sphere'); + Check.typeOf.object(transform, 'transform'); //>>includeEnd('debug'); if (!defined(result)) { @@ -1033,12 +1001,8 @@ define([ */ BoundingSphere.distanceSquaredTo = function(sphere, cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(sphere)) { - throw new DeveloperError('sphere is required.'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required.'); - } + Check.typeOf.object(sphere, 'sphere'); + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); var diff = Cartesian3.subtract(sphere.center, cartesian, distanceSquaredToScratch); @@ -1062,13 +1026,8 @@ define([ */ BoundingSphere.transformWithoutScale = function(sphere, transform, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(sphere)) { - throw new DeveloperError('sphere is required.'); - } - - if (!defined(transform)) { - throw new DeveloperError('transform is required.'); - } + Check.typeOf.object(sphere, 'sphere'); + Check.typeOf.object(transform, 'transform'); //>>includeEnd('debug'); if (!defined(result)) { @@ -1097,17 +1056,9 @@ define([ */ BoundingSphere.computePlaneDistances = function(sphere, position, direction, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(sphere)) { - throw new DeveloperError('sphere is required.'); - } - - if (!defined(position)) { - throw new DeveloperError('position is required.'); - } - - if (!defined(direction)) { - throw new DeveloperError('direction is required.'); - } + Check.typeOf.object(sphere, 'sphere'); + Check.typeOf.object(position, 'position'); + Check.typeOf.object(direction, 'direction'); //>>includeEnd('debug'); if (!defined(result)) { @@ -1144,9 +1095,7 @@ define([ */ BoundingSphere.projectTo2D = function(sphere, projection, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(sphere)) { - throw new DeveloperError('sphere is required.'); - } + Check.typeOf.object(sphere, 'sphere'); //>>includeEnd('debug'); projection = defaultValue(projection, projectTo2DProjection); @@ -1243,12 +1192,8 @@ define([ */ BoundingSphere.isOccluded = function(sphere, occluder) { //>>includeStart('debug', pragmas.debug); - if (!defined(sphere)) { - throw new DeveloperError('sphere is required.'); - } - if (!defined(occluder)) { - throw new DeveloperError('occluder is required.'); - } + Check.typeOf.object(sphere, 'sphere'); + Check.typeOf.object(occluder, 'occluder'); //>>includeEnd('debug'); return !occluder.isBoundingSphereVisible(sphere); }; From bb5aec0770a5361887b2bb57ed27be2c861f3630 Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Wed, 11 Jan 2017 09:44:11 -0500 Subject: [PATCH 389/396] JSDoc Fixes for Math.js --- Source/Core/Math.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Source/Core/Math.js b/Source/Core/Math.js index 7c9952c522b5..b3bd96701bd4 100644 --- a/Source/Core/Math.js +++ b/Source/Core/Math.js @@ -486,7 +486,7 @@ define([ throw new DeveloperError('angle is required.'); } //>>includeEnd('debug'); - + return CesiumMath.clamp(angle, -1*CesiumMath.PI_OVER_TWO, CesiumMath.PI_OVER_TWO); }; @@ -496,13 +496,13 @@ define([ * @param {Number} angle in radians * @returns {Number} The angle in the range [-CesiumMath.PI, CesiumMath.PI]. */ - CesiumMath.negativePiToPi = function(x) { + CesiumMath.negativePiToPi = function(angle) { //>>includeStart('debug', pragmas.debug); - if (!defined(x)) { - throw new DeveloperError('x is required.'); + if (!defined(angle)) { + throw new DeveloperError('angle is required.'); } //>>includeEnd('debug'); - return CesiumMath.zeroToTwoPi(x + CesiumMath.PI) - CesiumMath.PI; + return CesiumMath.zeroToTwoPi(angle + CesiumMath.PI) - CesiumMath.PI; }; /** @@ -511,14 +511,14 @@ define([ * @param {Number} angle in radians * @returns {Number} The angle in the range [0, CesiumMath.TWO_PI]. */ - CesiumMath.zeroToTwoPi = function(x) { + CesiumMath.zeroToTwoPi = function(angle) { //>>includeStart('debug', pragmas.debug); - if (!defined(x)) { - throw new DeveloperError('x is required.'); + if (!defined(angle)) { + throw new DeveloperError('angle is required.'); } //>>includeEnd('debug'); - var mod = CesiumMath.mod(x, CesiumMath.TWO_PI); - if (Math.abs(mod) < CesiumMath.EPSILON14 && Math.abs(x) > CesiumMath.EPSILON14) { + var mod = CesiumMath.mod(angle, CesiumMath.TWO_PI); + if (Math.abs(mod) < CesiumMath.EPSILON14 && Math.abs(angle) > CesiumMath.EPSILON14) { return CesiumMath.TWO_PI; } return mod; @@ -592,7 +592,7 @@ define([ * @example * //Compute 7!, which is equal to 5040 * var computedFactorial = Cesium.Math.factorial(7); - * + * * @see {@link http://en.wikipedia.org/wiki/Factorial|Factorial on Wikipedia} */ CesiumMath.factorial = function(n) { From 230d45bbca3a924390e6f9c0bf39b55f0f624e48 Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Wed, 11 Jan 2017 09:44:27 -0500 Subject: [PATCH 390/396] JSDoc Fixes for Matrix2.js --- Source/Core/Matrix2.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/Core/Matrix2.js b/Source/Core/Matrix2.js index 6fc6f8512d8b..ad6bcaa18abc 100644 --- a/Source/Core/Matrix2.js +++ b/Source/Core/Matrix2.js @@ -106,18 +106,18 @@ define([ * @param {Matrix2} [result] The object onto which to store the result. * @returns {Matrix2} The modified result parameter or a new Matrix2 instance if one was not provided. (Returns undefined if matrix is undefined) */ - Matrix2.clone = function(values, result) { - if (!defined(values)) { + Matrix2.clone = function(matrix, result) { + if (!defined(matrix)) { return undefined; } if (!defined(result)) { - return new Matrix2(values[0], values[2], - values[1], values[3]); + return new Matrix2(matrix[0], matrix[2], + matrix[1], matrix[3]); } - result[0] = values[0]; - result[1] = values[1]; - result[2] = values[2]; - result[3] = values[3]; + result[0] = matrix[0]; + result[1] = matrix[1]; + result[2] = matrix[2]; + result[3] = matrix[3]; return result; }; From e7faa8576fee920778105e52a67136900f5e309f Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Wed, 11 Jan 2017 09:44:47 -0500 Subject: [PATCH 391/396] JSDoc Fixes for Matrix3.js --- Source/Core/Matrix3.js | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/Source/Core/Matrix3.js b/Source/Core/Matrix3.js index 6f86104aa011..0b63e2eb9a7a 100644 --- a/Source/Core/Matrix3.js +++ b/Source/Core/Matrix3.js @@ -131,24 +131,24 @@ define([ * @param {Matrix3} [result] The object onto which to store the result. * @returns {Matrix3} The modified result parameter or a new Matrix3 instance if one was not provided. (Returns undefined if matrix is undefined) */ - Matrix3.clone = function(values, result) { - if (!defined(values)) { + Matrix3.clone = function(matrix, result) { + if (!defined(matrix)) { return undefined; } if (!defined(result)) { - return new Matrix3(values[0], values[3], values[6], - values[1], values[4], values[7], - values[2], values[5], values[8]); + return new Matrix3(matrix[0], matrix[3], matrix[6], + matrix[1], matrix[4], matrix[7], + matrix[2], matrix[5], matrix[8]); } - result[0] = values[0]; - result[1] = values[1]; - result[2] = values[2]; - result[3] = values[3]; - result[4] = values[4]; - result[5] = values[5]; - result[6] = values[6]; - result[7] = values[7]; - result[8] = values[8]; + result[0] = matrix[0]; + result[1] = matrix[1]; + result[2] = matrix[2]; + result[3] = matrix[3]; + result[4] = matrix[4]; + result[5] = matrix[5]; + result[6] = matrix[6]; + result[7] = matrix[7]; + result[8] = matrix[8]; return result; }; @@ -420,7 +420,7 @@ define([ /** * Computes a Matrix3 instance representing the cross product equivalent matrix of a Cartesian3 vector. * - * @param {Cartesian3} the vector on the left hand side of the cross product operation. + * @param {Cartesian3} vector the vector on the left hand side of the cross product operation. * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created. * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided. * From a285555ec25ece899a6b5bda3f02d1448e2a31ad Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Wed, 11 Jan 2017 10:56:48 -0500 Subject: [PATCH 392/396] Cleanup Source directory for JSDoc warnings --- Source/Core/BingMapsGeocoderService.js | 3 +-- Source/Core/Credit.js | 2 +- Source/Core/Ellipsoid.js | 4 +++- Source/Core/EllipsoidGeodesic.js | 2 ++ Source/Core/OrientedBoundingBox.js | 1 + Source/Core/PolylinePipeline.js | 16 ++++++++-------- Source/Core/Quaternion.js | 2 +- Source/Core/Simon1994PlanetaryPositions.js | 18 +++++++++--------- Source/Core/Spherical.js | 2 +- Source/Core/TerrainMesh.js | 1 + Source/Core/TimeIntervalCollection.js | 4 ++-- Source/Core/VertexFormat.js | 2 +- Source/Core/getImagePixels.js | 2 ++ Source/DataSources/CorridorGeometryUpdater.js | 3 ++- Source/DataSources/CzmlDataSource.js | 2 +- Source/DataSources/EllipseGeometryUpdater.js | 3 ++- Source/DataSources/EntityView.js | 2 +- Source/DataSources/PolygonGeometryUpdater.js | 5 +++-- Source/DataSources/Rotation.js | 2 +- Source/DataSources/SampledPositionProperty.js | 4 ++-- Source/Renderer/Buffer.js | 2 +- Source/Renderer/ComputeCommand.js | 2 +- Source/Scene/BingMapsImageryProvider.js | 2 +- Source/Scene/CameraEventAggregator.js | 2 +- Source/Scene/CreditDisplay.js | 4 ---- Source/Scene/FrameState.js | 1 + Source/Scene/GoogleEarthImageryProvider.js | 4 ++-- Source/Scene/GridImageryProvider.js | 4 ++-- Source/Scene/ImageryLayer.js | 3 ++- Source/Scene/ImageryProvider.js | 1 + Source/Scene/Polyline.js | 1 + Source/Scene/SingleTileImageryProvider.js | 2 +- Source/Scene/TileCoordinatesImageryProvider.js | 2 +- .../Scene/WebMapTileServiceImageryProvider.js | 4 ++-- .../CesiumInspectorViewModel.js | 1 + .../Viewer/viewerPerformanceWatchdogMixin.js | 1 + Source/Workers/cesiumWorkerBootstrapper.js | 3 ++- 37 files changed, 66 insertions(+), 53 deletions(-) diff --git a/Source/Core/BingMapsGeocoderService.js b/Source/Core/BingMapsGeocoderService.js index 52f73196cf6e..7f9c4fc4ced8 100644 --- a/Source/Core/BingMapsGeocoderService.js +++ b/Source/Core/BingMapsGeocoderService.js @@ -25,8 +25,7 @@ define([ * @constructor * * @param {Object} options Object with the following properties: - * @param {String} [key] A key to use with the Bing Maps geocoding service - * @param {Boolean} autoComplete Indicates whether this service shall be used to fetch auto-complete suggestions + * @param {String} [options.key] A key to use with the Bing Maps geocoding service */ function BingMapsGeocoderService(options) { options = defaultValue(options, defaultValue.EMPTY_OBJECT); diff --git a/Source/Core/Credit.js b/Source/Core/Credit.js index cd949480e8cd..820e20d7fb3b 100644 --- a/Source/Core/Credit.js +++ b/Source/Core/Credit.js @@ -147,7 +147,7 @@ define([ /** * Returns true if the credits are equal * - * @param {Credit} credits The credit to compare to. + * @param {Credit} credit The credit to compare to. * @returns {Boolean} true if left and right are equal, false otherwise. */ Credit.prototype.equals = function(credit) { diff --git a/Source/Core/Ellipsoid.js b/Source/Core/Ellipsoid.js index deca2629e1ae..6f3eba4bcfcb 100644 --- a/Source/Core/Ellipsoid.js +++ b/Source/Core/Ellipsoid.js @@ -208,7 +208,9 @@ define([ /** * Computes an Ellipsoid from a Cartesian specifying the radii in x, y, and z directions. * - * @param {Cartesian3} [radii=Cartesian3.ZERO] The ellipsoid's radius in the x, y, and z directions. + * @param {Cartesian3} [cartesian=Cartesian3.ZERO] The ellipsoid's radius in the x, y, and z directions. + * @param {Ellipsoid} [result] The object onto which to store the result, or undefined if a new + * instance should be created. * @returns {Ellipsoid} A new Ellipsoid instance. * * @exception {DeveloperError} All radii components must be greater than or equal to zero. diff --git a/Source/Core/EllipsoidGeodesic.js b/Source/Core/EllipsoidGeodesic.js index 8db8aa6ed9b5..4a84a85b7d04 100644 --- a/Source/Core/EllipsoidGeodesic.js +++ b/Source/Core/EllipsoidGeodesic.js @@ -337,6 +337,7 @@ define([ * Provides the location of a point at the indicated portion along the geodesic. * * @param {Number} fraction The portion of the distance between the initial and final points. + * @param {Cartographic} result The object in which to store the result. * @returns {Cartographic} The location of the point along the geodesic. */ EllipsoidGeodesic.prototype.interpolateUsingFraction = function(fraction, result) { @@ -347,6 +348,7 @@ define([ * Provides the location of a point at the indicated distance along the geodesic. * * @param {Number} distance The distance from the inital point to the point of interest along the geodesic + * @param {Cartographic} result The object in which to store the result. * @returns {Cartographic} The location of the point along the geodesic. * * @exception {DeveloperError} start and end must be set before calling function interpolateUsingSurfaceDistance diff --git a/Source/Core/OrientedBoundingBox.js b/Source/Core/OrientedBoundingBox.js index 15c6b332ee08..53e0f48e28ee 100644 --- a/Source/Core/OrientedBoundingBox.js +++ b/Source/Core/OrientedBoundingBox.js @@ -199,6 +199,7 @@ define([ /** * Computes an OrientedBoundingBox given extents in the east-north-up space of the tangent plane. * + * @param {Plane} tangentPlane The tangent place corresponding to east-north-up. * @param {Number} minimumX Minimum X extent in tangent plane space. * @param {Number} maximumX Maximum X extent in tangent plane space. * @param {Number} minimumY Minimum Y extent in tangent plane space. diff --git a/Source/Core/PolylinePipeline.js b/Source/Core/PolylinePipeline.js index 99422e918513..51f642a88fd8 100644 --- a/Source/Core/PolylinePipeline.js +++ b/Source/Core/PolylinePipeline.js @@ -202,10 +202,10 @@ define([ /** * Subdivides polyline and raises all points to the specified height. Returns an array of numbers to represent the positions. - * @param {Cartesian3[]} positions The array of type {Cartesian3} representing positions. - * @param {Number|Number[]} [height=0.0] A number or array of numbers representing the heights of each position. - * @param {Number} [granularity = CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. - * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the positions lie. + * @param {Cartesian3[]} options.positions The array of type {Cartesian3} representing positions. + * @param {Number|Number[]} [options.height=0.0] A number or array of numbers representing the heights of each position. + * @param {Number} [options.granularity = CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the positions lie. * @returns {Number[]} A new array of positions of type {Number} that have been subdivided and raised to the surface of the ellipsoid. * * @example @@ -289,10 +289,10 @@ define([ /** * Subdivides polyline and raises all points to the specified height. Returns an array of new {Cartesian3} positions. - * @param {Cartesian3[]} positions The array of type {Cartesian3} representing positions. - * @param {Number|Number[]} [height=0.0] A number or array of numbers representing the heights of each position. - * @param {Number} [granularity = CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. - * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the positions lie. + * @param {Cartesian3[]} options.positions The array of type {Cartesian3} representing positions. + * @param {Number|Number[]} [options.height=0.0] A number or array of numbers representing the heights of each position. + * @param {Number} [options.granularity = CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the positions lie. * @returns {Cartesian3[]} A new array of cartesian3 positions that have been subdivided and raised to the surface of the ellipsoid. * * @example diff --git a/Source/Core/Quaternion.js b/Source/Core/Quaternion.js index b2fa29ca2bd4..ea095baf1e23 100644 --- a/Source/Core/Quaternion.js +++ b/Source/Core/Quaternion.js @@ -301,7 +301,7 @@ define([ * * @param {Number[]} array The array previously packed for interpolation. * @param {Number[]} sourceArray The original packed array. - * @param {Number} [startingIndex=0] The startingIndex used to convert the array. + * @param {Number} [firstIndex=0] The firstIndex used to convert the array. * @param {Number} [lastIndex=packedArray.length] The lastIndex used to convert the array. * @param {Quaternion} [result] The object into which to store the result. * @returns {Quaternion} The modified result parameter or a new Quaternion instance if one was not provided. diff --git a/Source/Core/Simon1994PlanetaryPositions.js b/Source/Core/Simon1994PlanetaryPositions.js index 84cc17a037c3..1a824012333e 100644 --- a/Source/Core/Simon1994PlanetaryPositions.js +++ b/Source/Core/Simon1994PlanetaryPositions.js @@ -509,9 +509,9 @@ define([ * @param {Cartesian3} [result] The object onto which to store the result. * @returns {Cartesian3} Calculated sun position */ - Simon1994PlanetaryPositions.computeSunPositionInEarthInertialFrame= function(date, result){ - if (!defined(date)) { - date = JulianDate.now(); + Simon1994PlanetaryPositions.computeSunPositionInEarthInertialFrame= function(julianDate, result){ + if (!defined(julianDate)) { + julianDate = JulianDate.now(); } if (!defined(result)) { @@ -519,11 +519,11 @@ define([ } //first forward transformation - translation = computeSimonEarthMoonBarycenter(date, translation); + translation = computeSimonEarthMoonBarycenter(julianDate, translation); result = Cartesian3.negate(translation, result); //second forward transformation - computeSimonEarth(date, translation); + computeSimonEarth(julianDate, translation); Cartesian3.subtract(result, translation, result); Matrix3.multiplyByVector(axesTransformation, result, result); @@ -538,12 +538,12 @@ define([ * @param {Cartesian3} [result] The object onto which to store the result. * @returns {Cartesian3} Calculated moon position */ - Simon1994PlanetaryPositions.computeMoonPositionInEarthInertialFrame = function(date, result){ - if (!defined(date)) { - date = JulianDate.now(); + Simon1994PlanetaryPositions.computeMoonPositionInEarthInertialFrame = function(julianDate, result){ + if (!defined(julianDate)) { + julianDate = JulianDate.now(); } - result = computeSimonMoon(date, result); + result = computeSimonMoon(julianDate, result); Matrix3.multiplyByVector(axesTransformation, result, result); return result; diff --git a/Source/Core/Spherical.js b/Source/Core/Spherical.js index 31243a057159..b87c7c9466e7 100644 --- a/Source/Core/Spherical.js +++ b/Source/Core/Spherical.js @@ -31,7 +31,7 @@ define([ * Converts the provided Cartesian3 into Spherical coordinates. * * @param {Cartesian3} cartesian3 The Cartesian3 to be converted to Spherical. - * @param {Spherical} [spherical] The object in which the result will be stored, if undefined a new instance will be created. + * @param {Spherical} [result] The object in which the result will be stored, if undefined a new instance will be created. * @returns {Spherical} The modified result parameter, or a new instance if one was not provided. */ Spherical.fromCartesian3 = function(cartesian3, result) { diff --git a/Source/Core/TerrainMesh.js b/Source/Core/TerrainMesh.js index de2534d819c9..4c25c7990ecf 100644 --- a/Source/Core/TerrainMesh.js +++ b/Source/Core/TerrainMesh.js @@ -27,6 +27,7 @@ define([ * @param {Number} [vertexStride=6] The number of components in each vertex. * @param {OrientedBoundingBox} [orientedBoundingBox] A bounding box that completely contains the tile. * @param {TerrainEncoding} encoding Information used to decode the mesh. + * @param {Number} exaggeration The amount that this mesh was exaggerated. * * @private */ diff --git a/Source/Core/TimeIntervalCollection.js b/Source/Core/TimeIntervalCollection.js index bc1c79ebbd38..0dd6e21784aa 100644 --- a/Source/Core/TimeIntervalCollection.js +++ b/Source/Core/TimeIntervalCollection.js @@ -217,8 +217,8 @@ define([ * @param {JulianDate} julianDate The date to check. * @returns {Boolean} true if the collection contains the specified date, false otherwise. */ - TimeIntervalCollection.prototype.contains = function(date) { - return this.indexOf(date) >= 0; + TimeIntervalCollection.prototype.contains = function(julianDate) { + return this.indexOf(julianDate) >= 0; }; var indexOfScratch = new TimeInterval(); diff --git a/Source/Core/VertexFormat.js b/Source/Core/VertexFormat.js index a1709d6c3206..50a8a0c835b2 100644 --- a/Source/Core/VertexFormat.js +++ b/Source/Core/VertexFormat.js @@ -285,7 +285,7 @@ define([ /** * Duplicates a VertexFormat instance. * - * @param {VertexFormat} cartesian The vertex format to duplicate. + * @param {VertexFormat} vertexFormat The vertex format to duplicate. * @param {VertexFormat} [result] The object onto which to store the result. * @returns {VertexFormat} The modified result parameter or a new VertexFormat instance if one was not provided. (Returns undefined if vertexFormat is undefined) */ diff --git a/Source/Core/getImagePixels.js b/Source/Core/getImagePixels.js index f728c81cb164..e65f025eec84 100644 --- a/Source/Core/getImagePixels.js +++ b/Source/Core/getImagePixels.js @@ -14,6 +14,8 @@ define([ * @exports getImagePixels * * @param {Image} image The image to extract pixels from. + * @param {Number} width The width of the image. If not defined, then image.width is assigned. + * @param {Number} height The height of the image. If not defined, then image.height is assigned. * @returns {CanvasPixelArray} The pixels of the image. */ function getImagePixels(image, width, height) { diff --git a/Source/DataSources/CorridorGeometryUpdater.js b/Source/DataSources/CorridorGeometryUpdater.js index 79bf46bca8a7..839d47b534e0 100644 --- a/Source/DataSources/CorridorGeometryUpdater.js +++ b/Source/DataSources/CorridorGeometryUpdater.js @@ -243,7 +243,7 @@ define([ * Gets the property specifying whether the geometry * casts or receives shadows from each light source. * @memberof CorridorGeometryUpdater.prototype - * + * * @type {Property} * @readonly */ @@ -552,6 +552,7 @@ define([ * Creates the dynamic updater to be used when GeometryUpdater#isDynamic is true. * * @param {PrimitiveCollection} primitives The primitive collection to use. + * @param {PrimitiveCollection} groundPrimitives The ground primitives collection to use. * @returns {DynamicGeometryUpdater} The dynamic updater used to update the geometry each frame. * * @exception {DeveloperError} This instance does not represent dynamic geometry. diff --git a/Source/DataSources/CzmlDataSource.js b/Source/DataSources/CzmlDataSource.js index ebbbf8454303..48be670da28f 100644 --- a/Source/DataSources/CzmlDataSource.js +++ b/Source/DataSources/CzmlDataSource.js @@ -1852,7 +1852,7 @@ define([ /** * Creates a Promise to a new instance loaded with the provided CZML data. * - * @param {String|Object} data A url or CZML object to be processed. + * @param {String|Object} czml A url or CZML object to be processed. * @param {Object} [options] An object with the following properties: * @param {String} [options.sourceUri] Overrides the url to use for resolving relative links. * @returns {Promise.} A promise that resolves to the new instance once the data is processed. diff --git a/Source/DataSources/EllipseGeometryUpdater.js b/Source/DataSources/EllipseGeometryUpdater.js index 59176bb1004a..e47c1a4af98c 100644 --- a/Source/DataSources/EllipseGeometryUpdater.js +++ b/Source/DataSources/EllipseGeometryUpdater.js @@ -246,7 +246,7 @@ define([ * Gets the property specifying whether the geometry * casts or receives shadows from each light source. * @memberof EllipseGeometryUpdater.prototype - * + * * @type {Property} * @readonly */ @@ -566,6 +566,7 @@ define([ * Creates the dynamic updater to be used when GeometryUpdater#isDynamic is true. * * @param {PrimitiveCollection} primitives The primitive collection to use. + * @param {PrimitiveCollection} groundPrimitives The ground primitives collection to use. * @returns {DynamicGeometryUpdater} The dynamic updater used to update the geometry each frame. * * @exception {DeveloperError} This instance does not represent dynamic geometry. diff --git a/Source/DataSources/EntityView.js b/Source/DataSources/EntityView.js index e6653e3fa8d9..b8857df00372 100644 --- a/Source/DataSources/EntityView.js +++ b/Source/DataSources/EntityView.js @@ -258,7 +258,7 @@ define([ * Should be called each animation frame to update the camera * to the latest settings. * @param {JulianDate} time The current animation time. - * @param {BoundingSphere} current bounding sphere of the object. + * @param {BoundingSphere} boundingSphere bounding sphere of the object. * */ EntityView.prototype.update = function(time, boundingSphere) { diff --git a/Source/DataSources/PolygonGeometryUpdater.js b/Source/DataSources/PolygonGeometryUpdater.js index cd98be03885f..3aac6923c32e 100644 --- a/Source/DataSources/PolygonGeometryUpdater.js +++ b/Source/DataSources/PolygonGeometryUpdater.js @@ -248,7 +248,7 @@ define([ * Gets the property specifying whether the geometry * casts or receives shadows from each light source. * @memberof PolygonGeometryUpdater.prototype - * + * * @type {Property} * @readonly */ @@ -582,6 +582,7 @@ define([ * Creates the dynamic updater to be used when GeometryUpdater#isDynamic is true. * * @param {PrimitiveCollection} primitives The primitive collection to use. + * @param {PrimitiveCollection} groundPrimitives The ground primitive collection to use. * @returns {DynamicGeometryUpdater} The dynamic updater used to update the geometry each frame. * * @exception {DeveloperError} This instance does not represent dynamic geometry. @@ -663,7 +664,7 @@ define([ options.closeBottom = closeBottomValue; var shadows = this._geometryUpdater.shadowsProperty.getValue(time); - + if (Property.getValueOrDefault(polygon.fill, time, true)) { var fillMaterialProperty = geometryUpdater.fillMaterialProperty; var material = MaterialProperty.getValue(time, fillMaterialProperty, this._material); diff --git a/Source/DataSources/Rotation.js b/Source/DataSources/Rotation.js index 467690f24ddb..3f1480576cc1 100755 --- a/Source/DataSources/Rotation.js +++ b/Source/DataSources/Rotation.js @@ -124,7 +124,7 @@ define([ * * @param {Number[]} array The array previously packed for interpolation. * @param {Number[]} sourceArray The original packed array. - * @param {Number} [startingIndex=0] The startingIndex used to convert the array. + * @param {Number} [firstIndex=0] The firstIndex used to convert the array. * @param {Number} [lastIndex=packedArray.length] The lastIndex used to convert the array. * @param {Rotation} [result] The object into which to store the result. * @returns {Rotation} The modified result parameter or a new Rotation instance if one was not provided. diff --git a/Source/DataSources/SampledPositionProperty.js b/Source/DataSources/SampledPositionProperty.js index 1d9062ec7b44..d524d26d60a1 100644 --- a/Source/DataSources/SampledPositionProperty.js +++ b/Source/DataSources/SampledPositionProperty.js @@ -274,8 +274,8 @@ define([ * @param {Number[]} packedSamples The array of packed samples. * @param {JulianDate} [epoch] If any of the dates in packedSamples are numbers, they are considered an offset from this epoch, in seconds. */ - SampledPositionProperty.prototype.addSamplesPackedArray = function(data, epoch) { - this._property.addSamplesPackedArray(data, epoch); + SampledPositionProperty.prototype.addSamplesPackedArray = function(packedSamples, epoch) { + this._property.addSamplesPackedArray(packedSamples, epoch); }; /** diff --git a/Source/Renderer/Buffer.js b/Source/Renderer/Buffer.js index fc4ee4b8bc8c..edb489e7d313 100644 --- a/Source/Renderer/Buffer.js +++ b/Source/Renderer/Buffer.js @@ -145,7 +145,7 @@ define([ * @param {ArrayBufferView} [options.typedArray] A typed array containing the data to copy to the buffer. * @param {Number} [options.sizeInBytes] A Number defining the size of the buffer in bytes. Required if options.typedArray is not given. * @param {BufferUsage} options.usage Specifies the expected usage pattern of the buffer. On some GL implementations, this can significantly affect performance. See {@link BufferUsage}. - * @param {IndexDatatype} indexDatatype The datatype of indices in the buffer. + * @param {IndexDatatype} options.indexDatatype The datatype of indices in the buffer. * @returns {IndexBuffer} The index buffer, ready to be attached to a vertex array. * * @exception {DeveloperError} Must specify either or , but not both. diff --git a/Source/Renderer/ComputeCommand.js b/Source/Renderer/ComputeCommand.js index 8d0231c673bc..1eb7f2a24888 100644 --- a/Source/Renderer/ComputeCommand.js +++ b/Source/Renderer/ComputeCommand.js @@ -108,7 +108,7 @@ define([ /** * Executes the compute command. * - * @param {Context} context The context that processes the compute command. + * @param {Context} computeEngine The context that processes the compute command. */ ComputeCommand.prototype.execute = function(computeEngine) { computeEngine.execute(this); diff --git a/Source/Scene/BingMapsImageryProvider.js b/Source/Scene/BingMapsImageryProvider.js index 1aea7d05aa5b..262d2ae84cfc 100644 --- a/Source/Scene/BingMapsImageryProvider.js +++ b/Source/Scene/BingMapsImageryProvider.js @@ -554,7 +554,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - BingMapsImageryProvider.prototype.pickFeatures = function() { + BingMapsImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Scene/CameraEventAggregator.js b/Source/Scene/CameraEventAggregator.js index 05154071f1fc..78e6e7206451 100644 --- a/Source/Scene/CameraEventAggregator.js +++ b/Source/Scene/CameraEventAggregator.js @@ -252,7 +252,7 @@ define([ * @alias CameraEventAggregator * @constructor * - * @param {Canvas} [element=document] The element to handle events for. + * @param {Canvas} [canvas=document] The element to handle events for. * * @see ScreenSpaceEventHandler */ diff --git a/Source/Scene/CreditDisplay.js b/Source/Scene/CreditDisplay.js index 270a447e7d95..395512488550 100644 --- a/Source/Scene/CreditDisplay.js +++ b/Source/Scene/CreditDisplay.js @@ -270,8 +270,6 @@ define([ /** * Resets the credit display to a beginning of frame state, clearing out current credits. - * - * @param {Credit} credit The credit to display */ CreditDisplay.prototype.beginFrame = function() { this._currentFrameCredits.imageCredits.length = 0; @@ -280,8 +278,6 @@ define([ /** * Sets the credit display to the end of frame state, displaying current credits in the credit container - * - * @param {Credit} credit The credit to display */ CreditDisplay.prototype.endFrame = function() { var textCredits = this._defaultTextCredits.concat(this._currentFrameCredits.textCredits); diff --git a/Source/Scene/FrameState.js b/Source/Scene/FrameState.js index e3f87f3fcea6..02d831d35651 100644 --- a/Source/Scene/FrameState.js +++ b/Source/Scene/FrameState.js @@ -9,6 +9,7 @@ define([ * State information about the current frame. An instance of this class * is provided to update functions. * + * @param {Context} context The rendering context. * @param {CreditDisplay} creditDisplay Handles adding and removing credits from an HTML element * * @alias FrameState diff --git a/Source/Scene/GoogleEarthImageryProvider.js b/Source/Scene/GoogleEarthImageryProvider.js index 820c30cc3298..8dc4d9e283e2 100644 --- a/Source/Scene/GoogleEarthImageryProvider.js +++ b/Source/Scene/GoogleEarthImageryProvider.js @@ -95,7 +95,7 @@ define([ * url : 'https://earth.localdomain', * channel : 1008 * }); - * + * * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} */ function GoogleEarthImageryProvider(options) { @@ -568,7 +568,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - GoogleEarthImageryProvider.prototype.pickFeatures = function() { + GoogleEarthImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Scene/GridImageryProvider.js b/Source/Scene/GridImageryProvider.js index d79dc74b031d..779449aa53b0 100644 --- a/Source/Scene/GridImageryProvider.js +++ b/Source/Scene/GridImageryProvider.js @@ -37,7 +37,7 @@ define([ * @param {Color} [options.color=Color(1.0, 1.0, 1.0, 0.4)] The color to draw grid lines. * @param {Color} [options.glowColor=Color(0.0, 1.0, 0.0, 0.05)] The color to draw glow for grid lines. * @param {Number} [options.glowWidth=6] The width of lines used for rendering the line glow effect. - * @param {Color} [backgroundColor=Color(0.0, 0.5, 0.0, 0.2)] Background fill color. + * @param {Color} [options.backgroundColor=Color(0.0, 0.5, 0.0, 0.2)] Background fill color. * @param {Number} [options.tileWidth=256] The width of the tile for level-of-detail selection purposes. * @param {Number} [options.tileHeight=256] The height of the tile for level-of-detail selection purposes. * @param {Number} [options.canvasSize=256] The size of the canvas used for rendering. @@ -344,7 +344,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - GridImageryProvider.prototype.pickFeatures = function() { + GridImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Scene/ImageryLayer.js b/Source/Scene/ImageryLayer.js index 3123f580ec78..fcb16ce91a30 100644 --- a/Source/Scene/ImageryLayer.js +++ b/Source/Scene/ImageryLayer.js @@ -576,7 +576,7 @@ define([ if (!defined(clippedImageryRectangle)) { continue; } - + minV = Math.max(0.0, (clippedImageryRectangle.south - terrainRectangle.south) / terrainRectangle.height); // If this is the southern-most imagery tile mapped to this terrain tile, @@ -1059,6 +1059,7 @@ define([ /** * Gets the level with the specified world coordinate spacing between texels, or less. * + * @param {ImageryLayer} layer The imagery layer to use. * @param {Number} texelSpacing The texel spacing for which to find a corresponding level. * @param {Number} latitudeClosestToEquator The latitude closest to the equator that we're concerned with. * @returns {Number} The level with the specified texel spacing or less. diff --git a/Source/Scene/ImageryProvider.js b/Source/Scene/ImageryProvider.js index fdfa6dec444a..520fc3f0ec12 100644 --- a/Source/Scene/ImageryProvider.js +++ b/Source/Scene/ImageryProvider.js @@ -299,6 +299,7 @@ define([ * too many requests pending, this function will instead return undefined, indicating * that the request should be retried later. * + * @param {ImageryProvider} imageryProvider The imagery provider for the URL. * @param {String} url The URL of the image. * @returns {Promise.|undefined} A promise for the image that will resolve when the image is available, or * undefined if there are too many active requests to the server, and the request diff --git a/Source/Scene/Polyline.js b/Source/Scene/Polyline.js index e88365516fdf..f73352d37eca 100644 --- a/Source/Scene/Polyline.js +++ b/Source/Scene/Polyline.js @@ -41,6 +41,7 @@ define([ * @param {Cartesian3[]} [options.positions] The positions. * @param {Object} [options.id] The user-defined object to be returned when this polyline is picked. * @param {DistanceDisplayCondition} [options.distanceDisplayCondition] The condition specifying at what distance from the camera that this polyline will be displayed. + * @param {PolylineCollection} polylineCollection The renderable polyline collection. * * @see PolylineCollection * diff --git a/Source/Scene/SingleTileImageryProvider.js b/Source/Scene/SingleTileImageryProvider.js index 878b3d5ef639..b7cdcd10e2b8 100644 --- a/Source/Scene/SingleTileImageryProvider.js +++ b/Source/Scene/SingleTileImageryProvider.js @@ -401,7 +401,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - SingleTileImageryProvider.prototype.pickFeatures = function() { + SingleTileImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Scene/TileCoordinatesImageryProvider.js b/Source/Scene/TileCoordinatesImageryProvider.js index 9110d7c3dea6..35531470ac0d 100644 --- a/Source/Scene/TileCoordinatesImageryProvider.js +++ b/Source/Scene/TileCoordinatesImageryProvider.js @@ -282,7 +282,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - TileCoordinatesImageryProvider.prototype.pickFeatures = function() { + TileCoordinatesImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Scene/WebMapTileServiceImageryProvider.js b/Source/Scene/WebMapTileServiceImageryProvider.js index af3b17a23279..88650ecee7ac 100644 --- a/Source/Scene/WebMapTileServiceImageryProvider.js +++ b/Source/Scene/WebMapTileServiceImageryProvider.js @@ -89,7 +89,7 @@ define([ * credit : new Cesium.Credit('U. S. Geological Survey') * }); * viewer.imageryLayers.addImageryProvider(shadedRelief2); - * + * * @see ArcGisMapServerImageryProvider * @see BingMapsImageryProvider * @see GoogleEarthImageryProvider @@ -458,7 +458,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - WebMapTileServiceImageryProvider.prototype.pickFeatures = function() { + WebMapTileServiceImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Widgets/CesiumInspector/CesiumInspectorViewModel.js b/Source/Widgets/CesiumInspector/CesiumInspectorViewModel.js index cf787930de7b..107e0368e755 100644 --- a/Source/Widgets/CesiumInspector/CesiumInspectorViewModel.js +++ b/Source/Widgets/CesiumInspector/CesiumInspectorViewModel.js @@ -70,6 +70,7 @@ define([ * @constructor * * @param {Scene} scene The scene instance to use. + * @param {PerformanceContainer} performanceContainer The instance to use for performance container. * * @exception {DeveloperError} scene is required. */ diff --git a/Source/Widgets/Viewer/viewerPerformanceWatchdogMixin.js b/Source/Widgets/Viewer/viewerPerformanceWatchdogMixin.js index 9b6f57bd98c5..e92ec1e76385 100644 --- a/Source/Widgets/Viewer/viewerPerformanceWatchdogMixin.js +++ b/Source/Widgets/Viewer/viewerPerformanceWatchdogMixin.js @@ -20,6 +20,7 @@ define([ * @exports viewerPerformanceWatchdogMixin * * @param {Viewer} viewer The viewer instance. + * @param {Object} [options] An object with properties. * @param {String} [options.lowFrameRateMessage='This application appears to be performing poorly on your system. Please try using a different web browser or updating your video drivers.'] The * message to display when a low frame rate is detected. The message is interpeted as HTML, so make sure * it comes from a trusted source so that your application is not vulnerable to cross-site scripting attacks. diff --git a/Source/Workers/cesiumWorkerBootstrapper.js b/Source/Workers/cesiumWorkerBootstrapper.js index 955e265dfa96..d955005d42bf 100644 --- a/Source/Workers/cesiumWorkerBootstrapper.js +++ b/Source/Workers/cesiumWorkerBootstrapper.js @@ -178,8 +178,9 @@ var requirejs, require, define; /** * Constructs an error with a pointer to an URL with more information. * @param {String} id the error ID that maps to an ID on a web page. - * @param {String} message human readable error. + * @param {String} msg human readable error. * @param {Error} [err] the original error, if there is one. + * @param {RequireModules} requireModules The modules required but not found. * * @returns {Error} */ From f213644f259347c76a74c27e7fb47ab7b76dd5fa Mon Sep 17 00:00:00 2001 From: Patrick Cozzi Date: Wed, 11 Jan 2017 13:19:03 -0500 Subject: [PATCH 393/396] Merge master to master-to-3d-tiles --- .editorconfig | 12 + Apps/Sandcastle/gallery/CZML.html | 3 +- .../gallery/development/Polylines.html | 20 + .../gallery/development/Polylines.jpg | Bin 16889 -> 18837 bytes CHANGES.md | 7 + CONTRIBUTORS.md | 4 + Source/Core/BingMapsGeocoderService.js | 3 +- Source/Core/Cartesian2.js | 194 ++----- Source/Core/Cartesian4.js | 200 ++----- Source/Core/Check.js | 10 +- Source/Core/CircleGeometry.js | 10 +- Source/Core/CorridorGeometry.js | 63 ++- Source/Core/Credit.js | 2 +- Source/Core/EllipseGeometry.js | 121 +++-- Source/Core/Ellipsoid.js | 4 +- Source/Core/EllipsoidGeodesic.js | 2 + Source/Core/GeometryPipeline.js | 117 ++++- Source/Core/IntersectionTests.js | 34 +- Source/Core/Math.js | 22 +- Source/Core/Matrix2.js | 252 +++------ Source/Core/Matrix3.js | 295 ++++------- Source/Core/Matrix4.js | 491 +++++------------- Source/Core/OrientedBoundingBox.js | 1 + Source/Core/PolygonGeometry.js | 35 +- Source/Core/PolylinePipeline.js | 16 +- Source/Core/Quaternion.js | 257 +++------ Source/Core/Rectangle.js | 143 ++--- Source/Core/RectangleGeometry.js | 123 +++-- Source/Core/Simon1994PlanetaryPositions.js | 18 +- Source/Core/SphereGeometry.js | 6 +- Source/Core/SphereOutlineGeometry.js | 6 +- Source/Core/Spherical.js | 12 +- Source/Core/TerrainMesh.js | 1 + Source/Core/TimeIntervalCollection.js | 4 +- Source/Core/Transforms.js | 42 +- Source/Core/VertexFormat.js | 2 +- Source/Core/getImagePixels.js | 2 + Source/DataSources/CorridorGeometryUpdater.js | 3 +- Source/DataSources/CzmlDataSource.js | 2 +- Source/DataSources/DataSourceCollection.js | 1 + Source/DataSources/EllipseGeometryUpdater.js | 3 +- Source/DataSources/EntityView.js | 2 +- Source/DataSources/KmlDataSource.js | 2 +- Source/DataSources/ModelVisualizer.js | 7 +- Source/DataSources/PolygonGeometryUpdater.js | 5 +- Source/DataSources/Rotation.js | 2 +- Source/DataSources/SampledPositionProperty.js | 4 +- Source/Renderer/AutomaticUniforms.js | 14 + Source/Renderer/Buffer.js | 2 +- Source/Renderer/ComputeCommand.js | 2 +- Source/Renderer/UniformState.js | 25 + Source/Scene/BingMapsImageryProvider.js | 2 +- Source/Scene/CameraEventAggregator.js | 2 +- Source/Scene/CreditDisplay.js | 4 - Source/Scene/FrameState.js | 9 + Source/Scene/GoogleEarthImageryProvider.js | 4 +- Source/Scene/GridImageryProvider.js | 4 +- Source/Scene/GroundPrimitive.js | 321 ++++++------ Source/Scene/ImageryLayer.js | 3 +- Source/Scene/Material.js | 2 +- Source/Scene/Model.js | 10 +- Source/Scene/Polyline.js | 1 + Source/Scene/Scene.js | 5 + Source/Scene/SingleTileImageryProvider.js | 2 +- .../Scene/TileCoordinatesImageryProvider.js | 2 +- Source/Scene/TileImagery.js | 2 +- Source/Scene/WebMapServiceImageryProvider.js | 14 +- .../Scene/WebMapTileServiceImageryProvider.js | 4 +- .../Shaders/Builtin/Functions/octDecode.glsl | 35 +- Source/Shaders/ShadowVolumeVS.glsl | 9 +- .../CesiumInspectorViewModel.js | 1 + .../Viewer/viewerPerformanceWatchdogMixin.js | 1 + Source/Workers/cesiumWorkerBootstrapper.js | 3 +- Specs/Core/CheckSpec.js | 14 +- Specs/Core/CircleGeometrySpec.js | 2 +- Specs/Core/CorridorGeometrySpec.js | 2 +- Specs/Core/EllipseGeometrySpec.js | 2 +- Specs/Core/PolygonGeometrySpec.js | 2 +- Specs/Core/RectangleGeometrySpec.js | 2 +- Specs/Core/TransformsSpec.js | 20 +- Specs/DataSources/KmlDataSourceSpec.js | 17 + Specs/Scene/GroundPrimitiveSpec.js | 4 +- Specs/Scene/LabelCollectionSpec.js | 7 + Specs/Scene/TileImagerySpec.js | 66 +++ .../Scene/WebMapServiceImageryProviderSpec.js | 266 +++++++++- 85 files changed, 1673 insertions(+), 1779 deletions(-) create mode 100644 .editorconfig create mode 100644 Specs/Scene/TileImagerySpec.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000000..2536d66bf13a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 4 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/Apps/Sandcastle/gallery/CZML.html b/Apps/Sandcastle/gallery/CZML.html index 0cafcad8932f..5a02e79f2bbb 100644 --- a/Apps/Sandcastle/gallery/CZML.html +++ b/Apps/Sandcastle/gallery/CZML.html @@ -42,8 +42,7 @@ viewer.scene.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(-116.52, 35.02, 95000), orientation: { - heading: 6, - picth: -Cesium.Math.PI_OVER_TWO + heading: 6 } }); }); diff --git a/Apps/Sandcastle/gallery/development/Polylines.html b/Apps/Sandcastle/gallery/development/Polylines.html index 697aa0324ec8..8f55cb627d88 100644 --- a/Apps/Sandcastle/gallery/development/Polylines.html +++ b/Apps/Sandcastle/gallery/development/Polylines.html @@ -99,6 +99,26 @@ material : Cesium.Material.fromType(Cesium.Material.PolylineArrowType) }); Sandcastle.declare(localPolyline); // For highlighting on mouseover in Sandcastle. + + //Polyline using the fade material + var fadingPolyline = polylines.add({ + positions : Cesium.PolylinePipeline.generateCartesianArc({ + positions : Cesium.Cartesian3.fromDegreesArrayHeights([-75, 43, 500000, + -125, 43, 500000]) + }), + width : 5, + material : Cesium.Material.fromType(Cesium.Material.FadeType, { + repeat: false, + fadeInColor: Cesium.Color.CYAN, + fadeOutColor: Cesium.Color.CYAN.withAlpha(0), + time: new Cesium.Cartesian2(0.0, 0.0), + fadeDirection: { + x: true, + y: false + } + }) + }); + Sandcastle.declare(fadingPolyline); // For highlighting on mouseover in Sandcastle. } var viewer = new Cesium.Viewer('cesiumContainer'); diff --git a/Apps/Sandcastle/gallery/development/Polylines.jpg b/Apps/Sandcastle/gallery/development/Polylines.jpg index 85eda029f90b9f1722781bfa69ea3b6989f7f25f..cb57daf7a81dbf5134f6e832fd2909e037b35d98 100644 GIT binary patch delta 18266 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

    =I` z(^j?d7ODN4q`cSnns%NVTZ>kSS()L9nH8onpdf}FRA(a79`1xrUkyiD68tX`&NbarWwvrj1-Q$r;vPgsmQV$@E@(of(z^*9neJ@P` zmjapwO*#JU3fL5eA1xG_9+Xf8v^$rn_Rnf?=l=lJPHjGD;8{#EtY?tLPSOufX@4U| zbHHQt6`_oP95+t2CVf7cq-fa)+^vssK_5K^avu}3+v|K8t-U7{M`? zQqh(}*!3#ih*MutYaS%f{xJAOyiwtMTkCr{zjb>It>zm$k}^SlNd=D#atI@Ua--&d ziGLLI{{V|$3+--oJBxdN6lrrT5XTf4Yt%V1I}k9cGK37^H<`2z=Mek{_1Vx^S$xrSQtw0Z4nk<-cB{LLxW_D


    *&wW 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'debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -144,9 +142,7 @@ define([ */ Cartesian2.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -168,9 +164,7 @@ define([ */ Cartesian2.packArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); var length = array.length; @@ -195,9 +189,7 @@ define([ */ Cartesian2.unpackArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); var length = array.length; @@ -242,9 +234,7 @@ define([ */ Cartesian2.maximumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.max(cartesian.x, cartesian.y); @@ -258,9 +248,7 @@ define([ */ Cartesian2.minimumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.min(cartesian.x, cartesian.y); @@ -276,15 +264,9 @@ define([ */ Cartesian2.minimumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(first)) { - throw new DeveloperError('first is required.'); - } - if (!defined(second)) { - throw new DeveloperError('second is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(first, 'first'); + Check.typeOf.object(second, 'second'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); @@ -304,15 +286,9 @@ define([ */ Cartesian2.maximumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(first)) { - throw new DeveloperError('first is required.'); - } - if (!defined(second)) { - throw new DeveloperError('second is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(first, 'first'); + Check.typeOf.object(second, 'second'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.max(first.x, second.x); @@ -328,9 +304,7 @@ define([ */ Cartesian2.magnitudeSquared = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return cartesian.x * cartesian.x + cartesian.y * cartesian.y; @@ -402,12 +376,8 @@ define([ */ Cartesian2.normalize = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var magnitude = Cartesian2.magnitude(cartesian); @@ -433,12 +403,8 @@ define([ */ Cartesian2.dot = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); return left.x * right.x + left.y * right.y; @@ -454,15 +420,9 @@ define([ */ Cartesian2.multiplyComponents = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x * right.x; @@ -480,15 +440,9 @@ define([ */ Cartesian2.divideComponents = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x / right.x; @@ -506,15 +460,9 @@ define([ */ Cartesian2.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x + right.x; @@ -532,15 +480,9 @@ define([ */ Cartesian2.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x - right.x; @@ -558,15 +500,9 @@ define([ */ Cartesian2.multiplyByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x * scalar; @@ -584,15 +520,9 @@ define([ */ Cartesian2.divideByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x / scalar; @@ -609,12 +539,8 @@ define([ */ Cartesian2.negate = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = -cartesian.x; @@ -631,12 +557,8 @@ define([ */ Cartesian2.abs = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.abs(cartesian.x); @@ -656,18 +578,10 @@ define([ */ Cartesian2.lerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(start)) { - throw new DeveloperError('start is required.'); - } - if (!defined(end)) { - throw new DeveloperError('end is required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(start, 'start'); + Check.typeOf.object(end, 'end'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); Cartesian2.multiplyByScalar(end, t, lerpScratch); @@ -686,12 +600,8 @@ define([ */ Cartesian2.angleBetween = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); Cartesian2.normalize(left, angleBetweenScratch); @@ -709,12 +619,8 @@ define([ */ Cartesian2.mostOrthogonalAxis = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var f = Cartesian2.normalize(cartesian, mostOrthogonalAxisScratch); diff --git a/Source/Core/Cartesian4.js b/Source/Core/Cartesian4.js index 33627bf01915..a9c8cf13ed32 100644 --- a/Source/Core/Cartesian4.js +++ b/Source/Core/Cartesian4.js @@ -1,11 +1,13 @@ /*global define*/ define([ + './Check', './defaultValue', './defined', './DeveloperError', './freezeObject', './Math' ], function( + Check, defaultValue, defined, DeveloperError, @@ -89,9 +91,7 @@ define([ */ Cartesian4.fromColor = function(color, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(color)) { - throw new DeveloperError('color is required'); - } + Check.typeOf.object(color, 'color'); //>>includeEnd('debug'); if (!defined(result)) { return new Cartesian4(color.red, color.green, color.blue, color.alpha); @@ -145,12 +145,8 @@ define([ */ Cartesian4.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -173,9 +169,7 @@ define([ */ Cartesian4.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -199,9 +193,7 @@ define([ */ Cartesian4.packArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); var length = array.length; @@ -226,9 +218,7 @@ define([ */ Cartesian4.unpackArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); var length = array.length; @@ -273,9 +263,7 @@ define([ */ Cartesian4.maximumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.max(cartesian.x, cartesian.y, cartesian.z, cartesian.w); @@ -289,9 +277,7 @@ define([ */ Cartesian4.minimumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.min(cartesian.x, cartesian.y, cartesian.z, cartesian.w); @@ -307,15 +293,9 @@ define([ */ Cartesian4.minimumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(first)) { - throw new DeveloperError('first is required.'); - } - if (!defined(second)) { - throw new DeveloperError('second is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(first, 'first'); + Check.typeOf.object(second, 'second'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.min(first.x, second.x); @@ -336,15 +316,9 @@ define([ */ Cartesian4.maximumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(first)) { - throw new DeveloperError('first is required.'); - } - if (!defined(second)) { - throw new DeveloperError('second is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(first, 'first'); + Check.typeOf.object(second, 'second'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.max(first.x, second.x); @@ -363,9 +337,7 @@ define([ */ Cartesian4.magnitudeSquared = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return cartesian.x * cartesian.x + cartesian.y * cartesian.y + cartesian.z * cartesian.z + cartesian.w * cartesian.w; @@ -398,9 +370,8 @@ define([ */ Cartesian4.distance = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left) || !defined(right)) { - throw new DeveloperError('left and right are required.'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); Cartesian4.subtract(left, right, distanceScratch); @@ -423,9 +394,8 @@ define([ */ Cartesian4.distanceSquared = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left) || !defined(right)) { - throw new DeveloperError('left and right are required.'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); Cartesian4.subtract(left, right, distanceScratch); @@ -441,12 +411,8 @@ define([ */ Cartesian4.normalize = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var magnitude = Cartesian4.magnitude(cartesian); @@ -474,12 +440,8 @@ define([ */ Cartesian4.dot = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; @@ -495,15 +457,9 @@ define([ */ Cartesian4.multiplyComponents = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x * right.x; @@ -523,15 +479,9 @@ define([ */ Cartesian4.divideComponents = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x / right.x; @@ -551,15 +501,9 @@ define([ */ Cartesian4.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x + right.x; @@ -579,15 +523,9 @@ define([ */ Cartesian4.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x - right.x; @@ -607,15 +545,9 @@ define([ */ Cartesian4.multiplyByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x * scalar; @@ -635,15 +567,9 @@ define([ */ Cartesian4.divideByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x / scalar; @@ -662,12 +588,8 @@ define([ */ Cartesian4.negate = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = -cartesian.x; @@ -686,12 +608,8 @@ define([ */ Cartesian4.abs = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.abs(cartesian.x); @@ -713,18 +631,10 @@ define([ */ Cartesian4.lerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(start)) { - throw new DeveloperError('start is required.'); - } - if (!defined(end)) { - throw new DeveloperError('end is required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(start, 'start'); + Check.typeOf.object(end, 'end'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); Cartesian4.multiplyByScalar(end, t, lerpScratch); @@ -742,12 +652,8 @@ define([ */ Cartesian4.mostOrthogonalAxis = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var f = Cartesian4.normalize(cartesian, mostOrthogonalAxisScratch); diff --git a/Source/Core/Check.js b/Source/Core/Check.js index 5bf150dcab79..f3ce7708f2b7 100644 --- a/Source/Core/Check.js +++ b/Source/Core/Check.js @@ -1,14 +1,10 @@ /*global define*/ define([ - './defaultValue', './defined', - './DeveloperError', - './isArray' + './DeveloperError' ], function( - defaultValue, defined, - DeveloperError, - isArray) { + DeveloperError) { 'use strict'; /** @@ -140,7 +136,7 @@ define([ * @param {String} name The name of the variable being tested * @exception {DeveloperError} test must be typeof 'boolean' */ - Check.typeOf.boolean = function (test, name) { + Check.typeOf.bool = function (test, name) { if (typeof test !== 'boolean') { throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'boolean', name)); } diff --git a/Source/Core/CircleGeometry.js b/Source/Core/CircleGeometry.js index 8aa557d4c33b..1d938bb2d64e 100644 --- a/Source/Core/CircleGeometry.js +++ b/Source/Core/CircleGeometry.js @@ -68,7 +68,8 @@ define([ extrudedHeight : options.extrudedHeight, granularity : options.granularity, vertexFormat : options.vertexFormat, - stRotation : options.stRotation + stRotation : options.stRotation, + shadowVolume: options.shadowVolume }; this._ellipseGeometry = new EllipseGeometry(ellipseGeometryOptions); this._workerName = 'createCircleGeometry'; @@ -113,7 +114,8 @@ define([ vertexFormat : new VertexFormat(), stRotation : undefined, semiMajorAxis : undefined, - semiMinorAxis : undefined + semiMinorAxis : undefined, + shadowVolume: undefined }; /** @@ -133,6 +135,7 @@ define([ scratchOptions.granularity = ellipseGeometry._granularity; scratchOptions.vertexFormat = VertexFormat.clone(ellipseGeometry._vertexFormat, scratchOptions.vertexFormat); scratchOptions.stRotation = ellipseGeometry._stRotation; + scratchOptions.shadowVolume = ellipseGeometry._shadowVolume; if (!defined(result)) { scratchOptions.radius = ellipseGeometry._semiMajorAxis; @@ -173,7 +176,8 @@ define([ granularity : granularity, extrudedHeight : minHeight, height : maxHeight, - vertexFormat : VertexFormat.POSITION_ONLY + vertexFormat : VertexFormat.POSITION_ONLY, + shadowVolume: true }); }; diff --git a/Source/Core/CorridorGeometry.js b/Source/Core/CorridorGeometry.js index 4fd13ea735a9..49992368288d 100644 --- a/Source/Core/CorridorGeometry.js +++ b/Source/Core/CorridorGeometry.js @@ -561,8 +561,8 @@ define([ function computePositionsExtruded(params, vertexFormat) { var topVertexFormat = new VertexFormat({ - position : vertexFormat.positon, - normal : (vertexFormat.normal || vertexFormat.binormal), + position : vertexFormat.position, + normal : (vertexFormat.normal || vertexFormat.binormal || params.shadowVolume), tangent : vertexFormat.tangent, binormal : (vertexFormat.normal || vertexFormat.binormal), st : vertexFormat.st @@ -590,28 +590,49 @@ define([ newPositions.set(wallPositions, length * 2); attributes.position.values = newPositions; - length /= 3; + attributes = extrudedAttributes(attributes, vertexFormat); + var size = length / 3; + if (params.shadowVolume) { + var topNormals = attributes.normal.values; + length = topNormals.length; + + var extrudeNormals = new Float32Array(length * 6); + for (i = 0; i < length; i ++) { + topNormals[i] = -topNormals[i]; + } + //only get normals for bottom layer that's going to be pushed down + extrudeNormals.set(topNormals, length); //bottom face + extrudeNormals = addWallPositions(topNormals, length*4, extrudeNormals); //bottom wall + attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : extrudeNormals + }); + if (!vertexFormat.normal) { + attributes.normal = undefined; + } + } + var i; var iLength = indices.length; - var twoLength = length + length; - var newIndices = IndexDatatype.createTypedArray(newPositions.length / 3, iLength * 2 + twoLength * 3); + var twoSize = size + size; + var newIndices = IndexDatatype.createTypedArray(newPositions.length / 3, iLength * 2 + twoSize * 3); newIndices.set(indices); var index = iLength; for (i = 0; i < iLength; i += 3) { // bottom indices var v0 = indices[i]; var v1 = indices[i + 1]; var v2 = indices[i + 2]; - newIndices[index++] = v2 + length; - newIndices[index++] = v1 + length; - newIndices[index++] = v0 + length; + newIndices[index++] = v2 + size; + newIndices[index++] = v1 + size; + newIndices[index++] = v0 + size; } - attributes = extrudedAttributes(attributes, vertexFormat); var UL, LL, UR, LR; - for (i = 0; i < twoLength; i += 2) { //wall indices - UL = i + twoLength; - LL = UL + twoLength; + for (i = 0; i < twoSize; i += 2) { //wall indices + UL = i + twoSize; + LL = UL + twoSize; UR = UL + 1; LR = LL + 1; newIndices[index++] = UL; @@ -793,6 +814,7 @@ define([ this._extrudedHeight = defaultValue(options.extrudedHeight, this._height); this._cornerType = defaultValue(options.cornerType, CornerType.ROUNDED); this._granularity = defaultValue(options.granularity, CesiumMath.RADIANS_PER_DEGREE); + this._shadowVolume = defaultValue(options.shadowVolume, false); this._workerName = 'createCorridorGeometry'; this._rectangle = computeRectangle(positions, this._ellipsoid, width, this._cornerType); @@ -800,7 +822,7 @@ define([ * The number of elements used to pack the object into an array. * @type {Number} */ - this.packedLength = 1 + positions.length * Cartesian3.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 5; + this.packedLength = 1 + positions.length * Cartesian3.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 6; } /** @@ -845,7 +867,8 @@ define([ array[startingIndex++] = value._height; array[startingIndex++] = value._extrudedHeight; array[startingIndex++] = value._cornerType; - array[startingIndex] = value._granularity; + array[startingIndex++] = value._granularity; + array[startingIndex] = value._shadowVolume ? 1.0 : 0.0; return array; }; @@ -861,7 +884,8 @@ define([ height : undefined, extrudedHeight : undefined, cornerType : undefined, - granularity : undefined + granularity : undefined, + shadowVolume: undefined }; /** @@ -901,7 +925,8 @@ define([ var height = array[startingIndex++]; var extrudedHeight = array[startingIndex++]; var cornerType = array[startingIndex++]; - var granularity = array[startingIndex]; + var granularity = array[startingIndex++]; + var shadowVolume = array[startingIndex] === 1.0; if (!defined(result)) { scratchOptions.positions = positions; @@ -910,6 +935,7 @@ define([ scratchOptions.extrudedHeight = extrudedHeight; scratchOptions.cornerType = cornerType; scratchOptions.granularity = granularity; + scratchOptions.shadowVolume = shadowVolume; return new CorridorGeometry(scratchOptions); } @@ -922,6 +948,7 @@ define([ result._cornerType = cornerType; result._granularity = granularity; result._rectangle = Rectangle.clone(rectangle); + result._shadowVolume = shadowVolume; return result; }; @@ -962,6 +989,7 @@ define([ height = h; params.height = height; params.extrudedHeight = extrudedHeight; + params.shadowVolume = corridorGeometry._shadowVolume; attr = computePositionsExtruded(params, vertexFormat); } else { var computedPositions = CorridorGeometryLibrary.computePositions(params); @@ -1000,7 +1028,8 @@ define([ granularity : granularity, extrudedHeight : minHeight, height : maxHeight, - vertexFormat : VertexFormat.POSITION_ONLY + vertexFormat : VertexFormat.POSITION_ONLY, + shadowVolume: true }); }; diff --git a/Source/Core/Credit.js b/Source/Core/Credit.js index cd949480e8cd..820e20d7fb3b 100644 --- a/Source/Core/Credit.js +++ b/Source/Core/Credit.js @@ -147,7 +147,7 @@ define([ /** * Returns true if the credits are equal * - * @param {Credit} credits The credit to compare to. + * @param {Credit} credit The credit to compare to. * @returns {Boolean} true if left and right are equal, false otherwise. */ Credit.prototype.equals = function(credit) { diff --git a/Source/Core/EllipseGeometry.js b/Source/Core/EllipseGeometry.js index 59193cf043d3..3faca9185f5d 100644 --- a/Source/Core/EllipseGeometry.js +++ b/Source/Core/EllipseGeometry.js @@ -81,12 +81,15 @@ define([ var ellipsoid = options.ellipsoid; var stRotation = options.stRotation; var size = (extrude) ? positions.length / 3 * 2 : positions.length / 3; + var shadowVolume = options.shadowVolume; var textureCoordinates = (vertexFormat.st) ? new Float32Array(size * 2) : undefined; var normals = (vertexFormat.normal) ? new Float32Array(size * 3) : undefined; var tangents = (vertexFormat.tangent) ? new Float32Array(size * 3) : undefined; var binormals = (vertexFormat.binormal) ? new Float32Array(size * 3) : undefined; + var extrudeNormals = (shadowVolume) ? new Float32Array(size * 3) : undefined; + var textureCoordIndex = 0; // Raise positions to a height above the ellipsoid and compute the @@ -136,44 +139,52 @@ define([ textureCoordinates[textureCoordIndex++] = texCoordScratch.y; } - normal = ellipsoid.geodeticSurfaceNormal(position, normal); + if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal || shadowVolume) { + normal = ellipsoid.geodeticSurfaceNormal(position, normal); - if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal) { - if (vertexFormat.tangent || vertexFormat.binormal) { - tangent = Cartesian3.normalize(Cartesian3.cross(Cartesian3.UNIT_Z, normal, tangent), tangent); - Matrix3.multiplyByVector(textureMatrix, tangent, tangent); + if (shadowVolume) { + extrudeNormals[i + bottomOffset] = -normal.x; + extrudeNormals[i1 + bottomOffset] = -normal.y; + extrudeNormals[i2 + bottomOffset] = -normal.z; } - if (vertexFormat.normal) { - normals[i] = normal.x; - normals[i1] = normal.y; - normals[i2] = normal.z; - if (extrude) { - normals[i + bottomOffset] = -normal.x; - normals[i1 + bottomOffset] = -normal.y; - normals[i2 + bottomOffset] = -normal.z; + + if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal) { + if (vertexFormat.tangent || vertexFormat.binormal) { + tangent = Cartesian3.normalize(Cartesian3.cross(Cartesian3.UNIT_Z, normal, tangent), tangent); + Matrix3.multiplyByVector(textureMatrix, tangent, tangent); + } + if (vertexFormat.normal) { + normals[i] = normal.x; + normals[i1] = normal.y; + normals[i2] = normal.z; + if (extrude) { + normals[i + bottomOffset] = -normal.x; + normals[i1 + bottomOffset] = -normal.y; + normals[i2 + bottomOffset] = -normal.z; + } } - } - if (vertexFormat.tangent) { - tangents[i] = tangent.x; - tangents[i1] = tangent.y; - tangents[i2] = tangent.z; - if (extrude) { - tangents[i + bottomOffset] = -tangent.x; - tangents[i1 + bottomOffset] = -tangent.y; - tangents[i2 + bottomOffset] = -tangent.z; + if (vertexFormat.tangent) { + tangents[i] = tangent.x; + tangents[i1] = tangent.y; + tangents[i2] = tangent.z; + if (extrude) { + tangents[i + bottomOffset] = -tangent.x; + tangents[i1 + bottomOffset] = -tangent.y; + tangents[i2 + bottomOffset] = -tangent.z; + } } - } - if (vertexFormat.binormal) { - binormal = Cartesian3.normalize(Cartesian3.cross(normal, tangent, binormal), binormal); - binormals[i] = binormal.x; - binormals[i1] = binormal.y; - binormals[i2] = binormal.z; - if (extrude) { - binormals[i + bottomOffset] = binormal.x; - binormals[i1 + bottomOffset] = binormal.y; - binormals[i2 + bottomOffset] = binormal.z; + if (vertexFormat.binormal) { + binormal = Cartesian3.normalize(Cartesian3.cross(normal, tangent, binormal), binormal); + binormals[i] = binormal.x; + binormals[i1] = binormal.y; + binormals[i2] = binormal.z; + if (extrude) { + binormals[i + bottomOffset] = binormal.x; + binormals[i1 + bottomOffset] = binormal.y; + binormals[i2 + bottomOffset] = binormal.z; + } } } } @@ -229,6 +240,15 @@ define([ values : binormals }); } + + if (shadowVolume) { + attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : extrudeNormals + }); + } + return attributes; } @@ -371,6 +391,9 @@ define([ var tangents = (vertexFormat.tangent) ? new Float32Array(size * 3) : undefined; var binormals = (vertexFormat.binormal) ? new Float32Array(size * 3) : undefined; + var shadowVolume = options.shadowVolume; + var extrudeNormals = (shadowVolume) ? new Float32Array(size * 3) : undefined; + var textureCoordIndex = 0; // Raise positions to a height above the ellipsoid and compute the @@ -421,6 +444,13 @@ define([ position = ellipsoid.scaleToGeodeticSurface(position, position); extrudedPosition = Cartesian3.clone(position, scratchCartesian2); normal = ellipsoid.geodeticSurfaceNormal(position, normal); + + if (shadowVolume) { + extrudeNormals[i + length] = -normal.x; + extrudeNormals[i1 + length] = -normal.y; + extrudeNormals[i2 + length] = -normal.z; + } + var scaledNormal = Cartesian3.multiplyByScalar(normal, height, scratchCartesian4); position = Cartesian3.add(position, scaledNormal, position); scaledNormal = Cartesian3.multiplyByScalar(normal, extrudedHeight, scaledNormal); @@ -527,6 +557,15 @@ define([ values : binormals }); } + + if (shadowVolume) { + attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : extrudeNormals + }); + } + return attributes; } @@ -724,6 +763,7 @@ define([ this._vertexFormat = VertexFormat.clone(vertexFormat); this._extrudedHeight = defaultValue(extrudedHeight, height); this._extrude = extrude; + this._shadowVolume = defaultValue(options.shadowVolume, false); this._workerName = 'createEllipseGeometry'; this._rectangle = computeRectangle(this._center, this._ellipsoid, semiMajorAxis, semiMinorAxis, this._rotation); @@ -733,7 +773,7 @@ define([ * The number of elements used to pack the object into an array. * @type {Number} */ - EllipseGeometry.packedLength = Cartesian3.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 8; + EllipseGeometry.packedLength = Cartesian3.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 9; /** * Stores the provided instance into the provided array. @@ -775,7 +815,8 @@ define([ array[startingIndex++] = value._height; array[startingIndex++] = value._granularity; array[startingIndex++] = value._extrudedHeight; - array[startingIndex] = value._extrude ? 1.0 : 0.0; + array[startingIndex++] = value._extrude ? 1.0 : 0.0; + array[startingIndex] = value._shadowVolume ? 1.0 : 0.0; return array; }; @@ -794,7 +835,8 @@ define([ stRotation : undefined, height : undefined, granularity : undefined, - extrudedHeight : undefined + extrudedHeight : undefined, + shadowVolume: undefined }; /** @@ -833,7 +875,8 @@ define([ var height = array[startingIndex++]; var granularity = array[startingIndex++]; var extrudedHeight = array[startingIndex++]; - var extrude = array[startingIndex] === 1.0; + var extrude = array[startingIndex++] === 1.0; + var shadowVolume = array[startingIndex] === 1.0; if (!defined(result)) { scratchOptions.height = height; @@ -843,6 +886,7 @@ define([ scratchOptions.rotation = rotation; scratchOptions.semiMajorAxis = semiMajorAxis; scratchOptions.semiMinorAxis = semiMinorAxis; + scratchOptions.shadowVolume = shadowVolume; return new EllipseGeometry(scratchOptions); } @@ -857,6 +901,7 @@ define([ result._granularity = granularity; result._extrudedHeight = extrudedHeight; result._extrude = extrude; + result._shadowVolume = shadowVolume; result._rectangle = Rectangle.clone(rectangle); return result; @@ -890,6 +935,7 @@ define([ if (ellipseGeometry._extrude) { options.extrudedHeight = Math.min(ellipseGeometry._extrudedHeight, ellipseGeometry._height); options.height = Math.max(ellipseGeometry._extrudedHeight, ellipseGeometry._height); + options.shadowVolume = ellipseGeometry._shadowVolume; geometry = computeExtrudedEllipse(options); } else { geometry = computeEllipse(options); @@ -923,7 +969,8 @@ define([ granularity : granularity, extrudedHeight : minHeight, height : maxHeight, - vertexFormat : VertexFormat.POSITION_ONLY + vertexFormat : VertexFormat.POSITION_ONLY, + shadowVolume: true }); }; diff --git a/Source/Core/Ellipsoid.js b/Source/Core/Ellipsoid.js index deca2629e1ae..6f3eba4bcfcb 100644 --- a/Source/Core/Ellipsoid.js +++ b/Source/Core/Ellipsoid.js @@ -208,7 +208,9 @@ define([ /** * Computes an Ellipsoid from a Cartesian specifying the radii in x, y, and z directions. * - * @param {Cartesian3} [radii=Cartesian3.ZERO] The ellipsoid's radius in the x, y, and z directions. + * @param {Cartesian3} [cartesian=Cartesian3.ZERO] The ellipsoid's radius in the x, y, and z directions. + * @param {Ellipsoid} [result] The object onto which to store the result, or undefined if a new + * instance should be created. * @returns {Ellipsoid} A new Ellipsoid instance. * * @exception {DeveloperError} All radii components must be greater than or equal to zero. diff --git a/Source/Core/EllipsoidGeodesic.js b/Source/Core/EllipsoidGeodesic.js index 8db8aa6ed9b5..4a84a85b7d04 100644 --- a/Source/Core/EllipsoidGeodesic.js +++ b/Source/Core/EllipsoidGeodesic.js @@ -337,6 +337,7 @@ define([ * Provides the location of a point at the indicated portion along the geodesic. * * @param {Number} fraction The portion of the distance between the initial and final points. + * @param {Cartographic} result The object in which to store the result. * @returns {Cartographic} The location of the point along the geodesic. */ EllipsoidGeodesic.prototype.interpolateUsingFraction = function(fraction, result) { @@ -347,6 +348,7 @@ define([ * Provides the location of a point at the indicated distance along the geodesic. * * @param {Number} distance The distance from the inital point to the point of interest along the geodesic + * @param {Cartographic} result The object in which to store the result. * @returns {Cartographic} The location of the point along the geodesic. * * @exception {DeveloperError} start and end must be set before calling function interpolateUsingSurfaceDistance diff --git a/Source/Core/GeometryPipeline.js b/Source/Core/GeometryPipeline.js index c27a9dda80cd..23bbeb25a91a 100644 --- a/Source/Core/GeometryPipeline.js +++ b/Source/Core/GeometryPipeline.js @@ -282,6 +282,9 @@ define([ 'binormal', 'tangent', + // For shadow volumes + 'extrudeDirection', + // From compressing texture coordinates and normals 'compressedAttributes' ]; @@ -1343,7 +1346,7 @@ define([ var toEncode1 = new Cartesian3(); var toEncode2 = new Cartesian3(); var toEncode3 = new Cartesian3(); - + var encodeResult2 = new Cartesian2(); /** * Compresses and packs geometry normal attribute values to save memory. * @@ -1360,53 +1363,89 @@ define([ } //>>includeEnd('debug'); + var extrudeAttribute = geometry.attributes.extrudeDirection; + var i; + var numVertices; + if (defined(extrudeAttribute)) { + //only shadow volumes use extrudeDirection, and shadow volumes use vertexFormat: POSITION_ONLY so we don't need to check other attributes + var extrudeDirections = extrudeAttribute.values; + numVertices = extrudeDirections.length / 3.0; + var compressedDirections = new Float32Array(numVertices * 2); + + var i2 = 0; + for (i = 0; i < numVertices; ++i) { + Cartesian3.fromArray(extrudeDirections, i * 3.0, toEncode1); + if (Cartesian3.equals(toEncode1, Cartesian3.ZERO)) { + i2 += 2; + continue; + } + encodeResult2 = AttributeCompression.octEncodeInRange(toEncode1, 65535, encodeResult2); + compressedDirections[i2++] = encodeResult2.x; + compressedDirections[i2++] = encodeResult2.y; + } + + geometry.attributes.compressedAttributes = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 2, + values : compressedDirections + }); + delete geometry.attributes.extrudeDirection; + return geometry; + } + var normalAttribute = geometry.attributes.normal; var stAttribute = geometry.attributes.st; - if (!defined(normalAttribute) && !defined(stAttribute)) { + + var hasNormal = defined(normalAttribute); + var hasSt = defined(stAttribute); + if (!hasNormal && !hasSt) { return geometry; } var tangentAttribute = geometry.attributes.tangent; var binormalAttribute = geometry.attributes.binormal; + var hasTangent = defined(tangentAttribute); + var hasBinormal = defined(binormalAttribute); + var normals; var st; var tangents; var binormals; - if (defined(normalAttribute)) { + if (hasNormal) { normals = normalAttribute.values; } - if (defined(stAttribute)) { + if (hasSt) { st = stAttribute.values; } - if (defined(tangentAttribute)) { + if (hasTangent) { tangents = tangentAttribute.values; } - if (binormalAttribute) { + if (hasBinormal) { binormals = binormalAttribute.values; } - var length = defined(normals) ? normals.length : st.length; - var numComponents = defined(normals) ? 3.0 : 2.0; - var numVertices = length / numComponents; + var length = hasNormal ? normals.length : st.length; + var numComponents = hasNormal ? 3.0 : 2.0; + numVertices = length / numComponents; var compressedLength = numVertices; - var numCompressedComponents = defined(st) && defined(normals) ? 2.0 : 1.0; - numCompressedComponents += defined(tangents) || defined(binormals) ? 1.0 : 0.0; + var numCompressedComponents = hasSt && hasNormal ? 2.0 : 1.0; + numCompressedComponents += hasTangent || hasBinormal ? 1.0 : 0.0; compressedLength *= numCompressedComponents; var compressedAttributes = new Float32Array(compressedLength); var normalIndex = 0; - for (var i = 0; i < numVertices; ++i) { - if (defined(st)) { + for (i = 0; i < numVertices; ++i) { + if (hasSt) { Cartesian2.fromArray(st, i * 2.0, scratchCartesian2); compressedAttributes[normalIndex++] = AttributeCompression.compressTextureCoordinates(scratchCartesian2); } var index = i * 3.0; - if (defined(normals) && defined(tangents) && defined(binormals)) { + if (hasNormal && defined(tangents) && defined(binormals)) { Cartesian3.fromArray(normals, index, toEncode1); Cartesian3.fromArray(tangents, index, toEncode2); Cartesian3.fromArray(binormals, index, toEncode3); @@ -1415,17 +1454,17 @@ define([ compressedAttributes[normalIndex++] = scratchCartesian2.x; compressedAttributes[normalIndex++] = scratchCartesian2.y; } else { - if (defined(normals)) { + if (hasNormal) { Cartesian3.fromArray(normals, index, toEncode1); compressedAttributes[normalIndex++] = AttributeCompression.octEncodeFloat(toEncode1); } - if (defined(tangents)) { + if (hasTangent) { Cartesian3.fromArray(tangents, index, toEncode1); compressedAttributes[normalIndex++] = AttributeCompression.octEncodeFloat(toEncode1); } - if (defined(binormals)) { + if (hasBinormal) { Cartesian3.fromArray(binormals, index, toEncode1); compressedAttributes[normalIndex++] = AttributeCompression.octEncodeFloat(toEncode1); } @@ -1438,16 +1477,16 @@ define([ values : compressedAttributes }); - if (defined(normals)) { + if (hasNormal) { delete geometry.attributes.normal; } - if (defined(st)) { + if (hasSt) { delete geometry.attributes.st; } - if (defined(tangents)) { + if (hasTangent) { delete geometry.attributes.tangent; } - if (defined(binormals)) { + if (hasBinormal) { delete geometry.attributes.binormal; } @@ -1877,8 +1916,8 @@ define([ var s1Scratch = new Cartesian2(); var s2Scratch = new Cartesian2(); - function computeTriangleAttributes(i0, i1, i2, point, positions, normals, binormals, tangents, texCoords, currentAttributes, insertedIndex) { - if (!defined(normals) && !defined(binormals) && !defined(tangents) && !defined(texCoords)) { + function computeTriangleAttributes(i0, i1, i2, point, positions, normals, binormals, tangents, texCoords, extrudeDirections, currentAttributes, insertedIndex) { + if (!defined(normals) && !defined(binormals) && !defined(tangents) && !defined(texCoords) && !defined(extrudeDirections)) { return; } @@ -1903,6 +1942,29 @@ define([ Cartesian3.pack(normal, currentAttributes.normal.values, insertedIndex * 3); } + if (defined(extrudeDirections)) { + var d0 = Cartesian3.fromArray(extrudeDirections, i0 * 3, p0Scratch); + var d1 = Cartesian3.fromArray(extrudeDirections, i1 * 3, p1Scratch); + var d2 = Cartesian3.fromArray(extrudeDirections, i2 * 3, p2Scratch); + + Cartesian3.multiplyByScalar(d0, coords.x, d0); + Cartesian3.multiplyByScalar(d1, coords.y, d1); + Cartesian3.multiplyByScalar(d2, coords.z, d2); + + var direction; + if (!Cartesian3.equals(d0, Cartesian3.ZERO) || !Cartesian3.equals(d1, Cartesian3.ZERO) || !Cartesian3.equals(d2, Cartesian3.ZERO)) { + direction = Cartesian3.add(d0, d1, d0); + Cartesian3.add(direction, d2, direction); + Cartesian3.normalize(direction, direction); + } else { + direction = p0Scratch; + direction.x = 0; + direction.y = 0; + direction.z = 0; + } + Cartesian3.pack(direction, currentAttributes.extrudeDirection.values, insertedIndex * 3); + } + if (defined(binormals)) { var b0 = Cartesian3.fromArray(binormals, i0 * 3, p0Scratch); var b1 = Cartesian3.fromArray(binormals, i1 * 3, p1Scratch); @@ -1982,6 +2044,7 @@ define([ var binormals = (defined(attributes.binormal)) ? attributes.binormal.values : undefined; var tangents = (defined(attributes.tangent)) ? attributes.tangent.values : undefined; var texCoords = (defined(attributes.st)) ? attributes.st.values : undefined; + var extrudeDirections = (defined(attributes.extrudeDirection)) ? attributes.extrudeDirection.values : undefined; var indices = geometry.indices; var eastGeometry = copyGeometryForSplit(geometry); @@ -2035,7 +2098,7 @@ define([ } insertedIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, resultIndex < 3 ? i + resultIndex : -1, point); - computeTriangleAttributes(i0, i1, i2, point, positions, normals, binormals, tangents, texCoords, currentAttributes, insertedIndex); + computeTriangleAttributes(i0, i1, i2, point, positions, normals, binormals, tangents, texCoords, extrudeDirections, currentAttributes, insertedIndex); } } else { if (defined(result)) { @@ -2055,13 +2118,13 @@ define([ } insertedIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, i, p0); - computeTriangleAttributes(i0, i1, i2, p0, positions, normals, binormals, tangents, texCoords, currentAttributes, insertedIndex); + computeTriangleAttributes(i0, i1, i2, p0, positions, normals, binormals, tangents, texCoords, extrudeDirections, currentAttributes, insertedIndex); insertedIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, i + 1, p1); - computeTriangleAttributes(i0, i1, i2, p1, positions, normals, binormals, tangents, texCoords, currentAttributes, insertedIndex); + computeTriangleAttributes(i0, i1, i2, p1, positions, normals, binormals, tangents, texCoords, extrudeDirections, currentAttributes, insertedIndex); insertedIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, i + 2, p2); - computeTriangleAttributes(i0, i1, i2, p2, positions, normals, binormals, tangents, texCoords, currentAttributes, insertedIndex); + computeTriangleAttributes(i0, i1, i2, p2, positions, normals, binormals, tangents, texCoords, extrudeDirections, currentAttributes, insertedIndex); } } diff --git a/Source/Core/IntersectionTests.js b/Source/Core/IntersectionTests.js index e468763c9ff0..3bde8428fed3 100644 --- a/Source/Core/IntersectionTests.js +++ b/Source/Core/IntersectionTests.js @@ -5,6 +5,7 @@ define([ './defaultValue', './defined', './DeveloperError', + './Interval', './Math', './Matrix3', './QuadraticRealPolynomial', @@ -16,6 +17,7 @@ define([ defaultValue, defined, DeveloperError, + Interval, CesiumMath, Matrix3, QuadraticRealPolynomial, @@ -293,7 +295,7 @@ define([ function raySphere(ray, sphere, result) { if (!defined(result)) { - result = {}; + result = new Interval(); } var origin = ray.origin; @@ -324,8 +326,8 @@ define([ * * @param {Ray} ray The ray. * @param {BoundingSphere} sphere The sphere. - * @param {Object} [result] The result onto which to store the result. - * @returns {Object} An object with the first (start) and the second (stop) intersection scalars for points along the ray or undefined if there are no intersections. + * @param {Interval} [result] The result onto which to store the result. + * @returns {Interval} The interval containing scalar points along the ray or undefined if there are no intersections. */ IntersectionTests.raySphere = function(ray, sphere, result) { //>>includeStart('debug', pragmas.debug); @@ -355,8 +357,8 @@ define([ * @param {Cartesian3} p0 An end point of the line segment. * @param {Cartesian3} p1 The other end point of the line segment. * @param {BoundingSphere} sphere The sphere. - * @param {Object} [result] The result onto which to store the result. - * @returns {Object} An object with the first (start) and the second (stop) intersection scalars for points along the line segment or undefined if there are no intersections. + * @param {Interval} [result] The result onto which to store the result. + * @returns {Interval} The interval containing scalar points along the ray or undefined if there are no intersections. */ IntersectionTests.lineSegmentSphere = function(p0, p1, sphere, result) { //>>includeStart('debug', pragmas.debug); @@ -396,7 +398,7 @@ define([ * * @param {Ray} ray The ray. * @param {Ellipsoid} ellipsoid The ellipsoid. - * @returns {Object} An object with the first (start) and the second (stop) intersection scalars for points along the ray or undefined if there are no intersections. + * @returns {Interval} The interval containing scalar points along the ray or undefined if there are no intersections. */ IntersectionTests.rayEllipsoid = function(ray, ellipsoid) { //>>includeStart('debug', pragmas.debug); @@ -440,10 +442,7 @@ define([ var root0 = temp / w2; var root1 = difference / temp; if (root0 < root1) { - return { - start : root0, - stop : root1 - }; + return new Interval(root0, root1); } return { @@ -453,10 +452,7 @@ define([ } else { // qw2 == product. Repeated roots (2 intersections). var root = Math.sqrt(difference / w2); - return { - start : root, - stop : root - }; + return new Interval(root, root); } } else if (q2 < 1.0) { // Inside ellipsoid (2 intersections). @@ -466,19 +462,13 @@ define([ discriminant = qw * qw - product; temp = -qw + Math.sqrt(discriminant); // Positively valued. - return { - start : 0.0, - stop : temp / w2 - }; + return new Interval(0.0, temp / w2); } else { // q2 == 1.0. On ellipsoid. if (qw < 0.0) { // Looking inward. w2 = Cartesian3.magnitudeSquared(w); - return { - start : 0.0, - stop : -qw / w2 - }; + return new Interval(0.0, -qw / w2); } // qw >= 0.0. Looking outward or tangent. diff --git a/Source/Core/Math.js b/Source/Core/Math.js index 7c9952c522b5..b3bd96701bd4 100644 --- a/Source/Core/Math.js +++ b/Source/Core/Math.js @@ -486,7 +486,7 @@ define([ throw new DeveloperError('angle is required.'); } //>>includeEnd('debug'); - + return CesiumMath.clamp(angle, -1*CesiumMath.PI_OVER_TWO, CesiumMath.PI_OVER_TWO); }; @@ -496,13 +496,13 @@ define([ * @param {Number} angle in radians * @returns {Number} The angle in the range [-CesiumMath.PI, CesiumMath.PI]. */ - CesiumMath.negativePiToPi = function(x) { + CesiumMath.negativePiToPi = function(angle) { //>>includeStart('debug', pragmas.debug); - if (!defined(x)) { - throw new DeveloperError('x is required.'); + if (!defined(angle)) { + throw new DeveloperError('angle is required.'); } //>>includeEnd('debug'); - return CesiumMath.zeroToTwoPi(x + CesiumMath.PI) - CesiumMath.PI; + return CesiumMath.zeroToTwoPi(angle + CesiumMath.PI) - CesiumMath.PI; }; /** @@ -511,14 +511,14 @@ define([ * @param {Number} angle in radians * @returns {Number} The angle in the range [0, CesiumMath.TWO_PI]. */ - CesiumMath.zeroToTwoPi = function(x) { + CesiumMath.zeroToTwoPi = function(angle) { //>>includeStart('debug', pragmas.debug); - if (!defined(x)) { - throw new DeveloperError('x is required.'); + if (!defined(angle)) { + throw new DeveloperError('angle is required.'); } //>>includeEnd('debug'); - var mod = CesiumMath.mod(x, CesiumMath.TWO_PI); - if (Math.abs(mod) < CesiumMath.EPSILON14 && Math.abs(x) > CesiumMath.EPSILON14) { + var mod = CesiumMath.mod(angle, CesiumMath.TWO_PI); + if (Math.abs(mod) < CesiumMath.EPSILON14 && Math.abs(angle) > CesiumMath.EPSILON14) { return CesiumMath.TWO_PI; } return mod; @@ -592,7 +592,7 @@ define([ * @example * //Compute 7!, which is equal to 5040 * var computedFactorial = Cesium.Math.factorial(7); - * + * * @see {@link http://en.wikipedia.org/wiki/Factorial|Factorial on Wikipedia} */ CesiumMath.factorial = function(n) { diff --git a/Source/Core/Matrix2.js b/Source/Core/Matrix2.js index ead1b25b2aa8..ad6bcaa18abc 100644 --- a/Source/Core/Matrix2.js +++ b/Source/Core/Matrix2.js @@ -1,6 +1,7 @@ /*global define*/ define([ './Cartesian2', + './Check', './defaultValue', './defined', './defineProperties', @@ -8,6 +9,7 @@ define([ './freezeObject' ], function( Cartesian2, + Check, defaultValue, defined, defineProperties, @@ -57,13 +59,8 @@ define([ */ Matrix2.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -86,9 +83,7 @@ define([ */ Matrix2.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -111,18 +106,18 @@ define([ * @param {Matrix2} [result] The object onto which to store the result. * @returns {Matrix2} The modified result parameter or a new Matrix2 instance if one was not provided. (Returns undefined if matrix is undefined) */ - Matrix2.clone = function(values, result) { - if (!defined(values)) { + Matrix2.clone = function(matrix, result) { + if (!defined(matrix)) { return undefined; } if (!defined(result)) { - return new Matrix2(values[0], values[2], - values[1], values[3]); + return new Matrix2(matrix[0], matrix[2], + matrix[1], matrix[3]); } - result[0] = values[0]; - result[1] = values[1]; - result[2] = values[2]; - result[3] = values[3]; + result[0] = matrix[0]; + result[1] = matrix[1]; + result[2] = matrix[2]; + result[3] = matrix[3]; return result; }; @@ -148,9 +143,7 @@ define([ */ Matrix2.fromArray = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -175,9 +168,7 @@ define([ */ Matrix2.fromColumnMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values parameter is required'); - } + Check.defined(values, 'values'); //>>includeEnd('debug'); return Matrix2.clone(values, result); @@ -193,9 +184,7 @@ define([ */ Matrix2.fromRowMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values is required.'); - } + Check.defined(values, 'values'); //>>includeEnd('debug'); if (!defined(result)) { @@ -224,9 +213,7 @@ define([ */ Matrix2.fromScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(scale)) { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.object(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -257,9 +244,7 @@ define([ */ Matrix2.fromUniformScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (typeof scale !== 'number') { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.number(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -290,9 +275,7 @@ define([ */ Matrix2.fromRotation = function(angle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(angle)) { - throw new DeveloperError('angle is required.'); - } + Check.typeOf.number(angle, 'angle'); //>>includeEnd('debug'); var cosAngle = Math.cos(angle); @@ -320,9 +303,7 @@ define([ */ Matrix2.toArray = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); if (!defined(result)) { @@ -353,12 +334,13 @@ define([ */ Matrix2.getElementIndex = function(column, row) { //>>includeStart('debug', pragmas.debug); - if (typeof row !== 'number' || row < 0 || row > 1) { - throw new DeveloperError('row must be 0 or 1.'); - } - if (typeof column !== 'number' || column < 0 || column > 1) { - throw new DeveloperError('column must be 0 or 1.'); - } + Check.typeOf.number(row, 'row'); + Check.numeric.minimum(row, 0); + Check.numeric.maximum(row, 1); + + Check.typeOf.number(column, 'column'); + Check.numeric.minimum(column, 0); + Check.numeric.maximum(column, 1); //>>includeEnd('debug'); return column * 2 + row; @@ -376,15 +358,13 @@ define([ */ Matrix2.getColumn = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - if (typeof index !== 'number' || index < 0 || index > 1) { - throw new DeveloperError('index must be 0 or 1.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 1); + + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var startIndex = index * 2; @@ -409,18 +389,14 @@ define([ */ Matrix2.setColumn = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof index !== 'number' || index < 0 || index > 1) { - throw new DeveloperError('index must be 0 or 1.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 1); + + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix2.clone(matrix, result); @@ -442,15 +418,13 @@ define([ */ Matrix2.getRow = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - if (typeof index !== 'number' || index < 0 || index > 1) { - throw new DeveloperError('index must be 0 or 1.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 1); + + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = matrix[index]; @@ -474,18 +448,14 @@ define([ */ Matrix2.setRow = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof index !== 'number' || index < 0 || index > 1) { - throw new DeveloperError('index must be 0 or 1.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 1); + + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix2.clone(matrix, result); @@ -505,12 +475,8 @@ define([ */ Matrix2.getScale = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Cartesian2.magnitude(Cartesian2.fromElements(matrix[0], matrix[1], scratchColumn)); @@ -542,15 +508,9 @@ define([ */ Matrix2.multiply = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = left[0] * right[0] + left[2] * right[1]; @@ -575,15 +535,9 @@ define([ */ Matrix2.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] + right[0]; @@ -603,15 +557,9 @@ define([ */ Matrix2.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] - right[0]; @@ -631,15 +579,9 @@ define([ */ Matrix2.multiplyByVector = function(matrix, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = matrix[0] * cartesian.x + matrix[2] * cartesian.y; @@ -660,15 +602,9 @@ define([ */ Matrix2.multiplyByScalar = function(matrix, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0] * scalar; @@ -696,15 +632,9 @@ define([ */ Matrix2.multiplyByScale = function(matrix, scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(scale)) { - throw new DeveloperError('scale is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(scale, 'scale'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0] * scale.x; @@ -723,12 +653,8 @@ define([ */ Matrix2.negate = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = -matrix[0]; @@ -747,12 +673,8 @@ define([ */ Matrix2.transpose = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = matrix[0]; @@ -776,12 +698,8 @@ define([ */ Matrix2.abs = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = Math.abs(matrix[0]); @@ -832,9 +750,7 @@ define([ */ Matrix2.equalsEpsilon = function(left, right, epsilon) { //>>includeStart('debug', pragmas.debug); - if (typeof epsilon !== 'number') { - throw new DeveloperError('epsilon must be a number'); - } + Check.typeOf.number(epsilon, 'epsilon'); //>>includeEnd('debug'); return (left === right) || diff --git a/Source/Core/Matrix3.js b/Source/Core/Matrix3.js index 2faff37a7283..0b63e2eb9a7a 100644 --- a/Source/Core/Matrix3.js +++ b/Source/Core/Matrix3.js @@ -1,6 +1,7 @@ /*global define*/ define([ './Cartesian3', + './Check', './defaultValue', './defined', './defineProperties', @@ -9,6 +10,7 @@ define([ './Math' ], function( Cartesian3, + Check, defaultValue, defined, defineProperties, @@ -72,13 +74,8 @@ define([ */ Matrix3.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -106,9 +103,7 @@ define([ */ Matrix3.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -136,24 +131,24 @@ define([ * @param {Matrix3} [result] The object onto which to store the result. * @returns {Matrix3} The modified result parameter or a new Matrix3 instance if one was not provided. (Returns undefined if matrix is undefined) */ - Matrix3.clone = function(values, result) { - if (!defined(values)) { + Matrix3.clone = function(matrix, result) { + if (!defined(matrix)) { return undefined; } if (!defined(result)) { - return new Matrix3(values[0], values[3], values[6], - values[1], values[4], values[7], - values[2], values[5], values[8]); + return new Matrix3(matrix[0], matrix[3], matrix[6], + matrix[1], matrix[4], matrix[7], + matrix[2], matrix[5], matrix[8]); } - result[0] = values[0]; - result[1] = values[1]; - result[2] = values[2]; - result[3] = values[3]; - result[4] = values[4]; - result[5] = values[5]; - result[6] = values[6]; - result[7] = values[7]; - result[8] = values[8]; + result[0] = matrix[0]; + result[1] = matrix[1]; + result[2] = matrix[2]; + result[3] = matrix[3]; + result[4] = matrix[4]; + result[5] = matrix[5]; + result[6] = matrix[6]; + result[7] = matrix[7]; + result[8] = matrix[8]; return result; }; @@ -180,9 +175,7 @@ define([ */ Matrix3.fromArray = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -212,9 +205,7 @@ define([ */ Matrix3.fromColumnMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values parameter is required'); - } + Check.defined(values, 'values'); //>>includeEnd('debug'); return Matrix3.clone(values, result); @@ -230,9 +221,7 @@ define([ */ Matrix3.fromRowMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values is required.'); - } + Check.defined(values, 'values'); //>>includeEnd('debug'); if (!defined(result)) { @@ -261,9 +250,7 @@ define([ */ Matrix3.fromQuaternion = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); //>>includeEnd('debug'); var x2 = quaternion.x * quaternion.x; @@ -315,10 +302,9 @@ define([ */ Matrix3.fromHeadingPitchRoll = function(headingPitchRoll, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(headingPitchRoll)) { - throw new DeveloperError('headingPitchRoll is required'); - } + Check.typeOf.object(headingPitchRoll, 'headingPitchRoll'); //>>includeEnd('debug'); + var cosTheta = Math.cos(-headingPitchRoll.pitch); var cosPsi = Math.cos(-headingPitchRoll.heading); var cosPhi = Math.cos(headingPitchRoll.roll); @@ -371,9 +357,7 @@ define([ */ Matrix3.fromScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(scale)) { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.object(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -411,9 +395,7 @@ define([ */ Matrix3.fromUniformScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (typeof scale !== 'number') { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.number(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -438,7 +420,7 @@ define([ /** * Computes a Matrix3 instance representing the cross product equivalent matrix of a Cartesian3 vector. * - * @param {Cartesian3} the vector on the left hand side of the cross product operation. + * @param {Cartesian3} vector the vector on the left hand side of the cross product operation. * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created. * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided. * @@ -451,9 +433,7 @@ define([ */ Matrix3.fromCrossProduct = function(vector, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(vector)) { - throw new DeveloperError('vector is required.'); - } + Check.typeOf.object(vector, 'vector'); //>>includeEnd('debug'); if (!defined(result)) { @@ -490,9 +470,7 @@ define([ */ Matrix3.fromRotationX = function(angle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(angle)) { - throw new DeveloperError('angle is required.'); - } + Check.typeOf.number(angle, 'angle'); //>>includeEnd('debug'); var cosAngle = Math.cos(angle); @@ -533,9 +511,7 @@ define([ */ Matrix3.fromRotationY = function(angle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(angle)) { - throw new DeveloperError('angle is required.'); - } + Check.typeOf.number(angle, 'angle'); //>>includeEnd('debug'); var cosAngle = Math.cos(angle); @@ -576,9 +552,7 @@ define([ */ Matrix3.fromRotationZ = function(angle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(angle)) { - throw new DeveloperError('angle is required.'); - } + Check.typeOf.number(angle, 'angle'); //>>includeEnd('debug'); var cosAngle = Math.cos(angle); @@ -614,9 +588,7 @@ define([ */ Matrix3.toArray = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); if (!defined(result)) { @@ -652,12 +624,12 @@ define([ */ Matrix3.getElementIndex = function(column, row) { //>>includeStart('debug', pragmas.debug); - if (typeof row !== 'number' || row < 0 || row > 2) { - throw new DeveloperError('row must be 0, 1, or 2.'); - } - if (typeof column !== 'number' || column < 0 || column > 2) { - throw new DeveloperError('column must be 0, 1, or 2.'); - } + Check.typeOf.number(column, 'column'); + Check.typeOf.number(row, 'row'); + Check.numeric.minimum(row, 0); + Check.numeric.maximum(row, 2); + Check.numeric.minimum(column, 0); + Check.numeric.maximum(column, 2); //>>includeEnd('debug'); return column * 3 + row; @@ -675,16 +647,11 @@ define([ */ Matrix3.getColumn = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - - if (typeof index !== 'number' || index < 0 || index > 2) { - throw new DeveloperError('index must be 0, 1, or 2.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 2); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var startIndex = index * 3; @@ -711,18 +678,12 @@ define([ */ Matrix3.setColumn = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof index !== 'number' || index < 0 || index > 2) { - throw new DeveloperError('index must be 0, 1, or 2.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 2); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix3.clone(matrix, result); @@ -745,15 +706,11 @@ define([ */ Matrix3.getRow = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - if (typeof index !== 'number' || index < 0 || index > 2) { - throw new DeveloperError('index must be 0, 1, or 2.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 2); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = matrix[index]; @@ -779,18 +736,12 @@ define([ */ Matrix3.setRow = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof index !== 'number' || index < 0 || index > 2) { - throw new DeveloperError('index must be 0, 1, or 2.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 2); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix3.clone(matrix, result); @@ -811,12 +762,8 @@ define([ */ Matrix3.getScale = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Cartesian3.magnitude(Cartesian3.fromElements(matrix[0], matrix[1], matrix[2], scratchColumn)); @@ -849,15 +796,9 @@ define([ */ Matrix3.multiply = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = left[0] * right[0] + left[3] * right[1] + left[6] * right[2]; @@ -894,15 +835,9 @@ define([ */ Matrix3.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] + right[0]; @@ -927,15 +862,9 @@ define([ */ Matrix3.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] - right[0]; @@ -960,15 +889,9 @@ define([ */ Matrix3.multiplyByVector = function(matrix, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var vX = cartesian.x; @@ -995,15 +918,9 @@ define([ */ Matrix3.multiplyByScalar = function(matrix, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar must be a number'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0] * scalar; @@ -1036,15 +953,9 @@ define([ */ Matrix3.multiplyByScale = function(matrix, scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(scale)) { - throw new DeveloperError('scale is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(scale, 'scale'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0] * scale.x; @@ -1068,12 +979,8 @@ define([ */ Matrix3.negate = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = -matrix[0]; @@ -1097,12 +1004,8 @@ define([ */ Matrix3.transpose = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = matrix[0]; @@ -1244,9 +1147,7 @@ define([ */ Matrix3.computeEigenDecomposition = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); // This routine was created based upon Matrix Computations, 3rd ed., by Golub and Van Loan, @@ -1292,12 +1193,8 @@ define([ */ Matrix3.abs = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = Math.abs(matrix[0]); @@ -1321,9 +1218,7 @@ define([ */ Matrix3.determinant = function(matrix) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); var m11 = matrix[0]; @@ -1350,12 +1245,8 @@ define([ */ Matrix3.inverse = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var m11 = matrix[0]; @@ -1425,9 +1316,7 @@ define([ */ Matrix3.equalsEpsilon = function(left, right, epsilon) { //>>includeStart('debug', pragmas.debug); - if (typeof epsilon !== 'number') { - throw new DeveloperError('epsilon must be a number'); - } + Check.typeOf.number(epsilon, 'epsilon'); //>>includeEnd('debug'); return (left === right) || diff --git a/Source/Core/Matrix4.js b/Source/Core/Matrix4.js index 53ed1241f682..0ea3319be262 100644 --- a/Source/Core/Matrix4.js +++ b/Source/Core/Matrix4.js @@ -2,6 +2,7 @@ define([ './Cartesian3', './Cartesian4', + './Check', './defaultValue', './defined', './defineProperties', @@ -13,6 +14,7 @@ define([ ], function( Cartesian3, Cartesian4, + Check, defaultValue, defined, defineProperties, @@ -104,13 +106,8 @@ define([ */ Matrix4.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -145,9 +142,7 @@ define([ */ Matrix4.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -245,9 +240,7 @@ define([ */ Matrix4.fromColumnMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values is required'); - } + Check.defined(values, 'values'); //>>includeEnd('debug'); return Matrix4.clone(values, result); @@ -263,9 +256,7 @@ define([ */ Matrix4.fromRowMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values is required.'); - } + Check.defined(values, 'values'); //>>includeEnd('debug'); if (!defined(result)) { @@ -304,9 +295,7 @@ define([ */ Matrix4.fromRotationTranslation = function(rotation, translation, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rotation)) { - throw new DeveloperError('rotation is required.'); - } + Check.typeOf.object(rotation, 'rotation'); //>>includeEnd('debug'); translation = defaultValue(translation, Cartesian3.ZERO); @@ -356,15 +345,9 @@ define([ */ Matrix4.fromTranslationQuaternionRotationScale = function(translation, rotation, scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(translation)) { - throw new DeveloperError('translation is required.'); - } - if (!defined(rotation)) { - throw new DeveloperError('rotation is required.'); - } - if (!defined(scale)) { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.object(translation, 'translation'); + Check.typeOf.object(rotation, 'rotation'); + Check.typeOf.object(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -427,9 +410,7 @@ define([ */ Matrix4.fromTranslationRotationScale = function(translationRotationScale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(translationRotationScale)) { - throw new DeveloperError('translationRotationScale is required.'); - } + Check.typeOf.object(translationRotationScale, 'translationRotationScale'); //>>includeEnd('debug'); return Matrix4.fromTranslationQuaternionRotationScale(translationRotationScale.translation, translationRotationScale.rotation, translationRotationScale.scale, result); @@ -446,9 +427,7 @@ define([ */ Matrix4.fromTranslation = function(translation, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(translation)) { - throw new DeveloperError('translation is required.'); - } + Check.typeOf.object(translation, 'translation'); //>>includeEnd('debug'); return Matrix4.fromRotationTranslation(Matrix3.IDENTITY, translation, result); @@ -471,9 +450,7 @@ define([ */ Matrix4.fromScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(scale)) { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.object(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -520,9 +497,7 @@ define([ */ Matrix4.fromUniformScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (typeof scale !== 'number') { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.number(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -564,9 +539,7 @@ define([ */ Matrix4.fromCamera = function(camera, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(camera)) { - throw new DeveloperError('camera is required.'); - } + Check.typeOf.object(camera, 'camera'); //>>includeEnd('debug'); var position = camera.position; @@ -574,15 +547,9 @@ define([ var up = camera.up; //>>includeStart('debug', pragmas.debug); - if (!defined(position)) { - throw new DeveloperError('camera.position is required.'); - } - if (!defined(direction)) { - throw new DeveloperError('camera.direction is required.'); - } - if (!defined(up)) { - throw new DeveloperError('camera.up is required.'); - } + Check.typeOf.object(position, 'camera.position'); + Check.typeOf.object(direction, 'camera.direction'); + Check.typeOf.object(up, 'camera.up'); //>>includeEnd('debug'); Cartesian3.normalize(direction, fromCameraF); @@ -675,9 +642,7 @@ define([ if (far <= 0.0) { throw new DeveloperError('far must be greater than zero.'); } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var bottom = Math.tan(fovY * 0.5); @@ -720,27 +685,13 @@ define([ */ Matrix4.computeOrthographicOffCenter = function(left, right, bottom, top, near, far, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required.'); - } - if (!defined(right)) { - throw new DeveloperError('right is required.'); - } - if (!defined(bottom)) { - throw new DeveloperError('bottom is required.'); - } - if (!defined(top)) { - throw new DeveloperError('top is required.'); - } - if (!defined(near)) { - throw new DeveloperError('near is required.'); - } - if (!defined(far)) { - throw new DeveloperError('far is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.number(left, 'left'); + Check.typeOf.number(right, 'right'); + Check.typeOf.number(bottom, 'bottom'); + Check.typeOf.number(top, 'top'); + Check.typeOf.number(near, 'near'); + Check.typeOf.number(far, 'far'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var a = 1.0 / (right - left); @@ -787,27 +738,13 @@ define([ */ Matrix4.computePerspectiveOffCenter = function(left, right, bottom, top, near, far, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required.'); - } - if (!defined(right)) { - throw new DeveloperError('right is required.'); - } - if (!defined(bottom)) { - throw new DeveloperError('bottom is required.'); - } - if (!defined(top)) { - throw new DeveloperError('top is required.'); - } - if (!defined(near)) { - throw new DeveloperError('near is required.'); - } - if (!defined(far)) { - throw new DeveloperError('far is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.number(left, 'left'); + Check.typeOf.number(right, 'right'); + Check.typeOf.number(bottom, 'bottom'); + Check.typeOf.number(top, 'top'); + Check.typeOf.number(near, 'near'); + Check.typeOf.number(far, 'far'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = 2.0 * near / (right - left); @@ -850,24 +787,12 @@ define([ */ Matrix4.computeInfinitePerspectiveOffCenter = function(left, right, bottom, top, near, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required.'); - } - if (!defined(right)) { - throw new DeveloperError('right is required.'); - } - if (!defined(bottom)) { - throw new DeveloperError('bottom is required.'); - } - if (!defined(top)) { - throw new DeveloperError('top is required.'); - } - if (!defined(near)) { - throw new DeveloperError('near is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.number(left, 'left'); + Check.typeOf.number(right, 'right'); + Check.typeOf.number(bottom, 'bottom'); + Check.typeOf.number(top, 'top'); + Check.typeOf.number(near, 'near'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = 2.0 * near / (right - left); @@ -917,9 +842,7 @@ define([ */ Matrix4.computeViewportTransformation = function(viewport, nearDepthRange, farDepthRange, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); viewport = defaultValue(viewport, defaultValue.EMPTY_OBJECT); @@ -973,21 +896,11 @@ define([ */ Matrix4.computeView = function(position, direction, up, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(position)) { - throw new DeveloperError('position is required'); - } - if (!defined(direction)) { - throw new DeveloperError('direction is required'); - } - if (!defined(up)) { - throw new DeveloperError('up is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(position, 'position'); + Check.typeOf.object(direction, 'direction'); + Check.typeOf.object(up, 'up'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = right.x; @@ -1030,9 +943,7 @@ define([ */ Matrix4.toArray = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); if (!defined(result)) { @@ -1078,12 +989,13 @@ define([ */ Matrix4.getElementIndex = function(column, row) { //>>includeStart('debug', pragmas.debug); - if (typeof row !== 'number' || row < 0 || row > 3) { - throw new DeveloperError('row must be 0, 1, 2, or 3.'); - } - if (typeof column !== 'number' || column < 0 || column > 3) { - throw new DeveloperError('column must be 0, 1, 2, or 3.'); - } + Check.typeOf.number(row, 'row'); + Check.numeric.minimum(row, 0); + Check.numeric.maximum(row, 3); + + Check.typeOf.number(column, 'column'); + Check.numeric.minimum(column, 0); + Check.numeric.maximum(column, 3); //>>includeEnd('debug'); return column * 4 + row; @@ -1118,16 +1030,13 @@ define([ */ Matrix4.getColumn = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } + Check.typeOf.object(matrix, 'matrix'); - if (typeof index !== 'number' || index < 0 || index > 3) { - throw new DeveloperError('index must be 0, 1, 2, or 3.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 3); + + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var startIndex = index * 4; @@ -1171,18 +1080,14 @@ define([ */ Matrix4.setColumn = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof index !== 'number' || index < 0 || index > 3) { - throw new DeveloperError('index must be 0, 1, 2, or 3.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 3); + + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix4.clone(matrix, result); @@ -1205,15 +1110,9 @@ define([ */ Matrix4.setTranslation = function(matrix, translation, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(translation)) { - throw new DeveloperError('translation is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(translation, 'translation'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0]; @@ -1268,16 +1167,13 @@ define([ */ Matrix4.getRow = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } + Check.typeOf.object(matrix, 'matrix'); - if (typeof index !== 'number' || index < 0 || index > 3) { - throw new DeveloperError('index must be 0, 1, 2, or 3.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 3); + + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = matrix[index]; @@ -1320,18 +1216,14 @@ define([ */ Matrix4.setRow = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof index !== 'number' || index < 0 || index > 3) { - throw new DeveloperError('index must be 0, 1, 2, or 3.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 3); + + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix4.clone(matrix, result); @@ -1353,12 +1245,8 @@ define([ */ Matrix4.getScale = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Cartesian3.magnitude(Cartesian3.fromElements(matrix[0], matrix[1], matrix[2], scratchColumn)); @@ -1392,15 +1280,9 @@ define([ */ Matrix4.multiply = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var left0 = left[0]; @@ -1486,15 +1368,9 @@ define([ */ Matrix4.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] + right[0]; @@ -1526,15 +1402,9 @@ define([ */ Matrix4.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] - right[0]; @@ -1577,15 +1447,9 @@ define([ */ Matrix4.multiplyTransformation = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var left0 = left[0]; @@ -1665,15 +1529,9 @@ define([ */ Matrix4.multiplyByMatrix3 = function(matrix, rotation, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(rotation)) { - throw new DeveloperError('rotation is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(rotation, 'rotation'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var left0 = matrix[0]; @@ -1743,15 +1601,9 @@ define([ */ Matrix4.multiplyByTranslation = function(matrix, translation, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(translation)) { - throw new DeveloperError('translation is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(translation, 'translation'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = translation.x; @@ -1805,15 +1657,9 @@ define([ */ Matrix4.multiplyByUniformScale = function(matrix, scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (typeof scale !== 'number') { - throw new DeveloperError('scale is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(scale, 'scale'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); uniformScaleScratch.x = scale; @@ -1844,15 +1690,9 @@ define([ */ Matrix4.multiplyByScale = function(matrix, scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(scale)) { - throw new DeveloperError('scale is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(scale, 'scale'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var scaleX = scale.x; @@ -1893,15 +1733,9 @@ define([ */ Matrix4.multiplyByVector = function(matrix, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var vX = cartesian.x; @@ -1939,15 +1773,9 @@ define([ */ Matrix4.multiplyByPointAsVector = function(matrix, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var vX = cartesian.x; @@ -1979,16 +1807,9 @@ define([ */ Matrix4.multiplyByPoint = function(matrix, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var vX = cartesian.x; @@ -2030,15 +1851,9 @@ define([ */ Matrix4.multiplyByScalar = function(matrix, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar must be a number'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0] * scalar; @@ -2084,12 +1899,8 @@ define([ */ Matrix4.negate = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = -matrix[0]; @@ -2135,12 +1946,8 @@ define([ */ Matrix4.transpose = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var matrix1 = matrix[1]; @@ -2178,12 +1985,8 @@ define([ */ Matrix4.abs = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = Math.abs(matrix[0]); @@ -2299,9 +2102,7 @@ define([ */ Matrix4.equalsEpsilon = function(left, right, epsilon) { //>>includeStart('debug', pragmas.debug); - if (typeof epsilon !== 'number') { - throw new DeveloperError('epsilon must be a number'); - } + Check.typeOf.number(epsilon, 'epsilon'); //>>includeEnd('debug'); return (left === right) || @@ -2334,12 +2135,8 @@ define([ */ Matrix4.getTranslation = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = matrix[12]; @@ -2372,12 +2169,8 @@ define([ */ Matrix4.getRotation = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0]; @@ -2411,12 +2204,8 @@ define([ */ Matrix4.inverse = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); // Special case for a zero scale matrix that can occur, for example, @@ -2556,12 +2345,8 @@ define([ */ Matrix4.inverseTransformation = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); //This function is an optimized version of the below 4 lines. diff --git a/Source/Core/OrientedBoundingBox.js b/Source/Core/OrientedBoundingBox.js index 15c6b332ee08..53e0f48e28ee 100644 --- a/Source/Core/OrientedBoundingBox.js +++ b/Source/Core/OrientedBoundingBox.js @@ -199,6 +199,7 @@ define([ /** * Computes an OrientedBoundingBox given extents in the east-north-up space of the tangent plane. * + * @param {Plane} tangentPlane The tangent place corresponding to east-north-up. * @param {Number} minimumX Minimum X extent in tangent plane space. * @param {Number} maximumX Maximum X extent in tangent plane space. * @param {Number} minimumY Minimum Y extent in tangent plane space. diff --git a/Source/Core/PolygonGeometry.js b/Source/Core/PolygonGeometry.js index f8276fa5880b..44c569bde91d 100644 --- a/Source/Core/PolygonGeometry.js +++ b/Source/Core/PolygonGeometry.js @@ -123,7 +123,8 @@ define([ function computeAttributes(options) { var vertexFormat = options.vertexFormat; var geometry = options.geometry; - if (vertexFormat.st || vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal) { + var shadowVolume = options.shadowVolume; + if (vertexFormat.st || vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal || shadowVolume) { // PERFORMANCE_IDEA: Compute before subdivision, then just interpolate during subdivision. // PERFORMANCE_IDEA: Compute with createGeometryFromPositions() for fast path when there's no holes. var boundingRectangle = options.boundingRectangle; @@ -153,6 +154,7 @@ define([ } var tangents = vertexFormat.tangent ? new Float32Array(length) : undefined; var binormals = vertexFormat.binormal ? new Float32Array(length) : undefined; + var extrudeNormals = shadowVolume ? new Float32Array(length) : undefined; var textureCoordIndex = 0; var attrIndex = 0; @@ -198,7 +200,7 @@ define([ textureCoordIndex += 2; } - if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal) { + if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal || shadowVolume) { var attrIndex1 = attrIndex + 1; var attrIndex2 = attrIndex + 2; @@ -266,6 +268,15 @@ define([ } } + if (shadowVolume) { + if (wall) { + normal = ellipsoid.geodeticSurfaceNormal(position, normal); + } + extrudeNormals[attrIndex + bottomOffset] = -normal.x; + extrudeNormals[attrIndex1 + bottomOffset] = -normal.y; + extrudeNormals[attrIndex2 + bottomOffset] = -normal.z; + } + if (vertexFormat.tangent) { if (options.wall) { tangents[attrIndex + bottomOffset] = tangent.x; @@ -343,6 +354,14 @@ define([ values : binormals }); } + + if (shadowVolume) { + geometry.attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : extrudeNormals + }); + } } return geometry; } @@ -365,13 +384,13 @@ define([ if (closeTop && closeBottom) { var topBottomPositions = edgePoints.concat(edgePoints); + numPositions = topBottomPositions.length / 3; newIndices = IndexDatatype.createTypedArray(numPositions, indices.length * 2); newIndices.set(indices); var ilength = indices.length; - var length = numPositions / 2; for (i = 0; i < ilength; i += 3) { @@ -579,6 +598,7 @@ define([ this._closeBottom = defaultValue(options.closeBottom, true); this._polygonHierarchy = polygonHierarchy; this._perPositionHeight = perPositionHeight; + this._shadowVolume = defaultValue(options.shadowVolume, false); this._workerName = 'createPolygonGeometry'; var positions = polygonHierarchy.positions; @@ -592,7 +612,7 @@ define([ * The number of elements used to pack the object into an array. * @type {Number} */ - this.packedLength = PolygonGeometryLibrary.computeHierarchyPackedLength(polygonHierarchy) + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 9; + this.packedLength = PolygonGeometryLibrary.computeHierarchyPackedLength(polygonHierarchy) + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 10; } /** @@ -693,6 +713,7 @@ define([ array[startingIndex++] = value._perPositionHeight ? 1.0 : 0.0; array[startingIndex++] = value._closeTop ? 1.0 : 0.0; array[startingIndex++] = value._closeBottom ? 1.0 : 0.0; + array[startingIndex++] = value._shadowVolume ? 1.0 : 0.0; array[startingIndex] = value.packedLength; return array; @@ -744,6 +765,7 @@ define([ var perPositionHeight = array[startingIndex++] === 1.0; var closeTop = array[startingIndex++] === 1.0; var closeBottom = array[startingIndex++] === 1.0; + var shadowVolume = array[startingIndex++] === 1.0; var packedLength = array[startingIndex]; if (!defined(result)) { @@ -762,6 +784,7 @@ define([ result._closeTop = closeTop; result._closeBottom = closeBottom; result._rectangle = Rectangle.clone(rectangle); + result._shadowVolume = shadowVolume; result.packedLength = packedLength; return result; }; @@ -824,6 +847,7 @@ define([ if (extrude) { options.top = closeTop; options.bottom = closeBottom; + options.shadowVolume = polygonGeometry._shadowVolume; for (i = 0; i < polygons.length; i++) { geometry = createGeometryFromPositionsExtruded(ellipsoid, polygons[i], granularity, hierarchy[i], perPositionHeight, closeTop, closeBottom, vertexFormat); @@ -904,7 +928,8 @@ define([ perPositionHeight : false, extrudedHeight : minHeight, height : maxHeight, - vertexFormat : VertexFormat.POSITION_ONLY + vertexFormat : VertexFormat.POSITION_ONLY, + shadowVolume: true }); }; diff --git a/Source/Core/PolylinePipeline.js b/Source/Core/PolylinePipeline.js index 99422e918513..51f642a88fd8 100644 --- a/Source/Core/PolylinePipeline.js +++ b/Source/Core/PolylinePipeline.js @@ -202,10 +202,10 @@ define([ /** * Subdivides polyline and raises all points to the specified height. Returns an array of numbers to represent the positions. - * @param {Cartesian3[]} positions The array of type {Cartesian3} representing positions. - * @param {Number|Number[]} [height=0.0] A number or array of numbers representing the heights of each position. - * @param {Number} [granularity = CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. - * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the positions lie. + * @param {Cartesian3[]} options.positions The array of type {Cartesian3} representing positions. + * @param {Number|Number[]} [options.height=0.0] A number or array of numbers representing the heights of each position. + * @param {Number} [options.granularity = CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the positions lie. * @returns {Number[]} A new array of positions of type {Number} that have been subdivided and raised to the surface of the ellipsoid. * * @example @@ -289,10 +289,10 @@ define([ /** * Subdivides polyline and raises all points to the specified height. Returns an array of new {Cartesian3} positions. - * @param {Cartesian3[]} positions The array of type {Cartesian3} representing positions. - * @param {Number|Number[]} [height=0.0] A number or array of numbers representing the heights of each position. - * @param {Number} [granularity = CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. - * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the positions lie. + * @param {Cartesian3[]} options.positions The array of type {Cartesian3} representing positions. + * @param {Number|Number[]} [options.height=0.0] A number or array of numbers representing the heights of each position. + * @param {Number} [options.granularity = CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the positions lie. * @returns {Cartesian3[]} A new array of cartesian3 positions that have been subdivided and raised to the surface of the ellipsoid. * * @example diff --git a/Source/Core/Quaternion.js b/Source/Core/Quaternion.js index bef64c819ff8..ea095baf1e23 100644 --- a/Source/Core/Quaternion.js +++ b/Source/Core/Quaternion.js @@ -1,6 +1,7 @@ /*global define*/ define([ './Cartesian3', + './Check', './defaultValue', './defined', './DeveloperError', @@ -10,6 +11,7 @@ define([ './Matrix3' ], function( Cartesian3, + Check, defaultValue, defined, DeveloperError, @@ -73,12 +75,8 @@ define([ */ Quaternion.fromAxisAngle = function(axis, angle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(axis)) { - throw new DeveloperError('axis is required.'); - } - if (typeof angle !== 'number') { - throw new DeveloperError('angle is required and must be a number.'); - } + Check.typeOf.object(axis, 'axis'); + Check.typeOf.number(angle, 'angle'); //>>includeEnd('debug'); var halfAngle = angle / 2.0; @@ -112,9 +110,7 @@ define([ */ Quaternion.fromRotationMatrix = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); var root; @@ -190,15 +186,9 @@ define([ */ Quaternion.fromHeadingPitchRoll = function(heading, pitch, roll, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(heading)) { - throw new DeveloperError('heading is required.'); - } - if (!defined(pitch)) { - throw new DeveloperError('pitch is required.'); - } - if (!defined(roll)) { - throw new DeveloperError('roll is required.'); - } + Check.typeOf.number(heading, 'heading'); + Check.typeOf.number(pitch, 'pitch'); + Check.typeOf.number(roll, 'roll'); //>>includeEnd('debug'); var rollQuaternion = Quaternion.fromAxisAngle(Cartesian3.UNIT_X, roll, scratchHPRQuaternion); @@ -231,13 +221,8 @@ define([ */ Quaternion.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -260,9 +245,7 @@ define([ */ Quaternion.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -318,7 +301,7 @@ define([ * * @param {Number[]} array The array previously packed for interpolation. * @param {Number[]} sourceArray The original packed array. - * @param {Number} [startingIndex=0] The startingIndex used to convert the array. + * @param {Number} [firstIndex=0] The firstIndex used to convert the array. * @param {Number} [lastIndex=packedArray.length] The lastIndex used to convert the array. * @param {Quaternion} [result] The object into which to store the result. * @returns {Quaternion} The modified result parameter or a new Quaternion instance if one was not provided. @@ -373,12 +356,8 @@ define([ */ Quaternion.conjugate = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = -quaternion.x; @@ -396,9 +375,7 @@ define([ */ Quaternion.magnitudeSquared = function(quaternion) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); //>>includeEnd('debug'); return quaternion.x * quaternion.x + quaternion.y * quaternion.y + quaternion.z * quaternion.z + quaternion.w * quaternion.w; @@ -423,9 +400,7 @@ define([ */ Quaternion.normalize = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var inverseMagnitude = 1.0 / Quaternion.magnitude(quaternion); @@ -450,9 +425,7 @@ define([ */ Quaternion.inverse = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var magnitudeSquared = Quaternion.magnitudeSquared(quaternion); @@ -470,15 +443,9 @@ define([ */ Quaternion.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x + right.x; @@ -498,15 +465,9 @@ define([ */ Quaternion.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x - right.x; @@ -525,12 +486,8 @@ define([ */ Quaternion.negate = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = -quaternion.x; @@ -549,12 +506,8 @@ define([ */ Quaternion.dot = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; @@ -570,15 +523,9 @@ define([ */ Quaternion.multiply = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var leftX = left.x; @@ -613,15 +560,9 @@ define([ */ Quaternion.multiplyByScalar = function(quaternion, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = quaternion.x * scalar; @@ -641,15 +582,9 @@ define([ */ Quaternion.divideByScalar = function(quaternion, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = quaternion.x / scalar; @@ -668,12 +603,8 @@ define([ */ Quaternion.computeAxis = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var w = quaternion.w; @@ -698,9 +629,7 @@ define([ */ Quaternion.computeAngle = function(quaternion) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); //>>includeEnd('debug'); if (Math.abs(quaternion.w - 1.0) < CesiumMath.EPSILON6) { @@ -721,18 +650,10 @@ define([ */ Quaternion.lerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(start)) { - throw new DeveloperError('start is required.'); - } - if (!defined(end)) { - throw new DeveloperError('end is required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(start, 'start'); + Check.typeOf.object(end, 'end'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); lerpScratch = Quaternion.multiplyByScalar(end, t, lerpScratch); @@ -756,18 +677,10 @@ define([ */ Quaternion.slerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(start)) { - throw new DeveloperError('start is required.'); - } - if (!defined(end)) { - throw new DeveloperError('end is required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(start, 'start'); + Check.typeOf.object(end, 'end'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var dot = Quaternion.dot(start, end); @@ -802,12 +715,8 @@ define([ */ Quaternion.log = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var theta = CesiumMath.acosClamped(quaternion.w); @@ -829,12 +738,8 @@ define([ */ Quaternion.exp = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var theta = Cartesian3.magnitude(cartesian); @@ -871,12 +776,10 @@ define([ */ Quaternion.computeInnerQuadrangle = function(q0, q1, q2, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(q0) || !defined(q1) || !defined(q2)) { - throw new DeveloperError('q0, q1, and q2 are required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(q0, 'q0'); + Check.typeOf.object(q1, 'q1'); + Check.typeOf.object(q2, 'q2'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var qInv = Quaternion.conjugate(q1, squadScratchQuaternion0); @@ -920,15 +823,12 @@ define([ */ Quaternion.squad = function(q0, q1, s0, s1, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(q0) || !defined(q1) || !defined(s0) || !defined(s1)) { - throw new DeveloperError('q0, q1, s0, and s1 are required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(q0, 'q0'); + Check.typeOf.object(q1, 'q1'); + Check.typeOf.object(s0, 's0'); + Check.typeOf.object(s1, 's1'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var slerp0 = Quaternion.slerp(q0, q1, t, squadScratchQuaternion0); @@ -967,18 +867,10 @@ define([ */ Quaternion.fastSlerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(start)) { - throw new DeveloperError('start is required.'); - } - if (!defined(end)) { - throw new DeveloperError('end is required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(start, 'start'); + Check.typeOf.object(end, 'end'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = Quaternion.dot(start, end); @@ -1029,15 +921,12 @@ define([ */ Quaternion.fastSquad = function(q0, q1, s0, s1, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(q0) || !defined(q1) || !defined(s0) || !defined(s1)) { - throw new DeveloperError('q0, q1, s0, and s1 are required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(q0, 'q0'); + Check.typeOf.object(q1, 'q1'); + Check.typeOf.object(s0, 's0'); + Check.typeOf.object(s1, 's1'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var slerp0 = Quaternion.fastSlerp(q0, q1, t, squadScratchQuaternion0); @@ -1075,9 +964,7 @@ define([ */ Quaternion.equalsEpsilon = function(left, right, epsilon) { //>>includeStart('debug', pragmas.debug); - if (typeof epsilon !== 'number') { - throw new DeveloperError('epsilon is required and must be a number.'); - } + Check.typeOf.number(epsilon, 'epsilon'); //>>includeEnd('debug'); return (left === right) || diff --git a/Source/Core/Rectangle.js b/Source/Core/Rectangle.js index e8b8ea1d1888..bc6a5df3e041 100644 --- a/Source/Core/Rectangle.js +++ b/Source/Core/Rectangle.js @@ -1,6 +1,7 @@ /*global define*/ define([ './Cartographic', + './Check', './defaultValue', './defined', './defineProperties', @@ -10,6 +11,7 @@ define([ './Math' ], function( Cartographic, + Check, defaultValue, defined, defineProperties, @@ -107,13 +109,8 @@ define([ */ Rectangle.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -136,9 +133,7 @@ define([ */ Rectangle.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -161,9 +156,7 @@ define([ */ Rectangle.computeWidth = function(rectangle) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); var east = rectangle.east; var west = rectangle.west; @@ -180,9 +173,7 @@ define([ */ Rectangle.computeHeight = function(rectangle) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); return rectangle.north - rectangle.south; }; @@ -227,9 +218,7 @@ define([ */ Rectangle.fromCartographicArray = function(cartographics, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartographics)) { - throw new DeveloperError('cartographics is required.'); - } + Check.defined(cartographics, 'cartographics'); //>>includeEnd('debug'); var west = Number.MAX_VALUE; @@ -284,9 +273,7 @@ define([ */ Rectangle.fromCartesianArray = function(cartesians, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesians)) { - throw new DeveloperError('cartesians is required.'); - } + Check.defined(cartesians, 'cartesians'); //>>includeEnd('debug'); var west = Number.MAX_VALUE; @@ -404,9 +391,7 @@ define([ */ Rectangle.prototype.equalsEpsilon = function(other, epsilon) { //>>includeStart('debug', pragmas.debug); - if (typeof epsilon !== 'number') { - throw new DeveloperError('epsilon is required and must be a number.'); - } + Check.typeOf.number(epsilon, 'epsilon'); //>>includeEnd('debug'); return defined(other) && @@ -428,45 +413,27 @@ define([ */ Rectangle.validate = function(rectangle) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); var north = rectangle.north; - if (typeof north !== 'number') { - throw new DeveloperError('north is required to be a number.'); - } - - if (north < -CesiumMath.PI_OVER_TWO || north > CesiumMath.PI_OVER_TWO) { - throw new DeveloperError('north must be in the interval [-Pi/2, Pi/2].'); - } + Check.typeOf.number(north, 'north'); + Check.numeric.minimum(north, -CesiumMath.PI_OVER_TWO); + Check.numeric.maximum(north, CesiumMath.PI_OVER_TWO); var south = rectangle.south; - if (typeof south !== 'number') { - throw new DeveloperError('south is required to be a number.'); - } - - if (south < -CesiumMath.PI_OVER_TWO || south > CesiumMath.PI_OVER_TWO) { - throw new DeveloperError('south must be in the interval [-Pi/2, Pi/2].'); - } + Check.typeOf.number(south, 'south'); + Check.numeric.minimum(south, -CesiumMath.PI_OVER_TWO); + Check.numeric.maximum(south, CesiumMath.PI_OVER_TWO); var west = rectangle.west; - if (typeof west !== 'number') { - throw new DeveloperError('west is required to be a number.'); - } - - if (west < -Math.PI || west > Math.PI) { - throw new DeveloperError('west must be in the interval [-Pi, Pi].'); - } + Check.typeOf.number(west, 'west'); + Check.numeric.minimum(west, -Math.PI); + Check.numeric.maximum(west, Math.PI); var east = rectangle.east; - if (typeof east !== 'number') { - throw new DeveloperError('east is required to be a number.'); - } - - if (east < -Math.PI || east > Math.PI) { - throw new DeveloperError('east must be in the interval [-Pi, Pi].'); - } + Check.typeOf.number(east, 'east'); + Check.numeric.minimum(east, -Math.PI); + Check.numeric.maximum(east, Math.PI); //>>includeEnd('debug'); }; @@ -479,9 +446,7 @@ define([ */ Rectangle.southwest = function(rectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); if (!defined(result)) { @@ -502,9 +467,7 @@ define([ */ Rectangle.northwest = function(rectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); if (!defined(result)) { @@ -525,9 +488,7 @@ define([ */ Rectangle.northeast = function(rectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); if (!defined(result)) { @@ -548,9 +509,7 @@ define([ */ Rectangle.southeast = function(rectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); if (!defined(result)) { @@ -571,9 +530,7 @@ define([ */ Rectangle.center = function(rectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); var east = rectangle.east; @@ -610,12 +567,8 @@ define([ */ Rectangle.intersection = function(rectangle, otherRectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } - if (!defined(otherRectangle)) { - throw new DeveloperError('otherRectangle is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); + Check.typeOf.object(otherRectangle, 'otherRectangle'); //>>includeEnd('debug'); var rectangleEast = rectangle.east; @@ -673,12 +626,8 @@ define([ */ Rectangle.simpleIntersection = function(rectangle, otherRectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } - if (!defined(otherRectangle)) { - throw new DeveloperError('otherRectangle is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); + Check.typeOf.object(otherRectangle, 'otherRectangle'); //>>includeEnd('debug'); var west = Math.max(rectangle.west, otherRectangle.west); @@ -711,12 +660,8 @@ define([ */ Rectangle.union = function(rectangle, otherRectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } - if (!defined(otherRectangle)) { - throw new DeveloperError('otherRectangle is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); + Check.typeOf.object(otherRectangle, 'otherRectangle'); //>>includeEnd('debug'); if (!defined(result)) { @@ -762,12 +707,8 @@ define([ */ Rectangle.expand = function(rectangle, cartographic, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required.'); - } - if (!defined(cartographic)) { - throw new DeveloperError('cartographic is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); + Check.typeOf.object(cartographic, 'cartographic'); //>>includeEnd('debug'); if (!defined(result)) { @@ -791,12 +732,8 @@ define([ */ Rectangle.contains = function(rectangle, cartographic) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } - if (!defined(cartographic)) { - throw new DeveloperError('cartographic is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); + Check.typeOf.object(cartographic, 'cartographic'); //>>includeEnd('debug'); var longitude = cartographic.longitude; @@ -831,9 +768,7 @@ define([ */ Rectangle.subsample = function(rectangle, ellipsoid, surfaceHeight, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); ellipsoid = defaultValue(ellipsoid, Ellipsoid.WGS84); diff --git a/Source/Core/RectangleGeometry.js b/Source/Core/RectangleGeometry.js index 420b95cceeb4..4ee7ff3bb69d 100644 --- a/Source/Core/RectangleGeometry.js +++ b/Source/Core/RectangleGeometry.js @@ -330,7 +330,9 @@ define([ return wallTextures; } + var scratchVertexFormat = new VertexFormat(); function constructExtrudedRectangle(options) { + var shadowVolume = options.shadowVolume; var vertexFormat = options.vertexFormat; var surfaceHeight = options.surfaceHeight; var extrudedHeight = options.extrudedHeight; @@ -342,10 +344,15 @@ define([ var ellipsoid = options.ellipsoid; var i; + if (shadowVolume) { + options.vertexFormat = VertexFormat.clone(vertexFormat, scratchVertexFormat); + options.vertexFormat.normal = true; + } var topBottomGeo = constructRectangle(options); if (CesiumMath.equalsEpsilon(minHeight, maxHeight, CesiumMath.EPSILON10)) { return topBottomGeo; } + var topPositions = PolygonPipeline.scaleToGeodeticHeight(topBottomGeo.attributes.position.values, maxHeight, ellipsoid, false); topPositions = new Float64Array(topPositions); var length = topPositions.length; @@ -361,8 +368,9 @@ define([ var binormals = (vertexFormat.binormal) ? new Float32Array(newLength) : undefined; var textures = (vertexFormat.st) ? new Float32Array(newLength/3*2) : undefined; var topSt; + var topNormals; if (vertexFormat.normal) { - var topNormals = topBottomGeo.attributes.normal.values; + topNormals = topBottomGeo.attributes.normal.values; normals.set(topNormals); for (i = 0; i < length; i ++) { topNormals[i] = -topNormals[i]; @@ -370,6 +378,23 @@ define([ normals.set(topNormals, length); topBottomGeo.attributes.normal.values = normals; } + if (shadowVolume) { + topNormals = topBottomGeo.attributes.normal.values; + if (!vertexFormat.normal) { + topBottomGeo.attributes.normal = undefined; + } + var extrudeNormals = new Float32Array(newLength); + for (i = 0; i < length; i ++) { + topNormals[i] = -topNormals[i]; + } + extrudeNormals.set(topNormals, length); //only get normals for bottom layer that's going to be pushed down + topBottomGeo.attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : extrudeNormals + }); + } + if (vertexFormat.tangent) { var topTangents = topBottomGeo.attributes.tangent.values; tangents.set(topTangents); @@ -408,45 +433,76 @@ define([ var wallCount = (perimeterPositions + 4) * 2; var wallPositions = new Float64Array(wallCount * 3); + var wallExtrudeNormals = shadowVolume ? new Float32Array(wallCount * 3) : undefined; var wallTextures = (vertexFormat.st) ? new Float32Array(wallCount * 2) : undefined; var posIndex = 0; var stIndex = 0; + var extrudeNormalIndex = 0; var area = width * height; + var threeI; for (i = 0; i < area; i+=width) { - wallPositions = addWallPositions(wallPositions, posIndex, i*3, topPositions, bottomPositions); + threeI = i * 3; + wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions); posIndex += 6; if (vertexFormat.st) { wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i*2, topSt); stIndex += 4; } + if (shadowVolume) { + extrudeNormalIndex += 3; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } } for (i = area-width; i < area; i++) { - wallPositions = addWallPositions(wallPositions, posIndex, i*3, topPositions, bottomPositions); + threeI = i * 3; + wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions); posIndex += 6; if (vertexFormat.st) { wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i*2, topSt); stIndex += 4; } + if (shadowVolume) { + extrudeNormalIndex += 3; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } } for (i = area-1; i > 0; i-=width) { - wallPositions = addWallPositions(wallPositions, posIndex, i*3, topPositions, bottomPositions); + threeI = i * 3; + wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions); posIndex += 6; if (vertexFormat.st) { wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i*2, topSt); stIndex += 4; } + if (shadowVolume) { + extrudeNormalIndex += 3; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } } for (i = width-1; i >= 0; i--) { - wallPositions = addWallPositions(wallPositions, posIndex, i*3, topPositions, bottomPositions); + threeI = i * 3; + wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions); posIndex += 6; if (vertexFormat.st) { wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i*2, topSt); stIndex += 4; } + if (shadowVolume) { + extrudeNormalIndex += 3; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } } var geo = calculateAttributesWall(wallPositions, vertexFormat, ellipsoid); @@ -458,6 +514,13 @@ define([ values : wallTextures }); } + if (shadowVolume) { + geo.attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : wallExtrudeNormals + }); + } var wallIndices = IndexDatatype.createTypedArray(wallCount, perimeterPositions * 6); @@ -582,16 +645,6 @@ define([ options = defaultValue(options, defaultValue.EMPTY_OBJECT); var rectangle = options.rectangle; - var granularity = defaultValue(options.granularity, CesiumMath.RADIANS_PER_DEGREE); - var ellipsoid = defaultValue(options.ellipsoid, Ellipsoid.WGS84); - var surfaceHeight = defaultValue(options.height, 0.0); - var rotation = defaultValue(options.rotation, 0.0); - var stRotation = defaultValue(options.stRotation, 0.0); - var vertexFormat = defaultValue(options.vertexFormat, VertexFormat.DEFAULT); - var extrudedHeight = options.extrudedHeight; - var extrude = defined(extrudedHeight); - var closeTop = defaultValue(options.closeTop, true); - var closeBottom = defaultValue(options.closeBottom, true); //>>includeStart('debug', pragmas.debug); if (!defined(rectangle)) { @@ -603,17 +656,19 @@ define([ } //>>includeEnd('debug'); + var rotation = defaultValue(options.rotation, 0.0); this._rectangle = rectangle; - this._granularity = granularity; - this._ellipsoid = Ellipsoid.clone(ellipsoid); - this._surfaceHeight = surfaceHeight; + this._granularity = defaultValue(options.granularity, CesiumMath.RADIANS_PER_DEGREE); + this._ellipsoid = Ellipsoid.clone(defaultValue(options.ellipsoid, Ellipsoid.WGS84)); + this._surfaceHeight = defaultValue(options.height, 0.0); this._rotation = rotation; - this._stRotation = stRotation; - this._vertexFormat = VertexFormat.clone(vertexFormat); - this._extrudedHeight = defaultValue(extrudedHeight, 0.0); - this._extrude = extrude; - this._closeTop = closeTop; - this._closeBottom = closeBottom; + this._stRotation = defaultValue(options.stRotation, 0.0); + this._vertexFormat = VertexFormat.clone(defaultValue(options.vertexFormat, VertexFormat.DEFAULT)); + this._extrudedHeight = defaultValue(options.extrudedHeight, 0.0); + this._extrude = defined(options.extrudedHeight); + this._closeTop = defaultValue(options.closeTop, true); + this._closeBottom = defaultValue(options.closeBottom, true); + this._shadowVolume = defaultValue(options.shadowVolume, false); this._workerName = 'createRectangleGeometry'; this._rotatedRectangle = computeRectangle(this._rectangle, this._ellipsoid, rotation); } @@ -622,7 +677,7 @@ define([ * The number of elements used to pack the object into an array. * @type {Number} */ - RectangleGeometry.packedLength = Rectangle.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 8; + RectangleGeometry.packedLength = Rectangle.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 9; /** * Stores the provided instance into the provided array. @@ -665,7 +720,8 @@ define([ array[startingIndex++] = value._extrudedHeight; array[startingIndex++] = value._extrude ? 1.0 : 0.0; array[startingIndex++] = value._closeTop ? 1.0 : 0.0; - array[startingIndex] = value._closeBottom ? 1.0 : 0.0; + array[startingIndex++] = value._closeBottom ? 1.0 : 0.0; + array[startingIndex] = value._shadowVolume ? 1.0 : 0.0; return array; }; @@ -673,7 +729,6 @@ define([ var scratchRectangle = new Rectangle(); var scratchRotatedRectangle = new Rectangle(); var scratchEllipsoid = Ellipsoid.clone(Ellipsoid.UNIT_SPHERE); - var scratchVertexFormat = new VertexFormat(); var scratchOptions = { rectangle : scratchRectangle, ellipsoid : scratchEllipsoid, @@ -684,7 +739,8 @@ define([ stRotation : undefined, extrudedHeight : undefined, closeTop : undefined, - closeBottom : undefined + closeBottom : undefined, + shadowVolume: undefined }; /** @@ -723,7 +779,8 @@ define([ var extrudedHeight = array[startingIndex++]; var extrude = array[startingIndex++] === 1.0; var closeTop = array[startingIndex++] === 1.0; - var closeBottom = array[startingIndex] === 1.0; + var closeBottom = array[startingIndex++] === 1.0; + var shadowVolume = array[startingIndex] === 1.0; if (!defined(result)) { scratchOptions.granularity = granularity; @@ -733,6 +790,7 @@ define([ scratchOptions.extrudedHeight = extrude ? extrudedHeight : undefined; scratchOptions.closeTop = closeTop; scratchOptions.closeBottom = closeBottom; + scratchOptions.shadowVolume = shadowVolume; return new RectangleGeometry(scratchOptions); } @@ -748,6 +806,7 @@ define([ result._closeTop = closeTop; result._closeBottom = closeBottom; result._rotatedRectangle = rotatedRectangle; + result._shadowVolume = shadowVolume; return result; }; @@ -804,6 +863,7 @@ define([ var boundingSphere; rectangle = rectangleGeometry._rectangle; if (extrude) { + options.shadowVolume = rectangleGeometry._shadowVolume; geometry = constructExtrudedRectangle(options); var topBS = BoundingSphere.fromRectangle3D(rectangle, ellipsoid, surfaceHeight, topBoundingSphere); var bottomBS = BoundingSphere.fromRectangle3D(rectangle, ellipsoid, extrudedHeight, bottomBoundingSphere); @@ -819,7 +879,7 @@ define([ } return new Geometry({ - attributes : new GeometryAttributes(geometry.attributes), + attributes : geometry.attributes, indices : geometry.indices, primitiveType : geometry.primitiveType, boundingSphere : boundingSphere @@ -847,7 +907,8 @@ define([ height : minHeight, closeTop : true, closeBottom : true, - vertexFormat : VertexFormat.POSITION_ONLY + vertexFormat : VertexFormat.POSITION_ONLY, + shadowVolume: true }); }; diff --git a/Source/Core/Simon1994PlanetaryPositions.js b/Source/Core/Simon1994PlanetaryPositions.js index 84cc17a037c3..1a824012333e 100644 --- a/Source/Core/Simon1994PlanetaryPositions.js +++ b/Source/Core/Simon1994PlanetaryPositions.js @@ -509,9 +509,9 @@ define([ * @param {Cartesian3} [result] The object onto which to store the result. * @returns {Cartesian3} Calculated sun position */ - Simon1994PlanetaryPositions.computeSunPositionInEarthInertialFrame= function(date, result){ - if (!defined(date)) { - date = JulianDate.now(); + Simon1994PlanetaryPositions.computeSunPositionInEarthInertialFrame= function(julianDate, result){ + if (!defined(julianDate)) { + julianDate = JulianDate.now(); } if (!defined(result)) { @@ -519,11 +519,11 @@ define([ } //first forward transformation - translation = computeSimonEarthMoonBarycenter(date, translation); + translation = computeSimonEarthMoonBarycenter(julianDate, translation); result = Cartesian3.negate(translation, result); //second forward transformation - computeSimonEarth(date, translation); + computeSimonEarth(julianDate, translation); Cartesian3.subtract(result, translation, result); Matrix3.multiplyByVector(axesTransformation, result, result); @@ -538,12 +538,12 @@ define([ * @param {Cartesian3} [result] The object onto which to store the result. * @returns {Cartesian3} Calculated moon position */ - Simon1994PlanetaryPositions.computeMoonPositionInEarthInertialFrame = function(date, result){ - if (!defined(date)) { - date = JulianDate.now(); + Simon1994PlanetaryPositions.computeMoonPositionInEarthInertialFrame = function(julianDate, result){ + if (!defined(julianDate)) { + julianDate = JulianDate.now(); } - result = computeSimonMoon(date, result); + result = computeSimonMoon(julianDate, result); Matrix3.multiplyByVector(axesTransformation, result, result); return result; diff --git a/Source/Core/SphereGeometry.js b/Source/Core/SphereGeometry.js index 4e8ac00ca349..a05f58a854a4 100644 --- a/Source/Core/SphereGeometry.js +++ b/Source/Core/SphereGeometry.js @@ -1,6 +1,7 @@ /*global define*/ define([ './Cartesian3', + './Check', './defaultValue', './defined', './DeveloperError', @@ -8,6 +9,7 @@ define([ './VertexFormat' ], function( Cartesian3, + Check, defaultValue, defined, DeveloperError, @@ -70,9 +72,7 @@ define([ */ SphereGeometry.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } + Check.typeOf.object(value, 'value'); //>>includeEnd('debug'); return EllipsoidGeometry.pack(value._ellipsoidGeometry, array, startingIndex); diff --git a/Source/Core/SphereOutlineGeometry.js b/Source/Core/SphereOutlineGeometry.js index 1d1a627d19fa..e74f9961e727 100644 --- a/Source/Core/SphereOutlineGeometry.js +++ b/Source/Core/SphereOutlineGeometry.js @@ -1,12 +1,14 @@ /*global define*/ define([ './Cartesian3', + './Check', './defaultValue', './defined', './DeveloperError', './EllipsoidOutlineGeometry' ], function( Cartesian3, + Check, defaultValue, defined, DeveloperError, @@ -68,9 +70,7 @@ define([ */ SphereOutlineGeometry.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } + Check.typeOf.object(value, 'value'); //>>includeEnd('debug'); return EllipsoidOutlineGeometry.pack(value._ellipsoidGeometry, array, startingIndex); diff --git a/Source/Core/Spherical.js b/Source/Core/Spherical.js index 0222c247a6cb..b87c7c9466e7 100644 --- a/Source/Core/Spherical.js +++ b/Source/Core/Spherical.js @@ -1,9 +1,11 @@ /*global define*/ define([ + './Check', './defaultValue', './defined', './DeveloperError' ], function( + Check, defaultValue, defined, DeveloperError) { @@ -29,14 +31,12 @@ define([ * Converts the provided Cartesian3 into Spherical coordinates. * * @param {Cartesian3} cartesian3 The Cartesian3 to be converted to Spherical. - * @param {Spherical} [spherical] The object in which the result will be stored, if undefined a new instance will be created. + * @param {Spherical} [result] The object in which the result will be stored, if undefined a new instance will be created. * @returns {Spherical} The modified result parameter, or a new instance if one was not provided. */ Spherical.fromCartesian3 = function(cartesian3, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian3)) { - throw new DeveloperError('cartesian3 is required'); - } + Check.typeOf.object(cartesian3, 'cartesian3'); //>>includeEnd('debug'); var x = cartesian3.x; @@ -85,9 +85,7 @@ define([ */ Spherical.normalize = function(spherical, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(spherical)) { - throw new DeveloperError('spherical is required'); - } + Check.typeOf.object(spherical, 'spherical'); //>>includeEnd('debug'); if (!defined(result)) { diff --git a/Source/Core/TerrainMesh.js b/Source/Core/TerrainMesh.js index de2534d819c9..4c25c7990ecf 100644 --- a/Source/Core/TerrainMesh.js +++ b/Source/Core/TerrainMesh.js @@ -27,6 +27,7 @@ define([ * @param {Number} [vertexStride=6] The number of components in each vertex. * @param {OrientedBoundingBox} [orientedBoundingBox] A bounding box that completely contains the tile. * @param {TerrainEncoding} encoding Information used to decode the mesh. + * @param {Number} exaggeration The amount that this mesh was exaggerated. * * @private */ diff --git a/Source/Core/TimeIntervalCollection.js b/Source/Core/TimeIntervalCollection.js index bc1c79ebbd38..0dd6e21784aa 100644 --- a/Source/Core/TimeIntervalCollection.js +++ b/Source/Core/TimeIntervalCollection.js @@ -217,8 +217,8 @@ define([ * @param {JulianDate} julianDate The date to check. * @returns {Boolean} true if the collection contains the specified date, false otherwise. */ - TimeIntervalCollection.prototype.contains = function(date) { - return this.indexOf(date) >= 0; + TimeIntervalCollection.prototype.contains = function(julianDate) { + return this.indexOf(julianDate) >= 0; }; var indexOfScratch = new TimeInterval(); diff --git a/Source/Core/Transforms.js b/Source/Core/Transforms.js index b02cd3eb6af2..b9ebfef6f1ff 100644 --- a/Source/Core/Transforms.js +++ b/Source/Core/Transforms.js @@ -5,9 +5,9 @@ define([ './Cartesian3', './Cartesian4', './Cartographic', + './Check', './defaultValue', './defined', - './deprecationWarning', './DeveloperError', './EarthOrientationParameters', './EarthOrientationParametersSample', @@ -27,9 +27,9 @@ define([ Cartesian3, Cartesian4, Cartographic, + Check, defaultValue, defined, - deprecationWarning, DeveloperError, EarthOrientationParameters, EarthOrientationParametersSample, @@ -473,19 +473,12 @@ define([ * var hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll); * var transform = Cesium.Transforms.headingPitchRollToFixedFrame(center, hpr); */ - Transforms.headingPitchRollToFixedFrame = function(origin, headingPitchRoll, pitch, roll, ellipsoid, result) { - var heading; - if (typeof headingPitchRoll === 'object') { - // Shift arguments using assignments to encourage JIT optimization. - ellipsoid = pitch; - result = roll; - heading = headingPitchRoll.heading; - pitch = headingPitchRoll.pitch; - roll = headingPitchRoll.roll; - } else { - deprecationWarning('headingPitchRollToFixedFrame', 'headingPitchRollToFixedFrame with separate heading, pitch, and roll arguments was deprecated in 1.27. It will be removed in 1.30. Use a HeadingPitchRoll object.'); - heading = headingPitchRoll; - } + Transforms.headingPitchRollToFixedFrame = function(origin, headingPitchRoll, ellipsoid, result) { + Check.typeOf.object(headingPitchRoll, 'headingPitchRoll'); + var heading = headingPitchRoll.heading; + var pitch = headingPitchRoll.pitch; + var roll = headingPitchRoll.roll; + // checks for required parameters happen in the called functions var hprQuaternion = Quaternion.fromHeadingPitchRoll(heading, pitch, roll, scratchHPRQuaternion); var hprMatrix = Matrix4.fromTranslationQuaternionRotationScale(Cartesian3.ZERO, hprQuaternion, scratchScale, scratchHPRMatrix4); @@ -493,7 +486,6 @@ define([ return Matrix4.multiply(result, hprMatrix, result); }; - var scratchHPR = new HeadingPitchRoll(); var scratchENUMatrix4 = new Matrix4(); var scratchHPRMatrix3 = new Matrix3(); @@ -518,22 +510,10 @@ define([ * var hpr = new HeadingPitchRoll(heading, pitch, roll); * var quaternion = Cesium.Transforms.headingPitchRollQuaternion(center, hpr); */ - Transforms.headingPitchRollQuaternion = function(origin, headingPitchRoll, pitch, roll, ellipsoid, result) { - var hpr; - if (typeof headingPitchRoll === 'object') { - // Shift arguments using assignment to encourage JIT optimization. - hpr = headingPitchRoll; - ellipsoid = pitch; - result = roll; - } else { - deprecationWarning('headingPitchRollQuaternion', 'headingPitchRollQuaternion with separate heading, pitch, and roll arguments was deprecated in 1.27. It will be removed in 1.30. Use a HeadingPitchRoll object.'); - scratchHPR.heading = headingPitchRoll; - scratchHPR.pitch = pitch; - scratchHPR.roll = roll; - hpr = scratchHPR; - } + Transforms.headingPitchRollQuaternion = function(origin, headingPitchRoll, ellipsoid, result) { // checks for required parameters happen in the called functions - var transform = Transforms.headingPitchRollToFixedFrame(origin, hpr, ellipsoid, scratchENUMatrix4); + Check.typeOf.object(headingPitchRoll, 'headingPitchRoll'); + var transform = Transforms.headingPitchRollToFixedFrame(origin, headingPitchRoll, ellipsoid, scratchENUMatrix4); var rotation = Matrix4.getRotation(transform, scratchHPRMatrix3); return Quaternion.fromRotationMatrix(rotation, result); }; diff --git a/Source/Core/VertexFormat.js b/Source/Core/VertexFormat.js index a1709d6c3206..50a8a0c835b2 100644 --- a/Source/Core/VertexFormat.js +++ b/Source/Core/VertexFormat.js @@ -285,7 +285,7 @@ define([ /** * Duplicates a VertexFormat instance. * - * @param {VertexFormat} cartesian The vertex format to duplicate. + * @param {VertexFormat} vertexFormat The vertex format to duplicate. * @param {VertexFormat} [result] The object onto which to store the result. * @returns {VertexFormat} The modified result parameter or a new VertexFormat instance if one was not provided. (Returns undefined if vertexFormat is undefined) */ diff --git a/Source/Core/getImagePixels.js b/Source/Core/getImagePixels.js index f728c81cb164..e65f025eec84 100644 --- a/Source/Core/getImagePixels.js +++ b/Source/Core/getImagePixels.js @@ -14,6 +14,8 @@ define([ * @exports getImagePixels * * @param {Image} image The image to extract pixels from. + * @param {Number} width The width of the image. If not defined, then image.width is assigned. + * @param {Number} height The height of the image. If not defined, then image.height is assigned. * @returns {CanvasPixelArray} The pixels of the image. */ function getImagePixels(image, width, height) { diff --git a/Source/DataSources/CorridorGeometryUpdater.js b/Source/DataSources/CorridorGeometryUpdater.js index 79bf46bca8a7..839d47b534e0 100644 --- a/Source/DataSources/CorridorGeometryUpdater.js +++ b/Source/DataSources/CorridorGeometryUpdater.js @@ -243,7 +243,7 @@ define([ * Gets the property specifying whether the geometry * casts or receives shadows from each light source. * @memberof CorridorGeometryUpdater.prototype - * + * * @type {Property} * @readonly */ @@ -552,6 +552,7 @@ define([ * Creates the dynamic updater to be used when GeometryUpdater#isDynamic is true. * * @param {PrimitiveCollection} primitives The primitive collection to use. + * @param {PrimitiveCollection} groundPrimitives The ground primitives collection to use. * @returns {DynamicGeometryUpdater} The dynamic updater used to update the geometry each frame. * * @exception {DeveloperError} This instance does not represent dynamic geometry. diff --git a/Source/DataSources/CzmlDataSource.js b/Source/DataSources/CzmlDataSource.js index deae371cca05..e2d4cca84f41 100644 --- a/Source/DataSources/CzmlDataSource.js +++ b/Source/DataSources/CzmlDataSource.js @@ -1854,7 +1854,7 @@ define([ /** * Creates a Promise to a new instance loaded with the provided CZML data. * - * @param {String|Object} data A url or CZML object to be processed. + * @param {String|Object} czml A url or CZML object to be processed. * @param {Object} [options] An object with the following properties: * @param {String} [options.sourceUri] Overrides the url to use for resolving relative links. * @returns {Promise.} A promise that resolves to the new instance once the data is processed. diff --git a/Source/DataSources/DataSourceCollection.js b/Source/DataSources/DataSourceCollection.js index 374b8a0dbe62..ca2e44f2e0a7 100644 --- a/Source/DataSources/DataSourceCollection.js +++ b/Source/DataSources/DataSourceCollection.js @@ -166,6 +166,7 @@ define([ * Gets a data source by index from the collection. * * @param {Number} index the index to retrieve. + * @returns {DataSource} The data source at the specified index. */ DataSourceCollection.prototype.get = function(index) { //>>includeStart('debug', pragmas.debug); diff --git a/Source/DataSources/EllipseGeometryUpdater.js b/Source/DataSources/EllipseGeometryUpdater.js index 59176bb1004a..e47c1a4af98c 100644 --- a/Source/DataSources/EllipseGeometryUpdater.js +++ b/Source/DataSources/EllipseGeometryUpdater.js @@ -246,7 +246,7 @@ define([ * Gets the property specifying whether the geometry * casts or receives shadows from each light source. * @memberof EllipseGeometryUpdater.prototype - * + * * @type {Property} * @readonly */ @@ -566,6 +566,7 @@ define([ * Creates the dynamic updater to be used when GeometryUpdater#isDynamic is true. * * @param {PrimitiveCollection} primitives The primitive collection to use. + * @param {PrimitiveCollection} groundPrimitives The ground primitives collection to use. * @returns {DynamicGeometryUpdater} The dynamic updater used to update the geometry each frame. * * @exception {DeveloperError} This instance does not represent dynamic geometry. diff --git a/Source/DataSources/EntityView.js b/Source/DataSources/EntityView.js index e6653e3fa8d9..b8857df00372 100644 --- a/Source/DataSources/EntityView.js +++ b/Source/DataSources/EntityView.js @@ -258,7 +258,7 @@ define([ * Should be called each animation frame to update the camera * to the latest settings. * @param {JulianDate} time The current animation time. - * @param {BoundingSphere} current bounding sphere of the object. + * @param {BoundingSphere} boundingSphere bounding sphere of the object. * */ EntityView.prototype.update = function(time, boundingSphere) { diff --git a/Source/DataSources/KmlDataSource.js b/Source/DataSources/KmlDataSource.js index 43f4bba6d2c8..bd7636d8abb1 100644 --- a/Source/DataSources/KmlDataSource.js +++ b/Source/DataSources/KmlDataSource.js @@ -489,7 +489,7 @@ define([ var colorOptions = {}; function parseColorString(value, isRandom) { - if (!defined(value)) { + if (!defined(value) || /^\s*$/gm.test(value)) { return undefined; } diff --git a/Source/DataSources/ModelVisualizer.js b/Source/DataSources/ModelVisualizer.js index bd00c0ae9829..a066931b4456 100644 --- a/Source/DataSources/ModelVisualizer.js +++ b/Source/DataSources/ModelVisualizer.js @@ -42,7 +42,6 @@ define([ var defaultColorBlendMode = ColorBlendMode.HIGHLIGHT; var defaultColorBlendAmount = 0.5; - var color = new Color(); var modelMatrixScratch = new Matrix4(); var nodeMatrixScratch = new Matrix4(); @@ -149,9 +148,9 @@ define([ model.shadows = Property.getValueOrDefault(modelGraphics._shadows, time, defaultShadows); model.heightReference = Property.getValueOrDefault(modelGraphics._heightReference, time, defaultHeightReference); model.distanceDisplayCondition = Property.getValueOrUndefined(modelGraphics._distanceDisplayCondition, time); - model.silhouetteColor = Property.getValueOrDefault(modelGraphics.silhouetteColor, time, defaultSilhouetteColor); - model.silhouetteSize = Property.getValueOrDefault(modelGraphics.silhouetteSize, time, defaultSilhouetteSize); - model.color = Property.getValueOrDefault(modelGraphics._color, time, defaultColor, color); + model.silhouetteColor = Property.getValueOrDefault(modelGraphics._silhouetteColor, time, defaultSilhouetteColor, model._silhouetteColor); + model.silhouetteSize = Property.getValueOrDefault(modelGraphics._silhouetteSize, time, defaultSilhouetteSize); + model.color = Property.getValueOrDefault(modelGraphics._color, time, defaultColor, model._color); model.colorBlendMode = Property.getValueOrDefault(modelGraphics._colorBlendMode, time, defaultColorBlendMode); model.colorBlendAmount = Property.getValueOrDefault(modelGraphics._colorBlendAmount, time, defaultColorBlendAmount); diff --git a/Source/DataSources/PolygonGeometryUpdater.js b/Source/DataSources/PolygonGeometryUpdater.js index cd98be03885f..3aac6923c32e 100644 --- a/Source/DataSources/PolygonGeometryUpdater.js +++ b/Source/DataSources/PolygonGeometryUpdater.js @@ -248,7 +248,7 @@ define([ * Gets the property specifying whether the geometry * casts or receives shadows from each light source. * @memberof PolygonGeometryUpdater.prototype - * + * * @type {Property} * @readonly */ @@ -582,6 +582,7 @@ define([ * Creates the dynamic updater to be used when GeometryUpdater#isDynamic is true. * * @param {PrimitiveCollection} primitives The primitive collection to use. + * @param {PrimitiveCollection} groundPrimitives The ground primitive collection to use. * @returns {DynamicGeometryUpdater} The dynamic updater used to update the geometry each frame. * * @exception {DeveloperError} This instance does not represent dynamic geometry. @@ -663,7 +664,7 @@ define([ options.closeBottom = closeBottomValue; var shadows = this._geometryUpdater.shadowsProperty.getValue(time); - + if (Property.getValueOrDefault(polygon.fill, time, true)) { var fillMaterialProperty = geometryUpdater.fillMaterialProperty; var material = MaterialProperty.getValue(time, fillMaterialProperty, this._material); diff --git a/Source/DataSources/Rotation.js b/Source/DataSources/Rotation.js index 467690f24ddb..3f1480576cc1 100755 --- a/Source/DataSources/Rotation.js +++ b/Source/DataSources/Rotation.js @@ -124,7 +124,7 @@ define([ * * @param {Number[]} array The array previously packed for interpolation. * @param {Number[]} sourceArray The original packed array. - * @param {Number} [startingIndex=0] The startingIndex used to convert the array. + * @param {Number} [firstIndex=0] The firstIndex used to convert the array. * @param {Number} [lastIndex=packedArray.length] The lastIndex used to convert the array. * @param {Rotation} [result] The object into which to store the result. * @returns {Rotation} The modified result parameter or a new Rotation instance if one was not provided. diff --git a/Source/DataSources/SampledPositionProperty.js b/Source/DataSources/SampledPositionProperty.js index 1d9062ec7b44..d524d26d60a1 100644 --- a/Source/DataSources/SampledPositionProperty.js +++ b/Source/DataSources/SampledPositionProperty.js @@ -274,8 +274,8 @@ define([ * @param {Number[]} packedSamples The array of packed samples. * @param {JulianDate} [epoch] If any of the dates in packedSamples are numbers, they are considered an offset from this epoch, in seconds. */ - SampledPositionProperty.prototype.addSamplesPackedArray = function(data, epoch) { - this._property.addSamplesPackedArray(data, epoch); + SampledPositionProperty.prototype.addSamplesPackedArray = function(packedSamples, epoch) { + this._property.addSamplesPackedArray(packedSamples, epoch); }; /** diff --git a/Source/Renderer/AutomaticUniforms.js b/Source/Renderer/AutomaticUniforms.js index 6957c7d16db3..6f71025bf1cb 100644 --- a/Source/Renderer/AutomaticUniforms.js +++ b/Source/Renderer/AutomaticUniforms.js @@ -1476,6 +1476,20 @@ define([ getValue : function(uniformState) { return uniformState.fogDensity; } + }), + + /** + * An automatic GLSL uniform scalar representing the geometric tolerance per meter + * + * @alias czm_geometricToleranceOverMeter + * @glslUniform + */ + czm_geometricToleranceOverMeter : new AutomaticUniform({ + size: 1, + datatype: WebGLConstants.FLOAT, + getValue: function(uniformState) { + return uniformState.geometricToleranceOverMeter; + } }) }; diff --git a/Source/Renderer/Buffer.js b/Source/Renderer/Buffer.js index fc4ee4b8bc8c..edb489e7d313 100644 --- a/Source/Renderer/Buffer.js +++ b/Source/Renderer/Buffer.js @@ -145,7 +145,7 @@ define([ * @param {ArrayBufferView} [options.typedArray] A typed array containing the data to copy to the buffer. * @param {Number} [options.sizeInBytes] A Number defining the size of the buffer in bytes. Required if options.typedArray is not given. * @param {BufferUsage} options.usage Specifies the expected usage pattern of the buffer. On some GL implementations, this can significantly affect performance. See {@link BufferUsage}. - * @param {IndexDatatype} indexDatatype The datatype of indices in the buffer. + * @param {IndexDatatype} options.indexDatatype The datatype of indices in the buffer. * @returns {IndexBuffer} The index buffer, ready to be attached to a vertex array. * * @exception {DeveloperError} Must specify either or , but not both. diff --git a/Source/Renderer/ComputeCommand.js b/Source/Renderer/ComputeCommand.js index 8d0231c673bc..1eb7f2a24888 100644 --- a/Source/Renderer/ComputeCommand.js +++ b/Source/Renderer/ComputeCommand.js @@ -108,7 +108,7 @@ define([ /** * Executes the compute command. * - * @param {Context} context The context that processes the compute command. + * @param {Context} computeEngine The context that processes the compute command. */ ComputeCommand.prototype.execute = function(computeEngine) { computeEngine.execute(this); diff --git a/Source/Renderer/UniformState.js b/Source/Renderer/UniformState.js index 49ddc5cd50dd..e0f77ea724d3 100644 --- a/Source/Renderer/UniformState.js +++ b/Source/Renderer/UniformState.js @@ -149,6 +149,9 @@ define([ this._resolutionScale = 1.0; this._fogDensity = undefined; + + this._pixelSizePerMeter = undefined; + this._geometricToleranceOverMeter = undefined; } defineProperties(UniformState.prototype, { @@ -767,6 +770,17 @@ define([ } }, + /** + * A scalar that represents the geometric tolerance per meter + * @memberof UniformStat.prototype + * @type {Number} + */ + geometricToleranceOverMeter: { + get: function() { + return this._geometricToleranceOverMeter; + } + }, + /** * @memberof UniformState.prototype * @type {Pass} @@ -935,6 +949,17 @@ define([ this._frameState = frameState; this._temeToPseudoFixed = Transforms.computeTemeToPseudoFixedMatrix(frameState.time, this._temeToPseudoFixed); + + var fov = camera.frustum.fov; + var viewport = this._viewport; + var pixelSizePerMeter; + if (viewport.height > viewport.width) { + pixelSizePerMeter = Math.tan(0.5 * fov) * 2.0 / viewport.height; + } else { + pixelSizePerMeter = Math.tan(0.5 * fov) * 2.0 / viewport.width; + } + + this._geometricToleranceOverMeter = pixelSizePerMeter * frameState.maximumScreenSpaceError; }; function cleanViewport(uniformState) { diff --git a/Source/Scene/BingMapsImageryProvider.js b/Source/Scene/BingMapsImageryProvider.js index 90368068d2b6..726b209a2104 100644 --- a/Source/Scene/BingMapsImageryProvider.js +++ b/Source/Scene/BingMapsImageryProvider.js @@ -557,7 +557,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - BingMapsImageryProvider.prototype.pickFeatures = function() { + BingMapsImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Scene/CameraEventAggregator.js b/Source/Scene/CameraEventAggregator.js index 05154071f1fc..78e6e7206451 100644 --- a/Source/Scene/CameraEventAggregator.js +++ b/Source/Scene/CameraEventAggregator.js @@ -252,7 +252,7 @@ define([ * @alias CameraEventAggregator * @constructor * - * @param {Canvas} [element=document] The element to handle events for. + * @param {Canvas} [canvas=document] The element to handle events for. * * @see ScreenSpaceEventHandler */ diff --git a/Source/Scene/CreditDisplay.js b/Source/Scene/CreditDisplay.js index 270a447e7d95..395512488550 100644 --- a/Source/Scene/CreditDisplay.js +++ b/Source/Scene/CreditDisplay.js @@ -270,8 +270,6 @@ define([ /** * Resets the credit display to a beginning of frame state, clearing out current credits. - * - * @param {Credit} credit The credit to display */ CreditDisplay.prototype.beginFrame = function() { this._currentFrameCredits.imageCredits.length = 0; @@ -280,8 +278,6 @@ define([ /** * Sets the credit display to the end of frame state, displaying current credits in the credit container - * - * @param {Credit} credit The credit to display */ CreditDisplay.prototype.endFrame = function() { var textCredits = this._defaultTextCredits.concat(this._currentFrameCredits.textCredits); diff --git a/Source/Scene/FrameState.js b/Source/Scene/FrameState.js index 94b47ab960ff..03a043a8d367 100644 --- a/Source/Scene/FrameState.js +++ b/Source/Scene/FrameState.js @@ -110,6 +110,15 @@ define([ */ this.occluder = undefined; + /** + * The maximum screen-space error used to drive level-of-detail refinement. Higher + * values will provide better performance but lower visual quality. + * + * @type {Number} + * @default 2 + */ + this.maximumScreenSpaceError = undefined; + this.passes = { /** * true if the primitive should update for a render pass, false otherwise. diff --git a/Source/Scene/GoogleEarthImageryProvider.js b/Source/Scene/GoogleEarthImageryProvider.js index c85499489183..40dfc0ea0836 100644 --- a/Source/Scene/GoogleEarthImageryProvider.js +++ b/Source/Scene/GoogleEarthImageryProvider.js @@ -97,7 +97,7 @@ define([ * url : 'https://earth.localdomain', * channel : 1008 * }); - * + * * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} */ function GoogleEarthImageryProvider(options) { @@ -571,7 +571,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - GoogleEarthImageryProvider.prototype.pickFeatures = function() { + GoogleEarthImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Scene/GridImageryProvider.js b/Source/Scene/GridImageryProvider.js index 9741cc731896..a761703b9c49 100644 --- a/Source/Scene/GridImageryProvider.js +++ b/Source/Scene/GridImageryProvider.js @@ -37,7 +37,7 @@ define([ * @param {Color} [options.color=Color(1.0, 1.0, 1.0, 0.4)] The color to draw grid lines. * @param {Color} [options.glowColor=Color(0.0, 1.0, 0.0, 0.05)] The color to draw glow for grid lines. * @param {Number} [options.glowWidth=6] The width of lines used for rendering the line glow effect. - * @param {Color} [backgroundColor=Color(0.0, 0.5, 0.0, 0.2)] Background fill color. + * @param {Color} [options.backgroundColor=Color(0.0, 0.5, 0.0, 0.2)] Background fill color. * @param {Number} [options.tileWidth=256] The width of the tile for level-of-detail selection purposes. * @param {Number} [options.tileHeight=256] The height of the tile for level-of-detail selection purposes. * @param {Number} [options.canvasSize=256] The size of the canvas used for rendering. @@ -345,7 +345,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - GridImageryProvider.prototype.pickFeatures = function() { + GridImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Scene/GroundPrimitive.js b/Source/Scene/GroundPrimitive.js index 9939662eea12..eadf4b5cfe50 100644 --- a/Source/Scene/GroundPrimitive.js +++ b/Source/Scene/GroundPrimitive.js @@ -5,6 +5,7 @@ define([ '../Core/Cartesian2', '../Core/Cartesian3', '../Core/Cartographic', + '../Core/clone', '../Core/Color', '../Core/ColorGeometryInstanceAttribute', '../Core/defaultValue', @@ -40,6 +41,7 @@ define([ Cartesian2, Cartesian3, Cartographic, + clone, Color, ColorGeometryInstanceAttribute, defaultValue, @@ -196,9 +198,7 @@ define([ /** * This property is for debugging only; it is not for production use nor is it optimized. *

    - * Draws the shadow volume for each geometry in the primitive. Must be true on - * creation for the volumes to be created before the geometry is released or releaseGeometryInstances - * must be false + * Draws the shadow volume for each geometry in the primitive. *

    * * @type {Boolean} @@ -206,6 +206,7 @@ define([ * @default false */ this.debugShowShadowVolume = defaultValue(options.debugShowShadowVolume, false); + this._debugShowShadowVolume = false; this._sp = undefined; this._spPick = undefined; @@ -215,7 +216,11 @@ define([ this._rsColorPass = undefined; this._rsPickPass = undefined; - this._uniformMap = {}; + this._uniformMap = { + u_globeMinimumAltitude: function() { + return 55000.0; + } + }; this._boundingVolumes = []; this._boundingVolumes2D = []; @@ -224,7 +229,6 @@ define([ this._readyPromise = when.defer(); this._primitive = undefined; - this._debugPrimitive = undefined; this._maxHeight = undefined; this._minHeight = undefined; @@ -419,91 +423,98 @@ define([ }; } - var stencilPreloadRenderState = { - colorMask : { - red : false, - green : false, - blue : false, - alpha : false - }, - stencilTest : { - enabled : true, - frontFunction : StencilFunction.ALWAYS, - frontOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.DECREMENT_WRAP, - zPass : StencilOperation.DECREMENT_WRAP + function getStencilPreloadRenderState(enableStencil) { + return { + colorMask : { + red : false, + green : false, + blue : false, + alpha : false }, - backFunction : StencilFunction.ALWAYS, - backOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.INCREMENT_WRAP, - zPass : StencilOperation.INCREMENT_WRAP + stencilTest : { + enabled : enableStencil, + frontFunction : StencilFunction.ALWAYS, + frontOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.DECREMENT_WRAP, + zPass : StencilOperation.DECREMENT_WRAP + }, + backFunction : StencilFunction.ALWAYS, + backOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.INCREMENT_WRAP, + zPass : StencilOperation.INCREMENT_WRAP + }, + reference : 0, + mask : ~0 }, - reference : 0, - mask : ~0 - }, - depthTest : { - enabled : false - }, - depthMask : false - }; + depthTest : { + enabled : false + }, + depthMask : false + }; + } - var stencilDepthRenderState = { - colorMask : { - red : false, - green : false, - blue : false, - alpha : false - }, - stencilTest : { - enabled : true, - frontFunction : StencilFunction.ALWAYS, - frontOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.KEEP, - zPass : StencilOperation.INCREMENT_WRAP + function getStencilDepthRenderState(enableStencil) { + return { + colorMask : { + red : false, + green : false, + blue : false, + alpha : false }, - backFunction : StencilFunction.ALWAYS, - backOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.KEEP, - zPass : StencilOperation.DECREMENT_WRAP + stencilTest : { + enabled : enableStencil, + frontFunction : StencilFunction.ALWAYS, + frontOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.KEEP, + zPass : StencilOperation.INCREMENT_WRAP + }, + backFunction : StencilFunction.ALWAYS, + backOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.KEEP, + zPass : StencilOperation.DECREMENT_WRAP + }, + reference : 0, + mask : ~0 }, - reference : 0, - mask : ~0 - }, - depthTest : { - enabled : true, - func : DepthFunction.LESS_OR_EQUAL - }, - depthMask : false - }; + depthTest : { + enabled : true, + func : DepthFunction.LESS_OR_EQUAL + }, + depthMask : false + }; + } - var colorRenderState = { - stencilTest : { - enabled : true, - frontFunction : StencilFunction.NOT_EQUAL, - frontOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.KEEP, - zPass : StencilOperation.DECREMENT_WRAP + + function getColorRenderState(enableStencil) { + return { + stencilTest : { + enabled : enableStencil, + frontFunction : StencilFunction.NOT_EQUAL, + frontOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.KEEP, + zPass : StencilOperation.DECREMENT_WRAP + }, + backFunction : StencilFunction.NOT_EQUAL, + backOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.KEEP, + zPass : StencilOperation.DECREMENT_WRAP + }, + reference : 0, + mask : ~0 }, - backFunction : StencilFunction.NOT_EQUAL, - backOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.KEEP, - zPass : StencilOperation.DECREMENT_WRAP + depthTest : { + enabled : false }, - reference : 0, - mask : ~0 - }, - depthTest : { - enabled : false - }, - depthMask : false, - blending : BlendingState.ALPHA_BLEND - }; + depthMask : false, + blending : BlendingState.ALPHA_BLEND + }; + } var pickRenderState = { stencilTest : { @@ -688,66 +699,96 @@ define([ return BoundingSphere.union(result, scratchBoundingSphere, result); } - function createBoundingVolume(primitive, frameState, geometry) { + function createBoundingVolume(groundPrimitive, frameState, geometry) { var ellipsoid = frameState.mapProjection.ellipsoid; var rectangle = getRectangle(frameState, geometry); // Use an oriented bounding box by default, but switch to a bounding sphere if bounding box creation would fail. if (rectangle.width < CesiumMath.PI) { - var obb = OrientedBoundingBox.fromRectangle(rectangle, primitive._maxHeight, primitive._minHeight, ellipsoid); - primitive._boundingVolumes.push(obb); + var obb = OrientedBoundingBox.fromRectangle(rectangle, groundPrimitive._maxHeight, groundPrimitive._minHeight, ellipsoid); + groundPrimitive._boundingVolumes.push(obb); } else { var highPositions = geometry.attributes.position3DHigh.values; var lowPositions = geometry.attributes.position3DLow.values; - primitive._boundingVolumes.push(BoundingSphere.fromEncodedCartesianVertices(highPositions, lowPositions)); + groundPrimitive._boundingVolumes.push(BoundingSphere.fromEncodedCartesianVertices(highPositions, lowPositions)); } if (!frameState.scene3DOnly) { var projection = frameState.mapProjection; - var boundingVolume = BoundingSphere.fromRectangleWithHeights2D(rectangle, projection, primitive._maxHeight, primitive._minHeight); + var boundingVolume = BoundingSphere.fromRectangleWithHeights2D(rectangle, projection, groundPrimitive._maxHeight, groundPrimitive._minHeight); Cartesian3.fromElements(boundingVolume.center.z, boundingVolume.center.x, boundingVolume.center.y, boundingVolume.center); - primitive._boundingVolumes2D.push(boundingVolume); + groundPrimitive._boundingVolumes2D.push(boundingVolume); } } - function createRenderStates(primitive, context, appearance, twoPasses) { - if (defined(primitive._rsStencilPreloadPass)) { + function createRenderStates(groundPrimitive, context, appearance, twoPasses) { + if (defined(groundPrimitive._rsStencilPreloadPass)) { return; } + var stencilEnabled = !groundPrimitive.debugShowShadowVolume; - primitive._rsStencilPreloadPass = RenderState.fromCache(stencilPreloadRenderState); - primitive._rsStencilDepthPass = RenderState.fromCache(stencilDepthRenderState); - primitive._rsColorPass = RenderState.fromCache(colorRenderState); - primitive._rsPickPass = RenderState.fromCache(pickRenderState); + groundPrimitive._rsStencilPreloadPass = RenderState.fromCache(getStencilPreloadRenderState(stencilEnabled)); + groundPrimitive._rsStencilDepthPass = RenderState.fromCache(getStencilDepthRenderState(stencilEnabled)); + groundPrimitive._rsColorPass = RenderState.fromCache(getColorRenderState(stencilEnabled)); + groundPrimitive._rsPickPass = RenderState.fromCache(pickRenderState); } - function createShaderProgram(primitive, frameState, appearance) { - if (defined(primitive._sp)) { + function modifyForEncodedNormals(primitive, vertexShaderSource) { + if (!primitive.compressVertices) { + return vertexShaderSource; + } + + if (vertexShaderSource.search(/attribute\s+vec3\s+extrudeDirection;/g) !== -1) { + var attributeName = 'compressedAttributes'; + + //only shadow volumes use extrudeDirection, and shadow volumes use vertexFormat: POSITION_ONLY so we don't need to check other attributes + var attributeDecl = 'attribute vec2 ' + attributeName + ';'; + + var globalDecl = 'vec3 extrudeDirection;\n'; + var decode = ' extrudeDirection = czm_octDecode(' + attributeName + ', 65535.0);\n'; + + var modifiedVS = vertexShaderSource; + modifiedVS = modifiedVS.replace(/attribute\s+vec3\s+extrudeDirection;/g, ''); + modifiedVS = ShaderSource.replaceMain(modifiedVS, 'czm_non_compressed_main'); + var compressedMain = + 'void main() \n' + + '{ \n' + + decode + + ' czm_non_compressed_main(); \n' + + '}'; + + return [attributeDecl, globalDecl, modifiedVS, compressedMain].join('\n'); + } + } + + function createShaderProgram(groundPrimitive, frameState, appearance) { + if (defined(groundPrimitive._sp)) { return; } var context = frameState.context; - + var primitive = groundPrimitive._primitive; var vs = ShadowVolumeVS; - vs = primitive._primitive._batchTable.getVertexShaderCallback()(vs); - vs = Primitive._appendShowToShader(primitive._primitive, vs); - vs = Primitive._appendDistanceDisplayConditionToShader(primitive._primitive, vs); - vs = Primitive._modifyShaderPosition(primitive, vs, frameState.scene3DOnly); - vs = Primitive._updateColorAttribute(primitive._primitive, vs); + vs = groundPrimitive._primitive._batchTable.getVertexShaderCallback()(vs); + vs = Primitive._appendShowToShader(primitive, vs); + vs = Primitive._appendDistanceDisplayConditionToShader(primitive, vs); + vs = Primitive._modifyShaderPosition(groundPrimitive, vs, frameState.scene3DOnly); + vs = Primitive._updateColorAttribute(primitive, vs); + vs = modifyForEncodedNormals(primitive, vs); var fs = ShadowVolumeFS; - var attributeLocations = primitive._primitive._attributeLocations; + var attributeLocations = groundPrimitive._primitive._attributeLocations; - primitive._sp = ShaderProgram.replaceCache({ + groundPrimitive._sp = ShaderProgram.replaceCache({ context : context, - shaderProgram : primitive._sp, + shaderProgram : groundPrimitive._sp, vertexShaderSource : vs, fragmentShaderSource : fs, attributeLocations : attributeLocations }); - if (primitive._primitive.allowPicking) { + if (groundPrimitive._primitive.allowPicking) { var vsPick = ShaderSource.createPickVertexShaderSource(vs); vsPick = Primitive._updatePickColorAttribute(vsPick); @@ -755,15 +796,15 @@ define([ sources : [fs], pickColorQualifier : 'varying' }); - primitive._spPick = ShaderProgram.replaceCache({ + groundPrimitive._spPick = ShaderProgram.replaceCache({ context : context, - shaderProgram : primitive._spPick, + shaderProgram : groundPrimitive._spPick, vertexShaderSource : vsPick, fragmentShaderSource : pickFS, attributeLocations : attributeLocations }); } else { - primitive._spPick = ShaderProgram.fromCache({ + groundPrimitive._spPick = ShaderProgram.fromCache({ context : context, vertexShaderSource : vs, fragmentShaderSource : fs, @@ -1007,8 +1048,10 @@ define([ return; } + var that = this; + var primitiveOptions = this._primitiveOptions; + if (!defined(this._primitive)) { - var primitiveOptions = this._primitiveOptions; var ellipsoid = frameState.mapProjection.ellipsoid; var instance; @@ -1082,7 +1125,6 @@ define([ primitiveOptions.geometryInstances = groundInstances; - var that = this; primitiveOptions._createBoundingVolumeFunction = function(frameState, geometry) { createBoundingVolume(that, frameState, geometry); }; @@ -1116,52 +1158,20 @@ define([ }); } - this._primitive.debugShowBoundingVolume = this.debugShowBoundingVolume; - this._primitive.update(frameState); - - if (this.debugShowShadowVolume && !defined(this._debugPrimitive) && defined(this.geometryInstances)) { - var debugInstances = isArray(this.geometryInstances) ? this.geometryInstances : [this.geometryInstances]; - var debugLength = debugInstances.length; - var debugVolumeInstances = new Array(debugLength); - - for (var j = 0 ; j < debugLength; ++j) { - var debugInstance = debugInstances[j]; - var debugGeometry = debugInstance.geometry; - var debugInstanceType = debugGeometry.constructor; - if (defined(debugInstanceType) && defined(debugInstanceType.createShadowVolume)) { - var debugColorArray = debugInstance.attributes.color.value; - var debugColor = Color.fromBytes(debugColorArray[0], debugColorArray[1], debugColorArray[2], debugColorArray[3]); - Color.subtract(new Color(1.0, 1.0, 1.0, 0.0), debugColor, debugColor); - debugVolumeInstances[j] = new GeometryInstance({ - geometry : debugInstanceType.createShadowVolume(debugGeometry, getComputeMinimumHeightFunction(this), getComputeMaximumHeightFunction(this)), - attributes : { - color : ColorGeometryInstanceAttribute.fromColor(debugColor) - }, - id : debugInstance.id, - pickPrimitive : this - }); - } - } - - this._debugPrimitive = new Primitive({ - geometryInstances : debugVolumeInstances, - releaseGeometryInstances : true, - allowPicking : false, - asynchronous : false, - appearance : new PerInstanceColorAppearance({ - flat : true - }) - }); + if (this.debugShowShadowVolume && !this._debugShowShadowVolume && this._ready) { + this._debugShowShadowVolume = true; + this._rsStencilPreloadPass = RenderState.fromCache(getStencilPreloadRenderState(false)); + this._rsStencilDepthPass = RenderState.fromCache(getStencilDepthRenderState(false)); + this._rsColorPass = RenderState.fromCache(getColorRenderState(false)); + } else if (!this.debugShowShadowVolume && this._debugShowShadowVolume) { + this._debugShowShadowVolume = false; + this._rsStencilPreloadPass = RenderState.fromCache(getStencilPreloadRenderState(true)); + this._rsStencilDepthPass = RenderState.fromCache(getStencilDepthRenderState(true)); + this._rsColorPass = RenderState.fromCache(getColorRenderState(true)); } - if (defined(this._debugPrimitive)) { - if (this.debugShowShadowVolume) { - this._debugPrimitive.update(frameState); - } else { - this._debugPrimitive.destroy(); - this._debugPrimitive = undefined; - } - } + this._primitive.debugShowBoundingVolume = this.debugShowBoundingVolume; + this._primitive.update(frameState); }; /** @@ -1233,7 +1243,6 @@ define([ */ GroundPrimitive.prototype.destroy = function() { this._primitive = this._primitive && this._primitive.destroy(); - this._debugPrimitive = this._debugPrimitive && this._debugPrimitive.destroy(); this._sp = this._sp && this._sp.destroy(); this._spPick = this._spPick && this._spPick.destroy(); return destroyObject(this); diff --git a/Source/Scene/ImageryLayer.js b/Source/Scene/ImageryLayer.js index 6f8897daaee1..887d84d5bfc2 100644 --- a/Source/Scene/ImageryLayer.js +++ b/Source/Scene/ImageryLayer.js @@ -576,7 +576,7 @@ define([ if (!defined(clippedImageryRectangle)) { continue; } - + minV = Math.max(0.0, (clippedImageryRectangle.south - terrainRectangle.south) / terrainRectangle.height); // If this is the southern-most imagery tile mapped to this terrain tile, @@ -1073,6 +1073,7 @@ define([ /** * Gets the level with the specified world coordinate spacing between texels, or less. * + * @param {ImageryLayer} layer The imagery layer to use. * @param {Number} texelSpacing The texel spacing for which to find a corresponding level. * @param {Number} latitudeClosestToEquator The latitude closest to the equator that we're concerned with. * @returns {Number} The level with the specified texel spacing or less. diff --git a/Source/Scene/Material.js b/Source/Scene/Material.js index 11a8bf488089..c48952fa276f 100644 --- a/Source/Scene/Material.js +++ b/Source/Scene/Material.js @@ -1381,7 +1381,7 @@ define([ }, translucent : function(material) { var uniforms = material.uniforms; - return (uniforms.fadeInColor.alpha < 1.0) || (uniforms.fadeOutColor.alpha < 0.0); + return (uniforms.fadeInColor.alpha < 1.0) || (uniforms.fadeOutColor.alpha < 1.0); } }); diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 2345ac19b578..0205d33c27a7 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -439,6 +439,7 @@ define([ */ this.silhouetteColor = defaultValue(options.silhouetteColor, Color.RED); this._silhouetteColor = new Color(); + this._silhouetteColorPreviousAlpha = 1.0; this._normalAttributeName = undefined; /** @@ -577,6 +578,7 @@ define([ */ this.color = defaultValue(options.color, Color.WHITE); this._color = new Color(); + this._colorPreviousAlpha = 1.0; /** * Defines how the color blends with the model. @@ -4002,12 +4004,12 @@ define([ } var nodeCommands = model._nodeCommands; - var dirty = alphaDirty(model.color.alpha, model._color.alpha) || - alphaDirty(model.silhouetteColor.alpha, model._silhouetteColor.alpha) || + var dirty = alphaDirty(model.color.alpha, model._colorPreviousAlpha) || + alphaDirty(model.silhouetteColor.alpha, model._silhouetteColorPreviousAlpha) || !defined(nodeCommands[0].silhouetteModelCommand); - Color.clone(model.color, model._color); - Color.clone(model.silhouetteColor, model._silhouetteColor); + model._colorPreviousAlpha = model.color.alpha; + model._silhouetteColorPreviousAlpha = model.silhouetteColor.alpha; if (dirty) { createSilhouetteCommands(model, frameState); diff --git a/Source/Scene/Polyline.js b/Source/Scene/Polyline.js index e88365516fdf..f73352d37eca 100644 --- a/Source/Scene/Polyline.js +++ b/Source/Scene/Polyline.js @@ -41,6 +41,7 @@ define([ * @param {Cartesian3[]} [options.positions] The positions. * @param {Object} [options.id] The user-defined object to be returned when this polyline is picked. * @param {DistanceDisplayCondition} [options.distanceDisplayCondition] The condition specifying at what distance from the camera that this polyline will be displayed. + * @param {PolylineCollection} polylineCollection The renderable polyline collection. * * @see PolylineCollection * diff --git a/Source/Scene/Scene.js b/Source/Scene/Scene.js index 88f9d7a77612..6487b9af7815 100644 --- a/Source/Scene/Scene.js +++ b/Source/Scene/Scene.js @@ -1181,6 +1181,11 @@ define([ frameState.cullingVolume = camera.frustum.computeCullingVolume(camera.positionWC, camera.directionWC, camera.upWC); frameState.occluder = getOccluder(scene); frameState.terrainExaggeration = scene._terrainExaggeration; + if (defined(scene.globe)) { + frameState.maximumScreenSpaceError = scene.globe.maximumScreenSpaceError; + } else { + frameState.maximumScreenSpaceError = 2; + } clearPasses(frameState.passes); } diff --git a/Source/Scene/SingleTileImageryProvider.js b/Source/Scene/SingleTileImageryProvider.js index 258c5a7c526b..4d59f9fbd8e7 100644 --- a/Source/Scene/SingleTileImageryProvider.js +++ b/Source/Scene/SingleTileImageryProvider.js @@ -402,7 +402,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - SingleTileImageryProvider.prototype.pickFeatures = function() { + SingleTileImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Scene/TileCoordinatesImageryProvider.js b/Source/Scene/TileCoordinatesImageryProvider.js index 71290b1db166..f55e31100cb2 100644 --- a/Source/Scene/TileCoordinatesImageryProvider.js +++ b/Source/Scene/TileCoordinatesImageryProvider.js @@ -283,7 +283,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - TileCoordinatesImageryProvider.prototype.pickFeatures = function() { + TileCoordinatesImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Scene/TileImagery.js b/Source/Scene/TileImagery.js index ad1e0fd4bd5c..282b44cda6a7 100644 --- a/Source/Scene/TileImagery.js +++ b/Source/Scene/TileImagery.js @@ -65,7 +65,7 @@ define([ // Find some ancestor imagery we can use while this imagery is still loading. var ancestor = loadingImagery.parent; var closestAncestorThatNeedsLoading; - while (defined(ancestor) && ancestor.state !== ImageryState.READY) { + while (defined(ancestor) && (ancestor.state !== ImageryState.READY || (!this.useWebMercatorT && !defined(ancestor.texture)))) { if (ancestor.state !== ImageryState.FAILED && ancestor.state !== ImageryState.INVALID) { // ancestor is still loading closestAncestorThatNeedsLoading = closestAncestorThatNeedsLoading || ancestor; diff --git a/Source/Scene/WebMapServiceImageryProvider.js b/Source/Scene/WebMapServiceImageryProvider.js index fe0a2d9fa217..24e3242d8b7f 100644 --- a/Source/Scene/WebMapServiceImageryProvider.js +++ b/Source/Scene/WebMapServiceImageryProvider.js @@ -132,7 +132,19 @@ define([ } setParameter('layers', options.layers); - setParameter('srs', options.tilingScheme instanceof WebMercatorTilingScheme ? 'EPSG:3857' : 'EPSG:4326'); + + // Use SRS or CRS based on the WMS version. + if (parseFloat(parameters.version) >= 1.3) { + // Use CRS with 1.3.0 and going forward. + // For GeographicTilingScheme, use CRS:84 vice EPSG:4326 to specify lon, lat (x, y) ordering for + // bbox requests. + setParameter('crs', options.tilingScheme instanceof WebMercatorTilingScheme ? 'EPSG:3857' : 'CRS:84'); + } + else { + // SRS for WMS 1.1.0 or 1.1.1. + setParameter('srs', options.tilingScheme instanceof WebMercatorTilingScheme ? 'EPSG:3857' : 'EPSG:4326'); + } + setParameter('bbox', '{westProjected},{southProjected},{eastProjected},{northProjected}'); setParameter('width', '{width}'); setParameter('height', '{height}'); diff --git a/Source/Scene/WebMapTileServiceImageryProvider.js b/Source/Scene/WebMapTileServiceImageryProvider.js index 4ab21cda1a1c..1f2355e9e537 100644 --- a/Source/Scene/WebMapTileServiceImageryProvider.js +++ b/Source/Scene/WebMapTileServiceImageryProvider.js @@ -89,7 +89,7 @@ define([ * credit : new Cesium.Credit('U. S. Geological Survey') * }); * viewer.imageryLayers.addImageryProvider(shadedRelief2); - * + * * @see ArcGisMapServerImageryProvider * @see BingMapsImageryProvider * @see GoogleEarthImageryProvider @@ -459,7 +459,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - WebMapTileServiceImageryProvider.prototype.pickFeatures = function() { + WebMapTileServiceImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Shaders/Builtin/Functions/octDecode.glsl b/Source/Shaders/Builtin/Functions/octDecode.glsl index 4fe85a220bb6..ce4df362da12 100644 --- a/Source/Shaders/Builtin/Functions/octDecode.glsl +++ b/Source/Shaders/Builtin/Functions/octDecode.glsl @@ -1,3 +1,29 @@ + /** + * Decodes a unit-length vector in 'oct' encoding to a normalized 3-component Cartesian vector. + * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", + * Cigolle et al 2014: http://jcgt.org/published/0003/02/01/ + * + * @name czm_octDecode + * @param {vec2} encoded The oct-encoded, unit-length vector + * @param {float} range The maximum value of the SNORM range. The encoded vector is stored in log2(rangeMax+1) bits. + * @returns {vec3} The decoded and normalized vector + */ + vec3 czm_octDecode(vec2 encoded, float range) + { + if (encoded.x == 0.0 && encoded.y == 0.0) { + return vec3(0.0, 0.0, 0.0); + } + + encoded = encoded / range * 2.0 - 1.0; + vec3 v = vec3(encoded.x, encoded.y, 1.0 - abs(encoded.x) - abs(encoded.y)); + if (v.z < 0.0) + { + v.xy = (1.0 - abs(v.yx)) * czm_signNotZero(v.xy); + } + + return normalize(v); + } + /** * Decodes a unit-length vector in 'oct' encoding to a normalized 3-component Cartesian vector. * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", @@ -9,14 +35,7 @@ */ vec3 czm_octDecode(vec2 encoded) { - encoded = encoded / 255.0 * 2.0 - 1.0; - vec3 v = vec3(encoded.x, encoded.y, 1.0 - abs(encoded.x) - abs(encoded.y)); - if (v.z < 0.0) - { - v.xy = (1.0 - abs(v.yx)) * czm_signNotZero(v.xy); - } - - return normalize(v); + return czm_octDecode(encoded, 255.0); } /** diff --git a/Source/Shaders/ShadowVolumeVS.glsl b/Source/Shaders/ShadowVolumeVS.glsl index a97b96c1752b..888eca6500dd 100644 --- a/Source/Shaders/ShadowVolumeVS.glsl +++ b/Source/Shaders/ShadowVolumeVS.glsl @@ -1,8 +1,11 @@ attribute vec3 position3DHigh; attribute vec3 position3DLow; +attribute vec3 extrudeDirection; attribute vec4 color; attribute float batchId; +uniform float u_globeMinimumAltitude; + // emulated noperspective varying float v_WindowZ; varying vec4 v_color; @@ -17,7 +20,11 @@ vec4 depthClampFarPlane(vec4 vertexInClipCoordinates) void main() { v_color = color; - + vec4 position = czm_computePosition(); + float delta = min(u_globeMinimumAltitude, czm_geometricToleranceOverMeter * length(position.xyz)); + + //extrudeDirection is zero for the top layer + position = position + vec4(extrudeDirection * delta, 0.0); gl_Position = depthClampFarPlane(czm_modelViewProjectionRelativeToEye * position); } diff --git a/Source/Widgets/CesiumInspector/CesiumInspectorViewModel.js b/Source/Widgets/CesiumInspector/CesiumInspectorViewModel.js index cf787930de7b..107e0368e755 100644 --- a/Source/Widgets/CesiumInspector/CesiumInspectorViewModel.js +++ b/Source/Widgets/CesiumInspector/CesiumInspectorViewModel.js @@ -70,6 +70,7 @@ define([ * @constructor * * @param {Scene} scene The scene instance to use. + * @param {PerformanceContainer} performanceContainer The instance to use for performance container. * * @exception {DeveloperError} scene is required. */ diff --git a/Source/Widgets/Viewer/viewerPerformanceWatchdogMixin.js b/Source/Widgets/Viewer/viewerPerformanceWatchdogMixin.js index 9b6f57bd98c5..e92ec1e76385 100644 --- a/Source/Widgets/Viewer/viewerPerformanceWatchdogMixin.js +++ b/Source/Widgets/Viewer/viewerPerformanceWatchdogMixin.js @@ -20,6 +20,7 @@ define([ * @exports viewerPerformanceWatchdogMixin * * @param {Viewer} viewer The viewer instance. + * @param {Object} [options] An object with properties. * @param {String} [options.lowFrameRateMessage='This application appears to be performing poorly on your system. Please try using a different web browser or updating your video drivers.'] The * message to display when a low frame rate is detected. The message is interpeted as HTML, so make sure * it comes from a trusted source so that your application is not vulnerable to cross-site scripting attacks. diff --git a/Source/Workers/cesiumWorkerBootstrapper.js b/Source/Workers/cesiumWorkerBootstrapper.js index 955e265dfa96..d955005d42bf 100644 --- a/Source/Workers/cesiumWorkerBootstrapper.js +++ b/Source/Workers/cesiumWorkerBootstrapper.js @@ -178,8 +178,9 @@ var requirejs, require, define; /** * Constructs an error with a pointer to an URL with more information. * @param {String} id the error ID that maps to an ID on a web page. - * @param {String} message human readable error. + * @param {String} msg human readable error. * @param {Error} [err] the original error, if there is one. + * @param {RequireModules} requireModules The modules required but not found. * * @returns {Error} */ diff --git a/Specs/Core/CheckSpec.js b/Specs/Core/CheckSpec.js index 54bcc1cd304b..36c06c062063 100644 --- a/Specs/Core/CheckSpec.js +++ b/Specs/Core/CheckSpec.js @@ -6,27 +6,27 @@ defineSuite([ 'use strict'; describe('type checks', function () { - it('Check.typeOf.boolean does not throw when passed a boolean', function () { + it('Check.typeOf.bool does not throw when passed a boolean', function () { expect(function () { - Check.typeOf.boolean(true); + Check.typeOf.bool(true); }).not.toThrowDeveloperError(); }); it('Check.typeOf.boolean throws when passed a non-boolean', function () { expect(function () { - Check.typeOf.boolean({}, 'mockName'); + Check.typeOf.bool({}, 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.boolean([], 'mockName'); + Check.typeOf.bool([], 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.boolean(1, 'mockName'); + Check.typeOf.bool(1, 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.boolean('snth', 'mockName'); + Check.typeOf.bool('snth', 'mockName'); }).toThrowDeveloperError(); expect(function () { - Check.typeOf.boolean(function () {return true;}, 'mockName'); + Check.typeOf.bool(function () {return true;}, 'mockName'); }).toThrowDeveloperError(); }); diff --git a/Specs/Core/CircleGeometrySpec.js b/Specs/Core/CircleGeometrySpec.js index d41fc2a3c42a..ec7fdac5fb63 100644 --- a/Specs/Core/CircleGeometrySpec.js +++ b/Specs/Core/CircleGeometrySpec.js @@ -178,6 +178,6 @@ defineSuite([ radius : 1.0, stRotation : CesiumMath.PI_OVER_TWO }); - var packedInstance = [center.x, center.y, center.z, ellipsoid.radii.x, ellipsoid.radii.y, ellipsoid.radii.z, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, rectangle.west, rectangle.south, rectangle.east, rectangle.north, 1.0, 1.0, 0.0, CesiumMath.PI_OVER_TWO, 0.0, 0.1, 0.0, 0.0]; + var packedInstance = [center.x, center.y, center.z, ellipsoid.radii.x, ellipsoid.radii.y, ellipsoid.radii.z, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, rectangle.west, rectangle.south, rectangle.east, rectangle.north, 1.0, 1.0, 0.0, CesiumMath.PI_OVER_TWO, 0.0, 0.1, 0.0, 0.0, 0.0]; createPackableSpecs(CircleGeometry, packableInstance, packedInstance); }); diff --git a/Specs/Core/CorridorGeometrySpec.js b/Specs/Core/CorridorGeometrySpec.js index 1862108eabbc..4bac8615e1ba 100644 --- a/Specs/Core/CorridorGeometrySpec.js +++ b/Specs/Core/CorridorGeometrySpec.js @@ -291,6 +291,6 @@ defineSuite([ packedInstance.push(Ellipsoid.WGS84.radii.x, Ellipsoid.WGS84.radii.y, Ellipsoid.WGS84.radii.z); packedInstance.push(1.0, 0.0, 0.0, 0.0, 0.0, 0.0); packedInstance.push(rectangle.west, rectangle.south, rectangle.east, rectangle.north); - packedInstance.push(30000.0, 0.0, 0.0, 2.0, 0.1); + packedInstance.push(30000.0, 0.0, 0.0, 2.0, 0.1, 0.0); createPackableSpecs(CorridorGeometry, corridor, packedInstance); }); diff --git a/Specs/Core/EllipseGeometrySpec.js b/Specs/Core/EllipseGeometrySpec.js index df9f86701a16..0af786c8bf03 100644 --- a/Specs/Core/EllipseGeometrySpec.js +++ b/Specs/Core/EllipseGeometrySpec.js @@ -265,7 +265,7 @@ defineSuite([ semiMinorAxis : 1.0, stRotation : CesiumMath.PI_OVER_TWO }); - var packedInstance = [center.x, center.y, center.z, ellipsoid.radii.x, ellipsoid.radii.y, ellipsoid.radii.z, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, rectangle.west, rectangle.south, rectangle.east, rectangle.north, 1.0, 1.0, 0.0, CesiumMath.PI_OVER_TWO, 0.0, 0.1, 0.0, 0.0]; + var packedInstance = [center.x, center.y, center.z, ellipsoid.radii.x, ellipsoid.radii.y, ellipsoid.radii.z, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, rectangle.west, rectangle.south, rectangle.east, rectangle.north, 1.0, 1.0, 0.0, CesiumMath.PI_OVER_TWO, 0.0, 0.1, 0.0, 0.0, 0.0]; createPackableSpecs(EllipseGeometry, packableInstance, packedInstance); }); diff --git a/Specs/Core/PolygonGeometrySpec.js b/Specs/Core/PolygonGeometrySpec.js index 2d2aae6b3d41..d29fdb8bbc43 100644 --- a/Specs/Core/PolygonGeometrySpec.js +++ b/Specs/Core/PolygonGeometrySpec.js @@ -699,6 +699,6 @@ defineSuite([ packedInstance.push(Ellipsoid.WGS84.radii.x, Ellipsoid.WGS84.radii.y, Ellipsoid.WGS84.radii.z); packedInstance.push(1.0, 0.0, 0.0, 0.0, 0.0, 0.0); packedInstance.push(rectangle.west, rectangle.south, rectangle.east, rectangle.north); - packedInstance.push(0.0, 0.0, CesiumMath.PI_OVER_THREE, 0.0, 0.0, 1.0, 0, 1, 55); + packedInstance.push(0.0, 0.0, CesiumMath.PI_OVER_THREE, 0.0, 0.0, 1.0, 0, 1, 0, 56); createPackableSpecs(PolygonGeometry, polygon, packedInstance); }); diff --git a/Specs/Core/RectangleGeometrySpec.js b/Specs/Core/RectangleGeometrySpec.js index 5ed3b14f5b39..0e1e51f92d7e 100644 --- a/Specs/Core/RectangleGeometrySpec.js +++ b/Specs/Core/RectangleGeometrySpec.js @@ -349,6 +349,6 @@ defineSuite([ granularity : 1.0, ellipsoid : Ellipsoid.UNIT_SPHERE }); - var packedInstance = [-2.0, -1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -2.0, -1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0]; + var packedInstance = [-2.0, -1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -2.0, -1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0]; createPackableSpecs(RectangleGeometry, rectangle, packedInstance); }); diff --git a/Specs/Core/TransformsSpec.js b/Specs/Core/TransformsSpec.js index de42f2f68270..1d4682ca3b7a 100644 --- a/Specs/Core/TransformsSpec.js +++ b/Specs/Core/TransformsSpec.js @@ -357,7 +357,7 @@ defineSuite([ var transform = Transforms.headingPitchRollToFixedFrame(origin, hpr, Ellipsoid.UNIT_SPHERE); var expected = Matrix4.getRotation(transform, new Matrix3()); - var quaternion = Transforms.headingPitchRollQuaternion(origin, heading, pitch, roll, Ellipsoid.UNIT_SPHERE); + var quaternion = Transforms.headingPitchRollQuaternion(origin, hpr, Ellipsoid.UNIT_SPHERE); var actual = Matrix3.fromQuaternion(quaternion); expect(actual).toEqualEpsilon(expected, CesiumMath.EPSILON11); }); @@ -388,7 +388,7 @@ defineSuite([ var expected = Matrix4.getRotation(transform, new Matrix3()); var result = new Quaternion(); - var quaternion = Transforms.headingPitchRollQuaternion(origin, heading, pitch, roll, Ellipsoid.UNIT_SPHERE, result); + var quaternion = Transforms.headingPitchRollQuaternion(origin, hpr, Ellipsoid.UNIT_SPHERE, result); var actual = Matrix3.fromQuaternion(quaternion); expect(quaternion).toBe(result); expect(actual).toEqualEpsilon(expected, CesiumMath.EPSILON11); @@ -923,21 +923,9 @@ defineSuite([ }).toThrowDeveloperError(); }); - it('headingPitchRollToFixedFrame throws without an heading', function() { - expect(function() { - Transforms.headingPitchRollToFixedFrame(Cartesian3.ZERO, undefined, 0.0, 0.0); - }).toThrowDeveloperError(); - }); - - it('headingPitchRollToFixedFrame throws without an pitch', function() { - expect(function() { - Transforms.headingPitchRollToFixedFrame(Cartesian3.ZERO, 0.0, undefined, 0.0); - }).toThrowDeveloperError(); - }); - - it('headingPitchRollToFixedFrame throws without an roll', function() { + it('headingPitchRollToFixedFrame throws without a headingPitchRoll', function() { expect(function() { - Transforms.headingPitchRollToFixedFrame(Cartesian3.ZERO, 0.0, 0.0, undefined); + Transforms.headingPitchRollToFixedFrame(Cartesian3.ZERO, undefined); }).toThrowDeveloperError(); }); diff --git a/Specs/DataSources/KmlDataSourceSpec.js b/Specs/DataSources/KmlDataSourceSpec.js index 6047c568d1a1..5745748e366a 100644 --- a/Specs/DataSources/KmlDataSourceSpec.js +++ b/Specs/DataSources/KmlDataSourceSpec.js @@ -1014,6 +1014,23 @@ defineSuite([ }); }); + it('Styles: empty color', function() { + CesiumMath.setRandomNumberSeed(0); + + var kml = '\ + \ + \ + '; + + return KmlDataSource.load(parser.parseFromString(kml, "text/xml"), options).then(function(dataSource) { + expect(dataSource.entities.values[0].billboard.color).toBeUndefined(); + }); + }); + it('Styles: Applies expected styles to Point geometry', function() { var kml = '\ Date: Wed, 11 Jan 2017 14:34:09 -0500 Subject: [PATCH 394/396] Fixes to tests caused by breaking API change in Transform heading pitch roll --- Specs/Scene/Batched3DModel3DTileContentSpec.js | 5 ++++- Specs/Scene/Cesium3DTileSpec.js | 5 ++++- Specs/Scene/EllipsoidPrimitiveSpec.js | 4 ++-- Specs/Scene/Instanced3DModel3DTileContentSpec.js | 5 ++++- Specs/Scene/ModelInstanceCollectionSpec.js | 5 ++++- Specs/Scene/PointCloud3DTileContentSpec.js | 5 ++++- 6 files changed, 22 insertions(+), 7 deletions(-) diff --git a/Specs/Scene/Batched3DModel3DTileContentSpec.js b/Specs/Scene/Batched3DModel3DTileContentSpec.js index 255fd33acbb9..23a84361de6c 100644 --- a/Specs/Scene/Batched3DModel3DTileContentSpec.js +++ b/Specs/Scene/Batched3DModel3DTileContentSpec.js @@ -4,6 +4,7 @@ defineSuite([ 'Core/Cartesian3', 'Core/deprecationWarning', 'Core/HeadingPitchRange', + 'Core/HeadingPitchRoll', 'Core/Transforms', 'Specs/Cesium3DTilesTester', 'Specs/createScene' @@ -12,6 +13,7 @@ defineSuite([ Cartesian3, deprecationWarning, HeadingPitchRange, + HeadingPitchRoll, Transforms, Cesium3DTilesTester, createScene) { @@ -169,7 +171,8 @@ defineSuite([ var newLongitude = -1.31962; var newLatitude = 0.698874; var newCenter = Cartesian3.fromRadians(newLongitude, newLatitude, 0.0); - var newTransform = Transforms.headingPitchRollToFixedFrame(newCenter, 0.0, 0.0, 0.0); + var newHPR = new HeadingPitchRoll(); + var newTransform = Transforms.headingPitchRollToFixedFrame(newCenter, newHPR); // Update tile transform tileset._root.transform = newTransform; diff --git a/Specs/Scene/Cesium3DTileSpec.js b/Specs/Scene/Cesium3DTileSpec.js index 3eb4bf3a0e98..806db5c39227 100644 --- a/Specs/Scene/Cesium3DTileSpec.js +++ b/Specs/Scene/Cesium3DTileSpec.js @@ -4,6 +4,7 @@ defineSuite([ 'Core/Cartesian3', 'Core/clone', 'Core/defined', + 'Core/HeadingPitchRoll', 'Core/Math', 'Core/Matrix3', 'Core/Matrix4', @@ -18,6 +19,7 @@ defineSuite([ Cartesian3, clone, defined, + HeadingPitchRoll, CesiumMath, Matrix3, Matrix4, @@ -136,7 +138,8 @@ defineSuite([ function getTileTransform(longitude, latitude) { var transformCenter = Cartesian3.fromRadians(longitude, latitude, 0.0); - var transformMatrix = Transforms.headingPitchRollToFixedFrame(transformCenter, 0.0, 0.0, 0.0); + var hpr = new HeadingPitchRoll(); + var transformMatrix = Transforms.headingPitchRollToFixedFrame(transformCenter, hpr); return Matrix4.pack(transformMatrix, new Array(16)); } diff --git a/Specs/Scene/EllipsoidPrimitiveSpec.js b/Specs/Scene/EllipsoidPrimitiveSpec.js index 764ea7575424..f0927d332a54 100644 --- a/Specs/Scene/EllipsoidPrimitiveSpec.js +++ b/Specs/Scene/EllipsoidPrimitiveSpec.js @@ -55,7 +55,7 @@ defineSuite([ var e = new EllipsoidPrimitive({ center : new Cartesian3(1.0, 2.0, 3.0), radii : new Cartesian3(4.0, 5.0, 6.0), - modelMatrix : Matrix4.fromScale(2.0), + modelMatrix : Matrix4.fromUniformScale(2.0), show : false, material : material, id : 'id', @@ -64,7 +64,7 @@ defineSuite([ expect(e.center).toEqual(new Cartesian3(1.0, 2.0, 3.0)); expect(e.radii).toEqual(new Cartesian3(4.0, 5.0, 6.0)); - expect(e.modelMatrix).toEqual(Matrix4.fromScale(2.0)); + expect(e.modelMatrix).toEqual(Matrix4.fromUniformScale(2.0)); expect(e.show).toEqual(false); expect(e.material).toBe(material); expect(e.id).toEqual('id'); diff --git a/Specs/Scene/Instanced3DModel3DTileContentSpec.js b/Specs/Scene/Instanced3DModel3DTileContentSpec.js index d6326f5be6d6..4b73c42d0dcb 100644 --- a/Specs/Scene/Instanced3DModel3DTileContentSpec.js +++ b/Specs/Scene/Instanced3DModel3DTileContentSpec.js @@ -3,6 +3,7 @@ defineSuite([ 'Scene/Instanced3DModel3DTileContent', 'Core/Cartesian3', 'Core/HeadingPitchRange', + 'Core/HeadingPitchRoll', 'Core/Transforms', 'Scene/Cesium3DTileContentState', 'Scene/TileBoundingSphere', @@ -12,6 +13,7 @@ defineSuite([ Instanced3DModel3DTileContent, Cartesian3, HeadingPitchRange, + HeadingPitchRoll, Transforms, Cesium3DTileContentState, TileBoundingSphere, @@ -198,7 +200,8 @@ defineSuite([ var newLongitude = -1.31962; var newLatitude = 0.698874; var newCenter = Cartesian3.fromRadians(newLongitude, newLatitude, 15.0); - var newTransform = Transforms.headingPitchRollToFixedFrame(newCenter, 0.0, 0.0, 0.0); + var newHPR = new HeadingPitchRoll(); + var newTransform = Transforms.headingPitchRollToFixedFrame(newCenter, newHPR); // Update tile transform tileset._root.transform = newTransform; diff --git a/Specs/Scene/ModelInstanceCollectionSpec.js b/Specs/Scene/ModelInstanceCollectionSpec.js index 8313638afe6d..13a0c47d80d9 100644 --- a/Specs/Scene/ModelInstanceCollectionSpec.js +++ b/Specs/Scene/ModelInstanceCollectionSpec.js @@ -6,6 +6,7 @@ defineSuite([ 'Core/defaultValue', 'Core/defined', 'Core/HeadingPitchRange', + 'Core/HeadingPitchRoll', 'Core/JulianDate', 'Core/Math', 'Core/Matrix4', @@ -25,6 +26,7 @@ defineSuite([ defaultValue, defined, HeadingPitchRange, + HeadingPitchRoll, JulianDate, CesiumMath, Matrix4, @@ -127,7 +129,8 @@ defineSuite([ var heading = Math.PI/2.0; var pitch = 0.0; var roll = 0.0; - var modelMatrix = Transforms.headingPitchRollToFixedFrame(position, heading, pitch, roll); + var hpr = new HeadingPitchRoll(heading, pitch, roll); + var modelMatrix = Transforms.headingPitchRollToFixedFrame(position, hpr); instances.push({ modelMatrix : modelMatrix }); diff --git a/Specs/Scene/PointCloud3DTileContentSpec.js b/Specs/Scene/PointCloud3DTileContentSpec.js index 04d4f5af13ac..6710109a50a0 100644 --- a/Specs/Scene/PointCloud3DTileContentSpec.js +++ b/Specs/Scene/PointCloud3DTileContentSpec.js @@ -6,6 +6,7 @@ defineSuite([ 'Core/ComponentDatatype', 'Core/defined', 'Core/HeadingPitchRange', + 'Core/HeadingPitchRoll', 'Core/Transforms', 'Scene/Cesium3DTileStyle', 'Scene/Expression', @@ -18,6 +19,7 @@ defineSuite([ ComponentDatatype, defined, HeadingPitchRange, + HeadingPitchRoll, Transforms, Cesium3DTileStyle, Expression, @@ -233,7 +235,8 @@ defineSuite([ var newLongitude = -1.31962; var newLatitude = 0.698874; var newCenter = Cartesian3.fromRadians(newLongitude, newLatitude, 5.0); - var newTransform = Transforms.headingPitchRollToFixedFrame(newCenter, 0.0, 0.0, 0.0); + var newHPR = new HeadingPitchRoll(); + var newTransform = Transforms.headingPitchRollToFixedFrame(newCenter, newHPR); // Update tile transform tileset._root.transform = newTransform; From cc734cce24a61cd4916a4863a2bd59a580c5db97 Mon Sep 17 00:00:00 2001 From: Austin Eng <213reeses@gmail.com> Date: Wed, 11 Jan 2017 14:57:27 -0500 Subject: [PATCH 395/396] cleanup whitespace --- Source/Scene/Batched3DModel3DTileContent.js | 2 +- Source/Scene/Cesium3DTile.js | 1 - Source/Scene/Tileset3DTileContent.js | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Source/Scene/Batched3DModel3DTileContent.js b/Source/Scene/Batched3DModel3DTileContent.js index 2200331a1cdf..1fd6ce2dddc2 100644 --- a/Source/Scene/Batched3DModel3DTileContent.js +++ b/Source/Scene/Batched3DModel3DTileContent.js @@ -343,7 +343,7 @@ define([ color = enabled ? color : Color.WHITE; this.batchTable.setAllColor(color); }; - + /** * Part of the {@link Cesium3DTileContent} interface. */ diff --git a/Source/Scene/Cesium3DTile.js b/Source/Scene/Cesium3DTile.js index a492d8577559..fbfa74444225 100644 --- a/Source/Scene/Cesium3DTile.js +++ b/Source/Scene/Cesium3DTile.js @@ -325,7 +325,6 @@ define([ this._debugViewerRequestVolume = undefined; this._debugColor = new Color.fromRandom({ alpha : 1.0 }); this._debugColorizeTiles = false; - this._debugWireframe = false; } defineProperties(Cesium3DTile.prototype, { diff --git a/Source/Scene/Tileset3DTileContent.js b/Source/Scene/Tileset3DTileContent.js index fda851413943..49a7daba114a 100644 --- a/Source/Scene/Tileset3DTileContent.js +++ b/Source/Scene/Tileset3DTileContent.js @@ -123,7 +123,6 @@ define([ */ Tileset3DTileContent.prototype.applyDebugSettings = function(enabled, color) { }; - /** * Part of the {@link Cesium3DTileContent} interface. From bfef650a1f5a79e663a204e5f01d06980a369b95 Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Wed, 11 Jan 2017 15:10:28 -0500 Subject: [PATCH 396/396] JSDoc fixes to 3d-tiles branch --- Source/Core/RequestScheduler.js | 1 - Source/Scene/ImageryLayer.js | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/RequestScheduler.js b/Source/Core/RequestScheduler.js index 349043feb98c..5079517959ec 100644 --- a/Source/Core/RequestScheduler.js +++ b/Source/Core/RequestScheduler.js @@ -218,7 +218,6 @@ define([ * Checks if there are available slots to make a request, considering the total * number of available slots across all servers. * - * @param {String} [url] The url to check. * @returns {Boolean} Returns true if there are available slots, otherwise false. */ RequestScheduler.hasAvailableRequests = function() { diff --git a/Source/Scene/ImageryLayer.js b/Source/Scene/ImageryLayer.js index 887d84d5bfc2..b116eeb23405 100644 --- a/Source/Scene/ImageryLayer.js +++ b/Source/Scene/ImageryLayer.js @@ -637,6 +637,7 @@ define([ * @private * * @param {Imagery} imagery The imagery to request. + * @param {Number} [distance] The distance of the tile from the camera. */ ImageryLayer.prototype._requestImagery = function(imagery, distance) { var imageryProvider = this._imageryProvider;

    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 G|9=2}R?)2h literal 94790 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 z zbA04;qZd*fluzTS{#q>Q4W2yC`ILUe9mhHTYHRgs`(=Z)WY2eP<Jk?e_SG7p_6#orh+Q`jw#r^QUjne&6z4c4>;%pqWj?AZY`TYFjhR$9&ym8D% z&R+f9?%syZr`f1qW}|+Izx*42#kGFPr)(7KiQO7Hp5pM;#wnjxFP`!vd+{`%;-;L) zr*!2+d|dv~uSj8QB{L z`4l(vDP8l~@~O3E`PAIDe434TnvHmhkL6QwZQNyV3Uah_VQ!)ab0m$ZyZcltlIWwV|doGCvx#$#$2HyTEw1sYoricV z>D!+_q^iL-M^&nirmOGL)i$onM)@&&)6GWpalN+BxP3g&@mOXPZ)>{v7>C-r;#%9d zUfX`u%gL$*H$3a+M)td_D{JeiZ(AuF>9uX{yQ*cC@}~OH-)vN+Sf(qM*;`xL>${lh zt*toJ*5fwPYugx4<1hbaWA?I9{kk~Rwl@xOZq`8~t%#XD-pYc4`wu!fuF8;<-x^XbwIG9h1Wo^w~>uA{yySTBI{>^Fq zYUr#xzO$!nSes5a8?9N>M}ITe>56N*Vwq3*G5ff#oU7hAn66m0?ajvcsIBQ{FB{_- z*Tpj)*L1V7xW>o&W&Go@q`x{Lud3q5A~)`)tMAg)Hm)lV%8A*VZZ@iq>#~pgjN4mo z&E8^}O}wq?vM~;|b@{QjalN+vvK@{}ujQW}nfn)AYtw9`*S4{Bt@_?uf9Tec>566c z*4Eaz>aDH(*VeTUn2q$>Hn#TT+|0)8Wn*#Ux^bv&ZyYSH=7aH+-4k+PRJUH$QRz#?AQHSeT9K&1c-d>9y_o1YE^; z;HuO&_c`cuD)n6$iSB+wkJ}`ukK34D+s4|)?c+9cV*X|0ej`@AUb^|0O)w0el?yA{e0g%A^kbKtT(NrEDb8ls zK8u}=?yJ>yv$szulrEdm4Nr77_k1(Q+35a!Vb?hoZ*6;Wq0{l%Y4M59=j}s|a{g66 z;k9`c%lALk)yrr1OHOe<#i8?{)0|J^srzkxzC`CPH|w3JWUmY%fO`Lvu^T;)*r^WvjE zO1HSKp0=NTd%WW*|Kg^4c!LS6<4~(PR}FeQ@X{HZn=^!d-YMz^`p<9=s2i8F|9b=m#c@3O!u+q?GfpIS-rTK zy>S)?^~HQjzp8AA^C|oG8}6GPyV>{ekse>OQNPSa{gQv>O57AzV=Z0wHZFG_)z|S? z+o%61O3z`dS6s6fPxC2m=2N=(C?~R!A6rK|ciYwJS{GKYSY|Jt%8%@gr`Cw^)Vh<6 z_-Nf3Pg@sOZ#-?Cnor|t>rQ>Kb);O`S`#0e+h$|=l#S(6{>4pWBtFuW6Zw>la-wyi zw&JkeFN@uLwt5?PTT^N)pW>-`rG7~_|5h(8e*;>9Q9e^C_OT zuBB^k8)waJMvtZpnX++WDFc1#T7T@L1Se;H4bVkpOzEF zwY({x)<@|USGx8~wKdN2uX^o;%9S{qjr@zhaga~TmHKWx)nD-!Px+Cqw%Svr%cs>_ zepIix8awHl59U+4#gcBhl5V+j`zjn*1Fo%jvQC^&@nMwgidVFQ0ewmH>CI0en{1w;wC41SZzwAw}tvImvIiFT9 zp7JAm@id>}rku#9bmc^RWFuXE)K)rstMh5~Hcw}kY{XOkEuV^O<1Tv}cdZNYS6l5*Httrh zxMnY&=2P6%FU>>g=3lzFsb2Q-DP4ZFr%Kn{wtB@idvP|O%B_5Ay+{`aTX(jWjkB#m z+1P$!`;z5BZRJN}Cwm(^t!wG(m)go+dlhz-;;j8cy85Euv2(iiOZYh(?WwX+ztom_ z>2%pJFP)8I%0~H7OvX5+wTm zDL(3>bc^fiY0JLjc*?)Hsb0Ba4@&!&jX0Z)I7pXIanl@8o~4Vw`YRjh@}suW*;}1Y zs~1nRS6t~DJIx34Dcxd8*Vrjn(q*qcM)#|ZgX*=mtS?$y)<>-^>zCDwo7o#@aZq2h zUaeo+18nTH2iVwY53uny8}-X<)Gzs0uEb4ojlb+|T(nmymfC8svN>$^;%WBcX+Fi% zd`cG|T(% zck*fLNV&4LCO$T|&BpR68_TEsi<`zse55NU@+lkTMC(Fr#ex0K_1)@i+-*&%t*w2{ zEA`9ffc#5Wy|~#tkx%(iJ$q|My+D7jJG-os))mFOZY21d` z70Qpsme@|$yf&Zm&;IY~HHP%T#Zr#Vr*a^B+WD6*uKUV{1M&4r(i(mJ`LbyeXg7N9h(R zl{lM?{ENSFkWb5%`ffbcU-1`D`H`-++Eb;=r`212RIj)iJL#Ga=2N=Gl5V+@Zn=u? zS1Va#uB~{oPMlBiXDzutDlTg*-7nQ!zhp1Y#=)&A`X!&z<&$;p?3F|I0%x!OvKOSs zS2pUG*{EOQFaO40ajjpnmyP<%-sIYf1ACwIY4zeMKe883^C@o1iF`^|PQ*tx(&a~O zrR!aQ@^AGvPh>9+s#ku*O>4w>YF!vl%`xMtbzwZMUa`#HILN2CnNR7O&+;jItu@Q1 z=C^^JUUAJ{oXw|lE1y~~(#65novmf#Y-><9wx8I(WO-0q`O($QEx?Jc)vZ?ViK-qv*47>C-r{8-z#UfW*%CKm+ zq_4%M!rBtALa}5cU9rqQ*0w_5$fA1JHu7IXkK0IJi;d$P=VmrB`vUYd=a}v|ti?Xv z7tIgrm*vD_sa|8toG4HqO}D z`Z$N$dfZ03azOvx-+@TSR}GzY*UoHMn@*3}Xze(A#gQ(~rkj7&M}C}5TvyKVueEP+ zogT%iVIQ-p!CCcYAJd&poO3*`=`s5n9IRipb7CBnd&b6nhc#V&mu`75U3pMW%-(df zSAATUecWf<-g0a97RzknZB3Vraj31!kF|~Kwe8h!jZ?IC{-Q@~)748?oLcs7U8|mW zwvL>xSY{t&PMuLY#e9fFaKr}v$wsgHh;%qE%xcY7&qgu{8+4L zKdEFa-JYp&maaU@zP7GB$VT~z>#~oxHQj8?kF_=b@jTbIiMN$*d`veEsy9Dz|EAZr z=X-GCn*D}v6Mf(3+y0!w=o_*0=v#jc8-A~06WRa8CTc5Nv#(*p@8;jxn0>rndSS!| zSwrVH_jd@giR;*<>kCug$Mw7WZqC2oce>diYxs=Yn_k-nU(Ubk_4fes>1?7{u0F=W z?2$F>t!=zsdX2bopRrixvoICAy1%vKt{FGA@~81Hv_1c_%7T}Y-7DW7*0hI+O1!08`)II=Eahy zD|YC5T)W1*9bEY9)fE-ze6(f3`U4L(pB3_%^Y!T!oCQS#4leAsm0!tOcbGu5;!VBRR@mvniidd|Q$fgpTitmFil{&Mo->qG&z98~nDgQHWsHhnD*_IVQ z!A+g8oT-lA3RF+OE9ifrct$=8@p&0JQ0zkWF_x2xC~udMx5_AQ>ZAJPPU0$mjyG*9 zBL9`LQU28DTMwDrE@o2@vngEp`RNrp_aukpvO+mkKE+?LHD1z{BaNf<>baDzuTX7d z@5bcNVn9s^stjcKY6wBF1b4~UI5eGL%)MxcYb3}PjAL&;?tY22IeicOa zj9=1I(Fp~hU}r*YT3P#!gQjD;JIXnf74B4#801yQcVzd(Hxe~qVdDxMlcDEQW->t`pr|b*KWr3}`h^L#+Q9j)|igM-FT9i*Ww_`SzPuW;L z3z&PA^t&KhBR1|@BR1|@7dGyN%xA3^jk{Yf(YU)c73I^dedS2GAP+VNlm|CAl&{#_ zE{x6XXb()~S9^l|MD{kf<s4o${qTX#B;SIZ&x} z6B|3*-)!x>u@fJSy>Yg_#Pbl(kL)#Xw8o-6!E$Ik-MU^|u44VNxoZ2W){YzNXgxZg zv9WeOBc2sn6PA;B9^!jotX^x=@}sfSzLXw2+gIcBFg{n~b1y!hV>ziYrm;RMrp477 zaq~}e5C3jnYEH(lBQYDd_h<~XUZTBDbK9;9ZoM#8>FXf5Nnao1*S@IU*0t}+3kd5reewOu!D z{#Qo(fL()ZO;u>WipItEf6X7;|Fx$6Pp)gxHO2NTUF&VXGM)u7o&_yhpMcCTgi>%2~BpJ0z_C(bedh1!SyFRod!J!hTQ7wv$$ zhH*cjIi`CI+qYdmwHCBj*>yJFmss8k8QXMz;@9HnTK|`8=vuCu8jHfnr`s!{YnHnQ z(4MM2NNXqZ>Bc4Mqg!7QPrF|gA9o#(=OMla#_F}N%D>yUfq*g1`2wzuW`F>g_(<^-Dfu*WdK@j%D~bD&;!557ho|bJ*(L_($WY{M)_CzjUG}`yI=i}p2cG8x=z=u z*q&qis$H+s&q2|(ApWdjW2d$6#!mcoPZPUeb$!wAwzovrgNovYCfa6YWr&Xo&=xi`-fsim9(R$SVSV1f&cE75;)fl^IKX>C2--q#^&VT$m60=dB%trUC zHm3jPHQmjPSgacNQOZBLa{Fq0zm0h6TKQi+x5j+h{gs}@Z0xjW+BL4u&#kd*kd2G& z|L(e|{i-h4wb->r&pUPv`k!6b;?D)qx-*{te}A3QJ`uZL)iX#jbL@I;`)c|*NNd5KHJA^!zd7I9JG2(!&y01`<<;Kt{x`aNZ!HJ>uP(Z? zbNjh#l71Jx?t0q?WKl;wdKX@O9~-q@OMP89$88+X^n0PYff(_ zcb?Rnzk7$PR$6B%`FHxiJx@}x>$)GdY?oj8=iLL_z4LC@!gcBL$Zv(RS(mQgV}91E zM{O%(e%7kjZ+z>L^SF&z)aU-H{_|7wpsx8BoBH*)e)C7q%CYyQ>3eD2pXxcBdsMwI zO}|Hq&tbh6*K>I0`@VYyvG=9vX9u3^?R|xNzok6tSu%QdbNB!8_ZYEv1@>N1HufE= zBJ+Je^L<}`_Y%GT(feL||Krx_TE0`bXXNM|*MI$eyG^?Ik2`M%HJ*644XV)@ZK zH}_3Q@7!W}cJ~0O>)RZA59#J%>>Xf@cXaXj9G^>?8~PR%y)V^!W;b@Rxc2Saefx-A zvohcJqrb01dB~-v!8(eN#|A3pFoe@1NbbfS8T)X*T+=F=zMuZvJl(Il`wU&{ z>+&5WnuqRh%-AdbjcdC3v~^_P$MyG|?pm)kYtK!wYm>cu|J!?jXus0^jO|ylw|zi= zH(29(7wwsLf0e!_X1?$L_1Q4GMr(ij*Z&SJ`d+5BY~!x|yvDOweXmost_2l#El_>t z`@Z`db=~v3Yv{Ui6~DG-zVD~LGuGw$9=m6-`)YTc(mitQ8)*9P-}D|!W1#=V|K2RJ zx4%c#-vR#RZ$DzOGT--8&mH#n6}r}BzVAoZ+4wV;)_rtOa`!=2iC1SKmR}TUV7a;*VV6ee83`=cg_lYT49do;c2hw5Ls7^!oF!Uw#~iwd6BCrghQl(wCYxsT`zy*HN#>JgE!k zxXrrquM>9L?QxIy{lC#`j_E(|Y4z_{9p^?ow{;ndw9P+rj`y*?xvKNE zCe5e5{jJY>U)MMNc)fa?`M#eTb7AU#>zcRvwLaIQzr7B|=Wtw)&yBy;GvD`9|9yq% zU6A_@#q)=KOR{et?%P)Uy;%AxcMA?W3u-$D8lTU4Kcuq0X=;DayU5JBQe02X5{X5gl_x;r0 zBmJLWr!wF7-GB2<|GlZTe#4E{zWZA;-D^evE}lKJ`fn9t*Z0Ec`8WOT-ri$Gd%|Cy z_2ft2?P7lqu_wW3pzsI&`+ZxZU+*_vq z9xQ$>i$81B<+>K-Kl6P*_1_uOwXep1vyS@(`;MRazMuK``|kU8t#1>5`z~773wv)6 zzi+RbuGaPWJ|2%%XFdLo{U7xDfA^^$|LW(Oy5(nG_AYO0`JTJ3`ug{))*SeUyw!Ou z(sPOa*N4A*zo6dLEpPSbQ{VpnyW{TqS&#gz%f9~OUcY|1JlADz#BI`ZpnBg}*LeL$ z{Ogssf9CKPZt=eSgTAiyyRQ0mjpMrN>zki-**pJ*sWng+eO>(5RsV0#le%z@+pH@O z>#G0D9H`42{)f3yGbi=g598nQ*QKksneY3lF&C!(x9<5_pZv>LeXkew-De`g8Ij3A zCIguaWHOM+Kqdp33}iBp$v`FpnG9qykjX$M1DOnDGLXqYCIguaWHOM+Kqdp33}iBp z$v`FpnG9qykjX$M1DOnDGLXqYCIguaWHOM+Kqdp33}iBp$v`FpnG9qykjX$M1DOnD zGLXqYCIguaWHOM+Kqdp33}iBp$v`FpnG9qykjX$M1OIUbyo66%KaorX$Ydf+WFbS& z0L?>siS-fwKIl`k0k}b8L)!UZfNaQ-Ol-utA=rqzhKY^w7k~lf#)&4B z8gp)pmW6DJw=DFgVADi1O3f0Rfa`TX0_>B`=A%%^pZJlUCT^krRNo)(@rny5P> zg7zq zN1_+ex}o<1dnfu(>V@pi(FYcNVAz#%U$nmHeG>hUy%YVB!roZ#h7|U~%K)UXh!_Kr z!a}0%juaNasRL5D2XYVUcTWt$av=I3a8P0}rNQ_akQjpJ-Oz`CLy6cQZ74W2F^tl% z#GYV3urFtGa5%Up^~1rv5__ZV#W@shIC39KL&2eV*%v7sg7^K9!okGeA1NFJn-0i5 z5(iMTKl%aS0f_@C9fRDqY~qg!cnvwj}(r?ZwXR(5RoPzg(F}v5h*+nejSj) zNytgmPfV0zIRU*CJQxopXa|D_Cni&xjQ{bh=CR1h$Z?!4DYb;%SdK9;Y6;<nXG> zOhF1K(|#&acrYHzkit?TbwCQIC8mSZDRp2KsWcV+5L!(|KLk94{bCB|rr_qtL$KQ1 z;UQSGN1v7`Ps~Wn1ZO5@C1xXMB@Rs-hCGyWHrfp2jKtxIBfulDIud;b^+$p;sW}Qf zDseRJW`eVk$8gL_9Lsq$IET7p635|hHaMH|+{8Reb2*PgI}AA=Z-=4J2j?e_r*wQ` z0eB>MILAWbEC9t~A<>QkPr&<8;IYUPIZptOp>z`GiHSu{E+X17iIX{wp?nIZlM|;B zbq+X(@@cR*4m^(XV&czDoQ@RErFL=R4C>B+(Y(Z&Fq)5kCU|DzEJ|l3&IXSM7jP~F z&jHV-{v7aJ@T|mnNa0zuIUgxJ6E7Dag=Y}sLZompQ7=LYPfuLTaXK6>=DdXCG#FmO zc`3)KFkiwimw=a0UP6nD!KKKhc(^FB44)UGF9Vk)mQz|z#0wIa!Qp)L%fQPLms7eN zhUX=&NL-1$9CyX0B@P0i~ zxSZHGAcf0dvjn*`aU(T1px+4In7E13P1s+bxET-Eq2CPNoVbP3E%?7SaVycTM!yxj zEpa=gTanjr+zyM|VR#kgJJ9Yxzddm$^0vfXNa1Z*-;EUBikB5g;Vs0t2PwRnsP`g; zH^FHMQg|QoKI-pHRA6}zdIeaKsH9YhpB0HJJl~C81+FCGU1%%8m5KW)-Jf^>yc4{G zb0PR3_yF|}f)6DgMtg{JCEA0?M<}fXSK{SSq_7I_k0FJX#C{wptbolD_Wh0oIRWu)*K{Jw$|K24-ok;127@ETJ1B>a{jg|8!D zr~b9X8(6-I{s#Ca9$rCv6MQrA7NxiF|1zujMdVw^mpD(PbRz6tas~t2w_%`yBZr-abeF5&SW+ zhSHkEPvBSJ7aTtm=O<7sekR)2;4gUp8vGXdE9WoZDoVd`{+jsR$=`{#D)9%$D$0LS z`h%P4?~w`bJIbE78V(*c3D5U_fKw7FTurU-1=I!Jk1z|pH82ajkW%PnQOfex1J@+h z^M2y|8Ga4G_4us;zpM{tc^e>wS+v^_DGc%25Gf3Zu@O?}dr7YmQke8M=16)T=y{Df zJTCzzye1q8@6SY2erfDA_I6X%*RVlq_7j-cSZ{Hh`kF^m`{{y_=6aA4xk-KsJO6gbl_2=jdqhDG3eZAjU^FzI1Na0Z0 z?}-!+!Q*hGa4?aYB87W-dxLvZYRW27X;1WhXtgK$KHxsyABka{zkz?UckF}JpAPrI zq6zw5-oD;`-u~eJ-T~f$$OF6)-a*I_oCl)qhuqH_>5T$MVKo|kKk7$=`%^Op9OD(! zZh!DVJzsv>a zQl3wXdU*avp z@>29=;4*JHrRDg!#Jdd77o%SWUQWb|&@Klr_pYFHg?A-*A$S4jWbi8RO6soyulBA% zyPETIw5yQUQo0Mm%(N}a;bMCH8-H&2;S)3MCm5%ulH`o z!*%F4gSX)MTC`ihTfAE--Ac@>z1zIok+&kR;kX?Zx5Mx%*3x9}4vxv*og9;?y$yN0 zcNch@cQ;aa8!cBLg}37O9;EOVBHfD=-VB5LkiwhbHys-T;+Z1edm4etp-%AMKCvi~X_S zSbv;9-Y@YdfD`YwH> z_D}cE0MGEx^w09o_Rj&&@z3?o^UwD$059+_^e^%+_Adc1@h|n4_)Gm|;4*)?f0=)| ze+77jf2Dtwf3<%Nc#VIpe;x8#|9bxhWEZ|A%fyo0*i{5$b?9e5q(yZpN;-Nkt)+6~ARc)J081-Qb$htfU% zz2ME@jU4w8=Uz}O?jzbQUx_;2ZdQA1Qnt?;jwA zuMzu0r0`YPyo`Ls|A?9o(LVw|@;|2ZG4>z$pWxwr^iRM~{7)%;ivRcg&xrO8`e)$h z{uh)!L%z%L1uVXR;oFqIMEer`3;!$R=l<77;pbR?gA{&-msLpNr^NUcDg1<}-yww` z!|7$D@O$L<)PLu%#`0VA)!=IX2TDKSXO;gWp1(o=5nMyWuhG_kYy6)m{p9})eg%HX zc^~)-_%rptfWP{`q5aCa2JIK*@08YnYw+?1Qurg@|3nIZAa)}8r^D5-d70ApJYxTe zd>NTYdP$#>pZo*sWb${~At(jOU-6er2Gj+~kW!fZjc8fP^^jpQ3;fMrFZm1SeQ>FO zXM|jKDHZxS;-BN!Yn*BL<&QEZ-f*E#B78VCSkNOQs~3)Wq)IbjVU*# ze&b{lEE}OW0h{7sBebSq(_}MB&G6qaxzgVN*$lZMXCL}xgF;=;P%vQo7@3^t-;omcTDa?X-Cc-(Apq#@YV)B2h2&f zr_?^#0c;Cy&C!uK9YC?@NVIlfF5cUL+adEfbHQyXb>hrR<~x~Bv~81}Iku(Tg;M8a zSE6nYZcn)zEOr2QpxmAKJ0^P|g*#H)J=v4Go-o=exigG%(02xRPVPc!m*lQsd$0p% zN3a0gmHGm(5ZonMgcR;Vn_fua&UopK6!s)WAEdB5QTrl=J(B%6dcdI{XMc`vFznB{ z8%I}|58#*nV1LR3XweTGh#ZKAzRBJ3*#~`haQEaMl=dKE@8lpj^gd04oBOQb1>R4`k|QaN zKn~{^35$_197cH*+9>pq$)iO8OfQHW@3Lx zauyz@qt60o<9Qm|Y;bn+P)dgqb87Oi#W}sXs0`56d~|^T7Fd zI2LU_I6rwjrQ`8`46FGlMx`B*GK3XiA#LZom$9#23D z=MiZDQg~wWB=96k16V~WEks{LtA*%`z(wpA3phK0U66~g>f&$_7Q3OJm^?XoO7c|j z)Z}T&#mLi=rzg)qp3b=#?G)rG$upB@foEZLHu@>lpADW$%{kyX$#ZFUD!3SV9>;0P z^EuB2FQD$ctS>W`t{)T$r~u$kh~GR6kNi&6ub$%k@}m!o535B zw;+W#(B@X8@Or%5h7?{$jN6gIYlwOWQh06hPL6Bga3|+o99P5eF3!6-u7ddrez^<0 zi}DIu+zH-;yax|=B=5!N?dbP{_a^V7bRQ9KOIE<)R`d$6B3VhP5{9=VtCA~`mB^bp zR>FNHeYq)lKe&?G`@sj2528K5S&4Q(@*zrZdAF&@r3h#x@3gkV> z$EbM}{W0*dei}oz~Gs)+WPbZ&83ZKUM1*GsPyu64MK1qz1kisX3`Z7}ZIGk1>g|8rAq5kFM zt608-{wnxt@-<4Y;pfHV>v( z$#>D-;d}$_ZRC5D-T>dg%lk;->v;bFDSVCCA0maX!e#~XmE=d%e2D%L_)+p>N*`nY zLGlwkypR3~_$i*>L;Do`H2E2&&xrX>^7G^u$j^}Pa(n@cFJSmKYiVinOOB<&D$kB{AO+m3}MzjXt zCU|cEZisBoxe2%dr52pcgO*OVB-#eSrW_kkZbfO+U^AjN1RGM`92Oga8&TeZ_>F=s zk-|pQZV|Mmt~HD{4z_|(WAv@St%5d`+5}sJO~9s{&A@DMYwEMXwqTo}9a7kaHrpVD zTj6C}q_8zHwnGZHAnNu=;g-P;99zO+2hJTiHizMkoI7!B2J;+#*%924atND&Xjwj^+xX%^g$K{eUZW< ztotE_g?Q7Y^q7Fa`cY#w5QaBJfkop0^?pW@IzB{;kum`0*@Y6pSgy(+f zgTTQ=?29%S92^XxG$a@b_5piyHUo!&L#ZDI?imb6+mmxJ+A!o^lm>%?@v=8kI0*0i zAccDndtan*ci7}02L}65voHF7;C{jWl=jDdpWpyI?2Uc^cp#qlLOT#VFc?8;1Tpsv z4hlvhM<9oDjD*EV7!G4CH48>@Gz&&^G^6$)ce7t9Uj1@poA!STU@U}10qctUVua8j@+I2k-SI3+kWI4xKVE)Gr)&Iry7 z&H~R0&JNBA&JE53&kN2EE(k6RE&?wKE)FgUE)AA|OM<1rvS4{|8F*Q6IocJjd?oU# z;OgKS@S5P-;JV=Y;0Ex9;Ktyl;O5{K@Rs1#;I`oQ;12MP;LhN#;O<}rxFWbGxHq^j zr~oU1%AhJ(8Qc%vA3P8|7(5g_3_ct@5 zAH0C}qAS0Id^va}colp#crAE6cq4cdd^30}csqC}co%#(crSQA_#pTY{4n?^_&E3^ z_!Rs!_$>H5_#*fc{4)3|_&WF|SOu;Mz74($z7JM|tAihcAA>c)PvB3%&%rOjufcEN zZ^7@uAHknNBK(8X3;*P!h04j$=aLhKSzuPUUf3X9KimM^Alxu)7;Y3c0vm-JhmFG~ zVN=E_^dxkrQyM()j1z=*V2`-i)Q1Hysf?%?j>9^s&Ha5w}U5)KWAg?om>!QtUv;oiu- z!hOPhk^6A&jkYIp&v3tRe{g@S4nW_N`UAk>)Eo#N7>=ObaBy$rK^%L9BRNNaqo_M5 z9F4!d!M!Pu35zL>;T(;&FLEs2_C+5Hjt$3A8W)ZS4*>V$C?U>xP%KJ_b|5$b?+1b- zkrO#5fCo{U#5pl6b+VLb2ZaZ797K6CrGvvML>&c=qC6EAqruUX%ZNWFoQ4#Rp|&iX zPTh1E6^DnwXe|06;2~i-rSfnFI1U`oSpv=kXHY*AoCTJLvysAb+8l}$9)g#{kizN2 zI2lJh8zsW3c>^JtDKFh7Q0jslOOd<-p)1dl}?i-#k^Iruyr zeGWJ$JdV}?iFgj$rQoIE5=u+LrQq4%S)3){GH@yN%fRK~WoXMeFGX91yqwad;H7xE0x7%% z?^hy)7Zdv`r0^ox9D}?tyqcP;(60us4zHnf4fa=t*W%#{^lQQE@O(Mib>Ma3^^~qB z=JN1{@J8hI$jdlxgvE_8T*g`|32)*k32){oq4oykjo~fe4dJaw;SIFB4Jo`HzqccW z*AeLsr0`l8+=&!k1HWUC!n=@nQGaK6H7koO>O z<(x=qBJ6JAxCurR;d>M7yA+Fik-~due;-n~0*@6);oU?!1}UrztH3Hs$FPc2x(|IN zt?ol#39e+nxR-MhI2pMTtH};mVsSKjWq5!1K=>f|VE9n@F!G`Bk?>LEBb*PTJ%D^5 zd@Ot%d>pGM&>x`w3GhK`o&=u^pQ7D^;KRtLIUWk1;d}~wmb$0I=kWJ1_%P+?!xtz$ z&-onMqsSNW_9*&`;EUl)lwJy72A=>Q<9LNQFN0$73elbfU&Z^A;4{eAI9~;yrt~`J zYvCJCzCpC7!#6peru-JAH^aAy`YiY?<#%B59QYjNcZvUe_#RUDJhktJ?^E|aj9v&o zfYFQSAAlc(A5!`-{0Mvre3|nV@MG{J>OTfQ0Y3~sMG8Np&1XpA2YC4$DSV$8Um%6= z67@@@@V)RWj`!g373bF+@4)bD&Tly0hWRRf`5OG1@+w+<1%8YC77t&B-{JEM^zXp$ z!tW`4PsGo|)o}O>eKoi`{DIOBF#I(9FvVNsq zBFm%XW%-o+te^3k%=(2mepZrFkQGu&W(D9c+|K;O`3hWutSo-XLJzanLk3w5kivj= z>m!9pyl#LL`o!4~DfF@uSq+iGMAn~hYv^zz${SJNFsl)k8=^M?8)a=wX=D6skkuH^ z>!UXYn-H-9S`)BIR#Qq%vzmeHfmxidKyVYV8TFe`Zl2WwtvP2Cv`vsLDK!C`;AK;! zurc0SA%z)i!Pa8>s7`*J1ZN#ZB|=wYb@IGTRX5#);36C8(MCQ6mEsz z?U2IOMA{xH+!6*mAcb4NZ&kR1!yPH_Nc|33J7Kv!`c7aD9=1cv0dun2Q)-X@ZL{78 z+acQ{x8Zz^(rfT*$B_-A*I4`6S+BF^+h=t^3ft4ZBT|@y$6TavCnBv1a~kuDcsFMj$i^AQD;x1Zg5FVUkRefn+93CLw@G6;bIRqEZ#4 zh=2$PgeKBNMZwUdsB}>2AXfIhGns_4E9)QmC!FWLzjN+)zjMyl^6*e@Rs5>Vp5!aC z(S!I=ob@1n6pS*vOGPrif_wPc5oM~NmQk!Y!FO22R5R604Oqj}G_}y0<{?uXeTY#D zuR2=YM4LLW4y)?oS7*L1tien@SkFAnc{N}yv_4kTJi>SwHejy4i6LJtSc|x!X++eJ z5rbD7ZA`Y>_>Ey>(}bvrX$tGYXe^dGO`+`~mTL9jqhzlKA3>Wj9)3 z_T~xL1U6;F!Vd5W<~zVAVSCdNwQSEhPob9W$nrF5*_Im5pq8zv+6lF6W8$zj^bp7B zj6F_=of%H76`jX(q%-VH9M2hXFab>px%c7a_@DqdGcGF}%njVKu=lgoozCXwBXTDqv6j#?(t zO+1=lx-pZE-wk#%J|Z9My(WVU9{dcLVf;jX@~4?hs&&QBgjuFLQ6`#-b*GE&bl8PB z8!sEbyXk>unVzU+7OQ)qmYHOE7Pa(Kqc>`qLDlC_OCLSOqn3TpKFmL7`m(Y&eqY$v z^dss=o@Y&eGWWvo4+l`OC*A-!zzifBXr6~XU^XKb4ua1!KM1~H2IIZJ7=SkjeUWGY z96*+rP|N;ge;KvxN9`e~Wna39NBfwe%nZRF3Wu6uM8jDBvKdZ>m+*(f5oCT5Zv-4+ zMiPyr<_l(&8I6ua2VMswH_oyMw`0ZwCu6aOvqwwZ2bz!_$ynT5_Y@0i)>JB(R))6wbXT{8#H zVbxsx>CDfCGnknN=b867Zw8!&&c|k&_ZjcO119UvxI1gSqkUEcd;DmEQPj<9IDNO%g8uEzwfSZhHlO%I zqE%)!RTsbo#2?YcLb#B44fPk9wW#GHX4jZ?%&nuN56pTxT8zIQt~VQqHkgm$61bF+ z12@8tncoOMfg8-HsO1LE`3$vOPnJ!nKCZxTC*8jOAnhFTd=X7=Ilhx^R|q64h|)*K|mH~0tPL34=c5c$70hpDy)|1dmajuIV4_hLus;wT;N zCO(FD4F9P44n1PNM=g)A`UlkVFj3A ze8p6px#B88R6;*ft)xn!CHPCRpXs5LE--TFWf^_i-#X_Q@hgYfl4vQFh9z}9YFUy@ zVW?#Za^HYj7N_QosAVy>wJ3vHUZ;!nSth`nh;L%PjLNd|M*Om{92suFD+kM|JW+Y_ zhiRoLjh08RXDlaLPJg8_+u(BgHCn+pUtTw(mgPDB7SysF8E-``%Tg)V+!|m7-G+Y~ zv$=dlHo67BB4^!#UlCT+DswYq1^keo9TimpwXDdBFZm8D=yu(qJK>$WOLyxY{RRF- zf5meI;=iGP*FSVGyjTC!zw~c~!*Es7eY#%}FhUO~QV*&!tgI@kswh>1)l^+IR8zHJ zEj^^#idG$1M|D+C534?`uSe8CF=_}Ks*xJ2iJHQuiq)fPrslA@THrkvh+Cqq^tf8X z)@q}+YNz(Fy`E49J*kecqn^^!dPbdKC&j6=oQj9>N>HL)N`gsBR*Kx}0=uZIQk5nT z^vJ7pb(0VJlp((|l?AiZUD@iPp0KBS;XNCOd!x^(kNU#C>Zkr1pn-6pp4T9~puupk zUerr^Swr9u4b?CW*9bU5BQ;8+H3p8+D;ld;H4cu`YkFO8XgnOR37V)$nhYmvir&;) znhK|Cn%>rQ&44pB6K_@^eg~bccQpsj(Ok{bdzugD>wPWILM?)e^nn&@iI&2p%F!|{ z*9y2oE44}=YBgM~kF-W>wGOV+dTr3h+6Xu56Md@BvXc5y(>kNG zI;ZpSynYm0+!Xm={I}gAZ~T{-B5(ZD@gi^h^Oi!hQtUTXSjHdI6`I+7unNmcv#-`4 znca!&&zRkztEk%z>^WA{&F)~Kfa=Fx3eQ)Vc8w*V^~;bcS0>JyNlfr z3(M|i&(lA$d)OcK&zRHi_qpRU{VqpRs@LgvIOF1-{)Cj+#OSbsLs_nbsvPmVvJ<>s zUt(P4=&*F3E5V)N_IeyC?&Os8;Mvh(nI3nN*O%r|qN8+ghTEPU9hT+v^>BNV9kd$d$jU#^DCUam zuxAC6UUg3XwAY=;1-L!oS$LHky}}$eZ8Zng9Cfe0D#v|+!{G((L{y2aTq)X~c1a_g zN`lDj9zE@mkvBR_c=Wo z=}w=^lhEU;`_J_T9;SU}S3J&ZJenv+{w)eR?w+pjti0zOd=U2eQ7u?Q**7HukMqih$xO|q*k)^3M!>sRw>nSza#I$151K$ zSm?&bdi*XAZ&MG>v1uzuM({ax55J;>BPCcPf{!}?t*sQu7s_;vo3+BHA3Eot% zeJ20oO$r|7UgX^y`$V}1m) Date: Fri, 18 Nov 2016 17:43:02 -0500 Subject: [PATCH 064/396] Label backgrounds WIP --- Source/Scene/Label.js | 1 + Source/Scene/LabelCollection.js | 121 ++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+) diff --git a/Source/Scene/Label.js b/Source/Scene/Label.js index 4eaf305735eb..b07166ac03e1 100644 --- a/Source/Scene/Label.js +++ b/Source/Scene/Label.js @@ -101,6 +101,7 @@ define([ this._labelCollection = labelCollection; this._glyphs = []; + this._backgroundBillboard = undefined; this._rebindAllGlyphs = true; this._repositionAllGlyphs = true; diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index bbaa96c887a8..82de6b1b14c3 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -1,6 +1,8 @@ /*global define*/ define([ + '../Core/BoundingRectangle', '../Core/Cartesian2', + '../Core/Color', '../Core/defaultValue', '../Core/defined', '../Core/defineProperties', @@ -8,7 +10,10 @@ define([ '../Core/DeveloperError', '../Core/Matrix4', '../Core/writeTextToCanvas', + '../Renderer/RenderState', + '../Renderer/WebGLConstants', './BillboardCollection', + './BlendingState', './HeightReference', './HorizontalOrigin', './Label', @@ -16,7 +21,9 @@ define([ './TextureAtlas', './VerticalOrigin' ], function( + BoundingRectangle, Cartesian2, + Color, defaultValue, defined, defineProperties, @@ -24,7 +31,10 @@ define([ DeveloperError, Matrix4, writeTextToCanvas, + RenderState, + WebGLConstants, BillboardCollection, + BlendingState, HeightReference, HorizontalOrigin, Label, @@ -53,6 +63,28 @@ define([ this.dimensions = dimensions; } + var whitePixelCanvasId = 'ID_WHITE_PIXEL'; + var whitePixelSubRegionId = 'ID_WHITE_PIXEL_SUBREGION'; + var whitePixelSize = new Cartesian2(4, 4); + var whitePixelBoundingRegion = new BoundingRectangle(1, 1, 1, 1); + + function addWhitePixelCanvas(textureAtlas, labelCollection) { + var canvas = document.createElement('canvas'); + canvas.width = whitePixelSize.x; + canvas.height = whitePixelSize.y; + + var context2D = canvas.getContext('2d'); + context2D.fillStyle = '#fff'; + context2D.fillRect(0, 0, canvas.width, canvas.height); + + textureAtlas.addImage(whitePixelCanvasId, canvas).then(function(index) { + //glyphTextureInfo.index = index; + labelCollection._whitePixelIndex = index; + textureAtlas.addSubRegion(whitePixelCanvasId, whitePixelBoundingRegion); +console.log('white pixel index ' + index); + }); + } + // reusable object for calling writeTextToCanvas var writeTextToCanvasParameters = {}; function createGlyphCanvas(character, font, fillColor, outlineColor, outlineWidth, style, verticalOrigin) { @@ -105,6 +137,34 @@ define([ var glyphIndex; var textIndex; + var backgroundBillboard = label._backgroundBillboard; + if (!defined(backgroundBillboard)) { + if (labelCollection._spareBackgroundBillboards.length > 0) { + backgroundBillboard = labelCollection._spareBackgroundBillboards.pop(); + } else { + backgroundBillboard = labelCollection._backgroundBillboardCollection.add({ + collection : labelCollection + }); + } + label._backgroundBillboard = backgroundBillboard; + } + + backgroundBillboard.color = new Color(0.5, 0.5, 0.5, 0.8); // TODO: Configure color. + backgroundBillboard.show = label._show; + backgroundBillboard.position = label._position; + backgroundBillboard.eyeOffset = label._eyeOffset; + backgroundBillboard.pixelOffset = label._pixelOffset; + backgroundBillboard.horizontalOrigin = HorizontalOrigin.LEFT; + backgroundBillboard.verticalOrigin = label._verticalOrigin; + backgroundBillboard.heightReference = label._heightReference; + backgroundBillboard.scale = label._scale; + backgroundBillboard.pickPrimitive = label; + backgroundBillboard.id = label._id; + backgroundBillboard.image = whitePixelSubRegionId; + backgroundBillboard.translucencyByDistance = label._translucencyByDistance; + backgroundBillboard.pixelOffsetScaleByDistance = label._pixelOffsetScaleByDistance; + backgroundBillboard.distanceDisplayCondition = label._distanceDisplayCondition; + // if we have more glyphs than needed, unbind the extras. if (textLength < glyphsLength) { for (glyphIndex = textLength; glyphIndex < glyphsLength; ++glyphIndex) { @@ -216,11 +276,14 @@ define([ var glyphPixelOffset = new Cartesian2(); function repositionAllGlyphs(label, resolutionScale) { +console.log('reposition glyphs:', resolutionScale); var glyphs = label._glyphs; var glyph; var dimensions; var totalWidth = 0; var maxHeight = 0; + var maxDescent = 0; + var maxY = 0; var glyphIndex = 0; var glyphLength = glyphs.length; @@ -229,7 +292,12 @@ define([ dimensions = glyph.dimensions; totalWidth += dimensions.computedWidth; maxHeight = Math.max(maxHeight, dimensions.height); + maxY = Math.max(maxHeight, dimensions.height - dimensions.descent); + maxDescent = Math.max(maxDescent, dimensions.descent); +console.log('Glyph ' + glyphIndex + ' width ' + dimensions.computedWidth + ' descent ' + dimensions.descent + ' height ' + dimensions.height); } + var realMaxHeight = maxY + maxDescent; +console.log('totalWidth ' + totalWidth + ' maxheight ' + maxHeight + ' maxdescent ' + maxDescent + ' realMaxHeight ' + realMaxHeight); var scale = label._scale; var horizontalOrigin = label._horizontalOrigin; @@ -264,6 +332,21 @@ define([ glyphPixelOffset.x += dimensions.computedWidth * scale * resolutionScale; } + + var backgroundBillboard = label._backgroundBillboard; + if (defined(backgroundBillboard)) { + glyphPixelOffset.x = widthOffset * resolutionScale; + if (verticalOrigin === VerticalOrigin.BOTTOM) { + glyphPixelOffset.y = -maxDescent * scale; + } else if (verticalOrigin === VerticalOrigin.TOP) { + glyphPixelOffset.y = -(maxHeight - realMaxHeight) * scale - maxDescent * scale; + } else { + glyphPixelOffset.y = -(maxHeight - realMaxHeight) / 2 * scale - maxDescent * scale; + } + backgroundBillboard._setTranslate(glyphPixelOffset); + backgroundBillboard.width = totalWidth; + backgroundBillboard.height = realMaxHeight; + } } function destroyLabel(labelCollection, label) { @@ -271,6 +354,12 @@ define([ for ( var i = 0, len = glyphs.length; i < len; ++i) { unbindGlyph(labelCollection, glyphs[i]); } + if (defined(label._backgroundBillboard)) { + label._backgroundBillboard.show = false; + label._backgroundBillboard.image = undefined; + labelCollection._spareBackgroundBillboards.push(label._backgroundBillboard); + label._backgroundBillboard = undefined; + } label._labelCollection = undefined; if (defined(label._removeCallbackFunc)) { @@ -330,13 +419,29 @@ define([ this._scene = options.scene; this._textureAtlas = undefined; + this.__backgroundTextureAtlas = undefined; + this._whitePixelIndex = undefined; + + this._backgroundBillboardCollection = new BillboardCollection({ + scene : this._scene + }); + this._backgroundBillboardCollection.destroyTextureAtlas = false; this._billboardCollection = new BillboardCollection({ scene : this._scene }); this._billboardCollection.destroyTextureAtlas = false; + this._billboardCollection._rs = RenderState.fromCache({ + depthTest : { + enabled : true, + func : WebGLConstants.LEQUAL // default is LESS + }, + blending : BlendingState.ALPHA_BLEND + }); + this._spareBillboards = []; + this._spareBackgroundBillboards = []; this._glyphTextureCache = {}; this._labels = []; this._labelsToUpdate = []; @@ -572,9 +677,12 @@ define([ */ LabelCollection.prototype.update = function(frameState) { var billboardCollection = this._billboardCollection; + var backgroundBillboardCollection = this._backgroundBillboardCollection; billboardCollection.modelMatrix = this.modelMatrix; billboardCollection.debugShowBoundingVolume = this.debugShowBoundingVolume; + backgroundBillboardCollection.modelMatrix = this.modelMatrix; + backgroundBillboardCollection.debugShowBoundingVolume = this.debugShowBoundingVolume; var context = frameState.context; @@ -583,6 +691,16 @@ define([ context : context }); billboardCollection.textureAtlas = this._textureAtlas; + //addWhitePixelCanvas(this._textureAtlas, this); + } + + if (!defined(this._backgroundTextureAtlas)) { + this._backgroundTextureAtlas = new TextureAtlas({ + context : context, + initialSize : whitePixelSize + }); + backgroundBillboardCollection.textureAtlas = this._backgroundTextureAtlas; + addWhitePixelCanvas(this._backgroundTextureAtlas, this); } var uniformState = context.uniformState; @@ -621,6 +739,7 @@ define([ } this._labelsToUpdate.length = 0; + backgroundBillboardCollection.update(frameState); billboardCollection.update(frameState); }; @@ -660,6 +779,8 @@ define([ this.removeAll(); this._billboardCollection = this._billboardCollection.destroy(); this._textureAtlas = this._textureAtlas && this._textureAtlas.destroy(); + this._backgroundBillboardCollection = this._backgroundBillboardCollection.destroy(); + this._backgroundTextureAtlas = this._backgroundTextureAtlas && this._backgroundTextureAtlas.destroy(); return destroyObject(this); }; From 1470a4555049282ae128419b64808f49e13d7cdf Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 21 Nov 2016 12:14:47 -0500 Subject: [PATCH 065/396] Share visited array --- Source/Scene/Cesium3DTileBatchTable.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index 74da679a3253..b817fe66217b 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -189,17 +189,13 @@ define([ ++classCounts[classId]; } - // Marks visited instances when traversing over the batch table hierarchy - var visited = new Uint32Array(instancesLength); - var hierarchy = { classes : classes, classIds : classIds, classIndexes : classIndexes, parentCounts : parentCounts, parentIndexes : parentIndexes, - parentIds : parentIds, - visited : visited + parentIds : parentIds }; //>>includeStart('debug', pragmas.debug); @@ -474,16 +470,20 @@ define([ } var scratchStack = []; + var scratchVisited = []; var marker = 0; function traverseHierarchyTree(hierarchy, instanceIndex, endConditionCallback) { + var classIds = hierarchy.classIds; var parentCounts = hierarchy.parentCounts; var parentIds = hierarchy.parentIds; var parentIndexes = hierarchy.parentIndexes; + var instancesLength = classIds.length; // Ignore instances that have already been visited. This occurs in diamond inheritance situations. // Use a marker value to indicate that an instance has been visited, which increments with each run. // This is more efficient than clearing the visited array every time. - var visited = hierarchy.visited; + var visited = scratchVisited; + visited.length = Math.max(visited.length, instancesLength); var visitedMarker = ++marker; var stack = scratchStack; From 425a0e650c1d624d42160a9b12878df968ba09e4 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 21 Nov 2016 14:08:54 -0500 Subject: [PATCH 066/396] Refactored validateHierarchy --- Source/Scene/Cesium3DTileBatchTable.js | 50 ++++++++++++------ .../BatchTableHierarchyBinary/tile.b3dm | Bin 95026 -> 95026 bytes 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index b817fe66217b..bd03c911ed8a 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -206,22 +206,42 @@ define([ } function validateHierarchy(hierarchy) { - // Check for circular dependencies + var stack = scratchStack; + stack.length = 0; + var classIds = hierarchy.classIds; var instancesLength = classIds.length; - var validateInstance = function(hierarchy, instanceIndex, stack) { - if (instanceIndex >= instancesLength) { - throw new DeveloperError('Parent index ' + instanceIndex + ' exceeds the total number of instances: ' + instancesLength); - } - if (stack.indexOf(instanceIndex) >= 0) { - throw new DeveloperError('Circular dependency detected in the batch table hierarchy.'); - } - }; - for (var i = 0; i < instancesLength; ++i) { - traverseHierarchyTree(hierarchy, i, validateInstance); + validateInstance(hierarchy, i, stack); + } + } + + function validateInstance(hierarchy, instanceIndex, stack) { + var parentCounts = hierarchy.parentCounts; + var parentIds = hierarchy.parentIds; + var parentIndexes = hierarchy.parentIndexes; + var classIds = hierarchy.classIds; + var instancesLength = classIds.length; + + if (instanceIndex >= instancesLength) { + throw new DeveloperError('Parent index ' + instanceIndex + ' exceeds the total number of instances: ' + instancesLength); + } + if (stack.indexOf(instanceIndex) > -1) { + throw new DeveloperError('Circular dependency detected in the batch table hierarchy.'); + } + + stack.push(instanceIndex); + var parentCount = defined(parentCounts) ? parentCounts[instanceIndex] : 1; + var parentIndex = defined(parentCounts) ? parentIndexes[instanceIndex] : instanceIndex; + for (var i = 0; i < parentCount; ++i) { + var parentId = parentIds[parentIndex + i]; + // Stop the traversal when the instance has no parent (its parentId equals itself), else continue the traversal. + if (parentId !== instanceIndex) { + validateInstance(hierarchy, parentId, stack); + } } + stack.pop(instanceIndex); } Cesium3DTileBatchTable.getBinaryProperties = function(featuresLength, json, binary) { @@ -472,7 +492,7 @@ define([ var scratchStack = []; var scratchVisited = []; var marker = 0; - function traverseHierarchyTree(hierarchy, instanceIndex, endConditionCallback) { + function traverseHierarchyMultipleParents(hierarchy, instanceIndex, endConditionCallback) { var classIds = hierarchy.classIds; var parentCounts = hierarchy.parentCounts; var parentIds = hierarchy.parentIds; @@ -515,7 +535,7 @@ define([ } } - function traverseHierarchyLinear(hierarchy, instanceIndex, endConditionCallback) { + function traverseHierarchySingleParent(hierarchy, instanceIndex, endConditionCallback) { while (true) { var result = endConditionCallback(hierarchy, instanceIndex); if (defined(result)) { @@ -536,9 +556,9 @@ define([ // When the endConditionCallback returns a value, the traversal stops and that value is returned. var parentCounts = hierarchy.parentCounts; if (defined(parentCounts)) { - return traverseHierarchyTree(hierarchy, instanceIndex, endConditionCallback); + return traverseHierarchyMultipleParents(hierarchy, instanceIndex, endConditionCallback); } else { - return traverseHierarchyLinear(hierarchy, instanceIndex, endConditionCallback); + return traverseHierarchySingleParent(hierarchy, instanceIndex, endConditionCallback); } } diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm index 4786afac9d1500402626e03c27bb6442fed13dc7..0943b189d9d98bc6ae1423cd9c880a44676b3a9d 100644 GIT binary patch delta 23 dcmdn=jCIp9)(t8gEDS) Date: Mon, 21 Nov 2016 14:32:39 -0500 Subject: [PATCH 067/396] Added Sandcastle image --- Apps/Sandcastle/gallery/3D Tiles Hierarchy.jpg | Bin 0 -> 15007 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Apps/Sandcastle/gallery/3D Tiles Hierarchy.jpg diff --git a/Apps/Sandcastle/gallery/3D Tiles Hierarchy.jpg b/Apps/Sandcastle/gallery/3D Tiles Hierarchy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..22d9d9be59b9610aaeec8d71cd4820eeefef5789 GIT binary patch literal 15007 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 Date: Tue, 22 Nov 2016 11:26:43 -0500 Subject: [PATCH 068/396] Added back styling tests --- .../Hierarchy/BatchTableHierarchy/tile.b3dm | Bin 94434 -> 94438 bytes .../BatchTableHierarchyBinary/tile.b3dm | Bin 95026 -> 95030 bytes .../tile.b3dm | Bin 94770 -> 94774 bytes Specs/Scene/Cesium3DTileBatchTableSpec.js | 6 +++--- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm index 6dfd5056a370c4bb977e132f42dc45313bbf5bc9..77156b3dccb6baf4d596ef1ad6ae1dec3344751c 100644 GIT binary patch delta 24858 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%0AybSR+4mMJ$?_C7B-O#r76Wlm)d zBb)>5gAN|KmEMacyj1CNh4RX~Bdtia5DgazUjNV(HjEd^i^! zd~O+Ep8__ld)>_ZO()Fkx#YBI`0048^qd@Poq{njY(v=5#1J4342xIoXw%c*_Gz zX4Y>yaYmKFs)xl6F^;Zu{Ic^QBrk?|QZ&IhX>a&R7S1p>7$+v4F2jeh(*!3$DoZlK zDz_y%L~s(Hwej5R!ht6_Iw`hz@qv?scrnB}AwY+Q7$-tQ98Po+8_i*- z8>ftgh6&;>hO!;uSdY*!LGUDB%b&U9scF^2i}!l0$HhY(zvUs-@oP9F?F^O_R!y*E z5v3FU5KC-5CW33O@{)j%VkoYyGdBo+S<}PB!IQBuw0N(wvlXdwnAlcacE^*`sti^= zoK6Je=t}s(;aeZ#rdh@b($bL9-UK9BM2CigabjW;zns2YWimjkv{;LXOkyJ!4m`=x zy~Mh(B*uZ|3V$41+Tp1W*Ljg(2`2H715a{dbZ9P|@Np{cO`o-~bPtk+G>KD945b3= zNd{}Df8nSyIMrJp;&84m3Q@1Z~f=Q`h4vedxnP`?}wZd%Q#??l;B~&kmLQ36FgjplWeF1hhJVP zAi)QIxg&c%aQWOSCq+GnA3VuPV(S%`CK{69@r#$VQD97j6GK_|zurY>h{H*&tvPX~ z>}*kj=kDJH2kf@>#9zK{)IM0=ylcaL#9n&Uu3LZfqt}k$4Lf$-`r5UxZJg;7I=&yb z#h&^2q7jVq>8~wnoNv9p)2TnUm->Oju3OK&bDxo);fanGE^4Ct-n&anV137_yKY_k zy1m;v(c_-qyNTl8`oLaIG)Db+o@6l2k9S)-g72yYY(0NzAN%9o%F-4r!3XYH+!8Q! z3+?r1YBF!u9NnEL!SW0c7($OtaHqL`18B8R>KNVF%C>eEd24C-Y_cmCNDTmfW)x< z^P5UU;Ut68Ef`;w-AAjP3F~M4U|wI$@-NNni@g4dd8Mx`FStuUTr;7X7Z>iV>>c}b zqWB+q&%A#7RzLCEQT8|-g@vOq`nvVxnZ-w|^V)uMD!>b*e}30*M^3EZNB8~hC?`4V z5{J)dL>Y}H%#g0&(8)Bt{W~v?PAv6>EyxSW62L@lQEMr4L`_PJ8owAdeleQqU^HXN zXvQ^~%$10GK*~62S4NJZobYhcQk=9@0_JR!#IUZ=#F5K%h-Kn!-(FB!^?8xK&u9rI z%ACWcGB^pc&Rot)741*>(p3wZzF6xL!}ttsIlXkEoI2rg?S#j5W?HaOBxK8S`B={d zMO17$k(-V_oot_2oc8xW%bvS(v}E+@<{Ccp$_=fWbGL6C-Shnp@3Cp)X#4IPdd`Ix ze7c!fb-|_<%g_n$+%$)C@wSUww{HH>m7`BQ+u;Z2Z|XJamu)Bgc_VGwW8-L#4_@37 z@Bhh-z3BTsazzWUH8HBBr$XLb^CEw^r9Dj<#R2VXu2YCI%f+~C7i_Y4^F(M#m4lulggjBgYd;m zt{G_;*C9!uf|wwhZmB*-RjdF;>A+%tcUy;PW<4FkVQ5vU`{%&{i71?8aM}f{62JRs zb<=46qg^bcr=N966IH)l7Io04=4ISbu3Vn)RF&{1^YR{{4>^TEv}EiBsbdrw&?-nvNLFx@6(U1Wo3m z2|Lv3sEIqIj9co2r==lr+DMh7T@s|F5@+x6t>c&u1&IBdvp(1Feb()L_>7i_a;LJK zgCwxdoOJ<2VL}V{>#!4^b&11gD4M!U)6~FB)M+ZcYd2I}XB3g#fa!z_DxENjglr#v zwvP_1FtPYcMn4|?WcO#=nK<*xZ4E2tp6{1!qs#aGb*pUq?%PJc{=lyr>B0-T0F?>8 zYs1s+5aE35%TG7X#oO*}LOS$`XYU=IeC4xkzwi0}w$TC4KixF%Kj|k;ALlh6ym$1$ zXS-Z9|NWw0kACU%|SWH8RY7e3WGp@P3U@u_Ag>kgm1gv%3ajMnu##(`jabQ9!hX3W@PBiO`hA%N}`<#hr z!d1W;7SF?G`eSMW*xck1ovaB-~eoQl=m}tW9F8ANx zLvl z(=RnaUT~MgLX?nzryuDOz}6*(@fnIJqnU5m36JTFv{<7U(1mEe$@H#g4aPb}N|tE+Bmi9b5Mtk=Bj z+nos=jZp>HzyI!%d023KCkp?;vV&R$3}s#L@{14Z6Kpwdry-)}eC6xyhgenq@VL&9 z#LU^&4G%5rHKz|dxE0gB|4myYPV2NZRl-ROUv=*rTX0NEVEy`A-ndn_m=1?&1;hl+ zbW5j8oT^v_oDzZsKXh4#iDo?=!jaha!OjO!nsAcA=@y)B)f=|7fZr_bf;s)WYi?|! zDtPP3H@4F*@q3TBv9HW}D#K?wCQK6(G+~-wI`C_auZ!Dm`C8*Ec=Z$Ih9(-4%0g0^ z3M5Dc5~nhvIFkMIyKZPknRs;HPBZI_(!pmmn#^q}^$-#Dpe?JPxS^3?LW1G9f9LvU zH0wDl_)J*WA?8da3E(uM%taJ-s?$;ZG<-%Q%ACp^Mp$7v2h3T=rwQ+UUGZ10-2>No zA#nn@jwqu~R%>#DXdho{mM~Vzq{WlM&pZ^Hx9y*Mq zD+ve=$NCUYiVpedZurR+&hcg7C_+dvF^LH!c!($Y&)o6F(W3J%Y8_g<*HtgU-IrZo z92F!FlcepJ{Zk*j{=+x6ig94c!cQ!I#r3PTt44`sViFHI6_@&D;#^W(rveGW5jhUm>8PtVoTSeh&n8n-SIz1m(2b}t1?)t1y~; zEDoLU$GG&tUc^MOWD@~BCx&cUaQJj$bckPSqI8ZzO5$85sVo%?lfjqF{&aNy+F!J@ z60CYy>=5gOu7uxkslg$6F~kCfq6x-Hd&5t%aE7tLI581ihC&HWf}zs{%-^*C){N8B zAAi$Jun`Rhp5$b_t$+9OOG>MF{LtJbAi=qytS4B4NnH8$Z-hDyJjsdap}F~+N+*;6 zq$D2Vn22cjF_Fa1L<)eD3|_zKz^xxW{_CyC;BEf?M}QaF9&DeGYK!^+7^e>&;P9i9 z*k~p;`q8QX{@i$09z^(O*Y0veGXSls9^<$%ZDviJ|DkTyzc`)$jlF5K@9CD@gF%#BYCg_3SOLIda8ppmv61`? zzw$pFID7f3-J zMs*r4Do`;JOh_>NKThdHv(9Mv62rF7FDem*lMGI`V0=aTWcA)#_hF*6;P*YeS6|Ja zoVK8^^3gxpv#%`c%!MD*OsHlo+VINxyEIMw9k{R7H7PM_{9@Gj#b~C3(UQ63H1itKIL-LsWSn#>BgasG!pEF+6ek^}&zx4!GG+|(k1ZVg~YG` zh9b&!<{NgxV>&Y})+okwE+6Z;plFIsC%#(7Hyu$z*+0QZ0_<xD9<8t*Hw zVb#_PrRUUZcFMWAwoZmv*kK)Vs@bXb-~UQllTT^ao9pS0s07t*Tepw3ik3{9BdQDd zF=t)HNd~*9aA2dS0EX&%>4RObNnqS!NX2y?OK z=X5khzTo@cB=*A9DLAeruX+tD1rnz+qDYd}Tk3ehOw?PjiDupBfI5NCD9ki- z(S&t{Asm>F*jrvxj-0O7Y!l53$r9jWH&}<5Gbu4@I%3p8i&4`Nqgj_M{FtEG?*E8# z>QtwtMlLN~QBQbU8V;l3=#~VkXH??sJ-&4u(~-S*QI+g{UfBBta2iqOROT?kNdPlv z9iJ#n=dn9G>>OmB>F}$e(u>Bmv4NS$_+_RA6Ur#!HIw7NW|JyH4 z$3MlkDj9lpH7Bu75Uu;xL<=7308k#KQHOZJJqUH2n7WKOXF#LlIFp$>6jL##iO|r`Tq~x)Ebk zF-9y^ny?g>b>dVqZy+aKgDF4?!LXu??;ZK{)CT7X{oVHOC?~=HZcV23Q-(gF&$!=s25hNKI_^0 zHd&>%OK|Q0=RjpS2NJ;6nac?$O2~S>X8RLvUE=T=iYB8DcuYIsC9X5mf{kKa=kl?h z3yP@VbOJxyM`{}4N>+t3V6mztP6)!W~QIzWPn+AkGLoYrY+s)UmmcJYXfY5LY(Lb}CtIPLF$ zR1gzH(=OG=sfty=C?S|R*DFjk>*dAx#C}^sa>s`$Snv?z=t}s(;aDHyNzEburZQ;tFj+{$ z;9!PgViHT7*ddr~y&siG}JJPdJtzAhyAWjM3p*Mzf@;lPrGKZu>J_>l2>i>>cx~JNfm$|II_HspP)0isvN5vA=bzrc@c6>a7oP zIOz(0y47OKI3Pj^h|n+~?Hwk7!x_fH_%WK;tj9!2@TAZ%Ko@G4MyiMZ_ajI2xbjBz zpXK3HUc&>*4RjrK@cG;uTHo z447*ol}&a9U$?ZscDNN8ta`Y0!uP*n%Yz)?dlQ%kcYRYTOXdwp?Y168i|q?$xc&pr z8*=LN98P_HS|P QUXSbZwVU7eUpMafe`K#2CIA2c diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm index 0943b189d9d98bc6ae1423cd9c880a44676b3a9d..eb06f1087456fbf432d97312b0b7089ceaea6df9 100644 GIT binary patch delta 24858 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 delta 24850 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 Q*W>zp-ImW@xM}DA1Db{vz5oCK diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tile.b3dm index 553c5d77a341679c3990760f24aa6cfda71dbdad..56b174d069ee6ed79b0f891472c61a84b74f3e98 100644 GIT binary patch delta 24858 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 S`^xKaeZGF{=QeKM_5T2qNfosK diff --git a/Specs/Scene/Cesium3DTileBatchTableSpec.js b/Specs/Scene/Cesium3DTileBatchTableSpec.js index 36bdb85bd5c5..e26a66e6aec2 100644 --- a/Specs/Scene/Cesium3DTileBatchTableSpec.js +++ b/Specs/Scene/Cesium3DTileBatchTableSpec.js @@ -53,7 +53,7 @@ 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, 15.0)); + scene.camera.lookAt(center, new HeadingPitchRange(0.0, -1.57, 20.0)); }); afterAll(function() { @@ -572,7 +572,7 @@ defineSuite([ Cesium3DTilesTester.expectRenderTileset(scene, tileset); // Reset maximum texture size - ContextLimits._maximumVertexTextureImageUnits = maximumTextureSize; + ContextLimits._maximumTextureSize = maximumTextureSize; }); }); @@ -806,7 +806,7 @@ defineSuite([ function checkBatchTableHierarchy(url, multipleParents) { return Cesium3DTilesTester.loadTileset(scene, url).then(function(tileset) { - //checkHierarchyStyling(tileset); + checkHierarchyStyling(tileset); checkHierarchyProperties(tileset, multipleParents); }); } From c0852de845749b929da2f6199abde4ef60a85f4c Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Tue, 22 Nov 2016 12:26:38 -0500 Subject: [PATCH 069/396] Fixes --- Source/Scene/Cesium3DTileBatchTable.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index c6f5fa8a2f8a..d4783943f851 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -205,6 +205,7 @@ define([ return hierarchy; } + //>>includeStart('debug', pragmas.debug); function validateHierarchy(hierarchy) { var stack = scratchStack; stack.length = 0; @@ -243,6 +244,7 @@ define([ } stack.pop(instanceIndex); } + //>>includeEnd('debug'); Cesium3DTileBatchTable.getBinaryProperties = function(featuresLength, json, binary) { var binaryProperties; @@ -474,9 +476,8 @@ define([ var componentCount = binaryProperty.componentCount; if (componentCount === 1) { return typedArray[index]; - } else { - return binaryProperty.type.unpack(typedArray, index * componentCount); } + return binaryProperty.type.unpack(typedArray, index * componentCount); } function setBinaryProperty(binaryProperty, index, value) { @@ -517,7 +518,7 @@ define([ continue; } visited[instanceIndex] = visitedMarker; - var result = endConditionCallback(hierarchy, instanceIndex, stack); + var result = endConditionCallback(hierarchy, instanceIndex); if (defined(result)) { // The end condition was met, stop the traversal and return the result return result; @@ -557,9 +558,8 @@ define([ var parentCounts = hierarchy.parentCounts; if (defined(parentCounts)) { return traverseHierarchyMultipleParents(hierarchy, instanceIndex, endConditionCallback); - } else { - return traverseHierarchySingleParent(hierarchy, instanceIndex, endConditionCallback); } + return traverseHierarchySingleParent(hierarchy, instanceIndex, endConditionCallback); } function hasPropertyInHierarchy(batchTable, batchId, name) { @@ -597,9 +597,8 @@ define([ if (defined(propertyValues)) { if (defined(propertyValues.typedArray)) { return getBinaryProperty(propertyValues, indexInClass); - } else { - return clone(propertyValues[indexInClass], true); } + return clone(propertyValues[indexInClass], true); } }); } @@ -639,6 +638,8 @@ define([ if (!defined(hierarchy)) { return false; } + + // PERFORMANCE_IDEA : treat class names as integers for faster comparisons var result = traverseHierarchy(hierarchy, batchId, function(hierarchy, instanceIndex) { var classId = hierarchy.classIds[instanceIndex]; var instanceClass = hierarchy.classes[classId]; From 77419bb5f33f404962240b5d45f02d478a617774 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Tue, 22 Nov 2016 13:26:02 -0500 Subject: [PATCH 070/396] Remove unneeded check --- Source/Scene/Cesium3DTileBatchTable.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index d4783943f851..273c99ab63d9 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -523,8 +523,8 @@ define([ // The end condition was met, stop the traversal and return the result return result; } - var parentCount = defined(parentCounts) ? parentCounts[instanceIndex] : 1; - var parentIndex = defined(parentCounts) ? parentIndexes[instanceIndex] : instanceIndex; + var parentCount = parentCounts[instanceIndex]; + var parentIndex = parentIndexes[instanceIndex]; for (var i = 0; i < parentCount; ++i) { var parentId = parentIds[parentIndex + i]; // Stop the traversal when the instance has no parent (its parentId equals itself) From ecf3a875d3681bc031bad7e84c2c027ec0110e14 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Tue, 22 Nov 2016 15:11:32 -0500 Subject: [PATCH 071/396] Add more tests --- Specs/Scene/Cesium3DTileBatchTableSpec.js | 81 +++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/Specs/Scene/Cesium3DTileBatchTableSpec.js b/Specs/Scene/Cesium3DTileBatchTableSpec.js index e26a66e6aec2..6c41cb5d2970 100644 --- a/Specs/Scene/Cesium3DTileBatchTableSpec.js +++ b/Specs/Scene/Cesium3DTileBatchTableSpec.js @@ -860,7 +860,55 @@ defineSuite([ expect(batchTable.getPropertyNames(0).sort()).toEqual(['building_name', 'door_name', 'window_name']); }); + it('validates hierarchy with multiple parents (2)', function() { + // zone + // / | \ + // building0 | \ + // / \ | \ + // door0 door1 / + // \ | / + // window0 + var batchTableJson = { + HIERARCHY : { + instancesLength : 4, + classIds : [0, 1, 1, 2, 3], + parentCounts : [3, 1, 2, 1, 0], + parentIds : [1, 2, 4, 3, 3, 4, 4], + classes : [{ + name : 'window', + length : 1, + instances : { + window_name : ['window0'] + } + }, { + name : 'door', + length : 2, + instances : { + door_name : ['door0', 'door1'] + } + }, { + name : 'building', + length : 1, + instances : { + building_name : ['building0'] + } + }, { + name : 'zone', + length : 1, + instances : { + zone_name : ['zone0'] + } + }] + } + }; + var batchTable = new Cesium3DTileBatchTable(mockContent, 5, batchTableJson); + expect(batchTable.getPropertyNames(0).sort()).toEqual(['building_name', 'door_name', 'window_name', 'zone_name']); // check window + expect(batchTable.hasProperty(1, 'zone_name')).toEqual(true); // check door0 + expect(batchTable.hasProperty(2, 'zone_name')).toEqual(true); // check door1 + }); + it('throws if hierarchy has a circular dependency', function() { + // window0 -> door0 -> building0 -> window0 var batchTableJson = { HIERARCHY : { instancesLength : 3, @@ -892,6 +940,39 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('throws if hierarchy has a circular dependency (2)', function() { + // window0 -> door0 -> building0 -> window1 -> door0 + var batchTableJson = { + HIERARCHY : { + instancesLength : 4, + classIds : [0, 1, 2, 0], + parentIds : [1, 2, 3, 1], + classes : [{ + name : 'window', + length : 2, + instances : { + window_name : ['window0', 'window1'] + } + }, { + name : 'door', + length : 1, + instances : { + door_name : ['door0'] + } + }, { + name : 'building', + length : 1, + instances : { + building_name : ['building0'] + } + }] + } + }; + expect(function() { + return new Cesium3DTileBatchTable(mockContent, 4, batchTableJson); + }).toThrowDeveloperError(); + }); + it('throws if an instance\'s parentId exceeds instancesLength', function() { var batchTableJson = { HIERARCHY : { From e4622c7b069859e68399e2518641986126146fae Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Tue, 22 Nov 2016 15:29:07 -0500 Subject: [PATCH 072/396] Update Sandcastle --- .../gallery/3D Tiles Hierarchy.html | 47 +++++-------------- 1 file changed, 11 insertions(+), 36 deletions(-) diff --git a/Apps/Sandcastle/gallery/3D Tiles Hierarchy.html b/Apps/Sandcastle/gallery/3D Tiles Hierarchy.html index c38ce003e46d..b02b7bcbb18b 100644 --- a/Apps/Sandcastle/gallery/3D Tiles Hierarchy.html +++ b/Apps/Sandcastle/gallery/3D Tiles Hierarchy.html @@ -36,8 +36,7 @@ var scene = viewer.scene; var tilesetUrl = '../../../Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents'; var tileset = scene.primitives.add(new Cesium.Cesium3DTileset({ - url : tilesetUrl, - debugShowStatistics : true + url : tilesetUrl })); tileset.readyPromise.then(function(tileset) { @@ -205,6 +204,7 @@ } }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); +// When a feature is left clicked, print it's class name and properties handler.setInputAction(function(movement) { if (!pickingEnabled) { return; @@ -212,16 +212,19 @@ var feature = current.feature; if (Cesium.defined(feature)) { - if (feature.getProperty('clicked')) { - console.log('already clicked'); - } else { - // TODO : Do something interesting here - feature.setProperty('clicked', true); + console.log('Class: ' + feature.getClassName()); + console.log('Properties:'); + var propertyNames = feature.getPropertyNames(); + var length = propertyNames.length; + for (var i = 0; i < length; ++i) { + var name = propertyNames[i]; + var value = feature.getProperty(name); + console.log(' ' + name + ': ' + value); } } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); -//When a feature is double middle clicked, hide it +// When a feature is double middle clicked, hide it handler.setInputAction(function(movement) { if (!pickingEnabled) { return; @@ -232,34 +235,6 @@ } }, Cesium.ScreenSpaceEventType.MIDDLE_DOUBLE_CLICK); -/////////////////////////////////////////////////////////////////////////////// - -Sandcastle.addToolbarButton('Stats on/off', function() { - tileset.debugShowStatistics = !tileset.debugShowStatistics; -}); - -Sandcastle.addToolbarButton('Pick stats on/off', function() { - tileset.debugShowPickStatistics = !tileset.debugShowPickStatistics; -}); - -Sandcastle.addToolbarButton('Freeze on/off', function() { - tileset.debugFreezeFrame = !tileset.debugFreezeFrame; -}); - -Sandcastle.addToolbarButton('Colorize on/off', function() { - tileset.debugColorizeTiles = !tileset.debugColorizeTiles; -}); - -Sandcastle.addToolbarButton('BV on/off', function() { - tileset.debugShowBoundingVolume = !tileset.debugShowBoundingVolume; -}); - -Sandcastle.addToolbarButton('Contents BV on/off', function() { - tileset.debugShowContentBoundingVolume = !tileset.debugShowContentBoundingVolume; -}); - -/////////////////////////////////////////////////////////////////////////////// - //Sandcastle_End Sandcastle.finishedLoading(); } From f90a819e61662d9a9e0aaa7cf81d5c4b9fbf9fa1 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Wed, 23 Nov 2016 12:52:16 -0500 Subject: [PATCH 073/396] Fix some issues --- Source/Scene/LabelCollection.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 829c5be2ba2c..adc99013264a 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -64,9 +64,9 @@ define([ } var whitePixelCanvasId = 'ID_WHITE_PIXEL'; - var whitePixelSubRegionId = 'ID_WHITE_PIXEL_SUBREGION'; - var whitePixelSize = new Cartesian2(4, 4); - var whitePixelBoundingRegion = new BoundingRectangle(1, 1, 1, 1); + //var whitePixelSubRegionId = 'ID_WHITE_PIXEL_SUBREGION'; + var whitePixelSize = new Cartesian2(64, 64); + //var whitePixelBoundingRegion = new BoundingRectangle(1, 1, 1, 1); function addWhitePixelCanvas(textureAtlas, labelCollection) { var canvas = document.createElement('canvas'); @@ -80,7 +80,7 @@ define([ textureAtlas.addImage(whitePixelCanvasId, canvas).then(function(index) { //glyphTextureInfo.index = index; labelCollection._whitePixelIndex = index; - textureAtlas.addSubRegion(whitePixelCanvasId, whitePixelBoundingRegion); + //textureAtlas.addSubRegion(whitePixelCanvasId, whitePixelBoundingRegion); console.log('white pixel index ' + index); }); } @@ -160,7 +160,7 @@ console.log('white pixel index ' + index); backgroundBillboard.scale = label._scale; backgroundBillboard.pickPrimitive = label; backgroundBillboard.id = label._id; - backgroundBillboard.image = whitePixelSubRegionId; + backgroundBillboard.image = whitePixelCanvasId; backgroundBillboard.translucencyByDistance = label._translucencyByDistance; backgroundBillboard.pixelOffsetScaleByDistance = label._pixelOffsetScaleByDistance; backgroundBillboard.distanceDisplayCondition = label._distanceDisplayCondition; @@ -282,7 +282,7 @@ console.log('reposition glyphs:', resolutionScale); var dimensions; var totalWidth = 0; var maxHeight = 0; - var maxDescent = 0; + var maxDescent = Number.NEGATIVE_INFINITY; var maxY = 0; var glyphIndex = 0; @@ -291,7 +291,7 @@ console.log('reposition glyphs:', resolutionScale); glyph = glyphs[glyphIndex]; dimensions = glyph.dimensions; maxHeight = Math.max(maxHeight, dimensions.height); - maxY = Math.max(maxHeight, dimensions.height - dimensions.descent); + maxY = Math.max(maxY, dimensions.height - dimensions.descent); maxDescent = Math.max(maxDescent, dimensions.descent); console.log('Glyph ' + glyphIndex + ' width ' + dimensions.computedWidth + ' descent ' + dimensions.descent + ' height ' + dimensions.height); From 113acae77a256cc246ea7fdaa0d202f148989747 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Wed, 23 Nov 2016 13:13:56 -0500 Subject: [PATCH 074/396] Fix maxHeight. --- Source/Scene/LabelCollection.js | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index adc99013264a..ba2e1225f48d 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -281,7 +281,6 @@ console.log('reposition glyphs:', resolutionScale); var glyph; var dimensions; var totalWidth = 0; - var maxHeight = 0; var maxDescent = Number.NEGATIVE_INFINITY; var maxY = 0; @@ -290,7 +289,6 @@ console.log('reposition glyphs:', resolutionScale); for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { glyph = glyphs[glyphIndex]; dimensions = glyph.dimensions; - maxHeight = Math.max(maxHeight, dimensions.height); maxY = Math.max(maxY, dimensions.height - dimensions.descent); maxDescent = Math.max(maxDescent, dimensions.descent); console.log('Glyph ' + glyphIndex + ' width ' + dimensions.computedWidth + ' descent ' + dimensions.descent + ' height ' + dimensions.height); @@ -301,8 +299,8 @@ console.log('Glyph ' + glyphIndex + ' width ' + dimensions.computedWidth + ' des totalWidth += glyphs[glyphIndex + 1].dimensions.bounds.minx; } } - var realMaxHeight = maxY + maxDescent; -console.log('totalWidth ' + totalWidth + ' maxheight ' + maxHeight + ' maxdescent ' + maxDescent + ' realMaxHeight ' + realMaxHeight); + var maxHeight = maxY + maxDescent; +console.log('totalWidth ' + totalWidth + ' maxY ' + maxY + ' maxdescent ' + maxDescent + ' maxHeight ' + maxHeight); var scale = label._scale; var horizontalOrigin = label._horizontalOrigin; @@ -321,12 +319,12 @@ console.log('totalWidth ' + totalWidth + ' maxheight ' + maxHeight + ' maxdescen glyph = glyphs[glyphIndex]; dimensions = glyph.dimensions; - if (verticalOrigin === VerticalOrigin.BOTTOM || dimensions.height === maxHeight) { + if (verticalOrigin === VerticalOrigin.BOTTOM || dimensions.height === maxY) { glyphPixelOffset.y = -dimensions.descent * scale; } else if (verticalOrigin === VerticalOrigin.TOP) { - glyphPixelOffset.y = -(maxHeight - dimensions.height) * scale - dimensions.descent * scale; + glyphPixelOffset.y = -(maxY - dimensions.height) * scale - dimensions.descent * scale; } else if (verticalOrigin === VerticalOrigin.CENTER) { - glyphPixelOffset.y = -(maxHeight - dimensions.height) / 2 * scale - dimensions.descent * scale; + glyphPixelOffset.y = -(maxY - dimensions.height) / 2 * scale - dimensions.descent * scale; } glyphPixelOffset.y *= resolutionScale; @@ -347,16 +345,16 @@ console.log('totalWidth ' + totalWidth + ' maxheight ' + maxHeight + ' maxdescen var backgroundBillboard = label._backgroundBillboard; if (defined(backgroundBillboard)) { glyphPixelOffset.x = widthOffset * resolutionScale; - if (verticalOrigin === VerticalOrigin.BOTTOM) { + if (verticalOrigin === VerticalOrigin.BOTTOM || maxHeight === maxY) { glyphPixelOffset.y = -maxDescent * scale; } else if (verticalOrigin === VerticalOrigin.TOP) { - glyphPixelOffset.y = -(maxHeight - realMaxHeight) * scale - maxDescent * scale; + glyphPixelOffset.y = -(maxY - maxHeight) * scale - maxDescent * scale; } else { - glyphPixelOffset.y = -(maxHeight - realMaxHeight) / 2 * scale - maxDescent * scale; + glyphPixelOffset.y = -(maxY - maxHeight) / 2 * scale - maxDescent * scale; } backgroundBillboard._setTranslate(glyphPixelOffset); backgroundBillboard.width = totalWidth; - backgroundBillboard.height = realMaxHeight; + backgroundBillboard.height = maxHeight; } } From 6babe4f2bed0222ff2847a2512b8029733df43e2 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Wed, 23 Nov 2016 13:26:26 -0500 Subject: [PATCH 075/396] Use an imageSubRegion to avoid the fringes. --- Source/Scene/LabelCollection.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index ba2e1225f48d..3289dc8c0148 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -64,9 +64,8 @@ define([ } var whitePixelCanvasId = 'ID_WHITE_PIXEL'; - //var whitePixelSubRegionId = 'ID_WHITE_PIXEL_SUBREGION'; - var whitePixelSize = new Cartesian2(64, 64); - //var whitePixelBoundingRegion = new BoundingRectangle(1, 1, 1, 1); + var whitePixelSize = new Cartesian2(4, 4); + var whitePixelBoundingRegion = new BoundingRectangle(1, 1, 1, 1); function addWhitePixelCanvas(textureAtlas, labelCollection) { var canvas = document.createElement('canvas'); @@ -143,7 +142,9 @@ console.log('white pixel index ' + index); backgroundBillboard = labelCollection._spareBackgroundBillboards.pop(); } else { backgroundBillboard = labelCollection._backgroundBillboardCollection.add({ - collection : labelCollection + collection : labelCollection, + image : whitePixelCanvasId, + imageSubRegion : whitePixelBoundingRegion }); } label._backgroundBillboard = backgroundBillboard; @@ -160,7 +161,6 @@ console.log('white pixel index ' + index); backgroundBillboard.scale = label._scale; backgroundBillboard.pickPrimitive = label; backgroundBillboard.id = label._id; - backgroundBillboard.image = whitePixelCanvasId; backgroundBillboard.translucencyByDistance = label._translucencyByDistance; backgroundBillboard.pixelOffsetScaleByDistance = label._pixelOffsetScaleByDistance; backgroundBillboard.distanceDisplayCondition = label._distanceDisplayCondition; From 000ac2593889bb7b83395dcdbf1e8ea15994fee0 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Wed, 23 Nov 2016 13:42:10 -0500 Subject: [PATCH 076/396] Remove debugging info. --- Source/Scene/LabelCollection.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 3289dc8c0148..2aa6d630cf0b 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -77,10 +77,7 @@ define([ context2D.fillRect(0, 0, canvas.width, canvas.height); textureAtlas.addImage(whitePixelCanvasId, canvas).then(function(index) { - //glyphTextureInfo.index = index; labelCollection._whitePixelIndex = index; - //textureAtlas.addSubRegion(whitePixelCanvasId, whitePixelBoundingRegion); -console.log('white pixel index ' + index); }); } @@ -276,7 +273,6 @@ console.log('white pixel index ' + index); var glyphPixelOffset = new Cartesian2(); function repositionAllGlyphs(label, resolutionScale) { -console.log('reposition glyphs:', resolutionScale); var glyphs = label._glyphs; var glyph; var dimensions; @@ -291,7 +287,6 @@ console.log('reposition glyphs:', resolutionScale); dimensions = glyph.dimensions; maxY = Math.max(maxY, dimensions.height - dimensions.descent); maxDescent = Math.max(maxDescent, dimensions.descent); -console.log('Glyph ' + glyphIndex + ' width ' + dimensions.computedWidth + ' descent ' + dimensions.descent + ' height ' + dimensions.height); //Computing the total width must also account for the kering that occurs between letters. totalWidth += dimensions.width - dimensions.bounds.minx; @@ -300,7 +295,6 @@ console.log('Glyph ' + glyphIndex + ' width ' + dimensions.computedWidth + ' des } } var maxHeight = maxY + maxDescent; -console.log('totalWidth ' + totalWidth + ' maxY ' + maxY + ' maxdescent ' + maxDescent + ' maxHeight ' + maxHeight); var scale = label._scale; var horizontalOrigin = label._horizontalOrigin; From bce6efaf87ddcfcc9c4dc3f8a841d897ac0d7236 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Wed, 23 Nov 2016 15:06:15 -0500 Subject: [PATCH 077/396] Started work on label background settings. --- Source/Scene/Label.js | 52 +++++++++++++++++++++++++++++++++ Source/Scene/LabelCollection.js | 24 +++++++-------- 2 files changed, 64 insertions(+), 12 deletions(-) diff --git a/Source/Scene/Label.js b/Source/Scene/Label.js index b07166ac03e1..11289858032a 100644 --- a/Source/Scene/Label.js +++ b/Source/Scene/Label.js @@ -86,6 +86,8 @@ define([ this._fillColor = Color.clone(defaultValue(options.fillColor, Color.WHITE)); this._outlineColor = Color.clone(defaultValue(options.outlineColor, Color.BLACK)); this._outlineWidth = defaultValue(options.outlineWidth, 1.0); + this._backgroundColor = defaultValue(options.backgroundColor, Color.TRANSPARENT); + this._backgroundPadding = defaultValue(options.backgroundPadding, 2); this._style = defaultValue(options.style, LabelStyle.FILL); this._verticalOrigin = defaultValue(options.verticalOrigin, VerticalOrigin.BOTTOM); this._horizontalOrigin = defaultValue(options.horizontalOrigin, HorizontalOrigin.LEFT); @@ -337,6 +339,53 @@ define([ } }, + /** + * Gets or sets the background color of this label. TRANSPARENT means no background will be used. + * @memberof Label.prototype + * @type {Color} + */ + backgroundColor : { + get : function() { + return this._backgroundColor; + }, + set : function(value) { + //>>includeStart('debug', pragmas.debug); + if (!defined(value)) { + throw new DeveloperError('value is required.'); + } + //>>includeEnd('debug'); + + var backgroundColor = this._backgroundColor; + if (!Color.equals(backgroundColor, value)) { + Color.clone(value, backgroundColor); + rebindAllGlyphs(this); + } + } + }, + + /** + * Gets or sets the background padding, in pixels, of this label. + * @memberof Label.prototype + * @type {Number} + */ + backgroundPadding : { + get : function() { + return this._backgroundPadding; + }, + set : function(value) { + //>>includeStart('debug', pragmas.debug); + if (!defined(value)) { + throw new DeveloperError('value is required.'); + } + //>>includeEnd('debug'); + + if (this._backgroundPadding !== value) { + this._backgroundPadding = value; + rebindAllGlyphs(this); + } + } + }, + /** * Gets or sets the style of this label. * @memberof Label.prototype @@ -884,6 +933,8 @@ define([ defined(other) && this._show === other._show && this._scale === other._scale && + this._outlineWidth === other._outlineWidth && + this._backgroundPadding === other._backgroundPadding && this._style === other._style && this._verticalOrigin === other._verticalOrigin && this._horizontalOrigin === other._horizontalOrigin && @@ -893,6 +944,7 @@ define([ Cartesian3.equals(this._position, other._position) && Color.equals(this._fillColor, other._fillColor) && Color.equals(this._outlineColor, other._outlineColor) && + Color.equals(this._backgroundColor, other._backgroundColor) && Cartesian2.equals(this._pixelOffset, other._pixelOffset) && Cartesian3.equals(this._eyeOffset, other._eyeOffset) && NearFarScalar.equals(this._translucencyByDistance, other._translucencyByDistance) && diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 2aa6d630cf0b..bb67eaf7ec35 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -133,6 +133,7 @@ define([ var glyphIndex; var textIndex; + var hasBackground = (label._backgroundColor.alpha >= 0.0039); // approximately 1.0/255.0 var backgroundBillboard = label._backgroundBillboard; if (!defined(backgroundBillboard)) { if (labelCollection._spareBackgroundBillboards.length > 0) { @@ -273,6 +274,7 @@ define([ var glyphPixelOffset = new Cartesian2(); function repositionAllGlyphs(label, resolutionScale) { +//resolutionScale = 4; // TODO: more testing var glyphs = label._glyphs; var glyph; var dimensions; @@ -338,7 +340,8 @@ define([ var backgroundBillboard = label._backgroundBillboard; if (defined(backgroundBillboard)) { - glyphPixelOffset.x = widthOffset * resolutionScale; + var backgroundPadding = label._backgroundPadding; + glyphPixelOffset.x = (widthOffset - backgroundPadding * scale) * resolutionScale; if (verticalOrigin === VerticalOrigin.BOTTOM || maxHeight === maxY) { glyphPixelOffset.y = -maxDescent * scale; } else if (verticalOrigin === VerticalOrigin.TOP) { @@ -346,9 +349,11 @@ define([ } else { glyphPixelOffset.y = -(maxY - maxHeight) / 2 * scale - maxDescent * scale; } + glyphPixelOffset.y += backgroundPadding * scale; + glyphPixelOffset.y *= resolutionScale; backgroundBillboard._setTranslate(glyphPixelOffset); - backgroundBillboard.width = totalWidth; - backgroundBillboard.height = maxHeight; + backgroundBillboard.width = totalWidth + (backgroundPadding * 2); + backgroundBillboard.height = maxHeight + (backgroundPadding * 2); } } @@ -359,7 +364,6 @@ define([ } if (defined(label._backgroundBillboard)) { label._backgroundBillboard.show = false; - label._backgroundBillboard.image = undefined; labelCollection._spareBackgroundBillboards.push(label._backgroundBillboard); label._backgroundBillboard = undefined; } @@ -425,6 +429,7 @@ define([ this.__backgroundTextureAtlas = undefined; this._whitePixelIndex = undefined; + // TODO: Don't allocate this until later. this._backgroundBillboardCollection = new BillboardCollection({ scene : this._scene }); @@ -435,14 +440,6 @@ define([ }); this._billboardCollection.destroyTextureAtlas = false; - this._billboardCollection._rs = RenderState.fromCache({ - depthTest : { - enabled : true, - func : WebGLConstants.LEQUAL // default is LESS - }, - blending : BlendingState.ALPHA_BLEND - }); - this._spareBillboards = []; this._spareBackgroundBillboards = []; this._glyphTextureCache = {}; @@ -534,6 +531,9 @@ define([ * font : '30px sans-serif', * fillColor : Cesium.Color.WHITE, * outlineColor : Cesium.Color.BLACK, + * outlineWidth : 1.0 + * backgroundColor : Cesium.Color.TRANSPARENT, + * backgroundPadding : 2.0 * style : Cesium.LabelStyle.FILL, * pixelOffset : Cesium.Cartesian2.ZERO, * eyeOffset : Cesium.Cartesian3.ZERO, From 83a5e1be96477a6d38cc8c6c9f1872dacdbab54a Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Wed, 23 Nov 2016 15:53:21 -0500 Subject: [PATCH 078/396] Unused requires --- Source/Scene/LabelCollection.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index af2ba4e9bf9c..90ca6c542cb6 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -10,8 +10,6 @@ define([ '../Core/DeveloperError', '../Core/Matrix4', '../Core/writeTextToCanvas', - '../Renderer/RenderState', - '../Renderer/WebGLConstants', './BillboardCollection', './HorizontalOrigin', './Label', @@ -29,8 +27,6 @@ define([ DeveloperError, Matrix4, writeTextToCanvas, - RenderState, - WebGLConstants, BillboardCollection, HorizontalOrigin, Label, From b54ccd5cc9bec50d21e507630c42d6fd217f45f7 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Wed, 23 Nov 2016 16:19:57 -0500 Subject: [PATCH 079/396] Convert backgroundPadding to Cartesian2, add showBackground bool. --- Source/Scene/Label.js | 17 ++++++++++------- Source/Scene/LabelCollection.js | 15 ++++++++------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/Source/Scene/Label.js b/Source/Scene/Label.js index 11289858032a..6cd79eff5782 100644 --- a/Source/Scene/Label.js +++ b/Source/Scene/Label.js @@ -86,8 +86,9 @@ define([ this._fillColor = Color.clone(defaultValue(options.fillColor, Color.WHITE)); this._outlineColor = Color.clone(defaultValue(options.outlineColor, Color.BLACK)); this._outlineWidth = defaultValue(options.outlineWidth, 1.0); - this._backgroundColor = defaultValue(options.backgroundColor, Color.TRANSPARENT); - this._backgroundPadding = defaultValue(options.backgroundPadding, 2); + this._showBackground = defaultValue(options.showBackground, false); + this._backgroundColor = defaultValue(options.backgroundColor, new Color(0.165, 0.165, 0.165, 0.8)); + this._backgroundPadding = defaultValue(options.backgroundPadding, new Cartesian2(2, 2)); this._style = defaultValue(options.style, LabelStyle.FILL); this._verticalOrigin = defaultValue(options.verticalOrigin, VerticalOrigin.BOTTOM); this._horizontalOrigin = defaultValue(options.horizontalOrigin, HorizontalOrigin.LEFT); @@ -358,7 +359,7 @@ define([ var backgroundColor = this._backgroundColor; if (!Color.equals(backgroundColor, value)) { Color.clone(value, backgroundColor); - rebindAllGlyphs(this); + rebindAllGlyphs(this); // TODO: Can do something cheaper than rebindAllGlyphs? } } }, @@ -379,9 +380,10 @@ define([ } //>>includeEnd('debug'); - if (this._backgroundPadding !== value) { - this._backgroundPadding = value; - rebindAllGlyphs(this); + var backgroundPadding = this._backgroundPadding; + if (!Cartesian2.equals(backgroundPadding, value)) { + Cartesian2.clone(value, backgroundPadding); + rebindAllGlyphs(this); // TODO: Can do something cheaper than rebindAllGlyphs? } } }, @@ -934,7 +936,7 @@ define([ this._show === other._show && this._scale === other._scale && this._outlineWidth === other._outlineWidth && - this._backgroundPadding === other._backgroundPadding && + this._showBackground === other._showBackground && this._style === other._style && this._verticalOrigin === other._verticalOrigin && this._horizontalOrigin === other._horizontalOrigin && @@ -945,6 +947,7 @@ define([ Color.equals(this._fillColor, other._fillColor) && Color.equals(this._outlineColor, other._outlineColor) && Color.equals(this._backgroundColor, other._backgroundColor) && + Cartesian2.equals(this._backgroundPadding, other._backgroundPadding) && Cartesian2.equals(this._pixelOffset, other._pixelOffset) && Cartesian3.equals(this._eyeOffset, other._eyeOffset) && NearFarScalar.equals(this._translucencyByDistance, other._translucencyByDistance) && diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 90ca6c542cb6..72fe9cac8205 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -140,7 +140,7 @@ define([ label._backgroundBillboard = backgroundBillboard; } - backgroundBillboard.color = new Color(0.5, 0.5, 0.5, 0.8); // TODO: Configure color. + backgroundBillboard.color = label._backgroundColor; // new Color(0.5, 0.5, 0.5, 0.8); // TODO: remove comment backgroundBillboard.show = label._show; backgroundBillboard.position = label._position; backgroundBillboard.eyeOffset = label._eyeOffset; @@ -333,7 +333,7 @@ define([ var backgroundBillboard = label._backgroundBillboard; if (defined(backgroundBillboard)) { var backgroundPadding = label._backgroundPadding; - glyphPixelOffset.x = (widthOffset - backgroundPadding * scale) * resolutionScale; + glyphPixelOffset.x = (widthOffset - backgroundPadding.x * scale) * resolutionScale; if (verticalOrigin === VerticalOrigin.BOTTOM || maxHeight === maxY) { glyphPixelOffset.y = -maxDescent * scale; } else if (verticalOrigin === VerticalOrigin.TOP) { @@ -341,11 +341,11 @@ define([ } else { glyphPixelOffset.y = -(maxY - maxHeight) / 2 * scale - maxDescent * scale; } - glyphPixelOffset.y += backgroundPadding * scale; + glyphPixelOffset.y += backgroundPadding.y * scale; glyphPixelOffset.y *= resolutionScale; backgroundBillboard._setTranslate(glyphPixelOffset); - backgroundBillboard.width = totalWidth + (backgroundPadding * 2); - backgroundBillboard.height = maxHeight + (backgroundPadding * 2); + backgroundBillboard.width = totalWidth + (backgroundPadding.x * 2); + backgroundBillboard.height = maxHeight + (backgroundPadding.y * 2); } } @@ -523,9 +523,10 @@ define([ * font : '30px sans-serif', * fillColor : Cesium.Color.WHITE, * outlineColor : Cesium.Color.BLACK, - * outlineWidth : 1.0 + * outlineWidth : 1.0, + * showBackground : false, * backgroundColor : Cesium.Color.TRANSPARENT, - * backgroundPadding : 2.0 + * backgroundPadding : new Cesium.Cartesian2(2, 2), * style : Cesium.LabelStyle.FILL, * pixelOffset : Cesium.Cartesian2.ZERO, * eyeOffset : Cesium.Cartesian3.ZERO, From 829439d32f03750b129414b8dc086c1cb306294b Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Thu, 24 Nov 2016 09:00:38 -0500 Subject: [PATCH 080/396] Fix vertical position of background with bottom and center alignments. --- Source/Scene/LabelCollection.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 72fe9cac8205..fdc2eeeb0f84 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -334,14 +334,13 @@ define([ if (defined(backgroundBillboard)) { var backgroundPadding = label._backgroundPadding; glyphPixelOffset.x = (widthOffset - backgroundPadding.x * scale) * resolutionScale; - if (verticalOrigin === VerticalOrigin.BOTTOM || maxHeight === maxY) { - glyphPixelOffset.y = -maxDescent * scale; + if (verticalOrigin === VerticalOrigin.BOTTOM) { + glyphPixelOffset.y = -backgroundPadding.y * scale - maxDescent * scale; } else if (verticalOrigin === VerticalOrigin.TOP) { - glyphPixelOffset.y = -(maxY - maxHeight) * scale - maxDescent * scale; + glyphPixelOffset.y = -(maxY - maxHeight - backgroundPadding.y) * scale - maxDescent * scale; } else { glyphPixelOffset.y = -(maxY - maxHeight) / 2 * scale - maxDescent * scale; } - glyphPixelOffset.y += backgroundPadding.y * scale; glyphPixelOffset.y *= resolutionScale; backgroundBillboard._setTranslate(glyphPixelOffset); backgroundBillboard.width = totalWidth + (backgroundPadding.x * 2); From 31730591b2c7d8f9ebdc97201c2818a63f8a2e47 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Fri, 25 Nov 2016 15:32:50 -0500 Subject: [PATCH 081/396] Hook up showBackground flag. --- Source/Scene/Label.js | 28 +++++++++++++-- Source/Scene/LabelCollection.js | 61 ++++++++++++++++++--------------- 2 files changed, 60 insertions(+), 29 deletions(-) diff --git a/Source/Scene/Label.js b/Source/Scene/Label.js index 6cd79eff5782..162417c9bf76 100644 --- a/Source/Scene/Label.js +++ b/Source/Scene/Label.js @@ -340,6 +340,29 @@ define([ } }, + /** + * Determines if a background behind this label will be shown. + * @memberof Label.prototype + * @type {Boolean} + */ + showBackground : { + get : function() { + return this._showBackground; + }, + set : function(value) { + //>>includeStart('debug', pragmas.debug); + if (!defined(value)) { + throw new DeveloperError('value is required.'); + } + //>>includeEnd('debug'); + + if (this._showBackground !== value) { + this._showBackground = value; + rebindAllGlyphs(this); // TODO: Can do something cheaper than rebindAllGlyphs? + } + } + }, + /** * Gets or sets the background color of this label. TRANSPARENT means no background will be used. * @memberof Label.prototype @@ -365,9 +388,10 @@ define([ }, /** - * Gets or sets the background padding, in pixels, of this label. + * Gets or sets the background padding, in pixels, of this label. The x value + * controls horizontal padding, and the y value controls vertical padding. * @memberof Label.prototype - * @type {Number} + * @type {Cartesian2} */ backgroundPadding : { get : function() { diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index fdc2eeeb0f84..74be2a8a4f0c 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -125,35 +125,43 @@ define([ var glyphIndex; var textIndex; - var hasBackground = (label._backgroundColor.alpha >= 0.0039); // approximately 1.0/255.0 + var showBackground = label._showBackground; var backgroundBillboard = label._backgroundBillboard; - if (!defined(backgroundBillboard)) { - if (labelCollection._spareBackgroundBillboards.length > 0) { - backgroundBillboard = labelCollection._spareBackgroundBillboards.pop(); - } else { - backgroundBillboard = labelCollection._backgroundBillboardCollection.add({ - collection : labelCollection, - image : whitePixelCanvasId, - imageSubRegion : whitePixelBoundingRegion - }); + if (!showBackground) { + if (defined(backgroundBillboard)) { + backgroundBillboard.show = false; + labelCollection._spareBackgroundBillboards.push(backgroundBillboard); + label._backgroundBillboard = backgroundBillboard = undefined; + } + } else { + if (!defined(backgroundBillboard)) { + if (labelCollection._spareBackgroundBillboards.length > 0) { + backgroundBillboard = labelCollection._spareBackgroundBillboards.pop(); + } else { + backgroundBillboard = labelCollection._backgroundBillboardCollection.add({ + collection : labelCollection, + image : whitePixelCanvasId, + imageSubRegion : whitePixelBoundingRegion + }); + } + label._backgroundBillboard = backgroundBillboard; } - label._backgroundBillboard = backgroundBillboard; - } - backgroundBillboard.color = label._backgroundColor; // new Color(0.5, 0.5, 0.5, 0.8); // TODO: remove comment - backgroundBillboard.show = label._show; - backgroundBillboard.position = label._position; - backgroundBillboard.eyeOffset = label._eyeOffset; - backgroundBillboard.pixelOffset = label._pixelOffset; - backgroundBillboard.horizontalOrigin = HorizontalOrigin.LEFT; - backgroundBillboard.verticalOrigin = label._verticalOrigin; - backgroundBillboard.heightReference = label._heightReference; - backgroundBillboard.scale = label._scale; - backgroundBillboard.pickPrimitive = label; - backgroundBillboard.id = label._id; - backgroundBillboard.translucencyByDistance = label._translucencyByDistance; - backgroundBillboard.pixelOffsetScaleByDistance = label._pixelOffsetScaleByDistance; - backgroundBillboard.distanceDisplayCondition = label._distanceDisplayCondition; + backgroundBillboard.color = label._backgroundColor; + backgroundBillboard.show = label._show; + backgroundBillboard.position = label._position; + backgroundBillboard.eyeOffset = label._eyeOffset; + backgroundBillboard.pixelOffset = label._pixelOffset; + backgroundBillboard.horizontalOrigin = HorizontalOrigin.LEFT; + backgroundBillboard.verticalOrigin = label._verticalOrigin; + backgroundBillboard.heightReference = label._heightReference; + backgroundBillboard.scale = label._scale; + backgroundBillboard.pickPrimitive = label; + backgroundBillboard.id = label._id; + backgroundBillboard.translucencyByDistance = label._translucencyByDistance; + backgroundBillboard.pixelOffsetScaleByDistance = label._pixelOffsetScaleByDistance; + backgroundBillboard.distanceDisplayCondition = label._distanceDisplayCondition; + } // if we have more glyphs than needed, unbind the extras. if (textLength < glyphsLength) { @@ -266,7 +274,6 @@ define([ var glyphPixelOffset = new Cartesian2(); function repositionAllGlyphs(label, resolutionScale) { -//resolutionScale = 4; // TODO: more testing var glyphs = label._glyphs; var glyph; var dimensions; From 1e94844cc748cc169397545c703d55b4ba4e4ec9 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Sat, 26 Nov 2016 21:40:56 -0500 Subject: [PATCH 082/396] Add CZML support for label backgrounds. --- Source/DataSources/CzmlDataSource.js | 3 ++ Source/DataSources/LabelGraphics.js | 40 +++++++++++++++++++++++++++ Source/DataSources/LabelVisualizer.js | 8 ++++++ Source/Scene/LabelCollection.js | 4 +-- 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/Source/DataSources/CzmlDataSource.js b/Source/DataSources/CzmlDataSource.js index 46563103ff83..76994aaf2282 100644 --- a/Source/DataSources/CzmlDataSource.js +++ b/Source/DataSources/CzmlDataSource.js @@ -1374,6 +1374,9 @@ define([ processPacketData(String, label, 'font', labelData.font, interval, sourceUri, entityCollection); processPacketData(LabelStyle, label, 'style', labelData.style, interval, sourceUri, entityCollection); processPacketData(Number, label, 'scale', labelData.scale, interval, sourceUri, entityCollection); + processPacketData(Boolean, label, 'showBackground', labelData.showBackground, interval, sourceUri, entityCollection); + processPacketData(Color, label, 'backgroundColor', labelData.backgroundColor, interval, sourceUri, entityCollection); + processPacketData(Cartesian2, label, 'backgroundPadding', labelData.backgroundPadding, interval, sourceUri, entityCollection); processPacketData(Cartesian2, label, 'pixelOffset', labelData.pixelOffset, interval, sourceUri, entityCollection); processPacketData(Cartesian3, label, 'eyeOffset', labelData.eyeOffset, interval, sourceUri, entityCollection); processPacketData(HorizontalOrigin, label, 'horizontalOrigin', labelData.horizontalOrigin, interval, sourceUri, entityCollection); diff --git a/Source/DataSources/LabelGraphics.js b/Source/DataSources/LabelGraphics.js index f16fcb5977a9..2898c820706b 100644 --- a/Source/DataSources/LabelGraphics.js +++ b/Source/DataSources/LabelGraphics.js @@ -35,6 +35,9 @@ define([ * @param {Property} [options.outlineColor=Color.BLACK] A Property specifying the outline {@link Color}. * @param {Property} [options.outlineWidth=1.0] A numeric Property specifying the outline width. * @param {Property} [options.show=true] A boolean Property specifying the visibility of the label. + * @param {Property} [options.showBackground=true] A boolean Property specifying the visibility of the background behind the label. + * @param {Property} [options.backgroundColor=new Color(0.165, 0.165, 0.165, 0.8)] A Property specifying the background {@link Color}. + * @param {Property} [options.backgroundPadding=new Cartesian2(2, 2)] A {@link Cartesian2} Property specifying the horizontal and vertical background padding in pixels. * @param {Property} [options.scale=1.0] A numeric Property specifying the scale to apply to the text. * @param {Property} [options.horizontalOrigin=HorizontalOrigin.CENTER] A Property specifying the {@link HorizontalOrigin}. * @param {Property} [options.verticalOrigin=VerticalOrigin.CENTER] A Property specifying the {@link VerticalOrigin}. @@ -74,6 +77,12 @@ define([ this._scaleSubscription = undefined; this._show = undefined; this._showSubscription = undefined; + this._showBackground = undefined; + this._showBackgroundSubscription = undefined; + this._backgroundColor = undefined; + this._backgroundColorSubscription = undefined; + this._backgroundPadding = undefined; + this._backgroundPaddingSubscription = undefined; this._translucencyByDistance = undefined; this._translucencyByDistanceSubscription = undefined; this._pixelOffsetScaleByDistance = undefined; @@ -232,6 +241,31 @@ define([ */ show : createPropertyDescriptor('show'), + /** + * Gets or sets the boolean Property specifying the visibility of the background behind the label. + * @memberof LabelGraphics.prototype + * @type {Property} + * @default false + */ + showBackground : createPropertyDescriptor('showBackground'), + + /** + * Gets or sets the Property specifying the background {@link Color}. + * @memberof LabelGraphics.prototype + * @type {Property} + * @default new Color(0.165, 0.165, 0.165, 0.8) + */ + backgroundColor : createPropertyDescriptor('backgroundColor'), + + /** + * Gets or sets the {@link Cartesian2} Property specifying the label's horizontal and vertical + * background padding in pixels. + * @memberof LabelGraphics.prototype + * @type {Property} + * @default new Cartesian2(2, 2) + */ + backgroundPadding : createPropertyDescriptor('backgroundPadding'), + /** * Gets or sets {@link NearFarScalar} Property specifying the translucency of the label based on the distance from the camera. * A label's translucency will interpolate between the {@link NearFarScalar#nearValue} and @@ -279,6 +313,9 @@ define([ result.fillColor = this.fillColor; result.outlineColor = this.outlineColor; result.outlineWidth = this.outlineWidth; + result.showBackground = this.showBackground; + result.backgroundColor = this.backgroundColor; + result.backgroundPadding = this.backgroundPadding; result.scale = this.scale; result.horizontalOrigin = this.horizontalOrigin; result.verticalOrigin = this.verticalOrigin; @@ -311,6 +348,9 @@ define([ this.fillColor = defaultValue(this.fillColor, source.fillColor); this.outlineColor = defaultValue(this.outlineColor, source.outlineColor); this.outlineWidth = defaultValue(this.outlineWidth, source.outlineWidth); + this.showBackground = defaultValue(this.showBackground, source.showBackground); + this.backgroundColor = defaultValue(this.backgroundColor, source.backgroundColor); + this.backgroundPadding = defaultValue(this.backgroundPadding, source.backgroundPadding); this.scale = defaultValue(this.scale, source.scale); this.horizontalOrigin = defaultValue(this.horizontalOrigin, source.horizontalOrigin); this.verticalOrigin = defaultValue(this.verticalOrigin, source.verticalOrigin); diff --git a/Source/DataSources/LabelVisualizer.js b/Source/DataSources/LabelVisualizer.js index 7689eeff192b..3d008f5ccd63 100644 --- a/Source/DataSources/LabelVisualizer.js +++ b/Source/DataSources/LabelVisualizer.js @@ -41,6 +41,9 @@ define([ var defaultFillColor = Color.WHITE; var defaultOutlineColor = Color.BLACK; var defaultOutlineWidth = 1.0; + var defaultShowBackground = false; + var defaultBackgroundColor = new Color(0.165, 0.165, 0.165, 0.8); + var defaultBackgroundPadding = new Cartesian2(2, 2); var defaultPixelOffset = Cartesian2.ZERO; var defaultEyeOffset = Cartesian3.ZERO; var defaultHeightReference = HeightReference.NONE; @@ -50,6 +53,8 @@ define([ var position = new Cartesian3(); var fillColor = new Color(); var outlineColor = new Color(); + var backgroundColor = new Color(); + var backgroundPadding = new Cartesian2(); var eyeOffset = new Cartesian3(); var pixelOffset = new Cartesian2(); var translucencyByDistance = new NearFarScalar(); @@ -146,6 +151,9 @@ define([ label.fillColor = Property.getValueOrDefault(labelGraphics._fillColor, time, defaultFillColor, fillColor); label.outlineColor = Property.getValueOrDefault(labelGraphics._outlineColor, time, defaultOutlineColor, outlineColor); label.outlineWidth = Property.getValueOrDefault(labelGraphics._outlineWidth, time, defaultOutlineWidth); + label.showBackground = Property.getValueOrDefault(labelGraphics._showBackground, time, defaultShowBackground); + label.backgroundColor = Property.getValueOrDefault(labelGraphics._backgroundColor, time, defaultBackgroundColor, backgroundColor); + label.backgroundPadding = Property.getValueOrDefault(labelGraphics._backgroundPadding, time, defaultBackgroundPadding, backgroundPadding); label.pixelOffset = Property.getValueOrDefault(labelGraphics._pixelOffset, time, defaultPixelOffset, pixelOffset); label.eyeOffset = Property.getValueOrDefault(labelGraphics._eyeOffset, time, defaultEyeOffset, eyeOffset); label.heightReference = Property.getValueOrDefault(labelGraphics._heightReference, time, defaultHeightReference); diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 74be2a8a4f0c..52fd37363f63 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -349,7 +349,7 @@ define([ glyphPixelOffset.y = -(maxY - maxHeight) / 2 * scale - maxDescent * scale; } glyphPixelOffset.y *= resolutionScale; - backgroundBillboard._setTranslate(glyphPixelOffset); + backgroundBillboard._setTranslate(glyphPixelOffset); // TODO: Make this count towards edge-based alignments. backgroundBillboard.width = totalWidth + (backgroundPadding.x * 2); backgroundBillboard.height = maxHeight + (backgroundPadding.y * 2); } @@ -531,7 +531,7 @@ define([ * outlineColor : Cesium.Color.BLACK, * outlineWidth : 1.0, * showBackground : false, - * backgroundColor : Cesium.Color.TRANSPARENT, + * backgroundColor : new Cesium.Color(0.165, 0.165, 0.165, 0.8), * backgroundPadding : new Cesium.Cartesian2(2, 2), * style : Cesium.LabelStyle.FILL, * pixelOffset : Cesium.Cartesian2.ZERO, From fdb3ddf7091d40f8ea0834495a3fa9082f1c92e2 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Sat, 26 Nov 2016 21:57:54 -0500 Subject: [PATCH 083/396] Update Terrain demo to use label backgrounds. --- Apps/Sandcastle/gallery/Terrain.html | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Apps/Sandcastle/gallery/Terrain.html b/Apps/Sandcastle/gallery/Terrain.html index 6346ceb11117..0d78a6bfda0e 100644 --- a/Apps/Sandcastle/gallery/Terrain.html +++ b/Apps/Sandcastle/gallery/Terrain.html @@ -148,11 +148,13 @@ }, label : { text : position.height.toFixed(1), + font : '10pt monospace', horizontalOrigin : Cesium.HorizontalOrigin.CENTER, - scale : 0.3, pixelOffset : new Cesium.Cartesian2(0, -14), - fillColor : Cesium.Color.RED, - outlineColor : Cesium.Color.WHITE + fillColor : Cesium.Color.BLACK, + outlineColor : Cesium.Color.BLACK, + showBackground : true, + backgroundColor : new Cesium.Color(0.9, 0.9, 0.9, 0.7) } }); } From 156d5bb52f2d7139f142e045722d1409e5809228 Mon Sep 17 00:00:00 2001 From: "duvi.fn" Date: Sun, 27 Nov 2016 14:50:23 +0200 Subject: [PATCH 084/396] compute origin point at the intersection of the surface normal with the z-axis --- Source/Scene/Globe.js | 40 ++++++++++++++++++++++++++----- Source/Scene/QuadtreePrimitive.js | 39 +++++++++++++++++++++++++----- 2 files changed, 67 insertions(+), 12 deletions(-) diff --git a/Source/Scene/Globe.js b/Source/Scene/Globe.js index 0d96fda711ae..5490aeb2a36c 100644 --- a/Source/Scene/Globe.js +++ b/Source/Scene/Globe.js @@ -15,6 +15,7 @@ define([ '../Core/GeographicProjection', '../Core/IntersectionTests', '../Core/loadImage', + '../Core/Math', '../Core/Ray', '../Core/Rectangle', '../Renderer/ShaderSource', @@ -45,6 +46,7 @@ define([ GeographicProjection, IntersectionTests, loadImage, + CesiumMath, Ray, Rectangle, ShaderSource, @@ -432,14 +434,40 @@ define([ var ray = scratchGetHeightRay; var surfaceNormal = ellipsoid.geodeticSurfaceNormal(cartesian, ray.direction); - // compute origin point, to account for a case where the terrain is under ellipsoid surface - var minimumHeight = Math.min(defaultValue(tile.data.minimumHeight, 0.0), 0.0); + // compute origin point - // take into account the position height - minimumHeight -= cartographic.height; + // try to find the intersection point between the surface normal and z-axis. + // Ellipsoid is a surface of revolution, so surface normal intersects the rotation axis (z-axis) - var minimumHeightVector = Cartesian3.multiplyByScalar(surfaceNormal, minimumHeight - 1.0, scratchGetHeightIntersection); - Cartesian3.add(cartesian, minimumHeightVector, ray.origin); + // compute the magnitude required to bring surface normal to x=0, y=0, from data.position + var magnitude; + + // avoid dividing by zero + if (Math.abs(surfaceNormal.x) > CesiumMath.EPSILON16){ + magnitude = cartesian.x / surfaceNormal.x; + } else if (Math.abs(surfaceNormal.y) > CesiumMath.EPSILON16){ + magnitude = cartesian.y / surfaceNormal.y; + } else if (Math.abs(surfaceNormal.z) > CesiumMath.EPSILON16){ //surface normal is (0,0,1) | (0,0,-1) | (0,0,0) + magnitude = cartesian.z / surfaceNormal.z; + } else { //(0,0,0), just for case + magnitude = 0; + } + + var vectorToMinimumPoint = Cartesian3.multiplyByScalar(surfaceNormal, magnitude, scratchGetHeightIntersection); + Cartesian3.subtract(cartesian, vectorToMinimumPoint, ray.origin); + + // Theoretically, the intersection point can be outside the ellipsoid, so we have to check if the result's 'z' is inside the ellipsoid (with some buffer) + if (Math.abs(ray.origin.z) >= ellipsoid.radii.z -11500.0){ + // intersection point is outside the ellipsoid, try other value + magnitude = Math.min(defaultValue(tile.data.minimumHeight, 0.0),-11500.0); + + // take into account the position height + magnitude -= cartographic.height; + + // multiply by the *positive* value of the magnitude + vectorToMinimumPoint = Cartesian3.multiplyByScalar(surfaceNormal, Math.abs(magnitude) + 1, scratchGetHeightIntersection); + Cartesian3.subtract(cartesian, vectorToMinimumPoint, ray.origin); + } var intersection = tile.data.pick(ray, undefined, undefined, false, scratchGetHeightIntersection); if (!defined(intersection)) { diff --git a/Source/Scene/QuadtreePrimitive.js b/Source/Scene/QuadtreePrimitive.js index 2555401f7f42..e602e260404c 100644 --- a/Source/Scene/QuadtreePrimitive.js +++ b/Source/Scene/QuadtreePrimitive.js @@ -633,14 +633,41 @@ define([ if (mode === SceneMode.SCENE3D) { var surfaceNormal = ellipsoid.geodeticSurfaceNormal(data.position, scratchRay.direction); - // compute origin point, to account for a case where the terrain is under ellipsoid surface - var minimumHeight = Math.min(defaultValue(tile.data.minimumHeight, 0.0), 0.0); + // compute origin point + + // try to find the intersection point between the surface normal and z-axis. + // Ellipsoid is a surface of revolution, so surface normal intersects the rotation axis (z-axis) + + // compute the magnitude required to bring surface normal to x=0, y=0, from data.position + var magnitude; + + // avoid dividing by zero + if (Math.abs(surfaceNormal.x) > CesiumMath.EPSILON16){ + magnitude = data.position.x / surfaceNormal.x; + } else if (Math.abs(surfaceNormal.y) > CesiumMath.EPSILON16){ + magnitude = data.position.y / surfaceNormal.y; + } else if (Math.abs(surfaceNormal.z) > CesiumMath.EPSILON16){ //surface normal is (0,0,1) | (0,0,-1) | (0,0,0) + magnitude = data.position.z / surfaceNormal.z; + } else { //(0,0,0), just for case + magnitude = 0; + } + + var vectorToMinimumPoint = Cartesian3.multiplyByScalar(surfaceNormal, magnitude, scratchPosition); + Cartesian3.subtract(data.position, vectorToMinimumPoint, scratchRay.origin); + + // Theoretically, the intersection point can be outside the ellipsoid, so we have to check if the result's 'z' is inside the ellipsoid (with some buffer) + if (Math.abs(scratchRay.origin.z) >= ellipsoid.radii.z -11500.0){ + // intersection point is outside the ellipsoid, try other value + magnitude = Math.min(defaultValue(tile.data.minimumHeight, 0.0),-11500.0); - // take into account the position height - minimumHeight -= data.positionCartographic.height; + // take into account the position height + magnitude -= data.positionCartographic.height; + + // multiply by the *positive* value of the magnitude + vectorToMinimumPoint = Cartesian3.multiplyByScalar(surfaceNormal, Math.abs(magnitude) + 1, scratchPosition); + Cartesian3.subtract(data.position, vectorToMinimumPoint, scratchRay.origin); + } - var minimumHeightVector = Cartesian3.multiplyByScalar(surfaceNormal, minimumHeight - 1.0, scratchPosition); - Cartesian3.add(data.position, minimumHeightVector, scratchRay.origin); } else { Cartographic.clone(data.positionCartographic, scratchCartographic); From 4d12c0e09780163baa729abb98e0301a855e0d38 Mon Sep 17 00:00:00 2001 From: "duvi.fn" Date: Sun, 27 Nov 2016 16:08:32 +0200 Subject: [PATCH 085/396] add to CHANGES.md --- CHANGES.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index d0d3c642ca21..1502c0be539b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,9 @@ Change Log ========== +* Fixed issue where billboards on terrain have some offset. [#4598](https://github.com/AnalyticalGraphicsInc/cesium/issues/4598) +* Fixed issue where `globe.getHeight` randomly returns 'undefined'. [#3411](https://github.com/AnalyticalGraphicsInc/cesium/issues/3411) + ### 1.27 - 2016-11-01 * Deprecated * Individual heading, pitch, and roll options to `Transforms.headingPitchRollToFixedFrame` and `Transforms.headingPitchRollQuaternion` have been deprecated and will be removed in 1.30. Pass the new `HeadingPitchRoll` object instead. [#4498](https://github.com/AnalyticalGraphicsInc/cesium/pull/4498) From 9f551ab85d9b675c5368fdd802d51940df944269 Mon Sep 17 00:00:00 2001 From: "duvi.fn" Date: Sun, 27 Nov 2016 16:21:03 +0200 Subject: [PATCH 086/396] typos --- Source/Scene/Globe.js | 4 ++-- Source/Scene/QuadtreePrimitive.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Scene/Globe.js b/Source/Scene/Globe.js index 5490aeb2a36c..8389c9fa0c3f 100644 --- a/Source/Scene/Globe.js +++ b/Source/Scene/Globe.js @@ -436,10 +436,10 @@ define([ // compute origin point - // try to find the intersection point between the surface normal and z-axis. + // Try to find the intersection point between the surface normal and z-axis. // Ellipsoid is a surface of revolution, so surface normal intersects the rotation axis (z-axis) - // compute the magnitude required to bring surface normal to x=0, y=0, from data.position + // compute the magnitude required to bring surface normal to x=0, y=0, from cartesian var magnitude; // avoid dividing by zero diff --git a/Source/Scene/QuadtreePrimitive.js b/Source/Scene/QuadtreePrimitive.js index e602e260404c..ed78571563f0 100644 --- a/Source/Scene/QuadtreePrimitive.js +++ b/Source/Scene/QuadtreePrimitive.js @@ -635,7 +635,7 @@ define([ // compute origin point - // try to find the intersection point between the surface normal and z-axis. + // Try to find the intersection point between the surface normal and z-axis. // Ellipsoid is a surface of revolution, so surface normal intersects the rotation axis (z-axis) // compute the magnitude required to bring surface normal to x=0, y=0, from data.position From ed5f91113c746f46fda62ad391e82a9e7f6b3803 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Wed, 30 Nov 2016 16:41:11 -0500 Subject: [PATCH 087/396] Remove poor assumptions from label tests. --- Specs/Scene/LabelCollectionSpec.js | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/Specs/Scene/LabelCollectionSpec.js b/Specs/Scene/LabelCollectionSpec.js index b23b9f579169..1771ba9dda32 100644 --- a/Specs/Scene/LabelCollectionSpec.js +++ b/Specs/Scene/LabelCollectionSpec.js @@ -56,6 +56,7 @@ defineSuite([ afterAll(function() { scene.destroyForSpecs(); }); + beforeEach(function() { scene.morphTo3D(0); @@ -1300,10 +1301,8 @@ defineSuite([ label.verticalOrigin = VerticalOrigin.TOP; scene.renderForSpecs(); - // vertical origin TOP should decrease (or equal) Y offset compared to CENTER - expect(getGlyphBillboardVertexTranslate(label, 0).y).toBeLessThanOrEqualTo(offset0.y); - expect(getGlyphBillboardVertexTranslate(label, 1).y).toBeLessThanOrEqualTo(offset1.y); - expect(getGlyphBillboardVertexTranslate(label, 2).y).toBeLessThanOrEqualTo(offset2.y); + // Because changing the label's vertical origin also changes the vertical origin of each + // individual glyph, it is not safe to assume anything about Y offsets being more or less. // X offset should be unchanged expect(getGlyphBillboardVertexTranslate(label, 0).x).toEqual(offset0.x); @@ -1313,11 +1312,6 @@ defineSuite([ label.verticalOrigin = VerticalOrigin.BOTTOM; scene.renderForSpecs(); - // vertical origin BOTTOM should increase (or equal) Y offset compared to CENTER - expect(getGlyphBillboardVertexTranslate(label, 0).y).toBeGreaterThanOrEqualTo(offset0.y); - expect(getGlyphBillboardVertexTranslate(label, 1).y).toBeGreaterThanOrEqualTo(offset1.y); - expect(getGlyphBillboardVertexTranslate(label, 2).y).toBeGreaterThanOrEqualTo(offset2.y); - // X offset should be unchanged expect(getGlyphBillboardVertexTranslate(label, 0).x).toEqual(offset0.x); expect(getGlyphBillboardVertexTranslate(label, 1).x).toEqual(offset1.x); @@ -1394,20 +1388,9 @@ defineSuite([ offset1 = getGlyphBillboardVertexTranslate(label, 1); offset2 = getGlyphBillboardVertexTranslate(label, 2); - // vertical origin TOP should decrease (or equal) Y offset compared to CENTER - expect(getGlyphBillboardVertexTranslate(label, 0).y).toBeLessThanOrEqualTo(offset0.y); - expect(getGlyphBillboardVertexTranslate(label, 1).y).toBeLessThanOrEqualTo(offset1.y); - expect(getGlyphBillboardVertexTranslate(label, 2).y).toBeLessThanOrEqualTo(offset2.y); - - label.verticalOrigin = VerticalOrigin.BOTTOM; - scene.renderForSpecs(); - - // vertical origin BOTTOM should increase (or equal) Y offset compared to CENTER - expect(getGlyphBillboardVertexTranslate(label, 0).y).toBeGreaterThanOrEqualTo(offset0.y); - expect(getGlyphBillboardVertexTranslate(label, 1).y).toBeGreaterThanOrEqualTo(offset1.y); - expect(getGlyphBillboardVertexTranslate(label, 2).y).toBeGreaterThanOrEqualTo(offset2.y); + // Because changing the label's vertical origin also changes the vertical origin of each + // individual glyph, it is not safe to assume anything about Y offsets being more or less. - label.verticalOrigin = VerticalOrigin.CENTER; label.horizontalOrigin = HorizontalOrigin.LEFT; scene.renderForSpecs(); From 39016dca788ed3eccc42f08f5bb4f8300e54764e Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Wed, 30 Nov 2016 20:47:52 -0500 Subject: [PATCH 088/396] Make label.backgroundPadding count towards alignment. --- Source/Scene/LabelCollection.js | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 52fd37363f63..4326ae8fd26e 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -270,8 +270,9 @@ define([ label._repositionAllGlyphs = true; } - // reusable Cartesian2 instance + // reusable Cartesian2 instances var glyphPixelOffset = new Cartesian2(); + var scratchBackgroundPadding = new Cartesian2(); function repositionAllGlyphs(label, resolutionScale) { var glyphs = label._glyphs; @@ -281,6 +282,12 @@ define([ var maxDescent = Number.NEGATIVE_INFINITY; var maxY = 0; + var backgroundBillboard = label._backgroundBillboard; + var backgroundPadding = scratchBackgroundPadding; + Cartesian2.clone( + (defined(backgroundBillboard) ? label._backgroundPadding : Cartesian2.ZERO), + backgroundPadding); + var glyphIndex = 0; var glyphLength = glyphs.length; for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { @@ -303,7 +310,9 @@ define([ if (horizontalOrigin === HorizontalOrigin.CENTER) { widthOffset -= totalWidth / 2 * scale; } else if (horizontalOrigin === HorizontalOrigin.RIGHT) { - widthOffset -= totalWidth * scale; + widthOffset -= (totalWidth + backgroundPadding.x) * scale; + } else { + widthOffset += backgroundPadding.x * scale; } glyphPixelOffset.x = widthOffset * resolutionScale; @@ -314,10 +323,11 @@ define([ glyph = glyphs[glyphIndex]; dimensions = glyph.dimensions; + // TODO: Add VerticalOrigin.BASELINE as copy of current BOTTOM, then fix BOTTOM. if (verticalOrigin === VerticalOrigin.BOTTOM || dimensions.height === maxY) { glyphPixelOffset.y = -dimensions.descent * scale; } else if (verticalOrigin === VerticalOrigin.TOP) { - glyphPixelOffset.y = -(maxY - dimensions.height) * scale - dimensions.descent * scale; + glyphPixelOffset.y = -(maxY - dimensions.height + dimensions.descent + backgroundPadding.y) * scale; } else if (verticalOrigin === VerticalOrigin.CENTER) { glyphPixelOffset.y = -(maxY - dimensions.height) / 2 * scale - dimensions.descent * scale; } @@ -337,14 +347,13 @@ define([ } } - var backgroundBillboard = label._backgroundBillboard; + // TODO: Figure out why live-updating Entity.LabelGraphics doesn't get the right answer here. if (defined(backgroundBillboard)) { - var backgroundPadding = label._backgroundPadding; glyphPixelOffset.x = (widthOffset - backgroundPadding.x * scale) * resolutionScale; if (verticalOrigin === VerticalOrigin.BOTTOM) { glyphPixelOffset.y = -backgroundPadding.y * scale - maxDescent * scale; } else if (verticalOrigin === VerticalOrigin.TOP) { - glyphPixelOffset.y = -(maxY - maxHeight - backgroundPadding.y) * scale - maxDescent * scale; + glyphPixelOffset.y = -(maxY - maxHeight) * scale - maxDescent * scale; } else { glyphPixelOffset.y = -(maxY - maxHeight) / 2 * scale - maxDescent * scale; } From c66cd191ceebaddf0168ac7358ef51fb3cb882eb Mon Sep 17 00:00:00 2001 From: Tekhaus Dev Date: Wed, 30 Nov 2016 20:19:12 -0800 Subject: [PATCH 089/396] (fix) display tooltips on All demos view --- Apps/Sandcastle/CesiumSandcastle.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Apps/Sandcastle/CesiumSandcastle.js b/Apps/Sandcastle/CesiumSandcastle.js index 585947073935..59f2a02ba037 100644 --- a/Apps/Sandcastle/CesiumSandcastle.js +++ b/Apps/Sandcastle/CesiumSandcastle.js @@ -305,7 +305,7 @@ require({ var selectedTabName = registry.byId('innerPanel').selectedChildWidget.title; var suffix = selectedTabName + 'Demos'; if (selectedTabName === 'All') { - suffix = ''; + suffix = 'all'; } else if (selectedTabName === 'Search Results') { suffix = 'searchDemo'; } From d9869635b8c802a907d95d1b3f05c9607dc3825f Mon Sep 17 00:00:00 2001 From: Brad Hover Date: Wed, 30 Nov 2016 23:06:54 -0800 Subject: [PATCH 090/396] Add self to CONTRIBUTORS.md --- CONTRIBUTORS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index ad690a20ec1e..0b5dce7d42cf 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -115,4 +115,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu * [Victor Malaret](https://github.com/malaretv) * [David Friedman](https://github.com/duvifn) * [Abhishek Potnis](https://github.com/abhishekvp) - +* [Brad Hover](https://github.com/tekhaus) From f0f3a1bf52514412c32f73bc84940b5b43b392f3 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Thu, 1 Dec 2016 11:37:14 -0500 Subject: [PATCH 091/396] Add VerticalOrigin.BASELINE --- Source/Scene/BillboardCollection.js | 5 +++++ Source/Scene/LabelCollection.js | 20 +++++++++++++------- Source/Scene/VerticalOrigin.js | 8 ++++++++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/Source/Scene/BillboardCollection.js b/Source/Scene/BillboardCollection.js index 34370f8819de..e269f5a96445 100644 --- a/Source/Scene/BillboardCollection.js +++ b/Source/Scene/BillboardCollection.js @@ -813,6 +813,11 @@ define([ show = false; } + // Raw billboards don't distinguish between BASELINE and BOTTOM, only LabelCollection does that. + if (verticalOrigin === VerticalOrigin.BASELINE) { + verticalOrigin = VerticalOrigin.BOTTOM; + } + billboardCollection._allHorizontalCenter = billboardCollection._allHorizontalCenter && horizontalOrigin === HorizontalOrigin.CENTER; billboardCollection._allVerticalCenter = billboardCollection._allVerticalCenter && verticalOrigin === VerticalOrigin.CENTER; diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 4326ae8fd26e..fc534b190ff8 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -81,13 +81,13 @@ define([ writeTextToCanvasParameters.strokeColor = outlineColor; writeTextToCanvasParameters.strokeWidth = outlineWidth; - if (verticalOrigin === VerticalOrigin.BOTTOM) { - writeTextToCanvasParameters.textBaseline = 'bottom'; + if (verticalOrigin === VerticalOrigin.CENTER) { + writeTextToCanvasParameters.textBaseline = 'middle'; } else if (verticalOrigin === VerticalOrigin.TOP) { writeTextToCanvasParameters.textBaseline = 'top'; } else { - // VerticalOrigin.CENTER - writeTextToCanvasParameters.textBaseline = 'middle'; + // VerticalOrigin.BOTTOM and VerticalOrigin.BASELINE + writeTextToCanvasParameters.textBaseline = 'bottom'; } writeTextToCanvasParameters.fill = style === LabelStyle.FILL || style === LabelStyle.FILL_AND_OUTLINE; @@ -324,12 +324,15 @@ define([ dimensions = glyph.dimensions; // TODO: Add VerticalOrigin.BASELINE as copy of current BOTTOM, then fix BOTTOM. - if (verticalOrigin === VerticalOrigin.BOTTOM || dimensions.height === maxY) { + if (verticalOrigin === VerticalOrigin.BASELINE) { glyphPixelOffset.y = -dimensions.descent * scale; } else if (verticalOrigin === VerticalOrigin.TOP) { glyphPixelOffset.y = -(maxY - dimensions.height + dimensions.descent + backgroundPadding.y) * scale; } else if (verticalOrigin === VerticalOrigin.CENTER) { glyphPixelOffset.y = -(maxY - dimensions.height) / 2 * scale - dimensions.descent * scale; + } else { + // VerticalOrigin.BOTTOM + glyphPixelOffset.y = (maxDescent - dimensions.descent + backgroundPadding.y) * scale; } glyphPixelOffset.y *= resolutionScale; @@ -350,12 +353,15 @@ define([ // TODO: Figure out why live-updating Entity.LabelGraphics doesn't get the right answer here. if (defined(backgroundBillboard)) { glyphPixelOffset.x = (widthOffset - backgroundPadding.x * scale) * resolutionScale; - if (verticalOrigin === VerticalOrigin.BOTTOM) { + if (verticalOrigin === VerticalOrigin.BASELINE) { glyphPixelOffset.y = -backgroundPadding.y * scale - maxDescent * scale; } else if (verticalOrigin === VerticalOrigin.TOP) { glyphPixelOffset.y = -(maxY - maxHeight) * scale - maxDescent * scale; - } else { + } else if (verticalOrigin === VerticalOrigin.CENTER) { glyphPixelOffset.y = -(maxY - maxHeight) / 2 * scale - maxDescent * scale; + } else { + // VerticalOrigin.BOTTOM + glyphPixelOffset.y = 0; } glyphPixelOffset.y *= resolutionScale; backgroundBillboard._setTranslate(glyphPixelOffset); // TODO: Make this count towards edge-based alignments. diff --git a/Source/Scene/VerticalOrigin.js b/Source/Scene/VerticalOrigin.js index b72103652dc6..b810ddc85c66 100644 --- a/Source/Scene/VerticalOrigin.js +++ b/Source/Scene/VerticalOrigin.js @@ -31,6 +31,14 @@ define([ */ BOTTOM : 1, + /** + * If the object contains text, the origin is at the baseline of the text, else the origin is at the bottom of the object. + * + * @type {Number} + * @constant + */ + BASELINE : 2, + /** * The origin is at the top of the object. * From 3c6a76f319a17ce781cb99120ea4ab4d27c9f17d Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Thu, 1 Dec 2016 16:20:02 -0500 Subject: [PATCH 092/396] Fix various issues with value updates. --- Source/Scene/Label.js | 69 ++++++++++++++++++++++++++++++--- Source/Scene/LabelCollection.js | 4 +- 2 files changed, 64 insertions(+), 9 deletions(-) diff --git a/Source/Scene/Label.js b/Source/Scene/Label.js index 162417c9bf76..6124e105e806 100644 --- a/Source/Scene/Label.js +++ b/Source/Scene/Label.js @@ -146,6 +146,10 @@ define([ billboard.show = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.show = value; + } } } }, @@ -177,6 +181,10 @@ define([ billboard.position = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.position = value; + } if (this._heightReference !== HeightReference.NONE) { this._updateClamping(); @@ -211,6 +219,10 @@ define([ billboard.heightReference = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.heightReference = value; + } repositionAllGlyphs(this); @@ -358,7 +370,7 @@ define([ if (this._showBackground !== value) { this._showBackground = value; - rebindAllGlyphs(this); // TODO: Can do something cheaper than rebindAllGlyphs? + rebindAllGlyphs(this); } } }, @@ -382,7 +394,11 @@ define([ var backgroundColor = this._backgroundColor; if (!Color.equals(backgroundColor, value)) { Color.clone(value, backgroundColor); - rebindAllGlyphs(this); // TODO: Can do something cheaper than rebindAllGlyphs? + + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.color = backgroundColor; + } } } }, @@ -407,7 +423,7 @@ define([ var backgroundPadding = this._backgroundPadding; if (!Cartesian2.equals(backgroundPadding, value)) { Cartesian2.clone(value, backgroundPadding); - rebindAllGlyphs(this); // TODO: Can do something cheaper than rebindAllGlyphs? + repositionAllGlyphs(this); } } }, @@ -473,6 +489,10 @@ define([ glyph.billboard.pixelOffset = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.pixelOffset = value; + } } } }, @@ -521,6 +541,10 @@ define([ glyph.billboard.translucencyByDistance = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.translucencyByDistance = value; + } } } }, @@ -570,6 +594,10 @@ define([ glyph.billboard.pixelOffsetScaleByDistance = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.pixelOffsetScaleByDistance = value; + } } } }, @@ -618,6 +646,10 @@ define([ glyph.billboard.eyeOffset = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.eyeOffset = value; + } } } }, @@ -689,6 +721,10 @@ define([ glyph.billboard.verticalOrigin = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.verticalOrigin = value; + } repositionAllGlyphs(this); } @@ -733,6 +769,10 @@ define([ glyph.billboard.scale = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.scale = value; + } repositionAllGlyphs(this); } @@ -765,6 +805,10 @@ define([ glyph.billboard.distanceDisplayCondition = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.distanceDisplayCondition = value; + } } } }, @@ -789,6 +833,10 @@ define([ glyph.billboard.id = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.id = value; + } } } }, @@ -807,19 +855,23 @@ define([ this._actualClampedPosition = Cartesian3.clone(value, this._actualClampedPosition); var glyphs = this._glyphs; + value = defaultValue(value, this._position); for (var i = 0, len = glyphs.length; i < len; i++) { var glyph = glyphs[i]; if (defined(glyph.billboard)) { // Set all the private values here, because we already clamped to ground // so we don't want to do it again for every glyph - glyph.billboard._clampedPosition = value; - - value = defaultValue(value, this._position); Cartesian3.clone(value, glyph.billboard._position); Cartesian3.clone(value, glyph.billboard._actualPosition); } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard._clampedPosition = value; + Cartesian3.clone(value, backgroundBillboard._position); + Cartesian3.clone(value, backgroundBillboard._actualPosition); + } } }, @@ -846,6 +898,10 @@ define([ glyph.billboard.clusterShow = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.cluserShow = value; + } } } } @@ -938,6 +994,7 @@ define([ if (!defined(result)) { result = new BoundingRectangle(); } + // TODO: Add backgroundPadding here. result.x = x; result.y = y; diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index fc534b190ff8..937dd40aa504 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -323,7 +323,6 @@ define([ glyph = glyphs[glyphIndex]; dimensions = glyph.dimensions; - // TODO: Add VerticalOrigin.BASELINE as copy of current BOTTOM, then fix BOTTOM. if (verticalOrigin === VerticalOrigin.BASELINE) { glyphPixelOffset.y = -dimensions.descent * scale; } else if (verticalOrigin === VerticalOrigin.TOP) { @@ -350,7 +349,6 @@ define([ } } - // TODO: Figure out why live-updating Entity.LabelGraphics doesn't get the right answer here. if (defined(backgroundBillboard)) { glyphPixelOffset.x = (widthOffset - backgroundPadding.x * scale) * resolutionScale; if (verticalOrigin === VerticalOrigin.BASELINE) { @@ -364,9 +362,9 @@ define([ glyphPixelOffset.y = 0; } glyphPixelOffset.y *= resolutionScale; - backgroundBillboard._setTranslate(glyphPixelOffset); // TODO: Make this count towards edge-based alignments. backgroundBillboard.width = totalWidth + (backgroundPadding.x * 2); backgroundBillboard.height = maxHeight + (backgroundPadding.y * 2); + backgroundBillboard._setTranslate(glyphPixelOffset); } } From 10045f613230e25b7667c683d03c9b507a5d8ca0 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Thu, 1 Dec 2016 18:08:38 -0500 Subject: [PATCH 093/396] Mostly fix getScreenSpaceBoundingBox. --- Source/Scene/Billboard.js | 2 +- Source/Scene/Label.js | 70 +++++++++++++++++++++------------ Source/Scene/LabelCollection.js | 1 - 3 files changed, 45 insertions(+), 28 deletions(-) diff --git a/Source/Scene/Billboard.js b/Source/Scene/Billboard.js index 814aa5fcbd3d..30c08de4bf9e 100644 --- a/Source/Scene/Billboard.js +++ b/Source/Scene/Billboard.js @@ -1227,7 +1227,7 @@ define([ } var y = screenSpacePosition.y; - if (billboard.verticalOrigin === VerticalOrigin.TOP) { + if (billboard.verticalOrigin === VerticalOrigin.TOP) { // TODO: This is likely wrong! y -= height; } else if (billboard.verticalOrigin === VerticalOrigin.CENTER) { y -= height * 0.5; diff --git a/Source/Scene/Label.js b/Source/Scene/Label.js index 6124e105e806..091b1f347dea 100644 --- a/Source/Scene/Label.js +++ b/Source/Scene/Label.js @@ -957,44 +957,62 @@ define([ * @private */ Label.getScreenSpaceBoundingBox = function(label, screenSpacePosition, result) { + var x = 0; + var y = 0; var width = 0; var height = 0; + var scale = label.scale; - var glyphs = label._glyphs; - var length = glyphs.length; - for (var i = 0; i < length; ++i) { - var glyph = glyphs[i]; - var billboard = glyph.billboard; - if (!defined(billboard)) { - continue; + var backgroundBillboard = label._backgroundBillboard; + if (defined(backgroundBillboard)) { + x = screenSpacePosition.x + backgroundBillboard._translate.x; + y = screenSpacePosition.y - backgroundBillboard._translate.y; + width = backgroundBillboard.width * scale; + height = backgroundBillboard.height * scale; + + if (label.verticalOrigin === VerticalOrigin.BOTTOM || label.verticalOrigin === VerticalOrigin.BASELINE) { + y -= height; + } else if (label.verticalOrigin === VerticalOrigin.CENTER) { + y -= height * 0.5; } + } else { + x = Number.POSITIVE_INFINITY; + y = Number.POSITIVE_INFINITY; + var maxX = 0; + var maxY = 0; + var glyphs = label._glyphs; + var length = glyphs.length; + for (var i = 0; i < length; ++i) { + var glyph = glyphs[i]; + var billboard = glyph.billboard; + if (!defined(billboard)) { + continue; + } - width += billboard.width; - height = Math.max(height, billboard.height); - } + var glyphX = screenSpacePosition.x + billboard._translate.x; // TODO: Accomodate resolutionScale in _translate? + var glyphY = screenSpacePosition.y - billboard._translate.y; + var glyphWidth = billboard.width * scale; + var glyphHeight = billboard.height * scale; - var scale = label.scale; - width *= scale; - height *= scale; - - var x = screenSpacePosition.x; - if (label.horizontalOrigin === HorizontalOrigin.RIGHT) { - x -= width; - } else if (label.horizontalOrigin === HorizontalOrigin.CENTER) { - x -= width * 0.5; - } + if (label.verticalOrigin === VerticalOrigin.BOTTOM || label.verticalOrigin === VerticalOrigin.BASELINE) { + glyphY -= glyphHeight; + } else if (label.verticalOrigin === VerticalOrigin.CENTER) { + glyphY -= glyphHeight * 0.5; + } + + x = Math.min(x, glyphX); + y = Math.min(y, glyphY); + maxX = Math.max(maxX, glyphX + glyphWidth); + maxY = Math.max(maxY, glyphY + glyphHeight); + } - var y = screenSpacePosition.y; - if (label.verticalOrigin === VerticalOrigin.TOP) { - y -= height; - } else if (label.verticalOrigin === VerticalOrigin.CENTER) { - y -= height * 0.5; + width = maxX - x; + height = maxY - y; } if (!defined(result)) { result = new BoundingRectangle(); } - // TODO: Add backgroundPadding here. result.x = x; result.y = y; diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 937dd40aa504..6a79b67bcd7d 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -706,7 +706,6 @@ define([ context : context }); billboardCollection.textureAtlas = this._textureAtlas; - //addWhitePixelCanvas(this._textureAtlas, this); } if (!defined(this._backgroundTextureAtlas)) { From e3010ada419f97a38c4e8fbbf687bf14efd1baaf Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Fri, 2 Dec 2016 16:11:53 -0500 Subject: [PATCH 094/396] More fixes to getScreenSpacePosition. --- Source/DataSources/EntityCluster.js | 4 +- Source/Scene/Billboard.js | 9 +- Source/Scene/Label.js | 12 +- Specs/Scene/BillboardCollectionSpec.js | 4 +- Specs/Scene/LabelCollectionSpec.js | 204 +++++++++++++++++++------ 5 files changed, 174 insertions(+), 59 deletions(-) diff --git a/Source/DataSources/EntityCluster.js b/Source/DataSources/EntityCluster.js index e3d4641b965d..5facb35096a5 100644 --- a/Source/DataSources/EntityCluster.js +++ b/Source/DataSources/EntityCluster.js @@ -106,7 +106,7 @@ define([ function getBoundingBox(item, coord, pixelRange, entityCluster, result) { if (defined(item._labelCollection) && entityCluster._clusterLabels) { - result = Label.getScreenSpaceBoundingBox(item, coord, result); + result = Label.getScreenSpaceBoundingBox(item, coord, entityCluster._scene, result); } else if (defined(item._billboardCollection) && entityCluster._clusterBillboards) { result = Billboard.getScreenSpaceBoundingBox(item, coord, result); } else if (defined(item._pointPrimitiveCollection) && entityCluster._clusterPoints) { @@ -148,7 +148,7 @@ define([ cluster.label.show = true; cluster.label.text = numPoints.toLocaleString(); cluster.billboard.position = cluster.label.position = cluster.point.position = position; - + entityCluster._clusterEvent.raiseEvent(ids, cluster); } diff --git a/Source/Scene/Billboard.js b/Source/Scene/Billboard.js index 30c08de4bf9e..5b50dfe4c7e6 100644 --- a/Source/Scene/Billboard.js +++ b/Source/Scene/Billboard.js @@ -1132,9 +1132,7 @@ define([ return SceneTransforms.computeActualWgs84Position(frameState, tempCartesian3); }; - var scratchCartesian2 = new Cartesian2(); var scratchCartesian3 = new Cartesian3(); - var scratchComputePixelOffset = new Cartesian2(); // This function is basically a stripped-down JavaScript version of BillboardCollectionVS.glsl Billboard._computeScreenSpacePosition = function(modelMatrix, position, eyeOffset, pixelOffset, scene, result) { @@ -1148,10 +1146,7 @@ define([ } // Apply pixel offset - pixelOffset = Cartesian2.clone(pixelOffset, scratchComputePixelOffset); - var po = Cartesian2.multiplyByScalar(pixelOffset, scene.context.uniformState.resolutionScale, scratchCartesian2); - positionWC.x += po.x; - positionWC.y += po.y; + Cartesian2.add(positionWC, pixelOffset, positionWC); return positionWC; }; @@ -1227,7 +1222,7 @@ define([ } var y = screenSpacePosition.y; - if (billboard.verticalOrigin === VerticalOrigin.TOP) { // TODO: This is likely wrong! + if (billboard.verticalOrigin === VerticalOrigin.BOTTOM || billboard.verticalOrigin === VerticalOrigin.BASELINE) { y -= height; } else if (billboard.verticalOrigin === VerticalOrigin.CENTER) { y -= height * 0.5; diff --git a/Source/Scene/Label.js b/Source/Scene/Label.js index 091b1f347dea..3e5f2e64be92 100644 --- a/Source/Scene/Label.js +++ b/Source/Scene/Label.js @@ -951,22 +951,24 @@ define([ * Gets a label's screen space bounding box centered around screenSpacePosition. * @param {Label} label The label to get the screen space bounding box for. * @param {Cartesian2} screenSpacePosition The screen space center of the label. + * @param {Scene} scene The scene the label is in. * @param {BoundingRectangle} [result] The object onto which to store the result. * @returns {BoundingRectangle} The screen space bounding box. * * @private */ - Label.getScreenSpaceBoundingBox = function(label, screenSpacePosition, result) { + Label.getScreenSpaceBoundingBox = function(label, screenSpacePosition, scene, result) { var x = 0; var y = 0; var width = 0; var height = 0; var scale = label.scale; + var resolutionScale = scene.context.uniformState.resolutionScale; var backgroundBillboard = label._backgroundBillboard; if (defined(backgroundBillboard)) { - x = screenSpacePosition.x + backgroundBillboard._translate.x; - y = screenSpacePosition.y - backgroundBillboard._translate.y; + x = screenSpacePosition.x + (backgroundBillboard._translate.x / resolutionScale); + y = screenSpacePosition.y - (backgroundBillboard._translate.y / resolutionScale); width = backgroundBillboard.width * scale; height = backgroundBillboard.height * scale; @@ -989,8 +991,8 @@ define([ continue; } - var glyphX = screenSpacePosition.x + billboard._translate.x; // TODO: Accomodate resolutionScale in _translate? - var glyphY = screenSpacePosition.y - billboard._translate.y; + var glyphX = screenSpacePosition.x + (billboard._translate.x / resolutionScale); + var glyphY = screenSpacePosition.y - (billboard._translate.y / resolutionScale); var glyphWidth = billboard.width * scale; var glyphHeight = billboard.height * scale; diff --git a/Specs/Scene/BillboardCollectionSpec.js b/Specs/Scene/BillboardCollectionSpec.js index bb0e68eb2a11..dc0c9b432c5a 100644 --- a/Specs/Scene/BillboardCollectionSpec.js +++ b/Specs/Scene/BillboardCollectionSpec.js @@ -1154,14 +1154,14 @@ defineSuite([ var bbox = Billboard.getScreenSpaceBoundingBox(b, Cartesian2.ZERO); expect(bbox.x).toEqual(-halfWidth); - expect(bbox.y).toEqual(0); + expect(bbox.y).toEqual(-height); expect(bbox.width).toEqual(width); expect(bbox.height).toEqual(height); b.verticalOrigin = VerticalOrigin.TOP; bbox = Billboard.getScreenSpaceBoundingBox(b, Cartesian2.ZERO); expect(bbox.x).toEqual(-halfWidth); - expect(bbox.y).toEqual(-height); + expect(bbox.y).toEqual(0); expect(bbox.width).toEqual(width); expect(bbox.height).toEqual(height); }); diff --git a/Specs/Scene/LabelCollectionSpec.js b/Specs/Scene/LabelCollectionSpec.js index 1771ba9dda32..65d20bcba2dd 100644 --- a/Specs/Scene/LabelCollectionSpec.js +++ b/Specs/Scene/LabelCollectionSpec.js @@ -864,8 +864,10 @@ defineSuite([ }); scene.renderForSpecs(); - var width = 0; - var height = 0; + var x = Number.POSITIVE_INFINITY; + var y = Number.POSITIVE_INFINITY; + var maxX = 0; + var maxY = 0; var glyphs = label._glyphs; var length = glyphs.length; @@ -876,16 +878,23 @@ defineSuite([ continue; } - width += billboard.width; - height = Math.max(height, billboard.height); + var glyphWidth = billboard.width * scale; + var glyphHeight = billboard.height * scale; + var glyphX = billboard._translate.x; + var glyphY = -(billboard._translate.y + glyphHeight); + + x = Math.min(x, glyphX); + y = Math.min(y, glyphY); + maxX = Math.max(maxX, glyphX + glyphWidth); + maxY = Math.max(maxY, glyphY + glyphHeight); } - width *= scale; - height *= scale; + var width = maxX - x; + var height = maxY - y; - var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); - expect(bbox.x).toEqual(0); - expect(bbox.y).toEqual(0); + var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, scene); + expect(bbox.x).toEqual(x); + expect(bbox.y).toEqual(y); expect(bbox.width).toEqual(width); expect(bbox.height).toEqual(height); }); @@ -899,8 +908,10 @@ defineSuite([ }); scene.renderForSpecs(); - var width = 0; - var height = 0; + var x = Number.POSITIVE_INFINITY; + var y = Number.POSITIVE_INFINITY; + var maxX = 0; + var maxY = 0; var glyphs = label._glyphs; var length = glyphs.length; @@ -911,23 +922,30 @@ defineSuite([ continue; } - width += billboard.width; - height = Math.max(height, billboard.height); + var glyphWidth = billboard.width * scale; + var glyphHeight = billboard.height * scale; + var glyphX = billboard._translate.x; + var glyphY = -(billboard._translate.y + glyphHeight); + + x = Math.min(x, glyphX); + y = Math.min(y, glyphY); + maxX = Math.max(maxX, glyphX + glyphWidth); + maxY = Math.max(maxY, glyphY + glyphHeight); } - width *= scale; - height *= scale; + var width = maxX - x; + var height = maxY - y; var result = new BoundingRectangle(); - var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, result); - expect(bbox.x).toEqual(0); - expect(bbox.y).toEqual(0); + var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, scene, result); + expect(bbox.x).toEqual(x); + expect(bbox.y).toEqual(y); expect(bbox.width).toEqual(width); expect(bbox.height).toEqual(height); expect(bbox).toBe(result); }); - it('computes screen space bounding box with vertical origin', function() { + it('computes screen space bounding box with vertical origin center', function() { var scale = 1.5; var label = labels.add({ @@ -937,8 +955,10 @@ defineSuite([ }); scene.renderForSpecs(); - var width = 0; - var height = 0; + var x = Number.POSITIVE_INFINITY; + var y = Number.POSITIVE_INFINITY; + var maxX = 0; + var maxY = 0; var glyphs = label._glyphs; var length = glyphs.length; @@ -949,25 +969,113 @@ defineSuite([ continue; } - width += billboard.width; - height = Math.max(height, billboard.height); + var glyphWidth = billboard.width * scale; + var glyphHeight = billboard.height * scale; + var glyphX = billboard._translate.x; + var glyphY = -(billboard._translate.y + glyphHeight * 0.5); + + x = Math.min(x, glyphX); + y = Math.min(y, glyphY); + maxX = Math.max(maxX, glyphX + glyphWidth); + maxY = Math.max(maxY, glyphY + glyphHeight); } - width *= scale; - height *= scale; + var width = maxX - x; + var height = maxY - y; + + var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, scene); + expect(bbox.x).toEqual(x); + expect(bbox.y).toEqual(y); + expect(bbox.width).toEqual(width); + expect(bbox.height).toEqual(height); + }); + + it('computes screen space bounding box with vertical origin top', function() { + var scale = 1.5; + + var label = labels.add({ + text : 'abc', + scale : scale, + verticalOrigin : VerticalOrigin.TOP + }); + scene.renderForSpecs(); + + var x = Number.POSITIVE_INFINITY; + var y = Number.POSITIVE_INFINITY; + var maxX = 0; + var maxY = 0; + + var glyphs = label._glyphs; + var length = glyphs.length; + for (var i = 0; i < length; ++i) { + var glyph = glyphs[i]; + var billboard = glyph.billboard; + if (!defined(billboard)) { + continue; + } + + var glyphWidth = billboard.width * scale; + var glyphHeight = billboard.height * scale; + var glyphX = billboard._translate.x; + var glyphY = -billboard._translate.y; + + x = Math.min(x, glyphX); + y = Math.min(y, glyphY); + maxX = Math.max(maxX, glyphX + glyphWidth); + maxY = Math.max(maxY, glyphY + glyphHeight); + } - var halfHeight = height * 0.5; + var width = maxX - x; + var height = maxY - y; - var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); - expect(bbox.x).toEqual(0); - expect(bbox.y).toEqual(-halfHeight); + var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, scene); + expect(bbox.x).toEqual(x); + expect(bbox.y).toEqual(y); expect(bbox.width).toEqual(width); expect(bbox.height).toEqual(height); + }); - label.verticalOrigin = VerticalOrigin.TOP; - bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); - expect(bbox.x).toEqual(0); - expect(bbox.y).toEqual(-height); + it('computes screen space bounding box with vertical origin baseline', function() { + var scale = 1.5; + + var label = labels.add({ + text : 'abc', + scale : scale, + verticalOrigin : VerticalOrigin.BASELINE + }); + scene.renderForSpecs(); + + var x = Number.POSITIVE_INFINITY; + var y = Number.POSITIVE_INFINITY; + var maxX = 0; + var maxY = 0; + + var glyphs = label._glyphs; + var length = glyphs.length; + for (var i = 0; i < length; ++i) { + var glyph = glyphs[i]; + var billboard = glyph.billboard; + if (!defined(billboard)) { + continue; + } + + var glyphWidth = billboard.width * scale; + var glyphHeight = billboard.height * scale; + var glyphX = billboard._translate.x; + var glyphY = -(billboard._translate.y + glyphHeight); + + x = Math.min(x, glyphX); + y = Math.min(y, glyphY); + maxX = Math.max(maxX, glyphX + glyphWidth); + maxY = Math.max(maxY, glyphY + glyphHeight); + } + + var width = maxX - x; + var height = maxY - y; + + var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, scene); + expect(bbox.x).toEqual(x); + expect(bbox.y).toEqual(y); expect(bbox.width).toEqual(width); expect(bbox.height).toEqual(height); }); @@ -982,8 +1090,10 @@ defineSuite([ }); scene.renderForSpecs(); - var width = 0; - var height = 0; + var x = Number.POSITIVE_INFINITY; + var y = Number.POSITIVE_INFINITY; + var maxX = 0; + var maxY = 0; var glyphs = label._glyphs; var length = glyphs.length; @@ -994,25 +1104,33 @@ defineSuite([ continue; } - width += billboard.width; - height = Math.max(height, billboard.height); + var glyphWidth = billboard.width * scale; + var glyphHeight = billboard.height * scale; + var glyphX = billboard._translate.x; + var glyphY = -(billboard._translate.y + glyphHeight); + + x = Math.min(x, glyphX); + y = Math.min(y, glyphY); + maxX = Math.max(maxX, glyphX + glyphWidth); + maxY = Math.max(maxY, glyphY + glyphHeight); } - width *= scale; - height *= scale; + var width = maxX - x; + var height = maxY - y; var halfWidth = width * 0.5; - var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); + var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, scene); expect(bbox.x).toEqual(-halfWidth); - expect(bbox.y).toEqual(0); + expect(bbox.y).toEqual(y); expect(bbox.width).toEqual(width); expect(bbox.height).toEqual(height); label.horizontalOrigin = HorizontalOrigin.RIGHT; - bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); + scene.renderForSpecs(); + bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, scene); expect(bbox.x).toEqual(-width); - expect(bbox.y).toEqual(0); + expect(bbox.y).toEqual(y); expect(bbox.width).toEqual(width); expect(bbox.height).toEqual(height); }); From a48848b3579c72bf51d1f3fd9c36ef2a5604ecc2 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Fri, 2 Dec 2016 17:16:04 -0500 Subject: [PATCH 095/396] Scene parameter not needed, can get resolutionScale from collection. --- Source/DataSources/EntityCluster.js | 2 +- Source/Scene/Label.js | 5 ++--- Specs/Scene/LabelCollectionSpec.js | 14 +++++++------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Source/DataSources/EntityCluster.js b/Source/DataSources/EntityCluster.js index 5facb35096a5..b926038278a5 100644 --- a/Source/DataSources/EntityCluster.js +++ b/Source/DataSources/EntityCluster.js @@ -106,7 +106,7 @@ define([ function getBoundingBox(item, coord, pixelRange, entityCluster, result) { if (defined(item._labelCollection) && entityCluster._clusterLabels) { - result = Label.getScreenSpaceBoundingBox(item, coord, entityCluster._scene, result); + result = Label.getScreenSpaceBoundingBox(item, coord, result); } else if (defined(item._billboardCollection) && entityCluster._clusterBillboards) { result = Billboard.getScreenSpaceBoundingBox(item, coord, result); } else if (defined(item._pointPrimitiveCollection) && entityCluster._clusterPoints) { diff --git a/Source/Scene/Label.js b/Source/Scene/Label.js index 3e5f2e64be92..b50ffaf36029 100644 --- a/Source/Scene/Label.js +++ b/Source/Scene/Label.js @@ -951,19 +951,18 @@ define([ * Gets a label's screen space bounding box centered around screenSpacePosition. * @param {Label} label The label to get the screen space bounding box for. * @param {Cartesian2} screenSpacePosition The screen space center of the label. - * @param {Scene} scene The scene the label is in. * @param {BoundingRectangle} [result] The object onto which to store the result. * @returns {BoundingRectangle} The screen space bounding box. * * @private */ - Label.getScreenSpaceBoundingBox = function(label, screenSpacePosition, scene, result) { + Label.getScreenSpaceBoundingBox = function(label, screenSpacePosition, result) { var x = 0; var y = 0; var width = 0; var height = 0; var scale = label.scale; - var resolutionScale = scene.context.uniformState.resolutionScale; + var resolutionScale = label._labelCollection._resolutionScale; var backgroundBillboard = label._backgroundBillboard; if (defined(backgroundBillboard)) { diff --git a/Specs/Scene/LabelCollectionSpec.js b/Specs/Scene/LabelCollectionSpec.js index 65d20bcba2dd..d36ab7eb1db3 100644 --- a/Specs/Scene/LabelCollectionSpec.js +++ b/Specs/Scene/LabelCollectionSpec.js @@ -892,7 +892,7 @@ defineSuite([ var width = maxX - x; var height = maxY - y; - var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, scene); + var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); expect(bbox.x).toEqual(x); expect(bbox.y).toEqual(y); expect(bbox.width).toEqual(width); @@ -937,7 +937,7 @@ defineSuite([ var height = maxY - y; var result = new BoundingRectangle(); - var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, scene, result); + var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, result); expect(bbox.x).toEqual(x); expect(bbox.y).toEqual(y); expect(bbox.width).toEqual(width); @@ -983,7 +983,7 @@ defineSuite([ var width = maxX - x; var height = maxY - y; - var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, scene); + var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); expect(bbox.x).toEqual(x); expect(bbox.y).toEqual(y); expect(bbox.width).toEqual(width); @@ -1028,7 +1028,7 @@ defineSuite([ var width = maxX - x; var height = maxY - y; - var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, scene); + var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); expect(bbox.x).toEqual(x); expect(bbox.y).toEqual(y); expect(bbox.width).toEqual(width); @@ -1073,7 +1073,7 @@ defineSuite([ var width = maxX - x; var height = maxY - y; - var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, scene); + var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); expect(bbox.x).toEqual(x); expect(bbox.y).toEqual(y); expect(bbox.width).toEqual(width); @@ -1120,7 +1120,7 @@ defineSuite([ var halfWidth = width * 0.5; - var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, scene); + var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); expect(bbox.x).toEqual(-halfWidth); expect(bbox.y).toEqual(y); expect(bbox.width).toEqual(width); @@ -1128,7 +1128,7 @@ defineSuite([ label.horizontalOrigin = HorizontalOrigin.RIGHT; scene.renderForSpecs(); - bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, scene); + bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); expect(bbox.x).toEqual(-width); expect(bbox.y).toEqual(y); expect(bbox.width).toEqual(width); From c21d922055920b22839de9dcf63296754f71e497 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Fri, 2 Dec 2016 20:45:01 -0500 Subject: [PATCH 096/396] Add tests. --- Specs/Scene/LabelCollectionSpec.js | 138 ++++++++++++++++++++++++++++- 1 file changed, 135 insertions(+), 3 deletions(-) diff --git a/Specs/Scene/LabelCollectionSpec.js b/Specs/Scene/LabelCollectionSpec.js index d36ab7eb1db3..61b1470ab822 100644 --- a/Specs/Scene/LabelCollectionSpec.js +++ b/Specs/Scene/LabelCollectionSpec.js @@ -82,6 +82,9 @@ defineSuite([ expect(label.fillColor).toEqual(Color.WHITE); expect(label.outlineColor).toEqual(Color.BLACK); expect(label.outlineWidth).toEqual(1); + expect(label.showBackground).toEqual(false); + expect(label.backgroundColor).toEqual(new Color(0.165, 0.165, 0.165, 0.8)); + expect(label.backgroundPadding).toEqual(new Cartesian2(2, 2)); expect(label.style).toEqual(LabelStyle.FILL); expect(label.pixelOffset).toEqual(Cartesian2.ZERO); expect(label.eyeOffset).toEqual(Cartesian3.ZERO); @@ -120,6 +123,9 @@ defineSuite([ var horizontalOrigin = HorizontalOrigin.LEFT; var verticalOrigin = VerticalOrigin.BOTTOM; var scale = 2.0; + var showBackground = true; + var backgroundColor = Color.BLUE; + var backgroundPadding = new Cartesian2(11, 12); var translucency = new NearFarScalar(1.0e4, 1.0, 1.0e6, 0.0); var pixelOffsetScale = new NearFarScalar(1.0e4, 1.0, 1.0e6, 0.0); var distanceDisplayCondition = new DistanceDisplayCondition(10.0, 100.0); @@ -132,6 +138,9 @@ defineSuite([ outlineColor : outlineColor, outlineWidth : outlineWidth, style : style, + showBackground : showBackground, + backgroundColor : backgroundColor, + backgroundPadding : backgroundPadding, pixelOffset : pixelOffset, eyeOffset : eyeOffset, horizontalOrigin : horizontalOrigin, @@ -151,6 +160,9 @@ defineSuite([ expect(label.outlineColor).toEqual(outlineColor); expect(label.outlineWidth).toEqual(outlineWidth); expect(label.style).toEqual(style); + expect(label.showBackground).toEqual(showBackground); + expect(label.backgroundColor).toEqual(backgroundColor); + expect(label.backgroundPadding).toEqual(backgroundPadding); expect(label.pixelOffset).toEqual(pixelOffset); expect(label.eyeOffset).toEqual(eyeOffset); expect(label.horizontalOrigin).toEqual(horizontalOrigin); @@ -430,6 +442,22 @@ defineSuite([ expect(scene.renderForSpecs()[0]).toBeGreaterThan(10); }); + it('can render a label background', function() { + var label = labels.add({ + position : Cartesian3.ZERO, + text : '_', + horizontalOrigin : HorizontalOrigin.CENTER, + verticalOrigin : VerticalOrigin.CENTER, + showBackground : true, + backgroundColor : Color.BLUE + }); + + expect(scene.renderForSpecs()).toEqual([0, 0, 255, 255]); + + labels.remove(label); + expect(scene.renderForSpecs()).toEqual([0, 0, 0, 255]); + }); + it('does not render labels with show set to false', function() { var label = labels.add({ position : Cartesian3.ZERO, @@ -447,6 +475,25 @@ defineSuite([ expect(scene.renderForSpecs()[0]).toBeGreaterThan(10); }); + it('does not render label background with show set to false', function() { + var label = labels.add({ + position : Cartesian3.ZERO, + text : '_', + horizontalOrigin : HorizontalOrigin.CENTER, + verticalOrigin : VerticalOrigin.CENTER, + showBackground : true, + backgroundColor : Color.BLUE + }); + + expect(scene.renderForSpecs()).toEqual([0, 0, 255, 255]); + + label.show = false; + expect(scene.renderForSpecs()).toEqual([0, 0, 0, 255]); + + label.show = true; + expect(scene.renderForSpecs()).toEqual([0, 0, 255, 255]); + }); + it('does not render labels that are behind the viewer', function() { var label = labels.add({ position : new Cartesian3(20.0, 0.0, 0.0), // Behind camera @@ -719,14 +766,37 @@ defineSuite([ }); scene.renderForSpecs(); expect(labels._billboardCollection.length).toEqual(3); + expect(labels._spareBillboards.length).toEqual(0); label.text = 'a'; scene.renderForSpecs(); expect(labels._billboardCollection.length).toEqual(3); + expect(labels._spareBillboards.length).toEqual(2); label.text = 'def'; scene.renderForSpecs(); expect(labels._billboardCollection.length).toEqual(3); + expect(labels._spareBillboards.length).toEqual(0); + }); + + it('should reuse background billboards that are not needed any more', function() { + var label = labels.add({ + text : 'abc', + showBackground : true + }); + scene.renderForSpecs(); + expect(labels._backgroundBillboardCollection.length).toEqual(1); + expect(labels._spareBackgroundBillboards.length).toEqual(0); + + label.showBackground = false; + scene.renderForSpecs(); + expect(labels._backgroundBillboardCollection.length).toEqual(1); + expect(labels._spareBackgroundBillboards.length).toEqual(1); + + label.showBackground = true; + scene.renderForSpecs(); + expect(labels._backgroundBillboardCollection.length).toEqual(1); + expect(labels._spareBackgroundBillboards.length).toEqual(0); }); describe('Label', function() { @@ -1135,6 +1205,40 @@ defineSuite([ expect(bbox.height).toEqual(height); }); + it('computes screen space bounding box with padded background', function() { + var scale = 1.5; + + var label = labels.add({ + text : 'abc', + scale : scale, + showBackground : true, + backgroundPadding : new Cartesian2(15, 10) + }); + scene.renderForSpecs(); + + var backgroundBillboard = label._backgroundBillboard; + var width = backgroundBillboard.width * scale; + var height = backgroundBillboard.height * scale; + var x = backgroundBillboard._translate.x; + var y = -(backgroundBillboard._translate.y + height); + + var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); + expect(bbox.x).toEqual(x); + expect(bbox.y).toEqual(y); + expect(bbox.width).toEqual(width); + expect(bbox.height).toEqual(height); + + label.verticalOrigin = VerticalOrigin.CENTER; + scene.renderForSpecs(); + y = -(backgroundBillboard._translate.y + height * 0.5); + + bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); + expect(bbox.x).toEqual(x); + expect(bbox.y).toEqual(y); + expect(bbox.width).toEqual(width); + expect(bbox.height).toEqual(height); + }); + it('can equal another label', function() { var label = labels.add({ position : new Cartesian3(1.0, 2.0, 3.0), @@ -1213,7 +1317,7 @@ defineSuite([ var eyeOffset1 = new Cartesian3(6.0, 7.0, 8.0); var eyeOffset2 = new Cartesian3(16.0, 17.0, 18.0); var verticalOrigin1 = VerticalOrigin.TOP; - var verticalOrigin2 = VerticalOrigin.BOTTOM; + var verticalOrigin2 = VerticalOrigin.BASELINE; var scale1 = 2.0; var scale2 = 3.0; var id1 = 'id1'; @@ -1232,7 +1336,8 @@ defineSuite([ scale : scale1, id : id1, translucencyByDistance : translucency1, - pixelOffsetScaleByDistance : pixelOffsetScale1 + pixelOffsetScaleByDistance : pixelOffsetScale1, + showBackground : true }); scene.renderForSpecs(); @@ -1279,7 +1384,8 @@ defineSuite([ scale : 2.0, id : 'id1', translucencyByDistance : new NearFarScalar(1.0e4, 1.0, 1.0e6, 0.0), - pixelOffsetScaleByDistance : new NearFarScalar(1.0e4, 1.0, 1.0e6, 0.0) + pixelOffsetScaleByDistance : new NearFarScalar(1.0e4, 1.0, 1.0e6, 0.0), + showBackground : true }); scene.renderForSpecs(); }); @@ -1347,6 +1453,26 @@ defineSuite([ }); }); + it('showBackground', function() { + expect(label.showBackground).toEqual(true); + label.showBackground = false; + expect(label.showBackground).toEqual(false); + }); + + it('backgroundColor', function() { + var newValue = Color.RED; + expect(label.backgroundColor).not.toEqual(newValue); + label.backgroundColor = newValue; + expect(label.backgroundColor).toEqual(newValue); + }); + + it('backgroundPadding', function() { + var newValue = new Cartesian2(8, 5); + expect(label.backgroundPadding).not.toEqual(newValue); + label.backgroundPadding = newValue; + expect(label.backgroundPadding).toEqual(newValue); + }); + it('id', function() { var newValue = 'id2'; expect(label.id).not.toEqual(newValue); @@ -1401,6 +1527,12 @@ defineSuite([ expect(billboard.pixelOffsetScaleByDistance).toEqual(label.pixelOffsetScaleByDistance); }); }); + + it('clusterShow', function() { + expect(label.clusterShow).toEqual(true); + label.clusterShow = false; + expect(label.clusterShow).toEqual(false); + }); }); it('should set vertexTranslate of billboards correctly when vertical origin is changed', function() { From 981138fecd942b61f340133ace8d25a5f9a8fb33 Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Sat, 3 Dec 2016 12:02:58 -0500 Subject: [PATCH 097/396] Documentation update --- Source/Scene/HorizontalOrigin.js | 8 +++++--- Source/Scene/Label.js | 6 +++--- Source/Scene/VerticalOrigin.js | 10 ++++++---- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Source/Scene/HorizontalOrigin.js b/Source/Scene/HorizontalOrigin.js index 17199472a51d..805c1db223b2 100644 --- a/Source/Scene/HorizontalOrigin.js +++ b/Source/Scene/HorizontalOrigin.js @@ -6,13 +6,15 @@ define([ 'use strict'; /** - * The horizontal location of an origin relative to an object, e.g., a {@link Billboard}. - * For example, the horizontal origin is used to display a billboard to the left or right (in - * screen space) of the actual position. + * The horizontal location of an origin relative to an object, e.g., a {@link Billboard} + * or {@link Label}. For example, setting the horizontal origin to LEFT + * or RIGHT will display a billboard to the left or right (in screen space) + * of the anchor position. * * @exports HorizontalOrigin * * @see Billboard#horizontalOrigin + * @see Label#horizontalOrigin */ var HorizontalOrigin = { /** diff --git a/Source/Scene/Label.js b/Source/Scene/Label.js index b50ffaf36029..e2bf4f2d4fa1 100644 --- a/Source/Scene/Label.js +++ b/Source/Scene/Label.js @@ -376,7 +376,7 @@ define([ }, /** - * Gets or sets the background color of this label. TRANSPARENT means no background will be used. + * Gets or sets the background color of this label. * @memberof Label.prototype * @type {Color} */ @@ -404,8 +404,8 @@ define([ }, /** - * Gets or sets the background padding, in pixels, of this label. The x value - * controls horizontal padding, and the y value controls vertical padding. + * Gets or sets the background padding, in pixels, of this label. The x value + * controls horizontal padding, and the y value controls vertical padding. * @memberof Label.prototype * @type {Cartesian2} */ diff --git a/Source/Scene/VerticalOrigin.js b/Source/Scene/VerticalOrigin.js index b810ddc85c66..3d6022c6d2d3 100644 --- a/Source/Scene/VerticalOrigin.js +++ b/Source/Scene/VerticalOrigin.js @@ -6,17 +6,19 @@ define([ 'use strict'; /** - * The vertical location of an origin relative to an object, e.g., a {@link Billboard}. - * For example, the vertical origin is used to display a billboard above or below (in - * screen space) of the actual position. + * The vertical location of an origin relative to an object, e.g., a {@link Billboard} + * or {@link Label}. For example, setting the vertical origin to TOP + * or BOTTOM will display a billboard above or below (in screen space) + * of the anchor position. * * @exports VerticalOrigin * * @see Billboard#verticalOrigin + * @see Label#verticalOrigin */ var VerticalOrigin = { /** - * The origin is at the vertical center of the object. + * The origin is at the vertical center between BASELINE and TOP. * * @type {Number} * @constant From ac8e0d21ea4dc381823bf704a58e9626f29202bb Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Sat, 3 Dec 2016 21:24:55 -0500 Subject: [PATCH 098/396] More doc updates, change default label primitive origin to BASELINE. --- .../Images/Billboard.setVerticalOrigin.png | Bin 107923 -> 81239 bytes Source/Scene/Billboard.js | 7 ++++--- Source/Scene/BillboardCollection.js | 13 ++++++++++++- Source/Scene/HorizontalOrigin.js | 4 ++++ Source/Scene/Label.js | 8 ++++---- Source/Scene/LabelCollection.js | 9 ++++++--- Source/Scene/VerticalOrigin.js | 6 +++++- Specs/Scene/LabelCollectionSpec.js | 2 +- 8 files changed, 36 insertions(+), 13 deletions(-) diff --git a/Documentation/Images/Billboard.setVerticalOrigin.png b/Documentation/Images/Billboard.setVerticalOrigin.png index a08e5f8854fc0eba1a03c9286322ee5aab266634..2b49bc06e0f65d2632550b60403457201a7c0af3 100644 GIT binary patch literal 81239 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 LNkvXXu0mjf*tV5> diff --git a/Source/Scene/Billboard.js b/Source/Scene/Billboard.js index 5b50dfe4c7e6..f50cd4eca1ca 100644 --- a/Source/Scene/Billboard.js +++ b/Source/Scene/Billboard.js @@ -194,6 +194,7 @@ define([ * of removing it and re-adding it to the collection. * @memberof Billboard.prototype * @type {Boolean} + * @default true */ show : { get : function() { @@ -468,7 +469,7 @@ define([ /** * Gets or sets the horizontal origin of this billboard, which determines if the billboard is - * to the left, center, or right of its position. + * to the left, center, or right of its anchor position. *

    *