cesium 0.15.0 → 0.16.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 (596) hide show
  1. data/app/assets/javascripts/Cesium.js +7 -7
  2. data/app/assets/javascripts/Core/BoundingRectangle.js +1 -1
  3. data/app/assets/javascripts/Core/BoundingSphere.js +12 -5
  4. data/app/assets/javascripts/Core/BoxTessellator.js +11 -8
  5. data/app/assets/javascripts/Core/CatmullRomSpline.js +23 -21
  6. data/app/assets/javascripts/Core/Clock.js +1 -1
  7. data/app/assets/javascripts/Core/Color.js +51 -0
  8. data/app/assets/javascripts/Core/CubeMapEllipsoidTessellator.js +3 -1
  9. data/app/assets/javascripts/Core/EarthOrientationParameters.js +1 -1
  10. data/app/assets/javascripts/Core/EllipsoidalOccluder.js +15 -12
  11. data/app/assets/javascripts/Core/Extent.js +37 -0
  12. data/app/assets/javascripts/Core/ExtentTessellator.js +33 -25
  13. data/app/assets/javascripts/Core/HermitePolynomialApproximation.js +18 -19
  14. data/app/assets/javascripts/Core/HermiteSpline.js +49 -49
  15. data/app/assets/javascripts/Core/Iau2006XysData.js +4 -5
  16. data/app/assets/javascripts/Core/LagrangePolynomialApproximation.js +10 -20
  17. data/app/assets/javascripts/Core/LinearApproximation.js +19 -23
  18. data/app/assets/javascripts/Core/Math.js +15 -3
  19. data/app/assets/javascripts/Core/Matrix4.js +186 -2
  20. data/app/assets/javascripts/Core/MeshFilters.js +13 -13
  21. data/app/assets/javascripts/Core/OrientationInterpolator.js +19 -19
  22. data/app/assets/javascripts/Core/PlaneTessellator.js +8 -6
  23. data/app/assets/javascripts/Core/PolygonPipeline.js +21 -21
  24. data/app/assets/javascripts/Core/PolylinePipeline.js +17 -25
  25. data/app/assets/javascripts/Core/ScreenSpaceEventHandler.js +187 -185
  26. data/app/assets/javascripts/Core/Shapes.js +8 -4
  27. data/app/assets/javascripts/Core/Simon1994PlanetaryPositions.js +521 -0
  28. data/app/assets/javascripts/Core/Spherical.js +36 -9
  29. data/app/assets/javascripts/Core/TaskProcessor.js +42 -5
  30. data/app/assets/javascripts/Core/TimeIntervalCollection.js +5 -5
  31. data/app/assets/javascripts/Core/Tipsify.js +21 -16
  32. data/app/assets/javascripts/Core/Transforms.js +11 -11
  33. data/app/assets/javascripts/Core/TridiagonalSystemSolver.js +4 -4
  34. data/app/assets/javascripts/Core/clone.js +25 -8
  35. data/app/assets/javascripts/Core/defaultValue.js +10 -1
  36. data/app/assets/javascripts/Core/isCrossOriginUrl.js +32 -0
  37. data/app/assets/javascripts/Core/jsonp.js +2 -2
  38. data/app/assets/javascripts/Core/loadImage.js +13 -6
  39. data/app/assets/javascripts/Core/loadJson.js +4 -1
  40. data/app/assets/javascripts/Core/pointInsideTriangle2D.js +1 -1
  41. data/app/assets/javascripts/Core/writeTextToCanvas.js +1 -3
  42. data/app/assets/javascripts/DynamicScene/CzmlBoolean.js +7 -4
  43. data/app/assets/javascripts/DynamicScene/CzmlCartesian2.js +1 -1
  44. data/app/assets/javascripts/DynamicScene/CzmlCartesian3.js +1 -1
  45. data/app/assets/javascripts/DynamicScene/CzmlColor.js +1 -1
  46. data/app/assets/javascripts/DynamicScene/CzmlHorizontalOrigin.js +6 -5
  47. data/app/assets/javascripts/DynamicScene/CzmlImage.js +8 -3
  48. data/app/assets/javascripts/DynamicScene/CzmlLabelStyle.js +6 -5
  49. data/app/assets/javascripts/DynamicScene/CzmlNumber.js +6 -4
  50. data/app/assets/javascripts/DynamicScene/CzmlPosition.js +166 -0
  51. data/app/assets/javascripts/DynamicScene/CzmlString.js +6 -4
  52. data/app/assets/javascripts/DynamicScene/CzmlUnitCartesian3.js +1 -1
  53. data/app/assets/javascripts/DynamicScene/CzmlUnitQuaternion.js +1 -1
  54. data/app/assets/javascripts/DynamicScene/CzmlUnitSpherical.js +1 -1
  55. data/app/assets/javascripts/DynamicScene/CzmlVerticalOrigin.js +6 -5
  56. data/app/assets/javascripts/DynamicScene/DynamicGridMaterial.js +202 -0
  57. data/app/assets/javascripts/DynamicScene/DynamicMaterialProperty.js +5 -3
  58. data/app/assets/javascripts/DynamicScene/DynamicObject.js +1 -2
  59. data/app/assets/javascripts/DynamicScene/DynamicPathVisualizer.js +19 -15
  60. data/app/assets/javascripts/DynamicScene/DynamicPointVisualizer.js +12 -10
  61. data/app/assets/javascripts/DynamicScene/DynamicPolylineVisualizer.js +17 -10
  62. data/app/assets/javascripts/DynamicScene/DynamicPositionProperty.js +39 -90
  63. data/app/assets/javascripts/DynamicScene/DynamicProperty.js +19 -6
  64. data/app/assets/javascripts/DynamicScene/ReferenceProperty.js +6 -4
  65. data/app/assets/javascripts/DynamicScene/VisualizerCollection.js +10 -11
  66. data/app/assets/javascripts/Renderer/ClearCommand.js +60 -9
  67. data/app/assets/javascripts/Renderer/Context.js +234 -575
  68. data/app/assets/javascripts/Renderer/DrawCommand.js +15 -3
  69. data/app/assets/javascripts/Renderer/PassState.js +55 -0
  70. data/app/assets/javascripts/Renderer/PickFramebuffer.js +47 -77
  71. data/app/assets/javascripts/Renderer/RenderState.js +541 -0
  72. data/app/assets/javascripts/Renderer/ShaderCache.js +34 -1
  73. data/app/assets/javascripts/Renderer/ShaderProgram.js +112 -6
  74. data/app/assets/javascripts/Renderer/TextureAtlas.js +63 -67
  75. data/app/assets/javascripts/Renderer/UniformState.js +59 -30
  76. data/app/assets/javascripts/Renderer/VertexArray.js +9 -7
  77. data/app/assets/javascripts/Renderer/VertexArrayFacade.js +28 -27
  78. data/app/assets/javascripts/Renderer/createPickFragmentShaderSource.js +53 -0
  79. data/app/assets/javascripts/Renderer/loadCubeMap.js +10 -11
  80. data/app/assets/javascripts/Scene/AnimationCollection.js +48 -44
  81. data/app/assets/javascripts/Scene/Billboard.js +8 -2
  82. data/app/assets/javascripts/Scene/BillboardCollection.js +66 -62
  83. data/app/assets/javascripts/Scene/Camera.js +3 -0
  84. data/app/assets/javascripts/Scene/CameraController.js +3 -3
  85. data/app/assets/javascripts/Scene/CameraFlightPath.js +9 -6
  86. data/app/assets/javascripts/Scene/CentralBody.js +47 -65
  87. data/app/assets/javascripts/Scene/CentralBodySurface.js +9 -6
  88. data/app/assets/javascripts/Scene/CentralBodySurfaceShaderSet.js +5 -9
  89. data/app/assets/javascripts/Scene/CompositePrimitive.js +8 -8
  90. data/app/assets/javascripts/Scene/CustomSensorVolume.js +66 -55
  91. data/app/assets/javascripts/Scene/EllipsoidPrimitive.js +26 -27
  92. data/app/assets/javascripts/Scene/FrameState.js +15 -4
  93. data/app/assets/javascripts/Scene/GridImageryProvider.js +266 -0
  94. data/app/assets/javascripts/Scene/ImageryLayer.js +44 -19
  95. data/app/assets/javascripts/Scene/ImageryLayerCollection.js +3 -0
  96. data/app/assets/javascripts/Scene/ImageryProvider.js +3 -0
  97. data/app/assets/javascripts/Scene/Label.js +4 -4
  98. data/app/assets/javascripts/Scene/LabelCollection.js +2 -9
  99. data/app/assets/javascripts/Scene/Material.js +97 -8
  100. data/app/assets/javascripts/Scene/OrthographicFrustum.js +2 -2
  101. data/app/assets/javascripts/Scene/PerformanceDisplay.js +17 -10
  102. data/app/assets/javascripts/Scene/PerspectiveOffCenterFrustum.js +2 -2
  103. data/app/assets/javascripts/Scene/Polygon.js +30 -56
  104. data/app/assets/javascripts/Scene/Polyline.js +93 -227
  105. data/app/assets/javascripts/Scene/PolylineCollection.js +685 -757
  106. data/app/assets/javascripts/Scene/Projections.js +2 -2
  107. data/app/assets/javascripts/Scene/RectangularPyramidSensorVolume.js +21 -16
  108. data/app/assets/javascripts/Scene/Scene.js +40 -32
  109. data/app/assets/javascripts/Scene/SceneTransitioner.js +8 -56
  110. data/app/assets/javascripts/Scene/SensorVolumeCollection.js +6 -20
  111. data/app/assets/javascripts/Scene/SkyAtmosphere.js +0 -11
  112. data/app/assets/javascripts/Scene/SkyBox.js +0 -11
  113. data/app/assets/javascripts/Scene/VRTheWorldTerrainProvider.js +3 -2
  114. data/app/assets/javascripts/Scene/ViewportQuad.js +8 -8
  115. data/app/assets/javascripts/Shaders/BillboardCollectionVS.glsl +0 -2
  116. data/app/assets/javascripts/Shaders/BillboardCollectionVS.js +0 -2
  117. data/app/assets/javascripts/Shaders/BuiltinFunctions.glsl +517 -3
  118. data/app/assets/javascripts/Shaders/BuiltinFunctions.js +535 -4
  119. data/app/assets/javascripts/Shaders/CentralBodyFS.glsl +11 -24
  120. data/app/assets/javascripts/Shaders/CentralBodyFS.js +11 -24
  121. data/app/assets/javascripts/Shaders/CentralBodyVS.glsl +1 -3
  122. data/app/assets/javascripts/Shaders/CentralBodyVS.js +1 -3
  123. data/app/assets/javascripts/Shaders/CustomSensorVolumeFS.glsl +14 -33
  124. data/app/assets/javascripts/Shaders/CustomSensorVolumeFS.js +14 -33
  125. data/app/assets/javascripts/Shaders/EllipsoidFS.glsl +0 -1
  126. data/app/assets/javascripts/Shaders/EllipsoidFS.js +0 -1
  127. data/app/assets/javascripts/Shaders/Materials/CheckerboardMaterial.glsl +1 -11
  128. data/app/assets/javascripts/Shaders/Materials/CheckerboardMaterial.js +1 -11
  129. data/app/assets/javascripts/Shaders/Materials/FadeMaterial.glsl +36 -0
  130. data/app/assets/javascripts/Shaders/Materials/FadeMaterial.js +42 -0
  131. data/app/assets/javascripts/Shaders/Materials/GridMaterial.glsl +9 -1
  132. data/app/assets/javascripts/Shaders/Materials/GridMaterial.js +9 -1
  133. data/app/assets/javascripts/Shaders/Materials/PolylineArrowMaterial.glsl +60 -0
  134. data/app/assets/javascripts/Shaders/Materials/PolylineArrowMaterial.js +66 -0
  135. data/app/assets/javascripts/Shaders/Materials/PolylineGlowMaterial.glsl +17 -0
  136. data/app/assets/javascripts/Shaders/Materials/PolylineGlowMaterial.js +23 -0
  137. data/app/assets/javascripts/Shaders/Materials/PolylineOutlineMaterial.glsl +28 -0
  138. data/app/assets/javascripts/Shaders/Materials/PolylineOutlineMaterial.js +34 -0
  139. data/app/assets/javascripts/Shaders/Materials/StripeMaterial.glsl +4 -10
  140. data/app/assets/javascripts/Shaders/Materials/StripeMaterial.js +4 -10
  141. data/app/assets/javascripts/Shaders/PolygonFS.glsl +0 -3
  142. data/app/assets/javascripts/Shaders/PolygonFS.js +1 -4
  143. data/app/assets/javascripts/Shaders/PolygonVS.glsl +3 -4
  144. data/app/assets/javascripts/Shaders/PolygonVS.js +3 -4
  145. data/app/assets/javascripts/Shaders/PolylineFS.glsl +9 -2
  146. data/app/assets/javascripts/Shaders/PolylineFS.js +9 -2
  147. data/app/assets/javascripts/Shaders/PolylineVS.glsl +131 -14
  148. data/app/assets/javascripts/Shaders/PolylineVS.js +131 -14
  149. data/app/assets/javascripts/Shaders/ReprojectWebMercatorFS.glsl +1 -19
  150. data/app/assets/javascripts/Shaders/ReprojectWebMercatorFS.js +1 -19
  151. data/app/assets/javascripts/Shaders/ReprojectWebMercatorVS.glsl +9 -1
  152. data/app/assets/javascripts/Shaders/ReprojectWebMercatorVS.js +9 -1
  153. data/app/assets/javascripts/Shaders/SkyAtmosphereFS.glsl +1 -3
  154. data/app/assets/javascripts/Shaders/SkyAtmosphereFS.js +1 -3
  155. data/app/assets/javascripts/Shaders/SkyBoxFS.glsl +1 -2
  156. data/app/assets/javascripts/Shaders/SkyBoxFS.js +1 -2
  157. data/app/assets/javascripts/Widgets/Animation/Animation.js +8 -5
  158. data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.js +19 -1
  159. data/app/assets/javascripts/Widgets/Timeline/Timeline.js +19 -2
  160. data/lib/cesium/version.rb +1 -1
  161. data/test/dummy/app/assets/javascripts/application.js.coffee +10 -10
  162. data/test/dummy/log/development.log +28285 -0
  163. data/test/dummy/tmp/cache/assets/BAF/370/sprockets%2F799a74598087f7719313562f44828061 +0 -0
  164. data/test/dummy/tmp/cache/assets/BF8/BC0/sprockets%2F1982805b53487d15554f20955019b8c4 +0 -0
  165. data/test/dummy/tmp/cache/assets/C12/030/sprockets%2Fbd84b00d783150a219825433401a7946 +0 -0
  166. data/test/dummy/tmp/cache/assets/C1F/BE0/sprockets%2F9ff195723d3a539023420682a372f561 +0 -0
  167. data/test/dummy/tmp/cache/assets/C23/060/sprockets%2F0844038b70e644bef4539389305680a3 +0 -0
  168. data/test/dummy/tmp/cache/assets/C27/DA0/sprockets%2Fe49200d07769d24f54f721d890142818 +0 -0
  169. data/test/dummy/tmp/cache/assets/C37/EB0/sprockets%2F410166e528f769c35999d061f6552d57 +0 -0
  170. data/test/dummy/tmp/cache/assets/C38/870/sprockets%2F3c244a5393086f3b95954f4675f29458 +0 -0
  171. data/test/dummy/tmp/cache/assets/C44/870/sprockets%2Fc7607e52811e723312c83d096c611c32 +0 -0
  172. data/test/dummy/tmp/cache/assets/C46/770/sprockets%2F9b6c82d0454ab5ba8727173860060324 +0 -0
  173. data/test/dummy/tmp/cache/assets/C46/E60/sprockets%2F151028e967f13248ca6121c9407242cf +0 -0
  174. data/test/dummy/tmp/cache/assets/C48/360/sprockets%2Fc966013651008025255f5b53b1d63f9e +0 -0
  175. data/test/dummy/tmp/cache/assets/C49/6B0/sprockets%2Ff15d3a84028c48073d820c51575157a4 +0 -0
  176. data/test/dummy/tmp/cache/assets/C4A/020/sprockets%2F162d504e77459f0304b964139300cfe3 +0 -0
  177. data/test/dummy/tmp/cache/assets/C4A/2B0/sprockets%2F821c1d08482a9b936b661a56444551b3 +0 -0
  178. data/test/dummy/tmp/cache/assets/C4F/630/sprockets%2F8935f51ad832c341c838751031a827f2 +0 -0
  179. data/test/dummy/tmp/cache/assets/C51/170/sprockets%2F7121148c53e447e867b886592e11ad00 +0 -0
  180. data/test/dummy/tmp/cache/assets/C53/040/sprockets%2F52411d26c4863636c7ae5b5090690f94 +0 -0
  181. data/test/dummy/tmp/cache/assets/C57/D10/sprockets%2F784e21cb5b634a598629115ef4685213 +0 -0
  182. data/test/dummy/tmp/cache/assets/C59/810/sprockets%2Fc37183f61d9511d324983656cd9375a1 +0 -0
  183. data/test/dummy/tmp/cache/assets/C61/2F0/sprockets%2Fe7f511982b4799474ab391f714d39630 +0 -0
  184. data/test/dummy/tmp/cache/assets/C64/730/sprockets%2F78fd706ba991f21a399070866616c297 +0 -0
  185. data/test/dummy/tmp/cache/assets/C65/0E0/sprockets%2F8303e4555c14f5f62cd2979665f50578 +0 -0
  186. data/test/dummy/tmp/cache/assets/C6C/C90/sprockets%2Fad7947b2492467a62388859219a92de9 +0 -0
  187. data/test/dummy/tmp/cache/assets/C70/900/sprockets%2F8dc34820f1167ed79c121111a0696c03 +0 -0
  188. data/test/dummy/tmp/cache/assets/C72/450/sprockets%2F12725ceae78656537003a1240f640ed4 +0 -0
  189. data/test/dummy/tmp/cache/assets/C73/0F0/sprockets%2F8a6a50d9b866140c720b6a48307c4116 +0 -0
  190. data/test/dummy/tmp/cache/assets/C75/F50/sprockets%2F52991c5c131fb0049279124ef17047ba +0 -0
  191. data/test/dummy/tmp/cache/assets/C76/F10/sprockets%2F536e031c5d9a257b602d38f8711480a2 +0 -0
  192. data/test/dummy/tmp/cache/assets/C7E/EA0/sprockets%2F2504a119ab66f79d8d296032e957a023 +0 -0
  193. data/test/dummy/tmp/cache/assets/C7F/860/sprockets%2F7646acf5464f211440d12d09847e7c43 +0 -0
  194. data/test/dummy/tmp/cache/assets/C80/150/sprockets%2F0d3881005b0646df783d5c24683d34f5 +0 -0
  195. data/test/dummy/tmp/cache/assets/C80/780/sprockets%2F49930c35001a30c38745b89a6a86cf74 +0 -0
  196. data/test/dummy/tmp/cache/assets/C82/060/sprockets%2Fb043f48276a50489714f9ec04525e26a +0 -0
  197. data/test/dummy/tmp/cache/assets/C82/580/sprockets%2F8118f4526088ba8fd441f20317475d6b +0 -0
  198. data/test/dummy/tmp/cache/assets/C82/AA0/sprockets%2Fd83006c52345d7fe51216f1e577a8185 +0 -0
  199. data/test/dummy/tmp/cache/assets/C83/A50/sprockets%2F26b151f7490286ff7059ff9a411e1027 +0 -0
  200. data/test/dummy/tmp/cache/assets/C84/E00/sprockets%2F49d13d786c17ba7650b374646455a6b3 +0 -0
  201. data/test/dummy/tmp/cache/assets/C85/310/sprockets%2Fc638d86c720815e5b635e0a3646e2186 +0 -0
  202. data/test/dummy/tmp/cache/assets/C87/1B0/sprockets%2F58524f16545fa54ea39c3c1270d06799 +0 -0
  203. data/test/dummy/tmp/cache/assets/C88/960/sprockets%2F50655bc2c86c7c3007756af818375e64 +0 -0
  204. data/test/dummy/tmp/cache/assets/C89/9E0/sprockets%2Fbc5d891273e7d61e56762000337868bf +0 -0
  205. data/test/dummy/tmp/cache/assets/C8A/680/sprockets%2F401d94c3b6643cb7764590d5765197ea +0 -0
  206. data/test/dummy/tmp/cache/assets/C8B/0F0/sprockets%2F3317c35ce7597681091ac91985d08bb5 +0 -0
  207. data/test/dummy/tmp/cache/assets/C8B/A30/sprockets%2Fe20153c26552232703d0f4a5a60b10ed +0 -0
  208. data/test/dummy/tmp/cache/assets/C8D/FC0/sprockets%2Fab1b1b654d968822069892e844f5244f +0 -0
  209. data/test/dummy/tmp/cache/assets/C8E/1A0/sprockets%2F7937090f77385164f68c0ee252b26be5 +0 -0
  210. data/test/dummy/tmp/cache/assets/C8E/1B0/sprockets%2F3309cd849788a2b736f12369ad4e4851 +0 -0
  211. data/test/dummy/tmp/cache/assets/C8E/D50/sprockets%2F687d2438d13763a733287fc4a2e5f746 +0 -0
  212. data/test/dummy/tmp/cache/assets/C8E/E40/sprockets%2F96aaf9af5e7906347880902610773bc5 +0 -0
  213. data/test/dummy/tmp/cache/assets/C8F/370/sprockets%2Ff794170ec844d49b57216a088c0297d7 +0 -0
  214. data/test/dummy/tmp/cache/assets/C91/F00/sprockets%2F0f611f4f95811990472ff1b6f95383d5 +0 -0
  215. data/test/dummy/tmp/cache/assets/C98/D30/sprockets%2F3f2411651caa9b4fd0833085b001f490 +0 -0
  216. data/test/dummy/tmp/cache/assets/CA9/5A0/sprockets%2F8282351dd11504a68cbc8500b7786cf2 +0 -0
  217. data/test/dummy/tmp/cache/assets/CA9/E20/sprockets%2F1ca84c82be52603a0c947256a38a0598 +0 -0
  218. data/test/dummy/tmp/cache/assets/CAA/3C0/sprockets%2F75ce813900f222ce7892711f61db04d3 +0 -0
  219. data/test/dummy/tmp/cache/assets/CAA/400/sprockets%2F5c330e413aa8e6769050215b5366c7ef +0 -0
  220. data/test/dummy/tmp/cache/assets/CAA/A60/sprockets%2F76b467bc7a2344e208653c4261f8ab15 +0 -0
  221. data/test/dummy/tmp/cache/assets/CAA/D90/sprockets%2Fd477a5c2046351a0c462bb945e3954e5 +0 -0
  222. data/test/dummy/tmp/cache/assets/CAB/670/sprockets%2F678e67cae28828b42b010381be1f1247 +0 -0
  223. data/test/dummy/tmp/cache/assets/CAC/000/sprockets%2F39720f0080e70a954d9956acd571d0b2 +0 -0
  224. data/test/dummy/tmp/cache/assets/CAC/220/sprockets%2Fe9d921c5251a11d0a6296974975dbb20 +0 -0
  225. data/test/dummy/tmp/cache/assets/CAD/B20/sprockets%2F4c087829240d4b69e0a47e39bb8124d0 +0 -0
  226. data/test/dummy/tmp/cache/assets/CAD/CF0/sprockets%2F25811882cd57a31606348eb7b16f4f0d +0 -0
  227. data/test/dummy/tmp/cache/assets/CAE/0D0/sprockets%2F02345f5b06f3a25b588ed66b8e167034 +0 -0
  228. data/test/dummy/tmp/cache/assets/CAF/AD0/sprockets%2Fec228a94364d0d686876d02550ed15c1 +0 -0
  229. data/test/dummy/tmp/cache/assets/CB4/D20/sprockets%2F94c251de5c21293f227709479c4f32be +0 -0
  230. data/test/dummy/tmp/cache/assets/CB5/4C0/sprockets%2F446522846ac4ed6619268b3e00fd497a +0 -0
  231. data/test/dummy/tmp/cache/assets/CB7/FA0/sprockets%2F62d364e38ba9b500f8b1633367f782b9 +0 -0
  232. data/test/dummy/tmp/cache/assets/CB8/180/sprockets%2Fe66eae8997e04c4bf70531e166511662 +0 -0
  233. data/test/dummy/tmp/cache/assets/CB8/E20/sprockets%2Fcb0a5df9573576546972b95a14d8f112 +0 -0
  234. data/test/dummy/tmp/cache/assets/CB8/EA0/sprockets%2F9e63d365e2159c725d111698cc04a7e7 +0 -0
  235. data/test/dummy/tmp/cache/assets/CB9/680/sprockets%2F9bad6dc04875e04891351521b9795f5a +0 -0
  236. data/test/dummy/tmp/cache/assets/CBA/250/sprockets%2F39bb3860405888c9f3b4b35c738b940c +0 -0
  237. data/test/dummy/tmp/cache/assets/CBB/E80/sprockets%2F43b17645e39f018bc195bc9828f4b357 +0 -0
  238. data/test/dummy/tmp/cache/assets/CBC/6C0/sprockets%2F6f494cff47ee245d30168217542c66d6 +0 -0
  239. data/test/dummy/tmp/cache/assets/CBE/6B0/sprockets%2F285b1ec717d1c4c725758951c8785b2f +0 -0
  240. data/test/dummy/tmp/cache/assets/CBE/F20/sprockets%2F7610efc00f29935606275944978fbabf +0 -0
  241. data/test/dummy/tmp/cache/assets/CBF/3A0/sprockets%2Fc7b6a2891626c77607ea2881dc84d475 +0 -0
  242. data/test/dummy/tmp/cache/assets/CBF/8B0/sprockets%2F5c98534d57c1e7f7d2926173d27e4d14 +0 -0
  243. data/test/dummy/tmp/cache/assets/CC0/E60/sprockets%2F9731b0739ec7356b2e484cb427d6955f +0 -0
  244. data/test/dummy/tmp/cache/assets/CC1/600/sprockets%2F322629f082c9e743f47a32edd58874b8 +0 -0
  245. data/test/dummy/tmp/cache/assets/CC4/950/sprockets%2F697670d712a9a24f564f9e62b5ed1389 +0 -0
  246. data/test/dummy/tmp/cache/assets/CC4/B10/sprockets%2F55b1a4137e59cad5520e1f012eb29021 +0 -0
  247. data/test/dummy/tmp/cache/assets/CC4/B80/sprockets%2F5b090557c9468f93cc1ab77898ba2629 +0 -0
  248. data/test/dummy/tmp/cache/assets/CC7/0B0/sprockets%2Fa26009e31f9e68672f4fc7f873909a64 +0 -0
  249. data/test/dummy/tmp/cache/assets/CC9/D20/sprockets%2F372172a3ef18b8cac40a5c410f748021 +0 -0
  250. data/test/dummy/tmp/cache/assets/CCD/9B0/sprockets%2F0b3845e705c1a2c20c80b56c9c8a2246 +0 -0
  251. data/test/dummy/tmp/cache/assets/CCF/7E0/sprockets%2F3d478e2550d0140a8da13a229735bcd7 +0 -0
  252. data/test/dummy/tmp/cache/assets/CD0/990/sprockets%2F3027964ce732931bb70c158aa61ab08d +0 -0
  253. data/test/dummy/tmp/cache/assets/CD1/590/sprockets%2F2f99067423113c4aebb30a4dd3643b85 +0 -0
  254. data/test/dummy/tmp/cache/assets/CD3/250/sprockets%2F9982c13eacaf46622739beab50120614 +0 -0
  255. data/test/dummy/tmp/cache/assets/CD3/DB0/sprockets%2F38ec8b4912b23f2b31322570d56c9c2b +0 -0
  256. data/test/dummy/tmp/cache/assets/CD8/5E0/sprockets%2Ffd127b418d9dc4cc3d196672811a6112 +0 -0
  257. data/test/dummy/tmp/cache/assets/CD8/D40/sprockets%2F73570572f17300ebf2dda1ef2635149e +0 -0
  258. data/test/dummy/tmp/cache/assets/CD9/B20/sprockets%2F65698070c3bce81f5ee4eb101722b741 +0 -0
  259. data/test/dummy/tmp/cache/assets/CD9/D90/sprockets%2F87979893cfde1b28afc60797a9948345 +0 -0
  260. data/test/dummy/tmp/cache/assets/CDA/DA0/sprockets%2F13e6789dd595b2b5033b335bbd1472f2 +0 -0
  261. data/test/dummy/tmp/cache/assets/CDB/4D0/sprockets%2Ffb9182b4d13b796b245db8153324f4d2 +0 -0
  262. data/test/dummy/tmp/cache/assets/CDB/630/sprockets%2Fc48aca3d09504ff1811d9234c8267f50 +0 -0
  263. data/test/dummy/tmp/cache/assets/CDC/B50/sprockets%2F0f1e213595a02089df9735ec41c3ee80 +0 -0
  264. data/test/dummy/tmp/cache/assets/CDF/380/sprockets%2F39695e0a1726566c80281aab8d9a51cc +0 -0
  265. data/test/dummy/tmp/cache/assets/CDF/710/sprockets%2F16d775d6707a066df80d10cd1528ff33 +0 -0
  266. data/test/dummy/tmp/cache/assets/CDF/CA0/sprockets%2F3d5b2c400b7877c15ec29575d95b613b +0 -0
  267. data/test/dummy/tmp/cache/assets/CE0/420/sprockets%2F5b3a1508216cb6b968313beae256f788 +0 -0
  268. data/test/dummy/tmp/cache/assets/CE1/A00/sprockets%2F168b4bf7364dfd883a5930302e0f554c +0 -0
  269. data/test/dummy/tmp/cache/assets/CE4/F60/sprockets%2Fbc3490162e3489bf88aab055d19397f0 +0 -0
  270. data/test/dummy/tmp/cache/assets/CE5/F10/sprockets%2Fe9cf045465025d8527c83c3b93625fca +0 -0
  271. data/test/dummy/tmp/cache/assets/CE5/F90/sprockets%2F31557450886bf9c124f2fdb42704ce8e +0 -0
  272. data/test/dummy/tmp/cache/assets/CE5/FE0/sprockets%2F627e4127557531a3f8471cfbc718ed2f +0 -0
  273. data/test/dummy/tmp/cache/assets/CE6/4A0/sprockets%2F9c04b8b8df7217a708732da4982a5f61 +0 -0
  274. data/test/dummy/tmp/cache/assets/CE7/650/sprockets%2F834b60044436456eefb9ce5cf7144d38 +0 -0
  275. data/test/dummy/tmp/cache/assets/CE7/A40/sprockets%2F2974c4aef7a04f06738c8f6a2066e292 +0 -0
  276. data/test/dummy/tmp/cache/assets/CE7/C70/sprockets%2F8627e999f207ce7214e0ab06afe86412 +0 -0
  277. data/test/dummy/tmp/cache/assets/CE8/AA0/sprockets%2Fd569f5f91016b77401782ef3b42de6a6 +0 -0
  278. data/test/dummy/tmp/cache/assets/CE8/DC0/sprockets%2F49324064376deb60c942b7d85a3e7d9b +0 -0
  279. data/test/dummy/tmp/cache/assets/CEA/6D0/sprockets%2F1da842257a051a9e871c739d29b7d77f +0 -0
  280. data/test/dummy/tmp/cache/assets/CEA/E10/sprockets%2F888c18a6b36ca5e51363b7b21c29f877 +0 -0
  281. data/test/dummy/tmp/cache/assets/CEB/520/sprockets%2Fe99130a4204fac5e0b886885339af7c8 +0 -0
  282. data/test/dummy/tmp/cache/assets/CEB/C10/sprockets%2F6cadb28080126992d76e5e35ba79088e +0 -0
  283. data/test/dummy/tmp/cache/assets/CEC/2B0/sprockets%2F917af8a56c884b3d5c6a03593d95a365 +0 -0
  284. data/test/dummy/tmp/cache/assets/CEC/7A0/sprockets%2F1ccee406d881875c559b82932a25e7d4 +0 -0
  285. data/test/dummy/tmp/cache/assets/CEE/920/sprockets%2F97c97b08d42738b583ed92b55c540a4f +0 -0
  286. data/test/dummy/tmp/cache/assets/CEF/F00/sprockets%2F8ac77338a1dc57bb32999653c561e74e +0 -0
  287. data/test/dummy/tmp/cache/assets/CF0/950/sprockets%2Fd08f99c34c161881adb05d342e8984f9 +0 -0
  288. data/test/dummy/tmp/cache/assets/CF1/000/sprockets%2Fa779ae7d9f80d3098529264b91dd405d +0 -0
  289. data/test/dummy/tmp/cache/assets/CF1/5B0/sprockets%2F46e4886602bb924fc5c638865b6bf4f2 +0 -0
  290. data/test/dummy/tmp/cache/assets/CF5/2E0/sprockets%2F14513ab2f3a0311abd083e70c99bd293 +0 -0
  291. data/test/dummy/tmp/cache/assets/CF5/5C0/sprockets%2F64a4190014fe00d17e708fc02dfc2a32 +0 -0
  292. data/test/dummy/tmp/cache/assets/CF6/4E0/sprockets%2Ff9c27df89c8173d41850b9c40e766a85 +0 -0
  293. data/test/dummy/tmp/cache/assets/CF6/710/sprockets%2Fe53fe9369ad5f26285ab27754a943c88 +0 -0
  294. data/test/dummy/tmp/cache/assets/CF9/B70/sprockets%2F8144ebf49f85b18c46d90b897239b56e +0 -0
  295. data/test/dummy/tmp/cache/assets/CFB/540/sprockets%2Fc40fe1438edc416788894df8b834f944 +0 -0
  296. data/test/dummy/tmp/cache/assets/CFC/7F0/sprockets%2F6158d3ff6993e4c114a894dd371999ec +0 -0
  297. data/test/dummy/tmp/cache/assets/CFD/EA0/sprockets%2Fe43051fb1f2752c010e292ccbc53399b +0 -0
  298. data/test/dummy/tmp/cache/assets/CFD/F60/sprockets%2Fb5776671dd7cf557332f7720f49c9c9f +0 -0
  299. data/test/dummy/tmp/cache/assets/CFD/F80/sprockets%2Fe2b02979764013ad04e2f2b23d28e2ca +0 -0
  300. data/test/dummy/tmp/cache/assets/D00/690/sprockets%2F488324fb426a1e3cb3ca16488caf4004 +0 -0
  301. data/test/dummy/tmp/cache/assets/D01/A00/sprockets%2F5704bfb588da51f6053f30abd310b458 +0 -0
  302. data/test/dummy/tmp/cache/assets/D02/4C0/sprockets%2F6386d72b2c51c911a7fd84ba612430cc +0 -0
  303. data/test/dummy/tmp/cache/assets/D02/6E0/sprockets%2F886e897f07ee48ec4e9f640643440dd9 +0 -0
  304. data/test/dummy/tmp/cache/assets/D03/EF0/sprockets%2F4799db40f9cc57f50689f6da487464f5 +0 -0
  305. data/test/dummy/tmp/cache/assets/D04/530/sprockets%2Fc14ce481964a025c2501a5c907c65fce +0 -0
  306. data/test/dummy/tmp/cache/assets/D06/590/sprockets%2F19c899c20cf5d9b8629878e3add89708 +0 -0
  307. data/test/dummy/tmp/cache/assets/D06/A70/sprockets%2Ff5da4e04222a35db9d267255424bf5c6 +0 -0
  308. data/test/dummy/tmp/cache/assets/D07/330/sprockets%2F3b24c0c589b1004b399d108ae5d6ef81 +0 -0
  309. data/test/dummy/tmp/cache/assets/D07/7F0/sprockets%2F3fb0ed6b32aa83a6878d12a209c38824 +0 -0
  310. data/test/dummy/tmp/cache/assets/D08/530/sprockets%2F311d9ba15b34718d1e60ddc95a84194d +0 -0
  311. data/test/dummy/tmp/cache/assets/D08/D80/sprockets%2F388df4f82d11657bb0b4024448b6af2b +0 -0
  312. data/test/dummy/tmp/cache/assets/D09/7F0/sprockets%2Fa2d67c31222348f16a9812df26da3e8d +0 -0
  313. data/test/dummy/tmp/cache/assets/D09/E40/sprockets%2Fc2693927bc52084b4d2b89373aaa0ac9 +0 -0
  314. data/test/dummy/tmp/cache/assets/D0A/830/sprockets%2F3155dcf93a62cf601a0d48b2806b599b +0 -0
  315. data/test/dummy/tmp/cache/assets/D0A/830/sprockets%2F830cdfb33202453675d55d8de703fa2f +0 -0
  316. data/test/dummy/tmp/cache/assets/D0B/3E0/sprockets%2F66c11f02337c8851bfab67bbb3b94916 +0 -0
  317. data/test/dummy/tmp/cache/assets/D0C/2E0/sprockets%2Fecb35ec370e250a63784c2f508b76a38 +0 -0
  318. data/test/dummy/tmp/cache/assets/D0E/010/sprockets%2F797b9e08c55a2106f8e2dace455710d0 +0 -0
  319. data/test/dummy/tmp/cache/assets/D0E/180/sprockets%2F045e183281dfc37485db513d585c5bdb +0 -0
  320. data/test/dummy/tmp/cache/assets/D0E/EA0/sprockets%2F1d36a1420cf4558fb3c793316ae89ca7 +0 -0
  321. data/test/dummy/tmp/cache/assets/D0F/7E0/sprockets%2F45f0d1bae6783a949cd01767d4c7e212 +0 -0
  322. data/test/dummy/tmp/cache/assets/D0F/9E0/sprockets%2F1536c04e487ca1a768d90a68513c3cff +0 -0
  323. data/test/dummy/tmp/cache/assets/D10/750/sprockets%2F4c4a696e3e0b905d75ed60f9042cd227 +0 -0
  324. data/test/dummy/tmp/cache/assets/D11/FC0/sprockets%2F9bd6c83d367423fe05ef6c3338143aa6 +0 -0
  325. data/test/dummy/tmp/cache/assets/D11/FD0/sprockets%2Fa7872e06fd015c19f48f4c350d63cc19 +0 -0
  326. data/test/dummy/tmp/cache/assets/D12/1C0/sprockets%2F5901cb9faf1725dd2e472ca2965b4287 +0 -0
  327. data/test/dummy/tmp/cache/assets/D12/BE0/sprockets%2Ff01aaa83ff0f19584cb671837a7d7444 +0 -0
  328. data/test/dummy/tmp/cache/assets/D13/6B0/sprockets%2F0975ed2a9d299bf1c719b3b1137e581b +0 -0
  329. data/test/dummy/tmp/cache/assets/D14/340/sprockets%2F4d057c80e80694c2c4d637ecd538bc08 +0 -0
  330. data/test/dummy/tmp/cache/assets/D14/BD0/sprockets%2Ffc2255112852fb55d96d41a92f8fb6b6 +0 -0
  331. data/test/dummy/tmp/cache/assets/D14/DA0/sprockets%2F54a7d7c2a544df07d57173cda79e9700 +0 -0
  332. data/test/dummy/tmp/cache/assets/D15/A20/sprockets%2F46b5881e463b09c7f61736e5ec2aeb16 +0 -0
  333. data/test/dummy/tmp/cache/assets/D15/A20/sprockets%2F9e52b9b230f4aa1d0e1a74699d82e983 +0 -0
  334. data/test/dummy/tmp/cache/assets/D16/2A0/sprockets%2F3739709cf73c9a32b521b45677cd4bde +0 -0
  335. data/test/dummy/tmp/cache/assets/D17/6C0/sprockets%2F69144d8b21e495ac17e4994fdfa3a803 +0 -0
  336. data/test/dummy/tmp/cache/assets/D19/680/sprockets%2Fcd3a545b89d274cfd328f4d341f96272 +0 -0
  337. data/test/dummy/tmp/cache/assets/D19/E90/sprockets%2F16cd7e58935dd8d1d376f10be6b50368 +0 -0
  338. data/test/dummy/tmp/cache/assets/D1A/0C0/sprockets%2Fa606399c0ce2e298b58fec46777024ad +0 -0
  339. data/test/dummy/tmp/cache/assets/D1B/C80/sprockets%2F835147dfca8c918a99182e9e2e600f1c +0 -0
  340. data/test/dummy/tmp/cache/assets/D1C/070/sprockets%2F19aa6be16056890e435d65d4c84cf69e +0 -0
  341. data/test/dummy/tmp/cache/assets/D1D/700/sprockets%2F72d9824da671eff2338d52de93b83a56 +0 -0
  342. data/test/dummy/tmp/cache/assets/D1D/C60/sprockets%2F54364ea078190fbd4168336feef963fc +0 -0
  343. data/test/dummy/tmp/cache/assets/D1F/5F0/sprockets%2Ff8cb248d9fc90758124cd284e17e3b66 +0 -0
  344. data/test/dummy/tmp/cache/assets/D21/EF0/sprockets%2F935d9ee3ec37515493a293c3785dadc8 +0 -0
  345. data/test/dummy/tmp/cache/assets/D22/0B0/sprockets%2F9dfda36b032e59892637b875d7af392b +0 -0
  346. data/test/dummy/tmp/cache/assets/D22/2C0/sprockets%2Fe42d5d90d467a803999bdec116955f8b +0 -0
  347. data/test/dummy/tmp/cache/assets/D23/610/sprockets%2F0e51cca080cc65e62e080941b232a1ed +0 -0
  348. data/test/dummy/tmp/cache/assets/D23/EB0/sprockets%2Fe26ee953fe7e3172d737e6e67a96332a +0 -0
  349. data/test/dummy/tmp/cache/assets/D25/C00/sprockets%2Ff63d097054df34bc660bdf98f7661b99 +0 -0
  350. data/test/dummy/tmp/cache/assets/D26/470/sprockets%2F1e9b32c11057bc537b0021de4f1f1fc6 +0 -0
  351. data/test/dummy/tmp/cache/assets/D29/910/sprockets%2Fe51f36e9fde73e3928070a96fcf77571 +0 -0
  352. data/test/dummy/tmp/cache/assets/D2A/E10/sprockets%2F2d2a1cfcc28a38330d30434fd8c1077c +0 -0
  353. data/test/dummy/tmp/cache/assets/D2B/210/sprockets%2F67aaa6c903e6b15c74de39af0002a451 +0 -0
  354. data/test/dummy/tmp/cache/assets/D2B/CF0/sprockets%2F70b2adc5e73b271342371aaad257b76d +0 -0
  355. data/test/dummy/tmp/cache/assets/D2D/E40/sprockets%2Faf21fa3d26ad3f68a23532178e20fb15 +0 -0
  356. data/test/dummy/tmp/cache/assets/D2F/100/sprockets%2F8c0286ee70744ca12c7c12a563de4b2a +0 -0
  357. data/test/dummy/tmp/cache/assets/D32/3E0/sprockets%2Fc9f2c6b93b29fa3b0d5420b751903eb1 +0 -0
  358. data/test/dummy/tmp/cache/assets/D32/6E0/sprockets%2Fb4f78f31b9aab6dbd2911b07076d4601 +0 -0
  359. data/test/dummy/tmp/cache/assets/D32/A80/sprockets%2Fb12fb26042f73cf3b2796abc2836ee20 +0 -0
  360. data/test/dummy/tmp/cache/assets/D36/7F0/sprockets%2F78e0c63f0043ae6e6536ec504cc23a9b +0 -0
  361. data/test/dummy/tmp/cache/assets/D36/E70/sprockets%2F69b00a4118d012bf6d7cf293b5f316ff +0 -0
  362. data/test/dummy/tmp/cache/assets/D37/070/sprockets%2F59e3be9a13634f3b3d0cab4ad0889063 +0 -0
  363. data/test/dummy/tmp/cache/assets/D39/740/sprockets%2Fd4834d921f293e5dcc04bea2b3917d51 +0 -0
  364. data/test/dummy/tmp/cache/assets/D3A/520/sprockets%2F7193d867aa217d4a306848dbcc1d9c0b +0 -0
  365. data/test/dummy/tmp/cache/assets/D3A/670/sprockets%2F0db6624d07920a5f4decb479718da33c +0 -0
  366. data/test/dummy/tmp/cache/assets/D3A/690/sprockets%2Fb5058a82d02b84df6210af598cfa644c +0 -0
  367. data/test/dummy/tmp/cache/assets/D3A/A00/sprockets%2F1077cd94fef55fbb01ce529612180bd5 +0 -0
  368. data/test/dummy/tmp/cache/assets/D3A/ED0/sprockets%2F5ae1cf0266d63b8eb0647535ca93b63d +0 -0
  369. data/test/dummy/tmp/cache/assets/D3C/640/sprockets%2F42e7a70bb8be9398385afb3c4742aa04 +0 -0
  370. data/test/dummy/tmp/cache/assets/D3C/E40/sprockets%2Fba57600a2dd2f6da96613de37f27930f +0 -0
  371. data/test/dummy/tmp/cache/assets/D3D/4E0/sprockets%2F7d37b8c27a3f3b1a02c4fe17643de865 +0 -0
  372. data/test/dummy/tmp/cache/assets/D3E/940/sprockets%2F5ed82a03c1de5c34135b67ff053787ec +0 -0
  373. data/test/dummy/tmp/cache/assets/D3E/F80/sprockets%2Fa146a4bfc3b8cb08334b9b14fe379756 +0 -0
  374. data/test/dummy/tmp/cache/assets/D3F/050/sprockets%2Fab4aa96dbce1e6b359f2658118291d90 +0 -0
  375. data/test/dummy/tmp/cache/assets/D3F/590/sprockets%2F13a259ba93c919fa5a47ba9cf10569f1 +0 -0
  376. data/test/dummy/tmp/cache/assets/D3F/E10/sprockets%2Ff8492202733ea4a4f67065c95eec1beb +0 -0
  377. data/test/dummy/tmp/cache/assets/D40/6C0/sprockets%2Fafe496eaca27b82020893b81383e8b6b +0 -0
  378. data/test/dummy/tmp/cache/assets/D40/D10/sprockets%2F7af151c9b6080d9285fe058ae6d40c4d +0 -0
  379. data/test/dummy/tmp/cache/assets/D40/E50/sprockets%2F278df3df34e9573cbd9a402e42d1193b +0 -0
  380. data/test/dummy/tmp/cache/assets/D41/220/sprockets%2Fafb511e47c76bf448b6f7072c8d3118c +0 -0
  381. data/test/dummy/tmp/cache/assets/D41/770/sprockets%2F271c5f12457864bbb0c6646c9ebf1f3f +0 -0
  382. data/test/dummy/tmp/cache/assets/D41/8A0/sprockets%2Fbc7ce77806517ea173350e6a4d8c55db +0 -0
  383. data/test/dummy/tmp/cache/assets/D41/D70/sprockets%2F48b33bbf96854b502b0eaf902e69d55c +0 -0
  384. data/test/dummy/tmp/cache/assets/D41/FE0/sprockets%2F2901ba969f333cc19393afd2f0fc7c64 +0 -0
  385. data/test/dummy/tmp/cache/assets/D42/970/sprockets%2Fe27c8084b9cf2eaa063f585e92064c5a +0 -0
  386. data/test/dummy/tmp/cache/assets/D43/F70/sprockets%2F2c844357dd8de7db147f80c3539b0ee0 +0 -0
  387. data/test/dummy/tmp/cache/assets/D44/6D0/sprockets%2F4d7032af47bfce2d4a8564830f8a6a96 +0 -0
  388. data/test/dummy/tmp/cache/assets/D45/1C0/sprockets%2F7e052d17bd4b749ba373bea97380c8f6 +0 -0
  389. data/test/dummy/tmp/cache/assets/D45/3B0/sprockets%2Fd26b5a0d570ef57d06df6f032e9b8980 +0 -0
  390. data/test/dummy/tmp/cache/assets/D46/770/sprockets%2F96355435f9ab8090c2d3e4f0ddd9b7c3 +0 -0
  391. data/test/dummy/tmp/cache/assets/D46/8E0/sprockets%2F1a4f07bd2741629bdd572848dccf773e +0 -0
  392. data/test/dummy/tmp/cache/assets/D47/2B0/sprockets%2Ff3d8c4ca1a44044d98395b36b770fcf9 +0 -0
  393. data/test/dummy/tmp/cache/assets/D47/8F0/sprockets%2F1cc6e49382be4f74cbb97821ae1928c4 +0 -0
  394. data/test/dummy/tmp/cache/assets/D47/AC0/sprockets%2Fcb9189183de4d74faa04d6ad1347964f +0 -0
  395. data/test/dummy/tmp/cache/assets/D48/1D0/sprockets%2Fbff4201c0944eaf31a2f6a0110cbd224 +0 -0
  396. data/test/dummy/tmp/cache/assets/D48/2F0/sprockets%2F6b79e4839df89b4abb51c2c6105d15e8 +0 -0
  397. data/test/dummy/tmp/cache/assets/D48/960/sprockets%2F90e2c11ff8fd31e591b9fd39932631bf +0 -0
  398. data/test/dummy/tmp/cache/assets/D4A/C80/sprockets%2F0289519826ada458af4b9a728fdfcf31 +0 -0
  399. data/test/dummy/tmp/cache/assets/D4B/C20/sprockets%2Fc28f3c4d6cd98dbb784830d7c6214d65 +0 -0
  400. data/test/dummy/tmp/cache/assets/D4B/E90/sprockets%2F51d49f9bc2549684e6da91a4e0bc379b +0 -0
  401. data/test/dummy/tmp/cache/assets/D4C/490/sprockets%2F7e207e1654e5343a964fd6cf3fefb447 +0 -0
  402. data/test/dummy/tmp/cache/assets/D4C/BD0/sprockets%2F4ac9d1aa903d4731edf18fe2b9589829 +0 -0
  403. data/test/dummy/tmp/cache/assets/D4E/640/sprockets%2Fdaab3d2130266b5b7a2f1d04b8c4322e +0 -0
  404. data/test/dummy/tmp/cache/assets/D4E/6C0/sprockets%2Fedd9cf282af0f00637e5273c8c3888b9 +0 -0
  405. data/test/dummy/tmp/cache/assets/D4E/D00/sprockets%2F1a6846f0a837ae2524e2f9ec89e6ef43 +0 -0
  406. data/test/dummy/tmp/cache/assets/D4F/410/sprockets%2F1377bb2e86073ae3a688e5a6c499a9df +0 -0
  407. data/test/dummy/tmp/cache/assets/D50/E10/sprockets%2F28698bc0c536fe5e97a2935e3bb929bb +0 -0
  408. data/test/dummy/tmp/cache/assets/D51/230/sprockets%2F742ba6ca9f84d98ffc38ca5687c05155 +0 -0
  409. data/test/dummy/tmp/cache/assets/D53/440/sprockets%2F2def445147b9f5d6363f6f6d497d2f0e +0 -0
  410. data/test/dummy/tmp/cache/assets/D53/DE0/sprockets%2F7736b51cb3bf8679b8bdc8ab9d184954 +0 -0
  411. data/test/dummy/tmp/cache/assets/D54/0D0/sprockets%2F448752db3a53dd453db1b01de121ebd2 +0 -0
  412. data/test/dummy/tmp/cache/assets/D56/1F0/sprockets%2F291fcb7a26ff3aac6bc1404e0a247242 +0 -0
  413. data/test/dummy/tmp/cache/assets/D57/DF0/sprockets%2F8d06b94587d49e037e77f8afcb6802cf +0 -0
  414. data/test/dummy/tmp/cache/assets/D59/070/sprockets%2F822cd47e69d40ba87f95181fdd698ed5 +0 -0
  415. data/test/dummy/tmp/cache/assets/D5A/070/sprockets%2Fe7159b621a21a7a0ebd81a32912e8faa +0 -0
  416. data/test/dummy/tmp/cache/assets/D5A/D80/sprockets%2F28dc9152e2ead49ae414a5b82d04a1a2 +0 -0
  417. data/test/dummy/tmp/cache/assets/D5C/660/sprockets%2F5baf6a64b3151ae6bf40155e90db6e03 +0 -0
  418. data/test/dummy/tmp/cache/assets/D5C/E00/sprockets%2F92930d4e993eb8bd3498b699dccf9a33 +0 -0
  419. data/test/dummy/tmp/cache/assets/D5E/3D0/sprockets%2F5f786d832b4e0ba05f6abc3ea314901a +0 -0
  420. data/test/dummy/tmp/cache/assets/D5F/7F0/sprockets%2Fabbcc55042a82b42c900c09d59de4c29 +0 -0
  421. data/test/dummy/tmp/cache/assets/D60/2A0/sprockets%2Fcd5c12269b6c414bf722c6c2dc0e18c4 +0 -0
  422. data/test/dummy/tmp/cache/assets/D62/140/sprockets%2F7e5a724c4c00951a0da7ec767ce19aa1 +0 -0
  423. data/test/dummy/tmp/cache/assets/D62/2E0/sprockets%2F51a06ddef9bd05b405fd605d37be3154 +0 -0
  424. data/test/dummy/tmp/cache/assets/D63/B00/sprockets%2F2672399dfcdd2b6b61536cab3d800bc1 +0 -0
  425. data/test/dummy/tmp/cache/assets/D63/D60/sprockets%2Ff791df22a3d7e2f4ef01ad0742f370c1 +0 -0
  426. data/test/dummy/tmp/cache/assets/D63/DC0/sprockets%2Fc298c2b66150c7f11d95cecf450bb14a +0 -0
  427. data/test/dummy/tmp/cache/assets/D63/DE0/sprockets%2F73c9e04acfc930681ab170b3e4bfc453 +0 -0
  428. data/test/dummy/tmp/cache/assets/D64/670/sprockets%2F7dc8c0ad36d436eb56a0824a46e0eb08 +0 -0
  429. data/test/dummy/tmp/cache/assets/D64/B50/sprockets%2F7ac06eacb363b85744337c0ea88e2b0c +0 -0
  430. data/test/dummy/tmp/cache/assets/D65/990/sprockets%2Fa2965ca374a00aaceb747e60b654e2f8 +0 -0
  431. data/test/dummy/tmp/cache/assets/D66/360/sprockets%2Fc94d86aa0bc1a44817a1fd3db0873a87 +0 -0
  432. data/test/dummy/tmp/cache/assets/D66/6C0/sprockets%2F1b63a7f0e3fb2a7f3124f198d0ff462b +0 -0
  433. data/test/dummy/tmp/cache/assets/D67/8E0/sprockets%2Ffd0eaaf36da9805e6c4ec303534162f5 +0 -0
  434. data/test/dummy/tmp/cache/assets/D67/C10/sprockets%2Ffb4b4451c110f07957c2ecacf854c5d4 +0 -0
  435. data/test/dummy/tmp/cache/assets/D68/000/sprockets%2F39c01fa5c01830f3558eb1c97c4dfb6b +0 -0
  436. data/test/dummy/tmp/cache/assets/D68/0C0/sprockets%2F6c628ddf1ba5c680e04ad54a476f163b +0 -0
  437. data/test/dummy/tmp/cache/assets/D68/210/sprockets%2Fdc284967860db06c2cb2e1da78bab156 +0 -0
  438. data/test/dummy/tmp/cache/assets/D6A/2E0/sprockets%2Fc3a3a8e66c9b58b52b1db3ad754c9423 +0 -0
  439. data/test/dummy/tmp/cache/assets/D6B/BA0/sprockets%2F8293eb343aead8dda54496532fb24fa1 +0 -0
  440. data/test/dummy/tmp/cache/assets/D6C/AD0/sprockets%2Fdabce05f6e4419832e20d6b7420fe9a7 +0 -0
  441. data/test/dummy/tmp/cache/assets/D6D/080/sprockets%2F3cc7b7355591babda1661e6c5e9f8c20 +0 -0
  442. data/test/dummy/tmp/cache/assets/D6D/690/sprockets%2Fd288d7215df092fdc70b3b8216dce2f3 +0 -0
  443. data/test/dummy/tmp/cache/assets/D6D/7A0/sprockets%2Fff4be901f55528b85b2b1fc73ebc4352 +0 -0
  444. data/test/dummy/tmp/cache/assets/D6D/E80/sprockets%2F9ef00ee94e3b0eed7c4e45b342085d51 +0 -0
  445. data/test/dummy/tmp/cache/assets/D6E/940/sprockets%2Fb19f43bd8383eeb5e26a4d2b79f1240e +0 -0
  446. data/test/dummy/tmp/cache/assets/D6E/9F0/sprockets%2F15f61ad82d9ca6cce6a0e42b7249662f +0 -0
  447. data/test/dummy/tmp/cache/assets/D6E/AD0/sprockets%2F4441be9946083b61e75f7bf1a1cca5cf +0 -0
  448. data/test/dummy/tmp/cache/assets/D73/3F0/sprockets%2F09b4a9c1131740eba5d85fcf9c86b97a +0 -0
  449. data/test/dummy/tmp/cache/assets/D76/030/sprockets%2F7e8689ec6a9f3754a4aa660e303cbf4a +0 -0
  450. data/test/dummy/tmp/cache/assets/D76/C80/sprockets%2F952307811ad5e9e8b540cf5e9cf08cea +0 -0
  451. data/test/dummy/tmp/cache/assets/D76/CA0/sprockets%2F797920cdabaf2f8431968a34c2cbae79 +0 -0
  452. data/test/dummy/tmp/cache/assets/D77/B70/sprockets%2Fa02f64f352cfa69d33983fd15e8ea3d7 +0 -0
  453. data/test/dummy/tmp/cache/assets/D77/FF0/sprockets%2F126c2e2ca6f5e8477c9525f46cdba7d5 +0 -0
  454. data/test/dummy/tmp/cache/assets/D79/2F0/sprockets%2F4b9fd617fe0d6c7e5eb934a139507e3d +0 -0
  455. data/test/dummy/tmp/cache/assets/D79/E80/sprockets%2F7d329345d1b9f914c87fc5e07ea9ab4b +0 -0
  456. data/test/dummy/tmp/cache/assets/D7A/5C0/sprockets%2F6e2b202ee971a68c1e78eddf5658e53a +0 -0
  457. data/test/dummy/tmp/cache/assets/D7A/8C0/sprockets%2Fc477a2d0aa5d658fd7294d6f6c5a484e +0 -0
  458. data/test/dummy/tmp/cache/assets/D7C/160/sprockets%2F6847e66cdafb094701f479a515ede5dd +0 -0
  459. data/test/dummy/tmp/cache/assets/D7C/750/sprockets%2F1f76d236fdf42a817bd84da719fde069 +0 -0
  460. data/test/dummy/tmp/cache/assets/D7C/B90/sprockets%2Fc89b5af12387ee80ca80e3f2ac776c79 +0 -0
  461. data/test/dummy/tmp/cache/assets/D7E/2A0/sprockets%2F1ce479f9423e748690a75abbabf8af84 +0 -0
  462. data/test/dummy/tmp/cache/assets/D7F/A60/sprockets%2F5c683951503f673cceffa6ba76f38b8d +0 -0
  463. data/test/dummy/tmp/cache/assets/D81/120/sprockets%2F75c7f18e61fa042b776ce2e5c3ff786f +0 -0
  464. data/test/dummy/tmp/cache/assets/D82/560/sprockets%2Fcb5875caef3f569f08878b13cdd991a2 +0 -0
  465. data/test/dummy/tmp/cache/assets/D84/0A0/sprockets%2F07fc0bfe2237a171b813aa147f3ced1a +0 -0
  466. data/test/dummy/tmp/cache/assets/D85/050/sprockets%2Fa9b35663e7dc78eacde8d84ae3599163 +0 -0
  467. data/test/dummy/tmp/cache/assets/D85/5A0/sprockets%2Fc2cbee1b5160e0e8b022933feb36ea30 +0 -0
  468. data/test/dummy/tmp/cache/assets/D87/6D0/sprockets%2F51df69aad9a6f892254deb9d4c1992f8 +0 -0
  469. data/test/dummy/tmp/cache/assets/D88/1B0/sprockets%2Fb5bb04fc812b607ce046a4b702be4c4f +0 -0
  470. data/test/dummy/tmp/cache/assets/D88/7E0/sprockets%2Fe9fedb2c5be893a15939dc65f684196b +0 -0
  471. data/test/dummy/tmp/cache/assets/D8A/2C0/sprockets%2F6ec8da0142f240ce8a7e0b46aea363c1 +0 -0
  472. data/test/dummy/tmp/cache/assets/D8A/370/sprockets%2Fb4600d72a29aba7a39c2ec58aa04f18b +0 -0
  473. data/test/dummy/tmp/cache/assets/D8A/B90/sprockets%2F7506f75d60f93f9e8405ffb9cf85ddb2 +0 -0
  474. data/test/dummy/tmp/cache/assets/D8A/BF0/sprockets%2F1967ce66d464496a6fab44ff8be55ef6 +0 -0
  475. data/test/dummy/tmp/cache/assets/D8C/9C0/sprockets%2F2e7c2cd86215800a37c4d4b1bf0bea5f +0 -0
  476. data/test/dummy/tmp/cache/assets/D8E/910/sprockets%2Fbbf8e4c05ca721c1cd18c17902256ade +0 -0
  477. data/test/dummy/tmp/cache/assets/D8F/C40/sprockets%2Fa76260381aff4aa0c8beea0404e95de2 +0 -0
  478. data/test/dummy/tmp/cache/assets/D93/3B0/sprockets%2Fd0fb3bdcf317425a433a125c986b3dff +0 -0
  479. data/test/dummy/tmp/cache/assets/D94/1A0/sprockets%2Fb4748c092e8a4c127bcfacb06cdc2735 +0 -0
  480. data/test/dummy/tmp/cache/assets/D94/AD0/sprockets%2Fa1ac4bf342006e1f98def10cf9d7d234 +0 -0
  481. data/test/dummy/tmp/cache/assets/D95/430/sprockets%2Fcf054ac65aa2c4b72d661fc32c898aa5 +0 -0
  482. data/test/dummy/tmp/cache/assets/D96/C10/sprockets%2F620f6865aeb0de3c5cf8b305b13c7cb7 +0 -0
  483. data/test/dummy/tmp/cache/assets/D97/2B0/sprockets%2F16a899a4b20af5f53cdd2870e1b0aed8 +0 -0
  484. data/test/dummy/tmp/cache/assets/D97/4C0/sprockets%2F4d4aea86610bc9652c70455a6beafc4d +0 -0
  485. data/test/dummy/tmp/cache/assets/D99/330/sprockets%2Ff01679ca9c88dd0a3eb6922b0b8f3bc0 +0 -0
  486. data/test/dummy/tmp/cache/assets/D99/B10/sprockets%2F4aa8fece5b18d820a44dc266a89d50e0 +0 -0
  487. data/test/dummy/tmp/cache/assets/D99/CD0/sprockets%2Ffe0c5f4b8b52baa0f91870da12599a6d +0 -0
  488. data/test/dummy/tmp/cache/assets/D9D/170/sprockets%2F37f702f1f3ad35b9022fc87fdce7de02 +0 -0
  489. data/test/dummy/tmp/cache/assets/D9E/C90/sprockets%2F9cd75b38f1c1f85bbdac2576ca9106b5 +0 -0
  490. data/test/dummy/tmp/cache/assets/D9F/6F0/sprockets%2Fff261c15e6b97bf57e372f0de1ad571a +0 -0
  491. data/test/dummy/tmp/cache/assets/D9F/800/sprockets%2F5c722d8150c68e6eacad70fb64e5e1f5 +0 -0
  492. data/test/dummy/tmp/cache/assets/DA0/1B0/sprockets%2F71e2cd8803aac9fb0bb4c47593cf17e8 +0 -0
  493. data/test/dummy/tmp/cache/assets/DA1/530/sprockets%2F88a8bb9debb752ba06f07909db83e02d +0 -0
  494. data/test/dummy/tmp/cache/assets/DA3/9F0/sprockets%2F5122955dfe6694bdc6b69cbea09d2cd1 +0 -0
  495. data/test/dummy/tmp/cache/assets/DA4/450/sprockets%2F6f2bd50f9f1551ed8e00fd8b84f37c2c +0 -0
  496. data/test/dummy/tmp/cache/assets/DA5/0E0/sprockets%2Fe61590dc98f1e532ea20e296c5fce7bd +0 -0
  497. data/test/dummy/tmp/cache/assets/DA6/FC0/sprockets%2F900ed66847c0ec1eff94ad75fc26f11e +0 -0
  498. data/test/dummy/tmp/cache/assets/DAB/B00/sprockets%2F5286678a74e7bcc66e0d3c7c7d2db5fb +0 -0
  499. data/test/dummy/tmp/cache/assets/DAD/810/sprockets%2Fcfb7db145b0d0a3010f5d0cd7a08fb15 +0 -0
  500. data/test/dummy/tmp/cache/assets/DAE/A40/sprockets%2F7fefa2cd6e72f17c926159c9b7c3a95a +0 -0
  501. data/test/dummy/tmp/cache/assets/DB0/BF0/sprockets%2F52e4cdf37aa489ff6c138dedf036588d +0 -0
  502. data/test/dummy/tmp/cache/assets/DB1/C80/sprockets%2Fa2d1a10a3cc780fd30127b2be96ddfa2 +0 -0
  503. data/test/dummy/tmp/cache/assets/DB2/850/sprockets%2F9d6e12a0e28cc9ded4e859613cf75f6e +0 -0
  504. data/test/dummy/tmp/cache/assets/DB6/710/sprockets%2Ff53e9d96ae4808ad0f9e09ab4ef78f80 +0 -0
  505. data/test/dummy/tmp/cache/assets/DBA/7F0/sprockets%2F4f7fd7b68b8bc29c67fa996e37eaf512 +0 -0
  506. data/test/dummy/tmp/cache/assets/DBD/080/sprockets%2F039ace5986a3cbf4cca0b0a753bc71a6 +0 -0
  507. data/test/dummy/tmp/cache/assets/DBE/210/sprockets%2Fa12ca5480c3e2b9cf44ab4ef32e813ec +0 -0
  508. data/test/dummy/tmp/cache/assets/DBE/DF0/sprockets%2F6d1f018e11ee2240a8dd1df920c6cddd +0 -0
  509. data/test/dummy/tmp/cache/assets/DC0/760/sprockets%2Fb7e4cf2efcf48d0dcc420131fd30d454 +0 -0
  510. data/test/dummy/tmp/cache/assets/DC1/C20/sprockets%2Fb60b7b3aeb56bd55b67183b6f151ecca +0 -0
  511. data/test/dummy/tmp/cache/assets/DC5/5F0/sprockets%2F9d4cc0ae7ac214bb22c7cf455d06b9c9 +0 -0
  512. data/test/dummy/tmp/cache/assets/DC5/660/sprockets%2F637431e1c8fffeaafc23f021bd49fa06 +0 -0
  513. data/test/dummy/tmp/cache/assets/DC6/7C0/sprockets%2Fb408df7a822c70a0924e0cdf6c8fe2ca +0 -0
  514. data/test/dummy/tmp/cache/assets/DC8/2F0/sprockets%2F15c5ad9491aa5ef9fe4aef6333fa12c0 +0 -0
  515. data/test/dummy/tmp/cache/assets/DC8/C70/sprockets%2Fbb5351434afe5616cbe7e4a6cea95a6b +0 -0
  516. data/test/dummy/tmp/cache/assets/DCC/F40/sprockets%2Fdc3342c548fc7d3c4f4e27732b5acfea +0 -0
  517. data/test/dummy/tmp/cache/assets/DCD/390/sprockets%2Fdcd461b67aec99b76eea270a9ad2c046 +0 -0
  518. data/test/dummy/tmp/cache/assets/DCD/730/sprockets%2Fe577d2f2df0ce1516b2bdfa9fe0909e0 +0 -0
  519. data/test/dummy/tmp/cache/assets/DCD/8D0/sprockets%2Fbf36f09be83b4d0986ad23ea4d1f32df +0 -0
  520. data/test/dummy/tmp/cache/assets/DCE/1C0/sprockets%2F58cc5eb1cb2a47c8067c940caecf449d +0 -0
  521. data/test/dummy/tmp/cache/assets/DCE/BA0/sprockets%2F57c5ecddc82aa706b1e64691a8a5bcc9 +0 -0
  522. data/test/dummy/tmp/cache/assets/DCF/4A0/sprockets%2F3efd01a56bae3ae99fd13085f75b9e0d +0 -0
  523. data/test/dummy/tmp/cache/assets/DD1/4A0/sprockets%2Fd1fd81d46b69d255ebc7ab7f3f96a03a +0 -0
  524. data/test/dummy/tmp/cache/assets/DD2/380/sprockets%2F7972dab64d4a2a8007c3ecfd887ace4e +0 -0
  525. data/test/dummy/tmp/cache/assets/DD2/D90/sprockets%2Facc08ab37871b8576bfcb992aedaf228 +0 -0
  526. data/test/dummy/tmp/cache/assets/DD3/FE0/sprockets%2Fd19b0f09a29f8558a8d1f5cfc02acec9 +0 -0
  527. data/test/dummy/tmp/cache/assets/DD8/5C0/sprockets%2F9dd7bcb46a4b58ee446353a9cdaf93f2 +0 -0
  528. data/test/dummy/tmp/cache/assets/DD9/AA0/sprockets%2Ff96cdb075b4fc5b6eabb92832f6ad758 +0 -0
  529. data/test/dummy/tmp/cache/assets/DD9/F90/sprockets%2Ff09bdb745c8fa4987aa1ffcd6370c94b +0 -0
  530. data/test/dummy/tmp/cache/assets/DDB/140/sprockets%2F7815fdf1a6a74db4fca71ff6537ced67 +0 -0
  531. data/test/dummy/tmp/cache/assets/DDD/E10/sprockets%2Fd7292f5eb3a7b1f583efbf05aef567d9 +0 -0
  532. data/test/dummy/tmp/cache/assets/DDE/C00/sprockets%2Ffb5947d8ea5a7d6c08c71b3c9d7a88cb +0 -0
  533. data/test/dummy/tmp/cache/assets/DE7/3B0/sprockets%2F55fc91edc7ee6e5f818993cbddb6b707 +0 -0
  534. data/test/dummy/tmp/cache/assets/DE7/550/sprockets%2Ffff04b0980f1fbe9ece54cd8ca779867 +0 -0
  535. data/test/dummy/tmp/cache/assets/DE8/980/sprockets%2Fea9daa72d1acd0886cc064d0ea6c4a30 +0 -0
  536. data/test/dummy/tmp/cache/assets/DEF/140/sprockets%2F0182a5cba9d2df2eabb3783cf53a1ea9 +0 -0
  537. data/test/dummy/tmp/cache/assets/DF5/0C0/sprockets%2Faf8105cfdb7ceae04b099c4a2f654ce1 +0 -0
  538. data/test/dummy/tmp/cache/assets/DF5/4D0/sprockets%2Fa1a06ee61db75c3c0bed4caad288789b +0 -0
  539. data/test/dummy/tmp/cache/assets/DF7/110/sprockets%2F0654cdd8dfa5adb61e2029fefe5f50c0 +0 -0
  540. data/test/dummy/tmp/cache/assets/DF7/D40/sprockets%2F38cdcfc274accc45023affa7be98350c +0 -0
  541. data/test/dummy/tmp/cache/assets/DF8/570/sprockets%2Fd956ef1a15caba08edb2fc63c569f20d +0 -0
  542. data/test/dummy/tmp/cache/assets/DFB/E90/sprockets%2Ff7bd5fbb19ef32fc5a396d8012fac3f0 +0 -0
  543. data/test/dummy/tmp/cache/assets/DFC/9D0/sprockets%2F38fd8e0a2fde3b853f2a24571cd2dfdd +0 -0
  544. data/test/dummy/tmp/cache/assets/DFE/3C0/sprockets%2Fe7c824dbbee345aa5a66a56ebe82a29e +0 -0
  545. data/test/dummy/tmp/cache/assets/DFF/560/sprockets%2F5c1cedb5538de9d0c4dc9fdb62554fa1 +0 -0
  546. data/test/dummy/tmp/cache/assets/E02/B00/sprockets%2F723ccdfbeacf6c4176de34f371c91af9 +0 -0
  547. data/test/dummy/tmp/cache/assets/E02/DA0/sprockets%2F9829dec75de6c2a52fdc20d428d2edae +0 -0
  548. data/test/dummy/tmp/cache/assets/E04/860/sprockets%2F972757dbdbdfabfeac8ecb8a15520793 +0 -0
  549. data/test/dummy/tmp/cache/assets/E05/A70/sprockets%2F7a4daf48a8b7fba4f7bd770048b37fbf +0 -0
  550. data/test/dummy/tmp/cache/assets/E07/5B0/sprockets%2F75fdbfc0584a9cb9dda6428a66dec4b5 +0 -0
  551. data/test/dummy/tmp/cache/assets/E0C/810/sprockets%2Fe74897a12cedd8efea5a559354bd5bfc +0 -0
  552. data/test/dummy/tmp/cache/assets/E0F/B40/sprockets%2Ff5dfabed7f563e53d4735ef9c4b7a0e9 +0 -0
  553. data/test/dummy/tmp/cache/assets/E11/400/sprockets%2Ff6a9c23ee9f2ed728efa077ea66dfb55 +0 -0
  554. data/test/dummy/tmp/cache/assets/E11/4E0/sprockets%2F86e145a39f85cceeaffdff91ebb61449 +0 -0
  555. data/test/dummy/tmp/cache/assets/E11/C70/sprockets%2Fe5ad970d57c66489f9eebacb8e3a5ae5 +0 -0
  556. data/test/dummy/tmp/cache/assets/E13/B10/sprockets%2Fafbb0a11dcbf1c86ee74a1f22f2c173a +0 -0
  557. data/test/dummy/tmp/cache/assets/E14/0B0/sprockets%2F8bffda6f68fc139ee329bc86f6b7d2f1 +0 -0
  558. data/test/dummy/tmp/cache/assets/E1E/DE0/sprockets%2F84b3baefc2c0a8c2c9c0a92eacc3557b +0 -0
  559. data/test/dummy/tmp/cache/assets/E1F/5E0/sprockets%2Fedacf71afed14b1da329d30fcaf84091 +0 -0
  560. data/test/dummy/tmp/cache/assets/E21/330/sprockets%2F816aead61cd3e240f2bbe1e78da1fdb7 +0 -0
  561. data/test/dummy/tmp/cache/assets/E27/540/sprockets%2F3507970b2c1ccbf7b6bc37d61efadfeb +0 -0
  562. data/test/dummy/tmp/cache/assets/E2A/030/sprockets%2Fc8ab33fc707f5fb9b8befd27b142b3cb +0 -0
  563. data/test/dummy/tmp/cache/assets/E2C/EA0/sprockets%2Fcb15d5ff97502cc7dfe8a2e06ab16efb +0 -0
  564. data/test/dummy/tmp/cache/assets/E2F/3D0/sprockets%2Ff740ae8eecbaedadc3c664c62b83e925 +0 -0
  565. data/test/dummy/tmp/cache/assets/E30/C50/sprockets%2Fdaad6c4c7b1429f8de49d81fac6ad18b +0 -0
  566. data/test/dummy/tmp/cache/assets/E32/FD0/sprockets%2Fce7d29b07b2f0d14ef1add992dfafa89 +0 -0
  567. data/test/dummy/tmp/cache/assets/E36/230/sprockets%2F56aec75c7f17ef3509d4cadcf2e6fc3d +0 -0
  568. data/test/dummy/tmp/cache/assets/E37/6B0/sprockets%2Fce49aa1fbe8185b07e78cf9b9eee22ab +0 -0
  569. data/test/dummy/tmp/cache/assets/E3B/DD0/sprockets%2F8cb9fef1ee4f6bcbb80758f5c675db1a +0 -0
  570. data/test/dummy/tmp/cache/assets/E3C/680/sprockets%2Fd057ba99f8cc7b032da8ed9e8c0dff7c +0 -0
  571. data/test/dummy/tmp/cache/assets/E3E/270/sprockets%2F426e7ee1f8aeb990a55fdf8d6eefbd04 +0 -0
  572. data/test/dummy/tmp/cache/assets/E54/0F0/sprockets%2Fddbe86c2b19c9b2c5d0bca8e248a1fcb +0 -0
  573. data/test/dummy/tmp/cache/assets/E83/3A0/sprockets%2Ffdb5f7dc3aba4ce1edb8fd4bd1b42923 +0 -0
  574. data/test/dummy/tmp/cache/assets/E89/BE0/sprockets%2F9bfc41fee1adbc5e0ab3e58eafb550f9 +0 -0
  575. data/test/dummy/tmp/cache/assets/E93/2E0/sprockets%2Fba1eb3cc84f5e1fd789bf5f61a8ecdbc +0 -0
  576. metadata +90 -24
  577. data/app/assets/javascripts/Core/computeSunPosition.js +0 -116
  578. data/app/assets/javascripts/DynamicScene/CzmlCartographic.js +0 -125
  579. data/app/assets/javascripts/DynamicScene/DynamicConeVisualizer.js +0 -350
  580. data/app/assets/javascripts/Scene/ComplexConicSensorVolume.js +0 -511
  581. data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeFS.glsl +0 -448
  582. data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeVS.glsl +0 -19
  583. data/app/assets/javascripts/Shaders/ConstructiveSolidGeometry.glsl +0 -886
  584. data/app/assets/javascripts/Shaders/Noise.glsl +0 -453
  585. data/app/assets/javascripts/Shaders/PolygonFSPick.glsl +0 -6
  586. data/app/assets/javascripts/Shaders/PolygonVSPick.glsl +0 -30
  587. data/app/assets/javascripts/Shaders/Ray.glsl +0 -532
  588. data/app/assets/javascripts/Widgets/Animation/darker.css +0 -69
  589. data/app/assets/javascripts/Widgets/Dojo/CesiumWidget.html +0 -4
  590. data/app/assets/javascripts/Widgets/Dojo/CesiumWidget.js +0 -348
  591. data/app/assets/javascripts/Widgets/Fullscreen/darker.css +0 -14
  592. data/app/assets/javascripts/Widgets/Images/enterFullscreen-darker.svg +0 -18
  593. data/app/assets/javascripts/Widgets/Images/exitFullscreen-darker.svg +0 -18
  594. data/app/assets/javascripts/Widgets/Images/viewControlBar.png +0 -0
  595. data/app/assets/javascripts/Widgets/Timeline/darker.css +0 -20
  596. data/app/assets/javascripts/Workers/package.json +0 -6
@@ -6,7 +6,9 @@ define([
6
6
  '../Core/BoundingSphere',
7
7
  '../Core/Cartesian3',
8
8
  '../Core/Color',
9
- '../Core/PolylinePipeline'
9
+ '../Core/PolylinePipeline',
10
+ '../Core/Matrix4',
11
+ './Material'
10
12
  ], function(
11
13
  defaultValue,
12
14
  DeveloperError,
@@ -14,7 +16,9 @@ define([
14
16
  BoundingSphere,
15
17
  Cartesian3,
16
18
  Color,
17
- PolylinePipeline) {
19
+ PolylinePipeline,
20
+ Matrix4,
21
+ Material) {
18
22
  "use strict";
19
23
 
20
24
  var EMPTY_OBJECT = {};
@@ -24,15 +28,20 @@ define([
24
28
  *
25
29
  * @alias Polyline
26
30
  * @internalConstructor
31
+ *
32
+ * @demo <a href="http://cesium.agi.com/Cesium/Apps/Sandcastle/index.html?src=Polylines.html">Cesium Sandcastle Polyline Demo</a>
27
33
  */
28
34
  var Polyline = function(description, polylineCollection) {
29
35
  description = defaultValue(description, EMPTY_OBJECT);
30
36
 
31
37
  this._show = defaultValue(description.show, true);
32
38
  this._width = defaultValue(description.width, 1.0);
33
- this._outlineWidth = defaultValue(description.outlineWidth, 1.0);
34
- this._color = Color.clone(defaultValue(description.color, Color.WHITE));
35
- this._outlineColor = Color.clone(defaultValue(description.outlineColor, Color.WHITE));
39
+
40
+ this._material = description.material;
41
+ if (typeof this._material === 'undefined') {
42
+ this._material = Material.fromType(undefined, Material.ColorType);
43
+ this._material.uniforms.color = new Color(1.0, 1.0, 1.0, 1.0);
44
+ }
36
45
 
37
46
  var positions = description.positions;
38
47
  if (typeof positions === 'undefined') {
@@ -40,27 +49,32 @@ define([
40
49
  }
41
50
 
42
51
  this._positions = positions;
43
- this._positionsLength = positions.length;
44
- this._actualLength = positions.length;
52
+
53
+ var modelMatrix;
54
+ if (typeof this._polylineCollection !== 'undefined') {
55
+ modelMatrix = Matrix4.clone(this._polylineCollection.modelMatrix);
56
+ }
57
+
58
+ this._modelMatrix = modelMatrix;
59
+ this._segments = PolylinePipeline.wrapLongitude(positions, modelMatrix);
60
+
61
+ this._actualLength = undefined;
45
62
 
46
63
  this._propertiesChanged = new Uint32Array(NUMBER_OF_PROPERTIES);
47
64
  this._polylineCollection = polylineCollection;
48
65
  this._dirty = false;
49
66
  this._pickId = undefined;
50
67
  this._pickIdThis = description._pickIdThis;
51
- this._segments = undefined;
52
68
  this._boundingVolume = BoundingSphere.fromPoints(this._positions);
53
69
  this._boundingVolume2D = new BoundingSphere(); // modified in PolylineCollection
54
70
  };
55
71
 
56
72
  var SHOW_INDEX = Polyline.SHOW_INDEX = 0;
57
- var POSITION_INDEX = Polyline.POSITION_INDEX = 1;
58
- var COLOR_INDEX = Polyline.COLOR_INDEX = 2;
59
- var OUTLINE_COLOR_INDEX = Polyline.OUTLINE_COLOR_INDEX = 3;
60
- var WIDTH_INDEX = Polyline.WIDTH_INDEX = 4;
61
- var OUTLINE_WIDTH_INDEX = Polyline.OUTLINE_WIDTH_INDEX = 5;
62
- var POSITION_SIZE_INDEX = Polyline.POSITION_SIZE_INDEX = 6;
63
- var NUMBER_OF_PROPERTIES = Polyline.NUMBER_OF_PROPERTIES = 7;
73
+ var WIDTH_INDEX = Polyline.WIDTH_INDEX = 1;
74
+ var POSITION_INDEX = Polyline.POSITION_INDEX = 2;
75
+ var MATERIAL_INDEX = Polyline.MATERIAL_INDEX = 3;
76
+ var POSITION_SIZE_INDEX = Polyline.POSITION_SIZE_INDEX = 4;
77
+ var NUMBER_OF_PROPERTIES = Polyline.NUMBER_OF_PROPERTIES = 5;
64
78
 
65
79
  function makeDirty(polyline, propertyChanged) {
66
80
  ++polyline._propertiesChanged[propertyChanged];
@@ -113,6 +127,8 @@ define([
113
127
  *
114
128
  * @memberof Polyline
115
129
  *
130
+ * @return {Array} The polyline's positions.
131
+ *
116
132
  * @see Polyline#setPositions
117
133
  */
118
134
  Polyline.prototype.getPositions = function() {
@@ -144,70 +160,96 @@ define([
144
160
  throw new DeveloperError('value is required.');
145
161
  }
146
162
 
147
- if (this._positionsLength !== value.length) {
148
- this._positionsLength = value.length;
163
+ if (this._positions.length !== value.length) {
149
164
  makeDirty(this, POSITION_SIZE_INDEX);
150
165
  }
151
166
 
152
167
  this._positions = value;
153
168
  this._boundingVolume = BoundingSphere.fromPoints(this._positions, this._boundingVolume);
154
169
  makeDirty(this, POSITION_INDEX);
170
+
171
+ this.update();
172
+ };
173
+
174
+ /**
175
+ * @private
176
+ */
177
+ Polyline.prototype.update = function() {
178
+ var modelMatrix = Matrix4.IDENTITY;
179
+ if (typeof this._polylineCollection !== 'undefined') {
180
+ modelMatrix = this._polylineCollection.modelMatrix;
181
+ }
182
+
183
+ var segmentPositionsLength = this._segments.positions.length;
184
+ var segmentLengths = this._segments.lengths;
185
+
186
+ var positionsChanged = this._propertiesChanged[POSITION_INDEX] > 0 || this._propertiesChanged[POSITION_SIZE_INDEX] > 0;
187
+ if (!modelMatrix.equals(this._modelMatrix) || positionsChanged) {
188
+ this._segments = PolylinePipeline.wrapLongitude(this._positions, modelMatrix);
189
+ }
190
+
191
+ this._modelMatrix = modelMatrix;
192
+
193
+ if (this._segments.positions.length !== segmentPositionsLength) {
194
+ // number of positions changed
195
+ makeDirty(this, POSITION_SIZE_INDEX);
196
+ } else {
197
+ var length = segmentLengths.length;
198
+ for (var i = 0; i < length; ++i) {
199
+ if (segmentLengths[i] !== this._segments.lengths[i]) {
200
+ // indices changed
201
+ makeDirty(this, POSITION_SIZE_INDEX);
202
+ break;
203
+ }
204
+ }
205
+ }
155
206
  };
156
207
 
157
208
  /**
158
- * Returns the color of the polyline.
209
+ * Gets the surface appearance of the polyline. This can be one of several built-in {@link Material} objects or a custom material, scripted with
210
+ * <a href='https://github.com/AnalyticalGraphicsInc/cesium/wiki/Fabric'>Fabric</a>.
159
211
  *
160
212
  * @memberof Polyline
161
213
  *
162
- * @return {Color} The color of the polyline.
163
- *
164
- * @see Polyline#setColor
214
+ * @returns {Material} The material.
165
215
  */
166
- Polyline.prototype.getColor = function() {
167
- return this._color;
216
+ Polyline.prototype.getMaterial = function() {
217
+ return this._material;
168
218
  };
169
219
 
170
220
  /**
171
- * Sets the color of the polyline.
221
+ * Sets the surface appearance of the polyline. This can be one of several built-in {@link Material} objects or a custom material, scripted with
222
+ * <a href='https://github.com/AnalyticalGraphicsInc/cesium/wiki/Fabric'>Fabric</a>.
172
223
  *
173
224
  * @memberof Polyline
174
225
  *
175
- * @param {Color} value The color of the polyline.
226
+ * @param {Material} material The material
176
227
  *
177
- * @exception {DeveloperError} value is required.
228
+ * @exception {DeveloperError} material is required.
178
229
  *
179
- * @see Polyline#getColor
230
+ * @see Polyline#getMaterial
180
231
  */
181
- Polyline.prototype.setColor = function(value) {
182
- if (typeof value === 'undefined') {
183
- throw new DeveloperError('value is required.');
232
+ Polyline.prototype.setMaterial = function(material) {
233
+ if (typeof material === 'undefined') {
234
+ throw new DeveloperError('material is required.');
184
235
  }
185
236
 
186
- var color = this._color;
187
- if (!Color.equals(color, value)) {
188
- Color.clone(value, color);
189
- makeDirty(this, COLOR_INDEX);
190
- }
237
+ this._material = material;
238
+ makeDirty(this, MATERIAL_INDEX);
191
239
  };
192
240
 
193
241
  /**
194
242
  * Gets the width of the polyline.
195
- * The actual width used is clamped to the minimum and maximum width supported by
196
- * the WebGL implementation. These can be queried with
197
- * {@link Context#getMinimumAliasedLineWidth} and {@link Context#getMaximumAliasedLineWidth}.
198
243
  *
199
244
  * @memberof Polyline
200
245
  *
201
246
  * @return {Number} The width of the polyline.
202
247
  *
203
248
  * @see Polyline#setWidth
204
- * @see Context#getMinimumAliasedLineWidth
205
- * @see Context#getMaximumAliasedLineWidth
206
249
  *
207
250
  * @example
208
- * // 3 pixel total width, 1 pixel interior width
209
- * polyline.width = 1.0;
210
- * polyline.outlineWidth = 3.0;
251
+ * polyline.setWidth(5.0);
252
+ * var width = polyline.getWidth(); // 5.0
211
253
  */
212
254
  Polyline.prototype.getWidth = function() {
213
255
  return this._width;
@@ -215,22 +257,18 @@ define([
215
257
 
216
258
  /**
217
259
  * Sets the width of the polyline.
218
- * The actual width used is clamped to the minimum and maximum width supported by
219
- * the WebGL implementation. These can be queried with
220
- * {@link Context#getMinimumAliasedLineWidth} and {@link Context#getMaximumAliasedLineWidth}.
260
+ *
261
+ * @memberof Polyline
221
262
  *
222
263
  * @param {Number} value The width of the polyline.
223
264
  *
224
265
  * @exception {DeveloperError} value is required.
225
266
  *
226
267
  * @see Polyline#getWidth
227
- * @see Context#getMinimumAliasedLineWidth
228
- * @see Context#getMaximumAliasedLineWidth
229
268
  *
230
269
  * @example
231
- * // 3 pixel total width, 1 pixel interior width
232
- * polyline.width = 1.0;
233
- * polyline.outlineWidth = 3.0;
270
+ * polyline.setWidth(5.0);
271
+ * var width = polyline.getWidth(); // 5.0
234
272
  */
235
273
  Polyline.prototype.setWidth = function(value) {
236
274
  if (typeof value === 'undefined') {
@@ -244,97 +282,10 @@ define([
244
282
  }
245
283
  };
246
284
 
247
-
248
- /**
249
- * Gets the outline width of the polyline.
250
- * The actual width used is clamped to the minimum and maximum width supported by
251
- * the WebGL implementation. These can be queried with
252
- * {@link Context#getMinimumAliasedLineWidth} and {@link Context#getMaximumAliasedLineWidth}.
253
- *
254
- * @return {Number} The outline width of the polyline.
255
- *
256
- * @see Polyline#setOutlineWidth
257
- * @see Context#getMinimumAliasedLineWidth
258
- * @see Context#getMaximumAliasedLineWidth
259
- *
260
- * @example
261
- * // 3 pixel total width, 1 pixel interior width
262
- * polyline.width = 1.0;
263
- * polyline.outlineWidth = 3.0;
264
- */
265
- Polyline.prototype.getOutlineWidth = function() {
266
- return this._outlineWidth;
267
- };
268
-
269
- /**
270
- * Sets the outline width of the polyline.
271
- * The actual width used is clamped to the minimum and maximum width supported by
272
- * the WebGL implementation. These can be queried with
273
- * {@link Context#getMinimumAliasedLineWidth} and {@link Context#getMaximumAliasedLineWidth}.
274
- *
275
- * @param {Number} value The outline width of the polyline.
276
- *
277
- * @exception {DeveloperError} value is required.
278
- *
279
- * @see Polyline#getOutlineWidth
280
- * @see Context#getMinimumAliasedLineWidth
281
- * @see Context#getMaximumAliasedLineWidth
282
- *
283
- * @example
284
- * // 3 pixel total width, 1 pixel interior width
285
- * polyline.width = 1.0;
286
- * polyline.outlineWidth = 3.0;
287
- */
288
- Polyline.prototype.setOutlineWidth = function(value) {
289
- if (typeof value === 'undefined') {
290
- throw new DeveloperError('value is required.');
291
- }
292
-
293
- var outlineWidth = this._outlineWidth;
294
- if (value !== outlineWidth) {
295
- this._outlineWidth = value;
296
- makeDirty(this, OUTLINE_WIDTH_INDEX);
297
- }
298
- };
299
-
300
- /**
301
- * Gets the outline color of the polyline.
302
- *
303
- * @memberof Polyline
304
- *
305
- * @return {Color} The outline color of the polyline.
306
- *
307
- * @see Polyline#setOutlineColor
308
- */
309
- Polyline.prototype.getOutlineColor = function() {
310
- return this._outlineColor;
311
- };
312
-
313
- /**
314
- * Sets the outline color of the polyline.
315
- *
316
- * @memberof Polyline
317
- *
318
- * @param {Color} value The outline color of the polyline.
319
- *
320
- * @exception {DeveloperError} value is required.
321
- *
322
- * @see Polyline#getOutlineColor
323
- */
324
- Polyline.prototype.setOutlineColor = function(value) {
325
- if (typeof value === 'undefined') {
326
- throw new DeveloperError('value is required.');
327
- }
328
-
329
- var outlineColor = this._outlineColor;
330
- if (!Color.equals(outlineColor, value)) {
331
- Color.clone(value, outlineColor);
332
- makeDirty(this, OUTLINE_COLOR_INDEX);
333
- }
334
- };
335
-
336
285
  Polyline.prototype.getPickId = function(context) {
337
- this._pickId = this._pickId || context.createPickId(this._pickIdThis || this);
286
+ if (typeof this._pickId === 'undefined') {
287
+ this._pickId = context.createPickId(defaultValue(this._pickIdThis, this));
288
+ }
338
289
  return this._pickId;
339
290
  };
340
291
 
@@ -346,94 +297,9 @@ define([
346
297
  }
347
298
  };
348
299
 
349
- Polyline.prototype._getPositions2D = function() {
350
- var segments = this._segments;
351
- var positions = [];
352
- var numberOfSegments = segments.length;
353
-
354
- for ( var i = 0; i < numberOfSegments; ++i) {
355
- var segment = segments[i];
356
- var segmentLength = segment.length;
357
- for ( var n = 0; n < segmentLength; ++n) {
358
- positions.push(segment[n].cartesian);
359
- }
360
- }
361
- return positions;
362
- };
363
-
364
- Polyline.prototype._createSegments = function(modelMatrix) {
365
- return PolylinePipeline.wrapLongitude(this.getPositions(), modelMatrix);
366
- };
367
-
368
- Polyline.prototype._setSegments = function(segments) {
369
- this._segments = segments;
370
- var numberOfSegments = segments.length;
371
- var length = 0;
372
- for ( var i = 0; i < numberOfSegments; ++i) {
373
- var segment = segments[i];
374
- var segmentLength = segment.length;
375
- length += segmentLength;
376
- }
377
- return length;
378
- };
379
-
380
- Polyline.prototype._getSegments = function() {
381
- return this._segments;
382
- };
383
-
384
- Polyline.prototype._segmentsLengthChanged = function(newSegments) {
385
- var origSegments = this._segments;
386
- if (typeof origSegments !== 'undefined') {
387
- var numberOfSegments = newSegments.length;
388
- if (numberOfSegments !== origSegments.length) {
389
- return true;
390
- }
391
- for ( var i = 0; i < numberOfSegments; ++i) {
392
- if (newSegments[i].length !== origSegments[i].length) {
393
- return true;
394
- }
395
- }
396
- return false;
397
- }
398
- return true;
399
- };
400
-
401
- /**
402
- * Determines if this polyline equals another polyline. Polylines are equal if all their properties
403
- * are equal. Polylines in different collections can be equal.
404
- *
405
- * @memberof Polyline
406
- *
407
- * @param {Polyline} other The polyline to compare for equality.
408
- *
409
- * @return {Boolean} <code>true</code> if the polylines are equal; otherwise, <code>false</code>.
410
- */
411
- Polyline.prototype.equals = function(other) {
412
- return this === other ||
413
- typeof other !== 'undefined' &&
414
- this._show === other._show &&
415
- this._width === other._width &&
416
- this._outlineWidth === other._outlineWidth &&
417
- this._horizontalOrigin === other._horizontalOrigin &&
418
- cartesian3ArrayEquals(this._positions, other._positions) &&
419
- Color.equals(this._color, other._color) &&
420
- Color.equals(this._outlineColor, other._outlineColor);
421
- };
422
-
423
- function cartesian3ArrayEquals(a, b) {
424
- if (a.length !== b.length) {
425
- return false;
426
- }
427
- for ( var i = 0, len = a.length; i < len; ++i) {
428
- if (!Cartesian3.equals(a[i], b[i])) {
429
- return false;
430
- }
431
- }
432
- return true;
433
- }
434
-
435
300
  Polyline.prototype._destroy = function() {
436
301
  this._pickId = this._pickId && this._pickId.destroy();
302
+ this._material = this._material && this._material.destroy();
437
303
  this._polylineCollection = undefined;
438
304
  };
439
305
 
@@ -1,6 +1,7 @@
1
1
  /*global define*/
2
2
  define([
3
3
  '../Core/DeveloperError',
4
+ '../Core/Color',
4
5
  '../Core/combine',
5
6
  '../Core/destroyObject',
6
7
  '../Core/Cartesian3',
@@ -10,21 +11,21 @@ define([
10
11
  '../Core/ComponentDatatype',
11
12
  '../Core/IndexDatatype',
12
13
  '../Core/PrimitiveType',
13
- '../Core/Color',
14
14
  '../Core/BoundingSphere',
15
15
  '../Core/Intersect',
16
16
  '../Renderer/BlendingState',
17
17
  '../Renderer/BufferUsage',
18
18
  '../Renderer/CommandLists',
19
19
  '../Renderer/DrawCommand',
20
+ '../Renderer/createPickFragmentShaderSource',
21
+ './Material',
20
22
  './SceneMode',
21
23
  './Polyline',
22
24
  '../Shaders/PolylineVS',
23
- '../Shaders/PolylineFS',
24
- '../Renderer/StencilFunction',
25
- '../Renderer/StencilOperation'
25
+ '../Shaders/PolylineFS'
26
26
  ], function(
27
27
  DeveloperError,
28
+ Color,
28
29
  combine,
29
30
  destroyObject,
30
31
  Cartesian3,
@@ -34,27 +35,24 @@ define([
34
35
  ComponentDatatype,
35
36
  IndexDatatype,
36
37
  PrimitiveType,
37
- Color,
38
38
  BoundingSphere,
39
39
  Intersect,
40
40
  BlendingState,
41
41
  BufferUsage,
42
42
  CommandLists,
43
43
  DrawCommand,
44
+ createPickFragmentShaderSource,
45
+ Material,
44
46
  SceneMode,
45
47
  Polyline,
46
48
  PolylineVS,
47
- PolylineFS,
48
- StencilFunction,
49
- StencilOperation) {
49
+ PolylineFS) {
50
50
  "use strict";
51
51
 
52
52
  var SHOW_INDEX = Polyline.SHOW_INDEX;
53
- var POSITION_INDEX = Polyline.POSITION_INDEX;
54
- var COLOR_INDEX = Polyline.COLOR_INDEX;
55
- var OUTLINE_COLOR_INDEX = Polyline.OUTLINE_COLOR_INDEX;
56
53
  var WIDTH_INDEX = Polyline.WIDTH_INDEX;
57
- var OUTLINE_WIDTH_INDEX = Polyline.OUTLINE_WIDTH_INDEX;
54
+ var POSITION_INDEX = Polyline.POSITION_INDEX;
55
+ var MATERIAL_INDEX = Polyline.MATERIAL_INDEX;
58
56
  //POSITION_SIZE_INDEX is needed for when the polyline's position array changes size.
59
57
  //When it does, we need to recreate the indicesBuffer.
60
58
  var POSITION_SIZE_INDEX = Polyline.POSITION_SIZE_INDEX;
@@ -66,9 +64,16 @@ define([
66
64
  position3DLow : 1,
67
65
  position2DHigh : 2,
68
66
  position2DLow : 3,
69
- color : 4,
70
- pickColor : 5,
71
- show : 6
67
+ prevPosition3DHigh : 4,
68
+ prevPosition3DLow : 5,
69
+ prevPosition2DHigh : 6,
70
+ prevPosition2DLow : 7,
71
+ nextPosition3DHigh : 8,
72
+ nextPosition3DLow : 9,
73
+ nextPosition2DHigh : 10,
74
+ nextPosition2DLow : 11,
75
+ texCoordExpandWidthAndShow : 12,
76
+ pickColor : 13
72
77
  };
73
78
 
74
79
  /**
@@ -104,9 +109,9 @@ define([
104
109
  * new Cartographic2(-77.02, 38.53),
105
110
  * new Cartographic2(-80.50, 35.14),
106
111
  * new Cartographic2(-80.12, 25.46)]),
107
- width:2
108
- });
109
-
112
+ * width:2
113
+ * });
114
+ *
110
115
  * polylines.add({positions:ellipsoid.cartographicDegreesToCartesians([
111
116
  * new Cartographic2(-73.10, 37.57),
112
117
  * new Cartographic2(-75.02, 36.53),
@@ -114,16 +119,10 @@ define([
114
119
  * new Cartographic2(-78.12, 23.46)]),
115
120
  * width:4
116
121
  * });
122
+ *
123
+ * @demo <a href="http://cesium.agi.com/Cesium/Apps/Sandcastle/index.html?src=Polylines.html">Cesium Sandcastle Polyline Demo</a>
117
124
  */
118
125
  var PolylineCollection = function() {
119
- /**
120
- * The current morph transition time between 2D/Columbus View and 3D,
121
- * with 0.0 being 2D or Columbus View and 1.0 being 3D.
122
- *
123
- * @type Number
124
- */
125
- this.morphTime = 1.0;
126
-
127
126
  /**
128
127
  * The 4x4 transformation matrix that transforms each polyline in this collection from model to world coordinates.
129
128
  * When this is the identity matrix, the polylines are drawn in world coordinates, i.e., Earth's WGS84 coordinates.
@@ -138,12 +137,14 @@ define([
138
137
  */
139
138
  this.modelMatrix = Matrix4.IDENTITY.clone();
140
139
  this._modelMatrix = Matrix4.IDENTITY.clone();
141
- this._sp = undefined;
140
+ this._rs = undefined;
142
141
 
143
142
  this._boundingVolume = undefined;
144
143
  this._boundingVolume2D = undefined;
145
144
 
146
145
  this._commandLists = new CommandLists();
146
+ this._colorCommands = [];
147
+ this._pickCommands = [];
147
148
 
148
149
  this._polylinesUpdated = false;
149
150
  this._polylinesRemoved = false;
@@ -154,32 +155,18 @@ define([
154
155
 
155
156
  // The buffer usage for each attribute is determined based on the usage of the attribute over time.
156
157
  this._buffersUsage = [
157
- {bufferUsage: BufferUsage.STATIC_DRAW, frameCount:0},// SHOW_INDEX
158
- {bufferUsage: BufferUsage.STATIC_DRAW, frameCount:0}, // POSITION_INDEX
159
- {bufferUsage: BufferUsage.STATIC_DRAW, frameCount:0}, // COLOR_INDEX
160
- {bufferUsage: BufferUsage.STATIC_DRAW, frameCount:0}, // OUTLINE_COLOR_INDEX
158
+ {bufferUsage: BufferUsage.STATIC_DRAW, frameCount:0}, // SHOW_INDEX
161
159
  {bufferUsage: BufferUsage.STATIC_DRAW, frameCount:0}, // WIDTH_INDEX
162
- {bufferUsage: BufferUsage.STATIC_DRAW, frameCount:0} // OUTLINE_WIDTH_INDEX
160
+ {bufferUsage: BufferUsage.STATIC_DRAW, frameCount:0} // POSITION_INDEX
163
161
  ];
164
162
 
165
163
  this._mode = undefined;
166
- var that = this;
167
-
168
- this._uniforms = {
169
- u_morphTime : function() {
170
- return that.morphTime;
171
- }
172
- };
173
164
 
174
165
  this._polylinesToUpdate = [];
175
- this._colorVertexArrays = [];
176
- this._outlineColorVertexArrays = [];
177
- this._pickColorVertexArrays = [];
166
+ this._vertexArrays = [];
178
167
  this._positionBuffer = undefined;
179
- this._outlineColorBuffer = undefined;
180
- this._colorBuffer = undefined;
181
168
  this._pickColorBuffer = undefined;
182
- this._showBuffer = undefined;
169
+ this._texCoordExpandWidthAndShowBuffer = undefined;
183
170
  };
184
171
 
185
172
  /**
@@ -209,9 +196,7 @@ define([
209
196
  * positions : ellipsoid.cartographicDegreesToCartesians([
210
197
  * new Cartographic2(-75.10, 39.57),
211
198
  * new Cartographic2(-77.02, 38.53)]),
212
- * color : { red : 1.0, green : 1.0, blue : 1.0, alpha : 1.0 },
213
- * width : 1,
214
- * outlineWidth : 2
199
+ * width : 1
215
200
  * });
216
201
  *
217
202
  */
@@ -254,6 +239,11 @@ define([
254
239
  this._polylines[polyline._index] = null; // Removed later
255
240
  this._polylinesRemoved = true;
256
241
  this._createVertexArray = true;
242
+ if (typeof polyline._bucket !== 'undefined') {
243
+ var bucket = polyline._bucket;
244
+ bucket.shaderProgram = bucket.shaderProgram && bucket.shaderProgram.release();
245
+ bucket.pickShaderProgram = bucket.pickShaderProgram && bucket.pickShaderProgram.release();
246
+ }
257
247
  polyline._destroy();
258
248
  return true;
259
249
  }
@@ -281,7 +271,8 @@ define([
281
271
  * polylines.removeAll();
282
272
  */
283
273
  PolylineCollection.prototype.removeAll = function() {
284
- this._destroyPolylines();
274
+ releaseShaders(this);
275
+ destroyPolylines(this);
285
276
  this._polylineBuckets = {};
286
277
  this._polylinesRemoved = false;
287
278
  this._polylines.length = 0;
@@ -339,7 +330,7 @@ define([
339
330
  throw new DeveloperError('index is required.');
340
331
  }
341
332
 
342
- this._removePolylines();
333
+ removePolylines(this);
343
334
  return this._polylines[index];
344
335
  };
345
336
 
@@ -369,77 +360,58 @@ define([
369
360
  * }
370
361
  */
371
362
  PolylineCollection.prototype.getLength = function() {
372
- this._removePolylines();
363
+ removePolylines(this);
373
364
  return this._polylines.length;
374
365
  };
375
366
 
367
+ var emptyArray = [];
368
+ var scracthBoundingSphere = new BoundingSphere();
369
+
376
370
  /**
377
- * Commits changes to properties before rendering by updating the object's WebGL resources.
378
- *
379
- * @memberof PolylineCollection
371
+ * @private
380
372
  */
381
373
  PolylineCollection.prototype.update = function(context, frameState, commandList) {
382
- if (typeof this._sp === 'undefined') {
383
- this._sp = context.getShaderCache().getShaderProgram(PolylineVS, PolylineFS, attributeIndices);
374
+ removePolylines(this);
375
+
376
+ if (this._polylines.length === 0) {
377
+ return;
384
378
  }
385
- this._removePolylines();
386
- this._updateMode(frameState);
387
379
 
388
- var bucket;
389
- var polyline;
390
- var length;
391
- var buckets;
392
- var polylineBuckets;
393
- var bucketLength;
394
- var bucketLocator;
380
+ updateMode(this, frameState);
395
381
 
382
+ var polyline;
396
383
  var properties = this._propertiesChanged;
397
- if (this._createVertexArray || this._computeNewBuffersUsage()) {
398
- this._createVertexArrays(context);
384
+
385
+ if (this._createVertexArray || computeNewBuffersUsage(this)) {
386
+ createVertexArrays(this, context);
399
387
  } else if (this._polylinesUpdated) {
400
388
  // Polylines were modified, but no polylines were added or removed.
401
389
  var polylinesToUpdate = this._polylinesToUpdate;
402
- var createVertexArrays = false;
403
390
  if (this._mode !== SceneMode.SCENE3D) {
404
391
  var updateLength = polylinesToUpdate.length;
405
392
  for ( var i = 0; i < updateLength; ++i) {
406
393
  polyline = polylinesToUpdate[i];
407
- var changedProperties = polyline._propertiesChanged;
408
- if (changedProperties[POSITION_INDEX]) {
409
- var newSegments = polyline._createSegments(this.modelMatrix);
410
- if (polyline._segmentsLengthChanged(newSegments)) {
411
- createVertexArrays = true;
412
- break;
413
- }
414
- polyline._setSegments(newSegments);
415
- }
394
+ polyline.update();
416
395
  }
417
396
  }
418
- //if a polyline's positions size changes, we need to recreate the vertex arrays and vertex buffers because the indices will be different.
419
- if (properties[POSITION_SIZE_INDEX] || properties[WIDTH_INDEX] || properties[OUTLINE_WIDTH_INDEX] || createVertexArrays) {
420
- this._createVertexArrays(context);
397
+
398
+ // if a polyline's positions size changes, we need to recreate the vertex arrays and vertex buffers because the indices will be different.
399
+ // if a polyline's material changes, we need to recreate the VAOs and VBOs because they will be batched differenty.
400
+ if (properties[POSITION_SIZE_INDEX] || properties[MATERIAL_INDEX]) {
401
+ createVertexArrays(this, context);
421
402
  } else {
422
- length = polylinesToUpdate.length;
423
- polylineBuckets = this._polylineBuckets;
403
+ var length = polylinesToUpdate.length;
404
+ var polylineBuckets = this._polylineBuckets;
424
405
  for ( var ii = 0; ii < length; ++ii) {
425
406
  polyline = polylinesToUpdate[ii];
426
407
  properties = polyline._propertiesChanged;
427
- bucket = polyline._bucket;
408
+ var bucket = polyline._bucket;
428
409
  var index = 0;
429
410
  for ( var x in polylineBuckets) {
430
411
  if (polylineBuckets.hasOwnProperty(x)) {
431
412
  if (polylineBuckets[x] === bucket) {
432
- if (properties[POSITION_INDEX]) {
433
- bucket.writePositionsUpdate(index, polyline, this._positionBuffer);
434
- }
435
- if (properties[COLOR_INDEX]) {
436
- bucket.writeColorUpdate(index, polyline, this._colorBuffer);
437
- }
438
- if (properties[OUTLINE_COLOR_INDEX]) {
439
- bucket.writeColorUpdate(index, polyline, this._outlineColorBuffer);
440
- }
441
- if (properties[SHOW_INDEX]) {
442
- bucket.writeShowUpdate(index, polyline, this._showBuffer);
413
+ if (properties[POSITION_INDEX] || properties[SHOW_INDEX] || properties[WIDTH_INDEX]) {
414
+ bucket.writeUpdate(index, polyline, this._positionBuffer, this._texCoordExpandWidthAndShowBuffer);
443
415
  }
444
416
  break;
445
417
  }
@@ -463,113 +435,151 @@ define([
463
435
  if (frameState.mode === SceneMode.SCENE3D) {
464
436
  boundingVolume = this._boundingVolume;
465
437
  modelMatrix = this.modelMatrix;
466
- } else if (frameState.mode === SceneMode.COLUMBUS_VIEW || frameState.mode === SceneMode.SCENE2D) {
438
+ } else if (frameState.mode === SceneMode.COLUMBUS_VIEW) {
467
439
  boundingVolume = this._boundingVolume2D;
468
- } else {
469
- boundingVolume = this._boundingVolume && this._boundingVolume2D && this._boundingVolume.union(this._boundingVolume2D);
440
+ } else if (frameState.mode === SceneMode.SCENE2D) {
441
+ if (typeof this._boundingVolume2D !== 'undefined') {
442
+ boundingVolume = BoundingSphere.clone(this._boundingVolume2D, scracthBoundingSphere);
443
+ boundingVolume.center.x = 0.0;
444
+ }
445
+ } else if (typeof this._boundingVolume !== 'undefined' && typeof this._boundingVolume2D !== 'undefined') {
446
+ boundingVolume = BoundingSphere.union(this._boundingVolume, this._boundingVolume2D, scracthBoundingSphere);
447
+ }
448
+
449
+ if (typeof boundingVolume === 'undefined') {
450
+ return;
470
451
  }
471
452
 
472
453
  var pass = frameState.passes;
473
- var commands;
474
- var command;
475
- polylineBuckets = this._polylineBuckets;
476
- var sp = this._sp;
477
- this._commandLists.removeAll();
478
- if (typeof polylineBuckets !== 'undefined') {
479
- if (pass.color) {
480
- length = this._colorVertexArrays.length;
481
- commands = this._commandLists.colorList;
482
- for ( var m = 0; m < length; ++m) {
483
- var vaColor = this._colorVertexArrays[m];
484
- var vaOutlineColor = this._outlineColorVertexArrays[m];
485
- buckets = this._colorVertexArrays[m].buckets;
486
- bucketLength = buckets.length;
487
- var p = commands.length;
488
- commands.length += bucketLength * 3;
489
- for ( var n = 0; n < bucketLength; ++n, p += 3) {
490
- bucketLocator = buckets[n];
491
-
492
- command = commands[p];
493
- if (typeof command === 'undefined') {
494
- command = commands[p] = new DrawCommand();
495
- }
454
+ var useDepthTest = (frameState.morphTime !== 0.0);
455
+ var commandLists = this._commandLists;
456
+ commandLists.colorList = emptyArray;
457
+ commandLists.pickList = emptyArray;
458
+
459
+ if ((typeof this._rs === 'undefined') || (this._rs.depthTest.enabled !== useDepthTest)) {
460
+ this._rs = context.createRenderState({
461
+ blending : BlendingState.ALPHA_BLEND,
462
+ depthMask : !useDepthTest,
463
+ depthTest : {
464
+ enabled : useDepthTest
465
+ }
466
+ });
467
+ }
496
468
 
497
- command.boundingVolume = boundingVolume;
498
- command.modelMatrix = modelMatrix;
499
- command.primitiveType = PrimitiveType.LINES;
500
- command.count = bucketLocator.count;
501
- command.offset = bucketLocator.offset;
502
- command.shaderProgram = sp;
503
- command.uniformMap = this._uniforms;
504
- command.vertexArray = vaOutlineColor.va;
505
- command.renderState = bucketLocator.rsOne;
506
-
507
- command = commands[p + 1];
508
- if (typeof command === 'undefined') {
509
- command = commands[p + 1] = new DrawCommand();
510
- }
469
+ if (pass.color) {
470
+ var colorList = this._colorCommands;
471
+ commandLists.colorList = colorList;
511
472
 
512
- command.boundingVolume = boundingVolume;
513
- command.modelMatrix = modelMatrix;
514
- command.primitiveType = PrimitiveType.LINES;
515
- command.count = bucketLocator.count;
516
- command.offset = bucketLocator.offset;
517
- command.shaderProgram = sp;
518
- command.uniformMap = this._uniforms;
519
- command.vertexArray = vaColor.va;
520
- command.renderState = bucketLocator.rsTwo;
521
-
522
- command = commands[p + 2];
523
- if (typeof command === 'undefined') {
524
- command = commands[p + 2] = new DrawCommand();
473
+ createCommandLists(colorList, boundingVolume, modelMatrix, this._vertexArrays, this._rs, true);
474
+ }
475
+
476
+ if (pass.pick) {
477
+ var pickList = this._pickCommands;
478
+ commandLists.pickList = pickList;
479
+
480
+ createCommandLists(pickList, boundingVolume, modelMatrix, this._vertexArrays, this._rs, false);
481
+ }
482
+
483
+ if (!this._commandLists.empty()) {
484
+ commandList.push(this._commandLists);
485
+ }
486
+ };
487
+
488
+ function createCommandLists(commands, boundingVolume, modelMatrix, vertexArrays, renderState, colorPass) {
489
+ var length = vertexArrays.length;
490
+
491
+ var commandsLength = commands.length;
492
+ var commandIndex = 0;
493
+
494
+ for ( var m = 0; m < length; ++m) {
495
+ var va = vertexArrays[m];
496
+ var buckets = va.buckets;
497
+ var bucketLength = buckets.length;
498
+
499
+ for ( var n = 0; n < bucketLength; ++n) {
500
+ var bucketLocator = buckets[n];
501
+
502
+ var offset = bucketLocator.offset;
503
+ var sp = colorPass ? bucketLocator.bucket.shaderProgram : bucketLocator.bucket.pickShaderProgram;
504
+
505
+ var polylines = bucketLocator.bucket.polylines;
506
+ var polylineLength = polylines.length;
507
+ var currentId;
508
+ var currentMaterial;
509
+ var count = 0;
510
+ var command;
511
+
512
+ for (var s = 0; s < polylineLength; ++s) {
513
+ var polyline = polylines[s];
514
+ var mId = createMaterialId(polyline._material);
515
+ if (mId !== currentId) {
516
+ if (typeof currentId !== 'undefined') {
517
+ if (commandIndex >= commandsLength) {
518
+ command = new DrawCommand();
519
+ commands.push(command);
520
+ } else {
521
+ command = commands[commandIndex];
522
+ }
523
+
524
+ ++commandIndex;
525
+
526
+ command.boundingVolume = boundingVolume;
527
+ command.modelMatrix = modelMatrix;
528
+ command.primitiveType = PrimitiveType.TRIANGLES;
529
+ command.shaderProgram = sp;
530
+ command.vertexArray = va.va;
531
+ command.renderState = renderState;
532
+
533
+ command.uniformMap = currentMaterial._uniforms;
534
+ command.count = count;
535
+ command.offset = offset;
536
+
537
+ offset += count;
538
+ count = 0;
525
539
  }
526
540
 
527
- command.boundingVolume = boundingVolume;
528
- command.modelMatrix = modelMatrix;
529
- command.primitiveType = PrimitiveType.LINES;
530
- command.count = bucketLocator.count;
531
- command.offset = bucketLocator.offset;
532
- command.shaderProgram = sp;
533
- command.uniformMap = this._uniforms;
534
- command.vertexArray = vaOutlineColor.va;
535
- command.renderState = bucketLocator.rsThree;
541
+ currentMaterial = polyline._material;
542
+ currentId = mId;
536
543
  }
537
- }
538
- }
539
- if (pass.pick) {
540
- length = this._pickColorVertexArrays.length;
541
- commands = this._commandLists.pickList;
542
- for ( var a = 0; a < length; ++a) {
543
- var vaPickColor = this._pickColorVertexArrays[a];
544
- buckets = vaPickColor.buckets;
545
- bucketLength = buckets.length;
546
- commands.length += bucketLength;
547
- for ( var b = 0; b < bucketLength; ++b) {
548
- bucketLocator = buckets[b];
549
-
550
- command = commands[b];
551
- if (typeof command === 'undefined') {
552
- command = commands[b] = new DrawCommand();
544
+
545
+ var locators = polyline._locatorBuckets;
546
+ var locatorLength = locators.length;
547
+ for (var t = 0; t < locatorLength; ++t) {
548
+ var locator = locators[t];
549
+ if (locator.locator === bucketLocator) {
550
+ count += locator.count;
553
551
  }
552
+ }
553
+ }
554
554
 
555
- command.boundingVolume = boundingVolume;
556
- command.modelMatrix = modelMatrix;
557
- command.primitiveType = PrimitiveType.LINES;
558
- command.count = bucketLocator.count;
559
- command.offset = bucketLocator.offset;
560
- command.shaderProgram = sp;
561
- command.uniformMap = this._uniforms;
562
- command.vertexArray = vaPickColor.va;
563
- command.renderState = bucketLocator.rsPick;
555
+ if (typeof currentId !== 'undefined' && count > 0) {
556
+ if (commandIndex >= commandsLength) {
557
+ command = new DrawCommand();
558
+ commands.push(command);
559
+ } else {
560
+ command = commands[commandIndex];
564
561
  }
562
+
563
+ ++commandIndex;
564
+
565
+ command.boundingVolume = boundingVolume;
566
+ command.modelMatrix = modelMatrix;
567
+ command.primitiveType = PrimitiveType.TRIANGLES;
568
+ command.shaderProgram = sp;
569
+ command.vertexArray = va.va;
570
+ command.renderState = renderState;
571
+
572
+ command.uniformMap = currentMaterial._uniforms;
573
+ command.count = count;
574
+ command.offset = offset;
565
575
  }
576
+
577
+ currentId = undefined;
566
578
  }
567
579
  }
568
580
 
569
- if (!this._commandLists.empty()) {
570
- commandList.push(this._commandLists);
571
- }
572
- };
581
+ commands.length = commandIndex;
582
+ }
573
583
 
574
584
  /**
575
585
  * Returns true if this object was destroyed; otherwise, false.
@@ -607,19 +617,19 @@ define([
607
617
  * polylines = polylines && polylines.destroy();
608
618
  */
609
619
  PolylineCollection.prototype.destroy = function() {
610
- this._sp = this._sp && this._sp.release();
611
- this._destroyVertexArrays();
612
- this._destroyPolylines();
620
+ destroyVertexArrays(this);
621
+ releaseShaders(this);
622
+ destroyPolylines(this);
613
623
  return destroyObject(this);
614
624
  };
615
625
 
616
- PolylineCollection.prototype._computeNewBuffersUsage = function() {
617
- var buffersUsage = this._buffersUsage;
626
+ function computeNewBuffersUsage(collection) {
627
+ var buffersUsage = collection._buffersUsage;
618
628
  var usageChanged = false;
619
629
 
620
- var properties = this._propertiesChanged;
621
- //subtract 1 from NUMBER_OF_PROPERTIES because we don't care about POSITION_SIZE_INDEX property change.
622
- for ( var k = 0; k < NUMBER_OF_PROPERTIES - 1; ++k) {
630
+ var properties = collection._propertiesChanged;
631
+ //subtract 2 from NUMBER_OF_PROPERTIES because we don't care about POSITION_SIZE_INDEX or MATERIAL_INDEX property change.
632
+ for ( var k = 0; k < NUMBER_OF_PROPERTIES - 2; ++k) {
623
633
  var bufferUsage = buffersUsage[k];
624
634
  if (properties[k]) {
625
635
  if (bufferUsage.bufferUsage !== BufferUsage.STREAM_DRAW) {
@@ -641,327 +651,327 @@ define([
641
651
  }
642
652
  }
643
653
  return usageChanged;
644
- };
654
+ }
655
+
656
+ var emptyVertexBuffer = [0.0, 0.0, 0.0];
657
+
658
+ function createVertexArrays(collection, context) {
659
+ collection._createVertexArray = false;
660
+ releaseShaders(collection);
661
+ destroyVertexArrays(collection);
662
+ sortPolylinesIntoBuckets(collection);
645
663
 
646
- PolylineCollection.prototype._createVertexArrays = function(context) {
647
- this._createVertexArray = false;
648
- this._destroyVertexArrays();
649
- this._sortPolylinesIntoBuckets();
650
664
  //stores all of the individual indices arrays.
651
- var totalIndices = [];
652
- var indices = [];
665
+ var totalIndices = [[]];
666
+ var indices = totalIndices[0];
653
667
 
654
668
  //used to determine the vertexBuffer offset if the indicesArray goes over 64k.
655
669
  //if it's the same polyline while it goes over 64k, the offset needs to backtrack componentsPerAttribute * componentDatatype bytes
656
670
  //so that the polyline looks contiguous.
657
671
  //if the polyline ends at the 64k mark, then the offset is just 64k * componentsPerAttribute * componentDatatype
658
672
  var vertexBufferOffset = [0];
659
- totalIndices.push(indices);
660
673
  var offset = 0;
661
- var useDepthTest = (this.morphTime !== 0.0);
662
674
  var vertexArrayBuckets = [[]];
663
675
  var totalLength = 0;
664
- var polylineBuckets = this._polylineBuckets;
676
+ var polylineBuckets = collection._polylineBuckets;
665
677
  var x;
666
678
  var bucket;
667
679
  for (x in polylineBuckets) {
668
680
  if (polylineBuckets.hasOwnProperty(x)) {
669
681
  bucket = polylineBuckets[x];
670
- bucket.updateRenderState(context, useDepthTest);
682
+ bucket.updateShader(context);
671
683
  totalLength += bucket.lengthOfPositions;
672
684
  }
673
685
  }
686
+
674
687
  if (totalLength > 0) {
675
- var positionArray = new Float32Array(2 * totalLength * 3);
676
- var outlineColorArray = new Uint8Array(totalLength * 4);
677
- var colorArray = new Uint8Array(totalLength * 4);
688
+ var mode = collection._mode;
689
+
690
+ var positionArray = new Float32Array(6 * totalLength * 3);
678
691
  var pickColorArray = new Uint8Array(totalLength * 4);
679
- var showArray = new Uint8Array(totalLength);
692
+ var texCoordExpandWidthAndShowArray = new Float32Array(totalLength * 4);
680
693
  var position3DArray;
681
694
 
682
695
  var positionIndex = 0;
683
696
  var colorIndex = 0;
684
- var showIndex = 0;
697
+ var texCoordExpandWidthAndShowIndex = 0;
685
698
  for (x in polylineBuckets) {
686
699
  if (polylineBuckets.hasOwnProperty(x)) {
687
700
  bucket = polylineBuckets[x];
688
- bucket.write(positionArray, colorArray, outlineColorArray, pickColorArray, showArray, positionIndex, showIndex, colorIndex, context);
689
- if (this._mode === SceneMode.MORPHING) {
701
+ bucket.write(positionArray, pickColorArray, texCoordExpandWidthAndShowArray, positionIndex, colorIndex, texCoordExpandWidthAndShowIndex, context);
702
+
703
+ if (mode === SceneMode.MORPHING) {
690
704
  if (typeof position3DArray === 'undefined') {
691
- position3DArray = new Float32Array(2 * totalLength * 3);
705
+ position3DArray = new Float32Array(6 * totalLength * 3);
692
706
  }
693
707
  bucket.writeForMorph(position3DArray, positionIndex);
694
708
  }
709
+
695
710
  var bucketLength = bucket.lengthOfPositions;
696
- positionIndex += 2 * bucketLength * 3;
697
- showIndex += bucketLength;
711
+ positionIndex += 6 * bucketLength * 3;
698
712
  colorIndex += bucketLength * 4;
713
+ texCoordExpandWidthAndShowIndex += bucketLength * 4;
699
714
  offset = bucket.updateIndices(totalIndices, vertexBufferOffset, vertexArrayBuckets, offset);
700
715
  }
701
716
  }
702
- this._positionBuffer = context.createVertexBuffer(positionArray, this._buffersUsage[POSITION_INDEX].bufferUsage);
717
+
718
+ var positionBufferUsage = collection._buffersUsage[POSITION_INDEX].bufferUsage;
719
+ var showBufferUsage = collection._buffersUsage[SHOW_INDEX].bufferUsage;
720
+ var widthBufferUsage = collection._buffersUsage[WIDTH_INDEX].bufferUsage;
721
+ var texCoordExpandWidthAndShowBufferUsage = (showBufferUsage === BufferUsage.STREAM_DRAW || widthBufferUsage === BufferUsage.STREAM_DRAW) ? BufferUsage.STREAM_DRAW : BufferUsage.STATIC_DRAW;
722
+
723
+ collection._positionBuffer = context.createVertexBuffer(positionArray, positionBufferUsage);
703
724
  var position3DBuffer;
704
725
  if (typeof position3DArray !== 'undefined') {
705
- position3DBuffer = context.createVertexBuffer(position3DArray, this._buffersUsage[POSITION_INDEX].bufferUsage);
726
+ position3DBuffer = context.createVertexBuffer(position3DArray, positionBufferUsage);
706
727
  }
707
- this._outlineColorBuffer = context.createVertexBuffer(outlineColorArray, this._buffersUsage[OUTLINE_COLOR_INDEX].bufferUsage);
708
- this._colorBuffer = context.createVertexBuffer(colorArray, this._buffersUsage[COLOR_INDEX].bufferUsage);
709
- this._pickColorBuffer = context.createVertexBuffer(pickColorArray, BufferUsage.STATIC_DRAW);
710
- this._showBuffer = context.createVertexBuffer(showArray, this._buffersUsage[SHOW_INDEX].bufferUsage);
711
- var colorSizeInBytes = 4 * Uint8Array.BYTES_PER_ELEMENT;
728
+ collection._pickColorBuffer = context.createVertexBuffer(pickColorArray, BufferUsage.STATIC_DRAW);
729
+ collection._texCoordExpandWidthAndShowBuffer = context.createVertexBuffer(texCoordExpandWidthAndShowArray, texCoordExpandWidthAndShowBufferUsage);
730
+
731
+ var pickColorSizeInBytes = 4 * Uint8Array.BYTES_PER_ELEMENT;
712
732
  var positionSizeInBytes = 3 * Float32Array.BYTES_PER_ELEMENT;
733
+ var texCoordExpandWidthAndShowSizeInBytes = 4 * Float32Array.BYTES_PER_ELEMENT;
734
+
713
735
  var vbo = 0;
714
736
  var numberOfIndicesArrays = totalIndices.length;
715
737
  for ( var k = 0; k < numberOfIndicesArrays; ++k) {
716
738
  indices = totalIndices[k];
739
+
717
740
  if (indices.length > 0) {
718
741
  var indicesArray = new Uint16Array(indices);
719
742
  var indexBuffer = context.createIndexBuffer(indicesArray, BufferUsage.STATIC_DRAW, IndexDatatype.UNSIGNED_SHORT);
720
- indexBuffer.setVertexArrayDestroyable(false);
743
+
721
744
  vbo += vertexBufferOffset[k];
722
- var positionHighOffset = 2 * (k * (positionSizeInBytes * SIXTYFOURK) - vbo * positionSizeInBytes);//componentsPerAttribute(3) * componentDatatype(4)
745
+
746
+ var positionHighOffset = 6 * (k * (positionSizeInBytes * SIXTYFOURK) - vbo * positionSizeInBytes);//componentsPerAttribute(3) * componentDatatype(4)
723
747
  var positionLowOffset = positionSizeInBytes + positionHighOffset;
724
- var vertexColorBufferOffset = k * (colorSizeInBytes * SIXTYFOURK) - vbo * colorSizeInBytes;
725
- var vertexShowBufferOffset = k * SIXTYFOURK - vbo;
748
+ var prevPositionHighOffset = positionSizeInBytes + positionLowOffset;
749
+ var prevPositionLowOffset = positionSizeInBytes + prevPositionHighOffset;
750
+ var nextPositionHighOffset = positionSizeInBytes + prevPositionLowOffset;
751
+ var nextPositionLowOffset = positionSizeInBytes + nextPositionHighOffset;
752
+ var vertexPickColorBufferOffset = k * (pickColorSizeInBytes * SIXTYFOURK) - vbo * pickColorSizeInBytes;
753
+ var vertexTexCoordExpandWidthAndShowBufferOffset = k * (texCoordExpandWidthAndShowSizeInBytes * SIXTYFOURK) - vbo * texCoordExpandWidthAndShowSizeInBytes;
754
+
726
755
  var attributes = [{
727
756
  index : attributeIndices.position3DHigh,
728
757
  componentsPerAttribute : 3,
729
758
  componentDatatype : ComponentDatatype.FLOAT,
730
759
  offsetInBytes : positionHighOffset,
731
- strideInBytes : 2 * positionSizeInBytes
760
+ strideInBytes : 6 * positionSizeInBytes
732
761
  }, {
733
762
  index : attributeIndices.position3DLow,
734
763
  componentsPerAttribute : 3,
735
764
  componentDatatype : ComponentDatatype.FLOAT,
736
765
  offsetInBytes : positionLowOffset,
737
- strideInBytes : 2 * positionSizeInBytes
766
+ strideInBytes : 6 * positionSizeInBytes
738
767
  }, {
739
768
  index : attributeIndices.position2DHigh,
740
769
  componentsPerAttribute : 3,
741
770
  componentDatatype : ComponentDatatype.FLOAT,
742
771
  offsetInBytes : positionHighOffset,
743
- strideInBytes : 2 * positionSizeInBytes
772
+ strideInBytes : 6 * positionSizeInBytes
744
773
  }, {
745
774
  index : attributeIndices.position2DLow,
746
775
  componentsPerAttribute : 3,
747
776
  componentDatatype : ComponentDatatype.FLOAT,
748
777
  offsetInBytes : positionLowOffset,
749
- strideInBytes : 2 * positionSizeInBytes
778
+ strideInBytes : 6 * positionSizeInBytes
750
779
  }, {
751
- index : attributeIndices.color,
752
- componentsPerAttribute : 4,
753
- normalize : true,
754
- componentDatatype : ComponentDatatype.UNSIGNED_BYTE,
755
- vertexBuffer : this._colorBuffer,
756
- offsetInBytes : vertexColorBufferOffset
757
- }, {
758
- index : attributeIndices.show,
759
- componentsPerAttribute : 1,
760
- componentDatatype : ComponentDatatype.UNSIGNED_BYTE,
761
- vertexBuffer : this._showBuffer,
762
- offsetInBytes : vertexShowBufferOffset
763
- }];
764
-
765
- var attributesOutlineColor = [{
766
- index : attributeIndices.position3DHigh,
780
+ index : attributeIndices.prevPosition3DHigh,
767
781
  componentsPerAttribute : 3,
768
782
  componentDatatype : ComponentDatatype.FLOAT,
769
- offsetInBytes : positionHighOffset,
770
- strideInBytes : 2 * positionSizeInBytes
783
+ offsetInBytes : prevPositionHighOffset,
784
+ strideInBytes : 6 * positionSizeInBytes
771
785
  }, {
772
- index : attributeIndices.position3DLow,
786
+ index : attributeIndices.prevPosition3DLow,
773
787
  componentsPerAttribute : 3,
774
788
  componentDatatype : ComponentDatatype.FLOAT,
775
- offsetInBytes : positionLowOffset,
776
- strideInBytes : 2 * positionSizeInBytes
789
+ offsetInBytes : prevPositionLowOffset,
790
+ strideInBytes : 6 * positionSizeInBytes
777
791
  }, {
778
- index : attributeIndices.position2DHigh,
792
+ index : attributeIndices.prevPosition2DHigh,
779
793
  componentsPerAttribute : 3,
780
794
  componentDatatype : ComponentDatatype.FLOAT,
781
- offsetInBytes : positionHighOffset,
782
- strideInBytes : 2 * positionSizeInBytes
795
+ offsetInBytes : prevPositionHighOffset,
796
+ strideInBytes : 6 * positionSizeInBytes
783
797
  }, {
784
- index : attributeIndices.position2DLow,
798
+ index : attributeIndices.prevPosition2DLow,
785
799
  componentsPerAttribute : 3,
786
800
  componentDatatype : ComponentDatatype.FLOAT,
787
- offsetInBytes : positionLowOffset,
788
- strideInBytes : 2 * positionSizeInBytes
789
- }, {
790
- index : attributeIndices.color,
791
- componentsPerAttribute : 4,
792
- normalize : true,
793
- componentDatatype : ComponentDatatype.UNSIGNED_BYTE,
794
- vertexBuffer : this._outlineColorBuffer,
795
- offsetInBytes : vertexColorBufferOffset
801
+ offsetInBytes : prevPositionLowOffset,
802
+ strideInBytes : 6 * positionSizeInBytes
796
803
  }, {
797
- index : attributeIndices.show,
798
- componentsPerAttribute : 1,
799
- componentDatatype : ComponentDatatype.UNSIGNED_BYTE,
800
- vertexBuffer : this._showBuffer,
801
- offsetInBytes : vertexShowBufferOffset
802
- }];
803
-
804
- var attributesPickColor = [{
805
- index : attributeIndices.position3DHigh,
804
+ index : attributeIndices.nextPosition3DHigh,
806
805
  componentsPerAttribute : 3,
807
806
  componentDatatype : ComponentDatatype.FLOAT,
808
- offsetInBytes : positionHighOffset,
809
- strideInBytes : 2 * positionSizeInBytes
807
+ offsetInBytes : nextPositionHighOffset,
808
+ strideInBytes : 6 * positionSizeInBytes
810
809
  }, {
811
- index : attributeIndices.position3DLow,
810
+ index : attributeIndices.nextPosition3DLow,
812
811
  componentsPerAttribute : 3,
813
812
  componentDatatype : ComponentDatatype.FLOAT,
814
- offsetInBytes : positionLowOffset,
815
- strideInBytes : 2 * positionSizeInBytes
813
+ offsetInBytes : nextPositionLowOffset,
814
+ strideInBytes : 6 * positionSizeInBytes
816
815
  }, {
817
- index : attributeIndices.position2DHigh,
816
+ index : attributeIndices.nextPosition2DHigh,
818
817
  componentsPerAttribute : 3,
819
818
  componentDatatype : ComponentDatatype.FLOAT,
820
- offsetInBytes : positionHighOffset,
821
- strideInBytes : 2 * positionSizeInBytes
819
+ offsetInBytes : nextPositionHighOffset,
820
+ strideInBytes : 6 * positionSizeInBytes
822
821
  }, {
823
- index : attributeIndices.position2DLow,
822
+ index : attributeIndices.nextPosition2DLow,
824
823
  componentsPerAttribute : 3,
825
824
  componentDatatype : ComponentDatatype.FLOAT,
826
- offsetInBytes : positionLowOffset,
827
- strideInBytes : 2 * positionSizeInBytes
825
+ offsetInBytes : nextPositionLowOffset,
826
+ strideInBytes : 6 * positionSizeInBytes
828
827
  }, {
829
- index : attributeIndices.color,
828
+ index : attributeIndices.texCoordExpandWidthAndShow,
830
829
  componentsPerAttribute : 4,
831
- normalize : true,
832
- componentDatatype : ComponentDatatype.UNSIGNED_BYTE,
833
- vertexBuffer : this._pickColorBuffer,
834
- offsetInBytes : vertexColorBufferOffset
830
+ componentDatatype : ComponentDatatype.FLOAT,
831
+ vertexBuffer : collection._texCoordExpandWidthAndShowBuffer,
832
+ offsetInBytes : vertexTexCoordExpandWidthAndShowBufferOffset
835
833
  }, {
836
- index : attributeIndices.show,
837
- componentsPerAttribute : 1,
834
+ index : attributeIndices.pickColor,
835
+ componentsPerAttribute : 4,
838
836
  componentDatatype : ComponentDatatype.UNSIGNED_BYTE,
839
- vertexBuffer : this._showBuffer,
840
- offsetInBytes : vertexShowBufferOffset
837
+ vertexBuffer : collection._pickColorBuffer,
838
+ offsetInBytes : vertexPickColorBufferOffset,
839
+ normalize : true
841
840
  }];
842
841
 
843
- if (this._mode === SceneMode.SCENE3D) {
844
- attributes[0].vertexBuffer = this._positionBuffer;
845
- attributes[1].vertexBuffer = this._positionBuffer;
846
- attributes[2].value = [0.0, 0.0, 0.0];
847
- attributes[3].value = [0.0, 0.0, 0.0];
848
- attributesOutlineColor[0].vertexBuffer = this._positionBuffer;
849
- attributesOutlineColor[1].vertexBuffer = this._positionBuffer;
850
- attributesOutlineColor[2].value = [0.0, 0.0, 0.0];
851
- attributesOutlineColor[3].value = [0.0, 0.0, 0.0];
852
- attributesPickColor[0].vertexBuffer = this._positionBuffer;
853
- attributesPickColor[1].vertexBuffer = this._positionBuffer;
854
- attributesPickColor[2].value = [0.0, 0.0, 0.0];
855
- attributesPickColor[3].value = [0.0, 0.0, 0.0];
856
- } else if (this._mode === SceneMode.SCENE2D || this._mode === SceneMode.COLUMBUS_VIEW) {
857
- attributes[0].value = [0.0, 0.0, 0.0];
858
- attributes[1].value = [0.0, 0.0, 0.0];
859
- attributes[2].vertexBuffer = this._positionBuffer;
860
- attributes[3].vertexBuffer = this._positionBuffer;
861
- attributesOutlineColor[0].value = [0.0, 0.0, 0.0];
862
- attributesOutlineColor[1].value = [0.0, 0.0, 0.0];
863
- attributesOutlineColor[2].vertexBuffer = this._positionBuffer;
864
- attributesOutlineColor[3].vertexBuffer = this._positionBuffer;
865
- attributesPickColor[0].value = [0.0, 0.0, 0.0];
866
- attributesPickColor[1].value = [0.0, 0.0, 0.0];
867
- attributesPickColor[2].vertexBuffer = this._positionBuffer;
868
- attributesPickColor[3].vertexBuffer = this._positionBuffer;
842
+ var buffer3D;
843
+ var bufferProperty3D;
844
+ var buffer2D;
845
+ var bufferProperty2D;
846
+
847
+ if (mode === SceneMode.SCENE3D) {
848
+ buffer3D = collection._positionBuffer;
849
+ bufferProperty3D = 'vertexBuffer';
850
+ buffer2D = emptyVertexBuffer;
851
+ bufferProperty2D = 'value';
852
+ } else if (mode === SceneMode.SCENE2D || mode === SceneMode.COLUMBUS_VIEW) {
853
+ buffer3D = emptyVertexBuffer;
854
+ bufferProperty3D = 'value';
855
+ buffer2D = collection._positionBuffer;
856
+ bufferProperty2D = 'vertexBuffer';
869
857
  } else {
870
- attributes[0].vertexBuffer = position3DBuffer;
871
- attributes[1].vertexBuffer = position3DBuffer;
872
- attributes[2].vertexBuffer = this._positionBuffer;
873
- attributes[3].vertexBuffer = this._positionBuffer;
874
- attributesOutlineColor[0].vertexBuffer = position3DBuffer;
875
- attributesOutlineColor[1].vertexBuffer = position3DBuffer;
876
- attributesOutlineColor[2].vertexBuffer = this._positionBuffer;
877
- attributesOutlineColor[3].vertexBuffer = this._positionBuffer;
878
- attributesPickColor[0].vertexBuffer = position3DBuffer;
879
- attributesPickColor[1].vertexBuffer = position3DBuffer;
880
- attributesPickColor[2].vertexBuffer = this._positionBuffer;
881
- attributesPickColor[3].vertexBuffer = this._positionBuffer;
858
+ buffer3D = position3DBuffer;
859
+ bufferProperty3D = 'vertexBuffer';
860
+ buffer2D = collection._positionBuffer;
861
+ bufferProperty2D = 'vertexBuffer';
882
862
  }
883
- var va = context.createVertexArray(attributes, indexBuffer);
884
- var vaOutlineColor = context.createVertexArray(attributesOutlineColor, indexBuffer);
885
- var vaPickColor = context.createVertexArray(attributesPickColor, indexBuffer);
886
863
 
887
- this._colorVertexArrays.push({
864
+ attributes[0][bufferProperty3D] = buffer3D;
865
+ attributes[1][bufferProperty3D] = buffer3D;
866
+ attributes[2][bufferProperty2D] = buffer2D;
867
+ attributes[3][bufferProperty2D] = buffer2D;
868
+ attributes[4][bufferProperty3D] = buffer3D;
869
+ attributes[5][bufferProperty3D] = buffer3D;
870
+ attributes[6][bufferProperty2D] = buffer2D;
871
+ attributes[7][bufferProperty2D] = buffer2D;
872
+ attributes[8][bufferProperty3D] = buffer3D;
873
+ attributes[9][bufferProperty3D] = buffer3D;
874
+ attributes[10][bufferProperty2D] = buffer2D;
875
+ attributes[11][bufferProperty2D] = buffer2D;
876
+
877
+ var va = context.createVertexArray(attributes, indexBuffer);
878
+ collection._vertexArrays.push({
888
879
  va : va,
889
880
  buckets : vertexArrayBuckets[k]
890
881
  });
891
- this._outlineColorVertexArrays.push({
892
- va : vaOutlineColor,
893
- buckets : vertexArrayBuckets[k]
894
- });
895
- this._pickColorVertexArrays.push({
896
- va : vaPickColor,
897
- buckets : vertexArrayBuckets[k]
898
- });
899
882
  }
900
883
  }
901
884
  }
902
- };
885
+ }
886
+
887
+ var scratchUniformArray = [];
888
+ function createMaterialId(material) {
889
+ var uniforms = Material._uniformList[material.type];
890
+ var length = uniforms.length;
891
+ scratchUniformArray.length = 2.0 * length;
892
+
893
+ var index = 0;
894
+ for (var i = 0; i < length; ++i) {
895
+ var uniform = uniforms[i];
896
+ scratchUniformArray[index] = uniform;
897
+ scratchUniformArray[index + 1] = material._uniforms[uniform]();
898
+ index += 2;
899
+ }
900
+
901
+ return material.type + ':' + JSON.stringify(scratchUniformArray);
902
+ }
903
+
904
+ function sortPolylinesIntoBuckets(collection) {
905
+ var mode = collection._mode;
906
+ var projection = collection._projection;
907
+ var modelMatrix = collection._modelMatrix;
903
908
 
904
- PolylineCollection.prototype._sortPolylinesIntoBuckets = function() {
905
- var polylineBuckets = this._polylineBuckets = {};
906
- var polylines = this._polylines;
909
+ var polylineBuckets = collection._polylineBuckets = {};
910
+ var polylines = collection._polylines;
907
911
  var length = polylines.length;
908
912
  for ( var i = 0; i < length; ++i) {
909
913
  var p = polylines[i];
910
- var outlineWidth = p.getOutlineWidth();
911
- var width = p.getWidth();
912
- var hash = 'OL' + outlineWidth + 'W' + width;
913
- var value = polylineBuckets[hash];
914
- if (typeof value === 'undefined') {
915
- value = polylineBuckets[hash] = new PolylineBucket(outlineWidth, width, this._mode, this._projection, this._modelMatrix);
914
+ if (p.getPositions().length > 1) {
915
+ p.update();
916
+ var material = p.getMaterial();
917
+ var value = polylineBuckets[material.type];
918
+ if (typeof value === 'undefined') {
919
+ value = polylineBuckets[material.type] = new PolylineBucket(material, mode, projection, modelMatrix);
920
+ }
921
+ value.addPolyline(p);
916
922
  }
917
- value.addPolyline(p);
918
923
  }
919
- };
924
+ }
920
925
 
921
- PolylineCollection.prototype._updateMode = function(frameState) {
926
+ function updateMode(collection, frameState) {
922
927
  var mode = frameState.mode;
923
928
  var projection = frameState.scene2D.projection;
924
- if (this._mode !== mode && typeof mode.morphTime !== 'undefined') {
925
- this.morphTime = mode.morphTime;
926
- }
927
- if (this._mode !== mode || (this._projection !== projection) || (!this._modelMatrix.equals(this.modelMatrix))) {
928
- this._mode = mode;
929
- this._projection = projection;
930
- this._modelMatrix = this.modelMatrix.clone();
931
- this._createVertexArray = true;
929
+
930
+ if (collection._mode !== mode || (collection._projection !== projection) || (!collection._modelMatrix.equals(collection.modelMatrix))) {
931
+ collection._mode = mode;
932
+ collection._projection = projection;
933
+ collection._modelMatrix = collection.modelMatrix.clone();
934
+ collection._createVertexArray = true;
932
935
  }
933
- };
936
+ }
934
937
 
935
- PolylineCollection.prototype._removePolylines = function() {
936
- if (this._polylinesRemoved) {
937
- this._polylinesRemoved = false;
938
+ function removePolylines(collection) {
939
+ if (collection._polylinesRemoved) {
940
+ collection._polylinesRemoved = false;
938
941
 
939
942
  var polylines = [];
940
943
 
941
- var length = this._polylines.length;
944
+ var length = collection._polylines.length;
942
945
  for ( var i = 0, j = 0; i < length; ++i) {
943
- var polyline = this._polylines[i];
946
+ var polyline = collection._polylines[i];
944
947
  if (polyline) {
945
948
  polyline._index = j++;
946
949
  polylines.push(polyline);
947
950
  }
948
951
  }
949
952
 
950
- this._polylines = polylines;
953
+ collection._polylines = polylines;
951
954
  }
952
- };
955
+ }
956
+
957
+ function releaseShaders(collection) {
958
+ var polylines = collection._polylines;
959
+ var length = polylines.length;
960
+ for (var i = 0; i < length; ++i) {
961
+ var bucket = polylines[i]._bucket;
962
+ if (typeof bucket !== 'undefined') {
963
+ bucket.shaderProgram = bucket.shaderProgram && bucket.shaderProgram.release();
964
+ }
965
+ }
966
+ }
953
967
 
954
- PolylineCollection.prototype._destroyVertexArrays = function() {
955
- var length = this._colorVertexArrays.length;
968
+ function destroyVertexArrays(collection) {
969
+ var length = collection._vertexArrays.length;
956
970
  for ( var t = 0; t < length; ++t) {
957
- this._colorVertexArrays[t].va.destroy();
958
- this._pickColorVertexArrays[t].va.destroy();
959
- this._outlineColorVertexArrays[t].va.destroy();
971
+ collection._vertexArrays[t].va.destroy();
960
972
  }
961
- this._colorVertexArrays.length = 0;
962
- this._pickColorVertexArrays.length = 0;
963
- this._outlineColorVertexArrays.length = 0;
964
- };
973
+ collection._vertexArrays.length = 0;
974
+ }
965
975
 
966
976
  PolylineCollection.prototype._updatePolyline = function(polyline, propertyChanged) {
967
977
  this._polylinesUpdated = true;
@@ -969,49 +979,34 @@ define([
969
979
  ++this._propertiesChanged[propertyChanged];
970
980
  };
971
981
 
972
- PolylineCollection.prototype._destroyPolylines = function() {
973
- var polylines = this._polylines;
982
+ function destroyPolylines(collection) {
983
+ var polylines = collection._polylines;
974
984
  var length = polylines.length;
975
985
  for ( var i = 0; i < length; ++i) {
976
986
  if (polylines[i]) {
977
987
  polylines[i]._destroy();
978
988
  }
979
989
  }
980
- };
990
+ }
981
991
 
982
- /**
983
- * @private
984
- */
985
992
  function VertexArrayBucketLocator(count, offset, bucket) {
986
993
  this.count = count;
987
994
  this.offset = offset;
988
- this.rsOne = bucket.rsOne;
989
- this.rsTwo = bucket.rsTwo;
990
- this.rsThree = bucket.rsThree;
991
- this.rsPick = bucket.rsPick;
995
+ this.bucket = bucket;
992
996
  }
993
997
 
994
- /**
995
- * @private
996
- */
997
- var PolylineBucket = function(outlineWidth, width, mode, projection, modelMatrix) {
998
- this.width = width;
999
- this.outlineWidth = outlineWidth;
998
+ var PolylineBucket = function(material, mode, projection, modelMatrix) {
1000
999
  this.polylines = [];
1001
1000
  this.lengthOfPositions = 0;
1002
- this.rsOne = undefined;
1003
- this.rsTwo = undefined;
1004
- this.rsThree = undefined;
1005
- this.rsPick = undefined;
1001
+ this.material = material;
1002
+ this.shaderProgram = undefined;
1003
+ this.pickShaderProgram = undefined;
1006
1004
  this.mode = mode;
1007
1005
  this.projection = projection;
1008
1006
  this.ellipsoid = projection.getEllipsoid();
1009
1007
  this.modelMatrix = modelMatrix;
1010
1008
  };
1011
1009
 
1012
- /**
1013
- * @private
1014
- */
1015
1010
  PolylineBucket.prototype.addPolyline = function(p) {
1016
1011
  var polylines = this.polylines;
1017
1012
  polylines.push(p);
@@ -1020,99 +1015,19 @@ define([
1020
1015
  p._bucket = this;
1021
1016
  };
1022
1017
 
1023
- /**
1024
- * @private
1025
- */
1026
- PolylineBucket.prototype.updateRenderState = function(context, useDepthTest) {
1027
- var width = this._clampWidth(context, this.width);
1028
- var outlineWidth = this._clampWidth(context, this.outlineWidth);
1029
- var rsOne = this.rsOne || context.createRenderState({
1030
- colorMask : {
1031
- red : false,
1032
- green : false,
1033
- blue : false,
1034
- alpha : false
1035
- },
1036
- lineWidth : 1,
1037
- blending : BlendingState.ALPHA_BLEND,
1038
- stencilTest : {
1039
- enabled : true,
1040
- frontFunction : StencilFunction.ALWAYS,
1041
- backFunction : StencilFunction.ALWAYS,
1042
- reference : 0,
1043
- mask : ~0,
1044
- frontOperation : {
1045
- fail : StencilOperation.REPLACE,
1046
- zFail : StencilOperation.REPLACE,
1047
- zPass : StencilOperation.REPLACE
1048
- },
1049
- backOperation : {
1050
- fail : StencilOperation.REPLACE,
1051
- zFail : StencilOperation.REPLACE,
1052
- zPass : StencilOperation.REPLACE
1053
- }
1054
- }
1055
- });
1056
- rsOne.depthMask = !useDepthTest;
1057
- rsOne.depthTest.enabled = useDepthTest;
1058
- rsOne.lineWidth = outlineWidth;
1059
- this.rsOne = rsOne;
1060
- var rsTwo = this.rsTwo || context.createRenderState({
1061
- lineWidth : 1,
1062
- depthMask : false,
1063
- blending : BlendingState.ALPHA_BLEND,
1064
- stencilTest : {
1065
- enabled : true,
1066
- frontFunction : StencilFunction.ALWAYS,
1067
- backFunction : StencilFunction.ALWAYS,
1068
- reference : 1,
1069
- mask : ~0,
1070
- frontOperation : {
1071
- fail : StencilOperation.KEEP,
1072
- zFail : StencilOperation.KEEP,
1073
- zPass : StencilOperation.REPLACE
1074
- },
1075
- backOperation : {
1076
- fail : StencilOperation.KEEP,
1077
- zFail : StencilOperation.KEEP,
1078
- zPass : StencilOperation.REPLACE
1079
- }
1080
- }
1081
- });
1082
- rsTwo.depthTest.enabled = useDepthTest;
1083
- rsTwo.lineWidth = width;
1084
- this.rsTwo = rsTwo;
1085
- var rsThree = this.rsThree || context.createRenderState({
1086
- lineWidth : 1,
1087
- depthMask : false,
1088
- blending : BlendingState.ALPHA_BLEND,
1089
- stencilTest : {
1090
- enabled : true,
1091
- frontFunction : StencilFunction.NOT_EQUAL,
1092
- backFunction : StencilFunction.NOT_EQUAL,
1093
- reference : 1,
1094
- mask : ~0,
1095
- frontOperation : {
1096
- fail : StencilOperation.KEEP,
1097
- zFail : StencilOperation.KEEP,
1098
- zPass : StencilOperation.KEEP
1099
- },
1100
- backOperation : {
1101
- fail : StencilOperation.KEEP,
1102
- zFail : StencilOperation.KEEP,
1103
- zPass : StencilOperation.KEEP
1104
- }
1105
- }
1106
- });
1107
- rsThree.lineWidth = this.outlineWidth;
1108
- rsThree.depthTest.enabled = useDepthTest;
1109
- this.rsThree = rsThree;
1110
-
1111
- var rsPick = this.rsPick || context.createRenderState();
1112
- rsPick.depthTest.enabled = useDepthTest;
1113
- rsPick.lineWidth = outlineWidth;
1114
- rsPick.depthMask = !useDepthTest;
1115
- this.rsPick = rsPick;
1018
+ PolylineBucket.prototype.updateShader = function(context) {
1019
+ if (typeof this.shaderProgram !== 'undefined') {
1020
+ return;
1021
+ }
1022
+
1023
+ var fsSource =
1024
+ '#line 0\n' +
1025
+ this.material.shaderSource +
1026
+ '#line 0\n' +
1027
+ PolylineFS;
1028
+
1029
+ this.shaderProgram = context.getShaderCache().getShaderProgram(PolylineVS, fsSource, attributeIndices);
1030
+ this.pickShaderProgram = context.getShaderCache().getShaderProgram(PolylineVS, createPickFragmentShaderSource(fsSource, 'varying'), attributeIndices);
1116
1031
  };
1117
1032
 
1118
1033
  function intersectsIDL(polyline) {
@@ -1120,170 +1035,182 @@ define([
1120
1035
  polyline._boundingVolume.intersect(Cartesian4.UNIT_Y) === Intersect.INTERSECTING;
1121
1036
  }
1122
1037
 
1123
- /**
1124
- * @private
1125
- */
1126
1038
  PolylineBucket.prototype.getPolylinePositionsLength = function(polyline) {
1039
+ var length;
1127
1040
  if (this.mode === SceneMode.SCENE3D || !intersectsIDL(polyline)) {
1128
- return polyline.getPositions().length;
1041
+ length = polyline.getPositions().length;
1042
+ return length * 4.0 - 4.0;
1129
1043
  }
1130
- var segments = polyline._createSegments(this.modelMatrix);
1131
- return polyline._setSegments(segments);
1044
+
1045
+ var count = 0;
1046
+ var segmentLengths = polyline._segments.lengths;
1047
+ length = segmentLengths.length;
1048
+ for (var i = 0; i < length; ++i) {
1049
+ count += segmentLengths[i] * 4.0 - 4.0;
1050
+ }
1051
+
1052
+ return count;
1132
1053
  };
1133
1054
 
1134
1055
  var scratchWritePosition = new Cartesian3();
1056
+ var scratchWritePrevPosition = new Cartesian3();
1057
+ var scratchWriteNextPosition = new Cartesian3();
1058
+ var scratchWriteVector = new Cartesian3();
1135
1059
 
1136
- /**
1137
- * @private
1138
- */
1139
- PolylineBucket.prototype.write = function(positionArray, colorArray, outlineColorArray, pickColorArray, showArray, positionIndex, showIndex, colorIndex, context) {
1060
+ PolylineBucket.prototype.write = function(positionArray, pickColorArray, texCoordExpandWidthAndShowArray, positionIndex, colorIndex, texCoordExpandWidthAndShowIndex, context) {
1061
+ var mode = this.mode;
1140
1062
  var polylines = this.polylines;
1141
1063
  var length = polylines.length;
1142
1064
  for ( var i = 0; i < length; ++i) {
1143
1065
  var polyline = polylines[i];
1144
- var color = polyline.getColor();
1145
- var show = polyline.getShow();
1146
- var outlineColor = polyline.getOutlineColor();
1147
- var pickColor = polyline.getPickId(context).unnormalizedRgb;
1148
- var positions = this._getPositions(polyline);
1066
+ var width = polyline.getWidth();
1067
+ var show = polyline.getShow() && width > 0.0;
1068
+ var segments = this.getSegments(polyline);
1069
+ var positions = segments.positions;
1070
+ var lengths = segments.lengths;
1149
1071
  var positionsLength = positions.length;
1072
+
1073
+ var pickColor = polyline.getPickId(context).color;
1074
+
1075
+ var segmentIndex = 0;
1076
+ var count = 0;
1077
+ var position;
1078
+
1150
1079
  for ( var j = 0; j < positionsLength; ++j) {
1151
- var position = positions[j];
1080
+ if (j === 0) {
1081
+ position = scratchWriteVector;
1082
+ Cartesian3.subtract(positions[0], positions[1], position);
1083
+ Cartesian3.add(positions[0], position, position);
1084
+ } else {
1085
+ position = positions[j - 1];
1086
+ }
1087
+
1088
+ scratchWritePrevPosition.x = position.x;
1089
+ scratchWritePrevPosition.y = position.y;
1090
+ scratchWritePrevPosition.z = (mode !== SceneMode.SCENE2D) ? position.z : 0.0;
1091
+
1092
+ position = positions[j];
1152
1093
  scratchWritePosition.x = position.x;
1153
1094
  scratchWritePosition.y = position.y;
1154
- scratchWritePosition.z = (this.mode !== SceneMode.SCENE2D) ? position.z : 0.0;
1155
- EncodedCartesian3.writeElements(scratchWritePosition, positionArray, positionIndex);
1156
- outlineColorArray[colorIndex] = Color.floatToByte(outlineColor.red);
1157
- outlineColorArray[colorIndex + 1] = Color.floatToByte(outlineColor.green);
1158
- outlineColorArray[colorIndex + 2] = Color.floatToByte(outlineColor.blue);
1159
- outlineColorArray[colorIndex + 3] = Color.floatToByte(outlineColor.alpha);
1160
- colorArray[colorIndex] = Color.floatToByte(color.red);
1161
- colorArray[colorIndex + 1] = Color.floatToByte(color.green);
1162
- colorArray[colorIndex + 2] = Color.floatToByte(color.blue);
1163
- colorArray[colorIndex + 3] = Color.floatToByte(color.alpha);
1164
- pickColorArray[colorIndex] = pickColor.red;
1165
- pickColorArray[colorIndex + 1] = pickColor.green;
1166
- pickColorArray[colorIndex + 2] = pickColor.blue;
1167
- pickColorArray[colorIndex + 3] = 255;
1168
- showArray[showIndex++] = show;
1169
- positionIndex += 6;
1170
- colorIndex += 4;
1171
- }
1172
- }
1173
- };
1095
+ scratchWritePosition.z = (mode !== SceneMode.SCENE2D) ? position.z : 0.0;
1174
1096
 
1175
- /**
1176
- * @private
1177
- */
1178
- PolylineBucket.prototype.writeForMorph = function(positionArray, positionIndex) {
1179
- var modelMatrix = this.modelMatrix;
1180
- var position;
1181
- var polylines = this.polylines;
1182
- var length = polylines.length;
1183
- for ( var i = 0; i < length; ++i) {
1184
- var polyline = polylines[i];
1185
- var positions = polyline.getPositions();
1186
-
1187
- var numberOfSegments;
1188
- var j;
1189
- if (intersectsIDL(polyline)) {
1190
- var segments = polyline._getSegments();
1191
- numberOfSegments = segments.length;
1192
- for ( j = 0; j < numberOfSegments; ++j) {
1193
- var segment = segments[j];
1194
- var segmentLength = segment.length;
1195
- for ( var n = 0; n < segmentLength; ++n) {
1196
- position = positions[segment[n].index];
1197
- position = modelMatrix.multiplyByPoint(position);
1198
- EncodedCartesian3.writeElements(position, positionArray, positionIndex);
1199
- positionIndex += 6;
1200
- }
1097
+ if (j === positionsLength - 1) {
1098
+ position = scratchWriteVector;
1099
+ Cartesian3.subtract(positions[positionsLength - 1], positions[positionsLength - 2], position);
1100
+ Cartesian3.add(positions[positionsLength - 1], position, position);
1101
+ } else {
1102
+ position = positions[j + 1];
1201
1103
  }
1202
- } else {
1203
- numberOfSegments = positions.length;
1204
- for ( j = 0; j < numberOfSegments; ++j) {
1205
- position = positions[j];
1206
- position = modelMatrix.multiplyByPoint(position);
1207
- EncodedCartesian3.writeElements(position, positionArray, positionIndex);
1208
- positionIndex += 6;
1104
+
1105
+ scratchWriteNextPosition.x = position.x;
1106
+ scratchWriteNextPosition.y = position.y;
1107
+ scratchWriteNextPosition.z = (mode !== SceneMode.SCENE2D) ? position.z : 0.0;
1108
+
1109
+ var segmentLength = lengths[segmentIndex];
1110
+ if (j === count + segmentLength) {
1111
+ count += segmentLength;
1112
+ ++segmentIndex;
1113
+ }
1114
+
1115
+ var segmentStart = j - count === 0;
1116
+ var segmentEnd = j === count + lengths[segmentIndex] - 1;
1117
+
1118
+ var startK = (segmentStart) ? 2 : 0;
1119
+ var endK = (segmentEnd) ? 2 : 4;
1120
+
1121
+ for (var k = startK; k < endK; ++k) {
1122
+ EncodedCartesian3.writeElements(scratchWritePosition, positionArray, positionIndex);
1123
+ EncodedCartesian3.writeElements(scratchWritePrevPosition, positionArray, positionIndex + 6);
1124
+ EncodedCartesian3.writeElements(scratchWriteNextPosition, positionArray, positionIndex + 12);
1125
+
1126
+ pickColorArray[colorIndex] = Color.floatToByte(pickColor.red);
1127
+ pickColorArray[colorIndex + 1] = Color.floatToByte(pickColor.green);
1128
+ pickColorArray[colorIndex + 2] = Color.floatToByte(pickColor.blue);
1129
+ pickColorArray[colorIndex + 3] = Color.floatToByte(pickColor.alpha);
1130
+
1131
+ var direction = (k - 2 < 0) ? -1.0 : 1.0;
1132
+ texCoordExpandWidthAndShowArray[texCoordExpandWidthAndShowIndex] = j / (positionsLength - 1); // s tex coord
1133
+ texCoordExpandWidthAndShowArray[texCoordExpandWidthAndShowIndex + 1] = 2 * (k % 2) - 1; // expand direction
1134
+ texCoordExpandWidthAndShowArray[texCoordExpandWidthAndShowIndex + 2] = direction * width;
1135
+ texCoordExpandWidthAndShowArray[texCoordExpandWidthAndShowIndex + 3] = show;
1136
+
1137
+ positionIndex += 6 * 3;
1138
+ colorIndex += 4;
1139
+ texCoordExpandWidthAndShowIndex += 4;
1209
1140
  }
1210
1141
  }
1211
1142
  }
1212
1143
  };
1213
1144
 
1214
- /**
1215
- * @private
1216
- */
1217
- PolylineBucket.prototype._clampWidth = function(context, value) {
1218
- var min = context.getMinimumAliasedLineWidth();
1219
- var max = context.getMaximumAliasedLineWidth();
1220
-
1221
- return Math.min(Math.max(value, min), max);
1222
- };
1145
+ var morphPositionScratch = new Cartesian3();
1146
+ var morphPrevPositionScratch = new Cartesian3();
1147
+ var morphNextPositionScratch = new Cartesian3();
1148
+ var morphVectorScratch = new Cartesian3();
1223
1149
 
1224
- /**
1225
- * @private
1226
- */
1227
- PolylineBucket.prototype._updateIndices3D = function(totalIndices, vertexBufferOffset, vertexArrayBuckets, offset) {
1228
- var vaCount = vertexArrayBuckets.length - 1;
1229
- var bucketLocator = new VertexArrayBucketLocator(0, offset, this);
1230
- vertexArrayBuckets[vaCount].push(bucketLocator);
1231
- var count = 0;
1232
- var indices = totalIndices[totalIndices.length - 1];
1233
- var indicesCount = 0;
1234
- if (indices.length > 0) {
1235
- indicesCount = indices[indices.length - 1] + 1;
1236
- }
1150
+ PolylineBucket.prototype.writeForMorph = function(positionArray, positionIndex) {
1151
+ var modelMatrix = this.modelMatrix;
1237
1152
  var polylines = this.polylines;
1238
1153
  var length = polylines.length;
1239
1154
  for ( var i = 0; i < length; ++i) {
1240
1155
  var polyline = polylines[i];
1241
- var positions = polyline.getPositions();
1156
+ var positions = polyline._segments.positions;
1157
+ var lengths = polyline._segments.lengths;
1242
1158
  var positionsLength = positions.length;
1243
- if (positions.length > 0) {
1244
- for ( var j = 0; j < positionsLength; ++j) {
1245
- if (j !== positionsLength - 1) {
1246
- if (indicesCount === SIXTYFOURK - 1) {
1247
- vertexBufferOffset.push(1);
1248
- indices = [];
1249
- totalIndices.push(indices);
1250
- indicesCount = 0;
1251
- bucketLocator.count = count;
1252
- count = 0;
1253
- offset = 0;
1254
- bucketLocator = new VertexArrayBucketLocator(0, 0, this);
1255
- vertexArrayBuckets[++vaCount] = [bucketLocator];
1256
- }
1257
- count += 2;
1258
- offset += 2;
1259
- indices.push(indicesCount++);
1260
- indices.push(indicesCount);
1261
- }
1159
+
1160
+ var segmentIndex = 0;
1161
+ var count = 0;
1162
+
1163
+ for ( var j = 0; j < positionsLength; ++j) {
1164
+ var prevPosition;
1165
+ if (j === 0) {
1166
+ prevPosition = morphVectorScratch;
1167
+ Cartesian3.subtract(positions[0], positions[1], prevPosition);
1168
+ Cartesian3.add(positions[0], prevPosition, prevPosition);
1169
+ } else {
1170
+ prevPosition = positions[j - 1];
1262
1171
  }
1263
- if (indicesCount < SIXTYFOURK - 1) {
1264
- indicesCount++;
1172
+
1173
+ prevPosition = Matrix4.multiplyByPoint(modelMatrix, prevPosition, morphPrevPositionScratch);
1174
+
1175
+ var position = Matrix4.multiplyByPoint(modelMatrix, positions[j], morphPositionScratch);
1176
+
1177
+ var nextPosition;
1178
+ if (j === positionsLength - 1) {
1179
+ nextPosition = morphVectorScratch;
1180
+ Cartesian3.subtract(positions[positionsLength - 1], positions[positionsLength - 2], nextPosition);
1181
+ Cartesian3.add(positions[positionsLength - 1], nextPosition, nextPosition);
1265
1182
  } else {
1266
- vertexBufferOffset.push(0);
1267
- indices = [];
1268
- totalIndices.push(indices);
1269
- indicesCount = 0;
1270
- bucketLocator.count = count;
1271
- offset = 0;
1272
- count = 0;
1273
- bucketLocator = new VertexArrayBucketLocator(0, 0, this);
1274
- vertexArrayBuckets[++vaCount] = [bucketLocator];
1183
+ nextPosition = positions[j + 1];
1184
+ }
1185
+
1186
+ nextPosition = Matrix4.multiplyByPoint(modelMatrix, nextPosition, morphNextPositionScratch);
1187
+
1188
+ var segmentLength = lengths[segmentIndex];
1189
+ if (j === count + segmentLength) {
1190
+ count += segmentLength;
1191
+ ++segmentIndex;
1192
+ }
1193
+
1194
+ var segmentStart = j - count === 0;
1195
+ var segmentEnd = j === count + lengths[segmentIndex] - 1;
1196
+
1197
+ var startK = (segmentStart) ? 2 : 0;
1198
+ var endK = (segmentEnd) ? 2 : 4;
1199
+
1200
+ for (var k = startK; k < endK; ++k) {
1201
+ EncodedCartesian3.writeElements(position, positionArray, positionIndex);
1202
+ EncodedCartesian3.writeElements(prevPosition, positionArray, positionIndex + 6);
1203
+ EncodedCartesian3.writeElements(nextPosition, positionArray, positionIndex + 12);
1204
+
1205
+ positionIndex += 6 * 3;
1275
1206
  }
1276
1207
  }
1277
- polyline._clean();
1278
1208
  }
1279
- bucketLocator.count = count;
1280
- return offset;
1281
1209
  };
1282
1210
 
1283
- /**
1284
- * @private
1285
- */
1286
- PolylineBucket.prototype._updateIndices2D = function(totalIndices, vertexBufferOffset, vertexArrayBuckets, offset) {
1211
+ var scratchSegmentLengths = new Array(1);
1212
+
1213
+ PolylineBucket.prototype.updateIndices = function(totalIndices, vertexBufferOffset, vertexArrayBuckets, offset) {
1287
1214
  var vaCount = vertexArrayBuckets.length - 1;
1288
1215
  var bucketLocator = new VertexArrayBucketLocator(0, offset, this);
1289
1216
  vertexArrayBuckets[vaCount].push(bucketLocator);
@@ -1296,59 +1223,36 @@ define([
1296
1223
  var polylines = this.polylines;
1297
1224
  var length = polylines.length;
1298
1225
  for ( var i = 0; i < length; ++i) {
1299
- var polyline = polylines[i];
1300
- if (intersectsIDL(polyline)) {
1301
- var segments = polyline._segments;
1302
- var numberOfSegments = segments.length;
1303
- if (numberOfSegments > 0) {
1304
- for ( var k = 0; k < numberOfSegments; ++k) {
1305
- var segment = segments[k];
1306
- var segmentLength = segment.length;
1307
- for ( var n = 0; n < segmentLength; ++n) {
1308
- if (n !== segmentLength - 1) {
1309
- if (indicesCount === SIXTYFOURK - 1) {
1310
- vertexBufferOffset.push(1);
1311
- indices = [];
1312
- totalIndices.push(indices);
1313
- indicesCount = 0;
1314
- bucketLocator.count = count;
1315
- count = 0;
1316
- offset = 0;
1317
- bucketLocator = new VertexArrayBucketLocator(0, 0, this);
1318
- vertexArrayBuckets[++vaCount] = [bucketLocator];
1319
- }
1320
- count += 2;
1321
- offset += 2;
1322
- indices.push(indicesCount++);
1323
- indices.push(indicesCount);
1324
- }
1325
- }
1326
- if (k !== numberOfSegments - 1) {
1327
- indicesCount++;
1328
- }
1329
- }
1330
1226
 
1331
- if (indicesCount < SIXTYFOURK - 1) {
1332
- indicesCount++;
1333
- } else {
1334
- vertexBufferOffset.push(0);
1335
- indices = [];
1336
- totalIndices.push(indices);
1337
- indicesCount = 0;
1338
- bucketLocator.count = count;
1339
- offset = 0;
1340
- count = 0;
1341
- bucketLocator = new VertexArrayBucketLocator(0, 0, this);
1342
- vertexArrayBuckets[++vaCount] = [bucketLocator];
1343
- }
1227
+ var polyline = polylines[i];
1228
+ polyline._locatorBuckets = [];
1229
+
1230
+ var segments;
1231
+ if (this.mode === SceneMode.SCENE3D) {
1232
+ segments = scratchSegmentLengths;
1233
+ var positionsLength = polyline.getPositions().length;
1234
+ if (positionsLength > 0) {
1235
+ segments[0] = positionsLength;
1236
+ } else {
1237
+ continue;
1344
1238
  }
1345
1239
  } else {
1346
- var positions = polyline.getPositions();
1347
- var positionsLength = positions.length;
1348
- for ( var j = 0; j < positionsLength; ++j) {
1349
- if (j !== positionsLength - 1) {
1350
- if (indicesCount === SIXTYFOURK - 1) {
1351
- vertexBufferOffset.push(1);
1240
+ segments = polyline._segments.lengths;
1241
+ }
1242
+
1243
+ var numberOfSegments = segments.length;
1244
+ if (numberOfSegments > 0) {
1245
+ var segmentIndexCount = 0;
1246
+ for ( var j = 0; j < numberOfSegments; ++j) {
1247
+ var segmentLength = segments[j] - 1.0;
1248
+ for ( var k = 0; k < segmentLength; ++k) {
1249
+ if (indicesCount + 4 >= SIXTYFOURK - 1) {
1250
+ polyline._locatorBuckets.push({
1251
+ locator : bucketLocator,
1252
+ count : segmentIndexCount
1253
+ });
1254
+ segmentIndexCount = 0;
1255
+ vertexBufferOffset.push(4);
1352
1256
  indices = [];
1353
1257
  totalIndices.push(indices);
1354
1258
  indicesCount = 0;
@@ -1358,16 +1262,23 @@ define([
1358
1262
  bucketLocator = new VertexArrayBucketLocator(0, 0, this);
1359
1263
  vertexArrayBuckets[++vaCount] = [bucketLocator];
1360
1264
  }
1361
- count += 2;
1362
- offset += 2;
1363
- indices.push(indicesCount++);
1364
- indices.push(indicesCount);
1265
+
1266
+ indices.push(indicesCount, indicesCount + 2, indicesCount + 1);
1267
+ indices.push(indicesCount + 1, indicesCount + 2, indicesCount + 3);
1268
+
1269
+ segmentIndexCount += 6;
1270
+ count += 6;
1271
+ offset += 6;
1272
+ indicesCount += 4;
1365
1273
  }
1366
1274
  }
1367
1275
 
1368
- if (indicesCount < SIXTYFOURK - 1) {
1369
- indicesCount++;
1370
- } else {
1276
+ polyline._locatorBuckets.push({
1277
+ locator : bucketLocator,
1278
+ count : segmentIndexCount
1279
+ });
1280
+
1281
+ if (indicesCount + 4 >= SIXTYFOURK - 1) {
1371
1282
  vertexBufferOffset.push(0);
1372
1283
  indices = [];
1373
1284
  totalIndices.push(indices);
@@ -1385,20 +1296,7 @@ define([
1385
1296
  return offset;
1386
1297
  };
1387
1298
 
1388
- /**
1389
- * @private
1390
- */
1391
- PolylineBucket.prototype.updateIndices = function(totalIndices, vertexBufferOffset, vertexArrayBuckets, offset) {
1392
- if (this.mode === SceneMode.SCENE3D) {
1393
- return this._updateIndices3D(totalIndices, vertexBufferOffset, vertexArrayBuckets, offset);
1394
- }
1395
- return this._updateIndices2D(totalIndices, vertexBufferOffset, vertexArrayBuckets, offset);
1396
- };
1397
-
1398
- /**
1399
- * @private
1400
- */
1401
- PolylineBucket.prototype._getPolylineStartIndex = function(polyline) {
1299
+ PolylineBucket.prototype.getPolylineStartIndex = function(polyline) {
1402
1300
  var polylines = this.polylines;
1403
1301
  var positionIndex = 0;
1404
1302
  var length = polylines.length;
@@ -1412,10 +1310,13 @@ define([
1412
1310
  return positionIndex;
1413
1311
  };
1414
1312
 
1415
- /**
1416
- * @private
1417
- */
1418
- PolylineBucket.prototype._getPositions = function(polyline) {
1313
+ var scratchSegments = {
1314
+ positions : undefined,
1315
+ lengths : undefined
1316
+ };
1317
+ var scratchLengths = new Array(1);
1318
+
1319
+ PolylineBucket.prototype.getSegments = function(polyline) {
1419
1320
  var positions = polyline.getPositions();
1420
1321
 
1421
1322
  if (positions.length > 0) {
@@ -1427,10 +1328,14 @@ define([
1427
1328
  }
1428
1329
 
1429
1330
  if (this.mode === SceneMode.SCENE3D) {
1430
- return positions;
1331
+ scratchLengths[0] = positions.length;
1332
+ scratchSegments.positions = positions;
1333
+ scratchSegments.lengths = scratchLengths;
1334
+ return scratchSegments;
1431
1335
  }
1336
+
1432
1337
  if (intersectsIDL(polyline)) {
1433
- positions = polyline._getPositions2D();
1338
+ positions = polyline._segments.positions;
1434
1339
  }
1435
1340
 
1436
1341
  var ellipsoid = this.ellipsoid;
@@ -1458,73 +1363,96 @@ define([
1458
1363
  }
1459
1364
  }
1460
1365
 
1461
- return newPositions;
1366
+ scratchSegments.positions = newPositions;
1367
+ scratchSegments.lengths = polyline._segments.lengths;
1368
+ return scratchSegments;
1462
1369
  };
1463
1370
 
1464
- /**
1465
- * @private
1466
- */
1467
- PolylineBucket.prototype.writePositionsUpdate = function(positionIndex, polyline, buffer) {
1371
+ PolylineBucket.prototype.writeUpdate = function(index, polyline, positionBuffer, texCoordExpandWidthAndShowBuffer) {
1372
+ var mode = this.mode;
1468
1373
  var positionsLength = polyline._actualLength;
1469
1374
  if (positionsLength) {
1470
- positionIndex += this._getPolylineStartIndex(polyline);
1471
- var positionArray = new Float32Array(2 * positionsLength * 3);
1472
- var index = 0;
1473
- var positions = this._getPositions(polyline);
1375
+ index += this.getPolylineStartIndex(polyline);
1376
+ var positionArray = new Float32Array(6 * positionsLength * 3);
1377
+ var texCoordExpandWidthAndShowArray = new Float32Array(positionsLength * 4);
1378
+
1379
+ var positionIndex = 0;
1380
+ var texCoordExpandWidthAndShowIndex = 0;
1381
+
1382
+ var segments = this.getSegments(polyline);
1383
+ var positions = segments.positions;
1384
+ var lengths = segments.lengths;
1385
+
1386
+ var segmentIndex = 0;
1387
+ var count = 0;
1388
+ var position;
1389
+
1390
+ var width = polyline.getWidth();
1391
+ var show = polyline.getShow() && width > 0.0;
1392
+
1393
+ positionsLength = positions.length;
1474
1394
  for ( var i = 0; i < positionsLength; ++i) {
1475
- var position = positions[i];
1395
+ if (i === 0) {
1396
+ position = scratchWriteVector;
1397
+ Cartesian3.subtract(positions[0], positions[1], position);
1398
+ Cartesian3.add(positions[0], position, position);
1399
+ } else {
1400
+ position = positions[i - 1];
1401
+ }
1402
+
1403
+ scratchWritePrevPosition.x = position.x;
1404
+ scratchWritePrevPosition.y = position.y;
1405
+ scratchWritePrevPosition.z = (mode !== SceneMode.SCENE2D) ? position.z : 0.0;
1406
+
1407
+ position = positions[i];
1476
1408
  scratchWritePosition.x = position.x;
1477
1409
  scratchWritePosition.y = position.y;
1478
- scratchWritePosition.z = (this.mode !== SceneMode.SCENE2D) ? position.z : 0.0;
1479
- EncodedCartesian3.writeElements(scratchWritePosition, positionArray, index);
1480
- index += 6;
1481
- }
1410
+ scratchWritePosition.z = (mode !== SceneMode.SCENE2D) ? position.z : 0.0;
1482
1411
 
1483
- buffer.copyFromArrayView(positionArray, 2 * 12 * positionIndex);
1484
- }
1485
- };
1412
+ if (i === positionsLength - 1) {
1413
+ position = scratchWriteVector;
1414
+ Cartesian3.subtract(positions[positionsLength - 1], positions[positionsLength - 2], position);
1415
+ Cartesian3.add(positions[positionsLength - 1], position, position);
1416
+ } else {
1417
+ position = positions[i + 1];
1418
+ }
1486
1419
 
1487
- /**
1488
- * @private
1489
- */
1490
- PolylineBucket.prototype.writeColorUpdate = function(positionIndex, polyline, buffer) {
1491
- var positionsLength = polyline._actualLength;
1492
- if (positionsLength) {
1493
- positionIndex += this._getPolylineStartIndex(polyline);
1494
-
1495
- var index = 0;
1496
- var color = polyline.getColor();
1497
- var red = Color.floatToByte(color.red);
1498
- var green = Color.floatToByte(color.green);
1499
- var blue = Color.floatToByte(color.blue);
1500
- var alpha = Color.floatToByte(color.alpha);
1501
- var colorsArray = new Uint8Array(positionsLength * 4);
1502
- for ( var j = 0; j < positionsLength; ++j) {
1503
- colorsArray[index] = red;
1504
- colorsArray[index + 1] = green;
1505
- colorsArray[index + 2] = blue;
1506
- colorsArray[index + 3] = alpha;
1507
- index += 4;
1508
- }
1509
- buffer.copyFromArrayView(colorsArray, 4 * positionIndex);
1510
- }
1511
- };
1420
+ scratchWriteNextPosition.x = position.x;
1421
+ scratchWriteNextPosition.y = position.y;
1422
+ scratchWriteNextPosition.z = (mode !== SceneMode.SCENE2D) ? position.z : 0.0;
1512
1423
 
1513
- /**
1514
- * @private
1515
- */
1516
- PolylineBucket.prototype.writeShowUpdate = function(positionIndex, polyline, buffer) {
1517
- var positionsLength = polyline._actualLength;
1518
- if (positionsLength) {
1519
- positionIndex += this._getPolylineStartIndex(polyline);
1520
- var show = polyline.getShow();
1521
- var showArray = new Uint8Array(positionsLength);
1522
- for ( var j = 0; j < positionsLength; ++j) {
1523
- showArray[j] = show;
1424
+ var segmentLength = lengths[segmentIndex];
1425
+ if (i === count + segmentLength) {
1426
+ count += segmentLength;
1427
+ ++segmentIndex;
1428
+ }
1429
+
1430
+ var segmentStart = i - count === 0;
1431
+ var segmentEnd = i === count + lengths[segmentIndex] - 1;
1432
+
1433
+ var startJ = (segmentStart) ? 2 : 0;
1434
+ var endJ = (segmentEnd) ? 2 : 4;
1435
+
1436
+ for (var j = startJ; j < endJ; ++j) {
1437
+ EncodedCartesian3.writeElements(scratchWritePosition, positionArray, positionIndex);
1438
+ EncodedCartesian3.writeElements(scratchWritePrevPosition, positionArray, positionIndex + 6);
1439
+ EncodedCartesian3.writeElements(scratchWriteNextPosition, positionArray, positionIndex + 12);
1440
+
1441
+ var direction = (j - 2 < 0) ? -1.0 : 1.0;
1442
+ texCoordExpandWidthAndShowArray[texCoordExpandWidthAndShowIndex] = i / (positionsLength - 1); // s tex coord
1443
+ texCoordExpandWidthAndShowArray[texCoordExpandWidthAndShowIndex + 1] = 2 * (j % 2) - 1; // expand direction
1444
+ texCoordExpandWidthAndShowArray[texCoordExpandWidthAndShowIndex + 2] = direction * width;
1445
+ texCoordExpandWidthAndShowArray[texCoordExpandWidthAndShowIndex + 3] = show;
1446
+
1447
+ positionIndex += 6 * 3;
1448
+ texCoordExpandWidthAndShowIndex += 4;
1449
+ }
1524
1450
  }
1525
- buffer.copyFromArrayView(showArray, positionIndex);
1451
+
1452
+ positionBuffer.copyFromArrayView(positionArray, 6 * 3 * Float32Array.BYTES_PER_ELEMENT * index);
1453
+ texCoordExpandWidthAndShowBuffer.copyFromArrayView(texCoordExpandWidthAndShowArray, 4 * Float32Array.BYTES_PER_ELEMENT * index);
1526
1454
  }
1527
1455
  };
1528
1456
 
1529
1457
  return PolylineCollection;
1530
- });
1458
+ });