cesium 0.13.2 → 0.14.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 (348) hide show
  1. data/app/assets/javascripts/Cesium.js +2 -2
  2. data/app/assets/javascripts/Core/Clock.js +81 -81
  3. data/app/assets/javascripts/Core/ClockRange.js +5 -3
  4. data/app/assets/javascripts/Core/ClockStep.js +7 -1
  5. data/app/assets/javascripts/Core/Event.js +12 -11
  6. data/app/assets/javascripts/Core/JulianDate.js +16 -0
  7. data/app/assets/javascripts/DynamicScene/CompositeDynamicObjectCollection.js +1 -1
  8. data/app/assets/javascripts/DynamicScene/DynamicBillboardVisualizer.js +1 -1
  9. data/app/assets/javascripts/DynamicScene/DynamicConeVisualizer.js +1 -1
  10. data/app/assets/javascripts/DynamicScene/DynamicConeVisualizerUsingCustomSensor.js +1 -1
  11. data/app/assets/javascripts/DynamicScene/DynamicEllipsoidVisualizer.js +1 -1
  12. data/app/assets/javascripts/DynamicScene/DynamicLabelVisualizer.js +1 -1
  13. data/app/assets/javascripts/DynamicScene/DynamicPathVisualizer.js +1 -1
  14. data/app/assets/javascripts/DynamicScene/DynamicPointVisualizer.js +1 -1
  15. data/app/assets/javascripts/DynamicScene/DynamicPolygonVisualizer.js +1 -1
  16. data/app/assets/javascripts/DynamicScene/DynamicPolylineVisualizer.js +1 -1
  17. data/app/assets/javascripts/DynamicScene/DynamicPyramidVisualizer.js +1 -1
  18. data/app/assets/javascripts/Renderer/ClearCommand.js +1 -1
  19. data/app/assets/javascripts/Renderer/Context.js +23 -0
  20. data/app/assets/javascripts/Renderer/DrawCommand.js +1 -1
  21. data/app/assets/javascripts/Scene/BillboardCollection.js +14 -24
  22. data/app/assets/javascripts/Scene/EllipsoidPrimitive.js +8 -31
  23. data/app/assets/javascripts/Scene/PerformanceDisplay.js +13 -4
  24. data/app/assets/javascripts/Scene/Tile.js +11 -6
  25. data/app/assets/javascripts/Scene/ViewportQuad.js +21 -36
  26. data/app/assets/javascripts/Shaders/BillboardCollectionFS.js +15 -11
  27. data/app/assets/javascripts/Shaders/BillboardCollectionVS.js +47 -27
  28. data/app/assets/javascripts/Shaders/BuiltinFunctions.js +886 -228
  29. data/app/assets/javascripts/Shaders/CentralBodyFS.js +173 -40
  30. data/app/assets/javascripts/Shaders/CentralBodyFSDepth.js +17 -14
  31. data/app/assets/javascripts/Shaders/CentralBodyFSPole.js +25 -19
  32. data/app/assets/javascripts/Shaders/CentralBodyVS.js +61 -31
  33. data/app/assets/javascripts/Shaders/CentralBodyVSDepth.js +5 -4
  34. data/app/assets/javascripts/Shaders/CentralBodyVSPole.js +9 -7
  35. data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeFS.js +392 -299
  36. data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeVS.js +12 -8
  37. data/app/assets/javascripts/Shaders/ConstructiveSolidGeometry.js +836 -530
  38. data/app/assets/javascripts/Shaders/CustomSensorVolumeFS.js +95 -58
  39. data/app/assets/javascripts/Shaders/CustomSensorVolumeVS.js +7 -6
  40. data/app/assets/javascripts/Shaders/EllipsoidFS.js +34 -26
  41. data/app/assets/javascripts/Shaders/EllipsoidVS.js +21 -5
  42. data/app/assets/javascripts/Shaders/Materials/AsphaltMaterial.js +19 -11
  43. data/app/assets/javascripts/Shaders/Materials/BlobMaterial.js +13 -9
  44. data/app/assets/javascripts/Shaders/Materials/BrickMaterial.js +33 -22
  45. data/app/assets/javascripts/Shaders/Materials/BumpMapMaterial.js +24 -17
  46. data/app/assets/javascripts/Shaders/Materials/CementMaterial.js +14 -10
  47. data/app/assets/javascripts/Shaders/Materials/CheckerboardMaterial.js +32 -20
  48. data/app/assets/javascripts/Shaders/Materials/DotMaterial.js +11 -6
  49. data/app/assets/javascripts/Shaders/Materials/ErosionMaterial.js +18 -13
  50. data/app/assets/javascripts/Shaders/Materials/FacetMaterial.js +12 -7
  51. data/app/assets/javascripts/Shaders/Materials/FresnelMaterial.js +9 -6
  52. data/app/assets/javascripts/Shaders/Materials/GrassMaterial.js +23 -16
  53. data/app/assets/javascripts/Shaders/Materials/NormalMapMaterial.js +14 -11
  54. data/app/assets/javascripts/Shaders/Materials/ReflectionMaterial.js +10 -8
  55. data/app/assets/javascripts/Shaders/Materials/RefractionMaterial.js +10 -8
  56. data/app/assets/javascripts/Shaders/Materials/RimLightingMaterial.js +12 -7
  57. data/app/assets/javascripts/Shaders/Materials/StripeMaterial.js +21 -12
  58. data/app/assets/javascripts/Shaders/Materials/TieDyeMaterial.js +11 -7
  59. data/app/assets/javascripts/Shaders/Materials/Water.js +46 -45
  60. data/app/assets/javascripts/Shaders/Materials/WoodMaterial.js +29 -19
  61. data/app/assets/javascripts/Shaders/Noise.js +408 -173
  62. data/app/assets/javascripts/Shaders/PolygonFS.js +20 -10
  63. data/app/assets/javascripts/Shaders/PolygonFSPick.js +3 -3
  64. data/app/assets/javascripts/Shaders/PolygonVS.js +27 -22
  65. data/app/assets/javascripts/Shaders/PolygonVSPick.js +23 -19
  66. data/app/assets/javascripts/Shaders/PolylineFS.js +3 -3
  67. data/app/assets/javascripts/Shaders/PolylineVS.js +24 -19
  68. data/app/assets/javascripts/Shaders/Ray.js +496 -315
  69. data/app/assets/javascripts/Shaders/ReprojectWebMercatorFS.js +16 -6
  70. data/app/assets/javascripts/Shaders/ReprojectWebMercatorVS.js +5 -2
  71. data/app/assets/javascripts/Shaders/SensorVolume.js +32 -15
  72. data/app/assets/javascripts/Shaders/SkyAtmosphereFS.js +61 -16
  73. data/app/assets/javascripts/Shaders/SkyAtmosphereVS.js +106 -53
  74. data/app/assets/javascripts/Shaders/SkyBoxFS.js +4 -2
  75. data/app/assets/javascripts/Shaders/SkyBoxVS.js +5 -3
  76. data/app/assets/javascripts/Shaders/ViewportQuadFS.js +14 -10
  77. data/app/assets/javascripts/Shaders/ViewportQuadVS.js +6 -5
  78. data/app/assets/javascripts/ThirdParty/knockout.js +88 -0
  79. data/app/assets/javascripts/Widgets/Animation/Animation.css +141 -0
  80. data/app/assets/javascripts/Widgets/Animation/Animation.js +944 -0
  81. data/app/assets/javascripts/Widgets/Animation/AnimationViewModel.js +503 -0
  82. data/app/assets/javascripts/Widgets/Animation/darker.css +69 -0
  83. data/app/assets/javascripts/Widgets/ClockViewModel.js +167 -0
  84. data/app/assets/javascripts/Widgets/Command.js +33 -0
  85. data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.css +54 -77
  86. data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.html +6 -27
  87. data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.js +124 -187
  88. data/app/assets/javascripts/Widgets/Fullscreen/FullscreenViewModel.js +88 -0
  89. data/app/assets/javascripts/Widgets/Fullscreen/FullscreenWidget.css +16 -0
  90. data/app/assets/javascripts/Widgets/Fullscreen/FullscreenWidget.js +50 -0
  91. data/app/assets/javascripts/Widgets/Fullscreen/darker.css +14 -0
  92. data/app/assets/javascripts/Widgets/Images/enterFullscreen-darker.svg +18 -0
  93. data/app/assets/javascripts/Widgets/Images/enterFullscreen.svg +18 -0
  94. data/app/assets/javascripts/Widgets/Images/exitFullscreen-darker.svg +18 -0
  95. data/app/assets/javascripts/Widgets/Images/exitFullscreen.svg +18 -0
  96. data/app/assets/javascripts/Widgets/Observable.js +29 -0
  97. data/app/assets/javascripts/Widgets/{Timeline.css → Timeline/Timeline.css} +18 -21
  98. data/app/assets/javascripts/Widgets/{Timeline.js → Timeline/Timeline.js} +12 -7
  99. data/app/assets/javascripts/Widgets/{TimelineHighlightRange.js → Timeline/TimelineHighlightRange.js} +0 -0
  100. data/app/assets/javascripts/Widgets/{TimelineTrack.js → Timeline/TimelineTrack.js} +1 -1
  101. data/app/assets/javascripts/Widgets/Timeline/darker.css +20 -0
  102. data/app/assets/javascripts/Widgets/ToggleButtonViewModel.js +40 -0
  103. data/app/assets/javascripts/Widgets/createCommand.js +41 -0
  104. data/lib/cesium/version.rb +1 -1
  105. data/test/dummy/log/development.log +3300 -0
  106. data/test/dummy/tmp/cache/assets/C0D/D90/sprockets%2F297417de8571859510683b028659bf97 +0 -0
  107. data/test/dummy/tmp/cache/assets/C5E/6E0/sprockets%2F990a847694744e4ac598dc125572a243 +0 -0
  108. data/test/dummy/tmp/cache/assets/C64/470/sprockets%2Fa605a34504c3a61f1e0309374154a4f2 +0 -0
  109. data/test/dummy/tmp/cache/assets/C6C/D20/sprockets%2F8214271b512224e3f7a73a322e85b15c +0 -0
  110. data/test/dummy/tmp/cache/assets/C6E/8C0/sprockets%2F13ad4320ee685ee062033b0806b07756 +0 -0
  111. data/test/dummy/tmp/cache/assets/C71/D40/sprockets%2F191b5a7162930434c9ea09419d2c0c42 +0 -0
  112. data/test/dummy/tmp/cache/assets/C75/FC0/sprockets%2F7100611b808c367104f4537af8b467ca +0 -0
  113. data/test/dummy/tmp/cache/assets/C77/C90/sprockets%2F5c6d277228741022bef80d17b5422c55 +0 -0
  114. data/test/dummy/tmp/cache/assets/C7B/2E0/sprockets%2F049f5400e934154d876d9e7a110d0b72 +0 -0
  115. data/test/dummy/tmp/cache/assets/C7D/290/sprockets%2F07b270a59082157be139ee653b4435b9 +0 -0
  116. data/test/dummy/tmp/cache/assets/C82/860/sprockets%2Fbd185743a7cf9fa41b72715364178414 +0 -0
  117. data/test/dummy/tmp/cache/assets/C83/5B0/sprockets%2F11288f143903cfc5595d8a5771f51f20 +0 -0
  118. data/test/dummy/tmp/cache/assets/C84/210/sprockets%2F5e7c3418b40688a85916fd18512fc213 +0 -0
  119. data/test/dummy/tmp/cache/assets/C85/2A0/sprockets%2F409dfb449462105286e47c6a8c32860e +0 -0
  120. data/test/dummy/tmp/cache/assets/C87/790/sprockets%2F49d9e234d84217773d540a5b4813fc64 +0 -0
  121. data/test/dummy/tmp/cache/assets/C8C/C50/sprockets%2F87a1327314e4aa2a3ea44a33a4730420 +0 -0
  122. data/test/dummy/tmp/cache/assets/C9C/B20/sprockets%2Fc3000c708c2d95253d8a414d6c087d10 +0 -0
  123. data/test/dummy/tmp/cache/assets/C9E/DC0/sprockets%2F2f7b17e380320fe9d0650d3aa4614432 +0 -0
  124. data/test/dummy/tmp/cache/assets/C9F/9B0/sprockets%2Faeb280e1126521372c0bd6660e22969b +0 -0
  125. data/test/dummy/tmp/cache/assets/CA0/9A0/sprockets%2Fc1e9542f7960491862764447bf6d7f9e +0 -0
  126. data/test/dummy/tmp/cache/assets/CA1/C10/sprockets%2F804602800eb2e183aa91825b5f881b0d +0 -0
  127. data/test/dummy/tmp/cache/assets/CA6/DD0/sprockets%2F8b2532b8158e7333d5392bb505ca512f +0 -0
  128. data/test/dummy/tmp/cache/assets/CA8/4C0/sprockets%2Fbe667b320658d0297c210cb43c77b760 +0 -0
  129. data/test/dummy/tmp/cache/assets/CA9/340/sprockets%2Fd3c10509ea49a62e909622f77f4b3220 +0 -0
  130. data/test/dummy/tmp/cache/assets/CA9/430/sprockets%2F68e71052d60ebac0303e9e883c541265 +0 -0
  131. data/test/dummy/tmp/cache/assets/CAB/380/sprockets%2Fc2d6119b9334706b0b40e54f93f431f7 +0 -0
  132. data/test/dummy/tmp/cache/assets/CAC/820/sprockets%2F6b14c16171e49a1128966926eade622b +0 -0
  133. data/test/dummy/tmp/cache/assets/CB2/A60/sprockets%2F5583541ee042c37a846d149d80c8a36d +0 -0
  134. data/test/dummy/tmp/cache/assets/CB2/F30/sprockets%2Fcd4160d432937934435655ca7c56c5fa +0 -0
  135. data/test/dummy/tmp/cache/assets/CB3/280/sprockets%2F7e73589c2b0009c3748f7a068242cc7a +0 -0
  136. data/test/dummy/tmp/cache/assets/CB4/A90/sprockets%2F8fa8411bd1707443dcf02695b9a80776 +0 -0
  137. data/test/dummy/tmp/cache/assets/CB4/F10/sprockets%2F06ee620db145798202a9fd4c1849944b +0 -0
  138. data/test/dummy/tmp/cache/assets/CB8/3B0/sprockets%2Fd03836e3d10fb91125597086f6dcc848 +0 -0
  139. data/test/dummy/tmp/cache/assets/CB9/280/sprockets%2F0e4025fc9a78a70774353617a9b7e96a +0 -0
  140. data/test/dummy/tmp/cache/assets/CBB/3F0/sprockets%2F410c0a86475946a391fc849c9c34e5e4 +0 -0
  141. data/test/dummy/tmp/cache/assets/CBE/B60/sprockets%2F872738245c2698dd11952e55f1d2cd5f +0 -0
  142. data/test/dummy/tmp/cache/assets/CC2/090/sprockets%2F1f4c818e07baa8b05de5987748339952 +0 -0
  143. data/test/dummy/tmp/cache/assets/CC3/D90/sprockets%2Fd7e90e060a9924b61d0b2c6d102c0024 +0 -0
  144. data/test/dummy/tmp/cache/assets/CC8/310/sprockets%2F3d942c768ca693e08155d8a9b2195e99 +0 -0
  145. data/test/dummy/tmp/cache/assets/CC8/9F0/sprockets%2Fbc7ef55837e5097405e3f5097fe35961 +0 -0
  146. data/test/dummy/tmp/cache/assets/CC8/A80/sprockets%2F887a36c292044706f9d58ee02f659eb9 +0 -0
  147. data/test/dummy/tmp/cache/assets/CC8/E20/sprockets%2F27297a29159534cf493ff55576c9faa5 +0 -0
  148. data/test/dummy/tmp/cache/assets/CCD/040/sprockets%2Faf449bc1503080d6262424c20bb97b6d +0 -0
  149. data/test/dummy/tmp/cache/assets/CCD/210/sprockets%2F33c821e4b3b2538af0c79006df1318d0 +0 -0
  150. data/test/dummy/tmp/cache/assets/CCD/8B0/sprockets%2F738651415c65eb022af5ec9230a6b2b1 +0 -0
  151. data/test/dummy/tmp/cache/assets/CCF/180/sprockets%2F39ad17e27f30e3d0080675315bdae602 +0 -0
  152. data/test/dummy/tmp/cache/assets/CD0/CB0/sprockets%2F139767c003a27a8b5da08fc3714c072b +0 -0
  153. data/test/dummy/tmp/cache/assets/CD2/6E0/sprockets%2F161543077a1e9c52a2d577bbc3d41e62 +0 -0
  154. data/test/dummy/tmp/cache/assets/CD3/5A0/sprockets%2F3b02ea5d52854a16dea8336c339c5090 +0 -0
  155. data/test/dummy/tmp/cache/assets/CD5/9F0/sprockets%2F72d2b1b535d37251fb45c4754d62e2a6 +0 -0
  156. data/test/dummy/tmp/cache/assets/CDA/170/sprockets%2Ffae3735873d2d340da1827ee6246500e +0 -0
  157. data/test/dummy/tmp/cache/assets/CDA/C40/sprockets%2F1d06e02833dd2620777ee9818ec61bb0 +0 -0
  158. data/test/dummy/tmp/cache/assets/CDC/080/sprockets%2Fb33c033c645ff28315cc958538cd5b13 +0 -0
  159. data/test/dummy/tmp/cache/assets/CDC/990/sprockets%2F913dd1f104b8b71495b00d798c2922de +0 -0
  160. data/test/dummy/tmp/cache/assets/CDD/090/sprockets%2F62a239aa6b1847f0cd82f6e5b7187303 +0 -0
  161. data/test/dummy/tmp/cache/assets/CDF/E30/sprockets%2F27d4b1eb52518a0667aef8525455b57c +0 -0
  162. data/test/dummy/tmp/cache/assets/CE6/E20/sprockets%2F0c20945489c7228a66bb54fd7cc449f0 +0 -0
  163. data/test/dummy/tmp/cache/assets/CE8/F00/sprockets%2Fd5833932a705129ff7ce6072ee0fb945 +0 -0
  164. data/test/dummy/tmp/cache/assets/CE9/C20/sprockets%2F5c49d701727e703847268f9fffdba020 +0 -0
  165. data/test/dummy/tmp/cache/assets/CED/610/sprockets%2F678ef9639f922616c1ced8f3b1b12931 +0 -0
  166. data/test/dummy/tmp/cache/assets/CEE/300/sprockets%2Fc27f86c561d6e1e8c08d5f852857b025 +0 -0
  167. data/test/dummy/tmp/cache/assets/CEF/B50/sprockets%2F877a93d34cbc7b4cf1837a56398f0185 +0 -0
  168. data/test/dummy/tmp/cache/assets/CF2/6B0/sprockets%2F8c7e5aab44b8703a6379569d887145be +0 -0
  169. data/test/dummy/tmp/cache/assets/CF3/2A0/sprockets%2Fcf7fca385a816577b9a3a8583117696d +0 -0
  170. data/test/dummy/tmp/cache/assets/CF5/5E0/sprockets%2Fdaf7891f7f08019202f8576899bb51ce +0 -0
  171. data/test/dummy/tmp/cache/assets/CF5/F60/sprockets%2Fbf00d9de7199bf7775c55128a295b677 +0 -0
  172. data/test/dummy/tmp/cache/assets/CF6/F60/sprockets%2Fc8e90a0ee2521916c1aa1a41b6463a63 +0 -0
  173. data/test/dummy/tmp/cache/assets/CF8/AB0/sprockets%2F7755643d4dc601cdf47e9886b4f379a5 +0 -0
  174. data/test/dummy/tmp/cache/assets/CF8/FA0/sprockets%2F853bda27091dea80f5121d20a08b53a7 +0 -0
  175. data/test/dummy/tmp/cache/assets/CFC/970/sprockets%2Fbe27af53c78bc90a6113a41620a448e1 +0 -0
  176. data/test/dummy/tmp/cache/assets/D01/160/sprockets%2Fa74c8a20e3158be3fb170499a11093db +0 -0
  177. data/test/dummy/tmp/cache/assets/D01/4A0/sprockets%2F9e53138a5fa453940a6190c1ba3ac36e +0 -0
  178. data/test/dummy/tmp/cache/assets/D09/360/sprockets%2Fe5d09aa6884c385437dbb18ca301e353 +0 -0
  179. data/test/dummy/tmp/cache/assets/D0D/990/sprockets%2F9cbe1835abd85d521b876411a56cb672 +0 -0
  180. data/test/dummy/tmp/cache/assets/D0E/610/sprockets%2F3e14d0cbb1493615f7d23438bf8fd068 +0 -0
  181. data/test/dummy/tmp/cache/assets/D0F/870/sprockets%2F7597efb306ce615354e507d02edd14d4 +0 -0
  182. data/test/dummy/tmp/cache/assets/D10/590/sprockets%2F80386d276f6569b0a12ae1be155f9b3e +0 -0
  183. data/test/dummy/tmp/cache/assets/D11/060/sprockets%2F6d0bee24e84229bd6014301c878ff6d6 +0 -0
  184. data/test/dummy/tmp/cache/assets/D11/6A0/sprockets%2Ff21a9f2e8f4075086e68cda0059b25e2 +0 -0
  185. data/test/dummy/tmp/cache/assets/D11/A30/sprockets%2F210c5ab2fecdef47005c7308685e9297 +0 -0
  186. data/test/dummy/tmp/cache/assets/D12/460/sprockets%2F9c0db7ab725c7c7b15d2450657fe2369 +0 -0
  187. data/test/dummy/tmp/cache/assets/D12/760/sprockets%2F03c39aaab0669a6e9670a29f048db686 +0 -0
  188. data/test/dummy/tmp/cache/assets/D12/A90/sprockets%2F5f4bf0f279ca050491c07688df6d7c02 +0 -0
  189. data/test/dummy/tmp/cache/assets/D14/020/sprockets%2F0c3544de7e7bd74ee6e2040477f04a88 +0 -0
  190. data/test/dummy/tmp/cache/assets/D15/9B0/sprockets%2F015d78bcd557b68b039a7abd33b47679 +0 -0
  191. data/test/dummy/tmp/cache/assets/D19/B40/sprockets%2F1f58b7a260a18bcc697883f96e266a1b +0 -0
  192. data/test/dummy/tmp/cache/assets/D1A/520/sprockets%2Fe32e6a17fb333c5883939fcb234d2f69 +0 -0
  193. data/test/dummy/tmp/cache/assets/D1C/6B0/sprockets%2F3c7df42c4a83942ffb31d85d827595b4 +0 -0
  194. data/test/dummy/tmp/cache/assets/D1C/BD0/sprockets%2Ff389718cb2ba6fe3e0e0c420398f9486 +0 -0
  195. data/test/dummy/tmp/cache/assets/D21/E90/sprockets%2F2fe752c3566ccd57f7ee339086fc3427 +0 -0
  196. data/test/dummy/tmp/cache/assets/D23/CD0/sprockets%2F20f79a5d5570f3efef4de79621355e49 +0 -0
  197. data/test/dummy/tmp/cache/assets/D23/D30/sprockets%2F71867caa2cf28987ed0048cf7d3a7569 +0 -0
  198. data/test/dummy/tmp/cache/assets/D24/EF0/sprockets%2F776d054d84f539061bd8ddffa66906c8 +0 -0
  199. data/test/dummy/tmp/cache/assets/D25/4D0/sprockets%2Fde6d162f5e2a587d9564e88d90c773a3 +0 -0
  200. data/test/dummy/tmp/cache/assets/D27/A90/sprockets%2F1a25693899836d58cad4cbfe8c7a7707 +0 -0
  201. data/test/dummy/tmp/cache/assets/D2D/F30/sprockets%2Fc75a2beb051b582840cf3800d55b26dc +0 -0
  202. data/test/dummy/tmp/cache/assets/D2D/F80/sprockets%2F0293aae3c8d8a4fda11a0883c48b5222 +0 -0
  203. data/test/dummy/tmp/cache/assets/D2E/600/sprockets%2Fda9f7539b9df0aa7d763d14999870d94 +0 -0
  204. data/test/dummy/tmp/cache/assets/D33/040/sprockets%2F6593d8c52e0b617a12ae2c49aa6e3b07 +0 -0
  205. data/test/dummy/tmp/cache/assets/D34/7A0/sprockets%2F4b4a0c9775248b2e49c1bae8a72a05c3 +0 -0
  206. data/test/dummy/tmp/cache/assets/D36/770/sprockets%2F2942b9a5caa50e9107de74eca152619c +0 -0
  207. data/test/dummy/tmp/cache/assets/D37/9C0/sprockets%2Fdfa99409821a9d0d1d6f30b5461b1ae5 +0 -0
  208. data/test/dummy/tmp/cache/assets/D38/930/sprockets%2F1dd724d3466a12a84bb248dc7e6d06c6 +0 -0
  209. data/test/dummy/tmp/cache/assets/D39/7E0/sprockets%2F0a236c2722565068da14f7ecf7b7a8da +0 -0
  210. data/test/dummy/tmp/cache/assets/D3A/420/sprockets%2Fbd47498d7cbba00ab9c8201883915f2a +0 -0
  211. data/test/dummy/tmp/cache/assets/D3B/BB0/sprockets%2Ff533a1adca88a3594ec94233f71eb812 +0 -0
  212. data/test/dummy/tmp/cache/assets/D3B/E20/sprockets%2Fd20320e720f8dc2779b4ec627eb15fb6 +0 -0
  213. data/test/dummy/tmp/cache/assets/D3D/080/sprockets%2F007ac06f3c784668b28baba6902eec76 +0 -0
  214. data/test/dummy/tmp/cache/assets/D3D/D30/sprockets%2F5fa8cd221b97c829234dc81721eea60e +0 -0
  215. data/test/dummy/tmp/cache/assets/D3E/1F0/sprockets%2F6e84e3f3e420bd5ad7f336ce41750d36 +0 -0
  216. data/test/dummy/tmp/cache/assets/D3F/960/sprockets%2F237931317e014eabd96932637ffadddc +0 -0
  217. data/test/dummy/tmp/cache/assets/D42/460/sprockets%2Fb195b37929fa63c85fbfb573aa05d209 +0 -0
  218. data/test/dummy/tmp/cache/assets/D42/F90/sprockets%2F632555653af85b04e418abb9dee238cf +0 -0
  219. data/test/dummy/tmp/cache/assets/D44/400/sprockets%2F3cdc153bbcae4ac07e75193678d61996 +0 -0
  220. data/test/dummy/tmp/cache/assets/D46/D10/sprockets%2F3399d1c2c5dbc7c9e0f2106296d82fd7 +0 -0
  221. data/test/dummy/tmp/cache/assets/D47/A70/sprockets%2F526b1eb3f0c2369b0c16c96ddf775f96 +0 -0
  222. data/test/dummy/tmp/cache/assets/D48/180/sprockets%2Ffce9aa3720b73d2259e644a2e3a99c89 +0 -0
  223. data/test/dummy/tmp/cache/assets/D48/6F0/sprockets%2F7a67d797a92f48d3104ecf5e42b5bc71 +0 -0
  224. data/test/dummy/tmp/cache/assets/D4A/7B0/sprockets%2F8cbd4e8cdea7e3e486565d92b2271561 +0 -0
  225. data/test/dummy/tmp/cache/assets/D4C/2C0/sprockets%2F096baecb9254aaa68d12c0a3c34a2121 +0 -0
  226. data/test/dummy/tmp/cache/assets/D4E/440/sprockets%2F141dfe7665828ab1d5ee647d0e797e5a +0 -0
  227. data/test/dummy/tmp/cache/assets/D4F/D90/sprockets%2F1e4fde9a33bb918796edc96eb0805564 +0 -0
  228. data/test/dummy/tmp/cache/assets/D50/390/sprockets%2F04f3299f7c28fa65842d4bda257df9d5 +0 -0
  229. data/test/dummy/tmp/cache/assets/D51/330/sprockets%2F0e113bb1dc7050041be6f8d28c4ebb41 +0 -0
  230. data/test/dummy/tmp/cache/assets/D57/370/sprockets%2F102e7ebfa287ea2e1b58052b052c1ee2 +0 -0
  231. data/test/dummy/tmp/cache/assets/D57/C50/sprockets%2F28a22bacabfe4b780402b3ca83a54843 +0 -0
  232. data/test/dummy/tmp/cache/assets/D57/D00/sprockets%2Fbb9c7666fe4175a054557fff4ccf5983 +0 -0
  233. data/test/dummy/tmp/cache/assets/D59/E30/sprockets%2Fa8a09c836fc128ee889ce97d72e6444c +0 -0
  234. data/test/dummy/tmp/cache/assets/D5C/800/sprockets%2Fdd1b21cea3433ac792403e3de4f84f11 +0 -0
  235. data/test/dummy/tmp/cache/assets/D5D/140/sprockets%2Ffca988958f2a37ce8eb6b77337e793c0 +0 -0
  236. data/test/dummy/tmp/cache/assets/D5F/630/sprockets%2Ff2df01200f9420db5285f15bbdf4e34e +0 -0
  237. data/test/dummy/tmp/cache/assets/D61/420/sprockets%2F79102ecb63d32f0f43e46f481acab0c7 +0 -0
  238. data/test/dummy/tmp/cache/assets/D61/B10/sprockets%2F56a7f22ca114fc32e60a2ca8e5c946e1 +0 -0
  239. data/test/dummy/tmp/cache/assets/D61/C00/sprockets%2F71ad51ea200867d43de03b8b25eb3e6f +0 -0
  240. data/test/dummy/tmp/cache/assets/D63/400/sprockets%2F30721d1c6698a64ac1cdc7e8d3ad37a0 +0 -0
  241. data/test/dummy/tmp/cache/assets/D65/3D0/sprockets%2Fc70f23593414be8a0daf25149ecb06fd +0 -0
  242. data/test/dummy/tmp/cache/assets/D68/020/sprockets%2Fc393ddcb5c7dbaf1665bc90491523d23 +0 -0
  243. data/test/dummy/tmp/cache/assets/D68/9F0/sprockets%2F0a2eac996cb10aab983963ec21c9d166 +0 -0
  244. data/test/dummy/tmp/cache/assets/D68/FA0/sprockets%2F315d926695d2ababc102ded8362e7c7b +0 -0
  245. data/test/dummy/tmp/cache/assets/D69/810/sprockets%2F8a4fedc6fc72ca37c7403924c01b374d +0 -0
  246. data/test/dummy/tmp/cache/assets/D6A/400/sprockets%2F7797a681a0c8c541bad4febaa526920e +0 -0
  247. data/test/dummy/tmp/cache/assets/D6A/800/sprockets%2F9e3ba44ae81df1dc8c541a05e0239c79 +0 -0
  248. data/test/dummy/tmp/cache/assets/D6B/890/sprockets%2Fdacdb6e192b1709870319bbb0feb3669 +0 -0
  249. data/test/dummy/tmp/cache/assets/D6D/DD0/sprockets%2Ffbfa79e06a10e3016c741fff74c5e652 +0 -0
  250. data/test/dummy/tmp/cache/assets/D6E/540/sprockets%2F1ec9a9013efe375e03b9ba538af9b515 +0 -0
  251. data/test/dummy/tmp/cache/assets/D70/D70/sprockets%2Fd7f6a9d69e31ff706e22c0b283b6a1e4 +0 -0
  252. data/test/dummy/tmp/cache/assets/D70/F70/sprockets%2Ff296c418125b7be0bc89c34eec50e82d +0 -0
  253. data/test/dummy/tmp/cache/assets/D71/6E0/sprockets%2F8c3e23061d8826cf63999adbe4a0d5ba +0 -0
  254. data/test/dummy/tmp/cache/assets/D73/3D0/sprockets%2Fbad4cc5e382119c131bd5947dd7c96e7 +0 -0
  255. data/test/dummy/tmp/cache/assets/D74/9D0/sprockets%2F1893ad2efa07114b729fd1f09ae97f4e +0 -0
  256. data/test/dummy/tmp/cache/assets/D74/EE0/sprockets%2Fe68a01853f554a88bb865bc94ba1bbd9 +0 -0
  257. data/test/dummy/tmp/cache/assets/D75/900/sprockets%2F857ad23ff231bc76bec12fd9a966538a +0 -0
  258. data/test/dummy/tmp/cache/assets/D76/060/sprockets%2Fd80d293a509fdecc872163f94b8fcc13 +0 -0
  259. data/test/dummy/tmp/cache/assets/D76/350/sprockets%2F66508d9698453a0ffabcf1368ca7a1fc +0 -0
  260. data/test/dummy/tmp/cache/assets/D79/820/sprockets%2F99bcacecd3fb76124a968b4b8341e729 +0 -0
  261. data/test/dummy/tmp/cache/assets/D7E/130/sprockets%2F1affef8c994fdc43ba85491b2724627f +0 -0
  262. data/test/dummy/tmp/cache/assets/D7E/C00/sprockets%2F8ed69e6fd77505a244caf6dde36822e3 +0 -0
  263. data/test/dummy/tmp/cache/assets/D80/7A0/sprockets%2F68e74ee988b46d128ff3020bc0e9c7fd +0 -0
  264. data/test/dummy/tmp/cache/assets/D82/800/sprockets%2F9f0d326f40e88f324ff3a367d9b3fc9f +0 -0
  265. data/test/dummy/tmp/cache/assets/D84/650/sprockets%2Fea05e644410721afbbd8fd1a3a7a1c08 +0 -0
  266. data/test/dummy/tmp/cache/assets/D89/3A0/sprockets%2F53ef2870ac0bb142a8322eee9adca207 +0 -0
  267. data/test/dummy/tmp/cache/assets/D8B/240/sprockets%2Faddf06da0d70aa150d16b97b6816d0d6 +0 -0
  268. data/test/dummy/tmp/cache/assets/D8B/3B0/sprockets%2Fd0c134b0b275ea2f800380fcaebc95f5 +0 -0
  269. data/test/dummy/tmp/cache/assets/D8D/F70/sprockets%2F70d5fc5c803f7ba21c3a7374003bfcdd +0 -0
  270. data/test/dummy/tmp/cache/assets/D8F/B90/sprockets%2F5468bccabc20d4cf562bd110508df3d8 +0 -0
  271. data/test/dummy/tmp/cache/assets/D92/3B0/sprockets%2Fc03a95a4b2eb432d9f5ceda3fb082860 +0 -0
  272. data/test/dummy/tmp/cache/assets/D93/FE0/sprockets%2Fac1c5a644564a7fd2861539dbaf2a0fb +0 -0
  273. data/test/dummy/tmp/cache/assets/D95/500/sprockets%2Fa3c0fdf5260f72d128f7cbb2a64fd408 +0 -0
  274. data/test/dummy/tmp/cache/assets/D97/2E0/sprockets%2F93c35b873a3c8ea35f1628e1ad2deb2b +0 -0
  275. data/test/dummy/tmp/cache/assets/D97/4A0/sprockets%2F2fae66f8ad04be7ce8109005c735acf1 +0 -0
  276. data/test/dummy/tmp/cache/assets/D98/E90/sprockets%2F04cdcb52b072efd49452f2cde9721fb4 +0 -0
  277. data/test/dummy/tmp/cache/assets/D9C/E90/sprockets%2F7d2da4bd8ee5b4ff754581d41806aba2 +0 -0
  278. data/test/dummy/tmp/cache/assets/DA0/2C0/sprockets%2F61c0dfd9a973f9891cd3d6b322bc33ea +0 -0
  279. data/test/dummy/tmp/cache/assets/DA0/C70/sprockets%2Ff29a718bce262c8d86f3abe9443b41cb +0 -0
  280. data/test/dummy/tmp/cache/assets/DA3/A00/sprockets%2F7e7df285dbb4694a5f1583fba12ab84d +0 -0
  281. data/test/dummy/tmp/cache/assets/DA3/EC0/sprockets%2F159d528ec53e415cbc9d29be3a2b96fb +0 -0
  282. data/test/dummy/tmp/cache/assets/DA5/170/sprockets%2F6a564a0e1afd718a07d87f069bc48dff +0 -0
  283. data/test/dummy/tmp/cache/assets/DA6/730/sprockets%2F5758d9d4ad2c22c9ffd113a78f6d36bb +0 -0
  284. data/test/dummy/tmp/cache/assets/DA7/6F0/sprockets%2F3e39ce593cda9b3bce9c3c8e014829b5 +0 -0
  285. data/test/dummy/tmp/cache/assets/DA9/0B0/sprockets%2F66e39ce1e6e7adc58cb01550fe58c93d +0 -0
  286. data/test/dummy/tmp/cache/assets/DAD/9D0/sprockets%2Fc99ec7c84f8f79200eda8424c6bda6e1 +0 -0
  287. data/test/dummy/tmp/cache/assets/DAE/B70/sprockets%2F278f525bc64f4ead949d9dfa1f1a37c8 +0 -0
  288. data/test/dummy/tmp/cache/assets/DB3/740/sprockets%2F3fc2be88f7fa50a9992fe961ffc50a83 +0 -0
  289. data/test/dummy/tmp/cache/assets/DB3/770/sprockets%2F47998ff4ce9a2b5383b95bd54ded3c3d +0 -0
  290. data/test/dummy/tmp/cache/assets/DB6/6C0/sprockets%2Fe710d8fbf4ca41d29a742b22a21a0fec +0 -0
  291. data/test/dummy/tmp/cache/assets/DBC/330/sprockets%2Ffc79d797d11878bc435b668cdfbc94cf +0 -0
  292. data/test/dummy/tmp/cache/assets/DBF/270/sprockets%2F820ebc60d1be685f4044d1cb8cabdd17 +0 -0
  293. data/test/dummy/tmp/cache/assets/DBF/E80/sprockets%2F41d82531e91fc1ca0c806beacf0cfc84 +0 -0
  294. data/test/dummy/tmp/cache/assets/DC1/E40/sprockets%2F57aebd4c69abf9331b4770bd3ced100d +0 -0
  295. data/test/dummy/tmp/cache/assets/DC1/FD0/sprockets%2Ff97fb61e211912bbc1eaed82c4ad740c +0 -0
  296. data/test/dummy/tmp/cache/assets/DC2/250/sprockets%2Ffddac1268ff054c12ea32cc6619c46ac +0 -0
  297. data/test/dummy/tmp/cache/assets/DC2/5F0/sprockets%2F68dc2f8cab31bbd8ab65220c685eb15b +0 -0
  298. data/test/dummy/tmp/cache/assets/DC3/7C0/sprockets%2Fa78b7c0aa57b250e05d5ad1e56ac9ed5 +0 -0
  299. data/test/dummy/tmp/cache/assets/DC9/330/sprockets%2Fc5fe138ffe1adb009a407c172fcb9b49 +0 -0
  300. data/test/dummy/tmp/cache/assets/DCC/F10/sprockets%2F4fb860d9bb2c56165fae6ecc193bd1f2 +0 -0
  301. data/test/dummy/tmp/cache/assets/DCE/0E0/sprockets%2Fc1845aeaffa0d9c887108b5cf1a77dc2 +0 -0
  302. data/test/dummy/tmp/cache/assets/DCE/920/sprockets%2F5208ac969dfa6f4dd531ef2d2afb454b +0 -0
  303. data/test/dummy/tmp/cache/assets/DCE/950/sprockets%2F2d0d1caef1b638f88de704d1eb07be88 +0 -0
  304. data/test/dummy/tmp/cache/assets/DCE/9C0/sprockets%2Fc6b7fd0b623a5b66692ed21dafe5ee18 +0 -0
  305. data/test/dummy/tmp/cache/assets/DD2/190/sprockets%2F3662cdc2f2f551c51ec9bddb9177deb7 +0 -0
  306. data/test/dummy/tmp/cache/assets/DD2/C80/sprockets%2Fe94b85ec5d4eeb0616972dd03cadf06f +0 -0
  307. data/test/dummy/tmp/cache/assets/DD3/B30/sprockets%2Ff1eab781d903ebdf7d9379cca92533ba +0 -0
  308. data/test/dummy/tmp/cache/assets/DD5/8F0/sprockets%2F4bfcc6fffb235da87a162efc721985e2 +0 -0
  309. data/test/dummy/tmp/cache/assets/DD6/8B0/sprockets%2F8ab6728b7ab04dbec482fe5fb7ef8604 +0 -0
  310. data/test/dummy/tmp/cache/assets/DD6/E50/sprockets%2F1ce8c04cfee001955cf5fd9ed7d59a52 +0 -0
  311. data/test/dummy/tmp/cache/assets/DD9/D30/sprockets%2F9abfa5c86dbf28fd7be89b650c3d5225 +0 -0
  312. data/test/dummy/tmp/cache/assets/DE7/E30/sprockets%2F18bca0215ecdc63ba01a2ee5cd7c34f8 +0 -0
  313. data/test/dummy/tmp/cache/assets/DE8/C20/sprockets%2Fc91409dc1b447ba1beaa0be9b33ef14d +0 -0
  314. data/test/dummy/tmp/cache/assets/DED/270/sprockets%2Fdee70d8becb01a00e2d7420c6a646dff +0 -0
  315. data/test/dummy/tmp/cache/assets/DF4/2D0/sprockets%2Ffd83bba93ef8ca1a70c63ee4b625a6b0 +0 -0
  316. data/test/dummy/tmp/cache/assets/DF8/E50/sprockets%2Fbb1bdc05e895b8c08cb6ca4491ed51cf +0 -0
  317. data/test/dummy/tmp/cache/assets/DFB/EC0/sprockets%2F94ccf06d9a630eaa4a9865d7e74aaaba +0 -0
  318. data/test/dummy/tmp/cache/assets/DFC/FC0/sprockets%2Fd8badee5b41f9328df1d3fe153eef401 +0 -0
  319. data/test/dummy/tmp/cache/assets/DFD/F30/sprockets%2Fd60da4793bab6bff313a6bfc25985dfb +0 -0
  320. data/test/dummy/tmp/cache/assets/DFE/230/sprockets%2Fd260ce7fb8bf41f914b57c0dde9b0af6 +0 -0
  321. data/test/dummy/tmp/cache/assets/DFE/2E0/sprockets%2F813f277df6cd78babbdb7f5c34f3ab05 +0 -0
  322. data/test/dummy/tmp/cache/assets/DFE/E50/sprockets%2F59b3e0cbbf99e92737aab0bcfc205f5f +0 -0
  323. data/test/dummy/tmp/cache/assets/DFF/9F0/sprockets%2Fb4677ae08ff6f9edaf3b2bcbb115a963 +0 -0
  324. data/test/dummy/tmp/cache/assets/E05/480/sprockets%2F789f3eb9b0ee9d3fb684066acaebd4a1 +0 -0
  325. data/test/dummy/tmp/cache/assets/E08/8A0/sprockets%2F3cb6916a9933fdfd43d6defe3e4a6d1d +0 -0
  326. data/test/dummy/tmp/cache/assets/E09/A00/sprockets%2F77913b88dec083cedb3875beae2efd5a +0 -0
  327. data/test/dummy/tmp/cache/assets/E16/E60/sprockets%2Ffe5e3c5af908e8cc7ff70976fdc14db7 +0 -0
  328. data/test/dummy/tmp/cache/assets/E28/B70/sprockets%2Fb2fa75ae01dda6654abd60c78c8bf5cf +0 -0
  329. data/test/dummy/tmp/cache/assets/E30/8A0/sprockets%2F5d3fccefabad47a78655a5c92adb3c76 +0 -0
  330. data/test/dummy/tmp/cache/assets/E36/9F0/sprockets%2Fb2bdf95afd8ecf06ce9b8407a2f9b1b8 +0 -0
  331. data/test/dummy/tmp/cache/assets/E3E/C60/sprockets%2F8b3bfb5dbc23d849d4f2fc6dd7fe45d9 +0 -0
  332. data/test/dummy/tmp/cache/assets/E3F/B10/sprockets%2F7b1af74e67b27fff762f3cdfebe5f4a7 +0 -0
  333. data/test/dummy/tmp/cache/assets/E50/740/sprockets%2F0578ebbffb5c27d00cc86b1dd7b1eada +0 -0
  334. data/test/dummy/tmp/cache/assets/E50/9F0/sprockets%2Fddfa62aba6a56ed6ab5e44ae36b175ad +0 -0
  335. data/test/dummy/tmp/cache/assets/E5D/160/sprockets%2F44a9be8a9b567fceec2bdc4ab074bbb9 +0 -0
  336. data/test/dummy/tmp/cache/assets/E61/FB0/sprockets%2F97c2b65cafddc7ac59ae4a5e2a18afe8 +0 -0
  337. data/test/dummy/tmp/cache/assets/E73/680/sprockets%2F1a4d0b08b6fdbacbfe0d1cb7df5db251 +0 -0
  338. data/test/dummy/tmp/cache/assets/ED1/C10/sprockets%2Fa9a13ad3bb3a6ccbb6faac3fac0b6c8e +0 -0
  339. data/test/dummy/tmp/cache/assets/EF0/E30/sprockets%2F3ac422b66adec6cffa8edecf9bdea48d +0 -0
  340. data/test/dummy/tmp/pids/server.pid +1 -1
  341. metadata +33 -15
  342. data/app/assets/javascripts/Core/AnimationController.js +0 -148
  343. data/app/assets/javascripts/Scene/ImageryProviderError.js +0 -149
  344. data/app/assets/javascripts/Widgets/Dojo/TimelineWidget.css +0 -1
  345. data/app/assets/javascripts/Widgets/Dojo/TimelineWidget.js +0 -47
  346. data/app/assets/javascripts/Widgets/Images/Bing_Logo_51x19_White.png +0 -0
  347. data/app/assets/javascripts/Widgets/Images/animationBar.png +0 -0
  348. data/app/assets/javascripts/Workers/createVerticesFromExtent.js +0 -24
@@ -3,20 +3,30 @@
3
3
  define(function() {
4
4
  "use strict";
5
5
  return "uniform sampler2D u_texture;\n\
6
+ \n\
6
7
  uniform float u_northLatitude;\n\
7
8
  uniform float u_southLatitude;\n\
8
9
  uniform float u_southMercatorYHigh;\n\
9
10
  uniform float u_southMercatorYLow;\n\
10
11
  uniform float u_oneOverMercatorHeight;\n\
12
+ \n\
11
13
  varying vec2 v_textureCoordinates;\n\
14
+ \n\
12
15
  void main()\n\
13
16
  {\n\
14
- vec2 geographicUV = clamp(v_textureCoordinates, 0.0, 1.0);\n\
15
- vec2 webMercatorUV = geographicUV;\n\
16
- float currentLatitude = mix(u_southLatitude, u_northLatitude, geographicUV.y);\n\
17
- float fraction = czm_latitudeToWebMercatorFraction(currentLatitude, u_southMercatorYLow, u_southMercatorYHigh, u_oneOverMercatorHeight);\n\
18
- webMercatorUV = vec2(geographicUV.x, fraction);\n\
19
- gl_FragColor = texture2D(u_texture, webMercatorUV);\n\
17
+ // The clamp below works around an apparent bug in Chrome Canary v23.0.1241.0\n\
18
+ // where the fragment shader sees textures coordinates < 0.0 and > 1.0 for the\n\
19
+ // fragments on the edges of tiles even though the vertex shader is outputting\n\
20
+ // coordinates strictly in the 0-1 range.\n\
21
+ vec2 geographicUV = clamp(v_textureCoordinates, 0.0, 1.0);\n\
22
+ vec2 webMercatorUV = geographicUV;\n\
23
+ \n\
24
+ float currentLatitude = mix(u_southLatitude, u_northLatitude, geographicUV.y);\n\
25
+ float fraction = czm_latitudeToWebMercatorFraction(currentLatitude, u_southMercatorYLow, u_southMercatorYHigh, u_oneOverMercatorHeight);\n\
26
+ \n\
27
+ webMercatorUV = vec2(geographicUV.x, fraction);\n\
28
+ \n\
29
+ gl_FragColor = texture2D(u_texture, webMercatorUV);\n\
20
30
  }\n\
21
31
  ";
22
32
  });
@@ -3,12 +3,15 @@
3
3
  define(function() {
4
4
  "use strict";
5
5
  return "attribute vec4 position;\n\
6
+ \n\
6
7
  uniform vec2 u_textureDimensions;\n\
8
+ \n\
7
9
  varying vec2 v_textureCoordinates;\n\
10
+ \n\
8
11
  void main()\n\
9
12
  {\n\
10
- v_textureCoordinates = position.xy;\n\
11
- gl_Position = czm_viewportOrthographic * (position * vec4(u_textureDimensions, 1.0, 1.0));\n\
13
+ v_textureCoordinates = position.xy;\n\
14
+ gl_Position = czm_viewportOrthographic * (position * vec4(u_textureDimensions, 1.0, 1.0));\n\
12
15
  }\n\
13
16
  ";
14
17
  });
@@ -3,29 +3,46 @@
3
3
  define(function() {
4
4
  "use strict";
5
5
  return "uniform vec4 u_intersectionColor;\n\
6
+ \n\
6
7
  bool inSensorShadow(vec3 coneVertexWC, czm_ellipsoid ellipsoidEC, vec3 pointEC)\n\
7
8
  {\n\
8
- vec3 D = ellipsoidEC.inverseRadii;\n\
9
- vec3 q = D * coneVertexWC;\n\
10
- float qMagnitudeSquared = dot(q, q);\n\
11
- float test = qMagnitudeSquared - 1.0;\n\
12
- vec3 t = (czm_inverseView * vec4(pointEC, 1.0)).xyz;\n\
13
- vec3 temp = D * t - q;\n\
14
- float d = dot(temp, q);\n\
15
- return (d < -test) && (d / length(temp) < -sqrt(test));\n\
9
+ // Diagonal matrix from the unscaled ellipsoid space to the scaled space. \n\
10
+ vec3 D = ellipsoidEC.inverseRadii;\n\
11
+ \n\
12
+ // Sensor vertex in the scaled ellipsoid space\n\
13
+ vec3 q = D * coneVertexWC;\n\
14
+ float qMagnitudeSquared = dot(q, q);\n\
15
+ float test = qMagnitudeSquared - 1.0;\n\
16
+ \n\
17
+ // Fragment in the ellipsoid frame\n\
18
+ vec3 t = (czm_inverseView * vec4(pointEC, 1.0)).xyz;\n\
19
+ \n\
20
+ // Sensor vertex to fragment vector in the ellipsoid's scaled space\n\
21
+ vec3 temp = D * t - q;\n\
22
+ float d = dot(temp, q);\n\
23
+ \n\
24
+ // Behind silhouette plane and inside silhouette cone\n\
25
+ return (d < -test) && (d / length(temp) < -sqrt(test));\n\
16
26
  }\n\
27
+ \n\
28
+ ///////////////////////////////////////////////////////////////////////////////\n\
29
+ \n\
17
30
  #ifndef RENDER_FOR_PICK\n\
31
+ \n\
18
32
  vec4 getIntersectionColor(float sensorRadius, vec3 pointEC)\n\
19
33
  {\n\
20
- return u_intersectionColor;\n\
34
+ return u_intersectionColor;\n\
21
35
  }\n\
36
+ \n\
22
37
  vec2 sensor2dTextureCoordinates(float sensorRadius, vec3 pointMC)\n\
23
38
  {\n\
24
- float t = pointMC.z / sensorRadius;\n\
25
- float s = 1.0 + (atan(pointMC.y, pointMC.x) / czm_twoPi);\n\
26
- s = s - floor(s);\n\
27
- return vec2(s, t);\n\
39
+ // (s, t) both in the range [0, 1]\n\
40
+ float t = pointMC.z / sensorRadius;\n\
41
+ float s = 1.0 + (atan(pointMC.y, pointMC.x) / czm_twoPi);\n\
42
+ s = s - floor(s);\n\
43
+ \n\
44
+ return vec2(s, t);\n\
28
45
  }\n\
29
- #endif\n\
30
- ";
46
+ \n\
47
+ #endif";
31
48
  });
@@ -33,30 +33,75 @@
33
33
  /*global define*/
34
34
  define(function() {
35
35
  "use strict";
36
- return "uniform float u_morphTime;\n\
36
+ return "/**\n\
37
+ * @license\n\
38
+ * Copyright (c) 2000-2005, Sean O'Neil (s_p_oneil@hotmail.com)\n\
39
+ * All rights reserved.\n\
40
+ * \n\
41
+ * Redistribution and use in source and binary forms, with or without\n\
42
+ * modification, are permitted provided that the following conditions\n\
43
+ * are met:\n\
44
+ * \n\
45
+ * * Redistributions of source code must retain the above copyright notice,\n\
46
+ * this list of conditions and the following disclaimer.\n\
47
+ * * Redistributions in binary form must reproduce the above copyright notice,\n\
48
+ * this list of conditions and the following disclaimer in the documentation\n\
49
+ * and/or other materials provided with the distribution.\n\
50
+ * * Neither the name of the project nor the names of its contributors may be\n\
51
+ * used to endorse or promote products derived from this software without\n\
52
+ * specific prior written permission.\n\
53
+ * \n\
54
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n\
55
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n\
56
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n\
57
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n\
58
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n\
59
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n\
60
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n\
61
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n\
62
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n\
63
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\
64
+ *\n\
65
+ * Modifications made by Analytical Graphics, Inc.\n\
66
+ */\n\
67
+ \n\
68
+ // Code: http://sponeil.net/\n\
69
+ // GPU Gems 2 Article: http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.html\n\
70
+ \n\
71
+ uniform float u_morphTime;\n\
72
+ \n\
37
73
  const float g = -0.95;\n\
38
74
  const float g2 = g * g;\n\
75
+ \n\
39
76
  varying vec3 v_rayleighColor;\n\
40
77
  varying vec3 v_mieColor;\n\
41
78
  varying vec3 v_toCamera;\n\
42
79
  varying vec3 v_positionEC;\n\
80
+ \n\
43
81
  void main (void)\n\
44
82
  {\n\
45
- czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();\n\
46
- vec3 direction = normalize(v_positionEC);\n\
47
- czm_ray ray = czm_ray(vec3(0.0), direction);\n\
48
- czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);\n\
49
- if (!czm_isEmpty(intersection)) {\n\
50
- discard;\n\
51
- }\n\
52
- float fCos = dot(czm_sunDirectionWC, normalize(v_toCamera)) / length(v_toCamera);\n\
53
- float fRayleighPhase = 0.75 * (1.0 + fCos*fCos);\n\
54
- float fMiePhase = 1.5 * ((1.0 - g2) / (2.0 + g2)) * (1.0 + fCos*fCos) / pow(1.0 + g2 - 2.0*g*fCos, 1.5);\n\
55
- const float fExposure = 2.0;\n\
56
- vec3 rgb = fRayleighPhase * v_rayleighColor + fMiePhase * v_mieColor;\n\
57
- rgb = vec3(1.0) - exp(-fExposure * rgb);\n\
58
- float l = czm_luminance(rgb);\n\
59
- gl_FragColor = vec4(rgb, min(smoothstep(0.0, 0.1, l), 1.0) * smoothstep(0.0, 1.0, u_morphTime));\n\
83
+ // TODO: make arbitrary ellipsoid\n\
84
+ czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();\n\
85
+ \n\
86
+ vec3 direction = normalize(v_positionEC);\n\
87
+ czm_ray ray = czm_ray(vec3(0.0), direction);\n\
88
+ \n\
89
+ czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);\n\
90
+ if (!czm_isEmpty(intersection)) {\n\
91
+ discard;\n\
92
+ }\n\
93
+ \n\
94
+ // Extra normalize added for Android\n\
95
+ float fCos = dot(czm_sunDirectionWC, normalize(v_toCamera)) / length(v_toCamera);\n\
96
+ float fRayleighPhase = 0.75 * (1.0 + fCos*fCos);\n\
97
+ float fMiePhase = 1.5 * ((1.0 - g2) / (2.0 + g2)) * (1.0 + fCos*fCos) / pow(1.0 + g2 - 2.0*g*fCos, 1.5);\n\
98
+ \n\
99
+ const float fExposure = 2.0;\n\
100
+ \n\
101
+ vec3 rgb = fRayleighPhase * v_rayleighColor + fMiePhase * v_mieColor;\n\
102
+ rgb = vec3(1.0) - exp(-fExposure * rgb);\n\
103
+ float l = czm_luminance(rgb);\n\
104
+ gl_FragColor = vec4(rgb, min(smoothstep(0.0, 0.1, l), 1.0) * smoothstep(0.0, 1.0, u_morphTime));\n\
60
105
  }\n\
61
106
  ";
62
107
  });
@@ -33,15 +33,52 @@
33
33
  /*global define*/
34
34
  define(function() {
35
35
  "use strict";
36
- return "attribute vec4 position;\n\
36
+ return "/**\n\
37
+ * @license\n\
38
+ * Copyright (c) 2000-2005, Sean O'Neil (s_p_oneil@hotmail.com)\n\
39
+ * All rights reserved.\n\
40
+ * \n\
41
+ * Redistribution and use in source and binary forms, with or without\n\
42
+ * modification, are permitted provided that the following conditions\n\
43
+ * are met:\n\
44
+ * \n\
45
+ * * Redistributions of source code must retain the above copyright notice,\n\
46
+ * this list of conditions and the following disclaimer.\n\
47
+ * * Redistributions in binary form must reproduce the above copyright notice,\n\
48
+ * this list of conditions and the following disclaimer in the documentation\n\
49
+ * and/or other materials provided with the distribution.\n\
50
+ * * Neither the name of the project nor the names of its contributors may be\n\
51
+ * used to endorse or promote products derived from this software without\n\
52
+ * specific prior written permission.\n\
53
+ * \n\
54
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n\
55
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n\
56
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n\
57
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n\
58
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n\
59
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n\
60
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n\
61
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n\
62
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n\
63
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\
64
+ *\n\
65
+ * Modifications made by Analytical Graphics, Inc.\n\
66
+ */\n\
67
+ \n\
68
+ // Code: http://sponeil.net/\n\
69
+ // GPU Gems 2 Article: http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.html\n\
70
+ \n\
71
+ attribute vec4 position;\n\
72
+ \n\
37
73
  uniform float fCameraHeight;\n\
38
74
  uniform float fCameraHeight2;\n\
39
- uniform float fOuterRadius;\n\
40
- uniform float fOuterRadius2;\n\
41
- uniform float fInnerRadius;\n\
42
- uniform float fScale;\n\
43
- uniform float fScaleDepth;\n\
44
- uniform float fScaleOverScaleDepth;\n\
75
+ uniform float fOuterRadius; // The outer (atmosphere) radius\n\
76
+ uniform float fOuterRadius2; // fOuterRadius^2\n\
77
+ uniform float fInnerRadius; // The inner (planetary) radius\n\
78
+ uniform float fScale; // 1 / (fOuterRadius - fInnerRadius)\n\
79
+ uniform float fScaleDepth; // The scale depth (i.e. the altitude at which the atmosphere's average density is found)\n\
80
+ uniform float fScaleOverScaleDepth; // fScale / fScaleDepth\n\
81
+ \n\
45
82
  const float Kr = 0.0025;\n\
46
83
  const float fKr4PI = Kr * 4.0 * czm_pi;\n\
47
84
  const float Km = 0.0015;\n\
@@ -50,66 +87,82 @@ const float ESun = 15.0;\n\
50
87
  const float fKmESun = Km * ESun;\n\
51
88
  const float fKrESun = Kr * ESun;\n\
52
89
  const vec3 v3InvWavelength = vec3(\n\
53
- 5.60204474633241,\n\
54
- 9.473284437923038,\n\
55
- 19.643802610477206);\n\
90
+ 5.60204474633241, // Red = 1.0 / Math.pow(0.650, 4.0)\n\
91
+ 9.473284437923038, // Green = 1.0 / Math.pow(0.570, 4.0)\n\
92
+ 19.643802610477206); // Blue = 1.0 / Math.pow(0.475, 4.0)\n\
56
93
  const float rayleighScaleDepth = 0.25;\n\
94
+ \n\
57
95
  const int nSamples = 2;\n\
58
96
  const float fSamples = 2.0;\n\
97
+ \n\
59
98
  varying vec3 v_rayleighColor;\n\
60
99
  varying vec3 v_mieColor;\n\
61
100
  varying vec3 v_toCamera;\n\
62
101
  varying vec3 v_positionEC;\n\
102
+ \n\
63
103
  float scale(float fCos)\n\
64
104
  {\n\
65
- float x = 1.0 - fCos;\n\
66
- return fScaleDepth * exp(-0.00287 + x*(0.459 + x*(3.83 + x*(-6.80 + x*5.25))));\n\
105
+ float x = 1.0 - fCos;\n\
106
+ return fScaleDepth * exp(-0.00287 + x*(0.459 + x*(3.83 + x*(-6.80 + x*5.25))));\n\
67
107
  }\n\
108
+ \n\
68
109
  void main(void)\n\
69
110
  {\n\
70
- vec3 v3Pos = position.xyz;\n\
71
- vec3 v3Ray = v3Pos - czm_viewerPositionWC;\n\
72
- float fFar = length(v3Ray);\n\
73
- v3Ray /= fFar;\n\
111
+ // Get the ray from the camera to the vertex and its length (which is the far point of the ray passing through the atmosphere)\n\
112
+ vec3 v3Pos = position.xyz;\n\
113
+ vec3 v3Ray = v3Pos - czm_viewerPositionWC;\n\
114
+ float fFar = length(v3Ray);\n\
115
+ v3Ray /= fFar;\n\
116
+ \n\
74
117
  #ifdef SKY_FROM_SPACE\n\
75
- float B = 2.0 * dot(czm_viewerPositionWC, v3Ray);\n\
76
- float C = fCameraHeight2 - fOuterRadius2;\n\
77
- float fDet = max(0.0, B*B - 4.0 * C);\n\
78
- float fNear = 0.5 * (-B - sqrt(fDet));\n\
79
- vec3 v3Start = czm_viewerPositionWC + v3Ray * fNear;\n\
80
- fFar -= fNear;\n\
81
- float fStartAngle = dot(v3Ray, v3Start) / fOuterRadius;\n\
82
- float fStartDepth = exp(-1.0 / fScaleDepth);\n\
83
- float fStartOffset = fStartDepth*scale(fStartAngle);\n\
84
- #else\n\
85
- vec3 v3Start = czm_viewerPositionWC;\n\
86
- float fHeight = length(v3Start);\n\
87
- float fDepth = exp(fScaleOverScaleDepth * (fInnerRadius - fCameraHeight));\n\
88
- float fStartAngle = dot(v3Ray, v3Start) / fHeight;\n\
89
- float fStartOffset = fDepth*scale(fStartAngle);\n\
118
+ // Calculate the closest intersection of the ray with the outer atmosphere (which is the near point of the ray passing through the atmosphere)\n\
119
+ float B = 2.0 * dot(czm_viewerPositionWC, v3Ray);\n\
120
+ float C = fCameraHeight2 - fOuterRadius2;\n\
121
+ float fDet = max(0.0, B*B - 4.0 * C);\n\
122
+ float fNear = 0.5 * (-B - sqrt(fDet));\n\
123
+ \n\
124
+ // Calculate the ray's starting position, then calculate its scattering offset\n\
125
+ vec3 v3Start = czm_viewerPositionWC + v3Ray * fNear;\n\
126
+ fFar -= fNear;\n\
127
+ float fStartAngle = dot(v3Ray, v3Start) / fOuterRadius;\n\
128
+ float fStartDepth = exp(-1.0 / fScaleDepth);\n\
129
+ float fStartOffset = fStartDepth*scale(fStartAngle);\n\
130
+ #else // SKY_FROM_ATMOSPHERE\n\
131
+ // Calculate the ray's starting position, then calculate its scattering offset\n\
132
+ vec3 v3Start = czm_viewerPositionWC;\n\
133
+ float fHeight = length(v3Start);\n\
134
+ float fDepth = exp(fScaleOverScaleDepth * (fInnerRadius - fCameraHeight));\n\
135
+ float fStartAngle = dot(v3Ray, v3Start) / fHeight;\n\
136
+ float fStartOffset = fDepth*scale(fStartAngle);\n\
90
137
  #endif\n\
91
- float fSampleLength = fFar / fSamples;\n\
92
- float fScaledLength = fSampleLength * fScale;\n\
93
- vec3 v3SampleRay = v3Ray * fSampleLength;\n\
94
- vec3 v3SamplePoint = v3Start + v3SampleRay * 0.5;\n\
95
- vec3 v3FrontColor = vec3(0.0, 0.0, 0.0);\n\
96
- for(int i=0; i<nSamples; i++)\n\
97
- {\n\
98
- float fHeight = length(v3SamplePoint);\n\
99
- float fDepth = exp(fScaleOverScaleDepth * (fInnerRadius - fHeight));\n\
100
- vec3 lightPosition = normalize(czm_viewerPositionWC);\n\
101
- float fLightAngle = dot(lightPosition, v3SamplePoint) / fHeight;\n\
102
- float fCameraAngle = dot(v3Ray, v3SamplePoint) / fHeight;\n\
103
- float fScatter = (fStartOffset + fDepth*(scale(fLightAngle) - scale(fCameraAngle)));\n\
104
- vec3 v3Attenuate = exp(-fScatter * (v3InvWavelength * fKr4PI + fKm4PI));\n\
105
- v3FrontColor += v3Attenuate * (fDepth * fScaledLength);\n\
106
- v3SamplePoint += v3SampleRay;\n\
107
- }\n\
108
- v_mieColor = v3FrontColor * fKmESun;\n\
109
- v_rayleighColor = v3FrontColor * (v3InvWavelength * fKrESun);\n\
110
- v_toCamera = czm_viewerPositionWC - v3Pos;\n\
111
- v_positionEC = (czm_modelView * position).xyz;\n\
112
- gl_Position = czm_modelViewProjection * position;\n\
138
+ \n\
139
+ // Initialize the scattering loop variables\n\
140
+ float fSampleLength = fFar / fSamples;\n\
141
+ float fScaledLength = fSampleLength * fScale;\n\
142
+ vec3 v3SampleRay = v3Ray * fSampleLength;\n\
143
+ vec3 v3SamplePoint = v3Start + v3SampleRay * 0.5;\n\
144
+ \n\
145
+ // Now loop through the sample rays\n\
146
+ vec3 v3FrontColor = vec3(0.0, 0.0, 0.0);\n\
147
+ for(int i=0; i<nSamples; i++)\n\
148
+ {\n\
149
+ float fHeight = length(v3SamplePoint);\n\
150
+ float fDepth = exp(fScaleOverScaleDepth * (fInnerRadius - fHeight));\n\
151
+ vec3 lightPosition = normalize(czm_viewerPositionWC); // czm_sunDirectionWC\n\
152
+ float fLightAngle = dot(lightPosition, v3SamplePoint) / fHeight;\n\
153
+ float fCameraAngle = dot(v3Ray, v3SamplePoint) / fHeight;\n\
154
+ float fScatter = (fStartOffset + fDepth*(scale(fLightAngle) - scale(fCameraAngle)));\n\
155
+ vec3 v3Attenuate = exp(-fScatter * (v3InvWavelength * fKr4PI + fKm4PI));\n\
156
+ v3FrontColor += v3Attenuate * (fDepth * fScaledLength);\n\
157
+ v3SamplePoint += v3SampleRay;\n\
158
+ }\n\
159
+ \n\
160
+ // Finally, scale the Mie and Rayleigh colors and set up the varying variables for the pixel shader\n\
161
+ v_mieColor = v3FrontColor * fKmESun;\n\
162
+ v_rayleighColor = v3FrontColor * (v3InvWavelength * fKrESun);\n\
163
+ v_toCamera = czm_viewerPositionWC - v3Pos;\n\
164
+ v_positionEC = (czm_modelView * position).xyz;\n\
165
+ gl_Position = czm_modelViewProjection * position;\n\
113
166
  }\n\
114
167
  ";
115
168
  });
@@ -4,11 +4,13 @@ define(function() {
4
4
  "use strict";
5
5
  return "uniform samplerCube u_cubeMap;\n\
6
6
  uniform float u_morphTime;\n\
7
+ \n\
7
8
  varying vec3 v_texCoord;\n\
9
+ \n\
8
10
  void main()\n\
9
11
  {\n\
10
- vec3 rgb = textureCube(u_cubeMap, normalize(v_texCoord)).rgb;\n\
11
- gl_FragColor = vec4(rgb, u_morphTime);\n\
12
+ vec3 rgb = textureCube(u_cubeMap, normalize(v_texCoord)).rgb;\n\
13
+ gl_FragColor = vec4(rgb, u_morphTime);\n\
12
14
  }\n\
13
15
  ";
14
16
  });
@@ -3,12 +3,14 @@
3
3
  define(function() {
4
4
  "use strict";
5
5
  return "attribute vec3 position;\n\
6
+ \n\
6
7
  varying vec3 v_texCoord;\n\
8
+ \n\
7
9
  void main()\n\
8
10
  {\n\
9
- vec3 p = czm_viewRotation * (czm_temeToPseudoFixed * (czm_entireFrustum.y * position));\n\
10
- gl_Position = czm_projection * vec4(p, 1.0);\n\
11
- v_texCoord = position.xyz;\n\
11
+ vec3 p = czm_viewRotation * (czm_temeToPseudoFixed * (czm_entireFrustum.y * position));\n\
12
+ gl_Position = czm_projection * vec4(p, 1.0);\n\
13
+ v_texCoord = position.xyz;\n\
12
14
  }\n\
13
15
  ";
14
16
  });
@@ -2,16 +2,20 @@
2
2
  /*global define*/
3
3
  define(function() {
4
4
  "use strict";
5
- return "varying vec2 v_textureCoordinates;\n\
5
+ return "\n\
6
+ varying vec2 v_textureCoordinates;\n\
7
+ \n\
6
8
  void main()\n\
7
9
  {\n\
8
- czm_materialInput materialInput;\n\
9
- materialInput.s = v_textureCoordinates.s;\n\
10
- materialInput.st = v_textureCoordinates;\n\
11
- materialInput.str = vec3(v_textureCoordinates, 0.0);\n\
12
- materialInput.normalEC = vec3(0.0, 0.0, -1.0);\n\
13
- czm_material material = czm_getMaterial(materialInput);\n\
14
- gl_FragColor = vec4(material.diffuse + material.emission, material.alpha);\n\
15
- }\n\
16
- ";
10
+ czm_materialInput materialInput;\n\
11
+ \n\
12
+ materialInput.s = v_textureCoordinates.s;\n\
13
+ materialInput.st = v_textureCoordinates;\n\
14
+ materialInput.str = vec3(v_textureCoordinates, 0.0);\n\
15
+ materialInput.normalEC = vec3(0.0, 0.0, -1.0);\n\
16
+ \n\
17
+ czm_material material = czm_getMaterial(materialInput);\n\
18
+ \n\
19
+ gl_FragColor = vec4(material.diffuse + material.emission, material.alpha);\n\
20
+ }";
17
21
  });