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.
Files changed (491) hide show
  1. data/LICENSE.md +259 -0
  2. data/README.rdoc +90 -0
  3. data/Rakefile +40 -0
  4. data/app/assets/javascripts/Assets/Assets.profile.js +8 -0
  5. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
  6. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
  7. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
  8. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
  9. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
  10. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
  11. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
  12. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
  13. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
  14. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
  15. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
  16. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
  17. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
  18. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
  19. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
  20. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
  21. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
  22. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
  23. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
  24. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
  25. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
  26. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
  27. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
  28. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
  29. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
  30. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
  31. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
  32. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
  33. data/app/assets/javascripts/Assets/Textures/NE2_LR_LC_SR_W_DR_2048.jpg +0 -0
  34. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
  35. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
  36. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
  37. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
  38. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
  39. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
  40. data/app/assets/javascripts/Assets/Textures/waterNormals.jpg +0 -0
  41. data/app/assets/javascripts/Assets/package.json +6 -0
  42. data/app/assets/javascripts/Cesium.js +320 -0
  43. data/app/assets/javascripts/Core/AnimationController.js +148 -0
  44. data/app/assets/javascripts/Core/AxisAlignedBoundingBox.js +243 -0
  45. data/app/assets/javascripts/Core/BoundingRectangle.js +364 -0
  46. data/app/assets/javascripts/Core/BoundingSphere.js +819 -0
  47. data/app/assets/javascripts/Core/BoxTessellator.js +93 -0
  48. data/app/assets/javascripts/Core/Cartesian2.js +762 -0
  49. data/app/assets/javascripts/Core/Cartesian3.js +861 -0
  50. data/app/assets/javascripts/Core/Cartesian4.js +762 -0
  51. data/app/assets/javascripts/Core/Cartographic.js +211 -0
  52. data/app/assets/javascripts/Core/CatmullRomSpline.js +232 -0
  53. data/app/assets/javascripts/Core/Clock.js +195 -0
  54. data/app/assets/javascripts/Core/ClockRange.js +37 -0
  55. data/app/assets/javascripts/Core/ClockStep.js +32 -0
  56. data/app/assets/javascripts/Core/Color.js +1629 -0
  57. data/app/assets/javascripts/Core/ComponentDatatype.js +119 -0
  58. data/app/assets/javascripts/Core/Core.profile.js +8 -0
  59. data/app/assets/javascripts/Core/CubeMapEllipsoidTessellator.js +198 -0
  60. data/app/assets/javascripts/Core/CubicRealPolynomial.js +251 -0
  61. data/app/assets/javascripts/Core/DefaultProxy.js +30 -0
  62. data/app/assets/javascripts/Core/DeveloperError.js +60 -0
  63. data/app/assets/javascripts/Core/EarthOrientationParameters.js +383 -0
  64. data/app/assets/javascripts/Core/EarthOrientationParametersSample.js +50 -0
  65. data/app/assets/javascripts/Core/Ellipsoid.js +539 -0
  66. data/app/assets/javascripts/Core/EllipsoidTangentPlane.js +207 -0
  67. data/app/assets/javascripts/Core/EllipsoidalOccluder.js +151 -0
  68. data/app/assets/javascripts/Core/EncodedCartesian3.js +197 -0
  69. data/app/assets/javascripts/Core/Enumeration.js +67 -0
  70. data/app/assets/javascripts/Core/Event.js +122 -0
  71. data/app/assets/javascripts/Core/Extent.js +383 -0
  72. data/app/assets/javascripts/Core/ExtentTessellator.js +384 -0
  73. data/app/assets/javascripts/Core/FAR.js +13 -0
  74. data/app/assets/javascripts/Core/FeatureDetection.js +126 -0
  75. data/app/assets/javascripts/Core/Fullscreen.js +235 -0
  76. data/app/assets/javascripts/Core/GeographicProjection.js +107 -0
  77. data/app/assets/javascripts/Core/HermitePolynomialApproximation.js +176 -0
  78. data/app/assets/javascripts/Core/HermiteSpline.js +234 -0
  79. data/app/assets/javascripts/Core/Iau2006XysData.js +259 -0
  80. data/app/assets/javascripts/Core/Iau2006XysSample.js +36 -0
  81. data/app/assets/javascripts/Core/IndexDatatype.js +28 -0
  82. data/app/assets/javascripts/Core/Intersect.js +40 -0
  83. data/app/assets/javascripts/Core/IntersectionTests.js +359 -0
  84. data/app/assets/javascripts/Core/Interval.js +27 -0
  85. data/app/assets/javascripts/Core/Iso8601.js +46 -0
  86. data/app/assets/javascripts/Core/JulianDate.js +1228 -0
  87. data/app/assets/javascripts/Core/KeyboardEventModifier.js +38 -0
  88. data/app/assets/javascripts/Core/LagrangePolynomialApproximation.js +96 -0
  89. data/app/assets/javascripts/Core/LeapSecond.js +158 -0
  90. data/app/assets/javascripts/Core/LinearApproximation.js +98 -0
  91. data/app/assets/javascripts/Core/Math.js +532 -0
  92. data/app/assets/javascripts/Core/Matrix2.js +833 -0
  93. data/app/assets/javascripts/Core/Matrix3.js +1099 -0
  94. data/app/assets/javascripts/Core/Matrix4.js +2164 -0
  95. data/app/assets/javascripts/Core/MeshFilters.js +568 -0
  96. data/app/assets/javascripts/Core/Occluder.js +474 -0
  97. data/app/assets/javascripts/Core/OrientationInterpolator.js +109 -0
  98. data/app/assets/javascripts/Core/PlaneTessellator.js +74 -0
  99. data/app/assets/javascripts/Core/PolygonPipeline.js +792 -0
  100. data/app/assets/javascripts/Core/PolylinePipeline.js +90 -0
  101. data/app/assets/javascripts/Core/PrimitiveType.js +80 -0
  102. data/app/assets/javascripts/Core/QuadraticRealPolynomial.js +146 -0
  103. data/app/assets/javascripts/Core/QuarticRealPolynomial.js +339 -0
  104. data/app/assets/javascripts/Core/Quaternion.js +947 -0
  105. data/app/assets/javascripts/Core/Queue.js +95 -0
  106. data/app/assets/javascripts/Core/Ray.js +64 -0
  107. data/app/assets/javascripts/Core/ReferenceFrame.js +25 -0
  108. data/app/assets/javascripts/Core/RequestErrorEvent.js +35 -0
  109. data/app/assets/javascripts/Core/RuntimeError.js +59 -0
  110. data/app/assets/javascripts/Core/ScreenSpaceEventHandler.js +658 -0
  111. data/app/assets/javascripts/Core/ScreenSpaceEventType.js +149 -0
  112. data/app/assets/javascripts/Core/Shapes.js +230 -0
  113. data/app/assets/javascripts/Core/Spherical.js +192 -0
  114. data/app/assets/javascripts/Core/TaskProcessor.js +131 -0
  115. data/app/assets/javascripts/Core/TimeConstants.js +85 -0
  116. data/app/assets/javascripts/Core/TimeInterval.js +305 -0
  117. data/app/assets/javascripts/Core/TimeIntervalCollection.js +543 -0
  118. data/app/assets/javascripts/Core/TimeStandard.js +31 -0
  119. data/app/assets/javascripts/Core/Tipsify.js +285 -0
  120. data/app/assets/javascripts/Core/Transforms.js +614 -0
  121. data/app/assets/javascripts/Core/TridiagonalSystemSolver.js +102 -0
  122. data/app/assets/javascripts/Core/Visibility.js +38 -0
  123. data/app/assets/javascripts/Core/WebMercatorProjection.js +154 -0
  124. data/app/assets/javascripts/Core/WindingOrder.js +40 -0
  125. data/app/assets/javascripts/Core/binarySearch.js +69 -0
  126. data/app/assets/javascripts/Core/buildModuleUrl.js +77 -0
  127. data/app/assets/javascripts/Core/clone.js +21 -0
  128. data/app/assets/javascripts/Core/combine.js +81 -0
  129. data/app/assets/javascripts/Core/computeSunPosition.js +116 -0
  130. data/app/assets/javascripts/Core/createGuid.js +25 -0
  131. data/app/assets/javascripts/Core/defaultValue.js +22 -0
  132. data/app/assets/javascripts/Core/destroyObject.js +61 -0
  133. data/app/assets/javascripts/Core/freezeObject.js +20 -0
  134. data/app/assets/javascripts/Core/getImagePixels.js +46 -0
  135. data/app/assets/javascripts/Core/isLeapYear.js +30 -0
  136. data/app/assets/javascripts/Core/jsonp.js +116 -0
  137. data/app/assets/javascripts/Core/loadArrayBuffer.js +76 -0
  138. data/app/assets/javascripts/Core/loadImage.js +85 -0
  139. data/app/assets/javascripts/Core/loadJson.js +54 -0
  140. data/app/assets/javascripts/Core/loadText.js +78 -0
  141. data/app/assets/javascripts/Core/loadXML.js +76 -0
  142. data/app/assets/javascripts/Core/package.json +6 -0
  143. data/app/assets/javascripts/Core/pointInsideTriangle2D.js +41 -0
  144. data/app/assets/javascripts/Core/requestAnimationFrame.js +61 -0
  145. data/app/assets/javascripts/Core/throttleRequestByServer.js +74 -0
  146. data/app/assets/javascripts/Core/writeTextToCanvas.js +92 -0
  147. data/app/assets/javascripts/DynamicScene/CompositeDynamicObjectCollection.js +254 -0
  148. data/app/assets/javascripts/DynamicScene/CzmlBoolean.js +57 -0
  149. data/app/assets/javascripts/DynamicScene/CzmlCartesian2.js +96 -0
  150. data/app/assets/javascripts/DynamicScene/CzmlCartesian3.js +99 -0
  151. data/app/assets/javascripts/DynamicScene/CzmlCartographic.js +125 -0
  152. data/app/assets/javascripts/DynamicScene/CzmlColor.js +127 -0
  153. data/app/assets/javascripts/DynamicScene/CzmlDefaults.js +135 -0
  154. data/app/assets/javascripts/DynamicScene/CzmlHorizontalOrigin.js +59 -0
  155. data/app/assets/javascripts/DynamicScene/CzmlImage.js +61 -0
  156. data/app/assets/javascripts/DynamicScene/CzmlLabelStyle.js +59 -0
  157. data/app/assets/javascripts/DynamicScene/CzmlNumber.js +82 -0
  158. data/app/assets/javascripts/DynamicScene/CzmlString.js +56 -0
  159. data/app/assets/javascripts/DynamicScene/CzmlUnitCartesian3.js +99 -0
  160. data/app/assets/javascripts/DynamicScene/CzmlUnitQuaternion.js +172 -0
  161. data/app/assets/javascripts/DynamicScene/CzmlUnitSpherical.js +98 -0
  162. data/app/assets/javascripts/DynamicScene/CzmlVerticalOrigin.js +59 -0
  163. data/app/assets/javascripts/DynamicScene/DynamicBillboard.js +245 -0
  164. data/app/assets/javascripts/DynamicScene/DynamicBillboardVisualizer.js +347 -0
  165. data/app/assets/javascripts/DynamicScene/DynamicColorMaterial.js +78 -0
  166. data/app/assets/javascripts/DynamicScene/DynamicCone.js +291 -0
  167. data/app/assets/javascripts/DynamicScene/DynamicConeVisualizer.js +350 -0
  168. data/app/assets/javascripts/DynamicScene/DynamicConeVisualizerUsingCustomSensor.js +389 -0
  169. data/app/assets/javascripts/DynamicScene/DynamicDirectionsProperty.js +163 -0
  170. data/app/assets/javascripts/DynamicScene/DynamicEllipsoid.js +158 -0
  171. data/app/assets/javascripts/DynamicScene/DynamicEllipsoidVisualizer.js +277 -0
  172. data/app/assets/javascripts/DynamicScene/DynamicImageMaterial.js +136 -0
  173. data/app/assets/javascripts/DynamicScene/DynamicLabel.js +286 -0
  174. data/app/assets/javascripts/DynamicScene/DynamicLabelVisualizer.js +341 -0
  175. data/app/assets/javascripts/DynamicScene/DynamicMaterialProperty.js +125 -0
  176. data/app/assets/javascripts/DynamicScene/DynamicObject.js +364 -0
  177. data/app/assets/javascripts/DynamicScene/DynamicObjectCollection.js +137 -0
  178. data/app/assets/javascripts/DynamicScene/DynamicObjectView.js +299 -0
  179. data/app/assets/javascripts/DynamicScene/DynamicPath.js +214 -0
  180. data/app/assets/javascripts/DynamicScene/DynamicPathVisualizer.js +402 -0
  181. data/app/assets/javascripts/DynamicScene/DynamicPoint.js +184 -0
  182. data/app/assets/javascripts/DynamicScene/DynamicPointVisualizer.js +323 -0
  183. data/app/assets/javascripts/DynamicScene/DynamicPolygon.js +138 -0
  184. data/app/assets/javascripts/DynamicScene/DynamicPolygonVisualizer.js +251 -0
  185. data/app/assets/javascripts/DynamicScene/DynamicPolyline.js +183 -0
  186. data/app/assets/javascripts/DynamicScene/DynamicPolylineVisualizer.js +268 -0
  187. data/app/assets/javascripts/DynamicScene/DynamicPositionProperty.js +525 -0
  188. data/app/assets/javascripts/DynamicScene/DynamicProperty.js +352 -0
  189. data/app/assets/javascripts/DynamicScene/DynamicPyramid.js +204 -0
  190. data/app/assets/javascripts/DynamicScene/DynamicPyramidVisualizer.js +302 -0
  191. data/app/assets/javascripts/DynamicScene/DynamicScene.profile.js +8 -0
  192. data/app/assets/javascripts/DynamicScene/DynamicVertexPositionsProperty.js +199 -0
  193. data/app/assets/javascripts/DynamicScene/ReferenceProperty.js +155 -0
  194. data/app/assets/javascripts/DynamicScene/VisualizerCollection.js +181 -0
  195. data/app/assets/javascripts/DynamicScene/package.json +6 -0
  196. data/app/assets/javascripts/DynamicScene/processCzml.js +77 -0
  197. data/app/assets/javascripts/Renderer/BlendEquation.js +52 -0
  198. data/app/assets/javascripts/Renderer/BlendFunction.js +158 -0
  199. data/app/assets/javascripts/Renderer/BlendingState.js +64 -0
  200. data/app/assets/javascripts/Renderer/Buffer.js +141 -0
  201. data/app/assets/javascripts/Renderer/BufferUsage.js +48 -0
  202. data/app/assets/javascripts/Renderer/ClearCommand.js +40 -0
  203. data/app/assets/javascripts/Renderer/CommandLists.js +42 -0
  204. data/app/assets/javascripts/Renderer/Context.js +2805 -0
  205. data/app/assets/javascripts/Renderer/CubeMap.js +358 -0
  206. data/app/assets/javascripts/Renderer/CubeMapFace.js +202 -0
  207. data/app/assets/javascripts/Renderer/CullFace.js +50 -0
  208. data/app/assets/javascripts/Renderer/DepthFunction.js +95 -0
  209. data/app/assets/javascripts/Renderer/DrawCommand.js +96 -0
  210. data/app/assets/javascripts/Renderer/Framebuffer.js +435 -0
  211. data/app/assets/javascripts/Renderer/MipmapHint.js +50 -0
  212. data/app/assets/javascripts/Renderer/PickFramebuffer.js +178 -0
  213. data/app/assets/javascripts/Renderer/PixelDatatype.js +86 -0
  214. data/app/assets/javascripts/Renderer/PixelFormat.js +113 -0
  215. data/app/assets/javascripts/Renderer/Renderbuffer.js +102 -0
  216. data/app/assets/javascripts/Renderer/RenderbufferFormat.js +77 -0
  217. data/app/assets/javascripts/Renderer/Renderer.profile.js +8 -0
  218. data/app/assets/javascripts/Renderer/ShaderCache.js +121 -0
  219. data/app/assets/javascripts/Renderer/ShaderProgram.js +2402 -0
  220. data/app/assets/javascripts/Renderer/StencilFunction.js +95 -0
  221. data/app/assets/javascripts/Renderer/StencilOperation.js +95 -0
  222. data/app/assets/javascripts/Renderer/Texture.js +395 -0
  223. data/app/assets/javascripts/Renderer/TextureAtlas.js +472 -0
  224. data/app/assets/javascripts/Renderer/TextureAtlasBuilder.js +133 -0
  225. data/app/assets/javascripts/Renderer/TextureMagnificationFilter.js +41 -0
  226. data/app/assets/javascripts/Renderer/TextureMinificationFilter.js +77 -0
  227. data/app/assets/javascripts/Renderer/TextureWrap.js +50 -0
  228. data/app/assets/javascripts/Renderer/UniformDatatype.js +218 -0
  229. data/app/assets/javascripts/Renderer/UniformState.js +799 -0
  230. data/app/assets/javascripts/Renderer/VertexArray.js +365 -0
  231. data/app/assets/javascripts/Renderer/VertexArrayFacade.js +574 -0
  232. data/app/assets/javascripts/Renderer/VertexLayout.js +49 -0
  233. data/app/assets/javascripts/Renderer/loadCubeMap.js +92 -0
  234. data/app/assets/javascripts/Renderer/package.json +6 -0
  235. data/app/assets/javascripts/Scene/AnimationCollection.js +249 -0
  236. data/app/assets/javascripts/Scene/ArcGisMapServerImageryProvider.js +384 -0
  237. data/app/assets/javascripts/Scene/Billboard.js +680 -0
  238. data/app/assets/javascripts/Scene/BillboardCollection.js +1209 -0
  239. data/app/assets/javascripts/Scene/BingMapsImageryProvider.js +460 -0
  240. data/app/assets/javascripts/Scene/BingMapsStyle.js +55 -0
  241. data/app/assets/javascripts/Scene/Camera.js +358 -0
  242. data/app/assets/javascripts/Scene/CameraColumbusViewMode.js +30 -0
  243. data/app/assets/javascripts/Scene/CameraController.js +1258 -0
  244. data/app/assets/javascripts/Scene/CameraEventAggregator.js +270 -0
  245. data/app/assets/javascripts/Scene/CameraEventType.js +53 -0
  246. data/app/assets/javascripts/Scene/CameraFlightPath.js +495 -0
  247. data/app/assets/javascripts/Scene/CentralBody.js +817 -0
  248. data/app/assets/javascripts/Scene/CentralBodySurface.js +1120 -0
  249. data/app/assets/javascripts/Scene/CentralBodySurfaceShaderSet.js +107 -0
  250. data/app/assets/javascripts/Scene/ComplexConicSensorVolume.js +511 -0
  251. data/app/assets/javascripts/Scene/CompositePrimitive.js +454 -0
  252. data/app/assets/javascripts/Scene/CullingVolume.js +59 -0
  253. data/app/assets/javascripts/Scene/CustomSensorVolume.js +440 -0
  254. data/app/assets/javascripts/Scene/DiscardMissingTileImagePolicy.js +134 -0
  255. data/app/assets/javascripts/Scene/EllipsoidPrimitive.js +412 -0
  256. data/app/assets/javascripts/Scene/EllipsoidTerrainProvider.js +182 -0
  257. data/app/assets/javascripts/Scene/FrameState.js +86 -0
  258. data/app/assets/javascripts/Scene/FrustumCommands.js +32 -0
  259. data/app/assets/javascripts/Scene/GeographicTilingScheme.js +265 -0
  260. data/app/assets/javascripts/Scene/HorizontalOrigin.js +39 -0
  261. data/app/assets/javascripts/Scene/Imagery.js +85 -0
  262. data/app/assets/javascripts/Scene/ImageryLayer.js +876 -0
  263. data/app/assets/javascripts/Scene/ImageryLayerCollection.js +403 -0
  264. data/app/assets/javascripts/Scene/ImageryProvider.js +185 -0
  265. data/app/assets/javascripts/Scene/ImageryProviderError.js +149 -0
  266. data/app/assets/javascripts/Scene/ImageryState.js +20 -0
  267. data/app/assets/javascripts/Scene/Label.js +706 -0
  268. data/app/assets/javascripts/Scene/LabelCollection.js +697 -0
  269. data/app/assets/javascripts/Scene/LabelStyle.js +39 -0
  270. data/app/assets/javascripts/Scene/Material.js +1177 -0
  271. data/app/assets/javascripts/Scene/NeverTileDiscardPolicy.js +38 -0
  272. data/app/assets/javascripts/Scene/OpenStreetMapImageryProvider.js +282 -0
  273. data/app/assets/javascripts/Scene/OrthographicFrustum.js +345 -0
  274. data/app/assets/javascripts/Scene/PerformanceDisplay.js +183 -0
  275. data/app/assets/javascripts/Scene/PerspectiveFrustum.js +239 -0
  276. data/app/assets/javascripts/Scene/PerspectiveOffCenterFrustum.js +394 -0
  277. data/app/assets/javascripts/Scene/Polygon.js +886 -0
  278. data/app/assets/javascripts/Scene/Polyline.js +441 -0
  279. data/app/assets/javascripts/Scene/PolylineCollection.js +1532 -0
  280. data/app/assets/javascripts/Scene/Projections.js +93 -0
  281. data/app/assets/javascripts/Scene/RectangularPyramidSensorVolume.js +224 -0
  282. data/app/assets/javascripts/Scene/Scene.js +632 -0
  283. data/app/assets/javascripts/Scene/Scene.profile.js +8 -0
  284. data/app/assets/javascripts/Scene/SceneMode.js +51 -0
  285. data/app/assets/javascripts/Scene/SceneTransitioner.js +776 -0
  286. data/app/assets/javascripts/Scene/ScreenSpaceCameraController.js +1063 -0
  287. data/app/assets/javascripts/Scene/SensorVolumeCollection.js +192 -0
  288. data/app/assets/javascripts/Scene/SingleTileImageryProvider.js +295 -0
  289. data/app/assets/javascripts/Scene/SkyAtmosphere.js +239 -0
  290. data/app/assets/javascripts/Scene/SkyBox.js +231 -0
  291. data/app/assets/javascripts/Scene/TerrainProvider.js +229 -0
  292. data/app/assets/javascripts/Scene/TexturePool.js +154 -0
  293. data/app/assets/javascripts/Scene/Tile.js +322 -0
  294. data/app/assets/javascripts/Scene/TileDiscardPolicy.js +42 -0
  295. data/app/assets/javascripts/Scene/TileImagery.js +36 -0
  296. data/app/assets/javascripts/Scene/TileLoadQueue.js +123 -0
  297. data/app/assets/javascripts/Scene/TileMapServiceImageryProvider.js +337 -0
  298. data/app/assets/javascripts/Scene/TileReplacementQueue.js +139 -0
  299. data/app/assets/javascripts/Scene/TileState.js +19 -0
  300. data/app/assets/javascripts/Scene/TilingScheme.js +213 -0
  301. data/app/assets/javascripts/Scene/VerticalOrigin.js +39 -0
  302. data/app/assets/javascripts/Scene/ViewportQuad.js +256 -0
  303. data/app/assets/javascripts/Scene/WebMapServiceImageryProvider.js +374 -0
  304. data/app/assets/javascripts/Scene/WebMercatorTilingScheme.js +291 -0
  305. data/app/assets/javascripts/Scene/package.json +6 -0
  306. data/app/assets/javascripts/Shaders/BillboardCollectionFS.glsl +30 -0
  307. data/app/assets/javascripts/Shaders/BillboardCollectionFS.js +31 -0
  308. data/app/assets/javascripts/Shaders/BillboardCollectionVS.glsl +68 -0
  309. data/app/assets/javascripts/Shaders/BillboardCollectionVS.js +54 -0
  310. data/app/assets/javascripts/Shaders/BuiltinFunctions.glsl +927 -0
  311. data/app/assets/javascripts/Shaders/BuiltinFunctions.js +322 -0
  312. data/app/assets/javascripts/Shaders/CentralBodyFS.glsl +106 -0
  313. data/app/assets/javascripts/Shaders/CentralBodyFS.js +82 -0
  314. data/app/assets/javascripts/Shaders/CentralBodyFSDepth.glsl +20 -0
  315. data/app/assets/javascripts/Shaders/CentralBodyFSDepth.js +22 -0
  316. data/app/assets/javascripts/Shaders/CentralBodyFSPole.glsl +29 -0
  317. data/app/assets/javascripts/Shaders/CentralBodyFSPole.js +28 -0
  318. data/app/assets/javascripts/Shaders/CentralBodyVS.glsl +88 -0
  319. data/app/assets/javascripts/Shaders/CentralBodyVS.js +69 -0
  320. data/app/assets/javascripts/Shaders/CentralBodyVSDepth.glsl +9 -0
  321. data/app/assets/javascripts/Shaders/CentralBodyVSDepth.js +13 -0
  322. data/app/assets/javascripts/Shaders/CentralBodyVSPole.glsl +12 -0
  323. data/app/assets/javascripts/Shaders/CentralBodyVSPole.js +15 -0
  324. data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeFS.glsl +448 -0
  325. data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeFS.js +361 -0
  326. data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeVS.glsl +19 -0
  327. data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeVS.js +20 -0
  328. data/app/assets/javascripts/Shaders/ConstructiveSolidGeometry.glsl +886 -0
  329. data/app/assets/javascripts/Shaders/ConstructiveSolidGeometry.js +586 -0
  330. data/app/assets/javascripts/Shaders/CustomSensorVolumeFS.glsl +126 -0
  331. data/app/assets/javascripts/Shaders/CustomSensorVolumeFS.js +95 -0
  332. data/app/assets/javascripts/Shaders/CustomSensorVolumeVS.glsl +14 -0
  333. data/app/assets/javascripts/Shaders/CustomSensorVolumeVS.js +18 -0
  334. data/app/assets/javascripts/Shaders/EllipsoidFS.glsl +40 -0
  335. data/app/assets/javascripts/Shaders/EllipsoidFS.js +38 -0
  336. data/app/assets/javascripts/Shaders/EllipsoidVS.glsl +26 -0
  337. data/app/assets/javascripts/Shaders/EllipsoidVS.js +16 -0
  338. data/app/assets/javascripts/Shaders/Materials/AsphaltMaterial.glsl +25 -0
  339. data/app/assets/javascripts/Shaders/Materials/AsphaltMaterial.js +23 -0
  340. data/app/assets/javascripts/Shaders/Materials/BlobMaterial.glsl +18 -0
  341. data/app/assets/javascripts/Shaders/Materials/BlobMaterial.js +19 -0
  342. data/app/assets/javascripts/Shaders/Materials/BrickMaterial.glsl +42 -0
  343. data/app/assets/javascripts/Shaders/Materials/BrickMaterial.js +36 -0
  344. data/app/assets/javascripts/Shaders/Materials/BumpMapMaterial.glsl +29 -0
  345. data/app/assets/javascripts/Shaders/Materials/BumpMapMaterial.js +27 -0
  346. data/app/assets/javascripts/Shaders/Materials/CementMaterial.glsl +19 -0
  347. data/app/assets/javascripts/Shaders/Materials/CementMaterial.js +20 -0
  348. data/app/assets/javascripts/Shaders/Materials/CheckerboardMaterial.glsl +38 -0
  349. data/app/assets/javascripts/Shaders/Materials/CheckerboardMaterial.js +32 -0
  350. data/app/assets/javascripts/Shaders/Materials/DotMaterial.glsl +17 -0
  351. data/app/assets/javascripts/Shaders/Materials/DotMaterial.js +18 -0
  352. data/app/assets/javascripts/Shaders/Materials/ErosionMaterial.glsl +23 -0
  353. data/app/assets/javascripts/Shaders/Materials/ErosionMaterial.js +24 -0
  354. data/app/assets/javascripts/Shaders/Materials/FacetMaterial.glsl +18 -0
  355. data/app/assets/javascripts/Shaders/Materials/FacetMaterial.js +19 -0
  356. data/app/assets/javascripts/Shaders/Materials/FresnelMaterial.glsl +12 -0
  357. data/app/assets/javascripts/Shaders/Materials/FresnelMaterial.js +15 -0
  358. data/app/assets/javascripts/Shaders/Materials/GrassMaterial.glsl +28 -0
  359. data/app/assets/javascripts/Shaders/Materials/GrassMaterial.js +26 -0
  360. data/app/assets/javascripts/Shaders/Materials/NormalMapMaterial.glsl +19 -0
  361. data/app/assets/javascripts/Shaders/Materials/NormalMapMaterial.js +21 -0
  362. data/app/assets/javascripts/Shaders/Materials/ReflectionMaterial.glsl +13 -0
  363. data/app/assets/javascripts/Shaders/Materials/ReflectionMaterial.js +16 -0
  364. data/app/assets/javascripts/Shaders/Materials/RefractionMaterial.glsl +14 -0
  365. data/app/assets/javascripts/Shaders/Materials/RefractionMaterial.js +17 -0
  366. data/app/assets/javascripts/Shaders/Materials/RimLightingMaterial.glsl +18 -0
  367. data/app/assets/javascripts/Shaders/Materials/RimLightingMaterial.js +19 -0
  368. data/app/assets/javascripts/Shaders/Materials/StripeMaterial.glsl +29 -0
  369. data/app/assets/javascripts/Shaders/Materials/StripeMaterial.js +26 -0
  370. data/app/assets/javascripts/Shaders/Materials/TieDyeMaterial.glsl +17 -0
  371. data/app/assets/javascripts/Shaders/Materials/TieDyeMaterial.js +19 -0
  372. data/app/assets/javascripts/Shaders/Materials/Water.glsl +91 -0
  373. data/app/assets/javascripts/Shaders/Materials/Water.js +60 -0
  374. data/app/assets/javascripts/Shaders/Materials/WoodMaterial.glsl +36 -0
  375. data/app/assets/javascripts/Shaders/Materials/WoodMaterial.js +31 -0
  376. data/app/assets/javascripts/Shaders/Noise.glsl +453 -0
  377. data/app/assets/javascripts/Shaders/Noise.js +242 -0
  378. data/app/assets/javascripts/Shaders/PolygonFS.glsl +27 -0
  379. data/app/assets/javascripts/Shaders/PolygonFS.js +23 -0
  380. data/app/assets/javascripts/Shaders/PolygonFSPick.glsl +6 -0
  381. data/app/assets/javascripts/Shaders/PolygonFSPick.js +11 -0
  382. data/app/assets/javascripts/Shaders/PolygonVS.glsl +38 -0
  383. data/app/assets/javascripts/Shaders/PolygonVS.js +39 -0
  384. data/app/assets/javascripts/Shaders/PolygonVSPick.glsl +30 -0
  385. data/app/assets/javascripts/Shaders/PolygonVSPick.js +32 -0
  386. data/app/assets/javascripts/Shaders/PolylineFS.glsl +6 -0
  387. data/app/assets/javascripts/Shaders/PolylineFS.js +11 -0
  388. data/app/assets/javascripts/Shaders/PolylineVS.glsl +34 -0
  389. data/app/assets/javascripts/Shaders/PolylineVS.js +35 -0
  390. data/app/assets/javascripts/Shaders/Ray.glsl +532 -0
  391. data/app/assets/javascripts/Shaders/Ray.js +357 -0
  392. data/app/assets/javascripts/Shaders/ReprojectWebMercatorFS.glsl +26 -0
  393. data/app/assets/javascripts/Shaders/ReprojectWebMercatorFS.js +22 -0
  394. data/app/assets/javascripts/Shaders/ReprojectWebMercatorVS.glsl +11 -0
  395. data/app/assets/javascripts/Shaders/ReprojectWebMercatorVS.js +14 -0
  396. data/app/assets/javascripts/Shaders/SensorVolume.glsl +43 -0
  397. data/app/assets/javascripts/Shaders/SensorVolume.js +31 -0
  398. data/app/assets/javascripts/Shaders/Shaders.profile.js +8 -0
  399. data/app/assets/javascripts/Shaders/SkyAtmosphereFS.glsl +70 -0
  400. data/app/assets/javascripts/Shaders/SkyAtmosphereFS.js +62 -0
  401. data/app/assets/javascripts/Shaders/SkyAtmosphereVS.glsl +131 -0
  402. data/app/assets/javascripts/Shaders/SkyAtmosphereVS.js +115 -0
  403. data/app/assets/javascripts/Shaders/SkyBoxFS.glsl +10 -0
  404. data/app/assets/javascripts/Shaders/SkyBoxFS.js +14 -0
  405. data/app/assets/javascripts/Shaders/SkyBoxVS.glsl +10 -0
  406. data/app/assets/javascripts/Shaders/SkyBoxVS.js +14 -0
  407. data/app/assets/javascripts/Shaders/ViewportQuadFS.glsl +16 -0
  408. data/app/assets/javascripts/Shaders/ViewportQuadFS.js +17 -0
  409. data/app/assets/javascripts/Shaders/ViewportQuadVS.glsl +10 -0
  410. data/app/assets/javascripts/Shaders/ViewportQuadVS.js +14 -0
  411. data/app/assets/javascripts/Shaders/package.json +6 -0
  412. data/app/assets/javascripts/ThirdParty/ThirdParty.profile.js +8 -0
  413. data/app/assets/javascripts/ThirdParty/Tween.js +678 -0
  414. data/app/assets/javascripts/ThirdParty/Uri.js +277 -0
  415. data/app/assets/javascripts/ThirdParty/measureText.js +197 -0
  416. data/app/assets/javascripts/ThirdParty/package.json +6 -0
  417. data/app/assets/javascripts/ThirdParty/sprintf.js +319 -0
  418. data/app/assets/javascripts/ThirdParty/when.js +748 -0
  419. data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.css +175 -0
  420. data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.html +52 -0
  421. data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.js +1237 -0
  422. data/app/assets/javascripts/Widgets/Dojo/CesiumWidget.html +4 -0
  423. data/app/assets/javascripts/Widgets/Dojo/CesiumWidget.js +349 -0
  424. data/app/assets/javascripts/Widgets/Dojo/TimelineWidget.css +1 -0
  425. data/app/assets/javascripts/Widgets/Dojo/TimelineWidget.js +47 -0
  426. data/app/assets/javascripts/Widgets/Dojo/checkForChromeFrame.js +71 -0
  427. data/app/assets/javascripts/Widgets/Images/Bing_Logo_51x19_White.png +0 -0
  428. data/app/assets/javascripts/Widgets/Images/Cesium_Logo_overlay.png +0 -0
  429. data/app/assets/javascripts/Widgets/Images/TimelineIcons.png +0 -0
  430. data/app/assets/javascripts/Widgets/Images/ajax-loader.gif +0 -0
  431. data/app/assets/javascripts/Widgets/Images/animationBar.png +0 -0
  432. data/app/assets/javascripts/Widgets/Images/viewControlBar.png +0 -0
  433. data/app/assets/javascripts/Widgets/Timeline.css +113 -0
  434. data/app/assets/javascripts/Widgets/Timeline.js +629 -0
  435. data/app/assets/javascripts/Widgets/TimelineHighlightRange.js +51 -0
  436. data/app/assets/javascripts/Widgets/TimelineTrack.js +54 -0
  437. data/app/assets/javascripts/Widgets/Widgets.profile.js +8 -0
  438. data/app/assets/javascripts/Widgets/package.json +6 -0
  439. data/app/assets/javascripts/Workers/Workers.profile.js +8 -0
  440. data/app/assets/javascripts/Workers/cesiumWorkerBootstrapper.js +2015 -0
  441. data/app/assets/javascripts/Workers/createTaskProcessorWorker.js +55 -0
  442. data/app/assets/javascripts/Workers/createVerticesFromExtent.js +24 -0
  443. data/app/assets/javascripts/Workers/package.json +6 -0
  444. data/app/assets/javascripts/copyrightHeader.js +22 -0
  445. data/app/assets/javascripts/main.js +10 -0
  446. data/app/assets/stylesheets/cesium.css +4 -0
  447. data/app/controllers/cesium_controller.rb +4 -0
  448. data/app/helpers/cesium_helper.rb +2 -0
  449. data/app/views/cesium/index.html.erb +3 -0
  450. data/config/routes.rb +3 -0
  451. data/lib/cesium.rb +4 -0
  452. data/lib/cesium/engine.rb +4 -0
  453. data/lib/cesium/version.rb +3 -0
  454. data/lib/tasks/cesium_tasks.rake +4 -0
  455. data/test/cesium_test.rb +7 -0
  456. data/test/dummy/README.rdoc +261 -0
  457. data/test/dummy/Rakefile +7 -0
  458. data/test/dummy/app/assets/javascripts/adapters/jquery-adapter.js.coffee +4 -0
  459. data/test/dummy/app/assets/javascripts/app.js.coffee +11 -0
  460. data/test/dummy/app/assets/javascripts/application.js.coffee +73 -0
  461. data/test/dummy/app/assets/stylesheets/application.css +12 -0
  462. data/test/dummy/app/controllers/application_controller.rb +4 -0
  463. data/test/dummy/app/helpers/application_helper.rb +2 -0
  464. data/test/dummy/app/views/layouts/application.html.erb +21 -0
  465. data/test/dummy/config.ru +4 -0
  466. data/test/dummy/config/application.rb +59 -0
  467. data/test/dummy/config/boot.rb +10 -0
  468. data/test/dummy/config/database.yml +25 -0
  469. data/test/dummy/config/environment.rb +5 -0
  470. data/test/dummy/config/environments/development.rb +37 -0
  471. data/test/dummy/config/environments/production.rb +67 -0
  472. data/test/dummy/config/environments/test.rb +37 -0
  473. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  474. data/test/dummy/config/initializers/inflections.rb +15 -0
  475. data/test/dummy/config/initializers/mime_types.rb +5 -0
  476. data/test/dummy/config/initializers/secret_token.rb +7 -0
  477. data/test/dummy/config/initializers/session_store.rb +8 -0
  478. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  479. data/test/dummy/config/locales/en.yml +5 -0
  480. data/test/dummy/config/requirejs.yml +10 -0
  481. data/test/dummy/config/routes.rb +3 -0
  482. data/test/dummy/public/404.html +26 -0
  483. data/test/dummy/public/422.html +26 -0
  484. data/test/dummy/public/500.html +25 -0
  485. data/test/dummy/public/favicon.ico +0 -0
  486. data/test/dummy/script/rails +6 -0
  487. data/test/functional/cesium_controller_test.rb +9 -0
  488. data/test/integration/navigation_test.rb +10 -0
  489. data/test/test_helper.rb +15 -0
  490. data/test/unit/helpers/cesium_helper_test.rb +4 -0
  491. metadata +641 -0
@@ -0,0 +1,175 @@
1
+ @import url('TimelineWidget.css');
2
+
3
+ .cw-node {
4
+ font-family: sans-serif;
5
+ font-size: 16px;
6
+ overflow: hidden;
7
+ display: block;
8
+ position: relative;
9
+ top: 0;
10
+ left: 0;
11
+ width: 100%;
12
+ height: 100%;
13
+ -moz-user-select: none;
14
+ -webkit-user-select: none;
15
+ }
16
+
17
+ .cw-canvas {
18
+ display: block;
19
+ position: absolute;
20
+ top: 0;
21
+ left: 0;
22
+ width: 100%;
23
+ height: 100%;
24
+ }
25
+
26
+ .cw-timelineContainer {
27
+ position: absolute;
28
+ bottom: 0;
29
+ width: 100%;
30
+ height: 27px;
31
+ padding: 0;
32
+ overflow: hidden;
33
+ font-size: 14px;
34
+ }
35
+
36
+ .cw-timeline {
37
+ margin: 0 2px;
38
+ }
39
+
40
+ .cw-animationIcon {
41
+ background-image: url('../Images/animationBar.png');
42
+ background-repeat: no-repeat;
43
+ width: 24px;
44
+ height: 24px;
45
+ }
46
+
47
+ .cw-bingIcon {
48
+ background-image: url('../Images/Bing_Logo_51x19_White.png');
49
+ background-repeat: no-repeat;
50
+ background-position: center;
51
+ width: 51px;
52
+ height: 24px;
53
+ }
54
+
55
+ .cw-animReverse {
56
+ background-position: -24px 0;
57
+ }
58
+
59
+ .cw-animPause {
60
+ background-position: -72px 0;
61
+ }
62
+
63
+ .cw-animPlay {
64
+ background-position: -120px 0;
65
+ }
66
+
67
+ .cw-animFast {
68
+ background-position: -144px 0;
69
+ }
70
+
71
+ .cw-animSlow {
72
+ background-position: -168px 0;
73
+ }
74
+
75
+ .cw-cesiumLogo {
76
+ display: block;
77
+ position: absolute;
78
+ bottom: 68px;
79
+ left: 5px;
80
+ text-decoration: none;
81
+ background-image: url(../Images/Cesium_Logo_overlay.png);
82
+ width: 118px;
83
+ height: 26px;
84
+ }
85
+
86
+ .cw-cesiumLogo img {
87
+ border: none;
88
+ }
89
+
90
+ .cw-animButtons {
91
+ display: block;
92
+ position: absolute;
93
+ bottom: 31px;
94
+ left: 6px;
95
+ }
96
+
97
+ .cw-speedIndicator {
98
+ opacity: 0;
99
+ background: rgba(42, 42, 42, 0.8);
100
+ color: #eee;
101
+ font-size: 12px;
102
+ z-index: 20;
103
+ padding: 5px 10px;
104
+ border-radius: 4px;
105
+ -moz-transition-property: opacity;
106
+ -moz-transition-duration: 0.2s;
107
+ -webkit-transition-property: opacity;
108
+ -webkit-transition-duration: 0.2s;
109
+ transition-property: opacity;
110
+ transition-duration: 0.2s;
111
+ }
112
+
113
+ .cw-animButtons:hover .cw-speedIndicator {
114
+ opacity: 1;
115
+ }
116
+
117
+ .cw-timeLabel {
118
+ display: block;
119
+ position: absolute;
120
+ bottom: 31px;
121
+ right: 6px;
122
+ }
123
+
124
+ .cw-viewIcon {
125
+ background-image: url('../Images/viewControlBar.png');
126
+ background-repeat: no-repeat;
127
+ width: 24px;
128
+ height: 24px;
129
+ }
130
+
131
+ .cw-view2D {
132
+ background-position: -24px 0;
133
+ }
134
+
135
+ .cw-view3D {
136
+ background-position: -48px 0;
137
+ }
138
+
139
+ .cw-viewColumbus {
140
+ background-position: -72px 0;
141
+ }
142
+
143
+ .cw-viewFullscreen {
144
+ background-position: -120px 0;
145
+ }
146
+
147
+ .cw-viewButtons {
148
+ display: block;
149
+ position: absolute;
150
+ top: 5px;
151
+ right: 5px;
152
+ }
153
+
154
+ .cw-imagerySelector {
155
+ display: block;
156
+ }
157
+
158
+ .claro .dijitToggleButtonChecked .dijitButtonNode {
159
+ border: 1px solid #EA0;
160
+ box-shadow: 0 0 5px rgba(255, 170, 42, 1);
161
+ }
162
+
163
+ .cw-loading {
164
+ display: none;
165
+ position: absolute;
166
+ top: 50%;
167
+ left: 50%;
168
+ margin-top: -33px;
169
+ margin-left: -33px;
170
+ width: 66px;
171
+ height: 66px;
172
+ background-position: center;
173
+ background-repeat: no-repeat;
174
+ background-image: url(../Images/ajax-loader.gif);
175
+ }
@@ -0,0 +1,52 @@
1
+ <div data-dojo-attach-point="cesiumNode" class="cw-node">
2
+ <canvas data-dojo-attach-point="canvas" class="cw-canvas"></canvas>
3
+ <div data-dojo-type="dijit.form.Button" data-dojo-attach-point="timeLabel"
4
+ data-dojo-props="'class':'cw-timeLabel', showLabel: true, label:''"></div>
5
+ <div class="cw-viewButtons">
6
+ <div data-dojo-attach-point="viewHomeButton" data-dojo-type="dijit.form.Button"
7
+ data-dojo-props="iconClass: 'cw-viewIcon', showLabel: false, label:'Home View'"></div>
8
+ <div data-dojo-attach-point="view2D" data-dojo-type="dijit.form.ToggleButton"
9
+ data-dojo-props="iconClass: 'cw-viewIcon cw-view2D', showLabel: false, label:'2D View'"></div>
10
+ <div data-dojo-attach-point="view3D" data-dojo-type="dijit.form.ToggleButton"
11
+ data-dojo-props="iconClass: 'cw-viewIcon cw-view3D', showLabel: false, checked: true, label:'3D View'"></div>
12
+ <div data-dojo-attach-point="viewColumbus" data-dojo-type="dijit.form.ToggleButton"
13
+ data-dojo-props="iconClass: 'cw-viewIcon cw-viewColumbus', showLabel: false, label:'Columbus View'"></div>
14
+ <div data-dojo-attach-point="viewFullscreen" data-dojo-type="dijit.form.Button"
15
+ data-dojo-props="iconClass: 'cw-viewIcon cw-viewFullscreen', showLabel: false, label:'Toggle Full Screen'"></div>
16
+ <div data-dojo-attach-point="imagery" data-dojo-type="dijit.form.DropDownButton"
17
+ data-dojo-props="iconClass: 'cw-bingIcon', showLabel: false, label:'Bing'">
18
+ <div data-dojo-type="dijit.TooltipDialog">
19
+ <span data-dojo-type="dijit.form.ToggleButton" data-dojo-attach-point="imageryAerial"
20
+ data-dojo-props="'class':'cw-imagerySelector', showLabel: true, checked: true, label:'Bing Maps Aerial'">
21
+ </span> <span data-dojo-type="dijit.form.ToggleButton" data-dojo-attach-point="imageryAerialWithLabels"
22
+ data-dojo-props="'class':'cw-imagerySelector', showLabel: true, label:'Bing Maps Aerial with Labels'"></span>
23
+ <span data-dojo-type="dijit.form.ToggleButton" data-dojo-attach-point="imageryRoad"
24
+ data-dojo-props="'class':'cw-imagerySelector', showLabel: true, label:'Bing Maps Road'"></span> <span
25
+ data-dojo-type="dijit.form.ToggleButton" data-dojo-attach-point="imagerySingleTile"
26
+ data-dojo-props="'class':'cw-imagerySelector', showLabel: true, label:'No Streaming Imagery'"></span>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ <div class="cw-timelineContainer">
31
+ <div data-dojo-attach-point="timelineWidget" data-dojo-type="Cesium.TimelineWidget"
32
+ data-dojo-props="'class':'cw-timeline'"></div>
33
+ </div>
34
+ <div class="cw-animButtons">
35
+ <div data-dojo-attach-point="animReset" data-dojo-type="dijit.form.Button"
36
+ data-dojo-props="iconClass: 'cw-animationIcon', showLabel: false, label:'Reset'"></div>
37
+ <div data-dojo-attach-point="animReverse" data-dojo-type="dijit.form.ToggleButton"
38
+ data-dojo-props="iconClass: 'cw-animationIcon cw-animReverse', showLabel: false, label:'Play Reverse'"></div>
39
+ <div data-dojo-attach-point="animPause" data-dojo-type="dijit.form.ToggleButton"
40
+ data-dojo-props="iconClass: 'cw-animationIcon cw-animPause', showLabel: false, label:'Pause'"></div>
41
+ <div data-dojo-attach-point="animPlay" data-dojo-type="dijit.form.ToggleButton"
42
+ data-dojo-props="iconClass: 'cw-animationIcon cw-animPlay', showLabel: false, checked: true, label:'Play'"></div>
43
+ <div data-dojo-attach-point="animSlow" data-dojo-type="dijit.form.Button"
44
+ data-dojo-props="iconClass: 'cw-animationIcon cw-animSlow', showLabel: false, label:'Play Slower'"></div>
45
+ <div data-dojo-attach-point="animFast" data-dojo-type="dijit.form.Button"
46
+ data-dojo-props="iconClass: 'cw-animationIcon cw-animFast', showLabel: false, label:'Play Faster'"></div>
47
+ <span data-dojo-attach-point="speedIndicator" class="cw-speedIndicator"></span>
48
+ </div>
49
+ <a class="cw-cesiumLogo" data-dojo-attach-point="cesiumLogo" href="http://cesium.agi.com/" target="_blank"></a> <span
50
+ data-dojo-attach-point="containerNode"></span>
51
+ <div class="cw-loading" data-dojo-attach-point="loading"></div>
52
+ </div>
@@ -0,0 +1,1237 @@
1
+ /*global define,console*/
2
+ define([
3
+ 'require',
4
+ 'dojo/_base/declare',
5
+ 'dojo/ready',
6
+ 'dojo/_base/lang',
7
+ 'dojo/_base/event',
8
+ 'dojo/dom-style',
9
+ 'dojo/on',
10
+ 'dijit/_WidgetBase',
11
+ 'dijit/_TemplatedMixin',
12
+ 'dijit/_WidgetsInTemplateMixin',
13
+ 'dijit/form/Button',
14
+ 'dijit/form/ToggleButton',
15
+ 'dijit/form/DropDownButton',
16
+ 'dijit/TooltipDialog',
17
+ './TimelineWidget',
18
+ '../../Core/defaultValue',
19
+ '../../Core/loadJson',
20
+ '../../Core/BoundingRectangle',
21
+ '../../Core/Clock',
22
+ '../../Core/ClockStep',
23
+ '../../Core/ClockRange',
24
+ '../../Core/Extent',
25
+ '../../Core/AnimationController',
26
+ '../../Core/Ellipsoid',
27
+ '../../Core/Iso8601',
28
+ '../../Core/Fullscreen',
29
+ '../../Core/computeSunPosition',
30
+ '../../Core/ScreenSpaceEventHandler',
31
+ '../../Core/FeatureDetection',
32
+ '../../Core/ScreenSpaceEventType',
33
+ '../../Core/Cartesian2',
34
+ '../../Core/Cartesian3',
35
+ '../../Core/JulianDate',
36
+ '../../Core/DefaultProxy',
37
+ '../../Core/Transforms',
38
+ '../../Core/requestAnimationFrame',
39
+ '../../Core/Color',
40
+ '../../Core/Matrix4',
41
+ '../../Core/Math',
42
+ '../../Scene/PerspectiveFrustum',
43
+ '../../Scene/Material',
44
+ '../../Scene/Scene',
45
+ '../../Scene/CameraColumbusViewMode',
46
+ '../../Scene/CentralBody',
47
+ '../../Scene/BingMapsImageryProvider',
48
+ '../../Scene/BingMapsStyle',
49
+ '../../Scene/SceneTransitioner',
50
+ '../../Scene/SingleTileImageryProvider',
51
+ '../../Scene/PerformanceDisplay',
52
+ '../../Scene/SceneMode',
53
+ '../../Scene/SkyBox',
54
+ '../../Scene/SkyAtmosphere',
55
+ '../../DynamicScene/processCzml',
56
+ '../../DynamicScene/DynamicObjectView',
57
+ '../../DynamicScene/DynamicObjectCollection',
58
+ '../../DynamicScene/VisualizerCollection',
59
+ 'dojo/text!./CesiumViewerWidget.html'
60
+ ], function (
61
+ require,
62
+ declare,
63
+ ready,
64
+ lang,
65
+ event,
66
+ domStyle,
67
+ on,
68
+ _WidgetBase,
69
+ _TemplatedMixin,
70
+ _WidgetsInTemplateMixin,
71
+ Button,
72
+ ToggleButton,
73
+ DropDownButton,
74
+ TooltipDialog,
75
+ TimelineWidget,
76
+ defaultValue,
77
+ loadJson,
78
+ BoundingRectangle,
79
+ Clock,
80
+ ClockStep,
81
+ ClockRange,
82
+ Extent,
83
+ AnimationController,
84
+ Ellipsoid,
85
+ Iso8601,
86
+ Fullscreen,
87
+ computeSunPosition,
88
+ ScreenSpaceEventHandler,
89
+ FeatureDetection,
90
+ ScreenSpaceEventType,
91
+ Cartesian2,
92
+ Cartesian3,
93
+ JulianDate,
94
+ DefaultProxy,
95
+ Transforms,
96
+ requestAnimationFrame,
97
+ Color,
98
+ Matrix4,
99
+ CesiumMath,
100
+ PerspectiveFrustum,
101
+ Material,
102
+ Scene,
103
+ CameraColumbusViewMode,
104
+ CentralBody,
105
+ BingMapsImageryProvider,
106
+ BingMapsStyle,
107
+ SceneTransitioner,
108
+ SingleTileImageryProvider,
109
+ PerformanceDisplay,
110
+ SceneMode,
111
+ SkyBox,
112
+ SkyAtmosphere,
113
+ processCzml,
114
+ DynamicObjectView,
115
+ DynamicObjectCollection,
116
+ VisualizerCollection,
117
+ template) {
118
+ "use strict";
119
+
120
+ /**
121
+ * This Dojo widget wraps the full functionality of Cesium Viewer.
122
+ *
123
+ * @class CesiumViewerWidget
124
+ * @param {Object} options - A list of options to pre-configure the widget. Names matching member fields/functions will override the default values.
125
+ */
126
+ return declare('Cesium.CesiumViewerWidget', [_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin],
127
+ /** @lends CesiumViewerWidget */
128
+ {
129
+ // for Dojo use only
130
+ templateString : template,
131
+
132
+ /**
133
+ * Enable streaming Imagery. This is read-only after construction.
134
+ *
135
+ * @type {Boolean}
136
+ * @memberof CesiumViewerWidget.prototype
137
+ * @default true
138
+ * @see CesiumViewerWidget#enableStreamingImagery
139
+ */
140
+ useStreamingImagery : true,
141
+ /**
142
+ * The map style for streaming imagery. This is read-only after construction.
143
+ *
144
+ * @type {BingMapsStyle}
145
+ * @memberof CesiumViewerWidget.prototype
146
+ * @default {@link BingMapsStyle.AERIAL}
147
+ * @see CesiumViewerWidget#setStreamingImageryMapStyle
148
+ */
149
+ mapStyle : BingMapsStyle.AERIAL,
150
+ /**
151
+ * The URL for a daytime image on the globe.
152
+ *
153
+ * @type {String}
154
+ * @memberof CesiumViewerWidget.prototype
155
+ */
156
+ dayImageUrl : undefined,
157
+ /**
158
+ * The base URL for the sky box.
159
+ *
160
+ * @type {String}
161
+ * @memberof CesiumViewerWidget.prototype
162
+ */
163
+ skyBoxBaseUrl : undefined,
164
+ /**
165
+ * Determines if a sky box with stars is drawn around the globe. This is read-only after construction.
166
+ *
167
+ * @type {Boolean}
168
+ * @memberof CesiumViewerWidget.prototype
169
+ * @default true
170
+ * @see SkyBox
171
+ */
172
+ showSkyBox : true,
173
+ /**
174
+ * An object containing settings supplied by the end user, typically from the query string
175
+ * of the URL of the page with the widget.
176
+ *
177
+ * @type {Object}
178
+ * @memberof CesiumViewerWidget.prototype
179
+ * @example
180
+ * var ioQuery = require('dojo/io-query');
181
+ * var endUserOptions = {};
182
+ * if (window.location.search) {
183
+ * endUserOptions = ioQuery.queryToObject(window.location.search.substring(1));
184
+ * }
185
+ *
186
+ * @example
187
+ * var endUserOptions = {
188
+ * 'source' : 'file.czml', // The relative URL of the CZML file to load at startup.
189
+ * 'lookAt' : '123abc', // The CZML ID of the object to track at startup.
190
+ * 'stats' : 1, // Enable the FPS performance display.
191
+ * 'debug' : 1, // Full WebGL error reporting at substantial performance cost.
192
+ * };
193
+ */
194
+ endUserOptions : {},
195
+ /**
196
+ * Check for WebGL errors after every WebGL API call. Enabling this debugging feature
197
+ * comes at a substantial performance cost, halting and restarting the graphics
198
+ * pipeline hundreds of times per frame. But it can uncover problems that are otherwise
199
+ * very difficult to diagnose.
200
+ * This property is read-only after construction.
201
+ *
202
+ * @type {Boolean}
203
+ * @memberof CesiumViewerWidget.prototype
204
+ * @default false
205
+ */
206
+ enableWebGLDebugging: false,
207
+ /**
208
+ * Allow the user to drag-and-drop CZML files into this widget.
209
+ * This is read-only after construction.
210
+ *
211
+ * @type {Boolean}
212
+ * @memberof CesiumViewerWidget.prototype
213
+ * @default false
214
+ */
215
+ enableDragDrop: false,
216
+ /**
217
+ * Register this widget's resize handler to get called every time the browser window
218
+ * resize event fires. This is read-only after construction. Generally this should
219
+ * be true for full-screen widgets, and true for
220
+ * fluid layouts where the widget is likely to change size at the same time as the
221
+ * window. The exception is, if you use a Dojo layout where this widget exists inside
222
+ * a Dojo ContentPane or similar, you should set this to false, because Dojo will perform
223
+ * its own layout calculations and call this widget's resize handler automatically.
224
+ * This can also be false for a fixed-size widget.
225
+ *
226
+ * If unsure, test the widget with this set to false, and if window resizes cause the
227
+ * globe to stretch, change this to true.
228
+ *
229
+ * @type {Boolean}
230
+ * @memberof CesiumViewerWidget.prototype
231
+ * @default true
232
+ * @see CesiumViewerWidget#resize
233
+ */
234
+ resizeWidgetOnWindowResize: true,
235
+ /**
236
+ * The HTML element to place into fullscreen mode when the corresponding
237
+ * button is pressed. If undefined, only the widget itself will
238
+ * go into fullscreen mode. By specifying another container, such
239
+ * as document.body, this property allows an application to retain
240
+ * any overlaid or surrounding elements when in fullscreen.
241
+ *
242
+ * @type {Object}
243
+ * @memberof CesiumViewerWidget.prototype
244
+ * @default undefined
245
+ */
246
+ fullscreenElement : undefined,
247
+
248
+ // for Dojo use only
249
+ constructor : function() {
250
+ this.ellipsoid = Ellipsoid.WGS84;
251
+ },
252
+
253
+ /**
254
+ * This function will get a callback in the event of setup failure, likely indicating
255
+ * a problem with WebGL support or the availability of a GL context.
256
+ *
257
+ * @function
258
+ * @memberof CesiumViewerWidget.prototype
259
+ * @param {Object} widget - A reference to this widget
260
+ * @param {Object} error - The exception that was thrown during setup
261
+ */
262
+ onSetupError : function(widget, error) {
263
+ console.error(error);
264
+ },
265
+
266
+ /**
267
+ * This function must be called when the widget changes size. It updates the canvas
268
+ * size, camera aspect ratio, and viewport size.
269
+ *
270
+ * @function
271
+ * @memberof CesiumViewerWidget.prototype
272
+ * @see CesiumViewerWidget#resizeWidgetOnWindowResize
273
+ */
274
+ resize : function() {
275
+ var width = this.canvas.clientWidth, height = this.canvas.clientHeight;
276
+
277
+ if (typeof this.scene === 'undefined' || (this.canvas.width === width && this.canvas.height === height)) {
278
+ return;
279
+ }
280
+
281
+ this.canvas.width = width;
282
+ this.canvas.height = height;
283
+
284
+ var frustum = this.scene.getCamera().frustum;
285
+ if (typeof frustum.aspectRatio !== 'undefined') {
286
+ frustum.aspectRatio = width / height;
287
+ } else {
288
+ frustum.top = frustum.right * (height / width);
289
+ frustum.bottom = -frustum.top;
290
+ }
291
+ },
292
+
293
+ /**
294
+ * Have the camera track a particular object based on the result of a pick.
295
+ *
296
+ * @function
297
+ * @memberof CesiumViewerWidget.prototype
298
+ * @param {Object} selectedObject - The object to track, or <code>undefined</code> to stop tracking.
299
+ */
300
+ centerCameraOnPick : function(selectedObject) {
301
+ this.centerCameraOnObject(typeof selectedObject !== 'undefined' ? selectedObject.dynamicObject : undefined);
302
+ },
303
+
304
+ _viewFromTo : undefined,
305
+
306
+ /**
307
+ * Have the camera track a particular object.
308
+ *
309
+ * @function
310
+ * @memberof CesiumViewerWidget.prototype
311
+ * @param {Object} selectedObject - The object to track, or <code>undefined</code> to stop tracking.
312
+ */
313
+ centerCameraOnObject : function(selectedObject) {
314
+ if (typeof selectedObject !== 'undefined' && typeof selectedObject.position !== 'undefined') {
315
+ var viewFromTo = this._viewFromTo;
316
+ if (typeof viewFromTo === 'undefined') {
317
+ this._viewFromTo = viewFromTo = new DynamicObjectView(selectedObject, this.scene, this.ellipsoid);
318
+ } else {
319
+ viewFromTo.dynamicObject = selectedObject;
320
+ }
321
+ } else {
322
+ this._viewFromTo = undefined;
323
+ }
324
+ },
325
+
326
+ /**
327
+ * Override this function to be notified when an object is selected (left-click).
328
+ *
329
+ * @function
330
+ * @memberof CesiumViewerWidget.prototype
331
+ * @param {Object} selectedObject - The object that was selected, or <code>undefined</code> to de-select.
332
+ */
333
+ onObjectSelected : undefined,
334
+ /**
335
+ * Override this function to be notified when an object is right-clicked.
336
+ *
337
+ * @function
338
+ * @memberof CesiumViewerWidget.prototype
339
+ * @param {Object} selectedObject - The object that was selected, or <code>undefined</code> to de-select.
340
+ */
341
+ onObjectRightClickSelected : undefined,
342
+ /**
343
+ * Override this function to be notified when an object is left-double-clicked.
344
+ *
345
+ * @function
346
+ * @memberof CesiumViewerWidget.prototype
347
+ * @param {Object} selectedObject - The object that was selected, or <code>undefined</code> to de-select.
348
+ */
349
+ onObjectLeftDoubleClickSelected : undefined,
350
+ /**
351
+ * Override this function to be notified when an object hovered by the mouse.
352
+ *
353
+ * @function
354
+ * @memberof CesiumViewerWidget.prototype
355
+ * @param {Object} selectedObject - The object that was hovered, or <code>undefined</code> if the mouse moved off.
356
+ */
357
+ onObjectMousedOver : undefined,
358
+ /**
359
+ * Override this function to be notified when the left mouse button is pressed down.
360
+ *
361
+ * @function
362
+ * @memberof CesiumViewerWidget.prototype
363
+ * @param {Object} The object with the position of the mouse.
364
+ */
365
+ onLeftMouseDown : undefined,
366
+ /**
367
+ * Override this function to be notified when the left mouse button is released.
368
+ *
369
+ * @function
370
+ * @memberof CesiumViewerWidget.prototype
371
+ * @param {Object} The object with the position of the mouse.
372
+ */
373
+ onLeftMouseUp : undefined,
374
+ /**
375
+ * Override this function to be notified when the right mouse button is pressed down.
376
+ *
377
+ * @function
378
+ * @memberof CesiumViewerWidget.prototype
379
+ * @param {Object} The object with the position of the mouse.
380
+ */
381
+ onRightMouseDown : undefined,
382
+ /**
383
+ * Override this function to be notified when the right mouse button is released.
384
+ *
385
+ * @function
386
+ * @memberof CesiumViewerWidget.prototype
387
+ * @param {Object} The object with the position of the mouse.
388
+ */
389
+ onRightMouseUp : undefined,
390
+ /**
391
+ * Override this function to be notified when the left mouse button is dragged.
392
+ *
393
+ * @function
394
+ * @memberof CesiumViewerWidget.prototype
395
+ * @param {Object} The object with the start and end position of the mouse.
396
+ */
397
+ onLeftDrag : undefined,
398
+ /**
399
+ * Override this function to be notified when the right mouse button is dragged or mouse wheel is zoomed.
400
+ *
401
+ * @function
402
+ * @memberof CesiumViewerWidget.prototype
403
+ * @param {Object} The object with the start and end position of the mouse.
404
+ */
405
+ onZoom : undefined,
406
+
407
+ _camera3D : undefined,
408
+
409
+ _handleLeftClick : function(e) {
410
+ if (typeof this.onObjectSelected !== 'undefined') {
411
+ // Fire the selection event, regardless if it's a duplicate,
412
+ // because the client may want to react to re-selection in some way.
413
+ this.selectedObject = this.scene.pick(e.position);
414
+ this.onObjectSelected(this.selectedObject);
415
+ }
416
+ },
417
+
418
+ _handleRightClick : function(e) {
419
+ if (typeof this.onObjectRightClickSelected !== 'undefined') {
420
+ // Fire the selection event, regardless if it's a duplicate,
421
+ // because the client may want to react to re-selection in some way.
422
+ this.selectedObject = this.scene.pick(e.position);
423
+ this.onObjectRightClickSelected(this.selectedObject);
424
+ }
425
+ },
426
+
427
+ _handleLeftDoubleClick : function(e) {
428
+ if (typeof this.onObjectLeftDoubleClickSelected !== 'undefined') {
429
+ // Fire the selection event, regardless if it's a duplicate,
430
+ // because the client may want to react to re-selection in some way.
431
+ this.selectedObject = this.scene.pick(e.position);
432
+ this.onObjectLeftDoubleClickSelected(this.selectedObject);
433
+ }
434
+ },
435
+
436
+ _handleMouseMove : function(movement) {
437
+ if (typeof this.onObjectMousedOver !== 'undefined') {
438
+ // Don't fire multiple times for the same object as the mouse travels around the screen.
439
+ var mousedOverObject = this.scene.pick(movement.endPosition);
440
+ if (this.mousedOverObject !== mousedOverObject) {
441
+ this.mousedOverObject = mousedOverObject;
442
+ this.onObjectMousedOver(mousedOverObject);
443
+ }
444
+ }
445
+ if (true === this.leftDown && typeof this.onLeftDrag !== 'undefined') {
446
+ this.onLeftDrag(movement);
447
+ } else if (true === this.rightDown && typeof this.onZoom !== 'undefined') {
448
+ this.onZoom(movement);
449
+ }
450
+ },
451
+
452
+ _handleRightDown : function(e) {
453
+ this.rightDown = true;
454
+ if (typeof this.onRightMouseDown !== 'undefined') {
455
+ this.onRightMouseDown(e);
456
+ }
457
+ },
458
+
459
+ _handleRightUp : function(e) {
460
+ this.rightDown = false;
461
+ if (typeof this.onRightMouseUp !== 'undefined') {
462
+ this.onRightMouseUp(e);
463
+ }
464
+ },
465
+
466
+ _handleLeftDown : function(e) {
467
+ this.leftDown = true;
468
+ if (typeof this.onLeftMouseDown !== 'undefined') {
469
+ this.onLeftMouseDown(e);
470
+ }
471
+ },
472
+
473
+ _handleLeftUp : function(e) {
474
+ this.leftDown = false;
475
+ if (typeof this.onLeftMouseUp !== 'undefined') {
476
+ this.onLeftMouseUp(e);
477
+ }
478
+ },
479
+
480
+ _handleWheel : function(e) {
481
+ if (typeof this.onZoom !== 'undefined') {
482
+ this.onZoom(e);
483
+ }
484
+ },
485
+
486
+ _updateSpeedIndicator : function() {
487
+ if (this.animationController.isAnimating()) {
488
+ this.speedIndicator.innerHTML = this.clock.multiplier + 'x realtime';
489
+ } else {
490
+ this.speedIndicator.innerHTML = this.clock.multiplier + 'x realtime (paused)';
491
+ }
492
+ },
493
+
494
+ /**
495
+ * Apply the animation settings from a CZML buffer.
496
+ * @function
497
+ * @memberof CesiumViewerWidget.prototype
498
+ */
499
+ setTimeFromBuffer : function() {
500
+ var clock = this.clock;
501
+
502
+ this.animReverse.set('checked', false);
503
+ this.animPause.set('checked', true);
504
+ this.animPlay.set('checked', false);
505
+
506
+ var availability = this.dynamicObjectCollection.computeAvailability();
507
+ if (availability.start.equals(Iso8601.MINIMUM_VALUE)) {
508
+ clock.startTime = new JulianDate();
509
+ clock.stopTime = clock.startTime.addDays(1);
510
+ clock.clockRange = ClockRange.UNBOUNDED;
511
+ } else {
512
+ clock.startTime = availability.start;
513
+ clock.stopTime = availability.stop;
514
+ clock.clockRange = ClockRange.LOOP;
515
+ }
516
+
517
+ clock.multiplier = 60;
518
+ clock.currentTime = clock.startTime;
519
+ this.timelineControl.zoomTo(clock.startTime, clock.stopTime);
520
+ },
521
+
522
+ /**
523
+ * Removes all CZML data from the viewer.
524
+ *
525
+ * @function
526
+ * @memberof CesiumViewerWidget.prototype
527
+ */
528
+ removeAllCzml : function() {
529
+ this.centerCameraOnObject(undefined);
530
+ //CZML_TODO visualizers.removeAllPrimitives(); is not really needed here, but right now visualizers
531
+ //cache data indefinitely and removeAll is the only way to get rid of it.
532
+ //while there are no visual differences, removeAll cleans the cache and improves performance
533
+ this.visualizers.removeAllPrimitives();
534
+ this.dynamicObjectCollection.clear();
535
+ },
536
+
537
+ /**
538
+ * Add CZML data to the viewer.
539
+ *
540
+ * @function
541
+ * @memberof CesiumViewerWidget.prototype
542
+ * @param {CZML} czml - The CZML (as objects) to be processed and added to the viewer.
543
+ * @param {string} source - The filename or URI that was the source of the CZML collection.
544
+ * @param {string} lookAt - Optional. The ID of the object to center the camera on.
545
+ * @see CesiumViewerWidget#loadCzml
546
+ */
547
+ addCzml : function(czml, source, lookAt) {
548
+ processCzml(czml, this.dynamicObjectCollection, source);
549
+ this.setTimeFromBuffer();
550
+ if (typeof lookAt !== 'undefined') {
551
+ var lookAtObject = this.dynamicObjectCollection.getObject(lookAt);
552
+ this.centerCameraOnObject(lookAtObject);
553
+ }
554
+ },
555
+
556
+ /**
557
+ * Asynchronously load and add CZML data to the viewer.
558
+ *
559
+ * @function
560
+ * @memberof CesiumViewerWidget.prototype
561
+ * @param {string} source - The URI to load the CZML from.
562
+ * @param {string} lookAt - Optional. The ID of the object to center the camera on.
563
+ * @see CesiumViewerWidget#addCzml
564
+ */
565
+ loadCzml : function(source, lookAt) {
566
+ var widget = this;
567
+ widget._setLoading(true);
568
+ loadJson(source).then(function(czml) {
569
+ widget.addCzml(czml, source, lookAt);
570
+ widget._setLoading(false);
571
+ },
572
+ function(error) {
573
+ widget._setLoading(false);
574
+ console.error(error);
575
+ window.alert(error);
576
+ });
577
+ },
578
+
579
+ /**
580
+ * This function is called when files are dropped on the widget, if drag-and-drop is enabled.
581
+ *
582
+ * @function
583
+ * @memberof CesiumViewerWidget.prototype
584
+ * @param {Object} event - The drag-and-drop event containing the dropped file(s).
585
+ */
586
+ handleDrop : function(event) {
587
+ event.stopPropagation(); // Stops some browsers from redirecting.
588
+ event.preventDefault();
589
+
590
+ var widget = this;
591
+ widget._setLoading(true);
592
+ widget.removeAllCzml();
593
+
594
+ var files = event.dataTransfer.files;
595
+ var f = files[0];
596
+ var reader = new FileReader();
597
+ reader.onload = function(evt) {
598
+ widget.addCzml(JSON.parse(evt.target.result), f.name);
599
+ widget._setLoading(false);
600
+ };
601
+ reader.readAsText(f);
602
+ },
603
+
604
+ _started : false,
605
+
606
+ /**
607
+ * Call this after placing the widget in the DOM, to initialize the WebGL context,
608
+ * wire up event callbacks, begin requesting CZML, imagery, etc.
609
+ *
610
+ * @function
611
+ * @memberof CesiumViewerWidget.prototype
612
+ * @see CesiumViewerWidget#autoStartRenderLoop
613
+ */
614
+ startup : function() {
615
+ if (this._started) {
616
+ return;
617
+ }
618
+
619
+ var canvas = this.canvas, ellipsoid = this.ellipsoid, scene, widget = this;
620
+
621
+ try {
622
+ scene = this.scene = new Scene(canvas);
623
+ } catch (ex) {
624
+ if (typeof this.onSetupError !== 'undefined') {
625
+ this.onSetupError(this, ex);
626
+ }
627
+ return;
628
+ }
629
+ this._started = true;
630
+
631
+ this.resize();
632
+
633
+ on(canvas, 'contextmenu', event.stop);
634
+ on(canvas, 'selectstart', event.stop);
635
+
636
+ if (typeof widget.endUserOptions.debug !== 'undefined' && widget.endUserOptions.debug) {
637
+ this.enableWebGLDebugging = true;
638
+ }
639
+
640
+ var context = scene.getContext();
641
+ if (this.enableWebGLDebugging) {
642
+ context.setValidateShaderProgram(true);
643
+ context.setValidateFramebuffer(true);
644
+ context.setLogShaderCompilation(true);
645
+ context.setThrowOnWebGLError(true);
646
+ }
647
+
648
+ var imageryUrl = require.toUrl('../../Assets/Textures/');
649
+ this.dayImageUrl = defaultValue(this.dayImageUrl, imageryUrl + 'NE2_LR_LC_SR_W_DR_2048.jpg');
650
+ this.skyBoxBaseUrl = defaultValue(this.skyBoxBaseUrl, imageryUrl + 'SkyBox/tycho2t3_80');
651
+
652
+ var centralBody = this.centralBody = new CentralBody(ellipsoid);
653
+
654
+ // This logo is replicated by the imagery selector button, so it's hidden here.
655
+ centralBody.logoOffset = new Cartesian2(-100, -100);
656
+
657
+ this._configureCentralBodyImagery();
658
+
659
+ scene.getPrimitives().setCentralBody(centralBody);
660
+
661
+ if (this.showSkyBox) {
662
+ scene.skyBox = new SkyBox({
663
+ positiveX: this.skyBoxBaseUrl + '_px.jpg',
664
+ negativeX: this.skyBoxBaseUrl + '_mx.jpg',
665
+ positiveY: this.skyBoxBaseUrl + '_py.jpg',
666
+ negativeY: this.skyBoxBaseUrl + '_my.jpg',
667
+ positiveZ: this.skyBoxBaseUrl + '_pz.jpg',
668
+ negativeZ: this.skyBoxBaseUrl + '_mz.jpg'
669
+ });
670
+ }
671
+
672
+ scene.skyAtmosphere = new SkyAtmosphere(ellipsoid);
673
+
674
+ var camera = scene.getCamera();
675
+ camera.position = camera.position.multiplyByScalar(1.5);
676
+ camera.controller.constrainedAxis = Cartesian3.UNIT_Z;
677
+
678
+ var handler = new ScreenSpaceEventHandler(canvas);
679
+ handler.setInputAction(lang.hitch(this, '_handleLeftClick'), ScreenSpaceEventType.LEFT_CLICK);
680
+ handler.setInputAction(lang.hitch(this, '_handleRightClick'), ScreenSpaceEventType.RIGHT_CLICK);
681
+ handler.setInputAction(lang.hitch(this, '_handleLeftDoubleClick'), ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
682
+ handler.setInputAction(lang.hitch(this, '_handleMouseMove'), ScreenSpaceEventType.MOUSE_MOVE);
683
+ handler.setInputAction(lang.hitch(this, '_handleLeftDown'), ScreenSpaceEventType.LEFT_DOWN);
684
+ handler.setInputAction(lang.hitch(this, '_handleLeftUp'), ScreenSpaceEventType.LEFT_UP);
685
+ handler.setInputAction(lang.hitch(this, '_handleWheel'), ScreenSpaceEventType.WHEEL);
686
+ handler.setInputAction(lang.hitch(this, '_handleRightDown'), ScreenSpaceEventType.RIGHT_DOWN);
687
+ handler.setInputAction(lang.hitch(this, '_handleRightUp'), ScreenSpaceEventType.RIGHT_UP);
688
+
689
+ //////////////////////////////////////////////////////////////////////////////////////////////////
690
+
691
+ if (typeof this.highlightColor === 'undefined') {
692
+ this.highlightColor = new Color(0.0, 1.0, 0.0);
693
+ }
694
+
695
+ if (typeof this.highlightMaterial === 'undefined') {
696
+ this.highlightMaterial = Material.fromType(scene.getContext(), Material.ColorType);
697
+ this.highlightMaterial.uniforms.color = this.highlightColor;
698
+ }
699
+
700
+ if (typeof this.onObjectSelected === 'undefined') {
701
+ this.onObjectSelected = function(selectedObject) {
702
+ if (typeof selectedObject !== 'undefined' && typeof selectedObject.dynamicObject !== 'undefined') {
703
+ this.centerCameraOnPick(selectedObject);
704
+ }
705
+ };
706
+ }
707
+
708
+ if (this.enableDragDrop) {
709
+ var dropBox = this.cesiumNode;
710
+ on(dropBox, 'drop', lang.hitch(widget, 'handleDrop'));
711
+ on(dropBox, 'dragenter', event.stop);
712
+ on(dropBox, 'dragover', event.stop);
713
+ on(dropBox, 'dragexit', event.stop);
714
+ }
715
+
716
+ var currentTime = new JulianDate();
717
+ if (typeof this.animationController === 'undefined') {
718
+ if (typeof this.clock === 'undefined') {
719
+ this.clock = new Clock({
720
+ startTime : currentTime.addDays(-0.5),
721
+ stopTime : currentTime.addDays(0.5),
722
+ currentTime : currentTime,
723
+ clockStep : ClockStep.SYSTEM_CLOCK_DEPENDENT,
724
+ multiplier : 1
725
+ });
726
+ }
727
+ this.animationController = new AnimationController(this.clock);
728
+ } else {
729
+ this.clock = this.animationController.clock;
730
+ }
731
+
732
+ var animationController = this.animationController;
733
+ var dynamicObjectCollection = this.dynamicObjectCollection = new DynamicObjectCollection();
734
+ var clock = this.clock;
735
+ var transitioner = this.sceneTransitioner = new SceneTransitioner(scene);
736
+ this.visualizers = VisualizerCollection.createCzmlStandardCollection(scene, dynamicObjectCollection);
737
+
738
+ if (typeof widget.endUserOptions.source !== 'undefined') {
739
+ widget.loadCzml(widget.endUserOptions.source, widget.endUserOptions.lookAt);
740
+ }
741
+
742
+ if (typeof widget.endUserOptions.stats !== 'undefined' && widget.endUserOptions.stats) {
743
+ widget.enableStatistics(true);
744
+ }
745
+
746
+ this._lastTimeLabelClock = clock.currentTime;
747
+ this._lastTimeLabelDate = Date.now();
748
+ this.timeLabelElement = this.timeLabel.containerNode;
749
+ this.timeLabelElement.innerHTML = clock.currentTime.toDate().toUTCString();
750
+
751
+ var animReverse = this.animReverse;
752
+ var animPause = this.animPause;
753
+ var animPlay = this.animPlay;
754
+
755
+ on(this.animReset, 'Click', function() {
756
+ animationController.reset();
757
+ animReverse.set('checked', false);
758
+ animPause.set('checked', true);
759
+ animPlay.set('checked', false);
760
+ });
761
+
762
+ function onAnimPause() {
763
+ animationController.pause();
764
+ animReverse.set('checked', false);
765
+ animPause.set('checked', true);
766
+ animPlay.set('checked', false);
767
+ }
768
+
769
+ on(animPause, 'Click', onAnimPause);
770
+
771
+ on(animReverse, 'Click', function() {
772
+ animationController.playReverse();
773
+ animReverse.set('checked', true);
774
+ animPause.set('checked', false);
775
+ animPlay.set('checked', false);
776
+ });
777
+
778
+ on(animPlay, 'Click', function() {
779
+ animationController.play();
780
+ animReverse.set('checked', false);
781
+ animPause.set('checked', false);
782
+ animPlay.set('checked', true);
783
+ });
784
+
785
+ on(widget.animSlow, 'Click', function() {
786
+ animationController.slower();
787
+ });
788
+
789
+ on(widget.animFast, 'Click', function() {
790
+ animationController.faster();
791
+ });
792
+
793
+ function onTimelineScrub(e) {
794
+ widget.clock.currentTime = e.timeJulian;
795
+ onAnimPause();
796
+ }
797
+
798
+ var timelineWidget = widget.timelineWidget;
799
+ timelineWidget.clock = widget.clock;
800
+ timelineWidget.setupCallback = function(t) {
801
+ widget.timelineControl = t;
802
+ t.addEventListener('settime', onTimelineScrub, false);
803
+ t.zoomTo(clock.startTime, clock.stopTime);
804
+ };
805
+ timelineWidget.setupTimeline();
806
+
807
+ var viewHomeButton = widget.viewHomeButton;
808
+ var view2D = widget.view2D;
809
+ var view3D = widget.view3D;
810
+ var viewColumbus = widget.viewColumbus;
811
+ var viewFullscreen = widget.viewFullscreen;
812
+
813
+ view2D.set('checked', false);
814
+ view3D.set('checked', true);
815
+ viewColumbus.set('checked', false);
816
+
817
+ if (Fullscreen.isFullscreenEnabled()) {
818
+ on(document, Fullscreen.getFullscreenChangeEventName(), function() {
819
+ widget.resize();
820
+ });
821
+
822
+ on(viewFullscreen, 'Click', function() {
823
+ if (Fullscreen.isFullscreen()) {
824
+ Fullscreen.exitFullscreen();
825
+ } else {
826
+ Fullscreen.requestFullscreen(defaultValue(widget.fullscreenElement, widget.cesiumNode));
827
+ }
828
+ });
829
+ } else {
830
+ domStyle.set(viewFullscreen.domNode, 'display', 'none');
831
+ }
832
+
833
+ on(viewHomeButton, 'Click', function() {
834
+ widget.viewHome();
835
+ });
836
+ on(view2D, 'Click', function() {
837
+ view2D.set('checked', true);
838
+ view3D.set('checked', false);
839
+ viewColumbus.set('checked', false);
840
+ transitioner.morphTo2D();
841
+ });
842
+ on(view3D, 'Click', function() {
843
+ view2D.set('checked', false);
844
+ view3D.set('checked', true);
845
+ viewColumbus.set('checked', false);
846
+ transitioner.morphTo3D();
847
+ });
848
+ on(viewColumbus, 'Click', function() {
849
+ view2D.set('checked', false);
850
+ view3D.set('checked', false);
851
+ viewColumbus.set('checked', true);
852
+ transitioner.morphToColumbusView();
853
+ });
854
+
855
+ var imagery = widget.imagery;
856
+ var imageryAerial = widget.imageryAerial;
857
+ var imageryAerialWithLabels = widget.imageryAerialWithLabels;
858
+ var imageryRoad = widget.imageryRoad;
859
+ var imagerySingleTile = widget.imagerySingleTile;
860
+ var imageryOptions = [imageryAerial, imageryAerialWithLabels, imageryRoad, imagerySingleTile];
861
+ var bingHtml = imagery.containerNode.innerHTML;
862
+
863
+ imagery.startup();
864
+
865
+ function createImageryClickFunction(control, style) {
866
+ return function() {
867
+ if (style) {
868
+ widget.setStreamingImageryMapStyle(style);
869
+ imagery.containerNode.innerHTML = bingHtml;
870
+ } else {
871
+ widget.enableStreamingImagery(false);
872
+ imagery.containerNode.innerHTML = 'Imagery';
873
+ }
874
+
875
+ imageryOptions.forEach(function(o) {
876
+ o.set('checked', o === control);
877
+ });
878
+ };
879
+ }
880
+
881
+ on(imageryAerial, 'Click', createImageryClickFunction(imageryAerial, BingMapsStyle.AERIAL));
882
+ on(imageryAerialWithLabels, 'Click', createImageryClickFunction(imageryAerialWithLabels, BingMapsStyle.AERIAL_WITH_LABELS));
883
+ on(imageryRoad, 'Click', createImageryClickFunction(imageryRoad, BingMapsStyle.ROAD));
884
+ on(imagerySingleTile, 'Click', createImageryClickFunction(imagerySingleTile, undefined));
885
+
886
+ //////////////////////////////////////////////////////////////////////////////////////////////////
887
+
888
+ if (widget.resizeWidgetOnWindowResize) {
889
+ on(window, 'resize', function() {
890
+ widget.resize();
891
+ });
892
+ }
893
+
894
+ this._camera3D = this.scene.getCamera().clone();
895
+
896
+ if (this.autoStartRenderLoop) {
897
+ this.startRenderLoop();
898
+ }
899
+ },
900
+
901
+ /**
902
+ * Reset the camera to the home view for the current scene mode.
903
+ * @function
904
+ * @memberof CesiumViewerWidget.prototype
905
+ */
906
+ viewHome : function() {
907
+ this._viewFromTo = undefined;
908
+
909
+ var scene = this.scene;
910
+ var mode = scene.mode;
911
+
912
+ var camera = scene.getCamera();
913
+ camera.controller.constrainedAxis = Cartesian3.UNIT_Z;
914
+
915
+ var controller = scene.getScreenSpaceCameraController();
916
+ controller.enableTranslate = true;
917
+ controller.enableTilt = true;
918
+ controller.setEllipsoid(Ellipsoid.WGS84);
919
+ controller.columbusViewMode = CameraColumbusViewMode.FREE;
920
+
921
+ if (mode === SceneMode.SCENE2D) {
922
+ camera.controller.viewExtent(Extent.MAX_VALUE);
923
+ } else if (mode === SceneMode.SCENE3D) {
924
+ var camera3D = this._camera3D;
925
+ camera3D.position.clone(camera.position);
926
+ camera3D.direction.clone(camera.direction);
927
+ camera3D.up.clone(camera.up);
928
+ camera3D.right.clone(camera.right);
929
+ camera3D.transform.clone(camera.transform);
930
+ camera3D.frustum.clone(camera.frustum);
931
+ } else if (mode === SceneMode.COLUMBUS_VIEW) {
932
+ var transform = new Matrix4(0.0, 0.0, 1.0, 0.0,
933
+ 1.0, 0.0, 0.0, 0.0,
934
+ 0.0, 1.0, 0.0, 0.0,
935
+ 0.0, 0.0, 0.0, 1.0);
936
+
937
+ var maxRadii = Ellipsoid.WGS84.getMaximumRadius();
938
+ var position = new Cartesian3(0.0, -1.0, 1.0).normalize().multiplyByScalar(5.0 * maxRadii);
939
+ var direction = Cartesian3.ZERO.subtract(position).normalize();
940
+ var right = direction.cross(Cartesian3.UNIT_Z);
941
+ var up = right.cross(direction);
942
+ right = direction.cross(up);
943
+ direction = up.cross(right);
944
+
945
+ var frustum = new PerspectiveFrustum();
946
+ frustum.fovy = CesiumMath.toRadians(60.0);
947
+ frustum.aspectRatio = this.canvas.clientWidth / this.canvas.clientHeight;
948
+
949
+ camera.position = position;
950
+ camera.direction = direction;
951
+ camera.up = up;
952
+ camera.right = right;
953
+ camera.frustum = frustum;
954
+ camera.transform = transform;
955
+ }
956
+ },
957
+
958
+ /**
959
+ * Enable or disable the FPS (Frames Per Second) perfomance display.
960
+ *
961
+ * @function
962
+ * @memberof CesiumViewerWidget.prototype
963
+ * @param {Boolean} showStatistics - <code>true</code> to enable it.
964
+ */
965
+ enableStatistics : function(showStatistics) {
966
+ if (typeof this._performanceDisplay === 'undefined' && showStatistics) {
967
+ this._performanceDisplay = new PerformanceDisplay();
968
+ this.scene.getPrimitives().add(this._performanceDisplay);
969
+ } else if (typeof this._performanceDisplay !== 'undefined' && !showStatistics) {
970
+ this.scene.getPrimitives().remove(this._performanceDisplay);
971
+ this._performanceDisplay = undefined;
972
+ }
973
+ },
974
+
975
+ /**
976
+ * Enable or disable the "sky atmosphere" effect, which displays the limb
977
+ * of the Earth (seen from space) or blue sky (seen from inside the atmosphere).
978
+ *
979
+ * @function
980
+ * @memberof CesiumViewerWidget.prototype
981
+ * @param {Boolean} show - <code>true</code> to enable the effect.
982
+ */
983
+ showSkyAtmosphere : function(show) {
984
+ this.scene.skyAtmosphere.show = show;
985
+ },
986
+
987
+ /**
988
+ * Enable or disable streaming imagery, and update the globe.
989
+ *
990
+ * @function
991
+ * @memberof CesiumViewerWidget.prototype
992
+ * @param {Boolean} value - <code>true</code> to enable streaming imagery.
993
+ * @see CesiumViewerWidget#useStreamingImagery
994
+ */
995
+ enableStreamingImagery : function(value) {
996
+ this.useStreamingImagery = value;
997
+ this._configureCentralBodyImagery();
998
+ },
999
+
1000
+ /**
1001
+ * Change the streaming imagery type, and update the globe.
1002
+ *
1003
+ * @function
1004
+ * @memberof CesiumViewerWidget.prototype
1005
+ * @param {BingMapsStyle} value - the new map style to use.
1006
+ * @see CesiumViewerWidget#mapStyle
1007
+ */
1008
+ setStreamingImageryMapStyle : function(value) {
1009
+ if (!this.useStreamingImagery || this.mapStyle !== value) {
1010
+ this.useStreamingImagery = true;
1011
+ this.mapStyle = value;
1012
+ this._configureCentralBodyImagery();
1013
+ }
1014
+ },
1015
+
1016
+ /**
1017
+ * Set the positional offset of the logo of the streaming imagery provider.
1018
+ *
1019
+ * @function
1020
+ * @memberof CesiumViewerWidget.prototype
1021
+ * @param {Integer} logoOffsetX - The horizontal offset in screen space
1022
+ * @param {Integer} logoOffsetY - The vertical offset in screen space
1023
+ */
1024
+ setLogoOffset : function(logoOffsetX, logoOffsetY) {
1025
+ var logoOffset = this.centralBody.logoOffset;
1026
+ if ((logoOffsetX !== logoOffset.x) || (logoOffsetY !== logoOffset.y)) {
1027
+ this.centralBody.logoOffset = new Cartesian2(logoOffsetX, logoOffsetY);
1028
+ }
1029
+ },
1030
+
1031
+ /**
1032
+ * Highlight an object in the scene, usually in response to a click or hover.
1033
+ *
1034
+ * @function
1035
+ * @memberof CesiumViewerWidget.prototype
1036
+ * @param {Object} selectedObject - The object to highlight, or <code>undefined</code> to un-highlight.
1037
+ */
1038
+ highlightObject : function(selectedObject) {
1039
+ if (this.highlightedObject !== selectedObject) {
1040
+ if (typeof this.highlightedObject !== 'undefined' &&
1041
+ (typeof this.highlightedObject.isDestroyed !== 'function' || !this.highlightedObject.isDestroyed())) {
1042
+ if (typeof this.highlightedObject.material !== 'undefined') {
1043
+ this.highlightedObject.material = this._originalMaterial;
1044
+ } else if (typeof this.highlightedObject.outerMaterial !== 'undefined') {
1045
+ this.highlightedObject.outerMaterial = this._originalMaterial;
1046
+ } else if (typeof this.highlightedObject.setColor !== 'undefined') {
1047
+ this.highlightedObject.setColor(this._originalColor);
1048
+ }
1049
+ }
1050
+ this.highlightedObject = selectedObject;
1051
+ if (typeof selectedObject !== 'undefined') {
1052
+ if (typeof selectedObject.material !== 'undefined') {
1053
+ this._originalMaterial = selectedObject.material;
1054
+ selectedObject.material = this.highlightMaterial;
1055
+ } else if (typeof selectedObject.outerMaterial !== 'undefined') {
1056
+ this._originalMaterial = selectedObject.outerMaterial;
1057
+ selectedObject.outerMaterial = this.highlightMaterial;
1058
+ } else if (typeof this.highlightedObject.setColor !== 'undefined') {
1059
+ this._originalColor = Color.clone(selectedObject.getColor(), this._originalColor);
1060
+ selectedObject.setColor(this.highlightColor);
1061
+ }
1062
+ }
1063
+ }
1064
+ },
1065
+
1066
+ /**
1067
+ * Initialize the current frame.
1068
+ * @function
1069
+ * @memberof CesiumViewerWidget.prototype
1070
+ */
1071
+ initializeFrame : function() {
1072
+ this.scene.initializeFrame();
1073
+ },
1074
+
1075
+ /**
1076
+ * Call this function prior to rendering each animation frame, to prepare
1077
+ * all CZML objects and other settings for the next frame.
1078
+ *
1079
+ * @function
1080
+ * @memberof CesiumViewerWidget.prototype
1081
+ * @param {JulianDate} currentTime - The date and time in the scene of the frame to be rendered
1082
+ */
1083
+ update : function(currentTime) {
1084
+
1085
+ this._updateSpeedIndicator();
1086
+ this.timelineControl.updateFromClock();
1087
+ this.visualizers.update(currentTime);
1088
+
1089
+ if ((Math.abs(currentTime.getSecondsDifference(this._lastTimeLabelClock)) >= 1.0) ||
1090
+ ((Date.now() - this._lastTimeLabelDate) > 200)) {
1091
+ this.timeLabelElement.innerHTML = currentTime.toDate().toUTCString();
1092
+ this._lastTimeLabelClock = currentTime;
1093
+ this._lastTimeLabelDate = Date.now();
1094
+ }
1095
+
1096
+ // Update the camera to stay centered on the selected object, if any.
1097
+ var viewFromTo = this._viewFromTo;
1098
+ if (typeof viewFromTo !== 'undefined') {
1099
+ viewFromTo.update(currentTime);
1100
+ }
1101
+ },
1102
+
1103
+ /**
1104
+ * Render the widget's scene.
1105
+ * @function
1106
+ * @memberof CesiumViewerWidget.prototype
1107
+ * @param {JulianDate} currentTime - The date and time in the scene of the frame to be rendered
1108
+ */
1109
+ render : function(currentTime) {
1110
+ this.scene.render(currentTime);
1111
+ },
1112
+
1113
+ _setLoading : function(isLoading) {
1114
+ this.loading.style.display = isLoading ? 'block' : 'none';
1115
+ },
1116
+
1117
+ _configureCentralBodyImagery : function() {
1118
+ var centralBody = this.centralBody;
1119
+
1120
+ var imageLayers = centralBody.getImageryLayers();
1121
+
1122
+ var existingImagery;
1123
+ if (imageLayers.getLength() !== 0) {
1124
+ existingImagery = imageLayers.get(0).imageryProvider;
1125
+ }
1126
+
1127
+ var newLayer;
1128
+
1129
+ if (this.useStreamingImagery) {
1130
+ if (!(existingImagery instanceof BingMapsImageryProvider) ||
1131
+ existingImagery.getMapStyle() !== this.mapStyle) {
1132
+
1133
+ newLayer = imageLayers.addImageryProvider(new BingMapsImageryProvider({
1134
+ url : 'http://dev.virtualearth.net',
1135
+ mapStyle : this.mapStyle,
1136
+ // Some versions of Safari support WebGL, but don't correctly implement
1137
+ // cross-origin image loading, so we need to load Bing imagery using a proxy.
1138
+ proxy : FeatureDetection.supportsCrossOriginImagery() ? undefined : new DefaultProxy('/proxy/')
1139
+ }));
1140
+ if (imageLayers.getLength() > 1) {
1141
+ imageLayers.remove(imageLayers.get(0));
1142
+ }
1143
+ imageLayers.lowerToBottom(newLayer);
1144
+ }
1145
+ } else {
1146
+ if (!(existingImagery instanceof SingleTileImageryProvider) ||
1147
+ existingImagery.getUrl() !== this.dayImageUrl) {
1148
+
1149
+ newLayer = imageLayers.addImageryProvider(new SingleTileImageryProvider({url : this.dayImageUrl}));
1150
+ if (imageLayers.getLength() > 1) {
1151
+ imageLayers.remove(imageLayers.get(0));
1152
+ }
1153
+ imageLayers.lowerToBottom(newLayer);
1154
+ }
1155
+ }
1156
+ },
1157
+
1158
+ /**
1159
+ * If true, {@link CesiumViewerWidget#startRenderLoop} will be called automatically
1160
+ * at the end of {@link CesiumViewerWidget#startup}.
1161
+ *
1162
+ * @type {Boolean}
1163
+ * @memberof CesiumViewerWidget.prototype
1164
+ * @default true
1165
+ */
1166
+ autoStartRenderLoop : true,
1167
+
1168
+ /**
1169
+ * This is a simple render loop that can be started if there is only one <code>CesiumViewerWidget</code>
1170
+ * on your page. If you wish to customize your render loop, avoid this function and instead
1171
+ * use code similar to one of the following examples.
1172
+ *
1173
+ * @function
1174
+ * @memberof CesiumViewerWidget.prototype
1175
+ * @see requestAnimationFrame
1176
+ * @see CesiumViewerWidget#autoStartRenderLoop
1177
+ * @example
1178
+ * // This takes the place of startRenderLoop for a single widget.
1179
+ *
1180
+ * var animationController = widget.animationController;
1181
+ * function updateAndRender() {
1182
+ * var currentTime = animationController.update();
1183
+ * widget.initializeFrame();
1184
+ * widget.update(currentTime);
1185
+ * widget.render(currentTime);
1186
+ * requestAnimationFrame(updateAndRender);
1187
+ * }
1188
+ * requestAnimationFrame(updateAndRender);
1189
+ * @example
1190
+ * // This example requires widget1 and widget2 to share an animationController
1191
+ * // (for example, widget2's constructor was called with a copy of widget1's
1192
+ * // animationController).
1193
+ *
1194
+ * function updateAndRender() {
1195
+ * var currentTime = animationController.update();
1196
+ * widget1.initializeFrame();
1197
+ * widget2.initializeFrame();
1198
+ * widget1.update(currentTime);
1199
+ * widget2.update(currentTime);
1200
+ * widget1.render(currentTime);
1201
+ * widget2.render(currentTime);
1202
+ * requestAnimationFrame(updateAndRender);
1203
+ * }
1204
+ * requestAnimationFrame(updateAndRender);
1205
+ * @example
1206
+ * // This example uses separate animationControllers for widget1 and widget2.
1207
+ * // These widgets can animate at different rates and pause individually.
1208
+ *
1209
+ * function updateAndRender() {
1210
+ * var time1 = widget1.animationController.update();
1211
+ * var time2 = widget2.animationController.update();
1212
+ * widget1.initializeFrame();
1213
+ * widget2.initializeFrame();
1214
+ * widget1.update(time1);
1215
+ * widget2.update(time2);
1216
+ * widget1.render(time1);
1217
+ * widget2.render(time2);
1218
+ * requestAnimationFrame(updateAndRender);
1219
+ * }
1220
+ * requestAnimationFrame(updateAndRender);
1221
+ */
1222
+ startRenderLoop : function() {
1223
+ var widget = this;
1224
+ var animationController = widget.animationController;
1225
+
1226
+ function updateAndRender() {
1227
+ var currentTime = animationController.update();
1228
+ widget.initializeFrame();
1229
+ widget.update(currentTime);
1230
+ widget.render(currentTime);
1231
+ requestAnimationFrame(updateAndRender);
1232
+ }
1233
+
1234
+ requestAnimationFrame(updateAndRender);
1235
+ }
1236
+ });
1237
+ });