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