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,697 @@
1
+ /*global define*/
2
+ define([
3
+ '../Core/DeveloperError',
4
+ '../Core/destroyObject',
5
+ '../Core/Cartesian2',
6
+ '../Core/Matrix4',
7
+ '../Core/writeTextToCanvas',
8
+ '../Renderer/BufferUsage',
9
+ './BillboardCollection',
10
+ './Label',
11
+ './LabelStyle',
12
+ './HorizontalOrigin',
13
+ './VerticalOrigin'
14
+ ], function(
15
+ DeveloperError,
16
+ destroyObject,
17
+ Cartesian2,
18
+ Matrix4,
19
+ writeTextToCanvas,
20
+ BufferUsage,
21
+ BillboardCollection,
22
+ Label,
23
+ LabelStyle,
24
+ HorizontalOrigin,
25
+ VerticalOrigin) {
26
+ "use strict";
27
+
28
+ // A glyph represents a single character in a particular label. It may or may
29
+ // not have a billboard, depending on whether the texture info has an index into
30
+ // the the label collection's texture atlas. Invisible characters have no texture, and
31
+ // no billboard. However, it always has a valid dimensions object.
32
+ function Glyph() {
33
+ this.textureInfo = undefined;
34
+ this.dimensions = undefined;
35
+ this.billboard = undefined;
36
+ }
37
+
38
+ // GlyphTextureInfo represents a single character, drawn in a particular style,
39
+ // shared and reference counted across all labels. It may or may not have an
40
+ // index into the label collection's texture atlas, depending on whether the character
41
+ // has both width and height, but it always has a valid dimensions object.
42
+ function GlyphTextureInfo(labelCollection, index, dimensions) {
43
+ this.labelCollection = labelCollection;
44
+ this.index = index;
45
+ this.dimensions = dimensions;
46
+ this.referenceCount = 1;
47
+
48
+ ++labelCollection._textureCount;
49
+ }
50
+
51
+ GlyphTextureInfo.prototype.addReference = function() {
52
+ if (this.referenceCount === 0) {
53
+ // was fully released, now has references, so no longer unused
54
+ --this.labelCollection._unusedTextureCount;
55
+ }
56
+
57
+ ++this.referenceCount;
58
+ };
59
+
60
+ GlyphTextureInfo.prototype.releaseReference = function() {
61
+ --this.referenceCount;
62
+
63
+ if (this.referenceCount === 0) {
64
+ ++this.labelCollection._unusedTextureCount;
65
+ }
66
+ };
67
+
68
+ // reusable object for calling writeTextToCanvas
69
+ var writeTextToCanvasParameters = {};
70
+ function createGlyphCanvas(character, font, fillColor, outlineColor, style, verticalOrigin) {
71
+ writeTextToCanvasParameters.font = font;
72
+ writeTextToCanvasParameters.fillColor = fillColor;
73
+ writeTextToCanvasParameters.strokeColor = outlineColor;
74
+
75
+ if (verticalOrigin === VerticalOrigin.BOTTOM) {
76
+ writeTextToCanvasParameters.textBaseline = 'bottom';
77
+ } else if (verticalOrigin === VerticalOrigin.TOP) {
78
+ writeTextToCanvasParameters.textBaseline = 'top';
79
+ } else {
80
+ // VerticalOrigin.CENTER
81
+ writeTextToCanvasParameters.textBaseline = 'middle';
82
+ }
83
+
84
+ writeTextToCanvasParameters.fill = style === LabelStyle.FILL || style === LabelStyle.FILL_AND_OUTLINE;
85
+ writeTextToCanvasParameters.stroke = style === LabelStyle.OUTLINE || style === LabelStyle.FILL_AND_OUTLINE;
86
+
87
+ return writeTextToCanvas(character, writeTextToCanvasParameters);
88
+ }
89
+
90
+ function unbindGlyph(labelCollection, glyph) {
91
+ if (typeof glyph.textureInfo !== 'undefined') {
92
+ glyph.textureInfo.releaseReference();
93
+ }
94
+
95
+ glyph.textureInfo = undefined;
96
+ glyph.dimensions = undefined;
97
+
98
+ var billboard = glyph.billboard;
99
+ if (typeof billboard !== 'undefined') {
100
+ billboard.setShow(false);
101
+ billboard.setImageIndex(-1);
102
+ labelCollection._spareBillboards.push(billboard);
103
+ glyph.billboard = undefined;
104
+ }
105
+ }
106
+
107
+ function rebindAllGlyphs(labelCollection, label) {
108
+ var text = label._text;
109
+ var textLength = text.length;
110
+ var glyphs = label._glyphs;
111
+ var glyphsLength = glyphs.length;
112
+
113
+ var glyph, glyphIndex, textIndex;
114
+
115
+ // if we have more glyphs than needed, unbind the extras.
116
+ if (textLength < glyphsLength) {
117
+ for (glyphIndex = textLength; glyphIndex < glyphsLength; ++glyphIndex) {
118
+ unbindGlyph(labelCollection, glyphs[glyphIndex]);
119
+ }
120
+ }
121
+
122
+ // presize glyphs to match the new text length
123
+ glyphs.length = textLength;
124
+
125
+ var glyphTextureCache = labelCollection._glyphTextureCache;
126
+ var textureAtlas = labelCollection._textureAtlas;
127
+
128
+ // walk the text looking for new characters (creating new glyphs for each)
129
+ // or changed characters (rebinding existing glyphs)
130
+ for (textIndex = 0; textIndex < textLength; ++textIndex) {
131
+ var character = text.charAt(textIndex);
132
+ var font = label._font;
133
+ var fillColor = label._fillColor;
134
+ var outlineColor = label._outlineColor;
135
+ var style = label._style;
136
+ var verticalOrigin = label._verticalOrigin;
137
+
138
+ // retrieve glyph dimensions and texture index (if the canvas has area)
139
+ // from the glyph texture cache, or create and add if not present.
140
+ var id = JSON.stringify([
141
+ character,
142
+ font,
143
+ fillColor.toString(),
144
+ outlineColor.toString(),
145
+ style.toString(),
146
+ verticalOrigin.toString()
147
+ ]);
148
+
149
+ var glyphTextureInfo = glyphTextureCache[id];
150
+ if (typeof glyphTextureInfo === 'undefined') {
151
+ var canvas = createGlyphCanvas(character, font, fillColor, outlineColor, style, verticalOrigin);
152
+ var index = -1;
153
+ if (canvas.width > 0 && canvas.height > 0) {
154
+ index = textureAtlas.addImage(canvas);
155
+ }
156
+
157
+ glyphTextureInfo = new GlyphTextureInfo(labelCollection, index, canvas.dimensions);
158
+ glyphTextureCache[id] = glyphTextureInfo;
159
+ } else {
160
+ glyphTextureInfo.addReference();
161
+ }
162
+
163
+ glyph = glyphs[textIndex];
164
+
165
+ if (typeof glyph !== 'undefined') {
166
+ // clean up leftover information from the previous glyph
167
+ if (glyphTextureInfo.index === -1) {
168
+ // no texture, and therefore no billboard, for this glyph.
169
+ // so, completely unbind glyph.
170
+ unbindGlyph(labelCollection, glyph);
171
+ } else {
172
+ // we have a texture and billboard. If we had one before, release
173
+ // our reference to that texture info, but reuse the billboard.
174
+ if (typeof glyph.textureInfo !== 'undefined') {
175
+ glyph.textureInfo.releaseReference();
176
+ glyph.textureInfo = undefined;
177
+ }
178
+ }
179
+ } else {
180
+ // create a glyph object
181
+ glyph = new Glyph();
182
+ glyphs[textIndex] = glyph;
183
+ }
184
+
185
+ glyph.textureInfo = glyphTextureInfo;
186
+ glyph.dimensions = glyphTextureInfo.dimensions;
187
+
188
+ // if we have a texture, configure the existing billboard, or obtain one
189
+ if (glyphTextureInfo.index !== -1) {
190
+ var billboard = glyph.billboard;
191
+ if (typeof billboard === 'undefined') {
192
+ if (labelCollection._spareBillboards.length > 0) {
193
+ glyph.billboard = billboard = labelCollection._spareBillboards.pop();
194
+ } else {
195
+ glyph.billboard = billboard = labelCollection._billboardCollection.add();
196
+ }
197
+
198
+ billboard.setShow(label._show);
199
+ billboard.setPosition(label._position);
200
+ billboard.setEyeOffset(label._eyeOffset);
201
+ billboard.setHorizontalOrigin(HorizontalOrigin.LEFT);
202
+ billboard.setVerticalOrigin(label._verticalOrigin);
203
+ billboard.setScale(label._scale);
204
+ billboard._pickIdThis = label;
205
+ }
206
+
207
+ glyph.billboard.setImageIndex(glyphTextureInfo.index);
208
+ }
209
+ }
210
+
211
+ // changing glyphs will cause the position of the
212
+ // glyphs to change, since different characters have different widths
213
+ label._repositionAllGlyphs = true;
214
+ }
215
+
216
+ // reusable Cartesian2 instance
217
+ var glyphPixelOffset = new Cartesian2();
218
+
219
+ function repositionAllGlyphs(label) {
220
+ var glyphs = label._glyphs;
221
+ var glyph;
222
+ var dimensions;
223
+ var totalWidth = 0;
224
+ var maxHeight = 0;
225
+
226
+ var glyphIndex = 0;
227
+ var glyphLength = glyphs.length;
228
+ for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) {
229
+ glyph = glyphs[glyphIndex];
230
+ dimensions = glyph.dimensions;
231
+ totalWidth += dimensions.width;
232
+ maxHeight = Math.max(maxHeight, dimensions.height);
233
+ }
234
+
235
+ var scale = label._scale;
236
+ var horizontalOrigin = label._horizontalOrigin;
237
+ var widthOffset = 0;
238
+ if (horizontalOrigin === HorizontalOrigin.CENTER) {
239
+ widthOffset -= totalWidth / 2 * scale;
240
+ } else if (horizontalOrigin === HorizontalOrigin.RIGHT) {
241
+ widthOffset -= totalWidth * scale;
242
+ }
243
+
244
+ var pixelOffset = label._pixelOffset;
245
+
246
+ glyphPixelOffset.x = pixelOffset.x + widthOffset;
247
+ glyphPixelOffset.y = 0;
248
+
249
+ var verticalOrigin = label._verticalOrigin;
250
+ for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) {
251
+ glyph = glyphs[glyphIndex];
252
+ dimensions = glyph.dimensions;
253
+
254
+ if (verticalOrigin === VerticalOrigin.BOTTOM || dimensions.height === maxHeight) {
255
+ glyphPixelOffset.y = pixelOffset.y - dimensions.descent * scale;
256
+ } else if (verticalOrigin === VerticalOrigin.TOP) {
257
+ glyphPixelOffset.y = pixelOffset.y - (maxHeight - dimensions.height) * scale - dimensions.descent * scale;
258
+ } else if (verticalOrigin === VerticalOrigin.CENTER) {
259
+ glyphPixelOffset.y = pixelOffset.y - (maxHeight - dimensions.height) / 2 * scale - dimensions.descent * scale;
260
+ }
261
+
262
+ if (typeof glyph.billboard !== 'undefined') {
263
+ glyph.billboard.setPixelOffset(glyphPixelOffset);
264
+ }
265
+
266
+ glyphPixelOffset.x += dimensions.width * scale;
267
+ }
268
+ }
269
+
270
+ function destroyLabel(labelCollection, label) {
271
+ var glyphs = label._glyphs;
272
+ for ( var i = 0, len = glyphs.length; i < len; ++i) {
273
+ unbindGlyph(labelCollection, glyphs[i]);
274
+ }
275
+ destroyObject(label);
276
+ }
277
+
278
+ /**
279
+ * A renderable collection of labels. Labels are viewport-aligned text positioned in the 3D scene.
280
+ * Each label can have a different font, color, scale, etc.
281
+ * <br /><br />
282
+ * <div align='center'>
283
+ * <img src='images/Label.png' width='400' height='300' /><br />
284
+ * Example labels
285
+ * </div>
286
+ * <br /><br />
287
+ * Labels are added and removed from the collection using {@link LabelCollection#add}
288
+ * and {@link LabelCollection#remove}.
289
+ *
290
+ * @alias LabelCollection
291
+ * @constructor
292
+ *
293
+ * @performance For best performance, prefer a few collections, each with many labels, to
294
+ * many collections with only a few labels each. Avoid having collections where some
295
+ * labels change every frame and others do not; instead, create one or more collections
296
+ * for static labels, and one or more collections for dynamic labels.
297
+ *
298
+ * @see LabelCollection#add
299
+ * @see LabelCollection#remove
300
+ * @see Label
301
+ * @see BillboardCollection
302
+ *
303
+ * @example
304
+ * // Create a label collection with two labels
305
+ * var labels = new LabelCollection();
306
+ * labels.add({
307
+ * position : { x : 1.0, y : 2.0, z : 3.0 },
308
+ * text : 'A label'
309
+ * });
310
+ * labels.add({
311
+ * position : { x : 4.0, y : 5.0, z : 6.0 },
312
+ * text : 'Another label'
313
+ * });
314
+ */
315
+ var LabelCollection = function() {
316
+ this._textureAtlas = undefined;
317
+
318
+ this._billboardCollection = new BillboardCollection();
319
+ this._billboardCollection.setDestroyTextureAtlas(false);
320
+
321
+ this._spareBillboards = [];
322
+ this._glyphTextureCache = {};
323
+ this._textureCount = 0;
324
+ this._unusedTextureCount = 0;
325
+ this._labels = [];
326
+ this._labelsToUpdate = [];
327
+ this._frameCount = 0;
328
+ this._totalGlyphCount = 0;
329
+
330
+ /**
331
+ * The 4x4 transformation matrix that transforms each label in this collection from model to world coordinates.
332
+ * When this is the identity matrix, the labels are drawn in world coordinates, i.e., Earth's WGS84 coordinates.
333
+ * Local reference frames can be used by providing a different transformation matrix, like that returned
334
+ * by {@link Transforms.eastNorthUpToFixedFrame}. This matrix is available to GLSL vertex and fragment
335
+ * shaders via {@link czm_model} and derived uniforms.
336
+ *
337
+ * @type Matrix4
338
+ *
339
+ * @see Transforms.eastNorthUpToFixedFrame
340
+ * @see czm_model
341
+ *
342
+ * @example
343
+ * var center = ellipsoid.cartographicToCartesian(Cartographic.fromDegrees(-75.59777, 40.03883));
344
+ * labels.modelMatrix = Transforms.eastNorthUpToFixedFrame(center);
345
+ * labels.add({
346
+ * position : new Cartesian3(0.0, 0.0, 0.0),
347
+ * text : 'Center'
348
+ * });
349
+ * labels.add({
350
+ * position : new Cartesian3(1000000.0, 0.0, 0.0),
351
+ * text : 'East'
352
+ * });
353
+ * labels.add({
354
+ * position : new Cartesian3(0.0, 1000000.0, 0.0),
355
+ * text : 'North'
356
+ * });
357
+ * labels.add({
358
+ * position : new Cartesian3(0.0, 0.0, 1000000.0),
359
+ * text : 'Up'
360
+ * });
361
+ */
362
+ this.modelMatrix = Matrix4.IDENTITY.clone();
363
+
364
+ /**
365
+ * If true, aligns all text to a pixel in screen space,
366
+ * providing crisper text at the cost of jumpier motion.
367
+ * Defaults to true.
368
+ *
369
+ * @type Boolean
370
+ */
371
+ this.clampToPixel = true;
372
+
373
+ /**
374
+ * The current morph transition time between 2D/Columbus View and 3D,
375
+ * with 0.0 being 2D or Columbus View and 1.0 being 3D.
376
+ *
377
+ * @type Number
378
+ */
379
+ this.morphTime = 1.0;
380
+ };
381
+
382
+ /**
383
+ * Creates and adds a label with the specified initial properties to the collection.
384
+ * The added label is returned so it can be modified or removed from the collection later.
385
+ *
386
+ * @memberof LabelCollection
387
+ *
388
+ * @param {Object}[description] A template describing the label's properties as shown in Example 1.
389
+ *
390
+ * @return {Label} The label that was added to the collection.
391
+ *
392
+ * @performance Calling <code>add</code> is expected constant time. However, when
393
+ * {@link LabelCollection#update} is called, the collection's vertex buffer
394
+ * is rewritten; this operations is <code>O(n)</code> and also incurs
395
+ * CPU to GPU overhead. For best performance, add as many billboards as possible before
396
+ * calling <code>update</code>.
397
+ *
398
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
399
+ *
400
+ * @see LabelCollection#remove
401
+ * @see LabelCollection#removeAll
402
+ * @see LabelCollection#update
403
+ *
404
+ * @example
405
+ * // Example 1: Add a label, specifying all the default values.
406
+ * var l = labels.add({
407
+ * show : true,
408
+ * position : Cartesian3.ZERO,
409
+ * text : '',
410
+ * font : '30px sans-serif',
411
+ * fillColor : 'white',
412
+ * outlineColor : 'white',
413
+ * style : LabelStyle.FILL,
414
+ * pixelOffset : Cartesian2.ZERO,
415
+ * eyeOffset : Cartesian3.ZERO,
416
+ * horizontalOrigin : HorizontalOrigin.LEFT,
417
+ * verticalOrigin : VerticalOrigin.BOTTOM,
418
+ * scale : 1.0,
419
+ * });
420
+ *
421
+ * // Example 2: Specify only the label's cartographic position,
422
+ * // text, and font.
423
+ * var l = labels.add({
424
+ * position : ellipsoid.cartographicToCartesian(new Cartographic(longitude, latitude, height)),
425
+ * text : 'Hello World',
426
+ * font : '24px Helvetica',
427
+ * });
428
+ */
429
+ LabelCollection.prototype.add = function(description) {
430
+ var label = new Label(description, this);
431
+
432
+ this._labels.push(label);
433
+ this._labelsToUpdate.push(label);
434
+
435
+ return label;
436
+ };
437
+
438
+ /**
439
+ * Removes a label from the collection. Once removed, a label is no longer usable.
440
+ *
441
+ * @memberof LabelCollection
442
+ *
443
+ * @param {Label} label The label to remove.
444
+ *
445
+ * @return {Boolean} <code>true</code> if the label was removed; <code>false</code> if the label was not found in the collection.
446
+ *
447
+ * @performance Calling <code>remove</code> is expected constant time. However, when
448
+ * {@link LabelCollection#update} is called, the collection's vertex buffer
449
+ * is rewritten - an <code>O(n)</code> operation that also incurs CPU to GPU overhead. For
450
+ * best performance, remove as many labels as possible before calling <code>update</code>.
451
+ * If you intend to temporarily hide a label, it is usually more efficient to call
452
+ * {@link Label#setShow} instead of removing and re-adding the label.
453
+ *
454
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
455
+ *
456
+ * @see LabelCollection#add
457
+ * @see LabelCollection#removeAll
458
+ * @see LabelCollection#update
459
+ * @see Label#setShow
460
+ *
461
+ * @example
462
+ * var l = labels.add(...);
463
+ * labels.remove(l); // Returns true
464
+ */
465
+ LabelCollection.prototype.remove = function(label) {
466
+ if (typeof label === 'undefined') {
467
+ return false;
468
+ }
469
+
470
+ if (label._labelCollection === this) {
471
+ this._labels.splice(this._labels.indexOf(label), 1);
472
+ destroyLabel(this, label);
473
+
474
+ return true;
475
+ }
476
+
477
+ return false;
478
+ };
479
+
480
+ /**
481
+ * Removes all labels from the collection.
482
+ *
483
+ * @memberof LabelCollection
484
+ *
485
+ * @performance <code>O(n)</code>. It is more efficient to remove all the labels
486
+ * from a collection and then add new ones than to create a new collection entirely.
487
+ *
488
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
489
+ *
490
+ * @see LabelCollection#add
491
+ * @see LabelCollection#remove
492
+ * @see LabelCollection#update
493
+ *
494
+ * @example
495
+ * labels.add(...);
496
+ * labels.add(...);
497
+ * labels.removeAll();
498
+ */
499
+ LabelCollection.prototype.removeAll = function() {
500
+ var labels = this._labels;
501
+
502
+ for ( var i = 0, len = labels.length; i < len; ++i) {
503
+ destroyLabel(this, labels[i]);
504
+ }
505
+
506
+ labels.length = 0;
507
+ };
508
+
509
+ /**
510
+ * Check whether this collection contains a given label.
511
+ *
512
+ * @memberof LabelCollection
513
+ *
514
+ * @param {Label} label The label to check for.
515
+ *
516
+ * @return {Boolean} true if this collection contains the label, false otherwise.
517
+ *
518
+ * @see LabelCollection#get
519
+ */
520
+ LabelCollection.prototype.contains = function(label) {
521
+ return typeof label !== 'undefined' && label._labelCollection === this;
522
+ };
523
+
524
+ /**
525
+ * Returns the label in the collection at the specified index. Indices are zero-based
526
+ * and increase as labels are added. Removing a label shifts all labels after
527
+ * it to the left, changing their indices. This function is commonly used with
528
+ * {@link LabelCollection#getLength} to iterate over all the labels
529
+ * in the collection.
530
+ *
531
+ * @memberof LabelCollection
532
+ *
533
+ * @param {Number} index The zero-based index of the billboard.
534
+ *
535
+ * @return {Label} The label at the specified index.
536
+ *
537
+ * @performance Expected constant time. If labels were removed from the collection and
538
+ * {@link LabelCollection#update} was not called, an implicit <code>O(n)</code>
539
+ * operation is performed.
540
+ *
541
+ * @exception {DeveloperError} index is required.
542
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
543
+ *
544
+ * @see LabelCollection#getLength
545
+ *
546
+ * @example
547
+ * // Toggle the show property of every label in the collection
548
+ * var len = labels.getLength();
549
+ * for (var i = 0; i < len; ++i) {
550
+ * var l = billboards.get(i);
551
+ * l.setShow(!l.getShow());
552
+ * }
553
+ */
554
+ LabelCollection.prototype.get = function(index) {
555
+ if (typeof index === 'undefined') {
556
+ throw new DeveloperError('index is required.');
557
+ }
558
+
559
+ return this._labels[index];
560
+ };
561
+
562
+ /**
563
+ * Returns the number of labels in this collection. This is commonly used with
564
+ * {@link LabelCollection#get} to iterate over all the labels
565
+ * in the collection.
566
+ *
567
+ * @memberof LabelCollection
568
+ *
569
+ * @return {Number} The number of labels in this collection.
570
+ *
571
+ * @performance Expected constant time. If labels were removed from the collection and
572
+ * {@link LabelCollection#update} was not called, an implicit <code>O(n)</code>
573
+ * operation is performed.
574
+ *
575
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
576
+ *
577
+ * @see LabelCollection#get
578
+ *
579
+ * @example
580
+ * // Toggle the show property of every label in the collection
581
+ * var len = labels.getLength();
582
+ * for (var i = 0; i < len; ++i) {
583
+ * var l = billboards.get(i);
584
+ * l.setShow(!l.getShow());
585
+ * }
586
+ */
587
+ LabelCollection.prototype.getLength = function() {
588
+ return this._labels.length;
589
+ };
590
+
591
+ /**
592
+ * @private
593
+ */
594
+ LabelCollection.prototype.update = function(context, frameState, commandList) {
595
+ var billboardCollection = this._billboardCollection;
596
+
597
+ billboardCollection.modelMatrix = this.modelMatrix;
598
+ billboardCollection.morphTime = this.morphTime;
599
+ billboardCollection.clampToPixel = this.clampToPixel;
600
+
601
+ var rebindAllGlyphsInAllLabels = false;
602
+ if (++this._frameCount % 100 === 0) {
603
+ this._frameCount = 0;
604
+ // clear and rebuild texture atlas to compact it when we have more than 25% unused textures
605
+ if (this._unusedTextureCount > 0.25 * this._textureCount) {
606
+ this._textureAtlas = this._textureAtlas.destroy();
607
+ this._glyphTextureCache = {};
608
+ this._textureCount = 0;
609
+ this._unusedTextureCount = 0;
610
+
611
+ // rebind and update all labels to repopulate the textures
612
+ rebindAllGlyphsInAllLabels = true;
613
+ this._labelsToUpdate = this._labels.slice(0);
614
+ }
615
+
616
+ // prune spare billboards to 10% of total glyph count
617
+ while (this._spareBillboards.length > this._totalGlyphCount * 0.1) {
618
+ billboardCollection.remove(this._spareBillboards.pop());
619
+ }
620
+ }
621
+
622
+ if (typeof this._textureAtlas === 'undefined') {
623
+ this._textureAtlas = context.createTextureAtlas();
624
+ billboardCollection.setTextureAtlas(this._textureAtlas);
625
+ }
626
+
627
+ var labelsToUpdate = this._labelsToUpdate;
628
+ for ( var i = 0, len = labelsToUpdate.length; i < len; ++i) {
629
+ var label = labelsToUpdate[i];
630
+ if (label.isDestroyed()) {
631
+ continue;
632
+ }
633
+
634
+ var preUpdateGlyphCount = label._glyphs.length;
635
+
636
+ if (rebindAllGlyphsInAllLabels || label._rebindAllGlyphs) {
637
+ rebindAllGlyphs(this, label);
638
+ label._rebindAllGlyphs = false;
639
+ }
640
+
641
+ if (label._repositionAllGlyphs) {
642
+ repositionAllGlyphs(label);
643
+ label._repositionAllGlyphs = false;
644
+ }
645
+
646
+ var glyphCountDifference = label._glyphs.length - preUpdateGlyphCount;
647
+ this._totalGlyphCount += glyphCountDifference;
648
+ }
649
+ labelsToUpdate.length = 0;
650
+
651
+ this._billboardCollection.update(context, frameState, commandList);
652
+ };
653
+
654
+ /**
655
+ * Returns true if this object was destroyed; otherwise, false.
656
+ * <br /><br />
657
+ * If this object was destroyed, it should not be used; calling any function other than
658
+ * <code>isDestroyed</code> will result in a {@link DeveloperError} exception.
659
+ *
660
+ * @memberof LabelCollection
661
+ *
662
+ * @return {Boolean} True if this object was destroyed; otherwise, false.
663
+ *
664
+ * @see LabelCollection#destroy
665
+ */
666
+ LabelCollection.prototype.isDestroyed = function() {
667
+ return false;
668
+ };
669
+
670
+ /**
671
+ * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic
672
+ * release of WebGL resources, instead of relying on the garbage collector to destroy this object.
673
+ * <br /><br />
674
+ * Once an object is destroyed, it should not be used; calling any function other than
675
+ * <code>isDestroyed</code> will result in a {@link DeveloperError} exception. Therefore,
676
+ * assign the return value (<code>undefined</code>) to the object as done in the example.
677
+ *
678
+ * @memberof LabelCollection
679
+ *
680
+ * @return {undefined}
681
+ *
682
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
683
+ *
684
+ * @see LabelCollection#isDestroyed
685
+ *
686
+ * @example
687
+ * labels = labels && labels.destroy();
688
+ */
689
+ LabelCollection.prototype.destroy = function() {
690
+ // removeAll destroys the texture atlas
691
+ this.removeAll();
692
+ this._billboardCollection.destroy();
693
+ return destroyObject(this);
694
+ };
695
+
696
+ return LabelCollection;
697
+ });