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,1120 @@
1
+ /*global define*/
2
+ define([
3
+ '../Core/defaultValue',
4
+ '../Core/destroyObject',
5
+ '../Core/BoundingSphere',
6
+ '../Core/BoundingRectangle',
7
+ '../Core/Cartesian2',
8
+ '../Core/Cartesian3',
9
+ '../Core/Cartesian4',
10
+ '../Core/CubeMapEllipsoidTessellator',
11
+ '../Core/DeveloperError',
12
+ '../Core/Ellipsoid',
13
+ '../Core/EllipsoidalOccluder',
14
+ '../Core/Intersect',
15
+ '../Core/Matrix4',
16
+ '../Core/MeshFilters',
17
+ '../Core/PrimitiveType',
18
+ '../Core/Queue',
19
+ '../Core/WebMercatorProjection',
20
+ '../Renderer/DrawCommand',
21
+ './ImageryLayer',
22
+ './ImageryState',
23
+ './SceneMode',
24
+ './TerrainProvider',
25
+ './TileLoadQueue',
26
+ './TileReplacementQueue',
27
+ './TileState'
28
+ ], function(
29
+ defaultValue,
30
+ destroyObject,
31
+ BoundingSphere,
32
+ BoundingRectangle,
33
+ Cartesian2,
34
+ Cartesian3,
35
+ Cartesian4,
36
+ CubeMapEllipsoidTessellator,
37
+ DeveloperError,
38
+ Ellipsoid,
39
+ EllipsoidalOccluder,
40
+ Intersect,
41
+ Matrix4,
42
+ MeshFilters,
43
+ PrimitiveType,
44
+ Queue,
45
+ WebMercatorProjection,
46
+ DrawCommand,
47
+ ImageryLayer,
48
+ ImageryState,
49
+ SceneMode,
50
+ TerrainProvider,
51
+ TileLoadQueue,
52
+ TileReplacementQueue,
53
+ TileState) {
54
+ "use strict";
55
+
56
+ /**
57
+ * Manages and renders the terrain and imagery on the surface of a {@link CentralBody}.
58
+ * This class should be considered an implementation detail of {@link CentralBody} and not
59
+ * used directly.
60
+ *
61
+ * @alias CentralBodySurface
62
+ * @constructor
63
+ * @private
64
+ */
65
+ var CentralBodySurface = function(description) {
66
+ if (typeof description.terrainProvider === 'undefined') {
67
+ throw new DeveloperError('description.terrainProvider is required.');
68
+ }
69
+ if (typeof description.imageryLayerCollection === 'undefined') {
70
+ throw new DeveloperError('description.imageryLayerCollection is required.');
71
+ }
72
+
73
+ this._terrainProvider = description.terrainProvider;
74
+ this._imageryLayerCollection = description.imageryLayerCollection;
75
+ this._maxScreenSpaceError = defaultValue(description.maxScreenSpaceError, 2);
76
+
77
+ this._imageryLayerCollection.layerAdded.addEventListener(CentralBodySurface.prototype._onLayerAdded, this);
78
+ this._imageryLayerCollection.layerRemoved.addEventListener(CentralBodySurface.prototype._onLayerRemoved, this);
79
+ this._imageryLayerCollection.layerMoved.addEventListener(CentralBodySurface.prototype._onLayerMoved, this);
80
+ this._imageryLayerCollection.layerShownOrHidden.addEventListener(CentralBodySurface.prototype._onLayerShownOrHidden, this);
81
+
82
+ this._layerOrderChanged = false;
83
+
84
+ var terrainTilingScheme = this._terrainProvider.tilingScheme;
85
+ this._levelZeroTiles = terrainTilingScheme.createLevelZeroTiles();
86
+
87
+ this._tilesToRenderByTextureCount = [];
88
+ this._tileCommands = [];
89
+ this._tileCommandUniformMaps = [];
90
+ this._tileTraversalQueue = new Queue();
91
+ this._tileLoadQueue = new TileLoadQueue();
92
+ this._tileReplacementQueue = new TileReplacementQueue();
93
+
94
+ // The number of milliseconds each frame to allow for processing the tile load queue.
95
+ // At least one tile will be processed per frame (assuming that any need processing),
96
+ // even if this value is 0.
97
+ this._loadQueueTimeSlice = 5;
98
+
99
+ var ellipsoid = terrainTilingScheme.getEllipsoid();
100
+ this._ellipsoidalOccluder = new EllipsoidalOccluder(ellipsoid, Cartesian3.ZERO);
101
+
102
+ this._debug = {
103
+ enableDebugOutput : false,
104
+ boundingSphereTile : undefined,
105
+ boundingSphereVA : undefined,
106
+
107
+ maxDepth : 0,
108
+ tilesVisited : 0,
109
+ tilesCulled : 0,
110
+ tilesRendered : 0,
111
+ texturesRendered : 0,
112
+ tilesWaitingForChildren : 0,
113
+
114
+ lastMaxDepth : -1,
115
+ lastTilesVisited : -1,
116
+ lastTilesCulled : -1,
117
+ lastTilesRendered : -1,
118
+ lastTexturesRendered : -1,
119
+ lastTilesWaitingForChildren : -1,
120
+
121
+ suspendLodUpdate : false
122
+ };
123
+ };
124
+
125
+ CentralBodySurface.prototype.update = function(context, frameState, colorCommandList, centralBodyUniformMap, shaderSet, renderState, mode, projection) {
126
+ updateLayers(this);
127
+ selectTilesForRendering(this, context, frameState);
128
+ processTileLoadQueue(this, context, frameState);
129
+ createRenderCommandsForSelectedTiles(this, context, frameState, shaderSet, mode, projection, centralBodyUniformMap, colorCommandList, renderState);
130
+ debugCreateRenderCommandsForTileBoundingSphere(this, context, frameState, centralBodyUniformMap, shaderSet, renderState, colorCommandList);
131
+ };
132
+
133
+ CentralBodySurface.prototype._onLayerAdded = function(layer, index) {
134
+ if (typeof this._levelZeroTiles === 'undefined') {
135
+ return;
136
+ }
137
+
138
+ // create TileImagerys for this layer for all previously loaded tiles
139
+ if (layer.show) {
140
+ var tile = this._tileReplacementQueue.head;
141
+ while (typeof tile !== 'undefined') {
142
+ if (layer._createTileImagerySkeletons(tile, this._terrainProvider)) {
143
+ tile.doneLoading = false;
144
+ }
145
+ tile = tile.replacementNext;
146
+ }
147
+
148
+ this._layerOrderChanged = true;
149
+ }
150
+ };
151
+
152
+ CentralBodySurface.prototype._onLayerRemoved = function(layer, index) {
153
+ if (typeof this._levelZeroTiles === 'undefined') {
154
+ return;
155
+ }
156
+
157
+ // destroy TileImagerys for this layer for all previously loaded tiles
158
+ var tile = this._tileReplacementQueue.head;
159
+ while (typeof tile !== 'undefined') {
160
+ var tileImageryCollection = tile.imagery;
161
+
162
+ var startIndex = -1;
163
+ var numDestroyed = 0;
164
+ for ( var i = 0, len = tileImageryCollection.length; i < len; ++i) {
165
+ var tileImagery = tileImageryCollection[i];
166
+ var imagery = tileImagery.imagery;
167
+ if (imagery.imageryLayer === layer) {
168
+ if (startIndex === -1) {
169
+ startIndex = i;
170
+ }
171
+
172
+ tileImagery.freeResources();
173
+ ++numDestroyed;
174
+ } else if (startIndex !== -1) {
175
+ // iterated past the section of TileImagerys belonging to this layer, no need to continue.
176
+ break;
177
+ }
178
+ }
179
+
180
+ if (startIndex !== -1) {
181
+ tileImageryCollection.splice(startIndex, numDestroyed);
182
+ }
183
+ // If the base layer has been removed, mark the tile as non-renderable.
184
+ if (layer.isBaseLayer()) {
185
+ tile.renderable = false;
186
+ }
187
+
188
+ tile = tile.replacementNext;
189
+ }
190
+ };
191
+
192
+ CentralBodySurface.prototype._onLayerMoved = function(layer, newIndex, oldIndex) {
193
+ if (typeof this._levelZeroTiles === 'undefined') {
194
+ return;
195
+ }
196
+
197
+ this._layerOrderChanged = true;
198
+ };
199
+
200
+ CentralBodySurface.prototype._onLayerShownOrHidden = function(layer, index, show) {
201
+ if (typeof this._levelZeroTiles === 'undefined') {
202
+ return;
203
+ }
204
+
205
+ if (show) {
206
+ this._onLayerAdded(layer, index);
207
+ } else {
208
+ this._onLayerRemoved(layer, index);
209
+ }
210
+ };
211
+
212
+ /**
213
+ * Returns true if this object was destroyed; otherwise, false.
214
+ * <br /><br />
215
+ * If this object was destroyed, it should not be used; calling any function other than
216
+ * <code>isDestroyed</code> will result in a {@link DeveloperError} exception.
217
+ *
218
+ * @memberof CentralBodySurface
219
+ *
220
+ * @return {Boolean} True if this object was destroyed; otherwise, false.
221
+ *
222
+ * @see CentralBodySurface#destroy
223
+ */
224
+ CentralBodySurface.prototype.isDestroyed = function() {
225
+ return false;
226
+ };
227
+
228
+ /**
229
+ * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic
230
+ * release of WebGL resources, instead of relying on the garbage collector to destroy this object.
231
+ * <br /><br />
232
+ * Once an object is destroyed, it should not be used; calling any function other than
233
+ * <code>isDestroyed</code> will result in a {@link DeveloperError} exception. Therefore,
234
+ * assign the return value (<code>undefined</code>) to the object as done in the example.
235
+ *
236
+ * @memberof CentralBodySurface
237
+ *
238
+ * @return {undefined}
239
+ *
240
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
241
+ *
242
+ * @see CentralBodySurface#isDestroyed
243
+ */
244
+ CentralBodySurface.prototype.destroy = function() {
245
+ var levelZeroTiles = this._levelZeroTiles;
246
+ for (var i = 0; i < levelZeroTiles.length; ++i) {
247
+ levelZeroTiles[i].freeResources();
248
+ }
249
+
250
+ if (typeof this._terrainProvider.destroy !== 'undefined') {
251
+ this._terrainProvider.destroy();
252
+ }
253
+
254
+ this._imageryLayerCollection.destroy();
255
+
256
+ var debug = this._debug;
257
+ if (typeof debug !== 'undefined') {
258
+ if (typeof debug.boundingSphereVA !== 'undefined') {
259
+ debug.boundingSphereVA.destroy();
260
+ }
261
+ }
262
+
263
+ return destroyObject(this);
264
+ };
265
+
266
+ function sortTileImageryByLayerIndex(a, b) {
267
+ return a.imagery.imageryLayer._layerIndex - b.imagery.imageryLayer._layerIndex;
268
+ }
269
+
270
+ function updateLayers(surface) {
271
+ surface._imageryLayerCollection._update();
272
+
273
+ if (surface._layerOrderChanged) {
274
+ surface._layerOrderChanged = false;
275
+
276
+ // Sort the TileImagery instances in each tile by the layer index.
277
+ var tile = surface._tileReplacementQueue.head;
278
+ while (typeof tile !== 'undefined') {
279
+ tile.imagery.sort(sortTileImageryByLayerIndex);
280
+ tile = tile.replacementNext;
281
+ }
282
+ }
283
+ }
284
+
285
+ function selectTilesForRendering(surface, context, frameState) {
286
+ var debug = surface._debug;
287
+
288
+ if (debug.suspendLodUpdate) {
289
+ return;
290
+ }
291
+
292
+ var i, len;
293
+
294
+ // Clear the render list.
295
+ var tilesToRenderByTextureCount = surface._tilesToRenderByTextureCount;
296
+ for (i = 0, len = tilesToRenderByTextureCount.length; i < len; ++i) {
297
+ var tiles = tilesToRenderByTextureCount[i];
298
+ if (typeof tiles !== 'undefined') {
299
+ tiles.length = 0;
300
+ }
301
+ }
302
+
303
+ // We can't render anything before the level zero tiles exist.
304
+ if (typeof surface._levelZeroTiles === 'undefined') {
305
+ return;
306
+ }
307
+
308
+ var traversalQueue = surface._tileTraversalQueue;
309
+ traversalQueue.clear();
310
+
311
+ debug.maxDepth = 0;
312
+ debug.tilesVisited = 0;
313
+ debug.tilesCulled = 0;
314
+ debug.tilesRendered = 0;
315
+ debug.texturesRendered = 0;
316
+ debug.tilesWaitingForChildren = 0;
317
+
318
+ surface._tileLoadQueue.markInsertionPoint();
319
+ surface._tileReplacementQueue.markStartOfRenderFrame();
320
+
321
+ var cameraPosition = frameState.camera.getPositionWC();
322
+
323
+ var ellipsoid = surface._terrainProvider.tilingScheme.getEllipsoid();
324
+ var cameraPositionCartographic = ellipsoid.cartesianToCartographic(cameraPosition);
325
+
326
+ surface._ellipsoidalOccluder.setCameraPosition(cameraPosition);
327
+
328
+ var tile;
329
+
330
+ // Enqueue the root tiles that are renderable and visible.
331
+ var levelZeroTiles = surface._levelZeroTiles;
332
+ for (i = 0, len = levelZeroTiles.length; i < len; ++i) {
333
+ tile = levelZeroTiles[i];
334
+ if (!tile.doneLoading) {
335
+ queueTileLoad(surface, tile);
336
+ }
337
+ if (tile.renderable && isTileVisible(surface, frameState, tile)) {
338
+ traversalQueue.enqueue(tile);
339
+ } else {
340
+ ++debug.tilesCulled;
341
+ }
342
+ }
343
+
344
+ // Traverse the tiles in breadth-first order.
345
+ // This ordering allows us to load bigger, lower-detail tiles before smaller, higher-detail ones.
346
+ // This maximizes the average detail across the scene and results in fewer sharp transitions
347
+ // between very different LODs.
348
+ while (typeof (tile = traversalQueue.dequeue()) !== 'undefined') {
349
+ ++debug.tilesVisited;
350
+
351
+ surface._tileReplacementQueue.markTileRendered(tile);
352
+
353
+ if (tile.level > debug.maxDepth) {
354
+ debug.maxDepth = tile.level;
355
+ }
356
+
357
+ // There are a few different algorithms we could use here.
358
+ // This one doesn't load children unless we refine to them.
359
+ // We may want to revisit this in the future.
360
+
361
+ if (screenSpaceError(surface, context, frameState, cameraPosition, cameraPositionCartographic, tile) < surface._maxScreenSpaceError) {
362
+ // This tile meets SSE requirements, so render it.
363
+ addTileToRenderList(surface, tile);
364
+ } else if (queueChildrenLoadAndDetermineIfChildrenAreAllRenderable(surface, frameState, tile)) {
365
+ // SSE is not good enough and children are loaded, so refine.
366
+ var children = tile.children;
367
+ // PERFORMANCE_IDEA: traverse children front-to-back so we can avoid sorting by distance later.
368
+ for (i = 0, len = children.length; i < len; ++i) {
369
+ if (isTileVisible(surface, frameState, children[i])) {
370
+ traversalQueue.enqueue(children[i]);
371
+ } else {
372
+ ++debug.tilesCulled;
373
+ }
374
+ }
375
+ } else {
376
+ ++debug.tilesWaitingForChildren;
377
+ // SSE is not good enough but not all children are loaded, so render this tile anyway.
378
+ addTileToRenderList(surface, tile);
379
+ }
380
+ }
381
+
382
+ if (debug.enableDebugOutput) {
383
+ if (debug.tilesVisited !== debug.lastTilesVisited ||
384
+ debug.tilesRendered !== debug.lastTilesRendered ||
385
+ debug.texturesRendered !== debug.lastTexturesRendered ||
386
+ debug.tilesCulled !== debug.lastTilesCulled ||
387
+ debug.maxDepth !== debug.lastMaxDepth ||
388
+ debug.tilesWaitingForChildren !== debug.lastTilesWaitingForChildren) {
389
+
390
+ /*global console*/
391
+ console.log('Visited ' + debug.tilesVisited + ', Rendered: ' + debug.tilesRendered + ', Textures: ' + debug.texturesRendered + ', Culled: ' + debug.tilesCulled + ', Max Depth: ' + debug.maxDepth + ', Waiting for children: ' + debug.tilesWaitingForChildren);
392
+
393
+ debug.lastTilesVisited = debug.tilesVisited;
394
+ debug.lastTilesRendered = debug.tilesRendered;
395
+ debug.lastTexturesRendered = debug.texturesRendered;
396
+ debug.lastTilesCulled = debug.tilesCulled;
397
+ debug.lastMaxDepth = debug.maxDepth;
398
+ debug.lastTilesWaitingForChildren = debug.tilesWaitingForChildren;
399
+ }
400
+ }
401
+ }
402
+
403
+ function screenSpaceError(surface, context, frameState, cameraPosition, cameraPositionCartographic, tile) {
404
+ if (frameState.mode === SceneMode.SCENE2D) {
405
+ return screenSpaceError2D(surface, context, frameState, cameraPosition, cameraPositionCartographic, tile);
406
+ }
407
+
408
+ var extent = tile.extent;
409
+
410
+ var latitudeFactor = 1.0;
411
+
412
+ // Adjust by latitude in 3D only.
413
+ if (frameState.mode === SceneMode.SCENE3D) {
414
+ var latitudeClosestToEquator = 0.0;
415
+ if (extent.south > 0.0) {
416
+ latitudeClosestToEquator = extent.south;
417
+ } else if (extent.north < 0.0) {
418
+ latitudeClosestToEquator = extent.north;
419
+ }
420
+
421
+ latitudeFactor = Math.cos(latitudeClosestToEquator);
422
+ }
423
+
424
+ var maxGeometricError = latitudeFactor * surface._terrainProvider.getLevelMaximumGeometricError(tile.level);
425
+
426
+
427
+ var distance = Math.sqrt(distanceSquaredToTile(frameState, cameraPosition, cameraPositionCartographic, tile));
428
+ tile.distance = distance;
429
+
430
+ var canvas = context.getCanvas();
431
+ var height = canvas.clientHeight;
432
+
433
+ var camera = frameState.camera;
434
+ var frustum = camera.frustum;
435
+ var fovy = frustum.fovy;
436
+
437
+ // PERFORMANCE_IDEA: factor out stuff that's constant across tiles.
438
+ return (maxGeometricError * height) / (2 * distance * Math.tan(0.5 * fovy));
439
+ }
440
+
441
+ function screenSpaceError2D(surface, context, frameState, cameraPosition, cameraPositionCartographic, tile) {
442
+ var camera = frameState.camera;
443
+ var frustum = camera.frustum;
444
+ var canvas = context.getCanvas();
445
+ var width = canvas.clientWidth;
446
+ var height = canvas.clientHeight;
447
+
448
+ var maxGeometricError = surface._terrainProvider.getLevelMaximumGeometricError(tile.level);
449
+ var pixelSize = Math.max(frustum.top - frustum.bottom, frustum.right - frustum.left) / Math.max(width, height);
450
+ return maxGeometricError / pixelSize;
451
+ }
452
+
453
+ function addTileToRenderList(surface, tile) {
454
+ var readyTextureCount = 0;
455
+ var tileImageryCollection = tile.imagery;
456
+ for ( var i = 0, len = tileImageryCollection.length; i < len; ++i) {
457
+ var tileImagery = tileImageryCollection[i];
458
+ if (tileImagery.imagery.state === ImageryState.READY) {
459
+ ++readyTextureCount;
460
+ }
461
+ }
462
+
463
+ var tileSet = surface._tilesToRenderByTextureCount[readyTextureCount];
464
+ if (typeof tileSet === 'undefined') {
465
+ tileSet = [];
466
+ surface._tilesToRenderByTextureCount[readyTextureCount] = tileSet;
467
+ }
468
+
469
+ tileSet.push(tile);
470
+
471
+ var debug = surface._debug;
472
+ ++debug.tilesRendered;
473
+ debug.texturesRendered += readyTextureCount;
474
+ }
475
+
476
+ var boundingSphereScratch = new BoundingSphere();
477
+
478
+ function isTileVisible(surface, frameState, tile) {
479
+ var cullingVolume = frameState.cullingVolume;
480
+
481
+ var boundingVolume = tile.boundingSphere3D;
482
+
483
+ if (frameState.mode !== SceneMode.SCENE3D) {
484
+ boundingVolume = boundingSphereScratch;
485
+ BoundingSphere.fromExtent2D(tile.extent, frameState.scene2D.projection, boundingVolume);
486
+ boundingVolume.center = new Cartesian3(0.0, boundingVolume.center.x, boundingVolume.center.y);
487
+
488
+ if (frameState.mode === SceneMode.MORPHING) {
489
+ boundingVolume = BoundingSphere.union(tile.boundingSphere3D, boundingVolume, boundingVolume);
490
+ }
491
+ }
492
+
493
+ if (cullingVolume.getVisibility(boundingVolume) === Intersect.OUTSIDE) {
494
+ return false;
495
+ }
496
+
497
+ if (frameState.mode === SceneMode.SCENE3D) {
498
+ var occludeePointInScaledSpace = tile.occludeePointInScaledSpace;
499
+ if (typeof occludeePointInScaledSpace === 'undefined') {
500
+ return true;
501
+ }
502
+
503
+ return surface._ellipsoidalOccluder.isScaledSpacePointVisible(occludeePointInScaledSpace);
504
+ }
505
+
506
+ return true;
507
+ }
508
+
509
+ var southwestCornerScratch = new Cartesian3(0.0, 0.0, 0.0);
510
+ var northeastCornerScratch = new Cartesian3(0.0, 0.0, 0.0);
511
+ var negativeUnitY = Cartesian3.UNIT_Y.negate();
512
+ var negativeUnitZ = Cartesian3.UNIT_Z.negate();
513
+ var vectorScratch = new Cartesian3(0.0, 0.0, 0.0);
514
+
515
+ function distanceSquaredToTile(frameState, cameraCartesianPosition, cameraCartographicPosition, tile) {
516
+ var southwestCornerCartesian = tile.southwestCornerCartesian;
517
+ var northeastCornerCartesian = tile.northeastCornerCartesian;
518
+ var westNormal = tile.westNormal;
519
+ var southNormal = tile.southNormal;
520
+ var eastNormal = tile.eastNormal;
521
+ var northNormal = tile.northNormal;
522
+ var maxHeight = tile.maxHeight;
523
+
524
+ if (frameState.mode !== SceneMode.SCENE3D) {
525
+ southwestCornerCartesian = frameState.scene2D.projection.project(tile.extent.getSouthwest(), southwestCornerScratch);
526
+ southwestCornerCartesian.z = southwestCornerCartesian.y;
527
+ southwestCornerCartesian.y = southwestCornerCartesian.x;
528
+ southwestCornerCartesian.x = 0.0;
529
+ northeastCornerCartesian = frameState.scene2D.projection.project(tile.extent.getNortheast(), northeastCornerScratch);
530
+ northeastCornerCartesian.z = northeastCornerCartesian.y;
531
+ northeastCornerCartesian.y = northeastCornerCartesian.x;
532
+ northeastCornerCartesian.x = 0.0;
533
+ westNormal = negativeUnitY;
534
+ eastNormal = Cartesian3.UNIT_Y;
535
+ southNormal = negativeUnitZ;
536
+ northNormal = Cartesian3.UNIT_Z;
537
+ maxHeight = 0.0;
538
+ }
539
+
540
+ var vectorFromSouthwestCorner = cameraCartesianPosition.subtract(southwestCornerCartesian, vectorScratch);
541
+ var distanceToWestPlane = vectorFromSouthwestCorner.dot(westNormal);
542
+ var distanceToSouthPlane = vectorFromSouthwestCorner.dot(southNormal);
543
+
544
+ var vectorFromNortheastCorner = cameraCartesianPosition.subtract(northeastCornerCartesian, vectorScratch);
545
+ var distanceToEastPlane = vectorFromNortheastCorner.dot(eastNormal);
546
+ var distanceToNorthPlane = vectorFromNortheastCorner.dot(northNormal);
547
+
548
+ var cameraHeight;
549
+ if (frameState.mode === SceneMode.SCENE3D) {
550
+ cameraHeight = cameraCartographicPosition.height;
551
+ } else {
552
+ cameraHeight = cameraCartesianPosition.x;
553
+ }
554
+ var distanceFromTop = cameraHeight - maxHeight;
555
+
556
+ var result = 0.0;
557
+
558
+ if (distanceToWestPlane > 0.0) {
559
+ result += distanceToWestPlane * distanceToWestPlane;
560
+ } else if (distanceToEastPlane > 0.0) {
561
+ result += distanceToEastPlane * distanceToEastPlane;
562
+ }
563
+
564
+ if (distanceToSouthPlane > 0.0) {
565
+ result += distanceToSouthPlane * distanceToSouthPlane;
566
+ } else if (distanceToNorthPlane > 0.0) {
567
+ result += distanceToNorthPlane * distanceToNorthPlane;
568
+ }
569
+
570
+ if (distanceFromTop > 0.0) {
571
+ result += distanceFromTop * distanceFromTop;
572
+ }
573
+
574
+ return result;
575
+ }
576
+
577
+ function queueChildrenLoadAndDetermineIfChildrenAreAllRenderable(surface, frameState, tile) {
578
+ if (tile.level === surface._terrainProvider.maxLevel) {
579
+ return false;
580
+ }
581
+
582
+ var allRenderable = true;
583
+
584
+ var children = tile.getChildren();
585
+ for (var i = 0, len = children.length; i < len; ++i) {
586
+ var child = children[i];
587
+ surface._tileReplacementQueue.markTileRendered(child);
588
+ if (!child.doneLoading) {
589
+ queueTileLoad(surface, child);
590
+ }
591
+ if (!child.renderable) {
592
+ allRenderable = false;
593
+ }
594
+ }
595
+
596
+ return allRenderable;
597
+ }
598
+
599
+ function queueTileLoad(surface, tile) {
600
+ surface._tileLoadQueue.insertBeforeInsertionPoint(tile);
601
+ }
602
+
603
+ function processTileLoadQueue(surface, context, frameState) {
604
+ var tileLoadQueue = surface._tileLoadQueue;
605
+ var terrainProvider = surface._terrainProvider;
606
+
607
+ var tile = tileLoadQueue.head;
608
+ if (typeof tile === 'undefined') {
609
+ return;
610
+ }
611
+
612
+ var startTime = Date.now();
613
+ var timeSlice = surface._loadQueueTimeSlice;
614
+ var endTime = startTime + timeSlice;
615
+
616
+ do {
617
+ var i, len;
618
+
619
+ // Transition terrain states.
620
+ if (tile.state === TileState.UNLOADED) {
621
+ tile.state = TileState.TRANSITIONING;
622
+ terrainProvider.requestTileGeometry(tile);
623
+
624
+ // If we've made it past the UNLOADED state, add this tile to the replacement queue
625
+ // (replacing another tile if necessary), and create skeletons for the imagery.
626
+ if (tile.state !== TileState.UNLOADED) {
627
+ surface._tileReplacementQueue.markTileRendered(tile);
628
+
629
+ // Arbitrarily limit the number of loaded tiles to 100, or however
630
+ // many tiles were traversed this frame, whichever is greater.
631
+ surface._tileReplacementQueue.trimTiles(100);
632
+
633
+ var imageryLayerCollection = surface._imageryLayerCollection;
634
+ for (i = 0, len = imageryLayerCollection.getLength(); i < len; ++i) {
635
+ var layer = imageryLayerCollection.get(i);
636
+ if (layer.show) {
637
+ layer._createTileImagerySkeletons(tile, terrainProvider);
638
+ }
639
+ }
640
+
641
+ }
642
+ }
643
+
644
+ if (tile.state === TileState.RECEIVED) {
645
+ tile.state = TileState.TRANSITIONING;
646
+ terrainProvider.transformGeometry(context, tile);
647
+ }
648
+
649
+ if (tile.state === TileState.TRANSFORMED) {
650
+ tile.state = TileState.TRANSITIONING;
651
+ terrainProvider.createResources(context, tile);
652
+ }
653
+ // TODO: we should handle failed terrain. But it doesn't matter for now
654
+ // because EllipsoidTerrainProvider won't fail.
655
+
656
+ var doneLoading = tile.state === TileState.READY;
657
+
658
+ var didSomeWork = false;
659
+
660
+ // Transition imagery states
661
+ var tileImageryCollection = tile.imagery;
662
+ for (i = 0, len = tileImageryCollection.length; i < len; ++i) {
663
+ if (didSomeWork && Date.now() >= endTime) {
664
+ break;
665
+ }
666
+
667
+ var tileImagery = tileImageryCollection[i];
668
+ var imagery = tileImagery.imagery;
669
+ var imageryLayer = imagery.imageryLayer;
670
+
671
+ if (imagery.state === ImageryState.PLACEHOLDER) {
672
+ if (imageryLayer.getImageryProvider().isReady()) {
673
+ // Remove the placeholder and add the actual skeletons (if any)
674
+ // at the same position. Then continue the loop at the same index.
675
+ tileImagery.freeResources();
676
+ tileImageryCollection.splice(i, 1);
677
+ imageryLayer._createTileImagerySkeletons(tile, terrainProvider, i);
678
+ --i;
679
+ len = tileImageryCollection.length;
680
+ }
681
+ didSomeWork = true;
682
+ }
683
+
684
+ if (imagery.state === ImageryState.UNLOADED) {
685
+ imagery.state = ImageryState.TRANSITIONING;
686
+ imageryLayer._requestImagery(imagery);
687
+ didSomeWork = true;
688
+ }
689
+
690
+ if (imagery.state === ImageryState.RECEIVED) {
691
+ imagery.state = ImageryState.TRANSITIONING;
692
+ imageryLayer._createTexture(context, imagery);
693
+ didSomeWork = true;
694
+ }
695
+
696
+ if (imagery.state === ImageryState.TEXTURE_LOADED) {
697
+ imagery.state = ImageryState.TRANSITIONING;
698
+ imageryLayer._reprojectTexture(context, imagery);
699
+ didSomeWork = true;
700
+ }
701
+
702
+ if (imagery.state === ImageryState.FAILED || imagery.state === ImageryState.INVALID) {
703
+ // re-associate TileImagery with a parent Imagery that is not failed or invalid.
704
+ var parent = imagery.parent;
705
+ while (typeof parent !== 'undefined' && (parent.state === ImageryState.FAILED || parent.state === ImageryState.INVALID)) {
706
+ parent = parent.parent;
707
+ }
708
+
709
+ // If there's no valid parent, remove this TileImagery from the tile.
710
+ if (typeof parent === 'undefined') {
711
+ tileImagery.freeResources();
712
+ tileImageryCollection.splice(i, 1);
713
+ --i;
714
+ len = tileImageryCollection.length;
715
+ continue;
716
+ }
717
+
718
+ // use that parent imagery instead, storing the original imagery
719
+ // in originalImagery to keep it alive
720
+ tileImagery.originalImagery = imagery;
721
+
722
+ parent.addReference();
723
+ tileImagery.imagery = parent;
724
+ imagery = parent;
725
+
726
+ didSomeWork = true;
727
+ }
728
+
729
+ var imageryDoneLoading = imagery.state === ImageryState.READY;
730
+
731
+ if (imageryDoneLoading && typeof tileImagery.textureTranslationAndScale === 'undefined') {
732
+ tileImagery.textureTranslationAndScale = imageryLayer._calculateTextureTranslationAndScale(tile, tileImagery);
733
+
734
+ didSomeWork = true;
735
+ }
736
+
737
+ doneLoading = doneLoading && imageryDoneLoading;
738
+ }
739
+
740
+ // The tile becomes renderable when the terrain and all imagery data are loaded.
741
+ if (i === len && doneLoading) {
742
+ tile.renderable = true;
743
+ tile.doneLoading = true;
744
+ tileLoadQueue.remove(tile);
745
+ }
746
+
747
+ tile = tile.loadNext;
748
+ } while (Date.now() < endTime && typeof tile !== 'undefined');
749
+ }
750
+
751
+ // This is debug code to render the bounding sphere of the tile in
752
+ // CentralBodySurface._debug.boundingSphereTile.
753
+ CentralBodySurface.prototype.debugShowBoundingSphereOfTileAt = function(cartographicPick) {
754
+ // Find the tile in the render list that overlaps this extent
755
+ var tilesToRenderByTextureCount = this._tilesToRenderByTextureCount;
756
+ var result;
757
+ var tile;
758
+ for (var i = 0; i < tilesToRenderByTextureCount.length && typeof result === 'undefined'; ++i) {
759
+ var tileSet = tilesToRenderByTextureCount[i];
760
+ if (typeof tileSet === 'undefined') {
761
+ continue;
762
+ }
763
+ for (var j = 0; j < tileSet.length; ++j) {
764
+ tile = tileSet[j];
765
+ if (tile.extent.contains(cartographicPick)) {
766
+ result = tile;
767
+ break;
768
+ }
769
+ }
770
+ }
771
+
772
+ if (typeof result !== 'undefined') {
773
+ console.log('x: ' + result.x + ' y: ' + result.y + ' level: ' + result.level);
774
+ }
775
+
776
+ this._debug.boundingSphereTile = result;
777
+ this._debug.boundingSphereVA = undefined;
778
+ };
779
+
780
+ function debugCreateRenderCommandsForTileBoundingSphere(surface, context, frameState, centralBodyUniformMap, shaderSet, renderState, colorCommandList) {
781
+ if (typeof surface._debug !== 'undefined' && typeof surface._debug.boundingSphereTile !== 'undefined') {
782
+ if (!surface._debug.boundingSphereVA) {
783
+ var radius = surface._debug.boundingSphereTile.boundingSphere3D.radius;
784
+ var sphere = CubeMapEllipsoidTessellator.compute(new Ellipsoid(radius, radius, radius), 10);
785
+ MeshFilters.toWireframeInPlace(sphere);
786
+ surface._debug.boundingSphereVA = context.createVertexArrayFromMesh({
787
+ mesh : sphere,
788
+ attributeIndices : MeshFilters.createAttributeIndices(sphere)
789
+ });
790
+ }
791
+
792
+ var rtc2 = surface._debug.boundingSphereTile.center;
793
+
794
+ var uniformMap2 = createTileUniformMap();
795
+ mergeUniformMap(uniformMap2, centralBodyUniformMap);
796
+
797
+ uniformMap2.center3D = rtc2;
798
+
799
+ var viewMatrix = frameState.camera.getViewMatrix();
800
+
801
+ var centerEye2 = viewMatrix.multiplyByVector(new Cartesian4(rtc2.x, rtc2.y, rtc2.z, 1.0));
802
+ uniformMap2.modifiedModelView = viewMatrix.setColumn(3, centerEye2, uniformMap2.modifiedModelView);
803
+
804
+ uniformMap2.dayTextures[0] = context.getDefaultTexture();
805
+ uniformMap2.dayTextureTranslationAndScale[0] = new Cartesian4(0.0, 0.0, 1.0, 1.0);
806
+ uniformMap2.dayTextureTexCoordsExtent[0] = new Cartesian4(0.0, 0.0, 1.0, 1.0);
807
+ uniformMap2.dayTextureAlpha[0] = 1.0;
808
+
809
+ var boundingSphereCommand = new DrawCommand();
810
+ boundingSphereCommand.shaderProgram = shaderSet.getShaderProgram(context, 1);
811
+ boundingSphereCommand.renderState = renderState;
812
+ boundingSphereCommand.primitiveType = PrimitiveType.LINES;
813
+ boundingSphereCommand.vertexArray = surface._debug.boundingSphereVA;
814
+ boundingSphereCommand.uniformMap = uniformMap2;
815
+
816
+ colorCommandList.push(boundingSphereCommand);
817
+ }
818
+ }
819
+
820
+ CentralBodySurface.prototype.debugToggleLodUpdate = function(frameState) {
821
+ this._debug.suspendLodUpdate = !this._debug.suspendLodUpdate;
822
+ };
823
+
824
+ function tileDistanceSortFunction(a, b) {
825
+ return a.distance - b.distance;
826
+ }
827
+
828
+ function createTileUniformMap() {
829
+ return {
830
+ u_center3D : function() {
831
+ return this.center3D;
832
+ },
833
+ u_tileExtent : function() {
834
+ return this.tileExtent;
835
+ },
836
+ u_modifiedModelView : function() {
837
+ return this.modifiedModelView;
838
+ },
839
+ u_dayTextures : function() {
840
+ return this.dayTextures;
841
+ },
842
+ u_dayTextureTranslationAndScale : function() {
843
+ return this.dayTextureTranslationAndScale;
844
+ },
845
+ u_dayTextureTexCoordsExtent : function() {
846
+ return this.dayTextureTexCoordsExtent;
847
+ },
848
+ u_dayTextureAlpha : function() {
849
+ return this.dayTextureAlpha;
850
+ },
851
+ u_dayTextureBrightness : function() {
852
+ return this.dayTextureBrightness;
853
+ },
854
+ u_dayTextureContrast : function() {
855
+ return this.dayTextureContrast;
856
+ },
857
+ u_dayTextureHue : function() {
858
+ return this.dayTextureHue;
859
+ },
860
+ u_dayTextureSaturation : function() {
861
+ return this.dayTextureSaturation;
862
+ },
863
+ u_dayTextureOneOverGamma : function() {
864
+ return this.dayTextureOneOverGamma;
865
+ },
866
+ u_dayIntensity : function() {
867
+ return this.dayIntensity;
868
+ },
869
+ u_southAndNorthLatitude : function() {
870
+ return this.southAndNorthLatitude;
871
+ },
872
+ u_southMercatorYLowAndHighAndOneOverHeight : function() {
873
+ return this.southMercatorYLowAndHighAndOneOverHeight;
874
+ },
875
+
876
+ center3D : undefined,
877
+ modifiedModelView : new Matrix4(),
878
+ tileExtent : new Cartesian4(),
879
+
880
+ dayTextures : [],
881
+ dayTextureTranslationAndScale : [],
882
+ dayTextureTexCoordsExtent : [],
883
+ dayTextureAlpha : [],
884
+ dayTextureBrightness : [],
885
+ dayTextureContrast : [],
886
+ dayTextureHue : [],
887
+ dayTextureSaturation : [],
888
+ dayTextureOneOverGamma : [],
889
+ dayIntensity : 0.0,
890
+
891
+ southAndNorthLatitude : new Cartesian2(0.0, 0.0),
892
+ southMercatorYLowAndHighAndOneOverHeight : new Cartesian3(0.0, 0.0, 0.0)
893
+ };
894
+ }
895
+
896
+ function mergeUniformMap(target, source) {
897
+ for (var property in source) {
898
+ if (source.hasOwnProperty(property)) {
899
+ target[property] = source[property];
900
+ }
901
+ }
902
+ }
903
+
904
+ var float32ArrayScratch = typeof Float32Array !== 'undefined' ? new Float32Array(1) : undefined;
905
+ var modifiedModelViewScratch = new Matrix4();
906
+ var tileExtentScratch = new Cartesian4();
907
+ var rtcScratch = new Cartesian3();
908
+ var centerEyeScratch = new Cartesian4();
909
+
910
+ function createRenderCommandsForSelectedTiles(surface, context, frameState, shaderSet, mode, projection, centralBodyUniformMap, colorCommandList, renderState) {
911
+ var viewMatrix = frameState.camera.getViewMatrix();
912
+
913
+ var maxTextures = context.getMaximumTextureImageUnits();
914
+
915
+ var tileCommands = surface._tileCommands;
916
+ var tileCommandUniformMaps = surface._tileCommandUniformMaps;
917
+ var tileCommandIndex = -1;
918
+
919
+ var tilesToRenderByTextureCount = surface._tilesToRenderByTextureCount;
920
+ for (var tileSetIndex = 0, tileSetLength = tilesToRenderByTextureCount.length; tileSetIndex < tileSetLength; ++tileSetIndex) {
921
+ var tileSet = tilesToRenderByTextureCount[tileSetIndex];
922
+ if (typeof tileSet === 'undefined' || tileSet.length === 0) {
923
+ continue;
924
+ }
925
+
926
+ tileSet.sort(tileDistanceSortFunction);
927
+
928
+ for (var i = 0, len = tileSet.length; i < len; i++) {
929
+ var tile = tileSet[i];
930
+
931
+ var rtc = tile.center;
932
+
933
+ // Not used in 3D.
934
+ var tileExtent = tileExtentScratch;
935
+
936
+ // Only used for Mercator projections.
937
+ var southLatitude = 0.0;
938
+ var northLatitude = 0.0;
939
+ var southMercatorYHigh = 0.0;
940
+ var southMercatorYLow = 0.0;
941
+ var oneOverMercatorHeight = 0.0;
942
+
943
+ if (mode !== SceneMode.SCENE3D) {
944
+ var southwest = projection.project(tile.extent.getSouthwest());
945
+ var northeast = projection.project(tile.extent.getNortheast());
946
+
947
+ tileExtent.x = southwest.x;
948
+ tileExtent.y = southwest.y;
949
+ tileExtent.z = northeast.x;
950
+ tileExtent.w = northeast.y;
951
+
952
+ // In 2D and Columbus View, use the center of the tile for RTC rendering.
953
+ if (mode !== SceneMode.MORPHING) {
954
+ rtc = rtcScratch;
955
+ rtc.x = 0.0;
956
+ rtc.y = (tileExtent.z + tileExtent.x) * 0.5;
957
+ rtc.z = (tileExtent.w + tileExtent.y) * 0.5;
958
+ tileExtent.x -= rtc.y;
959
+ tileExtent.y -= rtc.z;
960
+ tileExtent.z -= rtc.y;
961
+ tileExtent.w -= rtc.z;
962
+ }
963
+
964
+ if (projection instanceof WebMercatorProjection) {
965
+ southLatitude = tile.extent.south;
966
+ northLatitude = tile.extent.north;
967
+
968
+ var southMercatorY = WebMercatorProjection.geodeticLatitudeToMercatorAngle(southLatitude);
969
+ var northMercatorY = WebMercatorProjection.geodeticLatitudeToMercatorAngle(northLatitude);
970
+
971
+ float32ArrayScratch[0] = southMercatorY;
972
+ southMercatorYHigh = float32ArrayScratch[0];
973
+ southMercatorYLow = southMercatorY - float32ArrayScratch[0];
974
+
975
+ oneOverMercatorHeight = 1.0 / (northMercatorY - southMercatorY);
976
+ }
977
+ }
978
+
979
+ var centerEye = centerEyeScratch;
980
+ centerEye.x = rtc.x;
981
+ centerEye.y = rtc.y;
982
+ centerEye.z = rtc.z;
983
+ centerEye.w = 1.0;
984
+
985
+ Matrix4.multiplyByVector(viewMatrix, centerEye, centerEye);
986
+ viewMatrix.setColumn(3, centerEye, modifiedModelViewScratch);
987
+
988
+ var tileImageryCollection = tile.imagery;
989
+ var imageryIndex = 0;
990
+ var imageryLen = tileImageryCollection.length;
991
+
992
+ do {
993
+ var numberOfDayTextures = 0;
994
+
995
+ ++tileCommandIndex;
996
+ var command = tileCommands[tileCommandIndex];
997
+ if (typeof command === 'undefined') {
998
+ command = new DrawCommand();
999
+ tileCommands[tileCommandIndex] = command;
1000
+ tileCommandUniformMaps[tileCommandIndex] = createTileUniformMap();
1001
+ }
1002
+ var uniformMap = tileCommandUniformMaps[tileCommandIndex];
1003
+
1004
+ mergeUniformMap(uniformMap, centralBodyUniformMap);
1005
+
1006
+ uniformMap.center3D = tile.center;
1007
+
1008
+ Cartesian4.clone(tileExtent, uniformMap.tileExtent);
1009
+ uniformMap.southAndNorthLatitude.x = southLatitude;
1010
+ uniformMap.southAndNorthLatitude.y = northLatitude;
1011
+ uniformMap.southMercatorYLowAndHighAndOneOverHeight.x = southMercatorYLow;
1012
+ uniformMap.southMercatorYLowAndHighAndOneOverHeight.y = southMercatorYHigh;
1013
+ uniformMap.southMercatorYLowAndHighAndOneOverHeight.z = oneOverMercatorHeight;
1014
+ Matrix4.clone(modifiedModelViewScratch, uniformMap.modifiedModelView);
1015
+
1016
+ var applyBrightness = false;
1017
+ var applyContrast = false;
1018
+ var applyHue = false;
1019
+ var applySaturation = false;
1020
+ var applyGamma = false;
1021
+
1022
+ while (numberOfDayTextures < maxTextures && imageryIndex < imageryLen) {
1023
+ var tileImagery = tileImageryCollection[imageryIndex];
1024
+ var imagery = tileImagery.imagery;
1025
+ var imageryLayer = imagery.imageryLayer;
1026
+ ++imageryIndex;
1027
+
1028
+ if (imagery.state !== ImageryState.READY) {
1029
+ continue;
1030
+ }
1031
+
1032
+ if (typeof tileImagery.textureTranslationAndScale === 'undefined') {
1033
+ tileImagery.textureTranslationAndScale = imageryLayer._calculateTextureTranslationAndScale(tile, tileImagery);
1034
+ }
1035
+
1036
+ uniformMap.dayTextures[numberOfDayTextures] = imagery.texture;
1037
+ uniformMap.dayTextureTranslationAndScale[numberOfDayTextures] = tileImagery.textureTranslationAndScale;
1038
+ uniformMap.dayTextureTexCoordsExtent[numberOfDayTextures] = tileImagery.textureCoordinateExtent;
1039
+
1040
+ if (typeof imageryLayer.alpha === 'function') {
1041
+ uniformMap.dayTextureAlpha[numberOfDayTextures] = imageryLayer.alpha(frameState, imageryLayer, imagery.x, imagery.y, imagery.level);
1042
+ } else {
1043
+ uniformMap.dayTextureAlpha[numberOfDayTextures] = imageryLayer.alpha;
1044
+ }
1045
+
1046
+ if (typeof imageryLayer.brightness === 'function') {
1047
+ uniformMap.dayTextureBrightness[numberOfDayTextures] = imageryLayer.brightness(frameState, imageryLayer, imagery.x, imagery.y, imagery.level);
1048
+ } else {
1049
+ uniformMap.dayTextureBrightness[numberOfDayTextures] = imageryLayer.brightness;
1050
+ }
1051
+ applyBrightness = uniformMap.dayTextureBrightness[numberOfDayTextures] !== ImageryLayer.DEFAULT_BRIGHTNESS;
1052
+
1053
+ if (typeof imageryLayer.contrast === 'function') {
1054
+ uniformMap.dayTextureContrast[numberOfDayTextures] = imageryLayer.contrast(frameState, imageryLayer, imagery.x, imagery.y, imagery.level);
1055
+ } else {
1056
+ uniformMap.dayTextureContrast[numberOfDayTextures] = imageryLayer.contrast;
1057
+ }
1058
+ applyContrast = uniformMap.dayTextureContrast[numberOfDayTextures] !== ImageryLayer.DEFAULT_CONTRAST;
1059
+
1060
+ if (typeof imageryLayer.hue === 'function') {
1061
+ uniformMap.dayTextureHue[numberOfDayTextures] = imageryLayer.hue(frameState, imageryLayer, imagery.x, imagery.y, imagery.level);
1062
+ } else {
1063
+ uniformMap.dayTextureHue[numberOfDayTextures] = imageryLayer.hue;
1064
+ }
1065
+ applyHue = uniformMap.dayTextureHue[numberOfDayTextures] !== ImageryLayer.DEFAULT_HUE;
1066
+
1067
+ if (typeof imageryLayer.saturation === 'function') {
1068
+ uniformMap.dayTextureSaturation[numberOfDayTextures] = imageryLayer.saturation(frameState, imageryLayer, imagery.x, imagery.y, imagery.level);
1069
+ } else {
1070
+ uniformMap.dayTextureSaturation[numberOfDayTextures] = imageryLayer.saturation;
1071
+ }
1072
+ applySaturation = uniformMap.dayTextureSaturation[numberOfDayTextures] !== ImageryLayer.DEFAULT_SATURATION;
1073
+
1074
+ if (typeof imageryLayer.gamma === 'function') {
1075
+ uniformMap.dayTextureOneOverGamma[numberOfDayTextures] = 1.0 / imageryLayer.gamma(frameState, imageryLayer, imagery.x, imagery.y, imagery.level);
1076
+ } else {
1077
+ uniformMap.dayTextureOneOverGamma[numberOfDayTextures] = 1.0 / imageryLayer.gamma;
1078
+ }
1079
+ applyGamma = uniformMap.dayTextureOneOverGamma[numberOfDayTextures] !== 1.0 / ImageryLayer.DEFAULT_GAMMA;
1080
+
1081
+ ++numberOfDayTextures;
1082
+ }
1083
+
1084
+ // trim texture array to the used length so we don't end up using old textures
1085
+ // which might get destroyed eventually
1086
+ uniformMap.dayTextures.length = numberOfDayTextures;
1087
+
1088
+ colorCommandList.push(command);
1089
+
1090
+ command.shaderProgram = shaderSet.getShaderProgram(context, tileSetIndex, applyBrightness, applyContrast, applyHue, applySaturation, applyGamma);
1091
+ command.renderState = renderState;
1092
+ command.primitiveType = TerrainProvider.wireframe ? PrimitiveType.LINES : PrimitiveType.TRIANGLES;
1093
+ command.vertexArray = tile.vertexArray;
1094
+ command.uniformMap = uniformMap;
1095
+
1096
+ var boundingVolume = tile.boundingSphere3D;
1097
+
1098
+ if (frameState.mode !== SceneMode.SCENE3D) {
1099
+ // TODO: If we show terrain heights in Columbus View, the bounding sphere
1100
+ // needs to be expanded to include the heights.
1101
+ boundingVolume = BoundingSphere.fromExtent2D(tile.extent, frameState.scene2D.projection);
1102
+ boundingVolume.center = new Cartesian3(boundingVolume.center.z, boundingVolume.center.x, boundingVolume.center.y);
1103
+
1104
+ if (frameState.mode === SceneMode.MORPHING) {
1105
+ boundingVolume = BoundingSphere.union(tile.boundingSphere3D, boundingVolume, boundingVolume);
1106
+ }
1107
+ }
1108
+
1109
+ command.boundingVolume = boundingVolume;
1110
+
1111
+ } while (imageryIndex < imageryLen);
1112
+ }
1113
+ }
1114
+
1115
+ // trim command list to the number actually needed
1116
+ tileCommands.length = Math.max(0, tileCommandIndex);
1117
+ }
1118
+
1119
+ return CentralBodySurface;
1120
+ });