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,93 @@
1
+ /*global define*/
2
+ define([
3
+ '../Core/DeveloperError',
4
+ '../Core/Enumeration'
5
+ ], function(
6
+ DeveloperError,
7
+ Enumeration) {
8
+ "use strict";
9
+
10
+ /**
11
+ * DOC_TBA
12
+ *
13
+ * @exports Projections
14
+ */
15
+ var Projections = {
16
+ WGS84 : new Enumeration(0, 'WGS84', {
17
+ toWgs84 : function(extent, image) {
18
+ return image;
19
+ }
20
+ }),
21
+ MERCATOR : new Enumeration(1, 'MERCATOR', {
22
+ toWgs84 : function(extent, image) {
23
+ if (!extent || typeof extent.north === 'undefined' || typeof extent.south === 'undefined') {
24
+ throw new DeveloperError('extent, extent.north and extent.south are required.');
25
+ }
26
+
27
+ if (!image) {
28
+ throw new DeveloperError('image is required.');
29
+ }
30
+
31
+ var width = parseInt(image.width, 10);
32
+ var height = parseInt(image.height, 10);
33
+ var wRowBytes = width * 4; // Always 4 bytes per pixel.
34
+
35
+ // draw image to canvas and get the pixels
36
+ var canvas = document.createElement('canvas');
37
+ canvas.width = width;
38
+ canvas.height = height;
39
+ var context = canvas.getContext('2d');
40
+ context.drawImage(image, 0, 0);
41
+ var fromPixels = context.getImageData(0, 0, width, height).data;
42
+
43
+ // create array of pixels
44
+ var newImageData = context.createImageData(width, height);
45
+ var toPixels = newImageData.data;
46
+
47
+ // WGS84 parameters
48
+ var deltaWLat = (extent.north - extent.south) / height;
49
+ var currentWLat = extent.north - (0.5 * deltaWLat);
50
+
51
+ // mercator parameters
52
+ var sinTheta = Math.sin(extent.south);
53
+ var minMLat = 0.5 * Math.log((1 + sinTheta) / (1 - sinTheta));
54
+ sinTheta = Math.sin(extent.north);
55
+ var maxMLat = 0.5 * Math.log((1 + sinTheta) / (1 - sinTheta));
56
+ var invMLatDim = 1.0 / (maxMLat - minMLat);
57
+
58
+ // first row
59
+ var heightMinusOne = height - 1;
60
+ var i = 0;
61
+ for (; i < wRowBytes; ++i) {
62
+ toPixels[i] = fromPixels[i];
63
+ }
64
+
65
+ // interior rows
66
+ var end, mLat, mRow;
67
+ var j = 1;
68
+ for (; j < heightMinusOne; ++j, currentWLat -= deltaWLat) {
69
+ sinTheta = Math.sin(currentWLat);
70
+ mLat = 0.5 * Math.log((1.0 + sinTheta) / (1.0 - sinTheta));
71
+ mRow = Math.floor(heightMinusOne - ((heightMinusOne * (mLat - minMLat) * invMLatDim)));
72
+ end = i + wRowBytes;
73
+ for ( var k = 0; i < end; ++i, ++k) {
74
+ toPixels[i] = fromPixels[mRow * wRowBytes + k];
75
+ }
76
+ }
77
+
78
+ // last row
79
+ end = i + wRowBytes;
80
+ for (j = 0; i < end; ++i, ++j) {
81
+ toPixels[i] = fromPixels[i];
82
+ }
83
+
84
+ // paint new image to canvas
85
+ context.putImageData(newImageData, 0, 0);
86
+
87
+ return canvas;
88
+ }
89
+ })
90
+ };
91
+
92
+ return Projections;
93
+ });
@@ -0,0 +1,224 @@
1
+ /*global define*/
2
+ define([
3
+ '../Core/DeveloperError',
4
+ '../Core/Color',
5
+ '../Core/destroyObject',
6
+ '../Core/Math',
7
+ '../Core/Matrix4',
8
+ '../Renderer/BufferUsage',
9
+ './Material',
10
+ './CustomSensorVolume'
11
+ ], function(
12
+ DeveloperError,
13
+ Color,
14
+ destroyObject,
15
+ CesiumMath,
16
+ Matrix4,
17
+ BufferUsage,
18
+ Material,
19
+ CustomSensorVolume) {
20
+ "use strict";
21
+
22
+ /**
23
+ * DOC_TBA
24
+ *
25
+ * @alias RectangularPyramidSensorVolume
26
+ * @constructor
27
+ *
28
+ * @see SensorVolumeCollection#addRectangularPyramid
29
+ */
30
+ var RectangularPyramidSensorVolume = function(template) {
31
+ var t = template || {};
32
+
33
+ /**
34
+ * <code>true</code> if this sensor will be shown; otherwise, <code>false</code>
35
+ *
36
+ * @type Boolean
37
+ */
38
+ this.show = (typeof t.show === 'undefined') ? true : t.show;
39
+
40
+ /**
41
+ * When <code>true</code>, a polyline is shown where the sensor outline intersections the central body. The default is <code>true</code>.
42
+ *
43
+ * @type Boolean
44
+ *
45
+ * @see RectangularPyramidSensorVolume#intersectionColor
46
+ */
47
+ this.showIntersection = (typeof t.showIntersection === 'undefined') ? true : t.showIntersection;
48
+
49
+ /**
50
+ * <p>
51
+ * Determines if a sensor intersecting the ellipsoid is drawn through the ellipsoid and potentially out
52
+ * to the other side, or if the part of the sensor intersecting the ellipsoid stops at the ellipsoid.
53
+ * </p>
54
+ * <p>
55
+ * The default is <code>false</code>, meaning the sensor will not go through the ellipsoid.
56
+ * </p>
57
+ *
58
+ * @type Boolean
59
+ */
60
+ this.showThroughEllipsoid = (typeof t.showThroughEllipsoid === 'undefined') ? false : t.showThroughEllipsoid;
61
+
62
+ /**
63
+ * The 4x4 transformation matrix that transforms this sensor from model to world coordinates. In it's model
64
+ * coordinates, the sensor's principal direction is along the positive z-axis. Half angles measured from the
65
+ * principal direction and in the direction of the x-axis and y-axis define the extent of the rectangular
66
+ * cross section. This matrix is available to GLSL vertex and fragment shaders via
67
+ * {@link czm_model} and derived uniforms.
68
+ * <br /><br />
69
+ * <div align='center'>
70
+ * <img src='images/RectangularPyramidSensorVolume.setModelMatrix.png' /><br />
71
+ * Model coordinate system for a sensor
72
+ * </div>
73
+ *
74
+ * @type Matrix4
75
+ *
76
+ * @see czm_model
77
+ *
78
+ * @example
79
+ * // The sensor's vertex is located on the surface at -75.59777 degrees longitude and 40.03883 degrees latitude.
80
+ * // The sensor's opens upward, along the surface normal.
81
+ * var center = ellipsoid.cartographicToCartesian(Cartographic.fromDegrees(-75.59777, 40.03883));
82
+ * sensor.modelMatrix = Transforms.eastNorthUpToFixedFrame(center);
83
+ */
84
+ this.modelMatrix = t.modelMatrix || Matrix4.IDENTITY.clone();
85
+
86
+ /**
87
+ * DOC_TBA
88
+ *
89
+ * @type BufferUsage
90
+ */
91
+ this.bufferUsage = t.bufferUsage || BufferUsage.STATIC_DRAW;
92
+
93
+ /**
94
+ * DOC_TBA
95
+ *
96
+ * @type Number
97
+ */
98
+ this.radius = (typeof t.radius === 'undefined') ? Number.POSITIVE_INFINITY : t.radius;
99
+
100
+ /**
101
+ * DOC_TBA
102
+ *
103
+ * @type Number
104
+ *
105
+ * @see RectangularPyramidSensorVolume#yHalfAngle
106
+ */
107
+ this.xHalfAngle = (typeof t.xHalfAngle === 'undefined') ? CesiumMath.PI_OVER_TWO : t.xHalfAngle;
108
+ this._xHalfAngle = undefined;
109
+
110
+ /**
111
+ * DOC_TBA
112
+ *
113
+ * @type Number
114
+ *
115
+ * @see RectangularPyramidSensorVolume#xHalfAngle
116
+ */
117
+ this.yHalfAngle = (typeof t.yHalfAngle === 'undefined') ? CesiumMath.PI_OVER_TWO : t.yHalfAngle;
118
+ this._yHalfAngle = undefined;
119
+
120
+ /**
121
+ * The surface appearance of the sensor. This can be one of several built-in {@link Material} objects or a custom material, scripted with
122
+ * <a href='https://github.com/AnalyticalGraphicsInc/cesium/wiki/Fabric'>Fabric</a>.
123
+ * <p>
124
+ * The default material is <code>Material.ColorType</code>.
125
+ * </p>
126
+ *
127
+ * @type Material
128
+ *
129
+ * @example
130
+ * // 1. Change the color of the default material to yellow
131
+ * sensor.material.uniforms.color = new Color(1.0, 1.0, 0.0, 1.0);
132
+ *
133
+ * // 2. Change material to horizontal stripes
134
+ * sensor.material = Material.fromType(scene.getContext(), Material.StripeType);
135
+ *
136
+ * @see <a href='https://github.com/AnalyticalGraphicsInc/cesium/wiki/Fabric'>Fabric</a>
137
+ */
138
+ this.material = (typeof t.material !== 'undefined') ? t.material : Material.fromType(undefined, Material.ColorType);
139
+
140
+ /**
141
+ * The color of the polyline where the sensor outline intersects the central body. The default is {@link Color.WHITE}.
142
+ *
143
+ * @type Color
144
+ *
145
+ * @see RectangularPyramidSensorVolume#showIntersection
146
+ */
147
+ this.intersectionColor = (typeof t.intersectionColor !== 'undefined') ? Color.clone(t.intersectionColor) : Color.clone(Color.WHITE);
148
+
149
+ t._pickIdThis = t._pickIdThis || this;
150
+ this._customSensor = new CustomSensorVolume(t);
151
+ };
152
+
153
+ /**
154
+ * DOC_TBA
155
+ *
156
+ * @memberof RectangularPyramidSensorVolume
157
+ *
158
+ * @exception {DeveloperError} this.xHalfAngle and this.yHalfAngle must each be less than 90 degrees.
159
+ * @exception {DeveloperError} this.radius must be greater than or equal to zero.
160
+ */
161
+ RectangularPyramidSensorVolume.prototype.update = function(context, frameState, commandList) {
162
+ if ((this.xHalfAngle > CesiumMath.PI_OVER_TWO) || (this.yHalfAngle > CesiumMath.PI_OVER_TWO)) {
163
+ throw new DeveloperError('this.xHalfAngle and this.yHalfAngle must each be less than or equal to 90 degrees.');
164
+ }
165
+
166
+ var s = this._customSensor;
167
+
168
+ s.show = this.show;
169
+ s.showIntersection = this.showIntersection;
170
+ s.showThroughEllipsoid = this.showThroughEllipsoid;
171
+ s.modelMatrix = this.modelMatrix;
172
+ s.bufferUsage = this.bufferUsage;
173
+ s.radius = this.radius;
174
+ s.material = this.material;
175
+ s.intersectionColor = this.intersectionColor;
176
+
177
+ if ((this._xHalfAngle !== this.xHalfAngle) || (this._yHalfAngle !== this.yHalfAngle)) {
178
+
179
+ this._xHalfAngle = this.xHalfAngle;
180
+ this._yHalfAngle = this.yHalfAngle;
181
+
182
+ // At 90 degrees the sensor is completely open, and tan() goes to infinity.
183
+ var tanX = Math.tan(Math.min(this.xHalfAngle, CesiumMath.toRadians(89.0)));
184
+ var tanY = Math.tan(Math.min(this.yHalfAngle, CesiumMath.toRadians(89.0)));
185
+ var theta = Math.atan(tanX / tanY);
186
+ var cone = Math.atan(Math.sqrt(tanX * tanX + tanY * tanY));
187
+
188
+ s.setDirections([{
189
+ clock : theta,
190
+ cone : cone
191
+ }, {
192
+ clock : CesiumMath.toRadians(180.0) - theta,
193
+ cone : cone
194
+ }, {
195
+ clock : CesiumMath.toRadians(180.0) + theta,
196
+ cone : cone
197
+ }, {
198
+ clock : -theta,
199
+ cone : cone
200
+ }]);
201
+ }
202
+
203
+ s.update(context, frameState, commandList);
204
+ };
205
+
206
+ /**
207
+ * DOC_TBA
208
+ * @memberof RectangularPyramidSensorVolume
209
+ */
210
+ RectangularPyramidSensorVolume.prototype.isDestroyed = function() {
211
+ return false;
212
+ };
213
+
214
+ /**
215
+ * DOC_TBA
216
+ * @memberof RectangularPyramidSensorVolume
217
+ */
218
+ RectangularPyramidSensorVolume.prototype.destroy = function() {
219
+ this._customSensor = this._customSensor && this._customSensor.destroy();
220
+ return destroyObject(this);
221
+ };
222
+
223
+ return RectangularPyramidSensorVolume;
224
+ });
@@ -0,0 +1,632 @@
1
+ /*global define*/
2
+ define([
3
+ '../Core/Math',
4
+ '../Core/Color',
5
+ '../Core/defaultValue',
6
+ '../Core/destroyObject',
7
+ '../Core/GeographicProjection',
8
+ '../Core/Ellipsoid',
9
+ '../Core/DeveloperError',
10
+ '../Core/Occluder',
11
+ '../Core/BoundingRectangle',
12
+ '../Core/BoundingSphere',
13
+ '../Core/Cartesian2',
14
+ '../Core/Cartesian3',
15
+ '../Core/Cartesian4',
16
+ '../Core/Intersect',
17
+ '../Core/IntersectionTests',
18
+ '../Core/Interval',
19
+ '../Core/Matrix4',
20
+ '../Core/JulianDate',
21
+ '../Renderer/Context',
22
+ '../Renderer/ClearCommand',
23
+ './Camera',
24
+ './ScreenSpaceCameraController',
25
+ './CompositePrimitive',
26
+ './CullingVolume',
27
+ './AnimationCollection',
28
+ './SceneMode',
29
+ './FrameState',
30
+ './OrthographicFrustum',
31
+ './PerspectiveOffCenterFrustum',
32
+ './FrustumCommands'
33
+ ], function(
34
+ CesiumMath,
35
+ Color,
36
+ defaultValue,
37
+ destroyObject,
38
+ GeographicProjection,
39
+ Ellipsoid,
40
+ DeveloperError,
41
+ Occluder,
42
+ BoundingRectangle,
43
+ BoundingSphere,
44
+ Cartesian2,
45
+ Cartesian3,
46
+ Cartesian4,
47
+ Intersect,
48
+ IntersectionTests,
49
+ Interval,
50
+ Matrix4,
51
+ JulianDate,
52
+ Context,
53
+ ClearCommand,
54
+ Camera,
55
+ ScreenSpaceCameraController,
56
+ CompositePrimitive,
57
+ CullingVolume,
58
+ AnimationCollection,
59
+ SceneMode,
60
+ FrameState,
61
+ OrthographicFrustum,
62
+ PerspectiveOffCenterFrustum,
63
+ FrustumCommands) {
64
+ "use strict";
65
+
66
+ /**
67
+ * DOC_TBA
68
+ *
69
+ * @alias Scene
70
+ * @constructor
71
+ */
72
+ var Scene = function(canvas) {
73
+ var context = new Context(canvas);
74
+
75
+ this._frameState = new FrameState();
76
+ this._canvas = canvas;
77
+ this._context = context;
78
+ this._primitives = new CompositePrimitive();
79
+ this._pickFramebuffer = undefined;
80
+ this._camera = new Camera(canvas);
81
+ this._screenSpaceCameraController = new ScreenSpaceCameraController(canvas, this._camera.controller);
82
+
83
+ this._animations = new AnimationCollection();
84
+
85
+ this._shaderFrameCount = 0;
86
+
87
+ this._commandList = [];
88
+ this._frustumCommandsList = [];
89
+
90
+ this._clearColorCommand = new ClearCommand();
91
+ this._clearColorCommand.clearState = context.createClearState({
92
+ color : new Color()
93
+ });
94
+ this._clearDepthStencilCommand = new ClearCommand();
95
+ this._clearDepthStencilCommand.clearState = context.createClearState({
96
+ depth : 1.0,
97
+ stencil : 0.0
98
+ });
99
+
100
+ /**
101
+ * The {@link SkyBox} used to draw the stars.
102
+ *
103
+ * @type SkyBox
104
+ *
105
+ * @default undefined
106
+ *
107
+ * @see Scene#backgroundColor
108
+ */
109
+ this.skyBox = undefined;
110
+
111
+ /**
112
+ * The sky atmosphere drawn around the globe.
113
+ *
114
+ * @type SkyAtmosphere
115
+ *
116
+ * @default undefined
117
+ */
118
+ this.skyAtmosphere = undefined;
119
+
120
+ /**
121
+ * The background color, which is only visible if there is no sky box, i.e., {@link Scene#skyBox} is undefined.
122
+ *
123
+ * @type Color
124
+ *
125
+ * @default Color.BLACK
126
+ *
127
+ * @see Scene#skyBox
128
+ */
129
+ this.backgroundColor = Color.BLACK.clone();
130
+
131
+ /**
132
+ * The current mode of the scene.
133
+ *
134
+ * @type SceneMode
135
+ */
136
+ this.mode = SceneMode.SCENE3D;
137
+ /**
138
+ * DOC_TBA
139
+ */
140
+ this.scene2D = {
141
+ /**
142
+ * The projection to use in 2D mode.
143
+ */
144
+ projection : new GeographicProjection(Ellipsoid.WGS84)
145
+ };
146
+ /**
147
+ * The current morph transition time between 2D/Columbus View and 3D,
148
+ * with 0.0 being 2D or Columbus View and 1.0 being 3D.
149
+ *
150
+ * @type Number
151
+ */
152
+ this.morphTime = 1.0;
153
+ /**
154
+ * The far-to-near ratio of the multi-frustum. The default is 1,000.0.
155
+ *
156
+ * @type Number
157
+ */
158
+ this.farToNearRatio = 1000.0;
159
+
160
+ // initial guess at frustums.
161
+ var near = this._camera.frustum.near;
162
+ var far = this._camera.frustum.far;
163
+ var numFrustums = Math.ceil(Math.log(far / near) / Math.log(this.farToNearRatio));
164
+ updateFrustums(near, far, this.farToNearRatio, numFrustums, this._frustumCommandsList);
165
+ };
166
+
167
+ /**
168
+ * DOC_TBA
169
+ * @memberof Scene
170
+ */
171
+ Scene.prototype.getCanvas = function() {
172
+ return this._canvas;
173
+ };
174
+
175
+ /**
176
+ * DOC_TBA
177
+ * @memberof Scene
178
+ */
179
+ Scene.prototype.getContext = function() {
180
+ return this._context;
181
+ };
182
+
183
+ /**
184
+ * DOC_TBA
185
+ * @memberof Scene
186
+ */
187
+ Scene.prototype.getPrimitives = function() {
188
+ return this._primitives;
189
+ };
190
+
191
+ /**
192
+ * DOC_TBA
193
+ * @memberof Scene
194
+ */
195
+ Scene.prototype.getCamera = function() {
196
+ return this._camera;
197
+ };
198
+ // TODO: setCamera
199
+
200
+ /**
201
+ * DOC_TBA
202
+ * @memberof Scene
203
+ */
204
+ Scene.prototype.getScreenSpaceCameraController = function() {
205
+ return this._screenSpaceCameraController;
206
+ };
207
+
208
+ /**
209
+ * DOC_TBA
210
+ * @memberof Scene
211
+ */
212
+ Scene.prototype.getUniformState = function() {
213
+ return this._context.getUniformState();
214
+ };
215
+
216
+ /**
217
+ * Gets state information about the current scene. If called outside of a primitive's <code>update</code>
218
+ * function, the previous frame's state is returned.
219
+ *
220
+ * @memberof Scene
221
+ */
222
+ Scene.prototype.getFrameState = function() {
223
+ return this._frameState;
224
+ };
225
+
226
+ /**
227
+ * DOC_TBA
228
+ * @memberof Scene
229
+ */
230
+ Scene.prototype.getAnimations = function() {
231
+ return this._animations;
232
+ };
233
+
234
+ /**
235
+ * DOC_TBA
236
+ * @memberof Scene
237
+ */
238
+ function clearPasses(passes) {
239
+ passes.color = false;
240
+ passes.pick = false;
241
+ passes.overlay = false;
242
+ }
243
+
244
+ function updateFrameState(scene, frameNumber, time) {
245
+ var camera = scene._camera;
246
+
247
+ var frameState = scene._frameState;
248
+ frameState.mode = scene.mode;
249
+ frameState.morphTime = scene.morphTime;
250
+ frameState.scene2D = scene.scene2D;
251
+ frameState.frameNumber = frameNumber;
252
+ frameState.time = time;
253
+ frameState.camera = camera;
254
+ frameState.cullingVolume = camera.frustum.computeCullingVolume(camera.getPositionWC(), camera.getDirectionWC(), camera.getUpWC());
255
+ frameState.occluder = undefined;
256
+
257
+ // TODO: The occluder is the top-level central body. When we add
258
+ // support for multiple central bodies, this should be the closest one.
259
+ var cb = scene._primitives.getCentralBody();
260
+ if (scene.mode === SceneMode.SCENE3D && typeof cb !== 'undefined') {
261
+ var ellipsoid = cb.getEllipsoid();
262
+ var occluder = new Occluder(new BoundingSphere(Cartesian3.ZERO, ellipsoid.getMinimumRadius()), camera.getPositionWC());
263
+ frameState.occluder = occluder;
264
+ }
265
+
266
+ clearPasses(frameState.passes);
267
+ }
268
+
269
+ function updateFrustums(near, far, farToNearRatio, numFrustums, frustumCommandsList) {
270
+ frustumCommandsList.length = numFrustums;
271
+ for (var m = 0; m < numFrustums; ++m) {
272
+ var curNear = Math.max(near, Math.pow(farToNearRatio, m) * near);
273
+ var curFar = Math.min(far, farToNearRatio * curNear);
274
+ curNear *= 0.99;
275
+
276
+ var frustumCommands = frustumCommandsList[m];
277
+ if (typeof frustumCommands === 'undefined') {
278
+ frustumCommands = frustumCommandsList[m] = new FrustumCommands(curNear, curFar);
279
+ } else {
280
+ frustumCommands.near = curNear;
281
+ frustumCommands.far = curFar;
282
+ }
283
+ }
284
+ }
285
+
286
+ function insertIntoBin(scene, command, distance) {
287
+ var frustumCommandsList = scene._frustumCommandsList;
288
+ var length = frustumCommandsList.length;
289
+ for (var i = 0; i < length; ++i) {
290
+ var frustumCommands = frustumCommandsList[i];
291
+ var curNear = frustumCommands.near;
292
+ var curFar = frustumCommands.far;
293
+
294
+ if (typeof distance !== 'undefined') {
295
+ if (distance.start > curFar) {
296
+ continue;
297
+ }
298
+
299
+ if (distance.stop < curNear) {
300
+ break;
301
+ }
302
+ }
303
+
304
+ // PERFORMANCE_IDEA: sort bins
305
+ frustumCommands.commands.push(command);
306
+
307
+ if (command.executeInClosestFrustum) {
308
+ break;
309
+ }
310
+ }
311
+ }
312
+
313
+ var scratchCullingVolume = new CullingVolume();
314
+ var distances = new Interval();
315
+ function createPotentiallyVisibleSet(scene, listName) {
316
+ var commandLists = scene._commandList;
317
+ var cullingVolume = scene._frameState.cullingVolume;
318
+ var camera = scene._camera;
319
+
320
+ var direction = camera.getDirectionWC();
321
+ var position = camera.getPositionWC();
322
+
323
+ var frustumCommandsList = scene._frustumCommandsList;
324
+ var frustumsLength = frustumCommandsList.length;
325
+ for (var n = 0; n < frustumsLength; ++n) {
326
+ frustumCommandsList[n].commands.length = 0;
327
+ }
328
+
329
+ var near = Number.MAX_VALUE;
330
+ var far = Number.MIN_VALUE;
331
+ var undefBV = false;
332
+
333
+ var occluder;
334
+ if (scene._frameState.mode === SceneMode.SCENE3D) {
335
+ occluder = scene._frameState.occluder;
336
+ }
337
+
338
+ // get user culling volume minus the far plane.
339
+ var planes = scratchCullingVolume.planes;
340
+ for (var k = 0; k < 5; ++k) {
341
+ planes[k] = cullingVolume.planes[k];
342
+ }
343
+ cullingVolume = scratchCullingVolume;
344
+
345
+ var length = commandLists.length;
346
+ for (var i = 0; i < length; ++i) {
347
+ var commandList = commandLists[i][listName];
348
+ var commandListLength = commandList.length;
349
+ for (var j = 0; j < commandListLength; ++j) {
350
+ var command = commandList[j];
351
+ var boundingVolume = command.boundingVolume;
352
+ if (typeof boundingVolume !== 'undefined') {
353
+ var modelMatrix = defaultValue(command.modelMatrix, Matrix4.IDENTITY);
354
+ var transformedBV = boundingVolume.transform(modelMatrix); //TODO: Remove this allocation.
355
+ if (cullingVolume.getVisibility(transformedBV) === Intersect.OUTSIDE ||
356
+ (typeof occluder !== 'undefined' && !occluder.isBoundingSphereVisible(transformedBV))) {
357
+ continue;
358
+ }
359
+
360
+ distances = transformedBV.getPlaneDistances(position, direction, distances);
361
+ near = Math.min(near, distances.start);
362
+ far = Math.max(far, distances.stop);
363
+
364
+ insertIntoBin(scene, command, distances);
365
+ } else {
366
+ // Clear commands don't need a bounding volume - just add the clear to all frustums.
367
+ // If another command has no bounding volume, though, we need to use the camera's
368
+ // worst-case near and far planes to avoid clipping something important.
369
+ undefBV = !(command instanceof ClearCommand);
370
+ insertIntoBin(scene, command);
371
+ }
372
+ }
373
+ }
374
+
375
+ if (undefBV) {
376
+ near = camera.frustum.near;
377
+ far = camera.frustum.far;
378
+ } else {
379
+ // The computed near plane must be between the user defined near and far planes.
380
+ // The computed far plane must between the user defined far and computed near.
381
+ // This will handle the case where the computed near plane is further than the user defined far plane.
382
+ near = Math.min(Math.max(near, camera.frustum.near), camera.frustum.far);
383
+ far = Math.max(Math.min(far, camera.frustum.far), near);
384
+ }
385
+
386
+ // Exploit temporal coherence. If the frustums haven't changed much, use the frustums computed
387
+ // last frame, else compute the new frustums and sort them by frustum again.
388
+ var farToNearRatio = scene.farToNearRatio;
389
+ var numFrustums = Math.ceil(Math.log(far / near) / Math.log(farToNearRatio));
390
+ if (near !== Number.MAX_VALUE && (numFrustums !== frustumsLength || (frustumCommandsList.length !== 0 &&
391
+ (near < frustumCommandsList[0].near || far > frustumCommandsList[frustumsLength - 1].far)))) {
392
+ updateFrustums(near, far, farToNearRatio, numFrustums, frustumCommandsList);
393
+ createPotentiallyVisibleSet(scene, listName);
394
+ }
395
+ }
396
+
397
+ function executeCommands(scene, framebuffer) {
398
+ var camera = scene._camera;
399
+ var frustum = camera.frustum.clone();
400
+ var context = scene._context;
401
+ var us = context.getUniformState();
402
+ var skyBoxCommand = (typeof scene.skyBox !== 'undefined') ? scene.skyBox.update(context, scene._frameState) : undefined;
403
+ var skyAtmosphereCommand = (typeof scene.skyAtmosphere !== 'undefined') ? scene.skyAtmosphere.update(context, scene._frameState) : undefined;
404
+
405
+ var clear = scene._clearColorCommand;
406
+ Color.clone(defaultValue(scene.backgroundColor, Color.BLACK), clear.clearState.color);
407
+ clear.execute(context, framebuffer);
408
+
409
+ // Ideally, we would render the sky box and atmosphere last for
410
+ // early-z, but we would have to draw it in each frustum
411
+ frustum.near = camera.frustum.near;
412
+ frustum.far = camera.frustum.far;
413
+ us.updateFrustum(frustum);
414
+
415
+ if (typeof skyBoxCommand !== 'undefined') {
416
+ skyBoxCommand.execute(context, framebuffer);
417
+ }
418
+
419
+ if (typeof skyAtmosphereCommand !== 'undefined') {
420
+ skyAtmosphereCommand.execute(context, framebuffer);
421
+ }
422
+
423
+ var clearDepthStencil = scene._clearDepthStencilCommand;
424
+
425
+ var frustumCommandsList = scene._frustumCommandsList;
426
+ var numFrustums = frustumCommandsList.length;
427
+ for (var i = 0; i < numFrustums; ++i) {
428
+ clearDepthStencil.execute(context, framebuffer);
429
+
430
+ var index = numFrustums - i - 1.0;
431
+ var frustumCommands = frustumCommandsList[index];
432
+ frustum.near = frustumCommands.near;
433
+ frustum.far = frustumCommands.far;
434
+
435
+ us.updateFrustum(frustum);
436
+
437
+ var commands = frustumCommands.commands;
438
+ var length = commands.length;
439
+ for (var j = 0; j < length; ++j) {
440
+ commands[j].execute(context, framebuffer);
441
+ }
442
+ }
443
+ }
444
+
445
+ function executeOverlayCommands(scene) {
446
+ var context = scene._context;
447
+ var commandLists = scene._commandList;
448
+ var length = commandLists.length;
449
+ for (var i = 0; i < length; ++i) {
450
+ var commandList = commandLists[i].overlayList;
451
+ var commandListLength = commandList.length;
452
+ for (var j = 0; j < commandListLength; ++j) {
453
+ commandList[j].execute(context);
454
+ }
455
+ }
456
+ }
457
+
458
+ /**
459
+ * DOC_TBA
460
+ * @memberof Scene
461
+ */
462
+ Scene.prototype.initializeFrame = function() {
463
+ // Destroy released shaders once every 120 frames to avoid thrashing the cache
464
+ if (this._shaderFrameCount++ === 120) {
465
+ this._shaderFrameCount = 0;
466
+ this._context.getShaderCache().destroyReleasedShaderPrograms();
467
+ }
468
+
469
+ this._animations.update();
470
+ this._camera.controller.update(this.mode, this.scene2D);
471
+ this._screenSpaceCameraController.update(this.mode);
472
+ };
473
+
474
+ /**
475
+ * DOC_TBA
476
+ * @memberof Scene
477
+ */
478
+ Scene.prototype.render = function(time) {
479
+ if (typeof time === 'undefined') {
480
+ time = new JulianDate();
481
+ }
482
+
483
+ var us = this.getUniformState();
484
+ var frameState = this._frameState;
485
+
486
+ var frameNumber = CesiumMath.incrementWrap(us.getFrameNumber(), 15000000.0, 1.0);
487
+ updateFrameState(this, frameNumber, time);
488
+ frameState.passes.color = true;
489
+ frameState.passes.overlay = true;
490
+
491
+ us.update(frameState);
492
+
493
+ this._commandList.length = 0;
494
+ this._primitives.update(this._context, frameState, this._commandList);
495
+
496
+ createPotentiallyVisibleSet(this, 'colorList');
497
+ executeCommands(this);
498
+ executeOverlayCommands(this);
499
+ };
500
+
501
+ var orthoPickingFrustum = new OrthographicFrustum();
502
+ function getPickOrthographicCullingVolume(scene, windowPosition, width, height) {
503
+ var canvas = scene._canvas;
504
+ var camera = scene._camera;
505
+ var frustum = camera.frustum;
506
+
507
+ var canvasWidth = canvas.clientWidth;
508
+ var canvasHeight = canvas.clientHeight;
509
+
510
+ var x = (2.0 / canvasWidth) * windowPosition.x - 1.0;
511
+ x *= (frustum.right - frustum.left) * 0.5;
512
+ var y = (2.0 / canvasHeight) * (canvasHeight - windowPosition.y) - 1.0;
513
+ y *= (frustum.top - frustum.bottom) * 0.5;
514
+
515
+ var position = camera.position;
516
+ position = new Cartesian3(position.z, position.x, position.y);
517
+ position.y += x;
518
+ position.z += y;
519
+
520
+ var pixelSize = frustum.getPixelSize(new Cartesian2(canvasWidth, canvasHeight));
521
+
522
+ var ortho = orthoPickingFrustum;
523
+ ortho.right = pixelSize.x * 0.5;
524
+ ortho.left = -ortho.right;
525
+ ortho.top = pixelSize.y * 0.5;
526
+ ortho.bottom = -ortho.top;
527
+ ortho.near = frustum.near;
528
+ ortho.far = frustum.far;
529
+
530
+ return ortho.computeCullingVolume(position, camera.getDirectionWC(), camera.getUpWC());
531
+ }
532
+
533
+ var perspPickingFrustum = new PerspectiveOffCenterFrustum();
534
+ function getPickPerspectiveCullingVolume(scene, windowPosition, width, height) {
535
+ var canvas = scene._canvas;
536
+ var camera = scene._camera;
537
+ var frustum = camera.frustum;
538
+ var near = frustum.near;
539
+
540
+ var canvasWidth = canvas.clientWidth;
541
+ var canvasHeight = canvas.clientHeight;
542
+
543
+ var tanPhi = Math.tan(frustum.fovy * 0.5);
544
+ var tanTheta = frustum.aspectRatio * tanPhi;
545
+
546
+ var x = (2.0 / canvasWidth) * windowPosition.x - 1.0;
547
+ var y = (2.0 / canvasHeight) * (canvasHeight - windowPosition.y) - 1.0;
548
+
549
+ var xDir = x * near * tanTheta;
550
+ var yDir = y * near * tanPhi;
551
+
552
+ var pixelSize = frustum.getPixelSize(new Cartesian2(canvasWidth, canvasHeight));
553
+ var pickWidth = pixelSize.x * width * 0.5;
554
+ var pickHeight = pixelSize.y * height * 0.5;
555
+
556
+ var offCenter = perspPickingFrustum;
557
+ offCenter.top = yDir + pickHeight;
558
+ offCenter.bottom = yDir - pickHeight;
559
+ offCenter.right = xDir + pickWidth;
560
+ offCenter.left = xDir - pickWidth;
561
+ offCenter.near = near;
562
+ offCenter.far = frustum.far;
563
+
564
+ return offCenter.computeCullingVolume(camera.getPositionWC(), camera.getDirectionWC(), camera.getUpWC());
565
+ }
566
+
567
+ function getPickCullingVolume(scene, windowPosition, width, height) {
568
+ if (scene.mode === SceneMode.SCENE2D) {
569
+ return getPickOrthographicCullingVolume(scene, windowPosition, width, height);
570
+ }
571
+
572
+ return getPickPerspectiveCullingVolume(scene, windowPosition, width, height);
573
+ }
574
+
575
+ // pick rectangle width and height, assumed odd
576
+ var rectangleWidth = 3.0;
577
+ var rectangleHeight = 3.0;
578
+ var scratchRectangle = new BoundingRectangle(0.0, 0.0, rectangleWidth, rectangleHeight);
579
+
580
+ /**
581
+ * DOC_TBA
582
+ * @memberof Scene
583
+ */
584
+ Scene.prototype.pick = function(windowPosition) {
585
+ var context = this._context;
586
+ var primitives = this._primitives;
587
+ var frameState = this._frameState;
588
+
589
+ this._pickFramebuffer = this._pickFramebuffer || context.createPickFramebuffer();
590
+ var fb = this._pickFramebuffer.begin();
591
+
592
+ // Update with previous frame's number aqnd time, assuming that render is called before picking.
593
+ updateFrameState(this, frameState.frameNumber, frameState.time);
594
+ frameState.cullingVolume = getPickCullingVolume(this, windowPosition, rectangleWidth, rectangleHeight);
595
+ frameState.passes.pick = true;
596
+
597
+ var commandLists = this._commandList;
598
+ commandLists.length = 0;
599
+ primitives.update(context, frameState, commandLists);
600
+
601
+ createPotentiallyVisibleSet(this, 'pickList');
602
+ executeCommands(this, fb);
603
+
604
+ scratchRectangle.x = windowPosition.x - ((rectangleWidth - 1.0) * 0.5);
605
+ scratchRectangle.y = (this._canvas.clientHeight - windowPosition.y) - ((rectangleHeight - 1.0) * 0.5);
606
+ return this._pickFramebuffer.end(scratchRectangle);
607
+ };
608
+
609
+ /**
610
+ * DOC_TBA
611
+ * @memberof Scene
612
+ */
613
+ Scene.prototype.isDestroyed = function() {
614
+ return false;
615
+ };
616
+
617
+ /**
618
+ * DOC_TBA
619
+ * @memberof Scene
620
+ */
621
+ Scene.prototype.destroy = function() {
622
+ this._screenSpaceCameraController = this._screenSpaceCameraController && this._screenSpaceCameraController.destroy();
623
+ this._pickFramebuffer = this._pickFramebuffer && this._pickFramebuffer.destroy();
624
+ this._primitives = this._primitives && this._primitives.destroy();
625
+ this.skyBox = this.skyBox && this.skyBox.destroy();
626
+ this.skyAtmosphere = this.skyAtmosphere && this.skyAtmosphere.destroy();
627
+ this._context = this._context && this._context.destroy();
628
+ return destroyObject(this);
629
+ };
630
+
631
+ return Scene;
632
+ });