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,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
+ });