cesium 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. data/LICENSE.md +259 -0
  2. data/README.rdoc +90 -0
  3. data/Rakefile +40 -0
  4. data/app/assets/javascripts/Assets/Assets.profile.js +8 -0
  5. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
  6. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
  7. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
  8. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
  9. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
  10. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
  11. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
  12. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
  13. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
  14. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
  15. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
  16. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
  17. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
  18. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
  19. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
  20. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
  21. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
  22. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
  23. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
  24. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
  25. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
  26. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
  27. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
  28. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
  29. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
  30. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
  31. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
  32. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
  33. data/app/assets/javascripts/Assets/Textures/NE2_LR_LC_SR_W_DR_2048.jpg +0 -0
  34. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
  35. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
  36. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
  37. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
  38. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
  39. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
  40. data/app/assets/javascripts/Assets/Textures/waterNormals.jpg +0 -0
  41. data/app/assets/javascripts/Assets/package.json +6 -0
  42. data/app/assets/javascripts/Cesium.js +320 -0
  43. data/app/assets/javascripts/Core/AnimationController.js +148 -0
  44. data/app/assets/javascripts/Core/AxisAlignedBoundingBox.js +243 -0
  45. data/app/assets/javascripts/Core/BoundingRectangle.js +364 -0
  46. data/app/assets/javascripts/Core/BoundingSphere.js +819 -0
  47. data/app/assets/javascripts/Core/BoxTessellator.js +93 -0
  48. data/app/assets/javascripts/Core/Cartesian2.js +762 -0
  49. data/app/assets/javascripts/Core/Cartesian3.js +861 -0
  50. data/app/assets/javascripts/Core/Cartesian4.js +762 -0
  51. data/app/assets/javascripts/Core/Cartographic.js +211 -0
  52. data/app/assets/javascripts/Core/CatmullRomSpline.js +232 -0
  53. data/app/assets/javascripts/Core/Clock.js +195 -0
  54. data/app/assets/javascripts/Core/ClockRange.js +37 -0
  55. data/app/assets/javascripts/Core/ClockStep.js +32 -0
  56. data/app/assets/javascripts/Core/Color.js +1629 -0
  57. data/app/assets/javascripts/Core/ComponentDatatype.js +119 -0
  58. data/app/assets/javascripts/Core/Core.profile.js +8 -0
  59. data/app/assets/javascripts/Core/CubeMapEllipsoidTessellator.js +198 -0
  60. data/app/assets/javascripts/Core/CubicRealPolynomial.js +251 -0
  61. data/app/assets/javascripts/Core/DefaultProxy.js +30 -0
  62. data/app/assets/javascripts/Core/DeveloperError.js +60 -0
  63. data/app/assets/javascripts/Core/EarthOrientationParameters.js +383 -0
  64. data/app/assets/javascripts/Core/EarthOrientationParametersSample.js +50 -0
  65. data/app/assets/javascripts/Core/Ellipsoid.js +539 -0
  66. data/app/assets/javascripts/Core/EllipsoidTangentPlane.js +207 -0
  67. data/app/assets/javascripts/Core/EllipsoidalOccluder.js +151 -0
  68. data/app/assets/javascripts/Core/EncodedCartesian3.js +197 -0
  69. data/app/assets/javascripts/Core/Enumeration.js +67 -0
  70. data/app/assets/javascripts/Core/Event.js +122 -0
  71. data/app/assets/javascripts/Core/Extent.js +383 -0
  72. data/app/assets/javascripts/Core/ExtentTessellator.js +384 -0
  73. data/app/assets/javascripts/Core/FAR.js +13 -0
  74. data/app/assets/javascripts/Core/FeatureDetection.js +126 -0
  75. data/app/assets/javascripts/Core/Fullscreen.js +235 -0
  76. data/app/assets/javascripts/Core/GeographicProjection.js +107 -0
  77. data/app/assets/javascripts/Core/HermitePolynomialApproximation.js +176 -0
  78. data/app/assets/javascripts/Core/HermiteSpline.js +234 -0
  79. data/app/assets/javascripts/Core/Iau2006XysData.js +259 -0
  80. data/app/assets/javascripts/Core/Iau2006XysSample.js +36 -0
  81. data/app/assets/javascripts/Core/IndexDatatype.js +28 -0
  82. data/app/assets/javascripts/Core/Intersect.js +40 -0
  83. data/app/assets/javascripts/Core/IntersectionTests.js +359 -0
  84. data/app/assets/javascripts/Core/Interval.js +27 -0
  85. data/app/assets/javascripts/Core/Iso8601.js +46 -0
  86. data/app/assets/javascripts/Core/JulianDate.js +1228 -0
  87. data/app/assets/javascripts/Core/KeyboardEventModifier.js +38 -0
  88. data/app/assets/javascripts/Core/LagrangePolynomialApproximation.js +96 -0
  89. data/app/assets/javascripts/Core/LeapSecond.js +158 -0
  90. data/app/assets/javascripts/Core/LinearApproximation.js +98 -0
  91. data/app/assets/javascripts/Core/Math.js +532 -0
  92. data/app/assets/javascripts/Core/Matrix2.js +833 -0
  93. data/app/assets/javascripts/Core/Matrix3.js +1099 -0
  94. data/app/assets/javascripts/Core/Matrix4.js +2164 -0
  95. data/app/assets/javascripts/Core/MeshFilters.js +568 -0
  96. data/app/assets/javascripts/Core/Occluder.js +474 -0
  97. data/app/assets/javascripts/Core/OrientationInterpolator.js +109 -0
  98. data/app/assets/javascripts/Core/PlaneTessellator.js +74 -0
  99. data/app/assets/javascripts/Core/PolygonPipeline.js +792 -0
  100. data/app/assets/javascripts/Core/PolylinePipeline.js +90 -0
  101. data/app/assets/javascripts/Core/PrimitiveType.js +80 -0
  102. data/app/assets/javascripts/Core/QuadraticRealPolynomial.js +146 -0
  103. data/app/assets/javascripts/Core/QuarticRealPolynomial.js +339 -0
  104. data/app/assets/javascripts/Core/Quaternion.js +947 -0
  105. data/app/assets/javascripts/Core/Queue.js +95 -0
  106. data/app/assets/javascripts/Core/Ray.js +64 -0
  107. data/app/assets/javascripts/Core/ReferenceFrame.js +25 -0
  108. data/app/assets/javascripts/Core/RequestErrorEvent.js +35 -0
  109. data/app/assets/javascripts/Core/RuntimeError.js +59 -0
  110. data/app/assets/javascripts/Core/ScreenSpaceEventHandler.js +658 -0
  111. data/app/assets/javascripts/Core/ScreenSpaceEventType.js +149 -0
  112. data/app/assets/javascripts/Core/Shapes.js +230 -0
  113. data/app/assets/javascripts/Core/Spherical.js +192 -0
  114. data/app/assets/javascripts/Core/TaskProcessor.js +131 -0
  115. data/app/assets/javascripts/Core/TimeConstants.js +85 -0
  116. data/app/assets/javascripts/Core/TimeInterval.js +305 -0
  117. data/app/assets/javascripts/Core/TimeIntervalCollection.js +543 -0
  118. data/app/assets/javascripts/Core/TimeStandard.js +31 -0
  119. data/app/assets/javascripts/Core/Tipsify.js +285 -0
  120. data/app/assets/javascripts/Core/Transforms.js +614 -0
  121. data/app/assets/javascripts/Core/TridiagonalSystemSolver.js +102 -0
  122. data/app/assets/javascripts/Core/Visibility.js +38 -0
  123. data/app/assets/javascripts/Core/WebMercatorProjection.js +154 -0
  124. data/app/assets/javascripts/Core/WindingOrder.js +40 -0
  125. data/app/assets/javascripts/Core/binarySearch.js +69 -0
  126. data/app/assets/javascripts/Core/buildModuleUrl.js +77 -0
  127. data/app/assets/javascripts/Core/clone.js +21 -0
  128. data/app/assets/javascripts/Core/combine.js +81 -0
  129. data/app/assets/javascripts/Core/computeSunPosition.js +116 -0
  130. data/app/assets/javascripts/Core/createGuid.js +25 -0
  131. data/app/assets/javascripts/Core/defaultValue.js +22 -0
  132. data/app/assets/javascripts/Core/destroyObject.js +61 -0
  133. data/app/assets/javascripts/Core/freezeObject.js +20 -0
  134. data/app/assets/javascripts/Core/getImagePixels.js +46 -0
  135. data/app/assets/javascripts/Core/isLeapYear.js +30 -0
  136. data/app/assets/javascripts/Core/jsonp.js +116 -0
  137. data/app/assets/javascripts/Core/loadArrayBuffer.js +76 -0
  138. data/app/assets/javascripts/Core/loadImage.js +85 -0
  139. data/app/assets/javascripts/Core/loadJson.js +54 -0
  140. data/app/assets/javascripts/Core/loadText.js +78 -0
  141. data/app/assets/javascripts/Core/loadXML.js +76 -0
  142. data/app/assets/javascripts/Core/package.json +6 -0
  143. data/app/assets/javascripts/Core/pointInsideTriangle2D.js +41 -0
  144. data/app/assets/javascripts/Core/requestAnimationFrame.js +61 -0
  145. data/app/assets/javascripts/Core/throttleRequestByServer.js +74 -0
  146. data/app/assets/javascripts/Core/writeTextToCanvas.js +92 -0
  147. data/app/assets/javascripts/DynamicScene/CompositeDynamicObjectCollection.js +254 -0
  148. data/app/assets/javascripts/DynamicScene/CzmlBoolean.js +57 -0
  149. data/app/assets/javascripts/DynamicScene/CzmlCartesian2.js +96 -0
  150. data/app/assets/javascripts/DynamicScene/CzmlCartesian3.js +99 -0
  151. data/app/assets/javascripts/DynamicScene/CzmlCartographic.js +125 -0
  152. data/app/assets/javascripts/DynamicScene/CzmlColor.js +127 -0
  153. data/app/assets/javascripts/DynamicScene/CzmlDefaults.js +135 -0
  154. data/app/assets/javascripts/DynamicScene/CzmlHorizontalOrigin.js +59 -0
  155. data/app/assets/javascripts/DynamicScene/CzmlImage.js +61 -0
  156. data/app/assets/javascripts/DynamicScene/CzmlLabelStyle.js +59 -0
  157. data/app/assets/javascripts/DynamicScene/CzmlNumber.js +82 -0
  158. data/app/assets/javascripts/DynamicScene/CzmlString.js +56 -0
  159. data/app/assets/javascripts/DynamicScene/CzmlUnitCartesian3.js +99 -0
  160. data/app/assets/javascripts/DynamicScene/CzmlUnitQuaternion.js +172 -0
  161. data/app/assets/javascripts/DynamicScene/CzmlUnitSpherical.js +98 -0
  162. data/app/assets/javascripts/DynamicScene/CzmlVerticalOrigin.js +59 -0
  163. data/app/assets/javascripts/DynamicScene/DynamicBillboard.js +245 -0
  164. data/app/assets/javascripts/DynamicScene/DynamicBillboardVisualizer.js +347 -0
  165. data/app/assets/javascripts/DynamicScene/DynamicColorMaterial.js +78 -0
  166. data/app/assets/javascripts/DynamicScene/DynamicCone.js +291 -0
  167. data/app/assets/javascripts/DynamicScene/DynamicConeVisualizer.js +350 -0
  168. data/app/assets/javascripts/DynamicScene/DynamicConeVisualizerUsingCustomSensor.js +389 -0
  169. data/app/assets/javascripts/DynamicScene/DynamicDirectionsProperty.js +163 -0
  170. data/app/assets/javascripts/DynamicScene/DynamicEllipsoid.js +158 -0
  171. data/app/assets/javascripts/DynamicScene/DynamicEllipsoidVisualizer.js +277 -0
  172. data/app/assets/javascripts/DynamicScene/DynamicImageMaterial.js +136 -0
  173. data/app/assets/javascripts/DynamicScene/DynamicLabel.js +286 -0
  174. data/app/assets/javascripts/DynamicScene/DynamicLabelVisualizer.js +341 -0
  175. data/app/assets/javascripts/DynamicScene/DynamicMaterialProperty.js +125 -0
  176. data/app/assets/javascripts/DynamicScene/DynamicObject.js +364 -0
  177. data/app/assets/javascripts/DynamicScene/DynamicObjectCollection.js +137 -0
  178. data/app/assets/javascripts/DynamicScene/DynamicObjectView.js +299 -0
  179. data/app/assets/javascripts/DynamicScene/DynamicPath.js +214 -0
  180. data/app/assets/javascripts/DynamicScene/DynamicPathVisualizer.js +402 -0
  181. data/app/assets/javascripts/DynamicScene/DynamicPoint.js +184 -0
  182. data/app/assets/javascripts/DynamicScene/DynamicPointVisualizer.js +323 -0
  183. data/app/assets/javascripts/DynamicScene/DynamicPolygon.js +138 -0
  184. data/app/assets/javascripts/DynamicScene/DynamicPolygonVisualizer.js +251 -0
  185. data/app/assets/javascripts/DynamicScene/DynamicPolyline.js +183 -0
  186. data/app/assets/javascripts/DynamicScene/DynamicPolylineVisualizer.js +268 -0
  187. data/app/assets/javascripts/DynamicScene/DynamicPositionProperty.js +525 -0
  188. data/app/assets/javascripts/DynamicScene/DynamicProperty.js +352 -0
  189. data/app/assets/javascripts/DynamicScene/DynamicPyramid.js +204 -0
  190. data/app/assets/javascripts/DynamicScene/DynamicPyramidVisualizer.js +302 -0
  191. data/app/assets/javascripts/DynamicScene/DynamicScene.profile.js +8 -0
  192. data/app/assets/javascripts/DynamicScene/DynamicVertexPositionsProperty.js +199 -0
  193. data/app/assets/javascripts/DynamicScene/ReferenceProperty.js +155 -0
  194. data/app/assets/javascripts/DynamicScene/VisualizerCollection.js +181 -0
  195. data/app/assets/javascripts/DynamicScene/package.json +6 -0
  196. data/app/assets/javascripts/DynamicScene/processCzml.js +77 -0
  197. data/app/assets/javascripts/Renderer/BlendEquation.js +52 -0
  198. data/app/assets/javascripts/Renderer/BlendFunction.js +158 -0
  199. data/app/assets/javascripts/Renderer/BlendingState.js +64 -0
  200. data/app/assets/javascripts/Renderer/Buffer.js +141 -0
  201. data/app/assets/javascripts/Renderer/BufferUsage.js +48 -0
  202. data/app/assets/javascripts/Renderer/ClearCommand.js +40 -0
  203. data/app/assets/javascripts/Renderer/CommandLists.js +42 -0
  204. data/app/assets/javascripts/Renderer/Context.js +2805 -0
  205. data/app/assets/javascripts/Renderer/CubeMap.js +358 -0
  206. data/app/assets/javascripts/Renderer/CubeMapFace.js +202 -0
  207. data/app/assets/javascripts/Renderer/CullFace.js +50 -0
  208. data/app/assets/javascripts/Renderer/DepthFunction.js +95 -0
  209. data/app/assets/javascripts/Renderer/DrawCommand.js +96 -0
  210. data/app/assets/javascripts/Renderer/Framebuffer.js +435 -0
  211. data/app/assets/javascripts/Renderer/MipmapHint.js +50 -0
  212. data/app/assets/javascripts/Renderer/PickFramebuffer.js +178 -0
  213. data/app/assets/javascripts/Renderer/PixelDatatype.js +86 -0
  214. data/app/assets/javascripts/Renderer/PixelFormat.js +113 -0
  215. data/app/assets/javascripts/Renderer/Renderbuffer.js +102 -0
  216. data/app/assets/javascripts/Renderer/RenderbufferFormat.js +77 -0
  217. data/app/assets/javascripts/Renderer/Renderer.profile.js +8 -0
  218. data/app/assets/javascripts/Renderer/ShaderCache.js +121 -0
  219. data/app/assets/javascripts/Renderer/ShaderProgram.js +2402 -0
  220. data/app/assets/javascripts/Renderer/StencilFunction.js +95 -0
  221. data/app/assets/javascripts/Renderer/StencilOperation.js +95 -0
  222. data/app/assets/javascripts/Renderer/Texture.js +395 -0
  223. data/app/assets/javascripts/Renderer/TextureAtlas.js +472 -0
  224. data/app/assets/javascripts/Renderer/TextureAtlasBuilder.js +133 -0
  225. data/app/assets/javascripts/Renderer/TextureMagnificationFilter.js +41 -0
  226. data/app/assets/javascripts/Renderer/TextureMinificationFilter.js +77 -0
  227. data/app/assets/javascripts/Renderer/TextureWrap.js +50 -0
  228. data/app/assets/javascripts/Renderer/UniformDatatype.js +218 -0
  229. data/app/assets/javascripts/Renderer/UniformState.js +799 -0
  230. data/app/assets/javascripts/Renderer/VertexArray.js +365 -0
  231. data/app/assets/javascripts/Renderer/VertexArrayFacade.js +574 -0
  232. data/app/assets/javascripts/Renderer/VertexLayout.js +49 -0
  233. data/app/assets/javascripts/Renderer/loadCubeMap.js +92 -0
  234. data/app/assets/javascripts/Renderer/package.json +6 -0
  235. data/app/assets/javascripts/Scene/AnimationCollection.js +249 -0
  236. data/app/assets/javascripts/Scene/ArcGisMapServerImageryProvider.js +384 -0
  237. data/app/assets/javascripts/Scene/Billboard.js +680 -0
  238. data/app/assets/javascripts/Scene/BillboardCollection.js +1209 -0
  239. data/app/assets/javascripts/Scene/BingMapsImageryProvider.js +460 -0
  240. data/app/assets/javascripts/Scene/BingMapsStyle.js +55 -0
  241. data/app/assets/javascripts/Scene/Camera.js +358 -0
  242. data/app/assets/javascripts/Scene/CameraColumbusViewMode.js +30 -0
  243. data/app/assets/javascripts/Scene/CameraController.js +1258 -0
  244. data/app/assets/javascripts/Scene/CameraEventAggregator.js +270 -0
  245. data/app/assets/javascripts/Scene/CameraEventType.js +53 -0
  246. data/app/assets/javascripts/Scene/CameraFlightPath.js +495 -0
  247. data/app/assets/javascripts/Scene/CentralBody.js +817 -0
  248. data/app/assets/javascripts/Scene/CentralBodySurface.js +1120 -0
  249. data/app/assets/javascripts/Scene/CentralBodySurfaceShaderSet.js +107 -0
  250. data/app/assets/javascripts/Scene/ComplexConicSensorVolume.js +511 -0
  251. data/app/assets/javascripts/Scene/CompositePrimitive.js +454 -0
  252. data/app/assets/javascripts/Scene/CullingVolume.js +59 -0
  253. data/app/assets/javascripts/Scene/CustomSensorVolume.js +440 -0
  254. data/app/assets/javascripts/Scene/DiscardMissingTileImagePolicy.js +134 -0
  255. data/app/assets/javascripts/Scene/EllipsoidPrimitive.js +412 -0
  256. data/app/assets/javascripts/Scene/EllipsoidTerrainProvider.js +182 -0
  257. data/app/assets/javascripts/Scene/FrameState.js +86 -0
  258. data/app/assets/javascripts/Scene/FrustumCommands.js +32 -0
  259. data/app/assets/javascripts/Scene/GeographicTilingScheme.js +265 -0
  260. data/app/assets/javascripts/Scene/HorizontalOrigin.js +39 -0
  261. data/app/assets/javascripts/Scene/Imagery.js +85 -0
  262. data/app/assets/javascripts/Scene/ImageryLayer.js +876 -0
  263. data/app/assets/javascripts/Scene/ImageryLayerCollection.js +403 -0
  264. data/app/assets/javascripts/Scene/ImageryProvider.js +185 -0
  265. data/app/assets/javascripts/Scene/ImageryProviderError.js +149 -0
  266. data/app/assets/javascripts/Scene/ImageryState.js +20 -0
  267. data/app/assets/javascripts/Scene/Label.js +706 -0
  268. data/app/assets/javascripts/Scene/LabelCollection.js +697 -0
  269. data/app/assets/javascripts/Scene/LabelStyle.js +39 -0
  270. data/app/assets/javascripts/Scene/Material.js +1177 -0
  271. data/app/assets/javascripts/Scene/NeverTileDiscardPolicy.js +38 -0
  272. data/app/assets/javascripts/Scene/OpenStreetMapImageryProvider.js +282 -0
  273. data/app/assets/javascripts/Scene/OrthographicFrustum.js +345 -0
  274. data/app/assets/javascripts/Scene/PerformanceDisplay.js +183 -0
  275. data/app/assets/javascripts/Scene/PerspectiveFrustum.js +239 -0
  276. data/app/assets/javascripts/Scene/PerspectiveOffCenterFrustum.js +394 -0
  277. data/app/assets/javascripts/Scene/Polygon.js +886 -0
  278. data/app/assets/javascripts/Scene/Polyline.js +441 -0
  279. data/app/assets/javascripts/Scene/PolylineCollection.js +1532 -0
  280. data/app/assets/javascripts/Scene/Projections.js +93 -0
  281. data/app/assets/javascripts/Scene/RectangularPyramidSensorVolume.js +224 -0
  282. data/app/assets/javascripts/Scene/Scene.js +632 -0
  283. data/app/assets/javascripts/Scene/Scene.profile.js +8 -0
  284. data/app/assets/javascripts/Scene/SceneMode.js +51 -0
  285. data/app/assets/javascripts/Scene/SceneTransitioner.js +776 -0
  286. data/app/assets/javascripts/Scene/ScreenSpaceCameraController.js +1063 -0
  287. data/app/assets/javascripts/Scene/SensorVolumeCollection.js +192 -0
  288. data/app/assets/javascripts/Scene/SingleTileImageryProvider.js +295 -0
  289. data/app/assets/javascripts/Scene/SkyAtmosphere.js +239 -0
  290. data/app/assets/javascripts/Scene/SkyBox.js +231 -0
  291. data/app/assets/javascripts/Scene/TerrainProvider.js +229 -0
  292. data/app/assets/javascripts/Scene/TexturePool.js +154 -0
  293. data/app/assets/javascripts/Scene/Tile.js +322 -0
  294. data/app/assets/javascripts/Scene/TileDiscardPolicy.js +42 -0
  295. data/app/assets/javascripts/Scene/TileImagery.js +36 -0
  296. data/app/assets/javascripts/Scene/TileLoadQueue.js +123 -0
  297. data/app/assets/javascripts/Scene/TileMapServiceImageryProvider.js +337 -0
  298. data/app/assets/javascripts/Scene/TileReplacementQueue.js +139 -0
  299. data/app/assets/javascripts/Scene/TileState.js +19 -0
  300. data/app/assets/javascripts/Scene/TilingScheme.js +213 -0
  301. data/app/assets/javascripts/Scene/VerticalOrigin.js +39 -0
  302. data/app/assets/javascripts/Scene/ViewportQuad.js +256 -0
  303. data/app/assets/javascripts/Scene/WebMapServiceImageryProvider.js +374 -0
  304. data/app/assets/javascripts/Scene/WebMercatorTilingScheme.js +291 -0
  305. data/app/assets/javascripts/Scene/package.json +6 -0
  306. data/app/assets/javascripts/Shaders/BillboardCollectionFS.glsl +30 -0
  307. data/app/assets/javascripts/Shaders/BillboardCollectionFS.js +31 -0
  308. data/app/assets/javascripts/Shaders/BillboardCollectionVS.glsl +68 -0
  309. data/app/assets/javascripts/Shaders/BillboardCollectionVS.js +54 -0
  310. data/app/assets/javascripts/Shaders/BuiltinFunctions.glsl +927 -0
  311. data/app/assets/javascripts/Shaders/BuiltinFunctions.js +322 -0
  312. data/app/assets/javascripts/Shaders/CentralBodyFS.glsl +106 -0
  313. data/app/assets/javascripts/Shaders/CentralBodyFS.js +82 -0
  314. data/app/assets/javascripts/Shaders/CentralBodyFSDepth.glsl +20 -0
  315. data/app/assets/javascripts/Shaders/CentralBodyFSDepth.js +22 -0
  316. data/app/assets/javascripts/Shaders/CentralBodyFSPole.glsl +29 -0
  317. data/app/assets/javascripts/Shaders/CentralBodyFSPole.js +28 -0
  318. data/app/assets/javascripts/Shaders/CentralBodyVS.glsl +88 -0
  319. data/app/assets/javascripts/Shaders/CentralBodyVS.js +69 -0
  320. data/app/assets/javascripts/Shaders/CentralBodyVSDepth.glsl +9 -0
  321. data/app/assets/javascripts/Shaders/CentralBodyVSDepth.js +13 -0
  322. data/app/assets/javascripts/Shaders/CentralBodyVSPole.glsl +12 -0
  323. data/app/assets/javascripts/Shaders/CentralBodyVSPole.js +15 -0
  324. data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeFS.glsl +448 -0
  325. data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeFS.js +361 -0
  326. data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeVS.glsl +19 -0
  327. data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeVS.js +20 -0
  328. data/app/assets/javascripts/Shaders/ConstructiveSolidGeometry.glsl +886 -0
  329. data/app/assets/javascripts/Shaders/ConstructiveSolidGeometry.js +586 -0
  330. data/app/assets/javascripts/Shaders/CustomSensorVolumeFS.glsl +126 -0
  331. data/app/assets/javascripts/Shaders/CustomSensorVolumeFS.js +95 -0
  332. data/app/assets/javascripts/Shaders/CustomSensorVolumeVS.glsl +14 -0
  333. data/app/assets/javascripts/Shaders/CustomSensorVolumeVS.js +18 -0
  334. data/app/assets/javascripts/Shaders/EllipsoidFS.glsl +40 -0
  335. data/app/assets/javascripts/Shaders/EllipsoidFS.js +38 -0
  336. data/app/assets/javascripts/Shaders/EllipsoidVS.glsl +26 -0
  337. data/app/assets/javascripts/Shaders/EllipsoidVS.js +16 -0
  338. data/app/assets/javascripts/Shaders/Materials/AsphaltMaterial.glsl +25 -0
  339. data/app/assets/javascripts/Shaders/Materials/AsphaltMaterial.js +23 -0
  340. data/app/assets/javascripts/Shaders/Materials/BlobMaterial.glsl +18 -0
  341. data/app/assets/javascripts/Shaders/Materials/BlobMaterial.js +19 -0
  342. data/app/assets/javascripts/Shaders/Materials/BrickMaterial.glsl +42 -0
  343. data/app/assets/javascripts/Shaders/Materials/BrickMaterial.js +36 -0
  344. data/app/assets/javascripts/Shaders/Materials/BumpMapMaterial.glsl +29 -0
  345. data/app/assets/javascripts/Shaders/Materials/BumpMapMaterial.js +27 -0
  346. data/app/assets/javascripts/Shaders/Materials/CementMaterial.glsl +19 -0
  347. data/app/assets/javascripts/Shaders/Materials/CementMaterial.js +20 -0
  348. data/app/assets/javascripts/Shaders/Materials/CheckerboardMaterial.glsl +38 -0
  349. data/app/assets/javascripts/Shaders/Materials/CheckerboardMaterial.js +32 -0
  350. data/app/assets/javascripts/Shaders/Materials/DotMaterial.glsl +17 -0
  351. data/app/assets/javascripts/Shaders/Materials/DotMaterial.js +18 -0
  352. data/app/assets/javascripts/Shaders/Materials/ErosionMaterial.glsl +23 -0
  353. data/app/assets/javascripts/Shaders/Materials/ErosionMaterial.js +24 -0
  354. data/app/assets/javascripts/Shaders/Materials/FacetMaterial.glsl +18 -0
  355. data/app/assets/javascripts/Shaders/Materials/FacetMaterial.js +19 -0
  356. data/app/assets/javascripts/Shaders/Materials/FresnelMaterial.glsl +12 -0
  357. data/app/assets/javascripts/Shaders/Materials/FresnelMaterial.js +15 -0
  358. data/app/assets/javascripts/Shaders/Materials/GrassMaterial.glsl +28 -0
  359. data/app/assets/javascripts/Shaders/Materials/GrassMaterial.js +26 -0
  360. data/app/assets/javascripts/Shaders/Materials/NormalMapMaterial.glsl +19 -0
  361. data/app/assets/javascripts/Shaders/Materials/NormalMapMaterial.js +21 -0
  362. data/app/assets/javascripts/Shaders/Materials/ReflectionMaterial.glsl +13 -0
  363. data/app/assets/javascripts/Shaders/Materials/ReflectionMaterial.js +16 -0
  364. data/app/assets/javascripts/Shaders/Materials/RefractionMaterial.glsl +14 -0
  365. data/app/assets/javascripts/Shaders/Materials/RefractionMaterial.js +17 -0
  366. data/app/assets/javascripts/Shaders/Materials/RimLightingMaterial.glsl +18 -0
  367. data/app/assets/javascripts/Shaders/Materials/RimLightingMaterial.js +19 -0
  368. data/app/assets/javascripts/Shaders/Materials/StripeMaterial.glsl +29 -0
  369. data/app/assets/javascripts/Shaders/Materials/StripeMaterial.js +26 -0
  370. data/app/assets/javascripts/Shaders/Materials/TieDyeMaterial.glsl +17 -0
  371. data/app/assets/javascripts/Shaders/Materials/TieDyeMaterial.js +19 -0
  372. data/app/assets/javascripts/Shaders/Materials/Water.glsl +91 -0
  373. data/app/assets/javascripts/Shaders/Materials/Water.js +60 -0
  374. data/app/assets/javascripts/Shaders/Materials/WoodMaterial.glsl +36 -0
  375. data/app/assets/javascripts/Shaders/Materials/WoodMaterial.js +31 -0
  376. data/app/assets/javascripts/Shaders/Noise.glsl +453 -0
  377. data/app/assets/javascripts/Shaders/Noise.js +242 -0
  378. data/app/assets/javascripts/Shaders/PolygonFS.glsl +27 -0
  379. data/app/assets/javascripts/Shaders/PolygonFS.js +23 -0
  380. data/app/assets/javascripts/Shaders/PolygonFSPick.glsl +6 -0
  381. data/app/assets/javascripts/Shaders/PolygonFSPick.js +11 -0
  382. data/app/assets/javascripts/Shaders/PolygonVS.glsl +38 -0
  383. data/app/assets/javascripts/Shaders/PolygonVS.js +39 -0
  384. data/app/assets/javascripts/Shaders/PolygonVSPick.glsl +30 -0
  385. data/app/assets/javascripts/Shaders/PolygonVSPick.js +32 -0
  386. data/app/assets/javascripts/Shaders/PolylineFS.glsl +6 -0
  387. data/app/assets/javascripts/Shaders/PolylineFS.js +11 -0
  388. data/app/assets/javascripts/Shaders/PolylineVS.glsl +34 -0
  389. data/app/assets/javascripts/Shaders/PolylineVS.js +35 -0
  390. data/app/assets/javascripts/Shaders/Ray.glsl +532 -0
  391. data/app/assets/javascripts/Shaders/Ray.js +357 -0
  392. data/app/assets/javascripts/Shaders/ReprojectWebMercatorFS.glsl +26 -0
  393. data/app/assets/javascripts/Shaders/ReprojectWebMercatorFS.js +22 -0
  394. data/app/assets/javascripts/Shaders/ReprojectWebMercatorVS.glsl +11 -0
  395. data/app/assets/javascripts/Shaders/ReprojectWebMercatorVS.js +14 -0
  396. data/app/assets/javascripts/Shaders/SensorVolume.glsl +43 -0
  397. data/app/assets/javascripts/Shaders/SensorVolume.js +31 -0
  398. data/app/assets/javascripts/Shaders/Shaders.profile.js +8 -0
  399. data/app/assets/javascripts/Shaders/SkyAtmosphereFS.glsl +70 -0
  400. data/app/assets/javascripts/Shaders/SkyAtmosphereFS.js +62 -0
  401. data/app/assets/javascripts/Shaders/SkyAtmosphereVS.glsl +131 -0
  402. data/app/assets/javascripts/Shaders/SkyAtmosphereVS.js +115 -0
  403. data/app/assets/javascripts/Shaders/SkyBoxFS.glsl +10 -0
  404. data/app/assets/javascripts/Shaders/SkyBoxFS.js +14 -0
  405. data/app/assets/javascripts/Shaders/SkyBoxVS.glsl +10 -0
  406. data/app/assets/javascripts/Shaders/SkyBoxVS.js +14 -0
  407. data/app/assets/javascripts/Shaders/ViewportQuadFS.glsl +16 -0
  408. data/app/assets/javascripts/Shaders/ViewportQuadFS.js +17 -0
  409. data/app/assets/javascripts/Shaders/ViewportQuadVS.glsl +10 -0
  410. data/app/assets/javascripts/Shaders/ViewportQuadVS.js +14 -0
  411. data/app/assets/javascripts/Shaders/package.json +6 -0
  412. data/app/assets/javascripts/ThirdParty/ThirdParty.profile.js +8 -0
  413. data/app/assets/javascripts/ThirdParty/Tween.js +678 -0
  414. data/app/assets/javascripts/ThirdParty/Uri.js +277 -0
  415. data/app/assets/javascripts/ThirdParty/measureText.js +197 -0
  416. data/app/assets/javascripts/ThirdParty/package.json +6 -0
  417. data/app/assets/javascripts/ThirdParty/sprintf.js +319 -0
  418. data/app/assets/javascripts/ThirdParty/when.js +748 -0
  419. data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.css +175 -0
  420. data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.html +52 -0
  421. data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.js +1237 -0
  422. data/app/assets/javascripts/Widgets/Dojo/CesiumWidget.html +4 -0
  423. data/app/assets/javascripts/Widgets/Dojo/CesiumWidget.js +349 -0
  424. data/app/assets/javascripts/Widgets/Dojo/TimelineWidget.css +1 -0
  425. data/app/assets/javascripts/Widgets/Dojo/TimelineWidget.js +47 -0
  426. data/app/assets/javascripts/Widgets/Dojo/checkForChromeFrame.js +71 -0
  427. data/app/assets/javascripts/Widgets/Images/Bing_Logo_51x19_White.png +0 -0
  428. data/app/assets/javascripts/Widgets/Images/Cesium_Logo_overlay.png +0 -0
  429. data/app/assets/javascripts/Widgets/Images/TimelineIcons.png +0 -0
  430. data/app/assets/javascripts/Widgets/Images/ajax-loader.gif +0 -0
  431. data/app/assets/javascripts/Widgets/Images/animationBar.png +0 -0
  432. data/app/assets/javascripts/Widgets/Images/viewControlBar.png +0 -0
  433. data/app/assets/javascripts/Widgets/Timeline.css +113 -0
  434. data/app/assets/javascripts/Widgets/Timeline.js +629 -0
  435. data/app/assets/javascripts/Widgets/TimelineHighlightRange.js +51 -0
  436. data/app/assets/javascripts/Widgets/TimelineTrack.js +54 -0
  437. data/app/assets/javascripts/Widgets/Widgets.profile.js +8 -0
  438. data/app/assets/javascripts/Widgets/package.json +6 -0
  439. data/app/assets/javascripts/Workers/Workers.profile.js +8 -0
  440. data/app/assets/javascripts/Workers/cesiumWorkerBootstrapper.js +2015 -0
  441. data/app/assets/javascripts/Workers/createTaskProcessorWorker.js +55 -0
  442. data/app/assets/javascripts/Workers/createVerticesFromExtent.js +24 -0
  443. data/app/assets/javascripts/Workers/package.json +6 -0
  444. data/app/assets/javascripts/copyrightHeader.js +22 -0
  445. data/app/assets/javascripts/main.js +10 -0
  446. data/app/assets/stylesheets/cesium.css +4 -0
  447. data/app/controllers/cesium_controller.rb +4 -0
  448. data/app/helpers/cesium_helper.rb +2 -0
  449. data/app/views/cesium/index.html.erb +3 -0
  450. data/config/routes.rb +3 -0
  451. data/lib/cesium.rb +4 -0
  452. data/lib/cesium/engine.rb +4 -0
  453. data/lib/cesium/version.rb +3 -0
  454. data/lib/tasks/cesium_tasks.rake +4 -0
  455. data/test/cesium_test.rb +7 -0
  456. data/test/dummy/README.rdoc +261 -0
  457. data/test/dummy/Rakefile +7 -0
  458. data/test/dummy/app/assets/javascripts/adapters/jquery-adapter.js.coffee +4 -0
  459. data/test/dummy/app/assets/javascripts/app.js.coffee +11 -0
  460. data/test/dummy/app/assets/javascripts/application.js.coffee +73 -0
  461. data/test/dummy/app/assets/stylesheets/application.css +12 -0
  462. data/test/dummy/app/controllers/application_controller.rb +4 -0
  463. data/test/dummy/app/helpers/application_helper.rb +2 -0
  464. data/test/dummy/app/views/layouts/application.html.erb +21 -0
  465. data/test/dummy/config.ru +4 -0
  466. data/test/dummy/config/application.rb +59 -0
  467. data/test/dummy/config/boot.rb +10 -0
  468. data/test/dummy/config/database.yml +25 -0
  469. data/test/dummy/config/environment.rb +5 -0
  470. data/test/dummy/config/environments/development.rb +37 -0
  471. data/test/dummy/config/environments/production.rb +67 -0
  472. data/test/dummy/config/environments/test.rb +37 -0
  473. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  474. data/test/dummy/config/initializers/inflections.rb +15 -0
  475. data/test/dummy/config/initializers/mime_types.rb +5 -0
  476. data/test/dummy/config/initializers/secret_token.rb +7 -0
  477. data/test/dummy/config/initializers/session_store.rb +8 -0
  478. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  479. data/test/dummy/config/locales/en.yml +5 -0
  480. data/test/dummy/config/requirejs.yml +10 -0
  481. data/test/dummy/config/routes.rb +3 -0
  482. data/test/dummy/public/404.html +26 -0
  483. data/test/dummy/public/422.html +26 -0
  484. data/test/dummy/public/500.html +25 -0
  485. data/test/dummy/public/favicon.ico +0 -0
  486. data/test/dummy/script/rails +6 -0
  487. data/test/functional/cesium_controller_test.rb +9 -0
  488. data/test/integration/navigation_test.rb +10 -0
  489. data/test/test_helper.rb +15 -0
  490. data/test/unit/helpers/cesium_helper_test.rb +4 -0
  491. metadata +641 -0
@@ -0,0 +1,20 @@
1
+ varying vec4 positionEC;
2
+
3
+ void main()
4
+ {
5
+ // TODO: make arbitrary ellipsoid
6
+ czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();
7
+
8
+ vec3 direction = normalize(positionEC.xyz);
9
+ czm_ray ray = czm_ray(vec3(0.0), direction);
10
+
11
+ czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);
12
+ if (!czm_isEmpty(intersection))
13
+ {
14
+ gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);
15
+ }
16
+ else
17
+ {
18
+ discard;
19
+ }
20
+ }
@@ -0,0 +1,22 @@
1
+ // This file is automatically rebuilt by the Cesium build process.
2
+ /*global define*/
3
+ define(function() {
4
+ "use strict";
5
+ return "varying vec4 positionEC;\n\
6
+ void main()\n\
7
+ {\n\
8
+ czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();\n\
9
+ vec3 direction = normalize(positionEC.xyz);\n\
10
+ czm_ray ray = czm_ray(vec3(0.0), direction);\n\
11
+ czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);\n\
12
+ if (!czm_isEmpty(intersection))\n\
13
+ {\n\
14
+ gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);\n\
15
+ }\n\
16
+ else\n\
17
+ {\n\
18
+ discard;\n\
19
+ }\n\
20
+ }\n\
21
+ ";
22
+ });
@@ -0,0 +1,29 @@
1
+ uniform vec3 u_color;
2
+
3
+ varying vec2 v_textureCoordinates;
4
+
5
+ void main()
6
+ {
7
+ // TODO: make arbitrary ellipsoid
8
+ czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();
9
+ vec3 direction = normalize(czm_windowToEyeCoordinates(gl_FragCoord).xyz);
10
+ czm_ray ray = czm_ray(vec3(0.0), direction);
11
+ czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);
12
+
13
+ if (!czm_isEmpty(intersection))
14
+ {
15
+ vec3 positionEC = czm_pointAlongRay(ray, intersection.start);
16
+ vec3 positionMC = (czm_inverseModelView * vec4(positionEC, 1.0)).xyz;
17
+
18
+ vec3 normalMC = normalize(czm_geodeticSurfaceNormal(positionMC, vec3(0.0), vec3(1.0)));
19
+ vec3 normalEC = normalize(czm_normal * normalMC);
20
+
21
+ vec3 startDayColor = u_color;
22
+
23
+ gl_FragColor = vec4(startDayColor, 1.0);
24
+ }
25
+ else
26
+ {
27
+ discard;
28
+ }
29
+ }
@@ -0,0 +1,28 @@
1
+ // This file is automatically rebuilt by the Cesium build process.
2
+ /*global define*/
3
+ define(function() {
4
+ "use strict";
5
+ return "uniform vec3 u_color;\n\
6
+ varying vec2 v_textureCoordinates;\n\
7
+ void main()\n\
8
+ {\n\
9
+ czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();\n\
10
+ vec3 direction = normalize(czm_windowToEyeCoordinates(gl_FragCoord).xyz);\n\
11
+ czm_ray ray = czm_ray(vec3(0.0), direction);\n\
12
+ czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);\n\
13
+ if (!czm_isEmpty(intersection))\n\
14
+ {\n\
15
+ vec3 positionEC = czm_pointAlongRay(ray, intersection.start);\n\
16
+ vec3 positionMC = (czm_inverseModelView * vec4(positionEC, 1.0)).xyz;\n\
17
+ vec3 normalMC = normalize(czm_geodeticSurfaceNormal(positionMC, vec3(0.0), vec3(1.0)));\n\
18
+ vec3 normalEC = normalize(czm_normal * normalMC);\n\
19
+ vec3 startDayColor = u_color;\n\
20
+ gl_FragColor = vec4(startDayColor, 1.0);\n\
21
+ }\n\
22
+ else\n\
23
+ {\n\
24
+ discard;\n\
25
+ }\n\
26
+ }\n\
27
+ ";
28
+ });
@@ -0,0 +1,88 @@
1
+ attribute vec3 position3D;
2
+ attribute vec2 textureCoordinates;
3
+
4
+ uniform float u_morphTime;
5
+
6
+ uniform vec3 u_center3D;
7
+ uniform mat4 u_modifiedModelView;
8
+ uniform vec4 u_tileExtent;
9
+
10
+ // Uniforms for 2D Mercator projection
11
+ uniform vec2 u_southAndNorthLatitude;
12
+ uniform vec3 u_southMercatorYLowAndHighAndOneOverHeight;
13
+
14
+ varying vec3 v_positionMC;
15
+ varying vec3 v_positionEC;
16
+
17
+ varying vec2 v_textureCoordinates;
18
+
19
+ // These functions are generated at runtime.
20
+ vec4 getPosition(vec3 position3DWC);
21
+ float get2DYPositionFraction();
22
+
23
+ vec4 getPosition3DMode(vec3 position3DWC)
24
+ {
25
+ return czm_projection * (u_modifiedModelView * vec4(position3D, 1.0));
26
+ }
27
+
28
+ float get2DMercatorYPositionFraction()
29
+ {
30
+ // The width of a tile at level 11, in radians and assuming a single root tile, is
31
+ // 2.0 * czm_pi / pow(2.0, 11.0)
32
+ // We want to just linearly interpolate the 2D position from the texture coordinates
33
+ // when we're at this level or higher. The constant below is the expression
34
+ // above evaluated and then rounded up at the 4th significant digit.
35
+ const float maxTileWidth = 0.003068;
36
+ float positionFraction = textureCoordinates.y;
37
+ float southLatitude = u_southAndNorthLatitude.x;
38
+ float northLatitude = u_southAndNorthLatitude.y;
39
+ if (northLatitude - southLatitude > maxTileWidth)
40
+ {
41
+ float southMercatorYLow = u_southMercatorYLowAndHighAndOneOverHeight.x;
42
+ float southMercatorYHigh = u_southMercatorYLowAndHighAndOneOverHeight.y;
43
+ float oneOverMercatorHeight = u_southMercatorYLowAndHighAndOneOverHeight.z;
44
+
45
+ float currentLatitude = mix(southLatitude, northLatitude, textureCoordinates.y);
46
+ currentLatitude = clamp(currentLatitude, -czm_webMercatorMaxLatitude, czm_webMercatorMaxLatitude);
47
+ positionFraction = czm_latitudeToWebMercatorFraction(currentLatitude, southMercatorYLow, southMercatorYHigh, oneOverMercatorHeight);
48
+ }
49
+ return positionFraction;
50
+ }
51
+
52
+ float get2DGeographicYPositionFraction()
53
+ {
54
+ return textureCoordinates.y;
55
+ }
56
+
57
+ vec4 getPosition2DMode(vec3 position3DWC)
58
+ {
59
+ float yPositionFraction = get2DYPositionFraction();
60
+ vec4 rtcPosition2D = vec4(0.0, mix(u_tileExtent.st, u_tileExtent.pq, vec2(textureCoordinates.x, yPositionFraction)), 1.0);
61
+ return czm_projection * (u_modifiedModelView * rtcPosition2D);
62
+ }
63
+
64
+ vec4 getPositionColumbusViewMode(vec3 position3DWC)
65
+ {
66
+ return getPosition2DMode(position3DWC);
67
+ }
68
+
69
+ vec4 getPositionMorphingMode(vec3 position3DWC)
70
+ {
71
+ // We do not do RTC while morphing, so there is potential for jitter.
72
+ // This is unlikely to be noticable, though.
73
+ float yPositionFraction = get2DYPositionFraction();
74
+ vec3 position2DWC = vec3(0.0, mix(u_tileExtent.st, u_tileExtent.pq, vec2(textureCoordinates.x, yPositionFraction)));
75
+ vec4 morphPosition = czm_columbusViewMorph(position2DWC, position3DWC, u_morphTime);
76
+ return czm_modelViewProjection * morphPosition;
77
+ }
78
+
79
+ void main()
80
+ {
81
+ vec3 position3DWC = position3D + u_center3D;
82
+
83
+ gl_Position = getPosition(position3DWC);
84
+
85
+ v_positionEC = (czm_modelView * vec4(position3DWC, 1.0)).xyz;
86
+ v_positionMC = position3DWC; // position in model coordinates
87
+ v_textureCoordinates = textureCoordinates;
88
+ }
@@ -0,0 +1,69 @@
1
+ // This file is automatically rebuilt by the Cesium build process.
2
+ /*global define*/
3
+ define(function() {
4
+ "use strict";
5
+ return "attribute vec3 position3D;\n\
6
+ attribute vec2 textureCoordinates;\n\
7
+ uniform float u_morphTime;\n\
8
+ uniform vec3 u_center3D;\n\
9
+ uniform mat4 u_modifiedModelView;\n\
10
+ uniform vec4 u_tileExtent;\n\
11
+ uniform vec2 u_southAndNorthLatitude;\n\
12
+ uniform vec3 u_southMercatorYLowAndHighAndOneOverHeight;\n\
13
+ varying vec3 v_positionMC;\n\
14
+ varying vec3 v_positionEC;\n\
15
+ varying vec2 v_textureCoordinates;\n\
16
+ vec4 getPosition(vec3 position3DWC);\n\
17
+ float get2DYPositionFraction();\n\
18
+ vec4 getPosition3DMode(vec3 position3DWC)\n\
19
+ {\n\
20
+ return czm_projection * (u_modifiedModelView * vec4(position3D, 1.0));\n\
21
+ }\n\
22
+ float get2DMercatorYPositionFraction()\n\
23
+ {\n\
24
+ const float maxTileWidth = 0.003068;\n\
25
+ float positionFraction = textureCoordinates.y;\n\
26
+ float southLatitude = u_southAndNorthLatitude.x;\n\
27
+ float northLatitude = u_southAndNorthLatitude.y;\n\
28
+ if (northLatitude - southLatitude > maxTileWidth)\n\
29
+ {\n\
30
+ float southMercatorYLow = u_southMercatorYLowAndHighAndOneOverHeight.x;\n\
31
+ float southMercatorYHigh = u_southMercatorYLowAndHighAndOneOverHeight.y;\n\
32
+ float oneOverMercatorHeight = u_southMercatorYLowAndHighAndOneOverHeight.z;\n\
33
+ float currentLatitude = mix(southLatitude, northLatitude, textureCoordinates.y);\n\
34
+ currentLatitude = clamp(currentLatitude, -czm_webMercatorMaxLatitude, czm_webMercatorMaxLatitude);\n\
35
+ positionFraction = czm_latitudeToWebMercatorFraction(currentLatitude, southMercatorYLow, southMercatorYHigh, oneOverMercatorHeight);\n\
36
+ }\n\
37
+ return positionFraction;\n\
38
+ }\n\
39
+ float get2DGeographicYPositionFraction()\n\
40
+ {\n\
41
+ return textureCoordinates.y;\n\
42
+ }\n\
43
+ vec4 getPosition2DMode(vec3 position3DWC)\n\
44
+ {\n\
45
+ float yPositionFraction = get2DYPositionFraction();\n\
46
+ vec4 rtcPosition2D = vec4(0.0, mix(u_tileExtent.st, u_tileExtent.pq, vec2(textureCoordinates.x, yPositionFraction)), 1.0);\n\
47
+ return czm_projection * (u_modifiedModelView * rtcPosition2D);\n\
48
+ }\n\
49
+ vec4 getPositionColumbusViewMode(vec3 position3DWC)\n\
50
+ {\n\
51
+ return getPosition2DMode(position3DWC);\n\
52
+ }\n\
53
+ vec4 getPositionMorphingMode(vec3 position3DWC)\n\
54
+ {\n\
55
+ float yPositionFraction = get2DYPositionFraction();\n\
56
+ vec3 position2DWC = vec3(0.0, mix(u_tileExtent.st, u_tileExtent.pq, vec2(textureCoordinates.x, yPositionFraction)));\n\
57
+ vec4 morphPosition = czm_columbusViewMorph(position2DWC, position3DWC, u_morphTime);\n\
58
+ return czm_modelViewProjection * morphPosition;\n\
59
+ }\n\
60
+ void main()\n\
61
+ {\n\
62
+ vec3 position3DWC = position3D + u_center3D;\n\
63
+ gl_Position = getPosition(position3DWC);\n\
64
+ v_positionEC = (czm_modelView * vec4(position3DWC, 1.0)).xyz;\n\
65
+ v_positionMC = position3DWC;\n\
66
+ v_textureCoordinates = textureCoordinates;\n\
67
+ }\n\
68
+ ";
69
+ });
@@ -0,0 +1,9 @@
1
+ attribute vec4 position;
2
+
3
+ varying vec4 positionEC;
4
+
5
+ void main()
6
+ {
7
+ positionEC = czm_modelView * position;
8
+ gl_Position = czm_projection * positionEC;
9
+ }
@@ -0,0 +1,13 @@
1
+ // This file is automatically rebuilt by the Cesium build process.
2
+ /*global define*/
3
+ define(function() {
4
+ "use strict";
5
+ return "attribute vec4 position;\n\
6
+ varying vec4 positionEC;\n\
7
+ void main()\n\
8
+ {\n\
9
+ positionEC = czm_modelView * position;\n\
10
+ gl_Position = czm_projection * positionEC;\n\
11
+ }\n\
12
+ ";
13
+ });
@@ -0,0 +1,12 @@
1
+ attribute vec4 position;
2
+
3
+ varying vec2 v_textureCoordinates;
4
+
5
+ void main()
6
+ {
7
+ float x = (position.x - czm_viewport.x) / czm_viewport.z;
8
+ float y = (position.y - czm_viewport.y) / czm_viewport.w;
9
+ v_textureCoordinates = vec2(x, y);
10
+
11
+ gl_Position = czm_viewportOrthographic * position;
12
+ }
@@ -0,0 +1,15 @@
1
+ // This file is automatically rebuilt by the Cesium build process.
2
+ /*global define*/
3
+ define(function() {
4
+ "use strict";
5
+ return "attribute vec4 position;\n\
6
+ varying vec2 v_textureCoordinates;\n\
7
+ void main()\n\
8
+ {\n\
9
+ float x = (position.x - czm_viewport.x) / czm_viewport.z;\n\
10
+ float y = (position.y - czm_viewport.y) / czm_viewport.w;\n\
11
+ v_textureCoordinates = vec2(x, y);\n\
12
+ gl_Position = czm_viewportOrthographic * position;\n\
13
+ }\n\
14
+ ";
15
+ });
@@ -0,0 +1,448 @@
1
+ #ifdef GL_OES_standard_derivatives
2
+ #extension GL_OES_standard_derivatives : enable
3
+ #endif
4
+
5
+ uniform float u_sensorRadius;
6
+ uniform float u_outerHalfAngle;
7
+ uniform float u_innerHalfAngle;
8
+ uniform float u_maximumClockAngle;
9
+ uniform float u_minimumClockAngle;
10
+ uniform bool u_showIntersection;
11
+ uniform vec4 u_pickColor;
12
+
13
+ varying vec3 v_positionEC;
14
+ varying vec3 v_sensorVertexWC;
15
+ varying vec3 v_sensorVertexEC;
16
+ varying vec3 v_sensorAxisEC;
17
+
18
+ #ifndef RENDER_FOR_PICK
19
+
20
+ czm_materialInput getMaterialInput(float sensorRadius, vec3 pointEC, vec3 normalEC)
21
+ {
22
+ czm_materialInput materialInput;
23
+
24
+ vec3 pointMC = (czm_inverseModelView * vec4(pointEC, 1.0)).xyz;
25
+ materialInput.positionToEyeEC = -v_positionEC;
26
+ materialInput.normalEC = normalEC;
27
+
28
+ materialInput.st = sensor2dTextureCoordinates(sensorRadius, pointMC);
29
+ materialInput.str = pointMC / sensorRadius;
30
+ materialInput.positionMC = pointMC;
31
+
32
+ return materialInput;
33
+ }
34
+ vec4 getOuterColor(float sensorRadius, vec3 pointEC, vec3 normalEC)
35
+ {
36
+ czm_materialInput materialInput = getMaterialInput(sensorRadius, pointEC, normalEC);
37
+ czm_material material = czm_getOuterMaterial(materialInput);
38
+
39
+ //Final
40
+ vec3 positionToEyeEC = normalize(-v_positionEC);
41
+
42
+ return czm_phong(positionToEyeEC, material);
43
+ }
44
+
45
+ vec4 getInnerColor(float sensorRadius, vec3 pointEC, vec3 normalEC)
46
+ {
47
+ czm_materialInput materialInput = getMaterialInput(sensorRadius, pointEC, normalEC);
48
+ czm_material material = czm_getInnerMaterial(materialInput);
49
+
50
+ //Final
51
+ vec3 positionToEyeEC = normalize(-v_positionEC);
52
+
53
+ return czm_phong(positionToEyeEC, material);
54
+ }
55
+
56
+ vec4 getCapColor(float sensorRadius, vec3 pointEC, vec3 normalEC)
57
+ {
58
+ czm_materialInput materialInput = getMaterialInput(sensorRadius, pointEC, normalEC);
59
+ czm_material material = czm_getCapMaterial(materialInput);
60
+
61
+ //Final
62
+ vec3 positionToEyeEC = normalize(-v_positionEC);
63
+
64
+ return czm_phong(positionToEyeEC, material);
65
+ }
66
+
67
+ vec4 getSilhouetteColor(float sensorRadius, vec3 pointEC, vec3 normalEC)
68
+ {
69
+ czm_materialInput materialInput = getMaterialInput(sensorRadius, pointEC, normalEC);
70
+ czm_material material = czm_getSilhouetteMaterial(materialInput);
71
+
72
+ //Final
73
+ vec3 positionToEyeEC = normalize(-v_positionEC);
74
+
75
+ return czm_phong(positionToEyeEC, material);
76
+ }
77
+
78
+ #endif
79
+
80
+ bool czm_isOnOrNear(float d, czm_raySegment interval, float epsilon)
81
+ {
82
+ bool answer = (czm_equalsEpsilon(d, interval.start, epsilon) || czm_equalsEpsilon(d, interval.stop, epsilon));
83
+ return answer;
84
+ }
85
+
86
+ bool czm_isOnOrNear(float d, czm_raySegmentCollection coneIntervals, float epsilon)
87
+ {
88
+ // Can have a maximum of two ray segments from cone intersection.
89
+ bool answer = (coneIntervals.count > 0 && (czm_isOnOrNear(d, coneIntervals.intervals[0], epsilon)))
90
+ || (coneIntervals.count > 1 && (czm_isOnOrNear(d, coneIntervals.intervals[1], epsilon)));
91
+ return answer;
92
+ }
93
+
94
+ bool czm_isOnOrNearSensor(float d, czm_raySegmentCollection outerIntervals, czm_raySegmentCollection innerIntervals, float epsilon)
95
+ {
96
+ bool answer = czm_isOnOrNear(d, outerIntervals, epsilon) || czm_isOnOrNear(d, innerIntervals, epsilon);
97
+ return answer;
98
+ }
99
+
100
+ bool ellipsoidSensorIntersection(czm_raySegment sphereInterval,
101
+ czm_raySegmentCollection outerIntervals, czm_raySegmentCollection innerIntervals,
102
+ czm_raySegmentCollection clockIntervals,
103
+ czm_raySegment ellipsoidInterval, czm_raySegment silhouetteHalfspaceInterval, czm_raySegmentCollection solid)
104
+ {
105
+ if (czm_isEmpty(ellipsoidInterval))
106
+ {
107
+ return false;
108
+ }
109
+
110
+ float t = ellipsoidInterval.start;
111
+
112
+ #ifdef GL_OES_standard_derivatives
113
+ // TODO: This seems to be too aggressive in some areas, and too conservative in others
114
+ float epsilon = max(abs(dFdx(t)), abs(dFdy(t)));
115
+ #else
116
+ // TODO: Don't hardcode this.
117
+ float epsilon = t / 500.0;
118
+ #endif
119
+
120
+ float width = 2.0; // TODO: Expose as a uniform
121
+ epsilon *= width;
122
+
123
+ // TODO: Rework this once the ray segments have associated boundary surfaces with their start/stop values.
124
+ if (solid.count > 0)
125
+ {
126
+ float d = solid.intervals[0].start;
127
+ if (d == ellipsoidInterval.start
128
+ && (czm_isOnOrNear(d, silhouetteHalfspaceInterval, epsilon)
129
+ || czm_isOnOrNear(d, sphereInterval, epsilon)
130
+ || czm_isOnOrNear(d, clockIntervals, epsilon)
131
+ || czm_isOnOrNearSensor(d, outerIntervals, innerIntervals, epsilon))) return true;
132
+ d = solid.intervals[0].stop;
133
+ if (d == ellipsoidInterval.start
134
+ && (czm_isOnOrNear(d, silhouetteHalfspaceInterval, epsilon)
135
+ || czm_isOnOrNear(d, sphereInterval, epsilon)
136
+ || czm_isOnOrNear(d, clockIntervals, epsilon)
137
+ || czm_isOnOrNearSensor(d, outerIntervals, innerIntervals, epsilon))) return true;
138
+
139
+ if (solid.count > 1)
140
+ {
141
+ d = solid.intervals[1].start;
142
+ if (d == ellipsoidInterval.start
143
+ && (czm_isOnOrNear(d, silhouetteHalfspaceInterval, epsilon)
144
+ || czm_isOnOrNear(d, sphereInterval, epsilon)
145
+ || czm_isOnOrNear(d, clockIntervals, epsilon)
146
+ || czm_isOnOrNearSensor(d, outerIntervals, innerIntervals, epsilon))) return true;
147
+ d = solid.intervals[1].stop;
148
+ if (d == ellipsoidInterval.start
149
+ && (czm_isOnOrNear(d, silhouetteHalfspaceInterval, epsilon)
150
+ || czm_isOnOrNear(d, sphereInterval, epsilon)
151
+ || czm_isOnOrNear(d, clockIntervals, epsilon)
152
+ || czm_isOnOrNearSensor(d, outerIntervals, innerIntervals, epsilon))) return true;
153
+ }
154
+
155
+ return false;
156
+ }
157
+ else
158
+ {
159
+ false;
160
+ }
161
+ }
162
+
163
+ vec4 shade(
164
+ czm_ray ray,
165
+ float nearestRayTime,
166
+ czm_sphere sphere,
167
+ czm_cone outerCone,
168
+ czm_cone innerCone,
169
+ czm_halfspace maxClock,
170
+ czm_halfspace minClock,
171
+ czm_ellipsoidSilhouetteCone silhouetteCone,
172
+ czm_ellipsoidSilhouetteHalfspace silhouetteHalfspace,
173
+ czm_raySegment sphereInterval,
174
+ czm_raySegmentCollection outerConeInterval,
175
+ czm_raySegmentCollection innerConeInterval,
176
+ czm_raySegment maxClockInterval,
177
+ czm_raySegment minClockInterval,
178
+ czm_raySegmentCollection clockIntervals,
179
+ czm_raySegment silhouetteConeInterval,
180
+ czm_raySegment silhouetteHalfspaceInterval,
181
+ czm_raySegment ellipsoidInterval,
182
+ czm_raySegmentCollection intervals)
183
+ {
184
+ #ifdef RENDER_FOR_PICK
185
+ return u_pickColor;
186
+ #else
187
+ vec3 nearestPoint = czm_pointAlongRay(ray, nearestRayTime);
188
+
189
+ // Visualization TODO: Segment stop surface can be used to determine which pixels to "fill"
190
+ // in order to indicate projection onto the ellipsoid surface.
191
+
192
+ if (u_showIntersection && ellipsoidSensorIntersection(sphereInterval,
193
+ outerConeInterval, innerConeInterval, clockIntervals,
194
+ ellipsoidInterval, silhouetteHalfspaceInterval, intervals))
195
+ {
196
+ return getIntersectionColor(u_sensorRadius, nearestPoint);
197
+ }
198
+
199
+ vec3 positionToEyeEC = -ray.direction; // normalized position-to-eye vector in eye coordinates
200
+ vec3 czm_sunDirectionEC = czm_sunDirectionEC; // normalized position-to-sun vector in eye coordinates
201
+
202
+ for (int i = 0; i < czm_raySegmentCollectionCapacity; ++i)
203
+ {
204
+ if (i < outerConeInterval.count &&
205
+ ((nearestRayTime == outerConeInterval.intervals[i].start) || // Viewer outside sensor CSG volume
206
+ (nearestRayTime == outerConeInterval.intervals[i].stop))) // Viewer inside
207
+ {
208
+ // Shade outer cone
209
+ vec3 normal = czm_coneNormal(outerCone, nearestPoint);
210
+ normal = mix(normal, -normal, step(normal.z, 0.0)); // Normal facing viewer
211
+ return getOuterColor(u_sensorRadius, nearestPoint, normal);
212
+ }
213
+ }
214
+
215
+ for (int i = 0; i < czm_raySegmentCollectionCapacity; ++i)
216
+ {
217
+ if (i < innerConeInterval.count &&
218
+ ((nearestRayTime == innerConeInterval.intervals[i].start) || // Viewer outside sensor CSG volume
219
+ (nearestRayTime == innerConeInterval.intervals[i].stop))) // Viewer inside
220
+ {
221
+ // Shade inner cone
222
+ vec3 normal = -czm_coneNormal(innerCone, nearestPoint);
223
+ normal = mix(normal, -normal, step(normal.z, 0.0)); // Normal facing viewer
224
+ return getInnerColor(u_sensorRadius, nearestPoint, normal);
225
+ }
226
+ }
227
+
228
+ if ((nearestRayTime == sphereInterval.start) || // Viewer outside sensor CSG volume
229
+ (nearestRayTime == sphereInterval.stop)) // Viewer inside
230
+ {
231
+ // Shade top cap
232
+ vec3 normal = czm_sphereNormal(sphere, nearestPoint);
233
+ normal = mix(normal, -normal, step(normal.z, 0.0)); // Normal facing viewer
234
+ return getCapColor(u_sensorRadius, nearestPoint, normal);
235
+ }
236
+
237
+ if ((nearestRayTime == maxClockInterval.start) || // Viewer outside sensor CSG volume
238
+ (nearestRayTime == maxClockInterval.stop)) // Viewer inside
239
+ {
240
+ // Shade top cap
241
+ vec3 normal = maxClock.normal;
242
+ normal = mix(normal, -normal, step(normal.z, 0.0)); // Normal facing viewer
243
+ return getOuterColor(u_sensorRadius, nearestPoint, normal);
244
+ }
245
+
246
+ if ((nearestRayTime == minClockInterval.start) || // Viewer outside sensor CSG volume
247
+ (nearestRayTime == minClockInterval.stop)) // Viewer inside
248
+ {
249
+ // Shade top cap
250
+ vec3 normal = minClock.normal;
251
+ normal = mix(normal, -normal, step(normal.z, 0.0)); // Normal facing viewer
252
+ return getOuterColor(u_sensorRadius, nearestPoint, normal);
253
+ }
254
+
255
+ if ((nearestRayTime == silhouetteConeInterval.start) || // Viewer outside sensor CSG volume
256
+ (nearestRayTime == silhouetteConeInterval.stop)) // Viewer inside
257
+ {
258
+ vec3 normal = czm_ellipsoidSilhouetteConeNormal(silhouetteCone, nearestPoint); // Normal is already inverted.
259
+ normal = mix(normal, -normal, step(normal.z, 0.0)); // Normal facing viewer
260
+ return getSilhouetteColor(u_sensorRadius, nearestPoint, normal);
261
+ }
262
+
263
+ // Should never happen
264
+ return vec4(1.0, 0.0, 0.0, 1.0);
265
+ #endif
266
+ }
267
+
268
+ vec4 shade(
269
+ czm_ray ray,
270
+ float nearestRayTime,
271
+ czm_sphere sphere,
272
+ czm_cone outerCone,
273
+ czm_cone innerCone,
274
+ czm_halfspace maxClock,
275
+ czm_halfspace minClock,
276
+ czm_raySegment sphereInterval,
277
+ czm_raySegmentCollection outerConeInterval,
278
+ czm_raySegmentCollection innerConeInterval,
279
+ czm_raySegment maxClockInterval,
280
+ czm_raySegment minClockInterval,
281
+ czm_raySegmentCollection intervals)
282
+ {
283
+ #ifdef RENDER_FOR_PICK
284
+ return u_pickColor;
285
+ #else
286
+ vec3 nearestPoint = czm_pointAlongRay(ray, nearestRayTime);
287
+
288
+ vec3 positionToEyeEC = -ray.direction; // normalized position-to-eye vector in eye coordinates
289
+
290
+ for (int i = 0; i < czm_raySegmentCollectionCapacity; ++i)
291
+ {
292
+ if (i < outerConeInterval.count &&
293
+ ((nearestRayTime == outerConeInterval.intervals[i].start) || // Viewer outside sensor CSG volume
294
+ (nearestRayTime == outerConeInterval.intervals[i].stop))) // Viewer inside
295
+ {
296
+ // Shade outer cone
297
+ vec3 normal = czm_coneNormal(outerCone, nearestPoint);
298
+ normal = mix(normal, -normal, step(normal.z, 0.0)); // Normal facing viewer
299
+ return getOuterColor(u_sensorRadius, nearestPoint, normal);
300
+ }
301
+ }
302
+
303
+ for (int i = 0; i < czm_raySegmentCollectionCapacity; ++i)
304
+ {
305
+ if (i < innerConeInterval.count &&
306
+ ((nearestRayTime == innerConeInterval.intervals[i].start) || // Viewer outside sensor CSG volume
307
+ (nearestRayTime == innerConeInterval.intervals[i].stop))) // Viewer inside
308
+ {
309
+ // Shade inner cone
310
+ vec3 normal = -czm_coneNormal(innerCone, nearestPoint);
311
+ normal = mix(normal, -normal, step(normal.z, 0.0)); // Normal facing viewer
312
+ return getInnerColor(u_sensorRadius, nearestPoint, normal);
313
+ }
314
+ }
315
+
316
+ if ((nearestRayTime == sphereInterval.start) || // Viewer outside sensor CSG volume
317
+ (nearestRayTime == sphereInterval.stop)) // Viewer inside
318
+ {
319
+ // Shade top cap
320
+ vec3 normal = czm_sphereNormal(sphere, nearestPoint);
321
+ normal = mix(normal, -normal, step(normal.z, 0.0)); // Normal facing viewer
322
+ return getCapColor(u_sensorRadius, nearestPoint, normal);
323
+ }
324
+
325
+ if ((nearestRayTime == maxClockInterval.start) || // Viewer outside sensor CSG volume
326
+ (nearestRayTime == maxClockInterval.stop)) // Viewer inside
327
+ {
328
+ // Shade top cap
329
+ vec3 normal = maxClock.normal;
330
+ normal = mix(normal, -normal, step(normal.z, 0.0)); // Normal facing viewer
331
+ return getOuterColor(u_sensorRadius, nearestPoint, normal);
332
+ }
333
+
334
+ if ((nearestRayTime == minClockInterval.start) || // Viewer outside sensor CSG volume
335
+ (nearestRayTime == minClockInterval.stop)) // Viewer inside
336
+ {
337
+ // Shade top cap
338
+ vec3 normal = minClock.normal;
339
+ normal = mix(normal, -normal, step(normal.z, 0.0)); // Normal facing viewer
340
+ return getOuterColor(u_sensorRadius, nearestPoint, normal);
341
+ }
342
+
343
+ // Should never happen
344
+ return vec4(1.0, 0.0, 0.0, 1.0);
345
+ #endif
346
+ }
347
+
348
+ void main()
349
+ {
350
+ czm_ray ray = czm_ray(vec3(0.0), normalize(v_positionEC)); // Ray from eye to fragment in eye coordinates
351
+
352
+ // Determine the sensor primitive intervals.
353
+
354
+ czm_sphere sphere = czm_sphere(v_sensorVertexEC, u_sensorRadius);
355
+ czm_raySegment sphereInterval = czm_raySphereIntersectionInterval(ray, sphere);
356
+ if (czm_isEmpty(sphereInterval))
357
+ {
358
+ discard;
359
+ }
360
+
361
+ vec3 coneAxisEC = normalize(v_sensorAxisEC);
362
+
363
+ czm_cone outerCone = czm_coneNew(v_sensorVertexEC, coneAxisEC, u_outerHalfAngle);
364
+ czm_raySegmentCollection outerConeInterval = czm_rayConeIntersectionInterval(ray, outerCone);
365
+ if (outerConeInterval.count == 0)
366
+ {
367
+ discard;
368
+ }
369
+
370
+ czm_cone innerCone = czm_coneNew(v_sensorVertexEC, coneAxisEC, u_innerHalfAngle);
371
+ czm_raySegmentCollection innerConeInterval = czm_rayConeIntersectionInterval(ray, innerCone);
372
+
373
+ // Build up the CSG representation of the sensor.
374
+ czm_raySegmentCollection difference = (innerConeInterval.count == 0) ? outerConeInterval : czm_subtraction(outerConeInterval, innerConeInterval);
375
+ if (difference.count == 0)
376
+ {
377
+ discard;
378
+ }
379
+ czm_raySegmentCollection capped = czm_intersection(difference, sphereInterval);
380
+ if (capped.count == 0)
381
+ {
382
+ discard;
383
+ }
384
+
385
+ vec3 maxNormal = normalize((czm_modelView * vec4(-sin(u_maximumClockAngle), cos(u_maximumClockAngle), 0.0, 0.0)).xyz);
386
+ czm_halfspace maxClock = czm_halfspace(v_sensorVertexEC, maxNormal);
387
+ czm_raySegment maxClockInterval = czm_rayHalfspaceIntersectionInterval(ray, maxClock);
388
+
389
+ vec3 minNormal = normalize((czm_modelView * vec4(sin(u_minimumClockAngle), -cos(u_minimumClockAngle), 0.0, 0.0)).xyz);
390
+ czm_halfspace minClock = czm_halfspace(v_sensorVertexEC, minNormal);
391
+ czm_raySegment minClockInterval = czm_rayHalfspaceIntersectionInterval(ray, minClock);
392
+
393
+ czm_raySegmentCollection clockIntervals = ((u_maximumClockAngle - u_minimumClockAngle) > czm_pi)
394
+ ? (czm_isEmpty(maxClockInterval)
395
+ ? (czm_isEmpty(minClockInterval) ? czm_raySegmentCollectionNew() : czm_raySegmentCollectionNew(minClockInterval))
396
+ : (czm_isEmpty(minClockInterval) ? czm_raySegmentCollectionNew(maxClockInterval) : czm_union(maxClockInterval, minClockInterval)))
397
+ : ((czm_isEmpty(maxClockInterval) || czm_isEmpty(minClockInterval)) ? czm_raySegmentCollectionNew() : czm_raySegmentCollectionNew(czm_intersection(maxClockInterval, minClockInterval)));
398
+
399
+ czm_raySegmentCollection sensor = (clockIntervals.count == 0) ? czm_raySegmentCollectionNew() : czm_intersection(capped, clockIntervals);
400
+ if (sensor.count == 0)
401
+ {
402
+ discard;
403
+ }
404
+
405
+ // Determine the obstruction primitive intervals.
406
+
407
+ czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();
408
+
409
+ czm_ellipsoidSilhouetteCone silhouetteCone = czm_ellipsoidSilhouetteConeNew(ellipsoid, v_sensorVertexEC);
410
+ czm_raySegment silhouetteConeInterval = czm_rayEllipsoidSilhouetteConeIntersectionInterval(ray, silhouetteCone);
411
+
412
+ if (czm_isEmpty(silhouetteConeInterval))
413
+ {
414
+ gl_FragColor = shade(ray, sensor.intervals[0].start,
415
+ sphere, outerCone, innerCone, maxClock, minClock,
416
+ sphereInterval, outerConeInterval, innerConeInterval, maxClockInterval, minClockInterval,
417
+ sensor);
418
+ }
419
+ else
420
+ {
421
+ czm_ellipsoidSilhouetteHalfspace silhouetteHalfspace = czm_ellipsoidSilhouetteHalfspaceNew(ellipsoid, v_sensorVertexEC);
422
+ czm_raySegment silhouetteHalfspaceInterval = czm_rayEllipsoidSilhouetteHalfspaceIntersectionInterval(ray, silhouetteHalfspace);
423
+
424
+ // Build up the CSG representation of the composite.
425
+ czm_raySegment temp = (czm_isEmpty(silhouetteHalfspaceInterval)) ? czm_emptyRaySegment : czm_intersection(silhouetteConeInterval, silhouetteHalfspaceInterval);
426
+ czm_raySegmentCollection stuff = (czm_isEmpty(temp)) ? sensor : czm_subtraction(sensor, temp);
427
+ if (stuff.count == 0)
428
+ {
429
+ discard;
430
+ }
431
+
432
+ czm_raySegment ellipsoidInterval = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);
433
+ czm_raySegmentCollection result = (czm_isEmpty(ellipsoidInterval)) ? stuff : czm_subtraction(stuff, ellipsoidInterval);
434
+
435
+ if ((result.count == 0)
436
+ || (!czm_isEmpty(ellipsoidInterval) && (result.intervals[0].start > ellipsoidInterval.start))) // Fails depth test with ellipsoid
437
+ {
438
+ discard;
439
+ }
440
+
441
+ gl_FragColor = shade(ray, result.intervals[0].start,
442
+ sphere, outerCone, innerCone, maxClock, minClock,
443
+ silhouetteCone, silhouetteHalfspace,
444
+ sphereInterval, outerConeInterval, innerConeInterval, maxClockInterval, minClockInterval, clockIntervals,
445
+ silhouetteConeInterval, silhouetteHalfspaceInterval, ellipsoidInterval,
446
+ result);
447
+ }
448
+ }