cesium 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
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,1209 @@
1
+ /*global define*/
2
+ define([
3
+ '../Core/DeveloperError',
4
+ '../Core/combine',
5
+ '../Core/destroyObject',
6
+ '../Core/Math',
7
+ '../Core/Cartesian2',
8
+ '../Core/Cartesian3',
9
+ '../Core/Cartesian4',
10
+ '../Core/EncodedCartesian3',
11
+ '../Core/Matrix4',
12
+ '../Core/ComponentDatatype',
13
+ '../Core/IndexDatatype',
14
+ '../Core/PrimitiveType',
15
+ '../Core/BoundingSphere',
16
+ '../Renderer/BlendingState',
17
+ '../Renderer/BufferUsage',
18
+ '../Renderer/CommandLists',
19
+ '../Renderer/DrawCommand',
20
+ '../Renderer/VertexArrayFacade',
21
+ './SceneMode',
22
+ './Billboard',
23
+ './HorizontalOrigin',
24
+ '../Shaders/BillboardCollectionVS',
25
+ '../Shaders/BillboardCollectionFS'
26
+ ], function(
27
+ DeveloperError,
28
+ combine,
29
+ destroyObject,
30
+ CesiumMath,
31
+ Cartesian2,
32
+ Cartesian3,
33
+ Cartesian4,
34
+ EncodedCartesian3,
35
+ Matrix4,
36
+ ComponentDatatype,
37
+ IndexDatatype,
38
+ PrimitiveType,
39
+ BoundingSphere,
40
+ BlendingState,
41
+ BufferUsage,
42
+ CommandLists,
43
+ DrawCommand,
44
+ VertexArrayFacade,
45
+ SceneMode,
46
+ Billboard,
47
+ HorizontalOrigin,
48
+ BillboardCollectionVS,
49
+ BillboardCollectionFS) {
50
+ "use strict";
51
+
52
+ var SHOW_INDEX = Billboard.SHOW_INDEX;
53
+ var POSITION_INDEX = Billboard.POSITION_INDEX;
54
+ var PIXEL_OFFSET_INDEX = Billboard.PIXEL_OFFSET_INDEX;
55
+ var EYE_OFFSET_INDEX = Billboard.EYE_OFFSET_INDEX;
56
+ var HORIZONTAL_ORIGIN_INDEX = Billboard.HORIZONTAL_ORIGIN_INDEX;
57
+ var VERTICAL_ORIGIN_INDEX = Billboard.VERTICAL_ORIGIN_INDEX;
58
+ var SCALE_INDEX = Billboard.SCALE_INDEX;
59
+ var IMAGE_INDEX_INDEX = Billboard.IMAGE_INDEX_INDEX;
60
+ var COLOR_INDEX = Billboard.COLOR_INDEX;
61
+ var NUMBER_OF_PROPERTIES = Billboard.NUMBER_OF_PROPERTIES;
62
+
63
+ // PERFORMANCE_IDEA: Use vertex compression so we don't run out of
64
+ // vec4 attributes (WebGL minimum: 8)
65
+ var attributeIndices = {
66
+ positionHigh : 0,
67
+ positionLow : 1,
68
+ pixelOffset : 2,
69
+ eyeOffsetAndScale : 3,
70
+ textureCoordinatesAndImageSize : 4,
71
+ originAndShow : 5,
72
+ direction : 6,
73
+ pickColor : 7, // pickColor and color shared an index because pickColor is only used during
74
+ color : 7 // the 'pick' pass and 'color' is only used during the 'color' pass.
75
+ };
76
+
77
+ // Identifies to the VertexArrayFacade the attributes that are used only for the pick
78
+ // pass or only for the color pass.
79
+ var allPassPurpose = 'all';
80
+ var colorPassPurpose = 'color';
81
+ var pickPassPurpose = 'pick';
82
+
83
+ /**
84
+ * A renderable collection of billboards. Billboards are viewport-aligned
85
+ * images positioned in the 3D scene.
86
+ * <br /><br />
87
+ * <div align='center'>
88
+ * <img src='images/Billboard.png' width='400' height='300' /><br />
89
+ * Example billboards
90
+ * </div>
91
+ * <br /><br />
92
+ * Billboards are added and removed from the collection using {@link BillboardCollection#add}
93
+ * and {@link BillboardCollection#remove}. All billboards in a collection reference images
94
+ * from the same texture atlas, which is assigned using {@link BillboardCollection#setTextureAtlas}.
95
+ *
96
+ * @alias BillboardCollection
97
+ * @constructor
98
+ *
99
+ * @performance For best performance, prefer a few collections, each with many billboards, to
100
+ * many collections with only a few billboards each. Organize collections so that billboards
101
+ * with the same update frequency are in the same collection, i.e., billboards that do not
102
+ * change should be in one collection; billboards that change every frame should be in another
103
+ * collection; and so on.
104
+ *
105
+ * @see BillboardCollection#add
106
+ * @see BillboardCollection#remove
107
+ * @see BillboardCollection#setTextureAtlas
108
+ * @see Billboard
109
+ * @see TextureAtlas
110
+ * @see LabelCollection
111
+ *
112
+ * @example
113
+ * // Create a billboard collection with two billboards
114
+ * var billboards = new BillboardCollection();
115
+ * var atlas = context.createTextureAtlas({images : images});
116
+ * billboards.setTextureAtlas(atlas);
117
+ * billboards.add({
118
+ * position : { x : 1.0, y : 2.0, z : 3.0 },
119
+ * imageIndex : 0
120
+ * });
121
+ * billboards.add({
122
+ * position : { x : 4.0, y : 5.0, z : 6.0 },
123
+ * imageIndex : 1
124
+ * });
125
+ */
126
+ var BillboardCollection = function() {
127
+ this._textureAtlas = undefined;
128
+ this._textureAtlasGUID = undefined;
129
+ this._destroyTextureAtlas = true;
130
+ this._sp = undefined;
131
+ this._rs = undefined;
132
+ this._vaf = undefined;
133
+ this._rsPick = undefined;
134
+ this._spPick = undefined;
135
+
136
+ this._billboards = [];
137
+ this._billboardsToUpdate = [];
138
+ this._billboardsRemoved = false;
139
+ this._createVertexArray = false;
140
+
141
+ this._propertiesChanged = new Uint32Array(NUMBER_OF_PROPERTIES);
142
+
143
+ this._maxSize = 0.0;
144
+ this._maxEyeOffset = 0.0;
145
+ this._maxScale = 1.0;
146
+ this._maxPixelOffset = 0.0;
147
+ this._allHorizontalCenter = true;
148
+
149
+ this._baseVolume = new BoundingSphere();
150
+ this._baseVolume2D = new BoundingSphere();
151
+ this._boundingVolume = new BoundingSphere();
152
+
153
+ this._commandLists = new CommandLists();
154
+
155
+ /**
156
+ * The 4x4 transformation matrix that transforms each billboard in this collection from model to world coordinates.
157
+ * When this is the identity matrix, the billboards are drawn in world coordinates, i.e., Earth's WGS84 coordinates.
158
+ * Local reference frames can be used by providing a different transformation matrix, like that returned
159
+ * by {@link Transforms.eastNorthUpToFixedFrame}. This matrix is available to GLSL vertex and fragment
160
+ * shaders via {@link czm_model} and derived uniforms.
161
+ *
162
+ * @type Matrix4
163
+ *
164
+ * @see Transforms.eastNorthUpToFixedFrame
165
+ * @see czm_model
166
+ *
167
+ * @example
168
+ * var center = ellipsoid.cartographicToCartesian(Cartographic.fromDegrees(-75.59777, 40.03883));
169
+ * billboards.modelMatrix = Transforms.eastNorthUpToFixedFrame(center);
170
+ * billboards.add({ imageIndex: 0, position : new Cartesian3(0.0, 0.0, 0.0) }); // center
171
+ * billboards.add({ imageIndex: 0, position : new Cartesian3(1000000.0, 0.0, 0.0) }); // east
172
+ * billboards.add({ imageIndex: 0, position : new Cartesian3(0.0, 1000000.0, 0.0) }); // north
173
+ * billboards.add({ imageIndex: 0, position : new Cartesian3(0.0, 0.0, 1000000.0) }); // up
174
+ * ]);
175
+ */
176
+ this.modelMatrix = Matrix4.IDENTITY.clone();
177
+ this._modelMatrix = Matrix4.IDENTITY.clone();
178
+
179
+ this._mode = SceneMode.SCENE3D;
180
+ this._projection = undefined;
181
+
182
+ /**
183
+ * If true, aligns all billboards to a pixel in screen space,
184
+ * providing a crisper image at the cost of jumpier motion.
185
+ * Defaults to false.
186
+ *
187
+ * @type Boolean
188
+ */
189
+ this.clampToPixel = false;
190
+
191
+ /**
192
+ * The current morph transition time between 2D/Columbus View and 3D,
193
+ * with 0.0 being 2D or Columbus View and 1.0 being 3D.
194
+ *
195
+ * @type Number
196
+ */
197
+ this.morphTime = this._mode.morphTime;
198
+
199
+ // The buffer usage for each attribute is determined based on the usage of the attribute over time.
200
+ this._buffersUsage = [
201
+ BufferUsage.STATIC_DRAW, // SHOW_INDEX
202
+ BufferUsage.STATIC_DRAW, // POSITION_INDEX
203
+ BufferUsage.STATIC_DRAW, // PIXEL_OFFSET_INDEX
204
+ BufferUsage.STATIC_DRAW, // EYE_OFFSET_INDEX
205
+ BufferUsage.STATIC_DRAW, // HORIZONTAL_ORIGIN_INDEX
206
+ BufferUsage.STATIC_DRAW, // VERTICAL_ORIGIN_INDEX
207
+ BufferUsage.STATIC_DRAW, // SCALE_INDEX
208
+ BufferUsage.STATIC_DRAW, // IMAGE_INDEX_INDEX
209
+ BufferUsage.STATIC_DRAW // COLOR_INDEX
210
+ ];
211
+
212
+ var that = this;
213
+ this._uniforms = {
214
+ u_atlas : function() {
215
+ return that._textureAtlas.getTexture();
216
+ },
217
+ u_atlasSize : function() {
218
+ return that._textureAtlas.getTexture().getDimensions();
219
+ },
220
+ u_clampToPixel : function() {
221
+ return that.clampToPixel ? 1.0 : 0.0;
222
+ },
223
+ u_morphTime : function() {
224
+ return that.morphTime;
225
+ }
226
+ };
227
+ };
228
+
229
+ /**
230
+ * Creates and adds a billboard with the specified initial properties to the collection.
231
+ * The added billboard is returned so it can be modified or removed from the collection later.
232
+ *
233
+ * @memberof BillboardCollection
234
+ *
235
+ * @param {Object}[billboard=undefined] A template describing the billboard's properties as shown in Example 1.
236
+ *
237
+ * @return {Billboard} The billboard that was added to the collection.
238
+ *
239
+ * @performance Calling <code>add</code> is expected constant time. However, when
240
+ * {@link BillboardCollection#update} is called, the collection's vertex buffer
241
+ * is rewritten - an <code>O(n)</code> operation that also incurs CPU to GPU overhead. For
242
+ * best performance, add as many billboards as possible before calling <code>update</code>.
243
+ *
244
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
245
+ *
246
+ * @see BillboardCollection#remove
247
+ * @see BillboardCollection#removeAll
248
+ * @see BillboardCollection#update
249
+ *
250
+ * @example
251
+ * // Example 1: Add a billboard, specifying all the default values.
252
+ * var b = billboards.add({
253
+ * show : true,
254
+ * position : new Cartesian3(0.0, 0.0, 0.0),
255
+ * pixelOffset : new Cartesian2(0.0, 0.0),
256
+ * eyeOffset : new Cartesian3(0.0, 0.0, 0.0),
257
+ * horizontalOrigin : HorizontalOrigin.CENTER,
258
+ * verticalOrigin : VerticalOrigin.CENTER,
259
+ * scale : 1.0,
260
+ * imageIndex : 0,
261
+ * color : new Color(1.0, 1.0, 1.0, 1.0)
262
+ * });
263
+ *
264
+ * // Example 2: Specify only the billboard's cartographic position.
265
+ * var b = billboards.add({
266
+ * position : ellipsoid.cartographicToCartesian(new Cartographic(longitude, latitude, height))
267
+ * });
268
+ */
269
+ BillboardCollection.prototype.add = function(billboard) {
270
+ var b = new Billboard(billboard, this);
271
+ b._index = this._billboards.length;
272
+
273
+ this._billboards.push(b);
274
+ this._createVertexArray = true;
275
+
276
+ return b;
277
+ };
278
+
279
+ /**
280
+ * Removes a billboard from the collection.
281
+ *
282
+ * @memberof BillboardCollection
283
+ *
284
+ * @param {Billboard} billboard The billboard to remove.
285
+ *
286
+ * @return {Boolean} <code>true</code> if the billboard was removed; <code>false</code> if the billboard was not found in the collection.
287
+ *
288
+ * @performance Calling <code>remove</code> is expected constant time. However, when
289
+ * {@link BillboardCollection#update} is called, the collection's vertex buffer
290
+ * is rewritten - an <code>O(n)</code> operation that also incurs CPU to GPU overhead. For
291
+ * best performance, remove as many billboards as possible before calling <code>update</code>.
292
+ * If you intend to temporarily hide a billboard, it is usually more efficient to call
293
+ * {@link Billboard#setShow} instead of removing and re-adding the billboard.
294
+ *
295
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
296
+ *
297
+ * @see BillboardCollection#add
298
+ * @see BillboardCollection#removeAll
299
+ * @see BillboardCollection#update
300
+ * @see Billboard#setShow
301
+ *
302
+ * @example
303
+ * var b = billboards.add(...);
304
+ * billboards.remove(b); // Returns true
305
+ */
306
+ BillboardCollection.prototype.remove = function(billboard) {
307
+ if (this.contains(billboard)) {
308
+ this._billboards[billboard._index] = null; // Removed later
309
+ this._billboardsRemoved = true;
310
+ this._createVertexArray = true;
311
+ billboard._destroy();
312
+ return true;
313
+ }
314
+
315
+ return false;
316
+ };
317
+
318
+ /**
319
+ * Removes all billboards from the collection.
320
+ *
321
+ * @performance <code>O(n)</code>. It is more efficient to remove all the billboards
322
+ * from a collection and then add new ones than to create a new collection entirely.
323
+ *
324
+ * @memberof BillboardCollection
325
+ *
326
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
327
+ *
328
+ * @see BillboardCollection#add
329
+ * @see BillboardCollection#remove
330
+ * @see BillboardCollection#update
331
+ *
332
+ * @example
333
+ * billboards.add(...);
334
+ * billboards.add(...);
335
+ * billboards.removeAll();
336
+ */
337
+ BillboardCollection.prototype.removeAll = function() {
338
+ this._destroyBillboards();
339
+ this._billboards = [];
340
+ this._billboardsToUpdate = [];
341
+ this._billboardsRemoved = false;
342
+
343
+ this._createVertexArray = true;
344
+ };
345
+
346
+ function removeBillboards(billboardCollection) {
347
+ if (billboardCollection._billboardsRemoved) {
348
+ billboardCollection._billboardsRemoved = false;
349
+
350
+ var newBillboards = [];
351
+ var billboards = billboardCollection._billboards;
352
+ var length = billboards.length;
353
+ for (var i = 0, j = 0; i < length; ++i) {
354
+ var billboard = billboards[i];
355
+ if (billboard) {
356
+ billboard._index = j++;
357
+ newBillboards.push(billboard);
358
+ }
359
+ }
360
+
361
+ billboardCollection._billboards = newBillboards;
362
+ }
363
+ }
364
+
365
+ BillboardCollection.prototype._updateBillboard = function(billboard, propertyChanged) {
366
+ if (!billboard._dirty) {
367
+ this._billboardsToUpdate.push(billboard);
368
+ }
369
+
370
+ ++this._propertiesChanged[propertyChanged];
371
+ };
372
+
373
+ /**
374
+ * Check whether this collection contains a given billboard.
375
+ *
376
+ * @memberof BillboardCollection
377
+ *
378
+ * @param {Billboard} billboard The billboard to check for.
379
+ *
380
+ * @return {Boolean} true if this collection contains the billboard, false otherwise.
381
+ *
382
+ * @see BillboardCollection#get
383
+ */
384
+ BillboardCollection.prototype.contains = function(billboard) {
385
+ return typeof billboard !== 'undefined' && billboard._billboardCollection === this;
386
+ };
387
+
388
+ /**
389
+ * Returns the billboard in the collection at the specified index. Indices are zero-based
390
+ * and increase as billboards are added. Removing a billboard shifts all billboards after
391
+ * it to the left, changing their indices. This function is commonly used with
392
+ * {@link BillboardCollection#getLength} to iterate over all the billboards
393
+ * in the collection.
394
+ *
395
+ * @memberof BillboardCollection
396
+ *
397
+ * @param {Number} index The zero-based index of the billboard.
398
+ *
399
+ * @return {Billboard} The billboard at the specified index.
400
+ *
401
+ * @performance Expected constant time. If billboards were removed from the collection and
402
+ * {@link BillboardCollection#update} was not called, an implicit <code>O(n)</code>
403
+ * operation is performed.
404
+ *
405
+ * @exception {DeveloperError} index is required.
406
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
407
+ *
408
+ * @see BillboardCollection#getLength
409
+ *
410
+ * @example
411
+ * // Toggle the show property of every billboard in the collection
412
+ * var len = billboards.getLength();
413
+ * for (var i = 0; i < len; ++i) {
414
+ * var b = billboards.get(i);
415
+ * b.setShow(!b.getShow());
416
+ * }
417
+ */
418
+ BillboardCollection.prototype.get = function(index) {
419
+ if (typeof index === 'undefined') {
420
+ throw new DeveloperError('index is required.');
421
+ }
422
+
423
+ removeBillboards(this);
424
+ return this._billboards[index];
425
+ };
426
+
427
+ /**
428
+ * Returns the number of billboards in this collection. This is commonly used with
429
+ * {@link BillboardCollection#get} to iterate over all the billboards
430
+ * in the collection.
431
+ *
432
+ * @memberof BillboardCollection
433
+ *
434
+ * @return {Number} The number of billboards in this collection.
435
+ *
436
+ * @performance Expected constant time. If billboards were removed from the collection and
437
+ * {@link BillboardCollection#update} was not called, an implicit <code>O(n)</code>
438
+ * operation is performed.
439
+ *
440
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
441
+ *
442
+ * @see BillboardCollection#get
443
+ *
444
+ * @example
445
+ * // Toggle the show property of every billboard in the collection
446
+ * var len = billboards.getLength();
447
+ * for (var i = 0; i < len; ++i) {
448
+ * var b = billboards.get(i);
449
+ * b.setShow(!b.getShow());
450
+ * }
451
+ */
452
+ BillboardCollection.prototype.getLength = function() {
453
+ removeBillboards(this);
454
+ return this._billboards.length;
455
+ };
456
+
457
+ /**
458
+ * DOC_TBA
459
+ *
460
+ * @memberof BillboardCollection
461
+ *
462
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
463
+ *
464
+ * @see BillboardCollection#setTextureAtlas
465
+ * @see Billboard#setImageIndex
466
+ */
467
+ BillboardCollection.prototype.getTextureAtlas = function() {
468
+ return this._textureAtlas;
469
+ };
470
+
471
+ /**
472
+ * DOC_TBA
473
+ *
474
+ * @memberof BillboardCollection
475
+ *
476
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
477
+ *
478
+ * @see BillboardCollection#getTextureAtlas
479
+ * @see Billboard#setImageIndex
480
+ *
481
+ * @example
482
+ * // Assigns a texture atlas with two images to a billboard collection.
483
+ * // Two billboards, each referring to one of the images, are then
484
+ * // added to the collection.
485
+ * var billboards = new BillboardCollection();
486
+ * var images = [image0, image1];
487
+ * var atlas = context.createTextureAtlas({images : images});
488
+ * billboards.setTextureAtlas(atlas);
489
+ * billboards.add({
490
+ * // ...
491
+ * imageIndex : 0
492
+ * });
493
+ * billboards.add({
494
+ * // ...
495
+ * imageIndex : 1
496
+ * });
497
+ */
498
+ BillboardCollection.prototype.setTextureAtlas = function(value) {
499
+ if (this._textureAtlas !== value) {
500
+ this._textureAtlas = this._destroyTextureAtlas && this._textureAtlas && this._textureAtlas.destroy();
501
+ this._textureAtlas = value;
502
+ this._createVertexArray = true; // New per-billboard texture coordinates
503
+ }
504
+ };
505
+
506
+ /**
507
+ * Returns <code>true</code> if the texture atlas is destroyed when the collection is
508
+ * destroyed; otherwise, <code>false</code>.
509
+ *
510
+ * @memberof BillboardCollection
511
+ *
512
+ * @return <code>true</code> if the texture atlas is destroyed when the collection is
513
+ * destroyed; otherwise, <code>false</code>.
514
+ *
515
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
516
+ *
517
+ * @see BillboardCollection#setDestroyTextureAtlas
518
+ */
519
+ BillboardCollection.prototype.getDestroyTextureAtlas = function() {
520
+ return this._destroyTextureAtlas;
521
+ };
522
+
523
+ /**
524
+ * Determines if the texture atlas is destroyed when the collection is destroyed. If the texture
525
+ * atlas is used by more than one collection, set this to <code>false</code>, and explicitly
526
+ * destroy the atlas to avoid attempting to destroy it multiple times.
527
+ *
528
+ * @memberof BillboardCollection
529
+ *
530
+ * @param {Boolean} value Indicates if the texture atlas is destroyed when the collection is destroyed.
531
+ *
532
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
533
+ *
534
+ * @see BillboardCollection#getDestroyTextureAtlas
535
+ * @see BillboardCollection#setTextureAtlas
536
+ * @see BillboardCollection#destroy
537
+ *
538
+ * @example
539
+ * // Destroy a billboard collection but not its texture atlas.
540
+ *
541
+ * var atlas = context.createTextureAtlas({images : images});
542
+ * billboards.setTextureAtlas(atlas);
543
+ * billboards.setDestroyTextureAtlas(false);
544
+ * billboards = billboards.destroy();
545
+ * console.log(atlas.isDestroyed()); // False
546
+ */
547
+ BillboardCollection.prototype.setDestroyTextureAtlas = function(value) {
548
+ this._destroyTextureAtlas = value;
549
+ };
550
+
551
+ function getDirectionsVertexBuffer(context) {
552
+ var sixteenK = 16 * 1024;
553
+
554
+ // Per-context cache for billboard collections
555
+ context._primitivesCache = context._primitivesCache || {};
556
+ var primitivesCache = context._primitivesCache;
557
+ primitivesCache._billboardCollection = primitivesCache._billboardCollection || {};
558
+ var c = primitivesCache._billboardCollection;
559
+
560
+ if (c.directionsVertexBuffer) {
561
+ return c.directionsVertexBuffer;
562
+ }
563
+
564
+ c.directionsVertexBuffer = c.directionsVertexBuffer && c.directionsVertexBuffer.destroy();
565
+
566
+ var directions = new Uint8Array(sixteenK * 4 * 2);
567
+ for (var i = 0, j = 0; i < sixteenK; ++i) {
568
+ directions[j++] = 0;
569
+ directions[j++] = 0;
570
+
571
+ directions[j++] = 255;
572
+ directions[j++] = 0.0;
573
+
574
+ directions[j++] = 255;
575
+ directions[j++] = 255;
576
+
577
+ directions[j++] = 0.0;
578
+ directions[j++] = 255;
579
+ }
580
+
581
+ // PERFORMANCE_IDEA: Should we reference count billboard collections, and eventually delete this?
582
+ // Is this too much memory to allocate up front? Should we dynamically grow it?
583
+ c.directionsVertexBuffer = context.createVertexBuffer(directions, BufferUsage.STATIC_DRAW);
584
+ c.directionsVertexBuffer.setVertexArrayDestroyable(false);
585
+ return c.directionsVertexBuffer;
586
+ }
587
+
588
+ function getIndexBuffer(context) {
589
+ var sixteenK = 16 * 1024;
590
+
591
+ // Per-context cache for billboard collections
592
+ context._primitivesCache = context._primitivesCache || {};
593
+ var primitivesCache = context._primitivesCache;
594
+ primitivesCache._billboardCollection = primitivesCache._billboardCollection || {};
595
+ var c = primitivesCache._billboardCollection;
596
+
597
+ if (c.indexBuffer) {
598
+ return c.indexBuffer;
599
+ }
600
+
601
+ var length = sixteenK * 6;
602
+ var indices = new Uint16Array(length);
603
+ for (var i = 0, j = 0; i < length; i += 6, j += 4) {
604
+ indices[i + 0] = j + 0;
605
+ indices[i + 1] = j + 1;
606
+ indices[i + 2] = j + 2;
607
+
608
+ indices[i + 3] = j + 0;
609
+ indices[i + 4] = j + 2;
610
+ indices[i + 5] = j + 3;
611
+ }
612
+
613
+ // PERFORMANCE_IDEA: Should we reference count billboard collections, and eventually delete this?
614
+ // Is this too much memory to allocate up front? Should we dynamically grow it?
615
+ c.indexBuffer = context.createIndexBuffer(indices, BufferUsage.STATIC_DRAW, IndexDatatype.UNSIGNED_SHORT);
616
+ c.indexBuffer.setVertexArrayDestroyable(false);
617
+ return c.indexBuffer;
618
+ }
619
+
620
+ BillboardCollection.prototype.computeNewBuffersUsage = function() {
621
+ var buffersUsage = this._buffersUsage;
622
+ var usageChanged = false;
623
+
624
+ // PERFORMANCE_IDEA: Better heuristic to avoid ping-ponging. What about DYNAMIC_STREAM?
625
+ var properties = this._propertiesChanged;
626
+ for ( var k = 0; k < NUMBER_OF_PROPERTIES; ++k) {
627
+ var newUsage = (properties[k] === 0) ? BufferUsage.STATIC_DRAW : BufferUsage.STREAM_DRAW;
628
+ usageChanged = usageChanged || (buffersUsage[k] !== newUsage);
629
+ buffersUsage[k] = newUsage;
630
+ }
631
+
632
+ return usageChanged;
633
+ };
634
+
635
+ function createVAF(context, numberOfBillboards, buffersUsage) {
636
+ // Different billboard collections share the same vertex buffer for directions.
637
+ var directionVertexBuffer = getDirectionsVertexBuffer(context);
638
+
639
+ return new VertexArrayFacade(context, [{
640
+ index : attributeIndices.positionHigh,
641
+ componentsPerAttribute : 3,
642
+ componentDatatype : ComponentDatatype.FLOAT,
643
+ usage : buffersUsage[POSITION_INDEX]
644
+ }, {
645
+ index : attributeIndices.positionLow,
646
+ componentsPerAttribute : 3,
647
+ componentDatatype : ComponentDatatype.FLOAT,
648
+ usage : buffersUsage[POSITION_INDEX]
649
+ }, {
650
+ index : attributeIndices.pixelOffset,
651
+ componentsPerAttribute : 2,
652
+ componentDatatype : ComponentDatatype.FLOAT,
653
+ usage : buffersUsage[PIXEL_OFFSET_INDEX]
654
+ }, {
655
+ index : attributeIndices.eyeOffsetAndScale,
656
+ componentsPerAttribute : 4,
657
+ componentDatatype : ComponentDatatype.FLOAT,
658
+ usage : buffersUsage[SCALE_INDEX] // buffersUsage[EYE_OFFSET_INDEX] ignored
659
+ }, {
660
+ index : attributeIndices.textureCoordinatesAndImageSize,
661
+ componentsPerAttribute : 4,
662
+ normalize : true,
663
+ componentDatatype : ComponentDatatype.UNSIGNED_SHORT,
664
+ usage : buffersUsage[IMAGE_INDEX_INDEX]
665
+ }, {
666
+ index : attributeIndices.pickColor,
667
+ componentsPerAttribute : 4,
668
+ normalize : true,
669
+ componentDatatype : ComponentDatatype.UNSIGNED_BYTE,
670
+ usage : BufferUsage.STATIC_DRAW,
671
+ purpose : pickPassPurpose
672
+ }, {
673
+ index : attributeIndices.color,
674
+ componentsPerAttribute : 4,
675
+ normalize : true,
676
+ componentDatatype : ComponentDatatype.UNSIGNED_BYTE,
677
+ usage : buffersUsage[COLOR_INDEX],
678
+ purpose : colorPassPurpose
679
+ }, {
680
+ index : attributeIndices.originAndShow,
681
+ componentsPerAttribute : 3,
682
+ componentDatatype : ComponentDatatype.BYTE,
683
+ usage : buffersUsage[SHOW_INDEX] // buffersUsage[HORIZONTAL_ORIGIN_INDEX] and buffersUsage[VERTICAL_ORIGIN_INDEX] ignored
684
+ }, {
685
+ index : attributeIndices.direction,
686
+ vertexBuffer : directionVertexBuffer,
687
+ componentsPerAttribute : 2,
688
+ normalize : true,
689
+ componentDatatype : ComponentDatatype.UNSIGNED_BYTE
690
+ }], 4 * numberOfBillboards); // 4 vertices per billboard
691
+ }
692
+
693
+ ///////////////////////////////////////////////////////////////////////////
694
+
695
+ // Four vertices per billboard. Each has the same position, etc., but a different screen-space direction vector.
696
+
697
+ // PERFORMANCE_IDEA: Save memory if a property is the same for all billboards, use a latched attribute state,
698
+ // instead of storing it in a vertex buffer.
699
+
700
+ var writePositionScratch = new EncodedCartesian3();
701
+
702
+ function writePosition(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard) {
703
+ var i = (billboard._index * 4);
704
+ var position = billboard._getActualPosition();
705
+
706
+ if (billboardCollection._mode === SceneMode.SCENE3D) {
707
+ billboardCollection._baseVolume.expand(position, billboardCollection._baseVolume);
708
+ }
709
+
710
+ EncodedCartesian3.fromCartesian(position, writePositionScratch);
711
+
712
+ var allPurposeWriters = vafWriters[allPassPurpose];
713
+ var positionHighWriter = allPurposeWriters[attributeIndices.positionHigh];
714
+ var high = writePositionScratch.high;
715
+ positionHighWriter(i + 0, high.x, high.y, high.z);
716
+ positionHighWriter(i + 1, high.x, high.y, high.z);
717
+ positionHighWriter(i + 2, high.x, high.y, high.z);
718
+ positionHighWriter(i + 3, high.x, high.y, high.z);
719
+
720
+ var positionLowWriter = allPurposeWriters[attributeIndices.positionLow];
721
+ var low = writePositionScratch.low;
722
+ positionLowWriter(i + 0, low.x, low.y, low.z);
723
+ positionLowWriter(i + 1, low.x, low.y, low.z);
724
+ positionLowWriter(i + 2, low.x, low.y, low.z);
725
+ positionLowWriter(i + 3, low.x, low.y, low.z);
726
+ }
727
+
728
+ function writePixelOffset(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard) {
729
+ var i = (billboard._index * 4);
730
+ var pixelOffset = billboard.getPixelOffset();
731
+ billboardCollection._maxPixelOffset = Math.max(billboardCollection._maxPixelOffset, pixelOffset.x, pixelOffset.y);
732
+
733
+ var allPurposeWriters = vafWriters[allPassPurpose];
734
+ var writer = allPurposeWriters[attributeIndices.pixelOffset];
735
+ writer(i + 0, pixelOffset.x, pixelOffset.y);
736
+ writer(i + 1, pixelOffset.x, pixelOffset.y);
737
+ writer(i + 2, pixelOffset.x, pixelOffset.y);
738
+ writer(i + 3, pixelOffset.x, pixelOffset.y);
739
+ }
740
+
741
+ function writeEyeOffsetAndScale(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard) {
742
+ var i = (billboard._index * 4);
743
+ var eyeOffset = billboard.getEyeOffset();
744
+ var scale = billboard.getScale();
745
+ billboardCollection._maxEyeOffset = Math.max(billboardCollection._maxEyeOffset, Math.abs(eyeOffset.x), Math.abs(eyeOffset.y), Math.abs(eyeOffset.z));
746
+ billboardCollection._maxScale = Math.max(billboardCollection._maxScale, scale);
747
+
748
+ var allPurposeWriters = vafWriters[allPassPurpose];
749
+ var writer = allPurposeWriters[attributeIndices.eyeOffsetAndScale];
750
+ writer(i + 0, eyeOffset.x, eyeOffset.y, eyeOffset.z, scale);
751
+ writer(i + 1, eyeOffset.x, eyeOffset.y, eyeOffset.z, scale);
752
+ writer(i + 2, eyeOffset.x, eyeOffset.y, eyeOffset.z, scale);
753
+ writer(i + 3, eyeOffset.x, eyeOffset.y, eyeOffset.z, scale);
754
+ }
755
+
756
+ function writePickColor(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard) {
757
+ var i = (billboard._index * 4);
758
+ var pickColor = billboard.getPickId(context).unnormalizedRgb;
759
+
760
+ var pickWriters = vafWriters[pickPassPurpose];
761
+ var writer = pickWriters[attributeIndices.pickColor];
762
+ writer(i + 0, pickColor.red, pickColor.green, pickColor.blue, 255);
763
+ writer(i + 1, pickColor.red, pickColor.green, pickColor.blue, 255);
764
+ writer(i + 2, pickColor.red, pickColor.green, pickColor.blue, 255);
765
+ writer(i + 3, pickColor.red, pickColor.green, pickColor.blue, 255);
766
+ }
767
+
768
+ function writeColor(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard) {
769
+ var i = (billboard._index * 4);
770
+ var color = billboard.getColor();
771
+
772
+ var colorWriters = vafWriters[colorPassPurpose];
773
+ var writer = colorWriters[attributeIndices.color];
774
+ writer(i + 0, color.red * 255, color.green * 255, color.blue * 255, color.alpha * 255);
775
+ writer(i + 1, color.red * 255, color.green * 255, color.blue * 255, color.alpha * 255);
776
+ writer(i + 2, color.red * 255, color.green * 255, color.blue * 255, color.alpha * 255);
777
+ writer(i + 3, color.red * 255, color.green * 255, color.blue * 255, color.alpha * 255);
778
+ }
779
+
780
+ function writeOriginAndShow(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard) {
781
+ var i = (billboard._index * 4);
782
+ var horizontalOrigin = billboard.getHorizontalOrigin().value;
783
+ var verticalOrigin = billboard.getVerticalOrigin().value;
784
+ var show = billboard.getShow();
785
+
786
+ // If the color alpha is zero, do not show this billboard. This lets us avoid providing
787
+ // color during the pick pass and also eliminates a discard in the fragment shader.
788
+ if (billboard.getColor().alpha === 0.0) {
789
+ show = false;
790
+ }
791
+
792
+ billboardCollection._allHorizontalCenter = billboardCollection._allHorizontalCenter && horizontalOrigin === HorizontalOrigin.CENTER.value;
793
+
794
+ var allPurposeWriters = vafWriters[allPassPurpose];
795
+ var writer = allPurposeWriters[attributeIndices.originAndShow];
796
+ writer(i + 0, horizontalOrigin, verticalOrigin, show);
797
+ writer(i + 1, horizontalOrigin, verticalOrigin, show);
798
+ writer(i + 2, horizontalOrigin, verticalOrigin, show);
799
+ writer(i + 3, horizontalOrigin, verticalOrigin, show);
800
+ }
801
+
802
+ function writeTextureCoordinatesAndImageSize(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard) {
803
+ var i = (billboard._index * 4);
804
+ var bottomLeftX = 0;
805
+ var bottomLeftY = 0;
806
+ var width = 0;
807
+ var height = 0;
808
+ var index = billboard.getImageIndex();
809
+ if (index !== -1) {
810
+ var imageRectangle = textureAtlasCoordinates[index];
811
+ if (typeof imageRectangle === 'undefined') {
812
+ throw new DeveloperError('Invalid billboard image index: ' + index);
813
+ }
814
+ bottomLeftX = imageRectangle.x;
815
+ bottomLeftY = imageRectangle.y;
816
+ width = imageRectangle.width;
817
+ height = imageRectangle.height;
818
+ }
819
+ var topRightX = bottomLeftX + width;
820
+ var topRightY = bottomLeftY + height;
821
+
822
+ billboardCollection._maxSize = Math.max(billboardCollection._maxSize, width, height);
823
+
824
+ var allPurposeWriters = vafWriters[allPassPurpose];
825
+ var writer = allPurposeWriters[attributeIndices.textureCoordinatesAndImageSize];
826
+ writer(i + 0, bottomLeftX * 65535, bottomLeftY * 65535, width * 65535, height * 65535); // Lower Left
827
+ writer(i + 1, topRightX * 65535, bottomLeftY * 65535, width * 65535, height * 65535); // Lower Right
828
+ writer(i + 2, topRightX * 65535, topRightY * 65535, width * 65535, height * 65535); // Upper Right
829
+ writer(i + 3, bottomLeftX * 65535, topRightY * 65535, width * 65535, height * 65535); // Upper Left
830
+ }
831
+
832
+ function writeBillboard(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard) {
833
+ writePosition(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard);
834
+ writePixelOffset(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard);
835
+ writeEyeOffsetAndScale(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard);
836
+ writePickColor(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard);
837
+ writeColor(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard);
838
+ writeOriginAndShow(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard);
839
+ writeTextureCoordinatesAndImageSize(billboardCollection, context, textureAtlasCoordinates, vafWriters, billboard);
840
+ }
841
+
842
+ function recomputeActualPositions(billboardCollection, billboards, frameState, morphTime, modelMatrix, recomputeBoundingVolume) {
843
+ var boundingVolume;
844
+ if (frameState.mode === SceneMode.SCENE3D) {
845
+ boundingVolume = billboardCollection._baseVolume;
846
+ } else {
847
+ boundingVolume = billboardCollection._baseVolume2D;
848
+ }
849
+
850
+ var length = billboards.length;
851
+ var positions = [];
852
+ for ( var i = 0; i < length; ++i) {
853
+ var billboard = billboards[i];
854
+ var position = billboard.getPosition();
855
+ var actualPosition = Billboard._computeActualPosition(position, frameState, morphTime, modelMatrix);
856
+ if (typeof actualPosition !== 'undefined') {
857
+ billboard._setActualPosition(actualPosition);
858
+
859
+ if (recomputeBoundingVolume) {
860
+ positions.push(actualPosition);
861
+ } else {
862
+ boundingVolume.expand(actualPosition, boundingVolume);
863
+ }
864
+ }
865
+ }
866
+
867
+ if (recomputeBoundingVolume) {
868
+ BoundingSphere.fromPoints(positions, boundingVolume);
869
+ }
870
+ }
871
+
872
+ function updateMode(billboardCollection, frameState) {
873
+ var mode = frameState.mode;
874
+ var projection = frameState.scene2D.projection;
875
+
876
+ var billboards = billboardCollection._billboards;
877
+ var billboardsToUpdate = billboardCollection._billboardsToUpdate;
878
+ var morphTime = billboardCollection.morphTime;
879
+ var modelMatrix = billboardCollection._modelMatrix;
880
+
881
+ if (billboardCollection._mode !== mode ||
882
+ billboardCollection._projection !== projection ||
883
+ mode !== SceneMode.SCENE3D &&
884
+ !modelMatrix.equals(billboardCollection.modelMatrix)) {
885
+
886
+ billboardCollection._mode = mode;
887
+ billboardCollection._projection = projection;
888
+ billboardCollection.modelMatrix.clone(modelMatrix);
889
+ billboardCollection._createVertexArray = true;
890
+
891
+ if (mode === SceneMode.SCENE3D || mode === SceneMode.SCENE2D || mode === SceneMode.COLUMBUS_VIEW) {
892
+ recomputeActualPositions(billboardCollection, billboards, frameState, morphTime, modelMatrix, true);
893
+ }
894
+ } else if (mode === SceneMode.MORPHING) {
895
+ recomputeActualPositions(billboardCollection, billboards, frameState, morphTime, modelMatrix, true);
896
+ } else if (mode === SceneMode.SCENE2D || mode === SceneMode.COLUMBUS_VIEW) {
897
+ recomputeActualPositions(billboardCollection, billboardsToUpdate, frameState, morphTime, modelMatrix, false);
898
+ }
899
+ }
900
+
901
+ var scratchCanvasDimensions = new Cartesian2();
902
+ var scratchToCenter = new Cartesian3();
903
+ var scratchProj = new Cartesian3();
904
+ function updateBoundingVolume(collection, context, frameState, boundingVolume) {
905
+ var camera = frameState.camera;
906
+ var frustum = camera.frustum;
907
+
908
+ var textureDimensions = collection._textureAtlas.getTexture().getDimensions();
909
+ var textureSize = Math.max(textureDimensions.x, textureDimensions.y);
910
+
911
+ var pixelScale;
912
+ var size;
913
+ var offset;
914
+
915
+ var toCenter = camera.getPositionWC().subtract(boundingVolume.center, scratchToCenter);
916
+ var proj = camera.getDirectionWC().multiplyByScalar(toCenter.dot(camera.getDirectionWC()), scratchProj);
917
+ var distance = Math.max(0.0, proj.magnitude() - boundingVolume.radius);
918
+
919
+ var canvas = context.getCanvas();
920
+ scratchCanvasDimensions.x = canvas.clientWidth;
921
+ scratchCanvasDimensions.y = canvas.clientHeight;
922
+ var pixelSize = frustum.getPixelSize(scratchCanvasDimensions, distance);
923
+ pixelScale = Math.max(pixelSize.x, pixelSize.y);
924
+
925
+ size = pixelScale * collection._maxScale * collection._maxSize * textureSize;
926
+ if (collection._allHorizontalCenter) {
927
+ size *= 0.5;
928
+ }
929
+
930
+ offset = pixelScale * collection._maxPixelOffset + collection._maxEyeOffset;
931
+ boundingVolume.radius += size + offset;
932
+ }
933
+
934
+ /**
935
+ * @private
936
+ */
937
+ BillboardCollection.prototype.update = function(context, frameState, commandList) {
938
+ var textureAtlas = this._textureAtlas;
939
+ if (typeof textureAtlas === 'undefined') {
940
+ // Can't write billboard vertices until we have texture coordinates
941
+ // provided by a texture atlas
942
+ return;
943
+ }
944
+
945
+ var textureAtlasCoordinates = textureAtlas.getTextureCoordinates();
946
+ if (textureAtlasCoordinates.length === 0) {
947
+ // Can't write billboard vertices until we have texture coordinates
948
+ // provided by a texture atlas
949
+ return;
950
+ }
951
+
952
+ removeBillboards(this);
953
+ updateMode(this, frameState);
954
+
955
+ var billboards = this._billboards;
956
+ var length = billboards.length;
957
+ var properties = this._propertiesChanged;
958
+
959
+ var textureAtlasGUID = textureAtlas.getGUID();
960
+ var createVertexArray = this._createVertexArray || this._textureAtlasGUID !== textureAtlasGUID;
961
+ this._textureAtlasGUID = textureAtlasGUID;
962
+
963
+ var vafWriters;
964
+
965
+ // PERFORMANCE_IDEA: Round robin multiple buffers.
966
+ if (createVertexArray || this.computeNewBuffersUsage()) {
967
+ this._createVertexArray = false;
968
+
969
+ this._vaf = this._vaf && this._vaf.destroy();
970
+
971
+ if (length > 0) {
972
+ // PERFORMANCE_IDEA: Instead of creating a new one, resize like std::vector.
973
+ this._vaf = createVAF(context, billboards.length, this._buffersUsage);
974
+ vafWriters = this._vaf.writers;
975
+
976
+ // Rewrite entire buffer if billboards were added or removed.
977
+ for (var i = 0; i < length; ++i) {
978
+ var billboard = this._billboards[i];
979
+ billboard._dirty = false; // In case it needed an update.
980
+ writeBillboard(this, context, textureAtlasCoordinates, vafWriters, billboard);
981
+ }
982
+
983
+ // Different billboard collections share the same index buffer.
984
+ this._vaf.commit(getIndexBuffer(context));
985
+ }
986
+
987
+ this._billboardsToUpdate = [];
988
+ } else {
989
+ // Billboards were modified, but none were added or removed.
990
+
991
+ var billboardsToUpdate = this._billboardsToUpdate;
992
+ var updateLength = billboardsToUpdate.length;
993
+
994
+ if (updateLength) {
995
+ var writers = [];
996
+
997
+ if (properties[POSITION_INDEX]) {
998
+ writers.push(writePosition);
999
+ }
1000
+
1001
+ if (properties[PIXEL_OFFSET_INDEX]) {
1002
+ writers.push(writePixelOffset);
1003
+ }
1004
+
1005
+ if (properties[EYE_OFFSET_INDEX] || properties[SCALE_INDEX]) {
1006
+ writers.push(writeEyeOffsetAndScale);
1007
+ }
1008
+
1009
+ if (properties[IMAGE_INDEX_INDEX]) {
1010
+ writers.push(writeTextureCoordinatesAndImageSize);
1011
+ }
1012
+
1013
+ if (properties[COLOR_INDEX]) {
1014
+ writers.push(writeColor);
1015
+ }
1016
+
1017
+ if (properties[HORIZONTAL_ORIGIN_INDEX] || properties[VERTICAL_ORIGIN_INDEX] || properties[SHOW_INDEX]) {
1018
+ writers.push(writeOriginAndShow);
1019
+ }
1020
+
1021
+ vafWriters = this._vaf.writers;
1022
+
1023
+ if ((updateLength / length) > 0.1) {
1024
+ // If more than 10% of billboard change, rewrite the entire buffer.
1025
+
1026
+ // PERFORMANCE_IDEA: I totally made up 10% :).
1027
+
1028
+ for (var m = 0; m < updateLength; ++m) {
1029
+ var b = billboardsToUpdate[m];
1030
+ b._dirty = false;
1031
+
1032
+ for ( var n = 0; n < writers.length; ++n) {
1033
+ writers[n](this, context, textureAtlasCoordinates, vafWriters, b);
1034
+ }
1035
+ }
1036
+ this._vaf.commit(getIndexBuffer(context));
1037
+ } else {
1038
+ for (var h = 0; h < updateLength; ++h) {
1039
+ var bb = billboardsToUpdate[h];
1040
+ bb._dirty = false;
1041
+
1042
+ for ( var o = 0; o < writers.length; ++o) {
1043
+ writers[o](this, context, textureAtlasCoordinates, vafWriters, bb);
1044
+ }
1045
+ this._vaf.subCommit(bb._index * 4, 4);
1046
+ }
1047
+ this._vaf.endSubCommits();
1048
+ }
1049
+
1050
+ this._billboardsToUpdate = [];
1051
+ }
1052
+ }
1053
+
1054
+ for (var k = 0; k < NUMBER_OF_PROPERTIES; ++k) {
1055
+ properties[k] = 0;
1056
+ }
1057
+
1058
+ if (typeof this._vaf === 'undefined' || typeof this._vaf.vaByPurpose === 'undefined') {
1059
+ return;
1060
+ }
1061
+
1062
+ var boundingVolume;
1063
+ var modelMatrix = Matrix4.IDENTITY;
1064
+ if (frameState.mode === SceneMode.SCENE3D) {
1065
+ modelMatrix = this.modelMatrix;
1066
+ boundingVolume = BoundingSphere.clone(this._baseVolume, this._boundingVolume);
1067
+ } else if (typeof this._baseVolume2D !== 'undefined') {
1068
+ boundingVolume = BoundingSphere.clone(this._baseVolume2D, this._boundingVolume);
1069
+ }
1070
+ updateBoundingVolume(this, context, frameState, boundingVolume);
1071
+
1072
+ var pass = frameState.passes;
1073
+ var va;
1074
+ var vaLength;
1075
+ var commands;
1076
+ var command;
1077
+ var j;
1078
+ this._commandLists.removeAll();
1079
+ if (pass.color) {
1080
+ if (typeof this._sp === 'undefined') {
1081
+ this._rs = context.createRenderState({
1082
+ depthTest : {
1083
+ enabled : true
1084
+ },
1085
+ blending : BlendingState.ALPHA_BLEND
1086
+ });
1087
+
1088
+ this._sp = context.getShaderCache().getShaderProgram(BillboardCollectionVS, BillboardCollectionFS, attributeIndices);
1089
+ }
1090
+
1091
+ va = this._vaf.vaByPurpose[colorPassPurpose];
1092
+ vaLength = va.length;
1093
+
1094
+ commands = this._commandLists.colorList;
1095
+ commands.length = vaLength;
1096
+ for (j = 0; j < vaLength; ++j) {
1097
+ command = commands[j];
1098
+ if (typeof command === 'undefined') {
1099
+ command = commands[j] = new DrawCommand();
1100
+ }
1101
+
1102
+ command.boundingVolume = boundingVolume;
1103
+ command.modelMatrix = modelMatrix;
1104
+ command.primitiveType = PrimitiveType.TRIANGLES;
1105
+ command.count = va[j].indicesCount;
1106
+ command.shaderProgram = this._sp;
1107
+ command.uniformMap = this._uniforms;
1108
+ command.vertexArray = va[j].va;
1109
+ command.renderState = this._rs;
1110
+ }
1111
+ }
1112
+ if (pass.pick) {
1113
+ if (typeof this._spPick === 'undefined') {
1114
+ this._rsPick = context.createRenderState({
1115
+ depthTest : {
1116
+ enabled : true
1117
+ }
1118
+ });
1119
+
1120
+ this._spPick = context.getShaderCache().getShaderProgram(
1121
+ '#define RENDER_FOR_PICK 1\n' + BillboardCollectionVS,
1122
+ '#define RENDER_FOR_PICK 1\n' + BillboardCollectionFS,
1123
+ attributeIndices);
1124
+ }
1125
+
1126
+ va = this._vaf.vaByPurpose[pickPassPurpose];
1127
+ vaLength = va.length;
1128
+
1129
+ commands = this._commandLists.pickList;
1130
+ commands.length = vaLength;
1131
+ for (j = 0; j < vaLength; ++j) {
1132
+ command = commands[j];
1133
+ if (typeof command === 'undefined') {
1134
+ command = commands[j] = new DrawCommand();
1135
+ }
1136
+
1137
+ command.boundingVolume = boundingVolume;
1138
+ command.modelMatrix = modelMatrix;
1139
+ command.primitiveType = PrimitiveType.TRIANGLES;
1140
+ command.count = va[j].indicesCount;
1141
+ command.shaderProgram = this._spPick;
1142
+ command.uniformMap = this._uniforms;
1143
+ command.vertexArray = va[j].va;
1144
+ command.renderState = this._rsPick;
1145
+ }
1146
+ }
1147
+
1148
+ if (!this._commandLists.empty()) {
1149
+ commandList.push(this._commandLists);
1150
+ }
1151
+ };
1152
+
1153
+ /**
1154
+ * Returns true if this object was destroyed; otherwise, false.
1155
+ * <br /><br />
1156
+ * If this object was destroyed, it should not be used; calling any function other than
1157
+ * <code>isDestroyed</code> will result in a {@link DeveloperError} exception.
1158
+ *
1159
+ * @memberof BillboardCollection
1160
+ *
1161
+ * @return {Boolean} <code>true</code> if this object was destroyed; otherwise, <code>false</code>.
1162
+ *
1163
+ * @see BillboardCollection#destroy
1164
+ */
1165
+ BillboardCollection.prototype.isDestroyed = function() {
1166
+ return false;
1167
+ };
1168
+
1169
+ /**
1170
+ * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic
1171
+ * release of WebGL resources, instead of relying on the garbage collector to destroy this object.
1172
+ * <br /><br />
1173
+ * Once an object is destroyed, it should not be used; calling any function other than
1174
+ * <code>isDestroyed</code> will result in a {@link DeveloperError} exception. Therefore,
1175
+ * assign the return value (<code>undefined</code>) to the object as done in the example.
1176
+ *
1177
+ * @memberof BillboardCollection
1178
+ *
1179
+ * @return {undefined}
1180
+ *
1181
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
1182
+ *
1183
+ * @see BillboardCollection#isDestroyed
1184
+ *
1185
+ * @example
1186
+ * billboards = billboards && billboards.destroy();
1187
+ */
1188
+ BillboardCollection.prototype.destroy = function() {
1189
+ this._textureAtlas = this._destroyTextureAtlas && this._textureAtlas && this._textureAtlas.destroy();
1190
+ this._sp = this._sp && this._sp.release();
1191
+ this._spPick = this._spPick && this._spPick.release();
1192
+ this._vaf = this._vaf && this._vaf.destroy();
1193
+ this._destroyBillboards();
1194
+
1195
+ return destroyObject(this);
1196
+ };
1197
+
1198
+ BillboardCollection.prototype._destroyBillboards = function() {
1199
+ var billboards = this._billboards;
1200
+ var length = billboards.length;
1201
+ for (var i = 0; i < length; ++i) {
1202
+ if (billboards[i]) {
1203
+ billboards[i]._destroy();
1204
+ }
1205
+ }
1206
+ };
1207
+
1208
+ return BillboardCollection;
1209
+ });