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,1063 @@
1
+ /*global define*/
2
+ define([
3
+ '../Core/destroyObject',
4
+ '../Core/Cartesian2',
5
+ '../Core/Cartesian3',
6
+ '../Core/Cartesian4',
7
+ '../Core/Cartographic',
8
+ '../Core/DeveloperError',
9
+ '../Core/Ellipsoid',
10
+ '../Core/KeyboardEventModifier',
11
+ '../Core/FAR',
12
+ '../Core/IntersectionTests',
13
+ '../Core/Math',
14
+ '../Core/Matrix3',
15
+ '../Core/Matrix4',
16
+ '../Core/Quaternion',
17
+ '../Core/Ray',
18
+ '../Core/Transforms',
19
+ './AnimationCollection',
20
+ './CameraEventAggregator',
21
+ './CameraEventType',
22
+ './CameraColumbusViewMode',
23
+ './SceneMode'
24
+ ], function(
25
+ destroyObject,
26
+ Cartesian2,
27
+ Cartesian3,
28
+ Cartesian4,
29
+ Cartographic,
30
+ DeveloperError,
31
+ Ellipsoid,
32
+ KeyboardEventModifier,
33
+ FAR,
34
+ IntersectionTests,
35
+ CesiumMath,
36
+ Matrix3,
37
+ Matrix4,
38
+ Quaternion,
39
+ Ray,
40
+ Transforms,
41
+ AnimationCollection,
42
+ CameraEventAggregator,
43
+ CameraEventType,
44
+ CameraColumbusViewMode,
45
+ SceneMode) {
46
+ "use strict";
47
+
48
+ /**
49
+ * Modifies the camera position and orientation based on mouse input to a canvas.
50
+ * @alias ScreenSpaceCameraController
51
+ * @constructor
52
+ *
53
+ * @param {HTMLCanvasElement} canvas The canvas to listen for events.
54
+ * @param {CameraController} cameraController The camera controller used to modify the camera.
55
+ *
56
+ * @exception {DeveloperError} canvas is required.
57
+ * @exception {DeveloperError} cameraController is required.
58
+ */
59
+ var ScreenSpaceCameraController = function(canvas, cameraController) {
60
+ if (typeof canvas === 'undefined') {
61
+ throw new DeveloperError('canvas is required.');
62
+ }
63
+
64
+ if (typeof cameraController === 'undefined') {
65
+ throw new DeveloperError('cameraController is required.');
66
+ }
67
+
68
+ /**
69
+ * If true, allows the user to pan around the map. If false, the camera stays locked at the current position.
70
+ * This flag only applies in 2D and Columbus view modes.
71
+ * @type Boolean
72
+ */
73
+ this.enableTranslate = true;
74
+ /**
75
+ * If true, allows the user to zoom in and out. If false, the camera is locked to the current distance from the ellipsoid.
76
+ * @type Boolean
77
+ */
78
+ this.enableZoom = true;
79
+ /**
80
+ * If true, allows the user to rotate the camera. If false, the camera is locked to the current heading.
81
+ * This flag only applies in 2D and 3D.
82
+ * @type Boolean
83
+ */
84
+ this.enableRotate = true;
85
+ /**
86
+ * If true, allows the user to tilt the camera. If false, the camera is locked to the current heading.
87
+ * This flag only applies in 3D and Columbus view.
88
+ * @type Boolean
89
+ */
90
+ this.enableTilt = true;
91
+ /**
92
+ * If true, allows the user to use free-look. If false, the camera view direction can only be changed through translating
93
+ * or rotating. This flag only applies in 3D and Columbus view modes.
94
+ */
95
+ this.enableLook = true;
96
+ /**
97
+ * A parameter in the range <code>[0, 1)</code> used to determine how long
98
+ * the camera will continue to spin because of inertia.
99
+ * With value of zero, the camera will have no inertia.
100
+ * @type Number
101
+ */
102
+ this.inertiaSpin = 0.9;
103
+ /**
104
+ * A parameter in the range <code>[0, 1)</code> used to determine how long
105
+ * the camera will continue to translate because of inertia.
106
+ * With value of zero, the camera will have no inertia.
107
+ * @type Number
108
+ */
109
+ this.inertiaTranslate = 0.9;
110
+ /**
111
+ * A parameter in the range <code>[0, 1)</code> used to determine how long
112
+ * the camera will continue to zoom because of inertia.
113
+ * With value of zero, the camera will have no inertia.
114
+ * @type Number
115
+ */
116
+ this.inertiaZoom = 0.8;
117
+ /**
118
+ * A parameter in the range <code>[0, 1)</code> used to limit the range
119
+ * of various user inputs to a percentage of the window width/height per animation frame.
120
+ * This helps keep the camera under control in low-frame-rate situations.
121
+ * @type Number
122
+ */
123
+ this.maximumMovementRatio = 0.1;
124
+ /**
125
+ * Sets the behavior in Columbus view.
126
+ * @type CameraColumbusViewMode
127
+ */
128
+ this.columbusViewMode = CameraColumbusViewMode.FREE;
129
+ /**
130
+ * Sets the duration, in milliseconds, of the bounce back animations in 2D and Columbus view. The default value is 3000.
131
+ * @type Number
132
+ */
133
+ this.bounceAnimationTime = 3000.0;
134
+ /**
135
+ * The minimum magnitude, in meters, of the camera position when zooming. Defaults to 20.0.
136
+ * @type Number
137
+ */
138
+ this.minimumZoomDistance = 20.0;
139
+ /**
140
+ * The maximum magnitude, in meters, of the camera position when zooming. Defaults to positive infinity.
141
+ * @type Number
142
+ */
143
+ this.maximumZoomDistance = Number.POSITIVE_INFINITY;
144
+
145
+ this._canvas = canvas;
146
+ this._cameraController = cameraController;
147
+ this._ellipsoid = Ellipsoid.WGS84;
148
+
149
+ this._spinHandler = new CameraEventAggregator(canvas, CameraEventType.LEFT_DRAG);
150
+ this._translateHandler = new CameraEventAggregator(canvas, CameraEventType.LEFT_DRAG);
151
+ this._lookHandler = new CameraEventAggregator(canvas, CameraEventType.LEFT_DRAG, KeyboardEventModifier.SHIFT);
152
+ this._rotateHandler = new CameraEventAggregator(canvas, CameraEventType.MIDDLE_DRAG);
153
+ this._zoomHandler = new CameraEventAggregator(canvas, CameraEventType.RIGHT_DRAG);
154
+ this._zoomWheelHandler = new CameraEventAggregator(canvas, CameraEventType.WHEEL);
155
+ this._pinchHandler = new CameraEventAggregator(canvas, CameraEventType.PINCH);
156
+
157
+ this._lastInertiaSpinMovement = undefined;
158
+ this._lastInertiaZoomMovement = undefined;
159
+ this._lastInertiaTranslateMovement = undefined;
160
+ this._lastInertiaWheelZoomMovement = undefined;
161
+ this._lastInertiaTiltMovement = undefined;
162
+
163
+ this._animationCollection = new AnimationCollection();
164
+ this._animation = undefined;
165
+
166
+ this._horizontalRotationAxis = undefined;
167
+
168
+ // Constants, Make any of these public?
169
+ var radius = this._ellipsoid.getMaximumRadius();
170
+ this._zoomFactor = 5.0;
171
+ this._rotateFactor = 1.0 / radius;
172
+ this._rotateRateRangeAdjustment = radius;
173
+ this._maximumRotateRate = 1.77;
174
+ this._minimumRotateRate = 1.0 / 5000.0;
175
+ this._translateFactor = 1.0;
176
+ this._minimumZoomRate = 20.0;
177
+ this._maximumZoomRate = FAR;
178
+ };
179
+
180
+ /**
181
+ * Gets the ellipsoid. The ellipsoid is used to determine the size of the map in 2D and Columbus view
182
+ * as well as how fast to rotate the camera based on the distance to its surface.
183
+ * @returns {Ellipsoid} The ellipsoid.
184
+ */
185
+ ScreenSpaceCameraController.prototype.getEllipsoid = function() {
186
+ return this._ellipsoid;
187
+ };
188
+
189
+ /**
190
+ * Sets the ellipsoid. The ellipsoid is used to determine the size of the map in 2D and Columbus view
191
+ * as well as how fast to rotate the camera based on the distance to its surface.
192
+ * @param {Ellipsoid} [ellipsoid=WGS84] The ellipsoid.
193
+ */
194
+ ScreenSpaceCameraController.prototype.setEllipsoid = function(ellipsoid) {
195
+ ellipsoid = ellipsoid || Ellipsoid.WGS84;
196
+ var radius = ellipsoid.getMaximumRadius();
197
+ this._ellipsoid = ellipsoid;
198
+ this._rotateFactor = 1.0 / radius;
199
+ this._rotateRateRangeAdjustment = radius;
200
+ };
201
+
202
+ function decay(time, coefficient) {
203
+ if (time < 0) {
204
+ return 0.0;
205
+ }
206
+
207
+ var tau = (1.0 - coefficient) * 25.0;
208
+ return Math.exp(-tau * time);
209
+ }
210
+
211
+ function sameMousePosition(movement) {
212
+ return movement.startPosition.equalsEpsilon(movement.endPosition, CesiumMath.EPSILON14);
213
+ }
214
+
215
+ // If the time between mouse down and mouse up is not between
216
+ // these thresholds, the camera will not move with inertia.
217
+ // This value is probably dependent on the browser and/or the
218
+ // hardware. Should be investigated further.
219
+ var inertiaMaxClickTimeThreshold = 0.4;
220
+
221
+ function maintainInertia(handler, decayCoef, action, object, lastMovementName) {
222
+ var ts = handler.getButtonPressTime();
223
+ var tr = handler.getButtonReleaseTime();
224
+ var threshold = ts && tr && ((tr.getTime() - ts.getTime()) / 1000.0);
225
+ var now = new Date();
226
+ var fromNow = tr && ((now.getTime() - tr.getTime()) / 1000.0);
227
+ if (ts && tr && threshold < inertiaMaxClickTimeThreshold) {
228
+ var d = decay(fromNow, decayCoef);
229
+
230
+ if (typeof object[lastMovementName] === 'undefined') {
231
+ var lastMovement = handler.getLastMovement();
232
+ if (!lastMovement || sameMousePosition(lastMovement)) {
233
+ return;
234
+ }
235
+
236
+ var motionX = (lastMovement.endPosition.x - lastMovement.startPosition.x) * 0.5;
237
+ var motionY = (lastMovement.endPosition.y - lastMovement.startPosition.y) * 0.5;
238
+ object[lastMovementName] = {
239
+ startPosition : new Cartesian2(lastMovement.startPosition.x, lastMovement.startPosition.y),
240
+ endPosition : new Cartesian2(lastMovement.startPosition.x + motionX * d, lastMovement.startPosition.y + motionY * d),
241
+ motion : new Cartesian2(motionX, motionY)
242
+ };
243
+ } else {
244
+ object[lastMovementName] = {
245
+ startPosition : object[lastMovementName].endPosition.clone(),
246
+ endPosition : new Cartesian2(
247
+ object[lastMovementName].endPosition.x + object[lastMovementName].motion.x * d,
248
+ object[lastMovementName].endPosition.y + object[lastMovementName].motion.y * d),
249
+ motion : new Cartesian2(0.0, 0.0)
250
+ };
251
+ }
252
+
253
+ // If value from the decreasing exponential function is close to zero,
254
+ // the end coordinates may be NaN.
255
+ if (isNaN(object[lastMovementName].endPosition.x) || isNaN(object[lastMovementName].endPosition.y) || sameMousePosition(object[lastMovementName])) {
256
+ object[lastMovementName] = undefined;
257
+ return;
258
+ }
259
+
260
+ if (!handler.isButtonDown()) {
261
+ action(object, object[lastMovementName]);
262
+ }
263
+ } else {
264
+ object[lastMovementName] = undefined;
265
+ }
266
+ }
267
+
268
+ function handleZoom(object, movement, zoomFactor, distanceMeasure, unitPositionDotDirection) {
269
+ var percentage = 1.0;
270
+ if (typeof unitPositionDotDirection !== 'undefined') {
271
+ percentage = CesiumMath.clamp(Math.abs(unitPositionDotDirection), 0.25, 1.0);
272
+ }
273
+
274
+ // distanceMeasure should be the height above the ellipsoid.
275
+ // The zoomRate slows as it approaches the surface and stops minimumZoomDistance above it.
276
+ var minHeight = object.minimumZoomDistance * percentage;
277
+ var maxHeight = object.maximumZoomDistance;
278
+
279
+ var minDistance = distanceMeasure - minHeight;
280
+ var zoomRate = zoomFactor * minDistance;
281
+ zoomRate = CesiumMath.clamp(zoomRate, object._minimumZoomRate, object._maximumZoomRate);
282
+
283
+ var diff = movement.endPosition.y - movement.startPosition.y;
284
+ var rangeWindowRatio = diff / object._canvas.clientHeight;
285
+ rangeWindowRatio = Math.min(rangeWindowRatio, object.maximumMovementRatio);
286
+ var distance = zoomRate * rangeWindowRatio;
287
+
288
+ if (distance > 0.0 && Math.abs(distanceMeasure - minHeight) < 1.0) {
289
+ return;
290
+ }
291
+
292
+ if (distance < 0.0 && Math.abs(distanceMeasure - maxHeight) < 1.0) {
293
+ return;
294
+ }
295
+
296
+ if (distanceMeasure - distance < minHeight) {
297
+ distance = distanceMeasure - minHeight - 1.0;
298
+ } else if (distanceMeasure - distance > maxHeight) {
299
+ distance = distanceMeasure - maxHeight;
300
+ }
301
+
302
+ object._cameraController.zoomIn(distance);
303
+ }
304
+
305
+ var translate2DStart = new Ray();
306
+ var translate2DEnd = new Ray();
307
+ function translate2D(controller, movement) {
308
+ var cameraController = controller._cameraController;
309
+ var start = cameraController.getPickRay(movement.startPosition, translate2DStart).origin;
310
+ var end = cameraController.getPickRay(movement.endPosition, translate2DEnd).origin;
311
+
312
+ cameraController.moveRight(start.x - end.x);
313
+ cameraController.moveUp(start.y - end.y);
314
+ }
315
+
316
+ function zoom2D(controller, movement) {
317
+ handleZoom(controller, movement, controller._zoomFactor, controller._cameraController.getMagnitude());
318
+ }
319
+
320
+ var twist2DStart = new Cartesian2();
321
+ var twist2DEnd = new Cartesian2();
322
+ function twist2D(controller, movement) {
323
+ var width = controller._canvas.clientWidth;
324
+ var height = controller._canvas.clientHeight;
325
+
326
+ var start = twist2DStart;
327
+ start.x = (2.0 / width) * movement.startPosition.x - 1.0;
328
+ start.y = (2.0 / height) * (height - movement.startPosition.y) - 1.0;
329
+ Cartesian2.normalize(start, start);
330
+
331
+ var end = twist2DEnd;
332
+ end.x = (2.0 / width) * movement.endPosition.x - 1.0;
333
+ end.y = (2.0 / height) * (height - movement.endPosition.y) - 1.0;
334
+ Cartesian2.normalize(end, end);
335
+
336
+ var startTheta = Math.acos(start.x);
337
+ if (start.y < 0) {
338
+ startTheta = CesiumMath.TWO_PI - startTheta;
339
+ }
340
+ var endTheta = Math.acos(end.x);
341
+ if (end.y < 0) {
342
+ endTheta = CesiumMath.TWO_PI - endTheta;
343
+ }
344
+ var theta = endTheta - startTheta;
345
+
346
+ controller._cameraController.twistRight(theta);
347
+ }
348
+
349
+ function singleAxisTwist2D(controller, movement) {
350
+ var rotateRate = controller._rotateFactor * controller._rotateRateRangeAdjustment;
351
+
352
+ if (rotateRate > controller._maximumRotateRate) {
353
+ rotateRate = controller._maximumRotateRate;
354
+ }
355
+
356
+ if (rotateRate < controller._minimumRotateRate) {
357
+ rotateRate = controller._minimumRotateRate;
358
+ }
359
+
360
+ var phiWindowRatio = (movement.endPosition.x - movement.startPosition.x) / controller._canvas.clientWidth;
361
+ phiWindowRatio = Math.min(phiWindowRatio, controller.maximumMovementRatio);
362
+
363
+ var deltaPhi = rotateRate * phiWindowRatio * Math.PI * 4.0;
364
+
365
+ controller._cameraController.twistRight(deltaPhi);
366
+ }
367
+
368
+ function update2D(controller) {
369
+ var translate = controller._translateHandler;
370
+ var rightZoom = controller._zoomHandler;
371
+ var wheelZoom = controller._zoomWheelHandler;
372
+ var pinch = controller._pinchHandler;
373
+ var translating = translate.isMoving() && translate.getMovement();
374
+ var rightZooming = rightZoom.isMoving();
375
+ var wheelZooming = wheelZoom.isMoving();
376
+ var pinching = pinch.isMoving();
377
+
378
+ if (translate.isButtonDown() || rightZoom.isButtonDown() || wheelZooming) {
379
+ controller._animationCollection.removeAll();
380
+ }
381
+
382
+ if (controller.enableTranslate) {
383
+ if (translating) {
384
+ translate2D(controller, translate.getMovement());
385
+ }
386
+
387
+ if (!translating && controller.inertiaTranslate < 1.0) {
388
+ maintainInertia(translate, controller.inertiaTranslate, translate2D, controller, '_lastInertiaTranslateMovement');
389
+ }
390
+ }
391
+
392
+ if (controller.enableZoom) {
393
+ if (rightZooming) {
394
+ zoom2D(controller, rightZoom.getMovement());
395
+ } else if (wheelZooming) {
396
+ zoom2D(controller, wheelZoom.getMovement());
397
+ } else if (pinching) {
398
+ zoom2D(controller, pinch.getMovement().distance);
399
+ }
400
+
401
+ if (!rightZooming && controller.inertiaZoom < 1.0) {
402
+ maintainInertia(rightZoom, controller.inertiaZoom, zoom2D, controller, '_lastInertiaZoomMovement');
403
+ }
404
+
405
+ if (!wheelZooming && controller.inertiaZoom < 1.0) {
406
+ maintainInertia(wheelZoom, controller.inertiaZoom, zoom2D, controller, '_lastInertiaWheelZoomMovement');
407
+ }
408
+
409
+ if (!pinching && controller.inertiaZoom < 1.0) {
410
+ maintainInertia(pinch, controller.inertiaZoom, zoom2D, controller, '_lastInertiaZoomMovement');
411
+ }
412
+ }
413
+
414
+ if (controller.enableRotate) {
415
+ if (controller._rotateHandler.isMoving()) {
416
+ twist2D(controller, controller._rotateHandler.getMovement());
417
+ //singleAxisTwist2D(controller, controller._rotateHandler.getMovement());
418
+ }
419
+ if (pinching) {
420
+ singleAxisTwist2D(controller, pinch.getMovement().angleAndHeight);
421
+ }
422
+ }
423
+
424
+ if (!translate.isButtonDown() && !rightZoom.isButtonDown() &&
425
+ !controller._lastInertiaZoomMovement && !controller._lastInertiaTranslateMovement &&
426
+ !controller._animationCollection.contains(controller._animation)) {
427
+ var animation = controller._cameraController.createCorrectPositionAnimation(controller.bounceAnimationTime);
428
+ if (typeof animation !== 'undefined') {
429
+ controller._animation = controller._animationCollection.add(animation);
430
+ }
431
+ }
432
+
433
+ controller._animationCollection.update();
434
+
435
+ return true;
436
+ }
437
+
438
+ var translateCVStartRay = new Ray();
439
+ var translateCVEndRay = new Ray();
440
+ var translateCVStartPos = new Cartesian3();
441
+ var translateCVEndPos = new Cartesian3();
442
+ var translatCVDifference = new Cartesian3();
443
+ function translateCV(controller, movement) {
444
+ var cameraController = controller._cameraController;
445
+ var startRay = cameraController.getPickRay(movement.startPosition, translateCVStartRay);
446
+ var endRay = cameraController.getPickRay(movement.endPosition, translateCVEndRay);
447
+ var normal = Cartesian3.UNIT_X;
448
+
449
+ var position = startRay.origin;
450
+ var direction = startRay.direction;
451
+ var scalar = -normal.dot(position) / normal.dot(direction);
452
+ var startPlanePos = Cartesian3.multiplyByScalar(direction, scalar, translateCVStartPos);
453
+ Cartesian3.add(position, startPlanePos, startPlanePos);
454
+
455
+ position = endRay.origin;
456
+ direction = endRay.direction;
457
+ scalar = -normal.dot(position) / normal.dot(direction);
458
+ var endPlanePos = Cartesian3.multiplyByScalar(direction, scalar, translateCVEndPos);
459
+ Cartesian3.add(position, endPlanePos, endPlanePos);
460
+
461
+ var diff = Cartesian3.subtract(startPlanePos, endPlanePos, translatCVDifference);
462
+ var temp = diff.x;
463
+ diff.x = diff.y;
464
+ diff.y = diff.z;
465
+ diff.z = temp;
466
+ var mag = diff.magnitude();
467
+ if (mag > CesiumMath.EPSILON6) {
468
+ Cartesian3.normalize(diff, diff);
469
+ cameraController.move(diff, mag);
470
+ }
471
+ }
472
+
473
+ var rotateCVWindowPos = new Cartesian2();
474
+ var rotateCVWindowRay = new Ray();
475
+ var rotateCVCenter = new Cartesian3();
476
+ var rotateTransform = new Matrix4();
477
+ function rotateCV(controller, movement) {
478
+ var windowPosition = rotateCVWindowPos;
479
+ windowPosition.x = controller._canvas.clientWidth / 2;
480
+ windowPosition.y = controller._canvas.clientHeight / 2;
481
+ var ray = controller._cameraController.getPickRay(windowPosition, rotateCVWindowRay);
482
+ var normal = Cartesian3.UNIT_X;
483
+
484
+ var position = ray.origin;
485
+ var direction = ray.direction;
486
+ var scalar = -normal.dot(position) / normal.dot(direction);
487
+ var center = Cartesian3.multiplyByScalar(direction, scalar, rotateCVCenter);
488
+ Cartesian3.add(position, center, center);
489
+ var transform = Matrix4.fromTranslation(center, rotateTransform);
490
+
491
+ var oldEllipsoid = controller._ellipsoid;
492
+ controller.setEllipsoid(Ellipsoid.UNIT_SPHERE);
493
+
494
+ rotate3D(controller, movement, transform, Cartesian3.UNIT_Z);
495
+
496
+ controller.setEllipsoid(oldEllipsoid);
497
+ }
498
+
499
+ var zoomCVWindowPos = new Cartesian2();
500
+ var zoomCVWindowRay = new Ray();
501
+ function zoomCV(controller, movement) {
502
+ var windowPosition = zoomCVWindowPos;
503
+ windowPosition.x = controller._canvas.clientWidth / 2;
504
+ windowPosition.y = controller._canvas.clientHeight / 2;
505
+ var ray = controller._cameraController.getPickRay(windowPosition, zoomCVWindowRay);
506
+ var normal = Cartesian3.UNIT_X;
507
+
508
+ var position = ray.origin;
509
+ var direction = ray.direction;
510
+ var scalar = -normal.dot(position) / normal.dot(direction);
511
+
512
+ handleZoom(controller, movement, controller._zoomFactor, scalar);
513
+ }
514
+
515
+ function updateCV(controller) {
516
+ var zoom = controller._zoomHandler;
517
+ var zoomimg = zoom && zoom.isMoving();
518
+ var wheelZoom = controller._zoomWheelHandler;
519
+ var wheelZooming = wheelZoom.isMoving();
520
+ var pinch = controller._pinchHandler;
521
+ var pinching = pinch.isMoving();
522
+ var translate = controller._translateHandler;
523
+ var translating = translate.isMoving() && translate.getMovement();
524
+ var rotate = controller._rotateHandler;
525
+ var rotating = rotate.isMoving() && rotate.getMovement();
526
+ var spin = controller._spinHandler;
527
+ var spinning = spin.isMoving() && spin.getMovement();
528
+ var look = controller._lookHandler;
529
+ var looking = look && look.isMoving();
530
+
531
+ var buttonDown = rotate.isButtonDown() || spin.isButtonDown() || translate.isButtonDown() || zoom.isButtonDown() || looking || wheelZooming || pinching;
532
+
533
+ if (controller.columbusViewMode === CameraColumbusViewMode.LOCKED) {
534
+ if (controller.enableRotate) {
535
+ if (spinning) {
536
+ rotate3D(controller, spin.getMovement());
537
+ }
538
+
539
+ if (!buttonDown && controller.inertiaSpin >= 0.0 && controller.inertiaSpin < 1.0) {
540
+ maintainInertia(spin, controller.inertiaSpin, rotate3D, controller, '_lastInertiaSpinMovement');
541
+ }
542
+ }
543
+
544
+ if (controller.enableZoom) {
545
+ if (zoomimg) {
546
+ zoom3D(controller, zoom.getMovement());
547
+ } else if (wheelZooming) {
548
+ zoom3D(controller, wheelZoom.getMovement());
549
+ } else if (pinching) {
550
+ zoom3D(controller, pinch.getMovement().distance);
551
+ }
552
+
553
+ if (!buttonDown && controller.inertiaZoom >= 0.0 && controller.inertiaZoom < 1.0) {
554
+ maintainInertia(zoom, controller.inertiaZoom, zoom3D, controller, '_lastInertiaZoomMovement');
555
+ }
556
+
557
+ if (!buttonDown && controller.inertiaZoom >= 0.0 && controller.inertiaZoom < 1.0) {
558
+ maintainInertia(wheelZoom, controller.inertiaZoom, zoom3D, controller, '_lastInertiaWheelZoomMovement');
559
+ }
560
+
561
+ if (!buttonDown && controller.inertiaZoom >= 0.0 && controller.inertiaZoom < 1.0) {
562
+ maintainInertia(pinch, controller.inertiaZoom, zoom3D, controller, '_lastInertiaZoomMovement');
563
+ }
564
+ }
565
+ } else {
566
+ if (buttonDown) {
567
+ controller._animationCollection.removeAll();
568
+ }
569
+
570
+ if (controller.enableTilt) {
571
+ if (rotating) {
572
+ rotateCV(controller, rotate.getMovement());
573
+ }
574
+
575
+ if (pinching) {
576
+ rotateCV(controller, pinch.getMovement().angleAndHeight);
577
+ }
578
+
579
+ if (!buttonDown && controller.inertiaSpin >= 0.0 && controller.inertiaSpin < 1.0) {
580
+ maintainInertia(rotate, controller.inertiaSpin, rotateCV, controller, '_lastInertiaTiltMovement');
581
+ }
582
+
583
+ if (!buttonDown && controller.inertiaZoom >= 0.0 && controller.inertiaZoom < 1.0) {
584
+ maintainInertia(pinch, controller.inertiaZoom, zoomCV, controller, '_lastInertiaZoomMovement');
585
+ }
586
+ }
587
+
588
+ if (controller.enableTranslate) {
589
+ if (translating) {
590
+ translateCV(controller, translate.getMovement());
591
+ }
592
+
593
+ if (!buttonDown && controller.inertiaTranslate >= 0.0 && controller.inertiaTranslate < 1.0) {
594
+ maintainInertia(translate, controller.inertiaTranslate, translateCV, controller, '_lastInertiaTranslateMovement');
595
+ }
596
+ }
597
+
598
+ if (controller.enableZoom) {
599
+ if (zoomimg) {
600
+ zoomCV(controller, zoom.getMovement());
601
+ } else if (wheelZooming) {
602
+ zoomCV(controller, wheelZoom.getMovement());
603
+ } else if (pinching) {
604
+ zoomCV(controller, pinch.getMovement().distance);
605
+ }
606
+
607
+ if (!buttonDown && controller.inertiaZoom >= 0.0 && controller.inertiaZoom < 1.0) {
608
+ maintainInertia(zoom, controller.inertiaZoom, zoomCV, controller, '_lastInertiaZoomMovement');
609
+ }
610
+
611
+ if (!buttonDown && controller.inertiaZoom >= 0.0 && controller.inertiaZoom < 1.0) {
612
+ maintainInertia(wheelZoom, controller.inertiaZoom, zoomCV, controller, '_lastInertiaWheelZoomMovement');
613
+ }
614
+
615
+ if (!buttonDown && controller.inertiaZoom >= 0.0 && controller.inertiaZoom < 1.0) {
616
+ maintainInertia(pinch, controller.inertiaZoom, zoomCV, controller, '_lastInertiaZoomMovement');
617
+ }
618
+ }
619
+
620
+ if (controller.enableLook && looking) {
621
+ look3D(controller, look.getMovement());
622
+ }
623
+
624
+ if (!buttonDown && !controller._lastInertiaZoomMovement && !controller._lastInertiaTranslateMovement &&
625
+ !controller._animationCollection.contains(controller._animation)) {
626
+ var animation = controller._cameraController.createCorrectPositionAnimation(controller.bounceAnimationTime);
627
+ if (typeof animation !== 'undefined') {
628
+ controller._animation = controller._animationCollection.add(animation);
629
+ }
630
+ }
631
+
632
+ controller._animationCollection.update();
633
+ }
634
+
635
+ return true;
636
+ }
637
+
638
+ var spin3DPick = new Cartesian3();
639
+ function spin3D(controller, movement) {
640
+ if (typeof controller._cameraController.pickEllipsoid(movement.startPosition, controller._ellipsoid, spin3DPick) !== 'undefined') {
641
+ pan3D(controller, movement);
642
+ } else {
643
+ rotate3D(controller, movement);
644
+ }
645
+ }
646
+
647
+ var rotate3DRestrictedDirection = Cartesian4.ZERO.clone();
648
+ function rotate3D(controller, movement, transform, constrainedAxis, restrictedAngle) {
649
+ var cameraController = controller._cameraController;
650
+ var oldAxis = cameraController.constrainedAxis;
651
+ if (typeof constrainedAxis !== 'undefined') {
652
+ cameraController.constrainedAxis = constrainedAxis;
653
+ }
654
+
655
+ // CAMERA TODO: remove access to camera, fixes a problem in Columbus view
656
+ //var rho = cameraController.getMagnitude();
657
+ var rho = cameraController._camera.position.magnitude();
658
+ var rotateRate = controller._rotateFactor * (rho - controller._rotateRateRangeAdjustment);
659
+
660
+ if (rotateRate > controller._maximumRotateRate) {
661
+ rotateRate = controller._maximumRotateRate;
662
+ }
663
+
664
+ if (rotateRate < controller._minimumRotateRate) {
665
+ rotateRate = controller._minimumRotateRate;
666
+ }
667
+
668
+ var phiWindowRatio = (movement.startPosition.x - movement.endPosition.x) / controller._canvas.clientWidth;
669
+ var thetaWindowRatio = (movement.startPosition.y - movement.endPosition.y) / controller._canvas.clientHeight;
670
+ phiWindowRatio = Math.min(phiWindowRatio, controller.maximumMovementRatio);
671
+ thetaWindowRatio = Math.min(thetaWindowRatio, controller.maximumMovementRatio);
672
+
673
+ var deltaPhi = rotateRate * phiWindowRatio * Math.PI * 2.0;
674
+ var deltaTheta = rotateRate * thetaWindowRatio * Math.PI;
675
+
676
+ if (typeof cameraController.constrainedAxis !== 'undefined' && typeof transform === 'undefined') {
677
+ var camera = cameraController._camera;
678
+ var p = camera.position.normalize();
679
+ var northParallel = p.equalsEpsilon(cameraController.constrainedAxis, CesiumMath.EPSILON2);
680
+ var southParallel = p.equalsEpsilon(cameraController.constrainedAxis.negate(), CesiumMath.EPSILON2);
681
+
682
+ if (!northParallel && !southParallel) {
683
+ var up;
684
+ if (Cartesian3.dot(camera.position, camera.direction) + 1 < CesiumMath.EPSILON4) {
685
+ up = camera.up;
686
+ } else {
687
+ up = camera.direction;
688
+ }
689
+
690
+ var east;
691
+ if (Cartesian3.equalsEpsilon(cameraController.constrainedAxis, camera.position.normalize(), CesiumMath.EPSILON2)) {
692
+ east = camera.right;
693
+ } else {
694
+ east = Cartesian3.cross(cameraController.constrainedAxis, camera.position).normalize();
695
+ }
696
+
697
+ var rDotE = Cartesian3.dot(camera.right, east);
698
+ var signRDotE = (CesiumMath.sign(rDotE) < 0.0) ? -1.0 : 1.0;
699
+ rDotE = Math.abs(rDotE);
700
+ var uDotA = Cartesian3.dot(up, cameraController.constrainedAxis);
701
+ var uDotE = Cartesian3.dot(up, east);
702
+ var signInnerSum = ((uDotA > 0.0 && uDotE > 0.0) || (uDotA < 0.0 && uDotE < 0.0)) ? -1.0 : 1.0;
703
+ uDotA = Math.abs(uDotA);
704
+
705
+ var originalDeltaTheta = deltaTheta;
706
+ deltaTheta = signRDotE * (deltaTheta * uDotA - signInnerSum * deltaPhi * (1.0 - rDotE));
707
+ deltaPhi = signRDotE * (deltaPhi * rDotE + signInnerSum * originalDeltaTheta * (1.0 - uDotA));
708
+ }
709
+ }
710
+
711
+ cameraController.rotateRight(deltaPhi, transform);
712
+ cameraController.rotateUp(deltaTheta, transform);
713
+
714
+ if (typeof restrictedAngle !== 'undefined') {
715
+ var direction = Cartesian3.clone(cameraController._camera.getDirectionWC(), rotate3DRestrictedDirection);
716
+ var invTransform = transform.inverseTransformation();
717
+ Matrix4.multiplyByVector(invTransform, direction, direction);
718
+
719
+ var dot = -Cartesian3.dot(direction, constrainedAxis);
720
+ var angle = Math.acos(dot);
721
+ if (angle > restrictedAngle) {
722
+ angle -= restrictedAngle;
723
+ cameraController.rotateUp(-angle, transform);
724
+ }
725
+ }
726
+
727
+ cameraController.constrainedAxis = oldAxis;
728
+ }
729
+
730
+ var pan3DP0 = Cartesian4.UNIT_W.clone();
731
+ var pan3DP1 = Cartesian4.UNIT_W.clone();
732
+ var pan3DTemp0 = new Cartesian3();
733
+ var pan3DTemp1 = new Cartesian3();
734
+ var pan3DTemp2 = new Cartesian3();
735
+ var pan3DTemp3 = new Cartesian3();
736
+ function pan3D(controller, movement) {
737
+ var cameraController = controller._cameraController;
738
+ var p0 = cameraController.pickEllipsoid(movement.startPosition, controller._ellipsoid, pan3DP0);
739
+ var p1 = cameraController.pickEllipsoid(movement.endPosition, controller._ellipsoid, pan3DP1);
740
+
741
+ if (typeof p0 === 'undefined' || typeof p1 === 'undefined') {
742
+ return;
743
+ }
744
+
745
+ // CAMERA TODO: remove access to camera
746
+ p0 = cameraController._camera.worldToCameraCoordinates(p0, p0);
747
+ p1 = cameraController._camera.worldToCameraCoordinates(p1, p1);
748
+
749
+ if (typeof cameraController.constrainedAxis === 'undefined') {
750
+ Cartesian3.normalize(p0, p0);
751
+ Cartesian3.normalize(p1, p1);
752
+ var dot = Cartesian3.dot(p0, p1);
753
+ var axis = Cartesian3.cross(p0, p1, pan3DTemp0);
754
+
755
+ if (dot < 1.0 && !axis.equalsEpsilon(Cartesian3.ZERO, CesiumMath.EPSILON14)) { // dot is in [0, 1]
756
+ var angle = Math.acos(dot);
757
+ cameraController.rotate(axis, angle);
758
+ }
759
+ } else {
760
+ var basis0 = cameraController.constrainedAxis;
761
+ var basis1 = Cartesian3.mostOrthogonalAxis(basis0, pan3DTemp0);
762
+ Cartesian3.cross(basis1, basis0, basis1);
763
+ Cartesian3.normalize(basis1, basis1);
764
+ var basis2 = Cartesian3.cross(basis0, basis1, pan3DTemp1);
765
+
766
+ var startRho = Cartesian3.magnitude(p0);
767
+ var startDot = Cartesian3.dot(basis0, p0);
768
+ var startTheta = Math.acos(startDot / startRho);
769
+ var startRej = Cartesian3.multiplyByScalar(basis0, startDot, pan3DTemp2);
770
+ Cartesian3.subtract(p0, startRej, startRej);
771
+ Cartesian3.normalize(startRej, startRej);
772
+
773
+ var endRho = Cartesian3.magnitude(p1);
774
+ var endDot = Cartesian3.dot(basis0, p1);
775
+ var endTheta = Math.acos(endDot / endRho);
776
+ var endRej = Cartesian3.multiplyByScalar(basis0, endDot, pan3DTemp3);
777
+ Cartesian3.subtract(p1, endRej, endRej);
778
+ Cartesian3.normalize(endRej, endRej);
779
+
780
+ var startPhi = Math.acos(Cartesian3.dot(startRej, basis1));
781
+ if (Cartesian3.dot(startRej, basis2) < 0) {
782
+ startPhi = CesiumMath.TWO_PI - startPhi;
783
+ }
784
+
785
+ var endPhi = Math.acos(Cartesian3.dot(endRej, basis1));
786
+ if (Cartesian3.dot(endRej, basis2) < 0) {
787
+ endPhi = CesiumMath.TWO_PI - endPhi;
788
+ }
789
+
790
+ var deltaPhi = startPhi - endPhi;
791
+
792
+ var east;
793
+ if (Cartesian3.equalsEpsilon(basis0, cameraController._camera.position, CesiumMath.EPSILON2)) {
794
+ east = cameraController._camera.right;
795
+ } else {
796
+ east = Cartesian3.cross(basis0, cameraController._camera.position);
797
+ }
798
+
799
+ var planeNormal = Cartesian3.cross(basis0, east, pan3DTemp0);
800
+ var side0 = Cartesian3.dot(planeNormal, Cartesian3.subtract(p0, basis0, pan3DTemp1));
801
+ var side1 = Cartesian3.dot(planeNormal, Cartesian3.subtract(p1, basis0, pan3DTemp1));
802
+
803
+ var deltaTheta;
804
+ if (side0 > 0 && side1 > 0) {
805
+ deltaTheta = endTheta - startTheta;
806
+ } else if (side0 > 0 && side1 <= 0) {
807
+ if (Cartesian3.dot(cameraController._camera.position, basis0) > 0) {
808
+ deltaTheta = -startTheta - endTheta;
809
+ } else {
810
+ deltaTheta = startTheta + endTheta;
811
+ }
812
+ } else {
813
+ deltaTheta = startTheta - endTheta;
814
+ }
815
+
816
+ cameraController.rotateRight(deltaPhi);
817
+ cameraController.rotateUp(deltaTheta);
818
+ }
819
+ }
820
+
821
+ var zoom3DUnitPosition = new Cartesian3();
822
+ function zoom3D(controller, movement) {
823
+ // CAMERA TODO: remove access to camera
824
+ var camera = controller._cameraController._camera;
825
+ var ellipsoid = controller._ellipsoid;
826
+
827
+ var height = ellipsoid.cartesianToCartographic(camera.position).height;
828
+ var unitPosition = Cartesian3.normalize(camera.position, zoom3DUnitPosition);
829
+
830
+ handleZoom(controller, movement, controller._zoomFactor, height, Cartesian3.dot(unitPosition, camera.direction));
831
+ }
832
+
833
+ var tilt3DWindowPos = new Cartesian2();
834
+ var tilt3DRay = new Ray();
835
+ var tilt3DCart = new Cartographic();
836
+ var tilt3DCenter = Cartesian4.UNIT_W.clone();
837
+ var tilt3DTransform = new Matrix4();
838
+ function tilt3D(controller, movement) {
839
+ var cameraController = controller._cameraController;
840
+
841
+ var ellipsoid = controller._ellipsoid;
842
+ var minHeight = controller.minimumZoomDistance * 0.25;
843
+ var height = ellipsoid.cartesianToCartographic(controller._cameraController._camera.position).height;
844
+ if (height - minHeight - 1.0 < CesiumMath.EPSILON3 &&
845
+ movement.endPosition.y - movement.startPosition.y < 0) {
846
+ return;
847
+ }
848
+
849
+ var windowPosition = tilt3DWindowPos;
850
+ windowPosition.x = controller._canvas.clientWidth / 2;
851
+ windowPosition.y = controller._canvas.clientHeight / 2;
852
+ var ray = cameraController.getPickRay(windowPosition, tilt3DRay);
853
+
854
+ var center;
855
+ var intersection = IntersectionTests.rayEllipsoid(ray, ellipsoid);
856
+ if (typeof intersection !== 'undefined') {
857
+ center = ray.getPoint(intersection.start, tilt3DCenter);
858
+ } else {
859
+ var grazingAltitudeLocation = IntersectionTests.grazingAltitudeLocation(ray, ellipsoid);
860
+ if (typeof grazingAltitudeLocation === 'undefined') {
861
+ return;
862
+ }
863
+ var grazingAltitudeCart = ellipsoid.cartesianToCartographic(grazingAltitudeLocation, tilt3DCart);
864
+ grazingAltitudeCart.height = 0.0;
865
+ center = ellipsoid.cartographicToCartesian(grazingAltitudeCart, tilt3DCenter);
866
+ }
867
+
868
+ // CAMERA TODO: Remove the need for camera access
869
+ var camera = cameraController._camera;
870
+ center = camera.worldToCameraCoordinates(center, center);
871
+ var transform = Transforms.eastNorthUpToFixedFrame(center, ellipsoid, tilt3DTransform);
872
+
873
+ var oldEllipsoid = controller._ellipsoid;
874
+ controller.setEllipsoid(Ellipsoid.UNIT_SPHERE);
875
+
876
+ var angle = (minHeight * 0.25) / (Cartesian3.subtract(center, camera.position).magnitude());
877
+ rotate3D(controller, movement, transform, Cartesian3.UNIT_Z, CesiumMath.PI_OVER_TWO - angle);
878
+
879
+ controller.setEllipsoid(oldEllipsoid);
880
+ }
881
+
882
+ var look3DStartPos = new Cartesian2();
883
+ var look3DEndPos = new Cartesian2();
884
+ var look3DStartRay = new Ray();
885
+ var look3DEndRay = new Ray();
886
+ function look3D(controller, movement) {
887
+ var cameraController = controller._cameraController;
888
+
889
+ var startPos = look3DStartPos;
890
+ startPos.x = movement.startPosition.x;
891
+ startPos.y = 0.0;
892
+ var endPos = look3DEndPos;
893
+ endPos.x = movement.endPosition.x;
894
+ endPos.y = 0.0;
895
+ var start = cameraController.getPickRay(startPos, look3DStartRay).direction;
896
+ var end = cameraController.getPickRay(endPos, look3DEndRay).direction;
897
+
898
+ var angle = 0.0;
899
+ var dot = start.dot(end);
900
+ if (dot < 1.0) { // dot is in [0, 1]
901
+ angle = Math.acos(dot);
902
+ }
903
+ angle = (movement.startPosition.x > movement.endPosition.x) ? -angle : angle;
904
+ var rotationAxis = controller._horizontalRotationAxis;
905
+ if (typeof rotationAxis !== 'undefined') {
906
+ cameraController.look(rotationAxis, angle);
907
+ } else {
908
+ cameraController.lookLeft(angle);
909
+ }
910
+
911
+ startPos.x = 0.0;
912
+ startPos.y = movement.startPosition.y;
913
+ endPos.x = 0.0;
914
+ endPos.y = movement.endPosition.y;
915
+ start = cameraController.getPickRay(startPos, look3DStartRay).direction;
916
+ end = cameraController.getPickRay(endPos, look3DEndRay).direction;
917
+
918
+ angle = 0.0;
919
+ dot = start.dot(end);
920
+ if (dot < 1.0) { // dot is in [0, 1]
921
+ angle = Math.acos(dot);
922
+ }
923
+ angle = (movement.startPosition.y > movement.endPosition.y) ? -angle : angle;
924
+ cameraController.lookUp(angle);
925
+ }
926
+
927
+ function update3D(controller) {
928
+ var spin = controller._spinHandler;
929
+ var rightZoom = controller._zoomHandler;
930
+ var wheelZoom = controller._zoomWheelHandler;
931
+ var pinch = controller._pinchHandler;
932
+ var spinning = spin && spin.isMoving();
933
+ var rightZooming = rightZoom && rightZoom.isMoving();
934
+ var wheelZooming = wheelZoom && wheelZoom.isMoving();
935
+ var pinching = pinch && pinch.isMoving();
936
+ var rotate = controller._rotateHandler;
937
+ var rotating = rotate.isMoving() && rotate.getMovement();
938
+ var look = controller._lookHandler;
939
+ var looking = look.isMoving() && look.getMovement();
940
+
941
+ var buttonDown = spin.isButtonDown() || rightZoom.isButtonDown() || rotate.isButtonDown() || looking || wheelZooming || pinching;
942
+
943
+ if (controller.enableRotate) {
944
+ if (spinning) {
945
+ spin3D(controller, spin.getMovement());
946
+ }
947
+
948
+ if (!buttonDown && controller.inertiaSpin >= 0.0 && controller.inertiaSpin < 1.0) {
949
+ maintainInertia(spin, controller.inertiaSpin, spin3D, controller, '_lastInertiaSpinMovement');
950
+ }
951
+
952
+ }
953
+
954
+ if (controller.enableTilt) {
955
+ if (rotating) {
956
+ tilt3D(controller, rotate.getMovement());
957
+ }
958
+ if (pinching) {
959
+ tilt3D(controller, pinch.getMovement().angleAndHeight);
960
+ }
961
+
962
+ if (!buttonDown && controller.inertiaSpin >= 0.0 && controller.inertiaSpin < 1.0) {
963
+ maintainInertia(rotate, controller.inertiaSpin, tilt3D, controller, '_lastInertiaTiltMovement');
964
+ }
965
+
966
+ if (!buttonDown && controller.inertiaSpin >= 0.0 && controller.inertiaSpin < 1.0) {
967
+ maintainInertia(pinch, controller.inertiaSpin, tilt3D, controller, '_lastInertiaTiltMovement');
968
+ }
969
+ }
970
+
971
+ if (controller.enableZoom) {
972
+ if (rightZooming) {
973
+ zoom3D(controller, rightZoom.getMovement());
974
+ } else if (wheelZooming) {
975
+ zoom3D(controller, wheelZoom.getMovement());
976
+ } else if (pinching) {
977
+ zoom3D(controller, pinch.getMovement().distance);
978
+ }
979
+
980
+ if (!buttonDown && controller.inertiaZoom >= 0.0 && controller.inertiaZoom < 1.0) {
981
+ maintainInertia(rightZoom, controller.inertiaZoom, zoom3D, controller, '_lastInertiaZoomMovement');
982
+ }
983
+
984
+ if (!buttonDown && controller.inertiaZoom >= 0.0 && controller.inertiaZoom < 1.0) {
985
+ maintainInertia(wheelZoom, controller.inertiaZoom, zoom3D, controller, '_lastInertiaWheelZoomMovement');
986
+ }
987
+
988
+ if (!buttonDown && controller.inertiaZoom >= 0.0 && controller.inertiaZoom < 1.0) {
989
+ maintainInertia(pinch, controller.inertiaZoom, zoom3D, controller, '_lastInertiaZoomMovement');
990
+ }
991
+ }
992
+
993
+ if (controller.enableLook) {
994
+ if (looking) {
995
+ look3D(controller, look.getMovement());
996
+ }
997
+ }
998
+
999
+ return true;
1000
+ }
1001
+
1002
+ /**
1003
+ * @private
1004
+ */
1005
+ ScreenSpaceCameraController.prototype.update = function(mode) {
1006
+ if (mode === SceneMode.SCENE2D) {
1007
+ update2D(this);
1008
+ } else if (mode === SceneMode.COLUMBUS_VIEW) {
1009
+ this._horizontalRotationAxis = Cartesian3.UNIT_Z;
1010
+ updateCV(this);
1011
+ } else if (mode === SceneMode.SCENE3D) {
1012
+ this._horizontalRotationAxis = undefined;
1013
+ update3D(this);
1014
+ }
1015
+ };
1016
+
1017
+ /**
1018
+ * Returns true if this object was destroyed; otherwise, false.
1019
+ * <br /><br />
1020
+ * If this object was destroyed, it should not be used; calling any function other than
1021
+ * <code>isDestroyed</code> will result in a {@link DeveloperError} exception.
1022
+ *
1023
+ * @memberof ScreenSpaceCameraController
1024
+ *
1025
+ * @return {Boolean} <code>true</code> if this object was destroyed; otherwise, <code>false</code>.
1026
+ *
1027
+ * @see ScreenSpaceCameraController#destroy
1028
+ */
1029
+ ScreenSpaceCameraController.prototype.isDestroyed = function() {
1030
+ return false;
1031
+ };
1032
+
1033
+ /**
1034
+ * Removes mouse listeners held by this object.
1035
+ * <br /><br />
1036
+ * Once an object is destroyed, it should not be used; calling any function other than
1037
+ * <code>isDestroyed</code> will result in a {@link DeveloperError} exception. Therefore,
1038
+ * assign the return value (<code>undefined</code>) to the object as done in the example.
1039
+ *
1040
+ * @memberof ScreenSpaceCameraController
1041
+ *
1042
+ * @return {undefined}
1043
+ *
1044
+ * @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
1045
+ *
1046
+ * @see ScreenSpaceCameraController#isDestroyed
1047
+ *
1048
+ * @example
1049
+ * controller = controller && controller.destroy();
1050
+ */
1051
+ ScreenSpaceCameraController.prototype.destroy = function() {
1052
+ this._spinHandler = this._spinHandler && this._spinHandler.destroy();
1053
+ this._translateHandler = this._translateHandler && this._translateHandler.destroy();
1054
+ this._lookHandler = this._lookHandler && this._lookHandler.destroy();
1055
+ this._rotateHandler = this._rotateHandler && this._rotateHandler.destroy();
1056
+ this._zoomHandler = this._zoomHandler && this._zoomHandler.destroy();
1057
+ this._zoomWheelHandler = this._zoomWheelHandler && this._zoomWheelHandler.destroy();
1058
+ this._pinchHandler = this._pinchHandler && this._pinchHandler.destroy();
1059
+ return destroyObject(this);
1060
+ };
1061
+
1062
+ return ScreenSpaceCameraController;
1063
+ });