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,109 @@
1
+ /*global define*/
2
+ define([
3
+ './DeveloperError',
4
+ './Quaternion'
5
+ ],
6
+ function (
7
+ DeveloperError,
8
+ Quaternion) {
9
+ "use strict";
10
+
11
+ /**
12
+ * Smoothly interpolates orientation, represented by <code>Quaternion</code>s, over time.
13
+ * For example, this can be used to set a camera's axes along a path.
14
+ *
15
+ * @alias OrientationInterpolator
16
+ * @constructor
17
+ *
18
+ * @param {Array} controlPoints An array, of at least length 2, of objects with <code>orientation</code> and
19
+ * <code>time</code> properties.
20
+ *
21
+ * @exception {DeveloperError} controlPoints is required. It must be an array with at least a length of 3.
22
+ *
23
+ * @see Quaternion
24
+ * @see CatmullRomSpline
25
+ * @see HermiteSpline
26
+ */
27
+ var OrientationInterpolator = function(controlPoints) {
28
+ if (!controlPoints || !(controlPoints instanceof Array) || controlPoints.length < 2) {
29
+ throw new DeveloperError('controlPoints is required. It must be an array with at least a length of 3.');
30
+ }
31
+
32
+ this._points = controlPoints;
33
+ this._lastTimeIndex = 0;
34
+ };
35
+
36
+ /**
37
+ * Returns the array of control points.
38
+ *
39
+ * @memberof OrientationInterpolator
40
+ * @return {Array} The array of control points.
41
+ */
42
+ OrientationInterpolator.prototype.getControlPoints = function() {
43
+ return this._points;
44
+ };
45
+
46
+ OrientationInterpolator.prototype._findIndex = function(time) {
47
+ // Take advantage of temporal coherence by checking current, next and previous intervals
48
+ // for containment of time.
49
+ var i = this._lastTimeIndex || 0;
50
+ if (time >= this._points[i].time) {
51
+ if (i + 1 < this._points.length && time < this._points[i + 1].time) {
52
+ return i;
53
+ } else if (i + 2 < this._points.length && time < this._points[i + 2].time) {
54
+ this._lastTimeIndex = i + 1;
55
+ return this._lastTimeIndex;
56
+ }
57
+ } else if (i - 1 >= 0 && time >= this._points[i - 1].time) {
58
+ this._lastTimeIndex = i - 1;
59
+ return this._lastTimeIndex;
60
+ }
61
+
62
+ // The above failed so do a linear search. For the use cases so far, the
63
+ // length of the list is less than 10. In the future, if there is a bottle neck,
64
+ // it might be here.
65
+ for (i = 0; i < this._points.length - 1; ++i) {
66
+ if (time >= this._points[i].time && time < this._points[i + 1].time) {
67
+ break;
68
+ }
69
+ }
70
+
71
+ if (i === this._points.length - 1) {
72
+ i = this._points.length - 2;
73
+ }
74
+
75
+ this._lastTimeIndex = i;
76
+ return this._lastTimeIndex;
77
+ };
78
+
79
+ /**
80
+ * Evaluates the orientation at a given time.
81
+ *
82
+ * @memberof OrientationInterpolator
83
+ *
84
+ * @param {Number} time The time at which to evaluate the orientation.
85
+ *
86
+ * @exception {DeveloperError} time is required.
87
+ * @exception {DeveloperError} time must be in the range <code>[a<sub>0</sub>, a<sub>n</sub>]</code>,
88
+ * where <code>a<sub>0</sub></code> and <code>a<sub>n</sub></code> are the time properties of first and
89
+ * last elements in the array given during construction, respectively.
90
+ *
91
+ * @return {Quaternion} The orientation at the given <code>time</code>.
92
+ */
93
+ OrientationInterpolator.prototype.evaluate = function(time) {
94
+ if (typeof time === 'undefined') {
95
+ throw new DeveloperError('time is required.');
96
+ }
97
+
98
+ if (time < this._points[0].time || time > this._points[this._points.length - 1].time) {
99
+ throw new DeveloperError('time is out of range.');
100
+ }
101
+
102
+ var i = this._findIndex(time);
103
+ var u = (time - this._points[i].time) / (this._points[i + 1].time - this._points[i].time);
104
+
105
+ return this._points[i].orientation.slerp(this._points[i + 1].orientation, u);
106
+ };
107
+
108
+ return OrientationInterpolator;
109
+ });
@@ -0,0 +1,74 @@
1
+ /*global define*/
2
+ define([
3
+ './DeveloperError',
4
+ './Cartesian2',
5
+ './PrimitiveType'
6
+ ], function(
7
+ DeveloperError,
8
+ Cartesian2,
9
+ PrimitiveType) {
10
+ "use strict";
11
+
12
+ /**
13
+ * DOC_TBA
14
+ *
15
+ * @exports PlaneTessellator
16
+ *
17
+ * @see CubeMapEllipsoidTessellator
18
+ * @see BoxTessellator
19
+ */
20
+ var PlaneTessellator = {
21
+ /**
22
+ * DOC_TBA
23
+ *
24
+ * @exception {DeveloperError} Resolution must be greater than one in both the x and y directions.
25
+ */
26
+ compute : function(template) {
27
+ template = template || {};
28
+ var resolution = template.resolution || new Cartesian2(2, 2);
29
+ var onInterpolation = template.onInterpolation; // Can be undefined
30
+
31
+ if (resolution.x <= 1 || resolution.y <= 1) {
32
+ throw new DeveloperError('Resolution must be greater than one in both the x and y directions.');
33
+ }
34
+
35
+ var i;
36
+ var j;
37
+
38
+ // To allow computing custom attributes, e.g., texture coordinates, etc.
39
+ if (onInterpolation) {
40
+ for (j = 0; j < resolution.y; ++j) {
41
+ var yTime = j / (resolution.y - 1);
42
+
43
+ for (i = 0; i < resolution.x; ++i) {
44
+ var xTime = i / (resolution.x - 1);
45
+ onInterpolation(new Cartesian2(xTime, yTime));
46
+ }
47
+ }
48
+ }
49
+
50
+ var indices = [];
51
+
52
+ // Counterclockwise winding order
53
+ for (j = 0; j < resolution.y - 1; ++j) {
54
+ var row = j * resolution.x;
55
+ var aboveRow = (j + 1) * resolution.x;
56
+
57
+ for (i = 0; i < resolution.x - 1; ++i) {
58
+ indices.push(row + i, row + i + 1, aboveRow + i + 1);
59
+ indices.push(row + i, aboveRow + i + 1, aboveRow + i);
60
+ }
61
+ }
62
+
63
+ return {
64
+ attributes : {},
65
+ indexLists : [{
66
+ primitiveType : PrimitiveType.TRIANGLES,
67
+ values : indices
68
+ }]
69
+ };
70
+ }
71
+ };
72
+
73
+ return PlaneTessellator;
74
+ });
@@ -0,0 +1,792 @@
1
+ /*global define*/
2
+ define([
3
+ './DeveloperError',
4
+ './Math',
5
+ './Cartesian2',
6
+ './Cartesian3',
7
+ './Ellipsoid',
8
+ './EllipsoidTangentPlane',
9
+ './defaultValue',
10
+ './pointInsideTriangle2D',
11
+ './ComponentDatatype',
12
+ './PrimitiveType',
13
+ './Queue',
14
+ './WindingOrder'
15
+ ], function(
16
+ DeveloperError,
17
+ CesiumMath,
18
+ Cartesian2,
19
+ Cartesian3,
20
+ Ellipsoid,
21
+ EllipsoidTangentPlane,
22
+ defaultValue,
23
+ pointInsideTriangle2D,
24
+ ComponentDatatype,
25
+ PrimitiveType,
26
+ Queue,
27
+ WindingOrder) {
28
+ "use strict";
29
+
30
+ function DoublyLinkedList() {
31
+ this.head = null;
32
+ this.tail = null;
33
+ this.length = 0;
34
+ }
35
+
36
+ DoublyLinkedList.prototype.add = function(item) {
37
+ if (item) {
38
+ var node = {
39
+ item : item,
40
+ previous : this.tail,
41
+ next : null
42
+ };
43
+
44
+ if (this.tail) {
45
+ this.tail.next = node;
46
+ this.tail = node;
47
+ } else {
48
+ // Insert into empty list.
49
+ this.head = node;
50
+ this.tail = node;
51
+ }
52
+
53
+ ++this.length;
54
+ }
55
+ };
56
+
57
+ DoublyLinkedList.prototype.remove = function(item) {
58
+ if (item) {
59
+ if (item.previous && item.next) {
60
+ item.previous.next = item.next;
61
+ item.next.previous = item.previous;
62
+ } else if (item.previous) {
63
+ // Remove last node.
64
+ item.previous.next = null;
65
+ this.tail = item.previous;
66
+ } else if (item.next) {
67
+ // Remove first node.
68
+ item.next.previous = null;
69
+ this.head = item.next;
70
+ } else {
71
+ // Remove last node in linked list.
72
+ this.head = null;
73
+ this.tail = null;
74
+ }
75
+
76
+ --this.length;
77
+ }
78
+ };
79
+
80
+ function isTipConvex(p0, p1, p2) {
81
+ var u = p1.subtract(p0);
82
+ var v = p2.subtract(p1);
83
+
84
+ // Use the sign of the z component of the cross product
85
+ return ((u.x * v.y) - (u.y * v.x)) >= 0.0;
86
+ }
87
+
88
+ /**
89
+ * Returns the index of the vertex with the maximum X value.
90
+ *
91
+ * @param {Array} positions An array of the Cartesian points defining the polygon's vertices.
92
+ * @returns {Number} The index of the positions with the maximum X value.
93
+ *
94
+ * @private
95
+ */
96
+ function getRightmostPositionIndex(positions) {
97
+ var maximumX = positions[0].x;
98
+ var rightmostPositionIndex = 0;
99
+ for ( var i = 0; i < positions.length; i++) {
100
+ if (positions[i].x > maximumX) {
101
+ maximumX = positions[i].x;
102
+ rightmostPositionIndex = i;
103
+ }
104
+ }
105
+ return rightmostPositionIndex;
106
+ }
107
+
108
+ /**
109
+ * Returns the index of the ring that contains the rightmost vertex.
110
+ *
111
+ * @param {Array} rings An array of arrays of Cartesians. Each array contains the vertices defining a polygon.
112
+ * @returns {Number} The index of the ring containing the rightmost vertex.
113
+ *
114
+ * @private
115
+ */
116
+ function getRightmostRingIndex(rings) {
117
+ var rightmostX = rings[0][0].x;
118
+ var rightmostRingIndex = 0;
119
+ for ( var ring = 0; ring < rings.length; ring++) {
120
+ var maximumX = rings[ring][getRightmostPositionIndex(rings[ring])].x;
121
+ if (maximumX > rightmostX) {
122
+ rightmostX = maximumX;
123
+ rightmostRingIndex = ring;
124
+ }
125
+ }
126
+
127
+ return rightmostRingIndex;
128
+ }
129
+
130
+ /**
131
+ * Returns a list containing the reflex vertices for a given polygon.
132
+ *
133
+ * @param {Array} polygon An array of Cartesian elements defining the polygon.
134
+ * @returns {Array}
135
+ *
136
+ * @private
137
+ */
138
+ function getReflexVertices(polygon) {
139
+ var reflexVertices = [];
140
+ for ( var i = 0; i < polygon.length; i++) {
141
+ var p0 = polygon[((i - 1) + polygon.length) % polygon.length];
142
+ var p1 = polygon[i];
143
+ var p2 = polygon[(i + 1) % polygon.length];
144
+
145
+ if (!isTipConvex(p0, p1, p2)) {
146
+ reflexVertices.push(p1);
147
+ }
148
+ }
149
+ return reflexVertices;
150
+ }
151
+
152
+ /**
153
+ * Returns true if the given point is contained in the list of positions.
154
+ *
155
+ * @param {Array} positions A list of Cartesian elements defining a polygon.
156
+ * @param {Cartesian} point The point to check.
157
+ * @returns {Boolean} <code>true></code> if <code>point</code> is found in <code>polygon</code>, <code>false</code> otherwise.
158
+ *
159
+ * @private
160
+ */
161
+ function isVertex(positions, point) {
162
+ for ( var i = 0; i < positions.length; i++) {
163
+ if (point.equals(positions[i])) {
164
+ return true;
165
+ }
166
+ }
167
+ return false;
168
+ }
169
+
170
+ /**
171
+ * Given a point inside a polygon, find the nearest point directly to the right that lies on one of the polygon's edges.
172
+ *
173
+ * @param {Cartesian} point A point inside the polygon defined by <code>ring</code>.
174
+ * @param {Array} ring A list of Cartesian points defining a polygon.
175
+ * @param {Array} [edgeIndices] An array containing the indices two endpoints of the edge containing the intersection.
176
+ *
177
+ * @returns {Cartesian} The intersection point.
178
+ * @private
179
+ */
180
+ function intersectPointWithRing(point, ring, edgeIndices) {
181
+ edgeIndices = defaultValue(edgeIndices, []);
182
+
183
+ var minDistance = Number.MAX_VALUE;
184
+ var rightmostVertexIndex = getRightmostPositionIndex(ring);
185
+ var intersection = new Cartesian3(ring[rightmostVertexIndex].x, point.y, 0.0);
186
+ edgeIndices.push(rightmostVertexIndex);
187
+ edgeIndices.push((rightmostVertexIndex + 1) % ring.length);
188
+
189
+ var boundaryMinX = ring[0].x;
190
+ var boundaryMaxX = boundaryMinX;
191
+ for ( var i = 1; i < ring.length; ++i) {
192
+ if (ring[i].x < boundaryMinX) {
193
+ boundaryMinX = ring[i].x;
194
+ } else if (ring[i].x > boundaryMaxX) {
195
+ boundaryMaxX = ring[i].x;
196
+ }
197
+ }
198
+ boundaryMaxX += (boundaryMaxX - boundaryMinX);
199
+ var point2 = new Cartesian3(boundaryMaxX, point.y, 0.0);
200
+
201
+ // Find the nearest intersection.
202
+ for (i = 0; i < ring.length; i++) {
203
+ var v1 = ring[i];
204
+ var v2 = ring[(i + 1) % ring.length];
205
+
206
+ if (((v1.x >= point.x) || (v2.x >= point.x)) && (((v1.y >= point.y) && (v2.y <= point.y)) || ((v1.y <= point.y) && (v2.y >= point.y)))) {
207
+ var temp = ((v2.y - v1.y) * (point2.x - point.x)) - ((v2.x - v1.x) * (point2.y - point.y));
208
+ if (temp !== 0.0) {
209
+ temp = 1.0 / temp;
210
+ var ua = (((v2.x - v1.x) * (point.y - v1.y)) - ((v2.y - v1.y) * (point.x - v1.x))) * temp;
211
+ var ub = (((point2.x - point.x) * (point.y - v1.y)) - ((point2.y - point.y) * (point.x - v1.x))) * temp;
212
+ if ((ua >= 0.0) && (ua <= 1.0) && (ub >= 0.0) && (ub <= 1.0)) {
213
+ var tempIntersection = new Cartesian2(point.x + ua * (point2.x - point.x), point.y + ua * (point2.y - point.y));
214
+ var dist = tempIntersection.subtract(point);
215
+ temp = dist.magnitudeSquared();
216
+ if (temp < minDistance) {
217
+ intersection = tempIntersection;
218
+ minDistance = temp;
219
+ edgeIndices[0] = i;
220
+ edgeIndices[1] = (i + 1) % ring.length;
221
+ }
222
+ }
223
+ }
224
+ }
225
+ }
226
+
227
+ return intersection;
228
+ }
229
+
230
+ /**
231
+ * Given an outer ring and multiple inner rings, determine the point on the outer ring that is visible
232
+ * to the rightmost vertex of the rightmost inner ring.
233
+ *
234
+ * @param {Array} outerRing An array of Cartesian points defining the outer boundary of the polygon.
235
+ * @param {Array} innerRings An array of arrays of Cartesian points, where each array represents a hole in the polygon.
236
+ * @returns {Number} The index of the vertex in <code>outerRing</code> that is mutually visible to the rightmost vertex in <code>inenrRing</code>.
237
+ *
238
+ * @private
239
+ */
240
+ function getMutuallyVisibleVertexIndex(outerRing, innerRings) {
241
+ var innerRingIndex = getRightmostRingIndex(innerRings);
242
+ var innerRing = innerRings[innerRingIndex];
243
+ var innerRingVertexIndex = getRightmostPositionIndex(innerRing);
244
+ var innerRingVertex = innerRing[innerRingVertexIndex];
245
+ var edgeIndices = [];
246
+ var intersection = intersectPointWithRing(innerRingVertex, outerRing, edgeIndices);
247
+
248
+ var visibleVertex;
249
+ if (isVertex(outerRing, intersection)) {
250
+ visibleVertex = intersection;
251
+ } else {
252
+ // Set P to be the edge endpoint closest to the inner ring vertex
253
+ var d1 = (outerRing[edgeIndices[0]].subtract(innerRingVertex)).magnitudeSquared();
254
+ var d2 = (outerRing[edgeIndices[1]].subtract(innerRingVertex)).magnitudeSquared();
255
+ var p = (d1 < d2) ? outerRing[edgeIndices[0]] : outerRing[edgeIndices[1]];
256
+
257
+ var reflexVertices = getReflexVertices(outerRing);
258
+ var reflexIndex = reflexVertices.indexOf(p);
259
+ if (reflexIndex !== -1) {
260
+ reflexVertices.splice(reflexIndex, 1); // Do not include p if it happens to be reflex.
261
+ }
262
+
263
+ var pointsInside = [];
264
+ for ( var i = 0; i < reflexVertices.length; i++) {
265
+ var vertex = reflexVertices[i];
266
+ if (pointInsideTriangle2D(vertex, innerRingVertex, intersection, p)) {
267
+ pointsInside.push(vertex);
268
+ }
269
+ }
270
+
271
+ // If all reflexive vertices are outside the triangle formed by points
272
+ // innerRingVertex, intersection and P, then P is the visible vertex.
273
+ // Otherwise, return the reflex vertex that minimizes the angle between <1,0> and <k, reflex>.
274
+ var minAngle = Number.MAX_VALUE;
275
+ if (pointsInside.length > 0) {
276
+ var v1 = new Cartesian2(1.0, 0.0, 0.0);
277
+ for (i = 0; i < pointsInside.length; i++) {
278
+ var v2 = pointsInside[i].subtract(innerRingVertex);
279
+ var denominator = v1.magnitude() * v2.magnitude();
280
+ if (denominator !== 0) {
281
+ var angle = Math.abs(Math.acos(v1.dot(v2) / denominator));
282
+ if (angle < minAngle) {
283
+ minAngle = angle;
284
+ p = pointsInside[i];
285
+ }
286
+ }
287
+ }
288
+ }
289
+ visibleVertex = p;
290
+ }
291
+
292
+ return outerRing.indexOf(visibleVertex);
293
+ }
294
+
295
+ /**
296
+ * Given a polygon defined by an outer ring with one or more inner rings (holes), return a single list of points representing
297
+ * a polygon with the rightmost hole added to it. The added hole is removed from <code>innerRings</code>.
298
+ *
299
+ * @param {Array} outerRing An array of Cartesian points defining the outer boundary of the polygon.
300
+ * @param {Array} innerRings An array of arrays of Cartesian points, where each array represents a hole in the polygon.
301
+ *
302
+ * @return A single list of Cartesian points defining the polygon, including the eliminated inner ring.
303
+ *
304
+ * @private
305
+ */
306
+ function eliminateHole(outerRing, innerRings, ellipsoid) {
307
+ // Check that the holes are defined in the winding order opposite that of the outer ring.
308
+ var windingOrder = PolygonPipeline.computeWindingOrder2D(outerRing);
309
+ for ( var i = 0; i < innerRings.length; i++) {
310
+ var ring = innerRings[i];
311
+
312
+ // Ensure each hole's first and last points are the same.
313
+ if (!(ring[0]).equals(ring[ring.length - 1])) {
314
+ ring.push(ring[0]);
315
+ }
316
+
317
+ var innerWindingOrder = PolygonPipeline.computeWindingOrder2D(ring);
318
+ if (innerWindingOrder === windingOrder) {
319
+ ring.reverse();
320
+ }
321
+ }
322
+
323
+ // Project points onto a tangent plane to find the mutually visible vertex.
324
+ var tangentPlane = EllipsoidTangentPlane.fromPoints(outerRing, ellipsoid);
325
+ var tangentOuterRing = tangentPlane.projectPointsOntoPlane(outerRing);
326
+ var tangentInnerRings = [];
327
+ for (i = 0; i < innerRings.length; i++) {
328
+ tangentInnerRings.push(tangentPlane.projectPointsOntoPlane(innerRings[i]));
329
+ }
330
+
331
+ var visibleVertexIndex = getMutuallyVisibleVertexIndex(tangentOuterRing, tangentInnerRings);
332
+ var innerRingIndex = getRightmostRingIndex(tangentInnerRings);
333
+ var innerRingVertexIndex = getRightmostPositionIndex(tangentInnerRings[innerRingIndex]);
334
+
335
+ var innerRing = innerRings[innerRingIndex];
336
+ var newPolygonVertices = [];
337
+
338
+ for (i = 0; i < outerRing.length; i++) {
339
+ newPolygonVertices.push(outerRing[i]);
340
+ }
341
+
342
+ var j;
343
+ var holeVerticesToAdd = [];
344
+
345
+ // If the rightmost inner vertex is not the starting and ending point of the ring,
346
+ // then some other point is duplicated in the inner ring and should be skipped once.
347
+ if (innerRingVertexIndex !== 0) {
348
+ for (j = 0; j <= innerRing.length; j++) {
349
+ var index = (j + innerRingVertexIndex) % innerRing.length;
350
+ if (index !== 0) {
351
+ holeVerticesToAdd.push(innerRing[index]);
352
+ }
353
+ }
354
+ } else {
355
+ for (j = 0; j < innerRing.length; j++) {
356
+ holeVerticesToAdd.push(innerRing[(j + innerRingVertexIndex) % innerRing.length]);
357
+ }
358
+ }
359
+
360
+ var lastVisibleVertexIndex = newPolygonVertices.lastIndexOf(outerRing[visibleVertexIndex]);
361
+
362
+ holeVerticesToAdd.push(outerRing[lastVisibleVertexIndex]);
363
+
364
+ var front = newPolygonVertices.slice(0, lastVisibleVertexIndex + 1);
365
+ var back = newPolygonVertices.slice(lastVisibleVertexIndex + 1);
366
+ newPolygonVertices = front.concat(holeVerticesToAdd, back);
367
+
368
+ innerRings.splice(innerRingIndex, 1);
369
+
370
+ return newPolygonVertices;
371
+ }
372
+
373
+ var scaleToGeodeticHeightN = new Cartesian3();
374
+ var scaleToGeodeticHeightP = new Cartesian3();
375
+
376
+ /**
377
+ * DOC_TBA
378
+ *
379
+ * @exports PolygonPipeline
380
+ */
381
+ var PolygonPipeline = {
382
+ /**
383
+ * DOC_TBA
384
+ *
385
+ * Cleans up a simple polygon by removing duplicate adjacent positions and making
386
+ * the first position not equal the last position.
387
+ *
388
+ * @exception {DeveloperError} positions is required.
389
+ * @exception {DeveloperError} At least three positions are required.
390
+ */
391
+ cleanUp : function(positions) {
392
+ if (!positions) {
393
+ throw new DeveloperError('positions is required.');
394
+ }
395
+
396
+ var length = positions.length;
397
+ if (length < 3) {
398
+ throw new DeveloperError('At least three positions are required.');
399
+ }
400
+
401
+ var cleanedPositions = [];
402
+
403
+ for ( var i0 = length - 1, i1 = 0; i1 < length; i0 = i1++) {
404
+ var v0 = positions[i0];
405
+ var v1 = positions[i1];
406
+
407
+ if (!v0.equals(v1)) {
408
+ cleanedPositions.push(v1); // Shallow copy!
409
+ }
410
+ }
411
+
412
+ return cleanedPositions;
413
+ },
414
+
415
+ /**
416
+ * DOC_TBA
417
+ *
418
+ * @exception {DeveloperError} positions is required.
419
+ * @exception {DeveloperError} At least three positions are required.
420
+ */
421
+ computeArea2D : function(positions) {
422
+ if (!positions) {
423
+ throw new DeveloperError('positions is required.');
424
+ }
425
+
426
+ var length = positions.length;
427
+ if (length < 3) {
428
+ throw new DeveloperError('At least three positions are required.');
429
+ }
430
+
431
+ var area = 0.0;
432
+
433
+ for ( var i0 = length - 1, i1 = 0; i1 < length; i0 = i1++) {
434
+ var v0 = positions[i0];
435
+ var v1 = positions[i1];
436
+
437
+ area += (v0.x * v1.y) - (v1.x * v0.y);
438
+ }
439
+
440
+ return area * 0.5;
441
+ },
442
+
443
+ /**
444
+ * DOC_TBA
445
+ *
446
+ * @return {WindingOrder} DOC_TBA
447
+ *
448
+ * @exception {DeveloperError} positions is required.
449
+ * @exception {DeveloperError} At least three positions are required.
450
+ */
451
+ computeWindingOrder2D : function(positions) {
452
+ var area = PolygonPipeline.computeArea2D(positions);
453
+ return (area >= 0.0) ? WindingOrder.COUNTER_CLOCKWISE : WindingOrder.CLOCKWISE;
454
+ },
455
+
456
+ /**
457
+ * DOC_TBA
458
+ *
459
+ * @exception {DeveloperError} positions is required.
460
+ * @exception {DeveloperError} At least three positions are required.
461
+ */
462
+ earClip2D : function(positions) {
463
+ // PERFORMANCE_IDEA: This is slow at n^3. Make it faster with:
464
+ // * http://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf
465
+ // * http://cgm.cs.mcgill.ca/~godfried/publications/triangulation.held.ps.gz
466
+ // * http://blogs.agi.com/insight3d/index.php/2008/03/20/triangulation-rhymes-with-strangulation/
467
+
468
+ if (!positions) {
469
+ throw new DeveloperError('positions is required.');
470
+ }
471
+
472
+ var length = positions.length;
473
+ if (length < 3) {
474
+ throw new DeveloperError('At least three positions are required.');
475
+ }
476
+
477
+ var remainingPositions = new DoublyLinkedList();
478
+
479
+ for ( var i = 0; i < length; ++i) {
480
+ remainingPositions.add({
481
+ position : positions[i],
482
+ index : i
483
+ });
484
+ }
485
+
486
+ var indices = [];
487
+
488
+ var previousNode = remainingPositions.head;
489
+ var node = previousNode.next;
490
+ var nextNode = node.next;
491
+
492
+ var bailCount = length * length;
493
+
494
+ while (remainingPositions.length > 3) {
495
+ var p0 = previousNode.item.position;
496
+ var p1 = node.item.position;
497
+ var p2 = nextNode.item.position;
498
+
499
+ if (isTipConvex(p0, p1, p2)) {
500
+ var isEar = true;
501
+
502
+ for ( var n = (nextNode.next ? nextNode.next : remainingPositions.head); n !== previousNode; n = (n.next ? n.next : remainingPositions.head)) {
503
+ if (pointInsideTriangle2D(n.item.position, p0, p1, p2)) {
504
+ isEar = false;
505
+ break;
506
+ }
507
+ }
508
+
509
+ if (isEar) {
510
+ indices.push(previousNode.item.index);
511
+ indices.push(node.item.index);
512
+ indices.push(nextNode.item.index);
513
+
514
+ remainingPositions.remove(node);
515
+
516
+ node = nextNode;
517
+ nextNode = nextNode.next ? nextNode.next : remainingPositions.head;
518
+ continue;
519
+ }
520
+ }
521
+
522
+ previousNode = previousNode.next ? previousNode.next : remainingPositions.head;
523
+ node = node.next ? node.next : remainingPositions.head;
524
+ nextNode = nextNode.next ? nextNode.next : remainingPositions.head;
525
+
526
+ if (--bailCount === 0) {
527
+ break;
528
+ }
529
+ }
530
+
531
+ var n0 = remainingPositions.head;
532
+ var n1 = n0.next;
533
+ var n2 = n1.next;
534
+ indices.push(n0.item.index);
535
+ indices.push(n1.item.index);
536
+ indices.push(n2.item.index);
537
+
538
+ return indices;
539
+ },
540
+
541
+ /**
542
+ * DOC_TBA
543
+ *
544
+ * @param {DOC_TBA} positions DOC_TBA
545
+ * @param {DOC_TBA} indices DOC_TBA
546
+ * @param {Number} [granularity] DOC_TBA
547
+ *
548
+ * @exception {DeveloperError} positions is required.
549
+ * @exception {DeveloperError} indices is required.
550
+ * @exception {DeveloperError} At least three indices are required.
551
+ * @exception {DeveloperError} The number of indices must be divisable by three.
552
+ * @exception {DeveloperError} Granularity must be greater than zero.
553
+ */
554
+ computeSubdivision : function(positions, indices, granularity) {
555
+ if (!positions) {
556
+ throw new DeveloperError('positions is required.');
557
+ }
558
+
559
+ if (!indices) {
560
+ throw new DeveloperError('indices is required.');
561
+ }
562
+
563
+ if (indices.length < 3) {
564
+ throw new DeveloperError('At least three indices are required.');
565
+ }
566
+
567
+ if (indices.length % 3 !== 0) {
568
+ throw new DeveloperError('The number of indices must be divisable by three.');
569
+ }
570
+
571
+ granularity = granularity || CesiumMath.toRadians(1.0);
572
+ if (granularity <= 0.0) {
573
+ throw new DeveloperError('granularity must be greater than zero.');
574
+ }
575
+
576
+ // Use a queue for triangles that need (or might need) to be subdivided.
577
+ var triangles = new Queue();
578
+
579
+ var indicesLength = indices.length;
580
+ for ( var j = 0; j < indicesLength; j += 3) {
581
+ triangles.enqueue({
582
+ i0 : indices[j],
583
+ i1 : indices[j + 1],
584
+ i2 : indices[j + 2]
585
+ });
586
+ }
587
+
588
+ // New positions due to edge splits are appended to the positions list.
589
+ var subdividedPositions = positions.slice(0); // shadow copy!
590
+ var subdividedIndices = [];
591
+
592
+ // Used to make sure shared edges are not split more than once.
593
+ var edges = {};
594
+
595
+ var i;
596
+ while (triangles.length > 0) {
597
+ var triangle = triangles.dequeue();
598
+
599
+ var v0 = subdividedPositions[triangle.i0];
600
+ var v1 = subdividedPositions[triangle.i1];
601
+ var v2 = subdividedPositions[triangle.i2];
602
+
603
+ var g0 = v0.angleBetween(v1);
604
+ var g1 = v1.angleBetween(v2);
605
+ var g2 = v2.angleBetween(v0);
606
+
607
+ var max = Math.max(g0, Math.max(g1, g2));
608
+ var edge;
609
+
610
+ if (max > granularity) {
611
+ if (g0 === max) {
612
+ edge = Math.min(triangle.i0, triangle.i1).toString() + ' ' + Math.max(triangle.i0, triangle.i1).toString();
613
+
614
+ i = edges[edge];
615
+ if (!i) {
616
+ subdividedPositions.push(v0.add(v1).multiplyByScalar(0.5));
617
+ i = subdividedPositions.length - 1;
618
+ edges[edge] = i;
619
+ }
620
+
621
+ triangles.enqueue({
622
+ i0 : triangle.i0,
623
+ i1 : i,
624
+ i2 : triangle.i2
625
+ });
626
+ triangles.enqueue({
627
+ i0 : i,
628
+ i1 : triangle.i1,
629
+ i2 : triangle.i2
630
+ });
631
+ } else if (g1 === max) {
632
+ edge = Math.min(triangle.i1, triangle.i2).toString() + ' ' + Math.max(triangle.i1, triangle.i2).toString();
633
+
634
+ i = edges[edge];
635
+ if (!i) {
636
+ subdividedPositions.push(v1.add(v2).multiplyByScalar(0.5));
637
+ i = subdividedPositions.length - 1;
638
+ edges[edge] = i;
639
+ }
640
+
641
+ triangles.enqueue({
642
+ i0 : triangle.i1,
643
+ i1 : i,
644
+ i2 : triangle.i0
645
+ });
646
+ triangles.enqueue({
647
+ i0 : i,
648
+ i1 : triangle.i2,
649
+ i2 : triangle.i0
650
+ });
651
+ } else if (g2 === max) {
652
+ edge = Math.min(triangle.i2, triangle.i0).toString() + ' ' + Math.max(triangle.i2, triangle.i0).toString();
653
+
654
+ i = edges[edge];
655
+ if (!i) {
656
+ subdividedPositions.push(v2.add(v0).multiplyByScalar(0.5));
657
+ i = subdividedPositions.length - 1;
658
+ edges[edge] = i;
659
+ }
660
+
661
+ triangles.enqueue({
662
+ i0 : triangle.i2,
663
+ i1 : i,
664
+ i2 : triangle.i1
665
+ });
666
+ triangles.enqueue({
667
+ i0 : i,
668
+ i1 : triangle.i0,
669
+ i2 : triangle.i1
670
+ });
671
+ }
672
+ } else {
673
+ subdividedIndices.push(triangle.i0);
674
+ subdividedIndices.push(triangle.i1);
675
+ subdividedIndices.push(triangle.i2);
676
+ }
677
+ }
678
+
679
+ // PERFORMANCE_IDEA Rather that waste time re-iterating the entire set of positions
680
+ // here, all of the above code can be refactored to flatten as values are added
681
+ // Removing the need for this for loop.
682
+ var length = subdividedPositions.length;
683
+ var flattenedPositions = new Array(length * 3);
684
+ var q = 0;
685
+ for (i = 0; i < length; i++) {
686
+ var item = subdividedPositions[i];
687
+ flattenedPositions[q++] = item.x;
688
+ flattenedPositions[q++] = item.y;
689
+ flattenedPositions[q++] = item.z;
690
+ }
691
+
692
+ return {
693
+ attributes : {
694
+ position : {
695
+ componentDatatype : ComponentDatatype.FLOAT,
696
+ componentsPerAttribute : 3,
697
+ values : flattenedPositions
698
+ }
699
+ },
700
+
701
+ indexLists : [{
702
+ primitiveType : PrimitiveType.TRIANGLES,
703
+ values : subdividedIndices
704
+ }]
705
+ };
706
+ },
707
+
708
+ /**
709
+ * DOC_TBA
710
+ *
711
+ * @exception {DeveloperError} ellipsoid is required.
712
+ */
713
+ scaleToGeodeticHeight : function(mesh, height, ellipsoid) {
714
+ ellipsoid = defaultValue(ellipsoid, Ellipsoid.WGS84);
715
+
716
+ var n = scaleToGeodeticHeightN;
717
+ var p = scaleToGeodeticHeightP;
718
+
719
+ height = height || 0.0;
720
+
721
+ if (mesh && mesh.attributes && mesh.attributes.position) {
722
+ var positions = mesh.attributes.position.values;
723
+ var length = positions.length;
724
+
725
+ for ( var i = 0; i < length; i += 3) {
726
+ p.x = positions[i];
727
+ p.y = positions[i + 1];
728
+ p.z = positions[i + 2];
729
+
730
+ ellipsoid.scaleToGeodeticSurface(p, p);
731
+ ellipsoid.geodeticSurfaceNormal(p, n);
732
+ Cartesian3.multiplyByScalar(n, height, n);
733
+ Cartesian3.add(p, n, p);
734
+
735
+ positions[i] = p.x;
736
+ positions[i + 1] = p.y;
737
+ positions[i + 2] = p.z;
738
+ }
739
+ }
740
+
741
+ return mesh;
742
+ },
743
+
744
+ /**
745
+ * Given a polygon defined by an outer ring with one or more inner rings (holes), return a single list of points representing
746
+ * a polygon defined by the outer ring with the inner holes removed.
747
+ *
748
+ * @param {Array} outerRing An array of Cartesian points defining the outer boundary of the polygon.
749
+ * @param {Array} innerRings An array of arrays of Cartesian points, where each array represents a hole in the polygon.
750
+ *
751
+ * @return A single list of Cartesian points defining the polygon, including the eliminated inner ring.
752
+ *
753
+ * @exception {DeveloperError} <code>outerRing</code> is required.
754
+ * @exception {DeveloperError} <code>outerRing</code> must not be empty.
755
+ * @exception {DeveloperError} <code>innerRings</code> is required.
756
+ *
757
+ * @example
758
+ * // Simplifying a polygon with multiple holes.
759
+ * outerRing = PolygonPipeline.eliminateHoles(outerRing, innerRings);
760
+ * polygon.setPositions(outerRing);
761
+ */
762
+ eliminateHoles : function(outerRing, innerRings, ellipsoid) {
763
+ if (typeof outerRing === 'undefined') {
764
+ throw new DeveloperError('outerRing is required.');
765
+ }
766
+ if (outerRing.length === 0) {
767
+ throw new DeveloperError('outerRing must not be empty.');
768
+ }
769
+ if (typeof innerRings === 'undefined') {
770
+ throw new DeveloperError('innerRings is required.');
771
+ }
772
+ ellipsoid = defaultValue(ellipsoid, Ellipsoid.WGS84);
773
+
774
+ var innerRingsCopy = [];
775
+ for ( var i = 0; i < innerRings.length; i++) {
776
+ var innerRing = [];
777
+ for ( var j = 0; j < innerRings[i].length; j++) {
778
+ innerRing.push(Cartesian3.clone(innerRings[i][j]));
779
+ }
780
+ innerRingsCopy.push(innerRing);
781
+ }
782
+
783
+ var newPolygonVertices = outerRing;
784
+ while (innerRingsCopy.length > 0) {
785
+ newPolygonVertices = eliminateHole(newPolygonVertices, innerRingsCopy, ellipsoid);
786
+ }
787
+ return newPolygonVertices;
788
+ }
789
+ };
790
+
791
+ return PolygonPipeline;
792
+ });