cesium 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE.md +259 -0
- data/README.rdoc +90 -0
- data/Rakefile +40 -0
- data/app/assets/javascripts/Assets/Assets.profile.js +8 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
- data/app/assets/javascripts/Assets/Textures/NE2_LR_LC_SR_W_DR_2048.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/waterNormals.jpg +0 -0
- data/app/assets/javascripts/Assets/package.json +6 -0
- data/app/assets/javascripts/Cesium.js +320 -0
- data/app/assets/javascripts/Core/AnimationController.js +148 -0
- data/app/assets/javascripts/Core/AxisAlignedBoundingBox.js +243 -0
- data/app/assets/javascripts/Core/BoundingRectangle.js +364 -0
- data/app/assets/javascripts/Core/BoundingSphere.js +819 -0
- data/app/assets/javascripts/Core/BoxTessellator.js +93 -0
- data/app/assets/javascripts/Core/Cartesian2.js +762 -0
- data/app/assets/javascripts/Core/Cartesian3.js +861 -0
- data/app/assets/javascripts/Core/Cartesian4.js +762 -0
- data/app/assets/javascripts/Core/Cartographic.js +211 -0
- data/app/assets/javascripts/Core/CatmullRomSpline.js +232 -0
- data/app/assets/javascripts/Core/Clock.js +195 -0
- data/app/assets/javascripts/Core/ClockRange.js +37 -0
- data/app/assets/javascripts/Core/ClockStep.js +32 -0
- data/app/assets/javascripts/Core/Color.js +1629 -0
- data/app/assets/javascripts/Core/ComponentDatatype.js +119 -0
- data/app/assets/javascripts/Core/Core.profile.js +8 -0
- data/app/assets/javascripts/Core/CubeMapEllipsoidTessellator.js +198 -0
- data/app/assets/javascripts/Core/CubicRealPolynomial.js +251 -0
- data/app/assets/javascripts/Core/DefaultProxy.js +30 -0
- data/app/assets/javascripts/Core/DeveloperError.js +60 -0
- data/app/assets/javascripts/Core/EarthOrientationParameters.js +383 -0
- data/app/assets/javascripts/Core/EarthOrientationParametersSample.js +50 -0
- data/app/assets/javascripts/Core/Ellipsoid.js +539 -0
- data/app/assets/javascripts/Core/EllipsoidTangentPlane.js +207 -0
- data/app/assets/javascripts/Core/EllipsoidalOccluder.js +151 -0
- data/app/assets/javascripts/Core/EncodedCartesian3.js +197 -0
- data/app/assets/javascripts/Core/Enumeration.js +67 -0
- data/app/assets/javascripts/Core/Event.js +122 -0
- data/app/assets/javascripts/Core/Extent.js +383 -0
- data/app/assets/javascripts/Core/ExtentTessellator.js +384 -0
- data/app/assets/javascripts/Core/FAR.js +13 -0
- data/app/assets/javascripts/Core/FeatureDetection.js +126 -0
- data/app/assets/javascripts/Core/Fullscreen.js +235 -0
- data/app/assets/javascripts/Core/GeographicProjection.js +107 -0
- data/app/assets/javascripts/Core/HermitePolynomialApproximation.js +176 -0
- data/app/assets/javascripts/Core/HermiteSpline.js +234 -0
- data/app/assets/javascripts/Core/Iau2006XysData.js +259 -0
- data/app/assets/javascripts/Core/Iau2006XysSample.js +36 -0
- data/app/assets/javascripts/Core/IndexDatatype.js +28 -0
- data/app/assets/javascripts/Core/Intersect.js +40 -0
- data/app/assets/javascripts/Core/IntersectionTests.js +359 -0
- data/app/assets/javascripts/Core/Interval.js +27 -0
- data/app/assets/javascripts/Core/Iso8601.js +46 -0
- data/app/assets/javascripts/Core/JulianDate.js +1228 -0
- data/app/assets/javascripts/Core/KeyboardEventModifier.js +38 -0
- data/app/assets/javascripts/Core/LagrangePolynomialApproximation.js +96 -0
- data/app/assets/javascripts/Core/LeapSecond.js +158 -0
- data/app/assets/javascripts/Core/LinearApproximation.js +98 -0
- data/app/assets/javascripts/Core/Math.js +532 -0
- data/app/assets/javascripts/Core/Matrix2.js +833 -0
- data/app/assets/javascripts/Core/Matrix3.js +1099 -0
- data/app/assets/javascripts/Core/Matrix4.js +2164 -0
- data/app/assets/javascripts/Core/MeshFilters.js +568 -0
- data/app/assets/javascripts/Core/Occluder.js +474 -0
- data/app/assets/javascripts/Core/OrientationInterpolator.js +109 -0
- data/app/assets/javascripts/Core/PlaneTessellator.js +74 -0
- data/app/assets/javascripts/Core/PolygonPipeline.js +792 -0
- data/app/assets/javascripts/Core/PolylinePipeline.js +90 -0
- data/app/assets/javascripts/Core/PrimitiveType.js +80 -0
- data/app/assets/javascripts/Core/QuadraticRealPolynomial.js +146 -0
- data/app/assets/javascripts/Core/QuarticRealPolynomial.js +339 -0
- data/app/assets/javascripts/Core/Quaternion.js +947 -0
- data/app/assets/javascripts/Core/Queue.js +95 -0
- data/app/assets/javascripts/Core/Ray.js +64 -0
- data/app/assets/javascripts/Core/ReferenceFrame.js +25 -0
- data/app/assets/javascripts/Core/RequestErrorEvent.js +35 -0
- data/app/assets/javascripts/Core/RuntimeError.js +59 -0
- data/app/assets/javascripts/Core/ScreenSpaceEventHandler.js +658 -0
- data/app/assets/javascripts/Core/ScreenSpaceEventType.js +149 -0
- data/app/assets/javascripts/Core/Shapes.js +230 -0
- data/app/assets/javascripts/Core/Spherical.js +192 -0
- data/app/assets/javascripts/Core/TaskProcessor.js +131 -0
- data/app/assets/javascripts/Core/TimeConstants.js +85 -0
- data/app/assets/javascripts/Core/TimeInterval.js +305 -0
- data/app/assets/javascripts/Core/TimeIntervalCollection.js +543 -0
- data/app/assets/javascripts/Core/TimeStandard.js +31 -0
- data/app/assets/javascripts/Core/Tipsify.js +285 -0
- data/app/assets/javascripts/Core/Transforms.js +614 -0
- data/app/assets/javascripts/Core/TridiagonalSystemSolver.js +102 -0
- data/app/assets/javascripts/Core/Visibility.js +38 -0
- data/app/assets/javascripts/Core/WebMercatorProjection.js +154 -0
- data/app/assets/javascripts/Core/WindingOrder.js +40 -0
- data/app/assets/javascripts/Core/binarySearch.js +69 -0
- data/app/assets/javascripts/Core/buildModuleUrl.js +77 -0
- data/app/assets/javascripts/Core/clone.js +21 -0
- data/app/assets/javascripts/Core/combine.js +81 -0
- data/app/assets/javascripts/Core/computeSunPosition.js +116 -0
- data/app/assets/javascripts/Core/createGuid.js +25 -0
- data/app/assets/javascripts/Core/defaultValue.js +22 -0
- data/app/assets/javascripts/Core/destroyObject.js +61 -0
- data/app/assets/javascripts/Core/freezeObject.js +20 -0
- data/app/assets/javascripts/Core/getImagePixels.js +46 -0
- data/app/assets/javascripts/Core/isLeapYear.js +30 -0
- data/app/assets/javascripts/Core/jsonp.js +116 -0
- data/app/assets/javascripts/Core/loadArrayBuffer.js +76 -0
- data/app/assets/javascripts/Core/loadImage.js +85 -0
- data/app/assets/javascripts/Core/loadJson.js +54 -0
- data/app/assets/javascripts/Core/loadText.js +78 -0
- data/app/assets/javascripts/Core/loadXML.js +76 -0
- data/app/assets/javascripts/Core/package.json +6 -0
- data/app/assets/javascripts/Core/pointInsideTriangle2D.js +41 -0
- data/app/assets/javascripts/Core/requestAnimationFrame.js +61 -0
- data/app/assets/javascripts/Core/throttleRequestByServer.js +74 -0
- data/app/assets/javascripts/Core/writeTextToCanvas.js +92 -0
- data/app/assets/javascripts/DynamicScene/CompositeDynamicObjectCollection.js +254 -0
- data/app/assets/javascripts/DynamicScene/CzmlBoolean.js +57 -0
- data/app/assets/javascripts/DynamicScene/CzmlCartesian2.js +96 -0
- data/app/assets/javascripts/DynamicScene/CzmlCartesian3.js +99 -0
- data/app/assets/javascripts/DynamicScene/CzmlCartographic.js +125 -0
- data/app/assets/javascripts/DynamicScene/CzmlColor.js +127 -0
- data/app/assets/javascripts/DynamicScene/CzmlDefaults.js +135 -0
- data/app/assets/javascripts/DynamicScene/CzmlHorizontalOrigin.js +59 -0
- data/app/assets/javascripts/DynamicScene/CzmlImage.js +61 -0
- data/app/assets/javascripts/DynamicScene/CzmlLabelStyle.js +59 -0
- data/app/assets/javascripts/DynamicScene/CzmlNumber.js +82 -0
- data/app/assets/javascripts/DynamicScene/CzmlString.js +56 -0
- data/app/assets/javascripts/DynamicScene/CzmlUnitCartesian3.js +99 -0
- data/app/assets/javascripts/DynamicScene/CzmlUnitQuaternion.js +172 -0
- data/app/assets/javascripts/DynamicScene/CzmlUnitSpherical.js +98 -0
- data/app/assets/javascripts/DynamicScene/CzmlVerticalOrigin.js +59 -0
- data/app/assets/javascripts/DynamicScene/DynamicBillboard.js +245 -0
- data/app/assets/javascripts/DynamicScene/DynamicBillboardVisualizer.js +347 -0
- data/app/assets/javascripts/DynamicScene/DynamicColorMaterial.js +78 -0
- data/app/assets/javascripts/DynamicScene/DynamicCone.js +291 -0
- data/app/assets/javascripts/DynamicScene/DynamicConeVisualizer.js +350 -0
- data/app/assets/javascripts/DynamicScene/DynamicConeVisualizerUsingCustomSensor.js +389 -0
- data/app/assets/javascripts/DynamicScene/DynamicDirectionsProperty.js +163 -0
- data/app/assets/javascripts/DynamicScene/DynamicEllipsoid.js +158 -0
- data/app/assets/javascripts/DynamicScene/DynamicEllipsoidVisualizer.js +277 -0
- data/app/assets/javascripts/DynamicScene/DynamicImageMaterial.js +136 -0
- data/app/assets/javascripts/DynamicScene/DynamicLabel.js +286 -0
- data/app/assets/javascripts/DynamicScene/DynamicLabelVisualizer.js +341 -0
- data/app/assets/javascripts/DynamicScene/DynamicMaterialProperty.js +125 -0
- data/app/assets/javascripts/DynamicScene/DynamicObject.js +364 -0
- data/app/assets/javascripts/DynamicScene/DynamicObjectCollection.js +137 -0
- data/app/assets/javascripts/DynamicScene/DynamicObjectView.js +299 -0
- data/app/assets/javascripts/DynamicScene/DynamicPath.js +214 -0
- data/app/assets/javascripts/DynamicScene/DynamicPathVisualizer.js +402 -0
- data/app/assets/javascripts/DynamicScene/DynamicPoint.js +184 -0
- data/app/assets/javascripts/DynamicScene/DynamicPointVisualizer.js +323 -0
- data/app/assets/javascripts/DynamicScene/DynamicPolygon.js +138 -0
- data/app/assets/javascripts/DynamicScene/DynamicPolygonVisualizer.js +251 -0
- data/app/assets/javascripts/DynamicScene/DynamicPolyline.js +183 -0
- data/app/assets/javascripts/DynamicScene/DynamicPolylineVisualizer.js +268 -0
- data/app/assets/javascripts/DynamicScene/DynamicPositionProperty.js +525 -0
- data/app/assets/javascripts/DynamicScene/DynamicProperty.js +352 -0
- data/app/assets/javascripts/DynamicScene/DynamicPyramid.js +204 -0
- data/app/assets/javascripts/DynamicScene/DynamicPyramidVisualizer.js +302 -0
- data/app/assets/javascripts/DynamicScene/DynamicScene.profile.js +8 -0
- data/app/assets/javascripts/DynamicScene/DynamicVertexPositionsProperty.js +199 -0
- data/app/assets/javascripts/DynamicScene/ReferenceProperty.js +155 -0
- data/app/assets/javascripts/DynamicScene/VisualizerCollection.js +181 -0
- data/app/assets/javascripts/DynamicScene/package.json +6 -0
- data/app/assets/javascripts/DynamicScene/processCzml.js +77 -0
- data/app/assets/javascripts/Renderer/BlendEquation.js +52 -0
- data/app/assets/javascripts/Renderer/BlendFunction.js +158 -0
- data/app/assets/javascripts/Renderer/BlendingState.js +64 -0
- data/app/assets/javascripts/Renderer/Buffer.js +141 -0
- data/app/assets/javascripts/Renderer/BufferUsage.js +48 -0
- data/app/assets/javascripts/Renderer/ClearCommand.js +40 -0
- data/app/assets/javascripts/Renderer/CommandLists.js +42 -0
- data/app/assets/javascripts/Renderer/Context.js +2805 -0
- data/app/assets/javascripts/Renderer/CubeMap.js +358 -0
- data/app/assets/javascripts/Renderer/CubeMapFace.js +202 -0
- data/app/assets/javascripts/Renderer/CullFace.js +50 -0
- data/app/assets/javascripts/Renderer/DepthFunction.js +95 -0
- data/app/assets/javascripts/Renderer/DrawCommand.js +96 -0
- data/app/assets/javascripts/Renderer/Framebuffer.js +435 -0
- data/app/assets/javascripts/Renderer/MipmapHint.js +50 -0
- data/app/assets/javascripts/Renderer/PickFramebuffer.js +178 -0
- data/app/assets/javascripts/Renderer/PixelDatatype.js +86 -0
- data/app/assets/javascripts/Renderer/PixelFormat.js +113 -0
- data/app/assets/javascripts/Renderer/Renderbuffer.js +102 -0
- data/app/assets/javascripts/Renderer/RenderbufferFormat.js +77 -0
- data/app/assets/javascripts/Renderer/Renderer.profile.js +8 -0
- data/app/assets/javascripts/Renderer/ShaderCache.js +121 -0
- data/app/assets/javascripts/Renderer/ShaderProgram.js +2402 -0
- data/app/assets/javascripts/Renderer/StencilFunction.js +95 -0
- data/app/assets/javascripts/Renderer/StencilOperation.js +95 -0
- data/app/assets/javascripts/Renderer/Texture.js +395 -0
- data/app/assets/javascripts/Renderer/TextureAtlas.js +472 -0
- data/app/assets/javascripts/Renderer/TextureAtlasBuilder.js +133 -0
- data/app/assets/javascripts/Renderer/TextureMagnificationFilter.js +41 -0
- data/app/assets/javascripts/Renderer/TextureMinificationFilter.js +77 -0
- data/app/assets/javascripts/Renderer/TextureWrap.js +50 -0
- data/app/assets/javascripts/Renderer/UniformDatatype.js +218 -0
- data/app/assets/javascripts/Renderer/UniformState.js +799 -0
- data/app/assets/javascripts/Renderer/VertexArray.js +365 -0
- data/app/assets/javascripts/Renderer/VertexArrayFacade.js +574 -0
- data/app/assets/javascripts/Renderer/VertexLayout.js +49 -0
- data/app/assets/javascripts/Renderer/loadCubeMap.js +92 -0
- data/app/assets/javascripts/Renderer/package.json +6 -0
- data/app/assets/javascripts/Scene/AnimationCollection.js +249 -0
- data/app/assets/javascripts/Scene/ArcGisMapServerImageryProvider.js +384 -0
- data/app/assets/javascripts/Scene/Billboard.js +680 -0
- data/app/assets/javascripts/Scene/BillboardCollection.js +1209 -0
- data/app/assets/javascripts/Scene/BingMapsImageryProvider.js +460 -0
- data/app/assets/javascripts/Scene/BingMapsStyle.js +55 -0
- data/app/assets/javascripts/Scene/Camera.js +358 -0
- data/app/assets/javascripts/Scene/CameraColumbusViewMode.js +30 -0
- data/app/assets/javascripts/Scene/CameraController.js +1258 -0
- data/app/assets/javascripts/Scene/CameraEventAggregator.js +270 -0
- data/app/assets/javascripts/Scene/CameraEventType.js +53 -0
- data/app/assets/javascripts/Scene/CameraFlightPath.js +495 -0
- data/app/assets/javascripts/Scene/CentralBody.js +817 -0
- data/app/assets/javascripts/Scene/CentralBodySurface.js +1120 -0
- data/app/assets/javascripts/Scene/CentralBodySurfaceShaderSet.js +107 -0
- data/app/assets/javascripts/Scene/ComplexConicSensorVolume.js +511 -0
- data/app/assets/javascripts/Scene/CompositePrimitive.js +454 -0
- data/app/assets/javascripts/Scene/CullingVolume.js +59 -0
- data/app/assets/javascripts/Scene/CustomSensorVolume.js +440 -0
- data/app/assets/javascripts/Scene/DiscardMissingTileImagePolicy.js +134 -0
- data/app/assets/javascripts/Scene/EllipsoidPrimitive.js +412 -0
- data/app/assets/javascripts/Scene/EllipsoidTerrainProvider.js +182 -0
- data/app/assets/javascripts/Scene/FrameState.js +86 -0
- data/app/assets/javascripts/Scene/FrustumCommands.js +32 -0
- data/app/assets/javascripts/Scene/GeographicTilingScheme.js +265 -0
- data/app/assets/javascripts/Scene/HorizontalOrigin.js +39 -0
- data/app/assets/javascripts/Scene/Imagery.js +85 -0
- data/app/assets/javascripts/Scene/ImageryLayer.js +876 -0
- data/app/assets/javascripts/Scene/ImageryLayerCollection.js +403 -0
- data/app/assets/javascripts/Scene/ImageryProvider.js +185 -0
- data/app/assets/javascripts/Scene/ImageryProviderError.js +149 -0
- data/app/assets/javascripts/Scene/ImageryState.js +20 -0
- data/app/assets/javascripts/Scene/Label.js +706 -0
- data/app/assets/javascripts/Scene/LabelCollection.js +697 -0
- data/app/assets/javascripts/Scene/LabelStyle.js +39 -0
- data/app/assets/javascripts/Scene/Material.js +1177 -0
- data/app/assets/javascripts/Scene/NeverTileDiscardPolicy.js +38 -0
- data/app/assets/javascripts/Scene/OpenStreetMapImageryProvider.js +282 -0
- data/app/assets/javascripts/Scene/OrthographicFrustum.js +345 -0
- data/app/assets/javascripts/Scene/PerformanceDisplay.js +183 -0
- data/app/assets/javascripts/Scene/PerspectiveFrustum.js +239 -0
- data/app/assets/javascripts/Scene/PerspectiveOffCenterFrustum.js +394 -0
- data/app/assets/javascripts/Scene/Polygon.js +886 -0
- data/app/assets/javascripts/Scene/Polyline.js +441 -0
- data/app/assets/javascripts/Scene/PolylineCollection.js +1532 -0
- data/app/assets/javascripts/Scene/Projections.js +93 -0
- data/app/assets/javascripts/Scene/RectangularPyramidSensorVolume.js +224 -0
- data/app/assets/javascripts/Scene/Scene.js +632 -0
- data/app/assets/javascripts/Scene/Scene.profile.js +8 -0
- data/app/assets/javascripts/Scene/SceneMode.js +51 -0
- data/app/assets/javascripts/Scene/SceneTransitioner.js +776 -0
- data/app/assets/javascripts/Scene/ScreenSpaceCameraController.js +1063 -0
- data/app/assets/javascripts/Scene/SensorVolumeCollection.js +192 -0
- data/app/assets/javascripts/Scene/SingleTileImageryProvider.js +295 -0
- data/app/assets/javascripts/Scene/SkyAtmosphere.js +239 -0
- data/app/assets/javascripts/Scene/SkyBox.js +231 -0
- data/app/assets/javascripts/Scene/TerrainProvider.js +229 -0
- data/app/assets/javascripts/Scene/TexturePool.js +154 -0
- data/app/assets/javascripts/Scene/Tile.js +322 -0
- data/app/assets/javascripts/Scene/TileDiscardPolicy.js +42 -0
- data/app/assets/javascripts/Scene/TileImagery.js +36 -0
- data/app/assets/javascripts/Scene/TileLoadQueue.js +123 -0
- data/app/assets/javascripts/Scene/TileMapServiceImageryProvider.js +337 -0
- data/app/assets/javascripts/Scene/TileReplacementQueue.js +139 -0
- data/app/assets/javascripts/Scene/TileState.js +19 -0
- data/app/assets/javascripts/Scene/TilingScheme.js +213 -0
- data/app/assets/javascripts/Scene/VerticalOrigin.js +39 -0
- data/app/assets/javascripts/Scene/ViewportQuad.js +256 -0
- data/app/assets/javascripts/Scene/WebMapServiceImageryProvider.js +374 -0
- data/app/assets/javascripts/Scene/WebMercatorTilingScheme.js +291 -0
- data/app/assets/javascripts/Scene/package.json +6 -0
- data/app/assets/javascripts/Shaders/BillboardCollectionFS.glsl +30 -0
- data/app/assets/javascripts/Shaders/BillboardCollectionFS.js +31 -0
- data/app/assets/javascripts/Shaders/BillboardCollectionVS.glsl +68 -0
- data/app/assets/javascripts/Shaders/BillboardCollectionVS.js +54 -0
- data/app/assets/javascripts/Shaders/BuiltinFunctions.glsl +927 -0
- data/app/assets/javascripts/Shaders/BuiltinFunctions.js +322 -0
- data/app/assets/javascripts/Shaders/CentralBodyFS.glsl +106 -0
- data/app/assets/javascripts/Shaders/CentralBodyFS.js +82 -0
- data/app/assets/javascripts/Shaders/CentralBodyFSDepth.glsl +20 -0
- data/app/assets/javascripts/Shaders/CentralBodyFSDepth.js +22 -0
- data/app/assets/javascripts/Shaders/CentralBodyFSPole.glsl +29 -0
- data/app/assets/javascripts/Shaders/CentralBodyFSPole.js +28 -0
- data/app/assets/javascripts/Shaders/CentralBodyVS.glsl +88 -0
- data/app/assets/javascripts/Shaders/CentralBodyVS.js +69 -0
- data/app/assets/javascripts/Shaders/CentralBodyVSDepth.glsl +9 -0
- data/app/assets/javascripts/Shaders/CentralBodyVSDepth.js +13 -0
- data/app/assets/javascripts/Shaders/CentralBodyVSPole.glsl +12 -0
- data/app/assets/javascripts/Shaders/CentralBodyVSPole.js +15 -0
- data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeFS.glsl +448 -0
- data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeFS.js +361 -0
- data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeVS.glsl +19 -0
- data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeVS.js +20 -0
- data/app/assets/javascripts/Shaders/ConstructiveSolidGeometry.glsl +886 -0
- data/app/assets/javascripts/Shaders/ConstructiveSolidGeometry.js +586 -0
- data/app/assets/javascripts/Shaders/CustomSensorVolumeFS.glsl +126 -0
- data/app/assets/javascripts/Shaders/CustomSensorVolumeFS.js +95 -0
- data/app/assets/javascripts/Shaders/CustomSensorVolumeVS.glsl +14 -0
- data/app/assets/javascripts/Shaders/CustomSensorVolumeVS.js +18 -0
- data/app/assets/javascripts/Shaders/EllipsoidFS.glsl +40 -0
- data/app/assets/javascripts/Shaders/EllipsoidFS.js +38 -0
- data/app/assets/javascripts/Shaders/EllipsoidVS.glsl +26 -0
- data/app/assets/javascripts/Shaders/EllipsoidVS.js +16 -0
- data/app/assets/javascripts/Shaders/Materials/AsphaltMaterial.glsl +25 -0
- data/app/assets/javascripts/Shaders/Materials/AsphaltMaterial.js +23 -0
- data/app/assets/javascripts/Shaders/Materials/BlobMaterial.glsl +18 -0
- data/app/assets/javascripts/Shaders/Materials/BlobMaterial.js +19 -0
- data/app/assets/javascripts/Shaders/Materials/BrickMaterial.glsl +42 -0
- data/app/assets/javascripts/Shaders/Materials/BrickMaterial.js +36 -0
- data/app/assets/javascripts/Shaders/Materials/BumpMapMaterial.glsl +29 -0
- data/app/assets/javascripts/Shaders/Materials/BumpMapMaterial.js +27 -0
- data/app/assets/javascripts/Shaders/Materials/CementMaterial.glsl +19 -0
- data/app/assets/javascripts/Shaders/Materials/CementMaterial.js +20 -0
- data/app/assets/javascripts/Shaders/Materials/CheckerboardMaterial.glsl +38 -0
- data/app/assets/javascripts/Shaders/Materials/CheckerboardMaterial.js +32 -0
- data/app/assets/javascripts/Shaders/Materials/DotMaterial.glsl +17 -0
- data/app/assets/javascripts/Shaders/Materials/DotMaterial.js +18 -0
- data/app/assets/javascripts/Shaders/Materials/ErosionMaterial.glsl +23 -0
- data/app/assets/javascripts/Shaders/Materials/ErosionMaterial.js +24 -0
- data/app/assets/javascripts/Shaders/Materials/FacetMaterial.glsl +18 -0
- data/app/assets/javascripts/Shaders/Materials/FacetMaterial.js +19 -0
- data/app/assets/javascripts/Shaders/Materials/FresnelMaterial.glsl +12 -0
- data/app/assets/javascripts/Shaders/Materials/FresnelMaterial.js +15 -0
- data/app/assets/javascripts/Shaders/Materials/GrassMaterial.glsl +28 -0
- data/app/assets/javascripts/Shaders/Materials/GrassMaterial.js +26 -0
- data/app/assets/javascripts/Shaders/Materials/NormalMapMaterial.glsl +19 -0
- data/app/assets/javascripts/Shaders/Materials/NormalMapMaterial.js +21 -0
- data/app/assets/javascripts/Shaders/Materials/ReflectionMaterial.glsl +13 -0
- data/app/assets/javascripts/Shaders/Materials/ReflectionMaterial.js +16 -0
- data/app/assets/javascripts/Shaders/Materials/RefractionMaterial.glsl +14 -0
- data/app/assets/javascripts/Shaders/Materials/RefractionMaterial.js +17 -0
- data/app/assets/javascripts/Shaders/Materials/RimLightingMaterial.glsl +18 -0
- data/app/assets/javascripts/Shaders/Materials/RimLightingMaterial.js +19 -0
- data/app/assets/javascripts/Shaders/Materials/StripeMaterial.glsl +29 -0
- data/app/assets/javascripts/Shaders/Materials/StripeMaterial.js +26 -0
- data/app/assets/javascripts/Shaders/Materials/TieDyeMaterial.glsl +17 -0
- data/app/assets/javascripts/Shaders/Materials/TieDyeMaterial.js +19 -0
- data/app/assets/javascripts/Shaders/Materials/Water.glsl +91 -0
- data/app/assets/javascripts/Shaders/Materials/Water.js +60 -0
- data/app/assets/javascripts/Shaders/Materials/WoodMaterial.glsl +36 -0
- data/app/assets/javascripts/Shaders/Materials/WoodMaterial.js +31 -0
- data/app/assets/javascripts/Shaders/Noise.glsl +453 -0
- data/app/assets/javascripts/Shaders/Noise.js +242 -0
- data/app/assets/javascripts/Shaders/PolygonFS.glsl +27 -0
- data/app/assets/javascripts/Shaders/PolygonFS.js +23 -0
- data/app/assets/javascripts/Shaders/PolygonFSPick.glsl +6 -0
- data/app/assets/javascripts/Shaders/PolygonFSPick.js +11 -0
- data/app/assets/javascripts/Shaders/PolygonVS.glsl +38 -0
- data/app/assets/javascripts/Shaders/PolygonVS.js +39 -0
- data/app/assets/javascripts/Shaders/PolygonVSPick.glsl +30 -0
- data/app/assets/javascripts/Shaders/PolygonVSPick.js +32 -0
- data/app/assets/javascripts/Shaders/PolylineFS.glsl +6 -0
- data/app/assets/javascripts/Shaders/PolylineFS.js +11 -0
- data/app/assets/javascripts/Shaders/PolylineVS.glsl +34 -0
- data/app/assets/javascripts/Shaders/PolylineVS.js +35 -0
- data/app/assets/javascripts/Shaders/Ray.glsl +532 -0
- data/app/assets/javascripts/Shaders/Ray.js +357 -0
- data/app/assets/javascripts/Shaders/ReprojectWebMercatorFS.glsl +26 -0
- data/app/assets/javascripts/Shaders/ReprojectWebMercatorFS.js +22 -0
- data/app/assets/javascripts/Shaders/ReprojectWebMercatorVS.glsl +11 -0
- data/app/assets/javascripts/Shaders/ReprojectWebMercatorVS.js +14 -0
- data/app/assets/javascripts/Shaders/SensorVolume.glsl +43 -0
- data/app/assets/javascripts/Shaders/SensorVolume.js +31 -0
- data/app/assets/javascripts/Shaders/Shaders.profile.js +8 -0
- data/app/assets/javascripts/Shaders/SkyAtmosphereFS.glsl +70 -0
- data/app/assets/javascripts/Shaders/SkyAtmosphereFS.js +62 -0
- data/app/assets/javascripts/Shaders/SkyAtmosphereVS.glsl +131 -0
- data/app/assets/javascripts/Shaders/SkyAtmosphereVS.js +115 -0
- data/app/assets/javascripts/Shaders/SkyBoxFS.glsl +10 -0
- data/app/assets/javascripts/Shaders/SkyBoxFS.js +14 -0
- data/app/assets/javascripts/Shaders/SkyBoxVS.glsl +10 -0
- data/app/assets/javascripts/Shaders/SkyBoxVS.js +14 -0
- data/app/assets/javascripts/Shaders/ViewportQuadFS.glsl +16 -0
- data/app/assets/javascripts/Shaders/ViewportQuadFS.js +17 -0
- data/app/assets/javascripts/Shaders/ViewportQuadVS.glsl +10 -0
- data/app/assets/javascripts/Shaders/ViewportQuadVS.js +14 -0
- data/app/assets/javascripts/Shaders/package.json +6 -0
- data/app/assets/javascripts/ThirdParty/ThirdParty.profile.js +8 -0
- data/app/assets/javascripts/ThirdParty/Tween.js +678 -0
- data/app/assets/javascripts/ThirdParty/Uri.js +277 -0
- data/app/assets/javascripts/ThirdParty/measureText.js +197 -0
- data/app/assets/javascripts/ThirdParty/package.json +6 -0
- data/app/assets/javascripts/ThirdParty/sprintf.js +319 -0
- data/app/assets/javascripts/ThirdParty/when.js +748 -0
- data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.css +175 -0
- data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.html +52 -0
- data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.js +1237 -0
- data/app/assets/javascripts/Widgets/Dojo/CesiumWidget.html +4 -0
- data/app/assets/javascripts/Widgets/Dojo/CesiumWidget.js +349 -0
- data/app/assets/javascripts/Widgets/Dojo/TimelineWidget.css +1 -0
- data/app/assets/javascripts/Widgets/Dojo/TimelineWidget.js +47 -0
- data/app/assets/javascripts/Widgets/Dojo/checkForChromeFrame.js +71 -0
- data/app/assets/javascripts/Widgets/Images/Bing_Logo_51x19_White.png +0 -0
- data/app/assets/javascripts/Widgets/Images/Cesium_Logo_overlay.png +0 -0
- data/app/assets/javascripts/Widgets/Images/TimelineIcons.png +0 -0
- data/app/assets/javascripts/Widgets/Images/ajax-loader.gif +0 -0
- data/app/assets/javascripts/Widgets/Images/animationBar.png +0 -0
- data/app/assets/javascripts/Widgets/Images/viewControlBar.png +0 -0
- data/app/assets/javascripts/Widgets/Timeline.css +113 -0
- data/app/assets/javascripts/Widgets/Timeline.js +629 -0
- data/app/assets/javascripts/Widgets/TimelineHighlightRange.js +51 -0
- data/app/assets/javascripts/Widgets/TimelineTrack.js +54 -0
- data/app/assets/javascripts/Widgets/Widgets.profile.js +8 -0
- data/app/assets/javascripts/Widgets/package.json +6 -0
- data/app/assets/javascripts/Workers/Workers.profile.js +8 -0
- data/app/assets/javascripts/Workers/cesiumWorkerBootstrapper.js +2015 -0
- data/app/assets/javascripts/Workers/createTaskProcessorWorker.js +55 -0
- data/app/assets/javascripts/Workers/createVerticesFromExtent.js +24 -0
- data/app/assets/javascripts/Workers/package.json +6 -0
- data/app/assets/javascripts/copyrightHeader.js +22 -0
- data/app/assets/javascripts/main.js +10 -0
- data/app/assets/stylesheets/cesium.css +4 -0
- data/app/controllers/cesium_controller.rb +4 -0
- data/app/helpers/cesium_helper.rb +2 -0
- data/app/views/cesium/index.html.erb +3 -0
- data/config/routes.rb +3 -0
- data/lib/cesium.rb +4 -0
- data/lib/cesium/engine.rb +4 -0
- data/lib/cesium/version.rb +3 -0
- data/lib/tasks/cesium_tasks.rake +4 -0
- data/test/cesium_test.rb +7 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/adapters/jquery-adapter.js.coffee +4 -0
- data/test/dummy/app/assets/javascripts/app.js.coffee +11 -0
- data/test/dummy/app/assets/javascripts/application.js.coffee +73 -0
- data/test/dummy/app/assets/stylesheets/application.css +12 -0
- data/test/dummy/app/controllers/application_controller.rb +4 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +21 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/requirejs.yml +10 -0
- data/test/dummy/config/routes.rb +3 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/functional/cesium_controller_test.rb +9 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/test_helper.rb +15 -0
- data/test/unit/helpers/cesium_helper_test.rb +4 -0
- metadata +641 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
/*global define*/
|
2
|
+
define(['../Core/Enumeration'], function(Enumeration) {
|
3
|
+
"use strict";
|
4
|
+
|
5
|
+
/**
|
6
|
+
* The horizontal location of an origin relative to an object, e.g., a {@link Billboard}.
|
7
|
+
* For example, the horizontal origin is used to display a billboard to the left or right (in
|
8
|
+
* screen space) of the actual position.
|
9
|
+
*
|
10
|
+
* @exports HorizontalOrigin
|
11
|
+
*
|
12
|
+
* @see Billboard#setHorizontalOrigin
|
13
|
+
*/
|
14
|
+
var HorizontalOrigin = {
|
15
|
+
/**
|
16
|
+
* The origin is at the horizontal center of the object.
|
17
|
+
*
|
18
|
+
* @constant
|
19
|
+
* @type {Enumeration}
|
20
|
+
*/
|
21
|
+
CENTER : new Enumeration(0, 'CENTER'),
|
22
|
+
/**
|
23
|
+
* The origin is on the left side of the object.
|
24
|
+
*
|
25
|
+
* @constant
|
26
|
+
* @type {Enumeration}
|
27
|
+
*/
|
28
|
+
LEFT : new Enumeration(1, 'LEFT'),
|
29
|
+
/**
|
30
|
+
* The origin is on the right side of the object.
|
31
|
+
*
|
32
|
+
* @constant
|
33
|
+
* @type {Enumeration}
|
34
|
+
*/
|
35
|
+
RIGHT : new Enumeration(-1, 'RIGHT')
|
36
|
+
};
|
37
|
+
|
38
|
+
return HorizontalOrigin;
|
39
|
+
});
|
@@ -0,0 +1,85 @@
|
|
1
|
+
/*global define*/
|
2
|
+
define([
|
3
|
+
'../Core/destroyObject',
|
4
|
+
'./ImageryState'
|
5
|
+
], function(
|
6
|
+
destroyObject,
|
7
|
+
ImageryState) {
|
8
|
+
"use strict";
|
9
|
+
|
10
|
+
/**
|
11
|
+
* Stores details about a tile of imagery.
|
12
|
+
*
|
13
|
+
* @alias Imagery
|
14
|
+
* @private
|
15
|
+
*/
|
16
|
+
var Imagery = function(imageryLayer, x, y, level, extent) {
|
17
|
+
this.imageryLayer = imageryLayer;
|
18
|
+
this.x = x;
|
19
|
+
this.y = y;
|
20
|
+
this.level = level;
|
21
|
+
|
22
|
+
if (level !== 0) {
|
23
|
+
var parentX = x / 2 | 0;
|
24
|
+
var parentY = y / 2 | 0;
|
25
|
+
var parentLevel = level - 1;
|
26
|
+
this.parent = imageryLayer.getImageryFromCache(parentX, parentY, parentLevel);
|
27
|
+
}
|
28
|
+
|
29
|
+
this.state = ImageryState.UNLOADED;
|
30
|
+
this.imageUrl = undefined;
|
31
|
+
this.image = undefined;
|
32
|
+
this.texture = undefined;
|
33
|
+
this.referenceCount = 0;
|
34
|
+
|
35
|
+
if (typeof extent === 'undefined' && imageryLayer.getImageryProvider().isReady()) {
|
36
|
+
var tilingScheme = imageryLayer.getImageryProvider().getTilingScheme();
|
37
|
+
extent = tilingScheme.tileXYToExtent(x, y, level);
|
38
|
+
}
|
39
|
+
|
40
|
+
this.extent = extent;
|
41
|
+
};
|
42
|
+
|
43
|
+
Imagery.createPlaceholder = function(imageryLayer) {
|
44
|
+
var result = new Imagery(imageryLayer, 0, 0, 0);
|
45
|
+
result.addReference();
|
46
|
+
result.state = ImageryState.PLACEHOLDER;
|
47
|
+
return result;
|
48
|
+
};
|
49
|
+
|
50
|
+
Imagery.prototype.addReference = function() {
|
51
|
+
++this.referenceCount;
|
52
|
+
};
|
53
|
+
|
54
|
+
Imagery.prototype.releaseReference = function() {
|
55
|
+
--this.referenceCount;
|
56
|
+
|
57
|
+
if (this.referenceCount === 0) {
|
58
|
+
this.imageryLayer.removeImageryFromCache(this);
|
59
|
+
|
60
|
+
if (typeof this.parent !== 'undefined') {
|
61
|
+
this.parent.releaseReference();
|
62
|
+
}
|
63
|
+
|
64
|
+
if (typeof this.image !== 'undefined' && typeof this.image.destroy !== 'undefined') {
|
65
|
+
this.image.destroy();
|
66
|
+
}
|
67
|
+
|
68
|
+
if (typeof this.transformedImage !== 'undefined' && typeof this.transformedImage.destroy !== 'undefined') {
|
69
|
+
this.transformedImage.destroy();
|
70
|
+
}
|
71
|
+
|
72
|
+
if (typeof this.texture !== 'undefined' && typeof this.texture.destroy !== 'undefined') {
|
73
|
+
this.texture.destroy();
|
74
|
+
}
|
75
|
+
|
76
|
+
destroyObject(this);
|
77
|
+
|
78
|
+
return 0;
|
79
|
+
}
|
80
|
+
|
81
|
+
return this.referenceCount;
|
82
|
+
};
|
83
|
+
|
84
|
+
return Imagery;
|
85
|
+
});
|
@@ -0,0 +1,876 @@
|
|
1
|
+
/*global define*/
|
2
|
+
define([
|
3
|
+
'../Core/defaultValue',
|
4
|
+
'../Core/destroyObject',
|
5
|
+
'../Core/BoundingRectangle',
|
6
|
+
'../Core/ComponentDatatype',
|
7
|
+
'../Core/Cartesian2',
|
8
|
+
'../Core/Cartesian4',
|
9
|
+
'../Core/Color',
|
10
|
+
'../Core/DeveloperError',
|
11
|
+
'../Core/Event',
|
12
|
+
'../Core/Extent',
|
13
|
+
'../Core/Math',
|
14
|
+
'../Core/PrimitiveType',
|
15
|
+
'../Renderer/BufferUsage',
|
16
|
+
'../Renderer/MipmapHint',
|
17
|
+
'../Renderer/TextureMagnificationFilter',
|
18
|
+
'../Renderer/TextureMinificationFilter',
|
19
|
+
'../Renderer/TextureWrap',
|
20
|
+
'./GeographicTilingScheme',
|
21
|
+
'./Imagery',
|
22
|
+
'./ImageryProviderError',
|
23
|
+
'./ImageryState',
|
24
|
+
'./TileImagery',
|
25
|
+
'./TexturePool',
|
26
|
+
'../ThirdParty/when',
|
27
|
+
'../Shaders/ReprojectWebMercatorFS',
|
28
|
+
'../Shaders/ReprojectWebMercatorVS'
|
29
|
+
], function(
|
30
|
+
defaultValue,
|
31
|
+
destroyObject,
|
32
|
+
BoundingRectangle,
|
33
|
+
ComponentDatatype,
|
34
|
+
Cartesian2,
|
35
|
+
Cartesian4,
|
36
|
+
Color,
|
37
|
+
DeveloperError,
|
38
|
+
Event,
|
39
|
+
Extent,
|
40
|
+
CesiumMath,
|
41
|
+
PrimitiveType,
|
42
|
+
BufferUsage,
|
43
|
+
MipmapHint,
|
44
|
+
TextureMagnificationFilter,
|
45
|
+
TextureMinificationFilter,
|
46
|
+
TextureWrap,
|
47
|
+
GeographicTilingScheme,
|
48
|
+
Imagery,
|
49
|
+
ImageryProviderError,
|
50
|
+
ImageryState,
|
51
|
+
TileImagery,
|
52
|
+
TexturePool,
|
53
|
+
when,
|
54
|
+
ReprojectWebMercatorFS,
|
55
|
+
ReprojectWebMercatorVS) {
|
56
|
+
"use strict";
|
57
|
+
|
58
|
+
/**
|
59
|
+
* An imagery layer that displays tiled image data from a single imagery provider
|
60
|
+
* on a {@link CentralBody}.
|
61
|
+
*
|
62
|
+
* @alias ImageryLayer
|
63
|
+
* @constructor
|
64
|
+
*
|
65
|
+
* @param {ImageryProvider} imageryProvider The imagery provider to use.
|
66
|
+
* @param {Extent} [description.extent=imageryProvider.extent] The extent of the layer. This extent
|
67
|
+
* can limit the visible portion of the imagery provider.
|
68
|
+
* @param {Number|Function} [description.alpha=1.0] The alpha blending value of this layer, from 0.0 to 1.0.
|
69
|
+
* This can either be a simple number or a function with the signature
|
70
|
+
* <code>function(frameState, layer, x, y, level)</code>. The function is passed the
|
71
|
+
* current {@link FrameState}, this layer, and the x, y, and level coordinates of the
|
72
|
+
* imagery tile for which the alpha is required, and it is expected to return
|
73
|
+
* the alpha value to use for the tile.
|
74
|
+
* @param {Number|Function} [description.brightness=1.0] The brightness of this layer. 1.0 uses the unmodified imagery
|
75
|
+
* color. Less than 1.0 makes the imagery darker while greater than 1.0 makes it brighter.
|
76
|
+
* This can either be a simple number or a function with the signature
|
77
|
+
* <code>function(frameState, layer, x, y, level)</code>. The function is passed the
|
78
|
+
* current {@link FrameState}, this layer, and the x, y, and level coordinates of the
|
79
|
+
* imagery tile for which the brightness is required, and it is expected to return
|
80
|
+
* the brightness value to use for the tile. The function is executed for every
|
81
|
+
* frame and for every tile, so it must be fast.
|
82
|
+
* @param {Number|Function} [description.contrast=1.0] The contrast of this layer. 1.0 uses the unmodified imagery color.
|
83
|
+
* Less than 1.0 reduces the contrast while greater than 1.0 increases it.
|
84
|
+
* This can either be a simple number or a function with the signature
|
85
|
+
* <code>function(frameState, layer, x, y, level)</code>. The function is passed the
|
86
|
+
* current {@link FrameState}, this layer, and the x, y, and level coordinates of the
|
87
|
+
* imagery tile for which the contrast is required, and it is expected to return
|
88
|
+
* the contrast value to use for the tile. The function is executed for every
|
89
|
+
* frame and for every tile, so it must be fast.
|
90
|
+
* @param {Number|Function} [description.gamma=1.0] The gamma correction to apply to this layer. 1.0 uses the unmodified imagery color.
|
91
|
+
* This can either be a simple number or a function with the signature
|
92
|
+
* <code>function(frameState, layer, x, y, level)</code>. The function is passed the
|
93
|
+
* current {@link FrameState}, this layer, and the x, y, and level coordinates of the
|
94
|
+
* imagery tile for which the gamma is required, and it is expected to return
|
95
|
+
* the gamma value to use for the tile. The function is executed for every
|
96
|
+
* frame and for every tile, so it must be fast.
|
97
|
+
* @param {Boolean} [description.show=true] True if the layer is shown; otherwise, false.
|
98
|
+
* @param {Number} [description.maximumAnisotropy=maximum supported] The maximum anisotropy level to use
|
99
|
+
* for texture filtering. If this parameter is not specified, the maximum anisotropy supported
|
100
|
+
* by the WebGL stack will be used. Larger values make the imagery look better in horizon
|
101
|
+
* views.
|
102
|
+
*/
|
103
|
+
var ImageryLayer = function ImageryLayer(imageryProvider, description) {
|
104
|
+
this._imageryProvider = imageryProvider;
|
105
|
+
|
106
|
+
description = defaultValue(description, {});
|
107
|
+
|
108
|
+
/**
|
109
|
+
* The alpha blending value of this layer, usually from 0.0 to 1.0.
|
110
|
+
* This can either be a simple number or a function with the signature
|
111
|
+
* <code>function(frameState, layer, x, y, level)</code>. The function is passed the
|
112
|
+
* current {@link FrameState}, this layer, and the x, y, and level coordinates of the
|
113
|
+
* imagery tile for which the alpha is required, and it is expected to return
|
114
|
+
* the alpha value to use for the tile. The function is executed for every
|
115
|
+
* frame and for every tile, so it must be fast.
|
116
|
+
*
|
117
|
+
* @type {Number}
|
118
|
+
*/
|
119
|
+
this.alpha = defaultValue(description.alpha, defaultValue(imageryProvider.defaultAlpha, 1.0));
|
120
|
+
|
121
|
+
/**
|
122
|
+
* The brightness of this layer. 1.0 uses the unmodified imagery color. Less than 1.0
|
123
|
+
* makes the imagery darker while greater than 1.0 makes it brighter.
|
124
|
+
* This can either be a simple number or a function with the signature
|
125
|
+
* <code>function(frameState, layer, x, y, level)</code>. The function is passed the
|
126
|
+
* current {@link FrameState}, this layer, and the x, y, and level coordinates of the
|
127
|
+
* imagery tile for which the brightness is required, and it is expected to return
|
128
|
+
* the brightness value to use for the tile. The function is executed for every
|
129
|
+
* frame and for every tile, so it must be fast.
|
130
|
+
*
|
131
|
+
* @type {Number}
|
132
|
+
*/
|
133
|
+
this.brightness = defaultValue(description.brightness, defaultValue(imageryProvider.defaultBrightness, ImageryLayer.DEFAULT_BRIGHTNESS));
|
134
|
+
|
135
|
+
/**
|
136
|
+
* The contrast of this layer. 1.0 uses the unmodified imagery color. Less than 1.0 reduces
|
137
|
+
* the contrast while greater than 1.0 increases it.
|
138
|
+
* This can either be a simple number or a function with the signature
|
139
|
+
* <code>function(frameState, layer, x, y, level)</code>. The function is passed the
|
140
|
+
* current {@link FrameState}, this layer, and the x, y, and level coordinates of the
|
141
|
+
* imagery tile for which the contrast is required, and it is expected to return
|
142
|
+
* the contrast value to use for the tile. The function is executed for every
|
143
|
+
* frame and for every tile, so it must be fast.
|
144
|
+
*
|
145
|
+
* @type {Number}
|
146
|
+
*/
|
147
|
+
this.contrast = defaultValue(description.contrast, defaultValue(imageryProvider.defaultContrast, ImageryLayer.DEFAULT_CONTRAST));
|
148
|
+
|
149
|
+
/**
|
150
|
+
* The hue of this layer in radians. 0.0 uses the unmodified imagery color. This can either be a
|
151
|
+
* simple number or a function with the signature <code>function(frameState, layer, x, y, level)</code>.
|
152
|
+
* The function is passed the current {@link FrameState}, this layer, and the x, y, and level
|
153
|
+
* coordinates of the imagery tile for which the hue is required, and it is expected to return
|
154
|
+
* the hue value to use for the tile. The function is executed for every
|
155
|
+
* frame and for every tile, so it must be fast.
|
156
|
+
*
|
157
|
+
* @type {Number}
|
158
|
+
*/
|
159
|
+
this.hue = defaultValue(description.hue, defaultValue(imageryProvider.defaultHue, ImageryLayer.DEFAULT_HUE));
|
160
|
+
|
161
|
+
/**
|
162
|
+
* The saturation of this layer. 1.0 uses the unmodified imagery color. Less than 1.0 reduces the
|
163
|
+
* saturation while greater than 1.0 increases it. This can either be a simple number or a function
|
164
|
+
* with the signature <code>function(frameState, layer, x, y, level)</code>. The function is passed the
|
165
|
+
* current {@link FrameState}, this layer, and the x, y, and level coordinates of the
|
166
|
+
* imagery tile for which the saturation is required, and it is expected to return
|
167
|
+
* the saturation value to use for the tile. The function is executed for every
|
168
|
+
* frame and for every tile, so it must be fast.
|
169
|
+
*
|
170
|
+
* @type {Number}
|
171
|
+
*/
|
172
|
+
this.saturation = defaultValue(description.saturation, defaultValue(imageryProvider.defaultSaturation, ImageryLayer.DEFAULT_SATURATION));
|
173
|
+
|
174
|
+
/**
|
175
|
+
* The gamma correction to apply to this layer. 1.0 uses the unmodified imagery color.
|
176
|
+
* This can either be a simple number or a function with the signature
|
177
|
+
* <code>function(frameState, layer, x, y, level)</code>. The function is passed the
|
178
|
+
* current {@link FrameState}, this layer, and the x, y, and level coordinates of the
|
179
|
+
* imagery tile for which the gamma is required, and it is expected to return
|
180
|
+
* the gamma value to use for the tile. The function is executed for every
|
181
|
+
* frame and for every tile, so it must be fast.
|
182
|
+
*
|
183
|
+
* @type {Number}
|
184
|
+
*/
|
185
|
+
this.gamma = defaultValue(description.gamma, defaultValue(imageryProvider.defaultGamma, ImageryLayer.DEFAULT_GAMMA));
|
186
|
+
|
187
|
+
/**
|
188
|
+
* Determines if this layer is shown.
|
189
|
+
*
|
190
|
+
* @type {Boolean}
|
191
|
+
*/
|
192
|
+
this.show = defaultValue(description.show, true);
|
193
|
+
|
194
|
+
this._extent = defaultValue(description.extent, Extent.MAX_VALUE);
|
195
|
+
this._maximumAnisotropy = description.maximumAnisotropy;
|
196
|
+
|
197
|
+
this._imageryCache = {};
|
198
|
+
this._texturePool = new TexturePool();
|
199
|
+
|
200
|
+
this._spReproject = undefined;
|
201
|
+
this._vaReproject = undefined;
|
202
|
+
this._fbReproject = undefined;
|
203
|
+
|
204
|
+
this._skeletonPlaceholder = new TileImagery(Imagery.createPlaceholder(this));
|
205
|
+
|
206
|
+
// The value of the show property on the last update.
|
207
|
+
this._show = false;
|
208
|
+
|
209
|
+
// The index of this layer in the ImageryLayerCollection.
|
210
|
+
this._layerIndex = -1;
|
211
|
+
|
212
|
+
// true if this is the base (lowest shown) layer.
|
213
|
+
this._isBaseLayer = false;
|
214
|
+
|
215
|
+
this._requestImageError = undefined;
|
216
|
+
|
217
|
+
this._nonMipmapSampler = undefined;
|
218
|
+
this._mipmapSampler = undefined;
|
219
|
+
this._reprojectSampler = undefined;
|
220
|
+
};
|
221
|
+
|
222
|
+
/**
|
223
|
+
* This value is used as the default brightness for the imagery layer if one is not provided during construction
|
224
|
+
* or by the imagery provider. This value does not modify the brightness of the imagery.
|
225
|
+
* @type {number}
|
226
|
+
*/
|
227
|
+
ImageryLayer.DEFAULT_BRIGHTNESS = 1.0;
|
228
|
+
/**
|
229
|
+
* This value is used as the default contrast for the imagery layer if one is not provided during construction
|
230
|
+
* or by the imagery provider. This value does not modify the contrast of the imagery.
|
231
|
+
* @type {number}
|
232
|
+
*/
|
233
|
+
ImageryLayer.DEFAULT_CONTRAST = 1.0;
|
234
|
+
/**
|
235
|
+
* This value is used as the default hue for the imagery layer if one is not provided during construction
|
236
|
+
* or by the imagery provider. This value does not modify the hue of the imagery.
|
237
|
+
* @type {number}
|
238
|
+
*/
|
239
|
+
ImageryLayer.DEFAULT_HUE = 0.0;
|
240
|
+
/**
|
241
|
+
* This value is used as the default saturation for the imagery layer if one is not provided during construction
|
242
|
+
* or by the imagery provider. This value does not modify the saturation of the imagery.
|
243
|
+
* @type {number}
|
244
|
+
*/
|
245
|
+
ImageryLayer.DEFAULT_SATURATION = 1.0;
|
246
|
+
/**
|
247
|
+
* This value is used as the default gamma for the imagery layer if one is not provided during construction
|
248
|
+
* or by the imagery provider. This value does not modify the gamma of the imagery.
|
249
|
+
* @type {number}
|
250
|
+
*/
|
251
|
+
ImageryLayer.DEFAULT_GAMMA = 1.0;
|
252
|
+
|
253
|
+
/**
|
254
|
+
* Gets the imagery provider for this layer.
|
255
|
+
*
|
256
|
+
* @memberof ImageryLayer
|
257
|
+
*
|
258
|
+
* @returns {ImageryProvider} The imagery provider.
|
259
|
+
*/
|
260
|
+
ImageryLayer.prototype.getImageryProvider = function() {
|
261
|
+
return this._imageryProvider;
|
262
|
+
};
|
263
|
+
|
264
|
+
/**
|
265
|
+
* Gets the extent of this layer. If this extent is smaller than the extent of the
|
266
|
+
* {@link ImageryProvider}, only a portion of the imagery provider is shown.
|
267
|
+
*
|
268
|
+
* @memberof ImageryLayer
|
269
|
+
*
|
270
|
+
* @returns {Extent} The extent.
|
271
|
+
*/
|
272
|
+
ImageryLayer.prototype.getExtent = function() {
|
273
|
+
return this._extent;
|
274
|
+
};
|
275
|
+
|
276
|
+
/**
|
277
|
+
* Gets a value indicating whether this layer is the base layer in the
|
278
|
+
* {@link ImageryLayerCollection}. The base layer is the one that underlies all
|
279
|
+
* others. It is special in that it is treated as if it has global extent, even if
|
280
|
+
* it actually does not, by stretching the texels at the edges over the entire
|
281
|
+
* globe.
|
282
|
+
*
|
283
|
+
* @memberof ImageryLayer
|
284
|
+
*
|
285
|
+
* @returns {Boolean} true if this is the base layer; otherwise, false.
|
286
|
+
*/
|
287
|
+
ImageryLayer.prototype.isBaseLayer = function() {
|
288
|
+
return this._isBaseLayer;
|
289
|
+
};
|
290
|
+
|
291
|
+
/**
|
292
|
+
* Returns true if this object was destroyed; otherwise, false.
|
293
|
+
* <br /><br />
|
294
|
+
* If this object was destroyed, it should not be used; calling any function other than
|
295
|
+
* <code>isDestroyed</code> will result in a {@link DeveloperError} exception.
|
296
|
+
*
|
297
|
+
* @memberof ImageryLayer
|
298
|
+
*
|
299
|
+
* @return {Boolean} True if this object was destroyed; otherwise, false.
|
300
|
+
*
|
301
|
+
* @see ImageryLayer#destroy
|
302
|
+
*/
|
303
|
+
ImageryLayer.prototype.isDestroyed = function() {
|
304
|
+
return false;
|
305
|
+
};
|
306
|
+
|
307
|
+
/**
|
308
|
+
* Destroys the WebGL resources held by this object. Destroying an object allows for deterministic
|
309
|
+
* release of WebGL resources, instead of relying on the garbage collector to destroy this object.
|
310
|
+
* <br /><br />
|
311
|
+
* Once an object is destroyed, it should not be used; calling any function other than
|
312
|
+
* <code>isDestroyed</code> will result in a {@link DeveloperError} exception. Therefore,
|
313
|
+
* assign the return value (<code>undefined</code>) to the object as done in the example.
|
314
|
+
*
|
315
|
+
* @memberof ImageryLayer
|
316
|
+
*
|
317
|
+
* @return {undefined}
|
318
|
+
*
|
319
|
+
* @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
|
320
|
+
*
|
321
|
+
* @see ImageryLayer#isDestroyed
|
322
|
+
*
|
323
|
+
* @example
|
324
|
+
* imageryLayer = imageryLayer && imageryLayer.destroy();
|
325
|
+
*/
|
326
|
+
ImageryLayer.prototype.destroy = function() {
|
327
|
+
this._texturePool = this._texturePool && this._texturePool.destroy();
|
328
|
+
|
329
|
+
return destroyObject(this);
|
330
|
+
};
|
331
|
+
|
332
|
+
/**
|
333
|
+
* Create skeletons for the imagery tiles that partially or completely overlap a given terrain
|
334
|
+
* tile.
|
335
|
+
*
|
336
|
+
* @memberof ImageryLayer
|
337
|
+
* @private
|
338
|
+
*
|
339
|
+
* @param {Tile} tile The terrain tile.
|
340
|
+
* @param {TerrainProvider} terrainProvider The terrain provider associated with the terrain tile.
|
341
|
+
* @param {Number} insertionPoint The position to insert new skeletons before in the tile's imagery lsit.
|
342
|
+
* @returns {Boolean} true if this layer overlaps any portion of the terrain tile; otherwise, false.
|
343
|
+
*/
|
344
|
+
ImageryLayer.prototype._createTileImagerySkeletons = function(tile, terrainProvider, insertionPoint) {
|
345
|
+
var imageryProvider = this._imageryProvider;
|
346
|
+
|
347
|
+
if (typeof insertionPoint === 'undefined') {
|
348
|
+
insertionPoint = tile.imagery.length;
|
349
|
+
}
|
350
|
+
|
351
|
+
if (!imageryProvider.isReady()) {
|
352
|
+
// The imagery provider is not ready, so we can't create skeletons, yet.
|
353
|
+
// Instead, add a placeholder so that we'll know to create
|
354
|
+
// the skeletons once the provider is ready.
|
355
|
+
this._skeletonPlaceholder.imagery.addReference();
|
356
|
+
tile.imagery.splice(insertionPoint, 0, this._skeletonPlaceholder);
|
357
|
+
return true;
|
358
|
+
}
|
359
|
+
|
360
|
+
// Compute the extent of the imagery from this imageryProvider that overlaps
|
361
|
+
// the geometry tile. The ImageryProvider and ImageryLayer both have the
|
362
|
+
// opportunity to constrain the extent. The imagery TilingScheme's extent
|
363
|
+
// always fully contains the ImageryProvider's extent.
|
364
|
+
var extent = tile.extent.intersectWith(imageryProvider.getExtent());
|
365
|
+
extent = extent.intersectWith(this._extent);
|
366
|
+
|
367
|
+
if (extent.east <= extent.west || extent.north <= extent.south) {
|
368
|
+
// There is no overlap between this terrain tile and this imagery
|
369
|
+
// provider. Unless this is the base layer, no skeletons need to be created.
|
370
|
+
// We stretch texels at the edge of the base layer over the entire globe.
|
371
|
+
if (!this.isBaseLayer()) {
|
372
|
+
return false;
|
373
|
+
}
|
374
|
+
|
375
|
+
var baseImageryExtent = imageryProvider.getExtent().intersectWith(this._extent);
|
376
|
+
var baseTerrainExtent = tile.extent;
|
377
|
+
|
378
|
+
if (baseTerrainExtent.south >= baseImageryExtent.north) {
|
379
|
+
extent.north = extent.south = baseImageryExtent.north;
|
380
|
+
} else if (baseTerrainExtent.north <= baseImageryExtent.south) {
|
381
|
+
extent.north = extent.south = baseImageryExtent.south;
|
382
|
+
}
|
383
|
+
|
384
|
+
if (baseTerrainExtent.west >= baseImageryExtent.east) {
|
385
|
+
extent.west = extent.east = baseImageryExtent.east;
|
386
|
+
} else if (baseTerrainExtent.east <= baseImageryExtent.west) {
|
387
|
+
extent.west = extent.east = baseImageryExtent.west;
|
388
|
+
}
|
389
|
+
}
|
390
|
+
|
391
|
+
var latitudeClosestToEquator = 0.0;
|
392
|
+
if (extent.south > 0.0) {
|
393
|
+
latitudeClosestToEquator = extent.south;
|
394
|
+
} else if (extent.north < 0.0) {
|
395
|
+
latitudeClosestToEquator = extent.north;
|
396
|
+
}
|
397
|
+
|
398
|
+
// Compute the required level in the imagery tiling scheme.
|
399
|
+
// The errorRatio should really be imagerySSE / terrainSSE rather than this hard-coded value.
|
400
|
+
// But first we need configurable imagery SSE and we need the rendering to be able to handle more
|
401
|
+
// images attached to a terrain tile than there are available texture units. So that's for the future.
|
402
|
+
var errorRatio = 1.0;
|
403
|
+
var targetGeometricError = errorRatio * terrainProvider.getLevelMaximumGeometricError(tile.level);
|
404
|
+
var imageryLevel = getLevelWithMaximumTexelSpacing(this, targetGeometricError, latitudeClosestToEquator);
|
405
|
+
imageryLevel = Math.max(0, imageryLevel);
|
406
|
+
var maximumLevel = imageryProvider.getMaximumLevel();
|
407
|
+
if (imageryLevel > maximumLevel) {
|
408
|
+
imageryLevel = maximumLevel;
|
409
|
+
}
|
410
|
+
|
411
|
+
var imageryTilingScheme = imageryProvider.getTilingScheme();
|
412
|
+
var northwestTileCoordinates = imageryTilingScheme.positionToTileXY(extent.getNorthwest(), imageryLevel);
|
413
|
+
var southeastTileCoordinates = imageryTilingScheme.positionToTileXY(extent.getSoutheast(), imageryLevel);
|
414
|
+
|
415
|
+
// If the southeast corner of the extent lies very close to the north or west side
|
416
|
+
// of the southeast tile, we don't actually need the southernmost or easternmost
|
417
|
+
// tiles.
|
418
|
+
// Similarly, if the northwest corner of the extent lies very close to the south or east side
|
419
|
+
// of the northwest tile, we don't actually need the northernmost or westernmost tiles.
|
420
|
+
|
421
|
+
// We define "very close" as being within 1/512 of the width of the tile.
|
422
|
+
var veryCloseX = (tile.extent.north - tile.extent.south) / 512.0;
|
423
|
+
var veryCloseY = (tile.extent.east - tile.extent.west) / 512.0;
|
424
|
+
|
425
|
+
var northwestTileExtent = imageryTilingScheme.tileXYToExtent(northwestTileCoordinates.x, northwestTileCoordinates.y, imageryLevel);
|
426
|
+
if (Math.abs(northwestTileExtent.south - extent.north) < veryCloseY && northwestTileCoordinates.y < southeastTileCoordinates.y) {
|
427
|
+
++northwestTileCoordinates.y;
|
428
|
+
}
|
429
|
+
if (Math.abs(northwestTileExtent.east - extent.west) < veryCloseX && northwestTileCoordinates.x < southeastTileCoordinates.x) {
|
430
|
+
++northwestTileCoordinates.x;
|
431
|
+
}
|
432
|
+
|
433
|
+
var southeastTileExtent = imageryTilingScheme.tileXYToExtent(southeastTileCoordinates.x, southeastTileCoordinates.y, imageryLevel);
|
434
|
+
if (Math.abs(southeastTileExtent.north - extent.south) < veryCloseY && southeastTileCoordinates.y > northwestTileCoordinates.y) {
|
435
|
+
--southeastTileCoordinates.y;
|
436
|
+
}
|
437
|
+
if (Math.abs(southeastTileExtent.west - extent.east) < veryCloseX && southeastTileCoordinates.x > northwestTileCoordinates.x) {
|
438
|
+
--southeastTileCoordinates.x;
|
439
|
+
}
|
440
|
+
|
441
|
+
var imageryMaxX = imageryTilingScheme.getNumberOfXTilesAtLevel(imageryLevel);
|
442
|
+
var imageryMaxY = imageryTilingScheme.getNumberOfYTilesAtLevel(imageryLevel);
|
443
|
+
|
444
|
+
// Create TileImagery instances for each imagery tile overlapping this terrain tile.
|
445
|
+
// We need to do all texture coordinate computations in the imagery tile's tiling scheme.
|
446
|
+
|
447
|
+
var terrainExtent = tile.extent;
|
448
|
+
var imageryExtent = imageryTilingScheme.tileXYToExtent(northwestTileCoordinates.x, northwestTileCoordinates.y, imageryLevel);
|
449
|
+
|
450
|
+
var minU;
|
451
|
+
var maxU = 0.0;
|
452
|
+
|
453
|
+
var minV = 1.0;
|
454
|
+
var maxV;
|
455
|
+
|
456
|
+
// If this is the northern-most or western-most tile in the imagery tiling scheme,
|
457
|
+
// it may not start at the northern or western edge of the terrain tile.
|
458
|
+
// Calculate where it does start.
|
459
|
+
if (!this.isBaseLayer() && northwestTileCoordinates.x === 0) {
|
460
|
+
maxU = Math.min(1.0, (imageryExtent.west - terrainExtent.west) / (terrainExtent.east - terrainExtent.west));
|
461
|
+
}
|
462
|
+
|
463
|
+
if (!this.isBaseLayer() && northwestTileCoordinates.y === 0) {
|
464
|
+
minV = Math.max(0.0, (imageryExtent.north - terrainExtent.south) / (terrainExtent.north - terrainExtent.south));
|
465
|
+
}
|
466
|
+
|
467
|
+
var initialMinV = minV;
|
468
|
+
|
469
|
+
for ( var i = northwestTileCoordinates.x; i <= southeastTileCoordinates.x; i++) {
|
470
|
+
minU = maxU;
|
471
|
+
|
472
|
+
imageryExtent = imageryTilingScheme.tileXYToExtent(i, northwestTileCoordinates.y, imageryLevel);
|
473
|
+
maxU = Math.min(1.0, (imageryExtent.east - terrainExtent.west) / (terrainExtent.east - terrainExtent.west));
|
474
|
+
|
475
|
+
// If this is the eastern-most imagery tile mapped to this terrain tile,
|
476
|
+
// and there are more imagery tiles to the east of this one, the maxU
|
477
|
+
// should be 1.0 to make sure rounding errors don't make the last
|
478
|
+
// image fall shy of the edge of the terrain tile.
|
479
|
+
if (i === southeastTileCoordinates.x && (this.isBaseLayer() || i < imageryMaxX - 1)) {
|
480
|
+
maxU = 1.0;
|
481
|
+
}
|
482
|
+
|
483
|
+
minV = initialMinV;
|
484
|
+
|
485
|
+
for ( var j = northwestTileCoordinates.y; j <= southeastTileCoordinates.y; j++) {
|
486
|
+
maxV = minV;
|
487
|
+
|
488
|
+
imageryExtent = imageryTilingScheme.tileXYToExtent(i, j, imageryLevel);
|
489
|
+
minV = Math.max(0.0, (imageryExtent.south - terrainExtent.south) / (terrainExtent.north - terrainExtent.south));
|
490
|
+
|
491
|
+
// If this is the southern-most imagery tile mapped to this terrain tile,
|
492
|
+
// and there are more imagery tiles to the south of this one, the minV
|
493
|
+
// should be 0.0 to make sure rounding errors don't make the last
|
494
|
+
// image fall shy of the edge of the terrain tile.
|
495
|
+
if (j === southeastTileCoordinates.y && (this.isBaseLayer() || j < imageryMaxY - 1)) {
|
496
|
+
minV = 0.0;
|
497
|
+
}
|
498
|
+
|
499
|
+
var texCoordsExtent = new Cartesian4(minU, minV, maxU, maxV);
|
500
|
+
var imagery = this.getImageryFromCache(i, j, imageryLevel, imageryExtent);
|
501
|
+
tile.imagery.splice(insertionPoint, 0, new TileImagery(imagery, texCoordsExtent));
|
502
|
+
++insertionPoint;
|
503
|
+
}
|
504
|
+
}
|
505
|
+
|
506
|
+
return true;
|
507
|
+
};
|
508
|
+
|
509
|
+
/**
|
510
|
+
* Calculate the translation and scale for a particular {@link TileImagery} attached to a
|
511
|
+
* particular terrain {@link Tile}.
|
512
|
+
*
|
513
|
+
* @memberof ImageryLayer
|
514
|
+
* @private
|
515
|
+
*
|
516
|
+
* @param {Tile} tile The terrain tile.
|
517
|
+
* @param {TileImagery} tileImagery The imagery tile mapping.
|
518
|
+
* @returns {Cartesian4} The translation and scale where X and Y are the translation and Z and W
|
519
|
+
* are the scale.
|
520
|
+
*/
|
521
|
+
ImageryLayer.prototype._calculateTextureTranslationAndScale = function(tile, tileImagery) {
|
522
|
+
var imageryExtent = tileImagery.imagery.extent;
|
523
|
+
var terrainExtent = tile.extent;
|
524
|
+
var terrainWidth = terrainExtent.east - terrainExtent.west;
|
525
|
+
var terrainHeight = terrainExtent.north - terrainExtent.south;
|
526
|
+
|
527
|
+
var scaleX = terrainWidth / (imageryExtent.east - imageryExtent.west);
|
528
|
+
var scaleY = terrainHeight / (imageryExtent.north - imageryExtent.south);
|
529
|
+
return new Cartesian4(
|
530
|
+
scaleX * (terrainExtent.west - imageryExtent.west) / terrainWidth,
|
531
|
+
scaleY * (terrainExtent.south - imageryExtent.south) / terrainHeight,
|
532
|
+
scaleX,
|
533
|
+
scaleY);
|
534
|
+
};
|
535
|
+
|
536
|
+
/**
|
537
|
+
* Request a particular piece of imagery from the imagery provider. This method handles raising an
|
538
|
+
* error event if the request fails, and retrying the request if necessary.
|
539
|
+
*
|
540
|
+
* @memberof ImageryLayer
|
541
|
+
* @private
|
542
|
+
*
|
543
|
+
* @param {Imagery} imagery The imagery to request.
|
544
|
+
*/
|
545
|
+
ImageryLayer.prototype._requestImagery = function(imagery) {
|
546
|
+
var imageryProvider = this._imageryProvider;
|
547
|
+
|
548
|
+
var that = this;
|
549
|
+
|
550
|
+
function success(image) {
|
551
|
+
if (typeof image === 'undefined') {
|
552
|
+
return failure();
|
553
|
+
}
|
554
|
+
|
555
|
+
imagery.image = image;
|
556
|
+
imagery.state = ImageryState.RECEIVED;
|
557
|
+
|
558
|
+
ImageryProviderError.handleSuccess(that._requestImageError);
|
559
|
+
}
|
560
|
+
|
561
|
+
function failure(e) {
|
562
|
+
// Initially assume failure. handleError may retry, in which case the state will
|
563
|
+
// change to TRANSITIONING.
|
564
|
+
imagery.state = ImageryState.FAILED;
|
565
|
+
|
566
|
+
var message = 'Failed to obtain image tile X: ' + imagery.x + ' Y: ' + imagery.y + ' Level: ' + imagery.level + '.';
|
567
|
+
that._requestImageError = ImageryProviderError.handleError(
|
568
|
+
that._requestImageError,
|
569
|
+
imageryProvider,
|
570
|
+
imageryProvider.getErrorEvent(),
|
571
|
+
message,
|
572
|
+
imagery.x, imagery.y, imagery.level,
|
573
|
+
doRequest);
|
574
|
+
}
|
575
|
+
|
576
|
+
function doRequest() {
|
577
|
+
imagery.state = ImageryState.TRANSITIONING;
|
578
|
+
var imagePromise = imageryProvider.requestImage(imagery.x, imagery.y, imagery.level);
|
579
|
+
|
580
|
+
if (typeof imagePromise === 'undefined') {
|
581
|
+
// Too many parallel requests, so postpone loading tile.
|
582
|
+
imagery.state = ImageryState.UNLOADED;
|
583
|
+
return;
|
584
|
+
}
|
585
|
+
|
586
|
+
when(imagePromise, success, failure);
|
587
|
+
}
|
588
|
+
|
589
|
+
doRequest();
|
590
|
+
};
|
591
|
+
|
592
|
+
/**
|
593
|
+
* Create a WebGL texture for a given {@link Imagery} instance.
|
594
|
+
*
|
595
|
+
* @memberof ImageryLayer
|
596
|
+
* @private
|
597
|
+
*
|
598
|
+
* @param {Context} context The rendered context to use to create textures.
|
599
|
+
* @param {Imagery} imagery The imagery for which to create a texture.
|
600
|
+
*/
|
601
|
+
ImageryLayer.prototype._createTexture = function(context, imagery) {
|
602
|
+
var imageryProvider = this._imageryProvider;
|
603
|
+
|
604
|
+
// If this imagery provider has a discard policy, use it to check if this
|
605
|
+
// image should be discarded.
|
606
|
+
if (typeof imageryProvider.getTileDiscardPolicy !== 'undefined') {
|
607
|
+
var discardPolicy = imageryProvider.getTileDiscardPolicy();
|
608
|
+
if (typeof discardPolicy !== 'undefined') {
|
609
|
+
// If the discard policy is not ready yet, transition back to the
|
610
|
+
// RECEIVED state and we'll try again next time.
|
611
|
+
if (!discardPolicy.isReady()) {
|
612
|
+
imagery.state = ImageryState.RECEIVED;
|
613
|
+
return;
|
614
|
+
}
|
615
|
+
|
616
|
+
// Mark discarded imagery tiles invalid. Parent imagery will be used instead.
|
617
|
+
if (discardPolicy.shouldDiscardImage(imagery.image)) {
|
618
|
+
imagery.state = ImageryState.INVALID;
|
619
|
+
return;
|
620
|
+
}
|
621
|
+
}
|
622
|
+
}
|
623
|
+
|
624
|
+
// Imagery does not need to be discarded, so upload it to WebGL.
|
625
|
+
var texture = this._texturePool.createTexture2D(context, {
|
626
|
+
source : imagery.image
|
627
|
+
});
|
628
|
+
|
629
|
+
imagery.texture = texture;
|
630
|
+
imagery.image = undefined;
|
631
|
+
imagery.state = ImageryState.TEXTURE_LOADED;
|
632
|
+
};
|
633
|
+
|
634
|
+
/**
|
635
|
+
* Reproject a texture to a {@link GeographicProjection}, if necessary, and generate
|
636
|
+
* mipmaps for the geographic texture.
|
637
|
+
*
|
638
|
+
* @memberof ImageryLayer
|
639
|
+
* @private
|
640
|
+
*
|
641
|
+
* @param {Context} context The rendered context to use.
|
642
|
+
* @param {Imagery} imagery The imagery instance to reproject.
|
643
|
+
*/
|
644
|
+
ImageryLayer.prototype._reprojectTexture = function(context, imagery) {
|
645
|
+
var texture = imagery.texture;
|
646
|
+
var extent = imagery.extent;
|
647
|
+
|
648
|
+
// Reproject this texture if it is not already in a geographic projection and
|
649
|
+
// the pixels are more than 1e-5 radians apart. The pixel spacing cutoff
|
650
|
+
// avoids precision problems in the reprojection transformation while making
|
651
|
+
// no noticeable difference in the georeferencing of the image.
|
652
|
+
if (!(this._imageryProvider.getTilingScheme() instanceof GeographicTilingScheme) &&
|
653
|
+
(extent.east - extent.west) / texture.getWidth() > 1e-5) {
|
654
|
+
var reprojectedTexture = reprojectToGeographic(this, context, texture, imagery.extent);
|
655
|
+
texture.destroy();
|
656
|
+
imagery.texture = texture = reprojectedTexture;
|
657
|
+
}
|
658
|
+
|
659
|
+
// Use mipmaps if this texture has power-of-two dimensions.
|
660
|
+
if (CesiumMath.isPowerOfTwo(texture.getWidth()) && CesiumMath.isPowerOfTwo(texture.getHeight())) {
|
661
|
+
if (typeof this._mipmapSampler === 'undefined') {
|
662
|
+
var maximumSupportedAnisotropy = context.getMaximumTextureFilterAnisotropy();
|
663
|
+
this._mipmapSampler = context.createSampler({
|
664
|
+
wrapS : TextureWrap.CLAMP,
|
665
|
+
wrapT : TextureWrap.CLAMP,
|
666
|
+
minificationFilter : TextureMinificationFilter.LINEAR_MIPMAP_LINEAR,
|
667
|
+
magnificationFilter : TextureMagnificationFilter.LINEAR,
|
668
|
+
maximumAnisotropy : Math.min(maximumSupportedAnisotropy, defaultValue(this._maximumAnisotropy, maximumSupportedAnisotropy))
|
669
|
+
});
|
670
|
+
}
|
671
|
+
texture.generateMipmap(MipmapHint.NICEST);
|
672
|
+
texture.setSampler(this._mipmapSampler);
|
673
|
+
} else {
|
674
|
+
if (typeof this._nonMipmapSampler === 'undefined') {
|
675
|
+
this._nonMipmapSampler = context.createSampler({
|
676
|
+
wrapS : TextureWrap.CLAMP,
|
677
|
+
wrapT : TextureWrap.CLAMP,
|
678
|
+
minificationFilter : TextureMinificationFilter.LINEAR,
|
679
|
+
magnificationFilter : TextureMagnificationFilter.LINEAR
|
680
|
+
});
|
681
|
+
}
|
682
|
+
texture.setSampler(this._nonMipmapSampler);
|
683
|
+
}
|
684
|
+
|
685
|
+
imagery.state = ImageryState.READY;
|
686
|
+
};
|
687
|
+
|
688
|
+
ImageryLayer.prototype.getImageryFromCache = function(x, y, level, imageryExtent) {
|
689
|
+
var cacheKey = getImageryCacheKey(x, y, level);
|
690
|
+
var imagery = this._imageryCache[cacheKey];
|
691
|
+
|
692
|
+
if (typeof imagery === 'undefined') {
|
693
|
+
imagery = new Imagery(this, x, y, level, imageryExtent);
|
694
|
+
this._imageryCache[cacheKey] = imagery;
|
695
|
+
}
|
696
|
+
|
697
|
+
imagery.addReference();
|
698
|
+
return imagery;
|
699
|
+
};
|
700
|
+
|
701
|
+
ImageryLayer.prototype.removeImageryFromCache = function(imagery) {
|
702
|
+
var cacheKey = getImageryCacheKey(imagery.x, imagery.y, imagery.level);
|
703
|
+
delete this._imageryCache[cacheKey];
|
704
|
+
};
|
705
|
+
|
706
|
+
function getImageryCacheKey(x, y, level) {
|
707
|
+
return JSON.stringify([x, y, level]);
|
708
|
+
}
|
709
|
+
|
710
|
+
var uniformMap = {
|
711
|
+
u_textureDimensions : function() {
|
712
|
+
return this.textureDimensions;
|
713
|
+
},
|
714
|
+
u_texture : function() {
|
715
|
+
return this.texture;
|
716
|
+
},
|
717
|
+
u_northLatitude : function() {
|
718
|
+
return this.northLatitude;
|
719
|
+
},
|
720
|
+
u_southLatitude : function() {
|
721
|
+
return this.southLatitude;
|
722
|
+
},
|
723
|
+
u_southMercatorYLow : function() {
|
724
|
+
return this.southMercatorYLow;
|
725
|
+
},
|
726
|
+
u_southMercatorYHigh : function() {
|
727
|
+
return this.southMercatorYHigh;
|
728
|
+
},
|
729
|
+
u_oneOverMercatorHeight : function() {
|
730
|
+
return this.oneOverMercatorHeight;
|
731
|
+
},
|
732
|
+
|
733
|
+
textureDimensions : new Cartesian2(0.0, 0.0),
|
734
|
+
texture : undefined,
|
735
|
+
northLatitude : 0,
|
736
|
+
southLatitude : 0,
|
737
|
+
southMercatorYHigh : 0,
|
738
|
+
southMercatorYLow : 0,
|
739
|
+
oneOverMercatorHeight : 0
|
740
|
+
};
|
741
|
+
|
742
|
+
var float32ArrayScratch = typeof Float32Array === 'undefined' ? undefined : new Float32Array(1);
|
743
|
+
|
744
|
+
function reprojectToGeographic(imageryLayer, context, texture, extent) {
|
745
|
+
if (typeof imageryLayer._fbReproject === 'undefined') {
|
746
|
+
imageryLayer._fbReproject = context.createFramebuffer();
|
747
|
+
imageryLayer._fbReproject.destroyAttachments = false;
|
748
|
+
|
749
|
+
var reprojectMesh = {
|
750
|
+
attributes : {
|
751
|
+
position : {
|
752
|
+
componentDatatype : ComponentDatatype.FLOAT,
|
753
|
+
componentsPerAttribute : 2,
|
754
|
+
values : [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0]
|
755
|
+
}
|
756
|
+
}
|
757
|
+
};
|
758
|
+
|
759
|
+
var reprojectAttribInds = {
|
760
|
+
position : 0
|
761
|
+
};
|
762
|
+
|
763
|
+
imageryLayer._vaReproject = context.createVertexArrayFromMesh({
|
764
|
+
mesh : reprojectMesh,
|
765
|
+
attributeIndices : reprojectAttribInds,
|
766
|
+
bufferUsage : BufferUsage.STATIC_DRAW
|
767
|
+
});
|
768
|
+
|
769
|
+
imageryLayer._spReproject = context.getShaderCache().getShaderProgram(
|
770
|
+
ReprojectWebMercatorVS,
|
771
|
+
ReprojectWebMercatorFS,
|
772
|
+
reprojectAttribInds);
|
773
|
+
|
774
|
+
imageryLayer._rsColor = context.createRenderState();
|
775
|
+
}
|
776
|
+
|
777
|
+
if (typeof imageryLayer._reprojectSampler === 'undefined') {
|
778
|
+
var maximumSupportedAnisotropy = context.getMaximumTextureFilterAnisotropy();
|
779
|
+
imageryLayer._reprojectSampler = context.createSampler({
|
780
|
+
wrapS : TextureWrap.CLAMP,
|
781
|
+
wrapT : TextureWrap.CLAMP,
|
782
|
+
minificationFilter : TextureMinificationFilter.LINEAR,
|
783
|
+
magnificationFilter : TextureMagnificationFilter.LINEAR,
|
784
|
+
maximumAnisotropy : Math.min(maximumSupportedAnisotropy, defaultValue(imageryLayer._maximumAnisotropy, maximumSupportedAnisotropy))
|
785
|
+
});
|
786
|
+
}
|
787
|
+
|
788
|
+
texture.setSampler(imageryLayer._reprojectSampler);
|
789
|
+
|
790
|
+
var width = texture.getWidth();
|
791
|
+
var height = texture.getHeight();
|
792
|
+
|
793
|
+
uniformMap.textureDimensions.x = width;
|
794
|
+
uniformMap.textureDimensions.y = height;
|
795
|
+
uniformMap.texture = texture;
|
796
|
+
|
797
|
+
uniformMap.northLatitude = extent.north;
|
798
|
+
uniformMap.southLatitude = extent.south;
|
799
|
+
|
800
|
+
var sinLatitude = Math.sin(extent.south);
|
801
|
+
var southMercatorY = 0.5 * Math.log((1 + sinLatitude) / (1 - sinLatitude));
|
802
|
+
|
803
|
+
float32ArrayScratch[0] = southMercatorY;
|
804
|
+
uniformMap.southMercatorYHigh = float32ArrayScratch[0];
|
805
|
+
uniformMap.southMercatorYLow = southMercatorY - float32ArrayScratch[0];
|
806
|
+
|
807
|
+
sinLatitude = Math.sin(extent.north);
|
808
|
+
var northMercatorY = 0.5 * Math.log((1 + sinLatitude) / (1 - sinLatitude));
|
809
|
+
uniformMap.oneOverMercatorHeight = 1.0 / (northMercatorY - southMercatorY);
|
810
|
+
|
811
|
+
var outputTexture = imageryLayer._texturePool.createTexture2D(context, {
|
812
|
+
width : width,
|
813
|
+
height : height,
|
814
|
+
pixelFormat : texture.getPixelFormat(),
|
815
|
+
pixelDatatype : texture.getPixelDatatype(),
|
816
|
+
preMultiplyAlpha : texture.getPreMultiplyAlpha()
|
817
|
+
});
|
818
|
+
|
819
|
+
// Allocate memory for the mipmaps. Failure to do this before rendering
|
820
|
+
// to the texture via the FBO, and calling generateMipmap later,
|
821
|
+
// will result in the texture appearing blank. I can't pretend to
|
822
|
+
// understand exactly why this is.
|
823
|
+
outputTexture.generateMipmap(MipmapHint.NICEST);
|
824
|
+
|
825
|
+
imageryLayer._fbReproject.setColorTexture(outputTexture);
|
826
|
+
|
827
|
+
context.clear(context.createClearState({
|
828
|
+
framebuffer : imageryLayer._fbReproject,
|
829
|
+
color : new Color(0.0, 0.0, 0.0, 0.0)
|
830
|
+
}));
|
831
|
+
|
832
|
+
var renderState = imageryLayer._rsColor;
|
833
|
+
var viewport = renderState.viewport;
|
834
|
+
if (typeof viewport === 'undefined') {
|
835
|
+
viewport = new BoundingRectangle();
|
836
|
+
renderState.viewport = viewport;
|
837
|
+
}
|
838
|
+
viewport.width = width;
|
839
|
+
viewport.height = height;
|
840
|
+
|
841
|
+
context.draw({
|
842
|
+
framebuffer : imageryLayer._fbReproject,
|
843
|
+
shaderProgram : imageryLayer._spReproject,
|
844
|
+
renderState : renderState,
|
845
|
+
primitiveType : PrimitiveType.TRIANGLE_FAN,
|
846
|
+
vertexArray : imageryLayer._vaReproject,
|
847
|
+
uniformMap : uniformMap
|
848
|
+
});
|
849
|
+
|
850
|
+
return outputTexture;
|
851
|
+
}
|
852
|
+
|
853
|
+
/**
|
854
|
+
* Gets the level with the specified world coordinate spacing between texels, or less.
|
855
|
+
*
|
856
|
+
* @param {Number} texelSpacing The texel spacing for which to find a corresponding level.
|
857
|
+
* @param {Number} latitudeClosestToEquator The latitude closest to the equator that we're concerned with.
|
858
|
+
* @returns {Number} The level with the specified texel spacing or less.
|
859
|
+
*/
|
860
|
+
function getLevelWithMaximumTexelSpacing(layer, texelSpacing, latitudeClosestToEquator) {
|
861
|
+
// PERFORMANCE_IDEA: factor out the stuff that doesn't change.
|
862
|
+
var imageryProvider = layer._imageryProvider;
|
863
|
+
var tilingScheme = imageryProvider.getTilingScheme();
|
864
|
+
var ellipsoid = tilingScheme.getEllipsoid();
|
865
|
+
var latitudeFactor = Math.cos(latitudeClosestToEquator);
|
866
|
+
var tilingSchemeExtent = tilingScheme.getExtent();
|
867
|
+
var levelZeroMaximumTexelSpacing = ellipsoid.getMaximumRadius() * (tilingSchemeExtent.east - tilingSchemeExtent.west) * latitudeFactor / (imageryProvider.getTileWidth() * tilingScheme.getNumberOfXTilesAtLevel(0));
|
868
|
+
|
869
|
+
var twoToTheLevelPower = levelZeroMaximumTexelSpacing / texelSpacing;
|
870
|
+
var level = Math.log(twoToTheLevelPower) / Math.log(2);
|
871
|
+
var rounded = Math.round(level);
|
872
|
+
return rounded | 0;
|
873
|
+
}
|
874
|
+
|
875
|
+
return ImageryLayer;
|
876
|
+
});
|