cesium 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. data/LICENSE.md +259 -0
  2. data/README.rdoc +90 -0
  3. data/Rakefile +40 -0
  4. data/app/assets/javascripts/Assets/Assets.profile.js +8 -0
  5. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
  6. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
  7. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
  8. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
  9. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
  10. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
  11. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
  12. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
  13. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
  14. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
  15. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
  16. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
  17. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
  18. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
  19. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
  20. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
  21. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
  22. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
  23. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
  24. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
  25. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
  26. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
  27. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
  28. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
  29. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
  30. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
  31. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
  32. data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
  33. data/app/assets/javascripts/Assets/Textures/NE2_LR_LC_SR_W_DR_2048.jpg +0 -0
  34. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
  35. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
  36. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
  37. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
  38. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
  39. data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
  40. data/app/assets/javascripts/Assets/Textures/waterNormals.jpg +0 -0
  41. data/app/assets/javascripts/Assets/package.json +6 -0
  42. data/app/assets/javascripts/Cesium.js +320 -0
  43. data/app/assets/javascripts/Core/AnimationController.js +148 -0
  44. data/app/assets/javascripts/Core/AxisAlignedBoundingBox.js +243 -0
  45. data/app/assets/javascripts/Core/BoundingRectangle.js +364 -0
  46. data/app/assets/javascripts/Core/BoundingSphere.js +819 -0
  47. data/app/assets/javascripts/Core/BoxTessellator.js +93 -0
  48. data/app/assets/javascripts/Core/Cartesian2.js +762 -0
  49. data/app/assets/javascripts/Core/Cartesian3.js +861 -0
  50. data/app/assets/javascripts/Core/Cartesian4.js +762 -0
  51. data/app/assets/javascripts/Core/Cartographic.js +211 -0
  52. data/app/assets/javascripts/Core/CatmullRomSpline.js +232 -0
  53. data/app/assets/javascripts/Core/Clock.js +195 -0
  54. data/app/assets/javascripts/Core/ClockRange.js +37 -0
  55. data/app/assets/javascripts/Core/ClockStep.js +32 -0
  56. data/app/assets/javascripts/Core/Color.js +1629 -0
  57. data/app/assets/javascripts/Core/ComponentDatatype.js +119 -0
  58. data/app/assets/javascripts/Core/Core.profile.js +8 -0
  59. data/app/assets/javascripts/Core/CubeMapEllipsoidTessellator.js +198 -0
  60. data/app/assets/javascripts/Core/CubicRealPolynomial.js +251 -0
  61. data/app/assets/javascripts/Core/DefaultProxy.js +30 -0
  62. data/app/assets/javascripts/Core/DeveloperError.js +60 -0
  63. data/app/assets/javascripts/Core/EarthOrientationParameters.js +383 -0
  64. data/app/assets/javascripts/Core/EarthOrientationParametersSample.js +50 -0
  65. data/app/assets/javascripts/Core/Ellipsoid.js +539 -0
  66. data/app/assets/javascripts/Core/EllipsoidTangentPlane.js +207 -0
  67. data/app/assets/javascripts/Core/EllipsoidalOccluder.js +151 -0
  68. data/app/assets/javascripts/Core/EncodedCartesian3.js +197 -0
  69. data/app/assets/javascripts/Core/Enumeration.js +67 -0
  70. data/app/assets/javascripts/Core/Event.js +122 -0
  71. data/app/assets/javascripts/Core/Extent.js +383 -0
  72. data/app/assets/javascripts/Core/ExtentTessellator.js +384 -0
  73. data/app/assets/javascripts/Core/FAR.js +13 -0
  74. data/app/assets/javascripts/Core/FeatureDetection.js +126 -0
  75. data/app/assets/javascripts/Core/Fullscreen.js +235 -0
  76. data/app/assets/javascripts/Core/GeographicProjection.js +107 -0
  77. data/app/assets/javascripts/Core/HermitePolynomialApproximation.js +176 -0
  78. data/app/assets/javascripts/Core/HermiteSpline.js +234 -0
  79. data/app/assets/javascripts/Core/Iau2006XysData.js +259 -0
  80. data/app/assets/javascripts/Core/Iau2006XysSample.js +36 -0
  81. data/app/assets/javascripts/Core/IndexDatatype.js +28 -0
  82. data/app/assets/javascripts/Core/Intersect.js +40 -0
  83. data/app/assets/javascripts/Core/IntersectionTests.js +359 -0
  84. data/app/assets/javascripts/Core/Interval.js +27 -0
  85. data/app/assets/javascripts/Core/Iso8601.js +46 -0
  86. data/app/assets/javascripts/Core/JulianDate.js +1228 -0
  87. data/app/assets/javascripts/Core/KeyboardEventModifier.js +38 -0
  88. data/app/assets/javascripts/Core/LagrangePolynomialApproximation.js +96 -0
  89. data/app/assets/javascripts/Core/LeapSecond.js +158 -0
  90. data/app/assets/javascripts/Core/LinearApproximation.js +98 -0
  91. data/app/assets/javascripts/Core/Math.js +532 -0
  92. data/app/assets/javascripts/Core/Matrix2.js +833 -0
  93. data/app/assets/javascripts/Core/Matrix3.js +1099 -0
  94. data/app/assets/javascripts/Core/Matrix4.js +2164 -0
  95. data/app/assets/javascripts/Core/MeshFilters.js +568 -0
  96. data/app/assets/javascripts/Core/Occluder.js +474 -0
  97. data/app/assets/javascripts/Core/OrientationInterpolator.js +109 -0
  98. data/app/assets/javascripts/Core/PlaneTessellator.js +74 -0
  99. data/app/assets/javascripts/Core/PolygonPipeline.js +792 -0
  100. data/app/assets/javascripts/Core/PolylinePipeline.js +90 -0
  101. data/app/assets/javascripts/Core/PrimitiveType.js +80 -0
  102. data/app/assets/javascripts/Core/QuadraticRealPolynomial.js +146 -0
  103. data/app/assets/javascripts/Core/QuarticRealPolynomial.js +339 -0
  104. data/app/assets/javascripts/Core/Quaternion.js +947 -0
  105. data/app/assets/javascripts/Core/Queue.js +95 -0
  106. data/app/assets/javascripts/Core/Ray.js +64 -0
  107. data/app/assets/javascripts/Core/ReferenceFrame.js +25 -0
  108. data/app/assets/javascripts/Core/RequestErrorEvent.js +35 -0
  109. data/app/assets/javascripts/Core/RuntimeError.js +59 -0
  110. data/app/assets/javascripts/Core/ScreenSpaceEventHandler.js +658 -0
  111. data/app/assets/javascripts/Core/ScreenSpaceEventType.js +149 -0
  112. data/app/assets/javascripts/Core/Shapes.js +230 -0
  113. data/app/assets/javascripts/Core/Spherical.js +192 -0
  114. data/app/assets/javascripts/Core/TaskProcessor.js +131 -0
  115. data/app/assets/javascripts/Core/TimeConstants.js +85 -0
  116. data/app/assets/javascripts/Core/TimeInterval.js +305 -0
  117. data/app/assets/javascripts/Core/TimeIntervalCollection.js +543 -0
  118. data/app/assets/javascripts/Core/TimeStandard.js +31 -0
  119. data/app/assets/javascripts/Core/Tipsify.js +285 -0
  120. data/app/assets/javascripts/Core/Transforms.js +614 -0
  121. data/app/assets/javascripts/Core/TridiagonalSystemSolver.js +102 -0
  122. data/app/assets/javascripts/Core/Visibility.js +38 -0
  123. data/app/assets/javascripts/Core/WebMercatorProjection.js +154 -0
  124. data/app/assets/javascripts/Core/WindingOrder.js +40 -0
  125. data/app/assets/javascripts/Core/binarySearch.js +69 -0
  126. data/app/assets/javascripts/Core/buildModuleUrl.js +77 -0
  127. data/app/assets/javascripts/Core/clone.js +21 -0
  128. data/app/assets/javascripts/Core/combine.js +81 -0
  129. data/app/assets/javascripts/Core/computeSunPosition.js +116 -0
  130. data/app/assets/javascripts/Core/createGuid.js +25 -0
  131. data/app/assets/javascripts/Core/defaultValue.js +22 -0
  132. data/app/assets/javascripts/Core/destroyObject.js +61 -0
  133. data/app/assets/javascripts/Core/freezeObject.js +20 -0
  134. data/app/assets/javascripts/Core/getImagePixels.js +46 -0
  135. data/app/assets/javascripts/Core/isLeapYear.js +30 -0
  136. data/app/assets/javascripts/Core/jsonp.js +116 -0
  137. data/app/assets/javascripts/Core/loadArrayBuffer.js +76 -0
  138. data/app/assets/javascripts/Core/loadImage.js +85 -0
  139. data/app/assets/javascripts/Core/loadJson.js +54 -0
  140. data/app/assets/javascripts/Core/loadText.js +78 -0
  141. data/app/assets/javascripts/Core/loadXML.js +76 -0
  142. data/app/assets/javascripts/Core/package.json +6 -0
  143. data/app/assets/javascripts/Core/pointInsideTriangle2D.js +41 -0
  144. data/app/assets/javascripts/Core/requestAnimationFrame.js +61 -0
  145. data/app/assets/javascripts/Core/throttleRequestByServer.js +74 -0
  146. data/app/assets/javascripts/Core/writeTextToCanvas.js +92 -0
  147. data/app/assets/javascripts/DynamicScene/CompositeDynamicObjectCollection.js +254 -0
  148. data/app/assets/javascripts/DynamicScene/CzmlBoolean.js +57 -0
  149. data/app/assets/javascripts/DynamicScene/CzmlCartesian2.js +96 -0
  150. data/app/assets/javascripts/DynamicScene/CzmlCartesian3.js +99 -0
  151. data/app/assets/javascripts/DynamicScene/CzmlCartographic.js +125 -0
  152. data/app/assets/javascripts/DynamicScene/CzmlColor.js +127 -0
  153. data/app/assets/javascripts/DynamicScene/CzmlDefaults.js +135 -0
  154. data/app/assets/javascripts/DynamicScene/CzmlHorizontalOrigin.js +59 -0
  155. data/app/assets/javascripts/DynamicScene/CzmlImage.js +61 -0
  156. data/app/assets/javascripts/DynamicScene/CzmlLabelStyle.js +59 -0
  157. data/app/assets/javascripts/DynamicScene/CzmlNumber.js +82 -0
  158. data/app/assets/javascripts/DynamicScene/CzmlString.js +56 -0
  159. data/app/assets/javascripts/DynamicScene/CzmlUnitCartesian3.js +99 -0
  160. data/app/assets/javascripts/DynamicScene/CzmlUnitQuaternion.js +172 -0
  161. data/app/assets/javascripts/DynamicScene/CzmlUnitSpherical.js +98 -0
  162. data/app/assets/javascripts/DynamicScene/CzmlVerticalOrigin.js +59 -0
  163. data/app/assets/javascripts/DynamicScene/DynamicBillboard.js +245 -0
  164. data/app/assets/javascripts/DynamicScene/DynamicBillboardVisualizer.js +347 -0
  165. data/app/assets/javascripts/DynamicScene/DynamicColorMaterial.js +78 -0
  166. data/app/assets/javascripts/DynamicScene/DynamicCone.js +291 -0
  167. data/app/assets/javascripts/DynamicScene/DynamicConeVisualizer.js +350 -0
  168. data/app/assets/javascripts/DynamicScene/DynamicConeVisualizerUsingCustomSensor.js +389 -0
  169. data/app/assets/javascripts/DynamicScene/DynamicDirectionsProperty.js +163 -0
  170. data/app/assets/javascripts/DynamicScene/DynamicEllipsoid.js +158 -0
  171. data/app/assets/javascripts/DynamicScene/DynamicEllipsoidVisualizer.js +277 -0
  172. data/app/assets/javascripts/DynamicScene/DynamicImageMaterial.js +136 -0
  173. data/app/assets/javascripts/DynamicScene/DynamicLabel.js +286 -0
  174. data/app/assets/javascripts/DynamicScene/DynamicLabelVisualizer.js +341 -0
  175. data/app/assets/javascripts/DynamicScene/DynamicMaterialProperty.js +125 -0
  176. data/app/assets/javascripts/DynamicScene/DynamicObject.js +364 -0
  177. data/app/assets/javascripts/DynamicScene/DynamicObjectCollection.js +137 -0
  178. data/app/assets/javascripts/DynamicScene/DynamicObjectView.js +299 -0
  179. data/app/assets/javascripts/DynamicScene/DynamicPath.js +214 -0
  180. data/app/assets/javascripts/DynamicScene/DynamicPathVisualizer.js +402 -0
  181. data/app/assets/javascripts/DynamicScene/DynamicPoint.js +184 -0
  182. data/app/assets/javascripts/DynamicScene/DynamicPointVisualizer.js +323 -0
  183. data/app/assets/javascripts/DynamicScene/DynamicPolygon.js +138 -0
  184. data/app/assets/javascripts/DynamicScene/DynamicPolygonVisualizer.js +251 -0
  185. data/app/assets/javascripts/DynamicScene/DynamicPolyline.js +183 -0
  186. data/app/assets/javascripts/DynamicScene/DynamicPolylineVisualizer.js +268 -0
  187. data/app/assets/javascripts/DynamicScene/DynamicPositionProperty.js +525 -0
  188. data/app/assets/javascripts/DynamicScene/DynamicProperty.js +352 -0
  189. data/app/assets/javascripts/DynamicScene/DynamicPyramid.js +204 -0
  190. data/app/assets/javascripts/DynamicScene/DynamicPyramidVisualizer.js +302 -0
  191. data/app/assets/javascripts/DynamicScene/DynamicScene.profile.js +8 -0
  192. data/app/assets/javascripts/DynamicScene/DynamicVertexPositionsProperty.js +199 -0
  193. data/app/assets/javascripts/DynamicScene/ReferenceProperty.js +155 -0
  194. data/app/assets/javascripts/DynamicScene/VisualizerCollection.js +181 -0
  195. data/app/assets/javascripts/DynamicScene/package.json +6 -0
  196. data/app/assets/javascripts/DynamicScene/processCzml.js +77 -0
  197. data/app/assets/javascripts/Renderer/BlendEquation.js +52 -0
  198. data/app/assets/javascripts/Renderer/BlendFunction.js +158 -0
  199. data/app/assets/javascripts/Renderer/BlendingState.js +64 -0
  200. data/app/assets/javascripts/Renderer/Buffer.js +141 -0
  201. data/app/assets/javascripts/Renderer/BufferUsage.js +48 -0
  202. data/app/assets/javascripts/Renderer/ClearCommand.js +40 -0
  203. data/app/assets/javascripts/Renderer/CommandLists.js +42 -0
  204. data/app/assets/javascripts/Renderer/Context.js +2805 -0
  205. data/app/assets/javascripts/Renderer/CubeMap.js +358 -0
  206. data/app/assets/javascripts/Renderer/CubeMapFace.js +202 -0
  207. data/app/assets/javascripts/Renderer/CullFace.js +50 -0
  208. data/app/assets/javascripts/Renderer/DepthFunction.js +95 -0
  209. data/app/assets/javascripts/Renderer/DrawCommand.js +96 -0
  210. data/app/assets/javascripts/Renderer/Framebuffer.js +435 -0
  211. data/app/assets/javascripts/Renderer/MipmapHint.js +50 -0
  212. data/app/assets/javascripts/Renderer/PickFramebuffer.js +178 -0
  213. data/app/assets/javascripts/Renderer/PixelDatatype.js +86 -0
  214. data/app/assets/javascripts/Renderer/PixelFormat.js +113 -0
  215. data/app/assets/javascripts/Renderer/Renderbuffer.js +102 -0
  216. data/app/assets/javascripts/Renderer/RenderbufferFormat.js +77 -0
  217. data/app/assets/javascripts/Renderer/Renderer.profile.js +8 -0
  218. data/app/assets/javascripts/Renderer/ShaderCache.js +121 -0
  219. data/app/assets/javascripts/Renderer/ShaderProgram.js +2402 -0
  220. data/app/assets/javascripts/Renderer/StencilFunction.js +95 -0
  221. data/app/assets/javascripts/Renderer/StencilOperation.js +95 -0
  222. data/app/assets/javascripts/Renderer/Texture.js +395 -0
  223. data/app/assets/javascripts/Renderer/TextureAtlas.js +472 -0
  224. data/app/assets/javascripts/Renderer/TextureAtlasBuilder.js +133 -0
  225. data/app/assets/javascripts/Renderer/TextureMagnificationFilter.js +41 -0
  226. data/app/assets/javascripts/Renderer/TextureMinificationFilter.js +77 -0
  227. data/app/assets/javascripts/Renderer/TextureWrap.js +50 -0
  228. data/app/assets/javascripts/Renderer/UniformDatatype.js +218 -0
  229. data/app/assets/javascripts/Renderer/UniformState.js +799 -0
  230. data/app/assets/javascripts/Renderer/VertexArray.js +365 -0
  231. data/app/assets/javascripts/Renderer/VertexArrayFacade.js +574 -0
  232. data/app/assets/javascripts/Renderer/VertexLayout.js +49 -0
  233. data/app/assets/javascripts/Renderer/loadCubeMap.js +92 -0
  234. data/app/assets/javascripts/Renderer/package.json +6 -0
  235. data/app/assets/javascripts/Scene/AnimationCollection.js +249 -0
  236. data/app/assets/javascripts/Scene/ArcGisMapServerImageryProvider.js +384 -0
  237. data/app/assets/javascripts/Scene/Billboard.js +680 -0
  238. data/app/assets/javascripts/Scene/BillboardCollection.js +1209 -0
  239. data/app/assets/javascripts/Scene/BingMapsImageryProvider.js +460 -0
  240. data/app/assets/javascripts/Scene/BingMapsStyle.js +55 -0
  241. data/app/assets/javascripts/Scene/Camera.js +358 -0
  242. data/app/assets/javascripts/Scene/CameraColumbusViewMode.js +30 -0
  243. data/app/assets/javascripts/Scene/CameraController.js +1258 -0
  244. data/app/assets/javascripts/Scene/CameraEventAggregator.js +270 -0
  245. data/app/assets/javascripts/Scene/CameraEventType.js +53 -0
  246. data/app/assets/javascripts/Scene/CameraFlightPath.js +495 -0
  247. data/app/assets/javascripts/Scene/CentralBody.js +817 -0
  248. data/app/assets/javascripts/Scene/CentralBodySurface.js +1120 -0
  249. data/app/assets/javascripts/Scene/CentralBodySurfaceShaderSet.js +107 -0
  250. data/app/assets/javascripts/Scene/ComplexConicSensorVolume.js +511 -0
  251. data/app/assets/javascripts/Scene/CompositePrimitive.js +454 -0
  252. data/app/assets/javascripts/Scene/CullingVolume.js +59 -0
  253. data/app/assets/javascripts/Scene/CustomSensorVolume.js +440 -0
  254. data/app/assets/javascripts/Scene/DiscardMissingTileImagePolicy.js +134 -0
  255. data/app/assets/javascripts/Scene/EllipsoidPrimitive.js +412 -0
  256. data/app/assets/javascripts/Scene/EllipsoidTerrainProvider.js +182 -0
  257. data/app/assets/javascripts/Scene/FrameState.js +86 -0
  258. data/app/assets/javascripts/Scene/FrustumCommands.js +32 -0
  259. data/app/assets/javascripts/Scene/GeographicTilingScheme.js +265 -0
  260. data/app/assets/javascripts/Scene/HorizontalOrigin.js +39 -0
  261. data/app/assets/javascripts/Scene/Imagery.js +85 -0
  262. data/app/assets/javascripts/Scene/ImageryLayer.js +876 -0
  263. data/app/assets/javascripts/Scene/ImageryLayerCollection.js +403 -0
  264. data/app/assets/javascripts/Scene/ImageryProvider.js +185 -0
  265. data/app/assets/javascripts/Scene/ImageryProviderError.js +149 -0
  266. data/app/assets/javascripts/Scene/ImageryState.js +20 -0
  267. data/app/assets/javascripts/Scene/Label.js +706 -0
  268. data/app/assets/javascripts/Scene/LabelCollection.js +697 -0
  269. data/app/assets/javascripts/Scene/LabelStyle.js +39 -0
  270. data/app/assets/javascripts/Scene/Material.js +1177 -0
  271. data/app/assets/javascripts/Scene/NeverTileDiscardPolicy.js +38 -0
  272. data/app/assets/javascripts/Scene/OpenStreetMapImageryProvider.js +282 -0
  273. data/app/assets/javascripts/Scene/OrthographicFrustum.js +345 -0
  274. data/app/assets/javascripts/Scene/PerformanceDisplay.js +183 -0
  275. data/app/assets/javascripts/Scene/PerspectiveFrustum.js +239 -0
  276. data/app/assets/javascripts/Scene/PerspectiveOffCenterFrustum.js +394 -0
  277. data/app/assets/javascripts/Scene/Polygon.js +886 -0
  278. data/app/assets/javascripts/Scene/Polyline.js +441 -0
  279. data/app/assets/javascripts/Scene/PolylineCollection.js +1532 -0
  280. data/app/assets/javascripts/Scene/Projections.js +93 -0
  281. data/app/assets/javascripts/Scene/RectangularPyramidSensorVolume.js +224 -0
  282. data/app/assets/javascripts/Scene/Scene.js +632 -0
  283. data/app/assets/javascripts/Scene/Scene.profile.js +8 -0
  284. data/app/assets/javascripts/Scene/SceneMode.js +51 -0
  285. data/app/assets/javascripts/Scene/SceneTransitioner.js +776 -0
  286. data/app/assets/javascripts/Scene/ScreenSpaceCameraController.js +1063 -0
  287. data/app/assets/javascripts/Scene/SensorVolumeCollection.js +192 -0
  288. data/app/assets/javascripts/Scene/SingleTileImageryProvider.js +295 -0
  289. data/app/assets/javascripts/Scene/SkyAtmosphere.js +239 -0
  290. data/app/assets/javascripts/Scene/SkyBox.js +231 -0
  291. data/app/assets/javascripts/Scene/TerrainProvider.js +229 -0
  292. data/app/assets/javascripts/Scene/TexturePool.js +154 -0
  293. data/app/assets/javascripts/Scene/Tile.js +322 -0
  294. data/app/assets/javascripts/Scene/TileDiscardPolicy.js +42 -0
  295. data/app/assets/javascripts/Scene/TileImagery.js +36 -0
  296. data/app/assets/javascripts/Scene/TileLoadQueue.js +123 -0
  297. data/app/assets/javascripts/Scene/TileMapServiceImageryProvider.js +337 -0
  298. data/app/assets/javascripts/Scene/TileReplacementQueue.js +139 -0
  299. data/app/assets/javascripts/Scene/TileState.js +19 -0
  300. data/app/assets/javascripts/Scene/TilingScheme.js +213 -0
  301. data/app/assets/javascripts/Scene/VerticalOrigin.js +39 -0
  302. data/app/assets/javascripts/Scene/ViewportQuad.js +256 -0
  303. data/app/assets/javascripts/Scene/WebMapServiceImageryProvider.js +374 -0
  304. data/app/assets/javascripts/Scene/WebMercatorTilingScheme.js +291 -0
  305. data/app/assets/javascripts/Scene/package.json +6 -0
  306. data/app/assets/javascripts/Shaders/BillboardCollectionFS.glsl +30 -0
  307. data/app/assets/javascripts/Shaders/BillboardCollectionFS.js +31 -0
  308. data/app/assets/javascripts/Shaders/BillboardCollectionVS.glsl +68 -0
  309. data/app/assets/javascripts/Shaders/BillboardCollectionVS.js +54 -0
  310. data/app/assets/javascripts/Shaders/BuiltinFunctions.glsl +927 -0
  311. data/app/assets/javascripts/Shaders/BuiltinFunctions.js +322 -0
  312. data/app/assets/javascripts/Shaders/CentralBodyFS.glsl +106 -0
  313. data/app/assets/javascripts/Shaders/CentralBodyFS.js +82 -0
  314. data/app/assets/javascripts/Shaders/CentralBodyFSDepth.glsl +20 -0
  315. data/app/assets/javascripts/Shaders/CentralBodyFSDepth.js +22 -0
  316. data/app/assets/javascripts/Shaders/CentralBodyFSPole.glsl +29 -0
  317. data/app/assets/javascripts/Shaders/CentralBodyFSPole.js +28 -0
  318. data/app/assets/javascripts/Shaders/CentralBodyVS.glsl +88 -0
  319. data/app/assets/javascripts/Shaders/CentralBodyVS.js +69 -0
  320. data/app/assets/javascripts/Shaders/CentralBodyVSDepth.glsl +9 -0
  321. data/app/assets/javascripts/Shaders/CentralBodyVSDepth.js +13 -0
  322. data/app/assets/javascripts/Shaders/CentralBodyVSPole.glsl +12 -0
  323. data/app/assets/javascripts/Shaders/CentralBodyVSPole.js +15 -0
  324. data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeFS.glsl +448 -0
  325. data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeFS.js +361 -0
  326. data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeVS.glsl +19 -0
  327. data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeVS.js +20 -0
  328. data/app/assets/javascripts/Shaders/ConstructiveSolidGeometry.glsl +886 -0
  329. data/app/assets/javascripts/Shaders/ConstructiveSolidGeometry.js +586 -0
  330. data/app/assets/javascripts/Shaders/CustomSensorVolumeFS.glsl +126 -0
  331. data/app/assets/javascripts/Shaders/CustomSensorVolumeFS.js +95 -0
  332. data/app/assets/javascripts/Shaders/CustomSensorVolumeVS.glsl +14 -0
  333. data/app/assets/javascripts/Shaders/CustomSensorVolumeVS.js +18 -0
  334. data/app/assets/javascripts/Shaders/EllipsoidFS.glsl +40 -0
  335. data/app/assets/javascripts/Shaders/EllipsoidFS.js +38 -0
  336. data/app/assets/javascripts/Shaders/EllipsoidVS.glsl +26 -0
  337. data/app/assets/javascripts/Shaders/EllipsoidVS.js +16 -0
  338. data/app/assets/javascripts/Shaders/Materials/AsphaltMaterial.glsl +25 -0
  339. data/app/assets/javascripts/Shaders/Materials/AsphaltMaterial.js +23 -0
  340. data/app/assets/javascripts/Shaders/Materials/BlobMaterial.glsl +18 -0
  341. data/app/assets/javascripts/Shaders/Materials/BlobMaterial.js +19 -0
  342. data/app/assets/javascripts/Shaders/Materials/BrickMaterial.glsl +42 -0
  343. data/app/assets/javascripts/Shaders/Materials/BrickMaterial.js +36 -0
  344. data/app/assets/javascripts/Shaders/Materials/BumpMapMaterial.glsl +29 -0
  345. data/app/assets/javascripts/Shaders/Materials/BumpMapMaterial.js +27 -0
  346. data/app/assets/javascripts/Shaders/Materials/CementMaterial.glsl +19 -0
  347. data/app/assets/javascripts/Shaders/Materials/CementMaterial.js +20 -0
  348. data/app/assets/javascripts/Shaders/Materials/CheckerboardMaterial.glsl +38 -0
  349. data/app/assets/javascripts/Shaders/Materials/CheckerboardMaterial.js +32 -0
  350. data/app/assets/javascripts/Shaders/Materials/DotMaterial.glsl +17 -0
  351. data/app/assets/javascripts/Shaders/Materials/DotMaterial.js +18 -0
  352. data/app/assets/javascripts/Shaders/Materials/ErosionMaterial.glsl +23 -0
  353. data/app/assets/javascripts/Shaders/Materials/ErosionMaterial.js +24 -0
  354. data/app/assets/javascripts/Shaders/Materials/FacetMaterial.glsl +18 -0
  355. data/app/assets/javascripts/Shaders/Materials/FacetMaterial.js +19 -0
  356. data/app/assets/javascripts/Shaders/Materials/FresnelMaterial.glsl +12 -0
  357. data/app/assets/javascripts/Shaders/Materials/FresnelMaterial.js +15 -0
  358. data/app/assets/javascripts/Shaders/Materials/GrassMaterial.glsl +28 -0
  359. data/app/assets/javascripts/Shaders/Materials/GrassMaterial.js +26 -0
  360. data/app/assets/javascripts/Shaders/Materials/NormalMapMaterial.glsl +19 -0
  361. data/app/assets/javascripts/Shaders/Materials/NormalMapMaterial.js +21 -0
  362. data/app/assets/javascripts/Shaders/Materials/ReflectionMaterial.glsl +13 -0
  363. data/app/assets/javascripts/Shaders/Materials/ReflectionMaterial.js +16 -0
  364. data/app/assets/javascripts/Shaders/Materials/RefractionMaterial.glsl +14 -0
  365. data/app/assets/javascripts/Shaders/Materials/RefractionMaterial.js +17 -0
  366. data/app/assets/javascripts/Shaders/Materials/RimLightingMaterial.glsl +18 -0
  367. data/app/assets/javascripts/Shaders/Materials/RimLightingMaterial.js +19 -0
  368. data/app/assets/javascripts/Shaders/Materials/StripeMaterial.glsl +29 -0
  369. data/app/assets/javascripts/Shaders/Materials/StripeMaterial.js +26 -0
  370. data/app/assets/javascripts/Shaders/Materials/TieDyeMaterial.glsl +17 -0
  371. data/app/assets/javascripts/Shaders/Materials/TieDyeMaterial.js +19 -0
  372. data/app/assets/javascripts/Shaders/Materials/Water.glsl +91 -0
  373. data/app/assets/javascripts/Shaders/Materials/Water.js +60 -0
  374. data/app/assets/javascripts/Shaders/Materials/WoodMaterial.glsl +36 -0
  375. data/app/assets/javascripts/Shaders/Materials/WoodMaterial.js +31 -0
  376. data/app/assets/javascripts/Shaders/Noise.glsl +453 -0
  377. data/app/assets/javascripts/Shaders/Noise.js +242 -0
  378. data/app/assets/javascripts/Shaders/PolygonFS.glsl +27 -0
  379. data/app/assets/javascripts/Shaders/PolygonFS.js +23 -0
  380. data/app/assets/javascripts/Shaders/PolygonFSPick.glsl +6 -0
  381. data/app/assets/javascripts/Shaders/PolygonFSPick.js +11 -0
  382. data/app/assets/javascripts/Shaders/PolygonVS.glsl +38 -0
  383. data/app/assets/javascripts/Shaders/PolygonVS.js +39 -0
  384. data/app/assets/javascripts/Shaders/PolygonVSPick.glsl +30 -0
  385. data/app/assets/javascripts/Shaders/PolygonVSPick.js +32 -0
  386. data/app/assets/javascripts/Shaders/PolylineFS.glsl +6 -0
  387. data/app/assets/javascripts/Shaders/PolylineFS.js +11 -0
  388. data/app/assets/javascripts/Shaders/PolylineVS.glsl +34 -0
  389. data/app/assets/javascripts/Shaders/PolylineVS.js +35 -0
  390. data/app/assets/javascripts/Shaders/Ray.glsl +532 -0
  391. data/app/assets/javascripts/Shaders/Ray.js +357 -0
  392. data/app/assets/javascripts/Shaders/ReprojectWebMercatorFS.glsl +26 -0
  393. data/app/assets/javascripts/Shaders/ReprojectWebMercatorFS.js +22 -0
  394. data/app/assets/javascripts/Shaders/ReprojectWebMercatorVS.glsl +11 -0
  395. data/app/assets/javascripts/Shaders/ReprojectWebMercatorVS.js +14 -0
  396. data/app/assets/javascripts/Shaders/SensorVolume.glsl +43 -0
  397. data/app/assets/javascripts/Shaders/SensorVolume.js +31 -0
  398. data/app/assets/javascripts/Shaders/Shaders.profile.js +8 -0
  399. data/app/assets/javascripts/Shaders/SkyAtmosphereFS.glsl +70 -0
  400. data/app/assets/javascripts/Shaders/SkyAtmosphereFS.js +62 -0
  401. data/app/assets/javascripts/Shaders/SkyAtmosphereVS.glsl +131 -0
  402. data/app/assets/javascripts/Shaders/SkyAtmosphereVS.js +115 -0
  403. data/app/assets/javascripts/Shaders/SkyBoxFS.glsl +10 -0
  404. data/app/assets/javascripts/Shaders/SkyBoxFS.js +14 -0
  405. data/app/assets/javascripts/Shaders/SkyBoxVS.glsl +10 -0
  406. data/app/assets/javascripts/Shaders/SkyBoxVS.js +14 -0
  407. data/app/assets/javascripts/Shaders/ViewportQuadFS.glsl +16 -0
  408. data/app/assets/javascripts/Shaders/ViewportQuadFS.js +17 -0
  409. data/app/assets/javascripts/Shaders/ViewportQuadVS.glsl +10 -0
  410. data/app/assets/javascripts/Shaders/ViewportQuadVS.js +14 -0
  411. data/app/assets/javascripts/Shaders/package.json +6 -0
  412. data/app/assets/javascripts/ThirdParty/ThirdParty.profile.js +8 -0
  413. data/app/assets/javascripts/ThirdParty/Tween.js +678 -0
  414. data/app/assets/javascripts/ThirdParty/Uri.js +277 -0
  415. data/app/assets/javascripts/ThirdParty/measureText.js +197 -0
  416. data/app/assets/javascripts/ThirdParty/package.json +6 -0
  417. data/app/assets/javascripts/ThirdParty/sprintf.js +319 -0
  418. data/app/assets/javascripts/ThirdParty/when.js +748 -0
  419. data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.css +175 -0
  420. data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.html +52 -0
  421. data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.js +1237 -0
  422. data/app/assets/javascripts/Widgets/Dojo/CesiumWidget.html +4 -0
  423. data/app/assets/javascripts/Widgets/Dojo/CesiumWidget.js +349 -0
  424. data/app/assets/javascripts/Widgets/Dojo/TimelineWidget.css +1 -0
  425. data/app/assets/javascripts/Widgets/Dojo/TimelineWidget.js +47 -0
  426. data/app/assets/javascripts/Widgets/Dojo/checkForChromeFrame.js +71 -0
  427. data/app/assets/javascripts/Widgets/Images/Bing_Logo_51x19_White.png +0 -0
  428. data/app/assets/javascripts/Widgets/Images/Cesium_Logo_overlay.png +0 -0
  429. data/app/assets/javascripts/Widgets/Images/TimelineIcons.png +0 -0
  430. data/app/assets/javascripts/Widgets/Images/ajax-loader.gif +0 -0
  431. data/app/assets/javascripts/Widgets/Images/animationBar.png +0 -0
  432. data/app/assets/javascripts/Widgets/Images/viewControlBar.png +0 -0
  433. data/app/assets/javascripts/Widgets/Timeline.css +113 -0
  434. data/app/assets/javascripts/Widgets/Timeline.js +629 -0
  435. data/app/assets/javascripts/Widgets/TimelineHighlightRange.js +51 -0
  436. data/app/assets/javascripts/Widgets/TimelineTrack.js +54 -0
  437. data/app/assets/javascripts/Widgets/Widgets.profile.js +8 -0
  438. data/app/assets/javascripts/Widgets/package.json +6 -0
  439. data/app/assets/javascripts/Workers/Workers.profile.js +8 -0
  440. data/app/assets/javascripts/Workers/cesiumWorkerBootstrapper.js +2015 -0
  441. data/app/assets/javascripts/Workers/createTaskProcessorWorker.js +55 -0
  442. data/app/assets/javascripts/Workers/createVerticesFromExtent.js +24 -0
  443. data/app/assets/javascripts/Workers/package.json +6 -0
  444. data/app/assets/javascripts/copyrightHeader.js +22 -0
  445. data/app/assets/javascripts/main.js +10 -0
  446. data/app/assets/stylesheets/cesium.css +4 -0
  447. data/app/controllers/cesium_controller.rb +4 -0
  448. data/app/helpers/cesium_helper.rb +2 -0
  449. data/app/views/cesium/index.html.erb +3 -0
  450. data/config/routes.rb +3 -0
  451. data/lib/cesium.rb +4 -0
  452. data/lib/cesium/engine.rb +4 -0
  453. data/lib/cesium/version.rb +3 -0
  454. data/lib/tasks/cesium_tasks.rake +4 -0
  455. data/test/cesium_test.rb +7 -0
  456. data/test/dummy/README.rdoc +261 -0
  457. data/test/dummy/Rakefile +7 -0
  458. data/test/dummy/app/assets/javascripts/adapters/jquery-adapter.js.coffee +4 -0
  459. data/test/dummy/app/assets/javascripts/app.js.coffee +11 -0
  460. data/test/dummy/app/assets/javascripts/application.js.coffee +73 -0
  461. data/test/dummy/app/assets/stylesheets/application.css +12 -0
  462. data/test/dummy/app/controllers/application_controller.rb +4 -0
  463. data/test/dummy/app/helpers/application_helper.rb +2 -0
  464. data/test/dummy/app/views/layouts/application.html.erb +21 -0
  465. data/test/dummy/config.ru +4 -0
  466. data/test/dummy/config/application.rb +59 -0
  467. data/test/dummy/config/boot.rb +10 -0
  468. data/test/dummy/config/database.yml +25 -0
  469. data/test/dummy/config/environment.rb +5 -0
  470. data/test/dummy/config/environments/development.rb +37 -0
  471. data/test/dummy/config/environments/production.rb +67 -0
  472. data/test/dummy/config/environments/test.rb +37 -0
  473. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  474. data/test/dummy/config/initializers/inflections.rb +15 -0
  475. data/test/dummy/config/initializers/mime_types.rb +5 -0
  476. data/test/dummy/config/initializers/secret_token.rb +7 -0
  477. data/test/dummy/config/initializers/session_store.rb +8 -0
  478. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  479. data/test/dummy/config/locales/en.yml +5 -0
  480. data/test/dummy/config/requirejs.yml +10 -0
  481. data/test/dummy/config/routes.rb +3 -0
  482. data/test/dummy/public/404.html +26 -0
  483. data/test/dummy/public/422.html +26 -0
  484. data/test/dummy/public/500.html +25 -0
  485. data/test/dummy/public/favicon.ico +0 -0
  486. data/test/dummy/script/rails +6 -0
  487. data/test/functional/cesium_controller_test.rb +9 -0
  488. data/test/integration/navigation_test.rb +10 -0
  489. data/test/test_helper.rb +15 -0
  490. data/test/unit/helpers/cesium_helper_test.rb +4 -0
  491. metadata +641 -0
@@ -0,0 +1,365 @@
1
+ /*global define*/
2
+ define([
3
+ '../Core/DeveloperError',
4
+ '../Core/destroyObject',
5
+ '../Core/ComponentDatatype'
6
+ ], function(
7
+ DeveloperError,
8
+ destroyObject,
9
+ ComponentDatatype) {
10
+ "use strict";
11
+
12
+ /**
13
+ * DOC_TBA
14
+ *
15
+ * @alias VertexArray
16
+ *
17
+ * @internalConstructor
18
+ *
19
+ * @see {@link Context#createVertexArray}
20
+ * @see {@link Context#createVertexArrayFromMesh}
21
+ */
22
+ var VertexArray = function(gl, attributes, indexBuffer) {
23
+ this._gl = gl;
24
+ this._attributes = [];
25
+ this._indexBuffer = indexBuffer;
26
+
27
+ if (attributes) {
28
+ for ( var i = 0; i < attributes.length; ++i) {
29
+ try {
30
+ this._addAttribute(attributes[i], i);
31
+ } catch (e) {
32
+ throw new DeveloperError(e.message);
33
+ }
34
+ }
35
+ }
36
+
37
+ // Verify all attribute names are unique
38
+ var uniqueIndices = {};
39
+ for ( var j = 0; j < this._attributes.length; ++j) {
40
+ var index = this._attributes[j].index;
41
+ if (uniqueIndices[index]) {
42
+ throw new DeveloperError('Index ' + index + ' is used by more than one attribute.');
43
+ }
44
+
45
+ uniqueIndices[index] = true;
46
+ }
47
+ };
48
+
49
+ VertexArray.prototype._addAttribute = function(attribute, index) {
50
+ if (!attribute.vertexBuffer && !attribute.value) {
51
+ throw new DeveloperError('attribute must have a vertexBuffer or a value.');
52
+ }
53
+
54
+ if (attribute.vertexBuffer && attribute.value) {
55
+ throw new DeveloperError('attribute cannot have both a vertexBuffer and a value. It must have either a vertexBuffer property defining per-vertex data or a value property defining data for all vertices.');
56
+ }
57
+
58
+ var componentsPerAttribute = attribute.value ? attribute.value.length : attribute.componentsPerAttribute;
59
+
60
+ if ((componentsPerAttribute !== 1) &&
61
+ (componentsPerAttribute !== 2) &&
62
+ (componentsPerAttribute !== 3) &&
63
+ (componentsPerAttribute !== 4)) {
64
+ if (attribute.value) {
65
+ throw new DeveloperError('attribute.value.length must be in the range [1, 4].');
66
+ }
67
+
68
+ throw new DeveloperError('attribute.componentsPerAttribute must be in the range [1, 4].');
69
+ }
70
+
71
+ if (attribute.componentDatatype) {
72
+ var datatype = attribute.componentDatatype;
73
+ if (!ComponentDatatype.validate(datatype)) {
74
+ throw new DeveloperError('attribute must have a valid componentDatatype or not specify it.');
75
+ }
76
+ }
77
+
78
+ if (attribute.strideInBytes && (attribute.strideInBytes > 255)) {
79
+ // WebGL limit. Not in GL ES.
80
+ throw new DeveloperError('attribute must have a strideInBytes less than or equal to 255 or not specify it.');
81
+ }
82
+
83
+ // Shallow copy the attribute; we do not want to copy the vertex buffer.
84
+ var attr = {
85
+ index : (typeof attribute.index === 'undefined') ? index : attribute.index,
86
+ enabled : (typeof attribute.enabled === 'undefined') ? true : attribute.enabled,
87
+ vertexBuffer : attribute.vertexBuffer,
88
+ value : attribute.value ? attribute.value.slice(0) : undefined,
89
+ componentsPerAttribute : componentsPerAttribute,
90
+ componentDatatype : attribute.componentDatatype || ComponentDatatype.FLOAT,
91
+ normalize : attribute.normalize || false,
92
+ offsetInBytes : attribute.offsetInBytes || 0,
93
+ strideInBytes : attribute.strideInBytes || 0
94
+ };
95
+
96
+ if (attr.vertexBuffer) {
97
+ // Common case: vertex buffer for per-vertex data
98
+ attr.vertexAttrib = function(gl) {
99
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer._getBuffer());
100
+ gl.vertexAttribPointer(this.index, this.componentsPerAttribute, this.componentDatatype, this.normalize, this.strideInBytes, this.offsetInBytes);
101
+ gl.enableVertexAttribArray(this.index);
102
+ };
103
+
104
+ attr.disableVertexAttribArray = function(gl) {
105
+ gl.disableVertexAttribArray(this.index);
106
+ };
107
+ } else {
108
+ // Less common case: value array for the same data for each vertex
109
+ switch (attr.componentsPerAttribute) {
110
+ case 1:
111
+ attr.vertexAttrib = function(gl) {
112
+ gl.vertexAttrib1fv(this.index, this.value);
113
+ };
114
+ break;
115
+ case 2:
116
+ attr.vertexAttrib = function(gl) {
117
+ gl.vertexAttrib2fv(this.index, this.value);
118
+ };
119
+ break;
120
+ case 3:
121
+ attr.vertexAttrib = function(gl) {
122
+ gl.vertexAttrib3fv(this.index, this.value);
123
+ };
124
+ break;
125
+ case 4:
126
+ attr.vertexAttrib = function(gl) {
127
+ gl.vertexAttrib4fv(this.index, this.value);
128
+ };
129
+ break;
130
+ }
131
+
132
+ attr.disableVertexAttribArray = function(gl) {
133
+ };
134
+ }
135
+
136
+ this._attributes.push(attr);
137
+ };
138
+
139
+ /**
140
+ * DOC_TBA
141
+ *
142
+ * index is the location in the array of attributes, not the index property of an attribute.
143
+ *
144
+ * @memberof VertexArray
145
+ *
146
+ * @exception {DeveloperError} index is required.
147
+ * @exception {DeveloperError} This vertex array was destroyed, i.e., destroy() was called.
148
+ */
149
+ VertexArray.prototype.getAttribute = function(index) {
150
+ if (typeof index === 'undefined') {
151
+ throw new DeveloperError('index is required.');
152
+ }
153
+
154
+ return this._attributes[index];
155
+ };
156
+
157
+ /**
158
+ * DOC_TBA
159
+ *
160
+ * @memberof VertexArray
161
+ *
162
+ * @exception {DeveloperError} This vertex array was destroyed, i.e., destroy() was called.
163
+ */
164
+ VertexArray.prototype.getNumberOfAttributes = function() {
165
+ return this._attributes.length;
166
+ };
167
+
168
+ /**
169
+ * DOC_TBA
170
+ *
171
+ * @memberof VertexArray
172
+ *
173
+ * @exception {DeveloperError} Attribute must have a vertexBuffer.
174
+ * @exception {DeveloperError} Attribute must have a componentsPerAttribute.
175
+ * @exception {DeveloperError} Attribute must have a valid componentDatatype or not specify it.
176
+ * @exception {DeveloperError} Attribute must have a strideInBytes less than or equal to 255 or not specify it.
177
+ * @exception {DeveloperError} Index is already in use.
178
+ * @exception {DeveloperError} This vertex array was destroyed, i.e., destroy() was called.
179
+ */
180
+ VertexArray.prototype.addAttribute = function(attribute) {
181
+ if (attribute) {
182
+ var attributes = this._attributes;
183
+ var index = (typeof attribute.index === 'undefined') ? attributes.length : attribute.index;
184
+ for ( var i = 0; i < attributes.length; ++i) {
185
+ if (index === attributes[i].index) {
186
+ throw new DeveloperError('Index ' + index + ' is already in use.');
187
+ }
188
+ }
189
+
190
+ try {
191
+ this._addAttribute(attribute, index);
192
+ } catch (e) {
193
+ throw new DeveloperError(e.message);
194
+ }
195
+ }
196
+ };
197
+
198
+ /**
199
+ * DOC_TBA
200
+ *
201
+ * @memberof VertexArray
202
+ *
203
+ * @return {Boolean} True if the attribute was removed; false if the attribute was not found in the vertex array.
204
+ *
205
+ * @exception {DeveloperError} Attribute must have an index.
206
+ * @exception {DeveloperError} This vertex array was destroyed, i.e., destroy() was called.
207
+ */
208
+ VertexArray.prototype.removeAttribute = function(attribute) {
209
+ if (attribute) {
210
+ if (typeof attribute.index === 'undefined') {
211
+ throw new DeveloperError('Attribute must have an index.');
212
+ }
213
+
214
+ var attributes = this._attributes;
215
+ for ( var i = 0; i < attributes.length; ++i) {
216
+ if (attributes[i].index === attribute.index) {
217
+ attributes.splice(i, 1);
218
+ return true;
219
+ }
220
+ }
221
+ }
222
+
223
+ return false;
224
+ };
225
+
226
+ /**
227
+ * DOC_TBA
228
+ *
229
+ * @memberof VertexArray
230
+ *
231
+ * @return {Buffer} DOC_TBA.
232
+ * @exception {DeveloperError} This vertex array was destroyed, i.e., destroy() was called.
233
+ */
234
+ VertexArray.prototype.getIndexBuffer = function() {
235
+ return this._indexBuffer;
236
+ };
237
+
238
+ /**
239
+ * DOC_TBA
240
+ *
241
+ * @memberof VertexArray
242
+ *
243
+ * @exception {DeveloperError} This vertex array was destroyed, i.e., destroy() was called.
244
+ */
245
+ VertexArray.prototype.setIndexBuffer = function(indexBuffer) {
246
+ this._indexBuffer = indexBuffer;
247
+ };
248
+
249
+ VertexArray.prototype._bind = function() {
250
+ var attributes = this._attributes;
251
+ var gl = this._gl;
252
+
253
+ // TODO: Performance: sort by vertex buffer?
254
+ for ( var i = 0; i < attributes.length; ++i) {
255
+ var attribute = attributes[i];
256
+ if (attribute.enabled) {
257
+ attribute.vertexAttrib(gl);
258
+ }
259
+ }
260
+
261
+ if (this._indexBuffer) {
262
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer._getBuffer());
263
+ }
264
+ };
265
+
266
+ VertexArray.prototype._unBind = function() {
267
+ var attributes = this._attributes;
268
+ var gl = this._gl;
269
+
270
+ for ( var i = 0; i < attributes.length; ++i) {
271
+ var attribute = attributes[i];
272
+ if (attribute.enabled) {
273
+ attribute.disableVertexAttribArray(gl);
274
+ }
275
+ }
276
+ if (this._indexBuffer) {
277
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
278
+ }
279
+ };
280
+
281
+ /**
282
+ * This assumes that each vertex buffer in the vertex array has the same number of vertices.
283
+ * @private
284
+ */
285
+ VertexArray.prototype._getNumberOfVertices = function() {
286
+ if (this._attributes.length > 0) {
287
+ var attribute = this._attributes[0];
288
+ var bytes = attribute.strideInBytes || (attribute.componentsPerAttribute * attribute.componentDatatype.sizeInBytes);
289
+
290
+ return attribute.vertexBuffer.getSizeInBytes() / bytes;
291
+ }
292
+
293
+ return 0;
294
+ };
295
+
296
+ /**
297
+ * Returns true if this object was destroyed; otherwise, false.
298
+ * <br /><br />
299
+ * If this object was destroyed, it should not be used; calling any function other than
300
+ * <code>isDestroyed</code> will result in a {@link DeveloperError} exception.
301
+ *
302
+ * @memberof VertexArray
303
+ *
304
+ * @return {Boolean} True if this object was destroyed; otherwise, false.
305
+ *
306
+ * @see VertexArray#destroy
307
+ */
308
+ VertexArray.prototype.isDestroyed = function() {
309
+ return false;
310
+ };
311
+
312
+ /**
313
+ * Destroys the WebGL resources held by this object. Destroying an object allows for deterministic
314
+ * release of WebGL resources, instead of relying on the garbage collector to destroy this object.
315
+ * <br /><br />
316
+ * Only call this if the vertex array owns the vertex buffers referenced by the attributes and owns its
317
+ * index buffer; otherwise, the owner of the buffers is responsible for destroying them. A vertex or
318
+ * index buffer is only destroyed if it's <code>getVertexArrayDestroyable</code> function returns
319
+ * <code>true</code> (the default). This allows combining destroyable and non-destroyable buffers
320
+ * in the same vertex array.
321
+ * <br /><br />
322
+ * Once an object is destroyed, it should not be used; calling any function other than
323
+ * <code>isDestroyed</code> will result in a {@link DeveloperError} exception. Therefore,
324
+ * assign the return value (<code>undefined</code>) to the object as done in the example.
325
+ *
326
+ * @memberof VertexArray
327
+ *
328
+ * @return {undefined}
329
+ *
330
+ * @exception {DeveloperError} This vertex array was destroyed, i.e., destroy() was called.
331
+ *
332
+ * @see VertexArray#isDestroyed
333
+ * @see Buffer#getVertexArrayDestroyable
334
+ * @see <a href='http://www.khronos.org/opengles/sdk/2.0/docs/man/glDeleteBuffers.xml'>glDeleteBuffers</a>
335
+ *
336
+ * @example
337
+ * // Destroying the vertex array implicitly calls destroy for each of its vertex
338
+ * // buffers and its index buffer.
339
+ * var vertexBuffer = context.createVertexBuffer(new Float32Array([0, 0, 0]),
340
+ * BufferUsage.STATIC_DRAW);
341
+ * var vertexArray = context.createVertexArray();
342
+ * vertexArray.addAttribute({ vertexBuffer : vertexBuffer, componentsPerAttribute : 3 });
343
+ * // ...
344
+ * vertexArray = vertexArray.destroy();
345
+ * // Calling vertexBuffer.destroy() would throw DeveloperError at this point.
346
+ */
347
+ VertexArray.prototype.destroy = function() {
348
+ var attributes = this._attributes;
349
+ for ( var i = 0; i < attributes.length; ++i) {
350
+ var vertexBuffer = attributes[i].vertexBuffer;
351
+ if (vertexBuffer && !vertexBuffer.isDestroyed() && vertexBuffer.getVertexArrayDestroyable()) {
352
+ vertexBuffer.destroy();
353
+ }
354
+ }
355
+
356
+ var indexBuffer = this._indexBuffer;
357
+ if (indexBuffer && indexBuffer.getVertexArrayDestroyable()) {
358
+ this._indexBuffer = indexBuffer.destroy();
359
+ }
360
+
361
+ return destroyObject(this);
362
+ };
363
+
364
+ return VertexArray;
365
+ });
@@ -0,0 +1,574 @@
1
+ /*global define*/
2
+ define([
3
+ '../Core/DeveloperError',
4
+ '../Core/defaultValue',
5
+ '../Core/destroyObject',
6
+ '../Core/ComponentDatatype',
7
+ './BufferUsage'
8
+ ], function(
9
+ DeveloperError,
10
+ defaultValue,
11
+ destroyObject,
12
+ ComponentDatatype,
13
+ BufferUsage) {
14
+ "use strict";
15
+
16
+ /**
17
+ * DOC_TBA
18
+ *
19
+ * @alias VertexArrayFacade
20
+ *
21
+ * @constructor
22
+ *
23
+ * @exception {DeveloperError} context is required.
24
+ * @exception {DeveloperError} At least one attribute is required.
25
+ * @exception {DeveloperError} Attribute must have a componentsPerAttribute.
26
+ * @exception {DeveloperError} Attribute must have a valid componentDatatype or not specify it.
27
+ * @exception {DeveloperError} Attribute must have a valid usage or not specify it.
28
+ * @exception {DeveloperError} Index n is used by more than one attribute.
29
+ */
30
+ var VertexArrayFacade = function(context, attributes, sizeInVertices) {
31
+ if (!context) {
32
+ throw new DeveloperError('context is required.');
33
+ }
34
+
35
+ if (!attributes || (attributes.length === 0)) {
36
+ throw new DeveloperError('At least one attribute is required.');
37
+ }
38
+
39
+ var attrs = VertexArrayFacade._verifyAttributes(attributes);
40
+
41
+ sizeInVertices = sizeInVertices || 0;
42
+
43
+ var attributesByPurposeAndUsage = {};
44
+ var precreatedAttributes = [];
45
+
46
+ var attributesByUsage;
47
+ var attributesForUsage;
48
+ var purpose;
49
+ var usage;
50
+
51
+ // Bucket the attributes first by purpose and second by usage.
52
+ var length = attrs.length;
53
+ for (var i = 0; i < length; ++i) {
54
+ var attribute = attrs[i];
55
+
56
+ // If the attribute already has a vertex buffer, we do not need
57
+ // to manage a vertex buffer or typed array for it.
58
+ if (attribute.vertexBuffer) {
59
+ precreatedAttributes.push(attribute);
60
+ continue;
61
+ }
62
+
63
+ purpose = attribute.purpose;
64
+ attributesByUsage = attributesByPurposeAndUsage[purpose];
65
+ if (typeof attributesByUsage === 'undefined') {
66
+ attributesByUsage = attributesByPurposeAndUsage[purpose] = {};
67
+ }
68
+
69
+ usage = attribute.usage.toString();
70
+ attributesForUsage = attributesByUsage[usage];
71
+ if (typeof attributesForUsage === 'undefined') {
72
+ attributesForUsage = attributesByUsage[usage] = [];
73
+ }
74
+
75
+ attributesForUsage.push(attribute);
76
+ }
77
+
78
+ // A function to sort attributes by the size of their components. From left to right, a vertex
79
+ // stores floats, shorts, and then bytes.
80
+ function compare(left, right) {
81
+ return right.componentDatatype.sizeInBytes - left.componentDatatype.sizeInBytes;
82
+ }
83
+
84
+ // Create a buffer description for each purpose/usage combination.
85
+ this._buffersByPurposeAndUsage = {};
86
+ this._allBuffers = [];
87
+
88
+ for (purpose in attributesByPurposeAndUsage) {
89
+ if (attributesByPurposeAndUsage.hasOwnProperty(purpose)) {
90
+ attributesByUsage = attributesByPurposeAndUsage[purpose];
91
+
92
+ var buffersByUsage = this._buffersByPurposeAndUsage[purpose];
93
+ if (typeof buffersByUsage === 'undefined') {
94
+ buffersByUsage = this._buffersByPurposeAndUsage[purpose] = {};
95
+ }
96
+
97
+ for (usage in attributesByUsage) {
98
+ if (attributesByUsage.hasOwnProperty(usage)) {
99
+ attributesForUsage = attributesByUsage[usage];
100
+
101
+ attributesForUsage.sort(compare);
102
+ var vertexSizeInBytes = VertexArrayFacade._vertexSizeInBytes(attributesForUsage);
103
+
104
+ var usageEnum;
105
+ switch (usage) {
106
+ case BufferUsage.STATIC_DRAW.toString():
107
+ usageEnum = BufferUsage.STATIC_DRAW;
108
+ break;
109
+ case BufferUsage.STREAM_DRAW.toString():
110
+ usageEnum = BufferUsage.STREAM_DRAW;
111
+ break;
112
+ case BufferUsage.DYNAMIC_DRAW.toString():
113
+ usageEnum = BufferUsage.DYNAMIC_DRAW;
114
+ break;
115
+ }
116
+
117
+ var buffer = {
118
+ purpose : purpose,
119
+
120
+ vertexSizeInBytes : vertexSizeInBytes,
121
+
122
+ vertexBuffer : undefined,
123
+ usage : usageEnum,
124
+ needsCommit : false,
125
+
126
+ arrayBuffer : undefined,
127
+ arrayViews : VertexArrayFacade._createArrayViews(attributesForUsage, vertexSizeInBytes)
128
+ };
129
+
130
+ buffersByUsage[usage] = buffer;
131
+ this._allBuffers.push(buffer);
132
+ }
133
+ }
134
+ }
135
+ }
136
+
137
+ this._size = 0;
138
+
139
+ this._precreated = precreatedAttributes;
140
+ this._context = context;
141
+
142
+ /**
143
+ * DOC_TBA
144
+ */
145
+ this.writers = undefined;
146
+
147
+ /**
148
+ * DOC_TBA
149
+ */
150
+ this.vaByPurpose = undefined;
151
+
152
+ this.resize(sizeInVertices);
153
+ };
154
+
155
+ VertexArrayFacade._verifyAttributes = function(attributes) {
156
+ var attrs = [];
157
+
158
+ for ( var i = 0; i < attributes.length; ++i) {
159
+ var attribute = attributes[i];
160
+
161
+ var attr = {
162
+ index : (typeof attribute.index === 'undefined') ? i : attribute.index,
163
+ enabled : (typeof attribute.enabled === 'undefined') ? true : attribute.enabled,
164
+ componentsPerAttribute : attribute.componentsPerAttribute,
165
+ componentDatatype : attribute.componentDatatype || ComponentDatatype.FLOAT,
166
+ normalize : attribute.normalize || false,
167
+ purpose : defaultValue(attribute.purpose, 'all'),
168
+
169
+ // There will be either a vertexBuffer or an [optional] usage.
170
+ vertexBuffer : attribute.vertexBuffer,
171
+ usage : attribute.usage || BufferUsage.STATIC_DRAW
172
+ };
173
+ attrs.push(attr);
174
+
175
+ if ((attr.componentsPerAttribute !== 1) && (attr.componentsPerAttribute !== 2) && (attr.componentsPerAttribute !== 3) && (attr.componentsPerAttribute !== 4)) {
176
+ throw new DeveloperError('attribute.componentsPerAttribute must be in the range [1, 4].');
177
+ }
178
+
179
+ var datatype = attr.componentDatatype;
180
+ if (!ComponentDatatype.validate(datatype)) {
181
+ throw new DeveloperError('Attribute must have a valid componentDatatype or not specify it.');
182
+ }
183
+
184
+ if (!BufferUsage.validate(attr.usage)) {
185
+ throw new DeveloperError('Attribute must have a valid usage or not specify it.');
186
+ }
187
+ }
188
+
189
+ // Verify all attribute names are unique.
190
+ // Multiple attributes can share a name as long as they have different purposes.
191
+ var uniqueIndices = new Array(attrs.length);
192
+ for ( var j = 0; j < attrs.length; ++j) {
193
+ var currentAttr = attrs[j];
194
+ var index = currentAttr.index;
195
+ var purpose = currentAttr.purpose;
196
+
197
+ if (purpose !== 'all') {
198
+ var uniqueIndex = uniqueIndices[index];
199
+ if (uniqueIndex === true) {
200
+ throw new DeveloperError('Index ' + index + ' is used by more than one attribute.');
201
+ }
202
+ if (typeof uniqueIndex !== 'undefined') {
203
+ if (uniqueIndex[purpose]) {
204
+ throw new DeveloperError('Index ' + index + ' is used by more than one attribute with the same purpose.');
205
+ }
206
+ } else {
207
+ uniqueIndex = uniqueIndices[index] = {};
208
+ }
209
+ uniqueIndex[purpose] = true;
210
+ } else {
211
+ if (uniqueIndices[index]) {
212
+ throw new DeveloperError('Index ' + index + ' is used by more than one attribute.');
213
+ }
214
+ uniqueIndices[index] = true;
215
+ }
216
+ }
217
+
218
+ return attrs;
219
+ };
220
+
221
+ VertexArrayFacade._vertexSizeInBytes = function(attributes) {
222
+ var sizeInBytes = 0;
223
+
224
+ var length = attributes.length;
225
+ for ( var i = 0; i < length; ++i) {
226
+ var attribute = attributes[i];
227
+ sizeInBytes += (attribute.componentsPerAttribute * attribute.componentDatatype.sizeInBytes);
228
+ }
229
+
230
+ var maxComponentSizeInBytes = (length > 0) ? attributes[0].componentDatatype.sizeInBytes : 0; // Sorted by size
231
+ var remainder = (maxComponentSizeInBytes > 0) ? (sizeInBytes % maxComponentSizeInBytes) : 0;
232
+ var padding = (remainder === 0) ? 0 : (maxComponentSizeInBytes - remainder);
233
+ sizeInBytes += padding;
234
+
235
+ return sizeInBytes;
236
+ };
237
+
238
+ VertexArrayFacade._createArrayViews = function(attributes, vertexSizeInBytes) {
239
+ var views = [];
240
+ var offsetInBytes = 0;
241
+
242
+ var length = attributes.length;
243
+ for ( var i = 0; i < length; ++i) {
244
+ var attribute = attributes[i];
245
+ var componentDatatype = attribute.componentDatatype;
246
+
247
+ views.push({
248
+ index : attribute.index,
249
+ enabled : attribute.enabled,
250
+ componentsPerAttribute : attribute.componentsPerAttribute,
251
+ componentDatatype : componentDatatype,
252
+ normalize : attribute.normalize,
253
+
254
+ offsetInBytes : offsetInBytes,
255
+ vertexSizeInComponentType : vertexSizeInBytes / componentDatatype.sizeInBytes,
256
+
257
+ view : undefined
258
+ });
259
+
260
+ offsetInBytes += (attribute.componentsPerAttribute * componentDatatype.sizeInBytes);
261
+ }
262
+
263
+ return views;
264
+ };
265
+
266
+ /**
267
+ * DOC_TBA
268
+ *
269
+ * Invalidates writers. Can't render again until commit is called.
270
+ *
271
+ * @memberof VertexArrayFacade
272
+ */
273
+ VertexArrayFacade.prototype.resize = function(sizeInVertices) {
274
+ this._size = sizeInVertices;
275
+
276
+ var allBuffers = this._allBuffers;
277
+ this.writers = {};
278
+
279
+ for (var i = 0, len = allBuffers.length; i < len; ++i) {
280
+ var buffer = allBuffers[i];
281
+ VertexArrayFacade._resize(buffer, this._size);
282
+
283
+ var writersForPurpose = this.writers[buffer.purpose];
284
+ if (typeof writersForPurpose === 'undefined') {
285
+ writersForPurpose = this.writers[buffer.purpose] = [];
286
+ }
287
+
288
+ // Reserving invalidates the writers, so if client's cache them, they need to invalidate their cache.
289
+ VertexArrayFacade._appendWriters(writersForPurpose, buffer);
290
+ }
291
+
292
+ // VAs are recreated next time commit is called.
293
+ this._destroyVA();
294
+ };
295
+
296
+ VertexArrayFacade._resize = function(buffer, size) {
297
+ if (buffer.vertexSizeInBytes > 0) {
298
+ // Create larger array buffer
299
+ var arrayBuffer = new ArrayBuffer(size * buffer.vertexSizeInBytes);
300
+
301
+ // Copy contents from previous array buffer
302
+ if (buffer.arrayBuffer) {
303
+ var destView = new Uint8Array(arrayBuffer);
304
+ var sourceView = new Uint8Array(buffer.arrayBuffer);
305
+ var sourceLength = sourceView.length;
306
+ for ( var j = 0; j < sourceLength; ++j) {
307
+ destView[j] = sourceView[j];
308
+ }
309
+ }
310
+
311
+ // Create typed views into the new array buffer
312
+ var views = buffer.arrayViews;
313
+ var length = views.length;
314
+ for ( var i = 0; i < length; ++i) {
315
+ var view = views[i];
316
+ view.view = view.componentDatatype.createArrayBufferView(arrayBuffer, view.offsetInBytes);
317
+ }
318
+
319
+ buffer.arrayBuffer = arrayBuffer;
320
+ }
321
+ };
322
+
323
+ var createWriters = [
324
+ // 1 component per attribute
325
+ function(buffer, view, vertexSizeInComponentType) {
326
+ return function(index, attribute) {
327
+ view[index * vertexSizeInComponentType] = attribute;
328
+ buffer.needsCommit = true;
329
+ };
330
+ },
331
+
332
+ // 2 component per attribute
333
+ function(buffer, view, vertexSizeInComponentType) {
334
+ return function(index, component0, component1) {
335
+ var i = index * vertexSizeInComponentType;
336
+ view[i] = component0;
337
+ view[i + 1] = component1;
338
+ buffer.needsCommit = true;
339
+ };
340
+ },
341
+
342
+ // 3 component per attribute
343
+ function(buffer, view, vertexSizeInComponentType) {
344
+ return function(index, component0, component1, component2) {
345
+ var i = index * vertexSizeInComponentType;
346
+ view[i] = component0;
347
+ view[i + 1] = component1;
348
+ view[i + 2] = component2;
349
+ buffer.needsCommit = true;
350
+ };
351
+ },
352
+
353
+ // 4 component per attribute
354
+ function(buffer, view, vertexSizeInComponentType) {
355
+ return function(index, component0, component1, component2, component3) {
356
+ var i = index * vertexSizeInComponentType;
357
+ view[i] = component0;
358
+ view[i + 1] = component1;
359
+ view[i + 2] = component2;
360
+ view[i + 3] = component3;
361
+ buffer.needsCommit = true;
362
+ };
363
+ }];
364
+
365
+ VertexArrayFacade._appendWriters = function(writers, buffer) {
366
+ var arrayViews = buffer.arrayViews;
367
+ var length = arrayViews.length;
368
+ for ( var i = 0; i < length; ++i) {
369
+ var arrayView = arrayViews[i];
370
+ writers[arrayView.index] = createWriters[arrayView.componentsPerAttribute - 1](buffer, arrayView.view, arrayView.vertexSizeInComponentType);
371
+ }
372
+ };
373
+
374
+ /**
375
+ * DOC_TBA
376
+ *
377
+ * @memberof VertexArrayFacade
378
+ */
379
+ VertexArrayFacade.prototype.commit = function(indexBuffer) {
380
+ var recreateVA = false;
381
+
382
+ var allBuffers = this._allBuffers;
383
+ var buffer;
384
+
385
+ for (var i = 0, len = allBuffers.length; i < len; ++i) {
386
+ buffer = allBuffers[i];
387
+ recreateVA = this._commit(buffer) || recreateVA;
388
+ }
389
+
390
+ ///////////////////////////////////////////////////////////////////////
391
+
392
+ if (recreateVA || !this.va) {
393
+ // Using unsigned short indices, 64K vertices can be indexed by one index buffer
394
+ var sixtyFourK = 64 * 1024;
395
+
396
+ var buffersByPurposeAndUsage = this._buffersByPurposeAndUsage;
397
+
398
+ this._destroyVA();
399
+ this.vaByPurpose = {};
400
+
401
+ for (var purpose in buffersByPurposeAndUsage) {
402
+ if (buffersByPurposeAndUsage.hasOwnProperty(purpose)) {
403
+ var buffersByUsage = buffersByPurposeAndUsage[purpose];
404
+
405
+ var va = [];
406
+ var numberOfVertexArrays = Math.ceil(this._size / sixtyFourK);
407
+ for ( var k = 0; k < numberOfVertexArrays; ++k) {
408
+ var attributes = [];
409
+
410
+ // Add all-purpose attributes
411
+ var allPurposeBuffersByUsage = buffersByPurposeAndUsage.all;
412
+ if (allPurposeBuffersByUsage !== buffersByUsage) {
413
+ for (var allPurposeUsage in allPurposeBuffersByUsage) {
414
+ if (allPurposeBuffersByUsage.hasOwnProperty(allPurposeUsage)) {
415
+ var allPurposeBuffer = allPurposeBuffersByUsage[allPurposeUsage];
416
+ VertexArrayFacade._appendAttributes(attributes, allPurposeBuffer, k * (allPurposeBuffer.vertexSizeInBytes * sixtyFourK));
417
+ }
418
+ }
419
+ }
420
+
421
+ // Add purpose-specific attributes
422
+ for (var usage in buffersByUsage) {
423
+ if (buffersByUsage.hasOwnProperty(usage)) {
424
+ buffer = buffersByUsage[usage];
425
+ VertexArrayFacade._appendAttributes(attributes, buffer, k * (buffer.vertexSizeInBytes * sixtyFourK));
426
+ }
427
+ }
428
+
429
+ attributes = attributes.concat(this._precreated);
430
+
431
+ va.push({
432
+ va : this._context.createVertexArray(attributes, indexBuffer),
433
+ indicesCount : 1.5 * ((k !== (numberOfVertexArrays - 1)) ? sixtyFourK : (this._size % sixtyFourK))
434
+ // TODO: not hardcode 1.5
435
+ });
436
+ }
437
+
438
+ this.vaByPurpose[purpose] = va;
439
+ }
440
+ }
441
+ }
442
+ };
443
+
444
+ VertexArrayFacade.prototype._commit = function(buffer) {
445
+ if (buffer.needsCommit && (buffer.vertexSizeInBytes > 0)) {
446
+ buffer.needsCommit = false;
447
+
448
+ var vertexBuffer = buffer.vertexBuffer;
449
+ var vertexBufferSizeInBytes = this._size * buffer.vertexSizeInBytes;
450
+ if (!vertexBuffer || (vertexBuffer.getSizeInBytes() < vertexBufferSizeInBytes)) {
451
+ if (vertexBuffer) {
452
+ vertexBuffer.destroy();
453
+ }
454
+ buffer.vertexBuffer = this._context.createVertexBuffer(buffer.arrayBuffer, buffer.usage);
455
+ buffer.vertexBuffer.setVertexArrayDestroyable(false);
456
+
457
+ return true; // Created new vertex buffer
458
+ }
459
+
460
+ buffer.vertexBuffer.copyFromArrayView(buffer.arrayBuffer);
461
+ }
462
+
463
+ return false; // Did not create new vertex buffer
464
+ };
465
+
466
+ VertexArrayFacade._appendAttributes = function(attributes, buffer, vertexBufferOffset) {
467
+ var arrayViews = buffer.arrayViews;
468
+ var length = arrayViews.length;
469
+ for ( var i = 0; i < length; ++i) {
470
+ var view = arrayViews[i];
471
+
472
+ attributes.push({
473
+ index : view.index,
474
+ enabled : view.enabled,
475
+ componentsPerAttribute : view.componentsPerAttribute,
476
+ componentDatatype : view.componentDatatype,
477
+ normalize : view.normalize,
478
+ vertexBuffer : buffer.vertexBuffer,
479
+ offsetInBytes : vertexBufferOffset + view.offsetInBytes,
480
+ strideInBytes : buffer.vertexSizeInBytes
481
+ });
482
+ }
483
+ };
484
+
485
+ /**
486
+ * DOC_TBA
487
+ * @memberof VertexArrayFacade
488
+ */
489
+ VertexArrayFacade.prototype.subCommit = function(offsetInVertices, lengthInVertices) {
490
+ if (offsetInVertices < 0 || offsetInVertices >= this._size) {
491
+ throw new DeveloperError('offsetInVertices must be greater than or equal to zero and less than the vertex array size.');
492
+ }
493
+
494
+ if (offsetInVertices + lengthInVertices > this._size) {
495
+ throw new DeveloperError('offsetInVertices + lengthInVertices cannot exceed the vertex array size.');
496
+ }
497
+
498
+ var allBuffers = this._allBuffers;
499
+
500
+ for (var i = 0, len = allBuffers.length; i < len; ++i) {
501
+ this._subCommit(allBuffers[i], offsetInVertices, lengthInVertices);
502
+ }
503
+ };
504
+
505
+ VertexArrayFacade.prototype._subCommit = function(buffer, offsetInVertices, lengthInVertices) {
506
+ if (buffer.needsCommit && (buffer.vertexSizeInBytes > 0)) {
507
+ var byteOffset = buffer.vertexSizeInBytes * offsetInVertices;
508
+ var byteLength = buffer.vertexSizeInBytes * lengthInVertices;
509
+
510
+ // PERFORMANCE_IDEA: If we want to get really crazy, we could consider updating
511
+ // individual attributes instead of the entire (sub-)vertex.
512
+ //
513
+ // PERFORMANCE_IDEA: Does creating the typed view add too much GC overhead?
514
+ buffer.vertexBuffer.copyFromArrayView(new Uint8Array(buffer.arrayBuffer, byteOffset, byteLength), byteOffset);
515
+ }
516
+ };
517
+
518
+ /**
519
+ * DOC_TBA
520
+ * @memberof VertexArrayFacade
521
+ */
522
+ VertexArrayFacade.prototype.endSubCommits = function() {
523
+ var allBuffers = this._allBuffers;
524
+
525
+ for (var i = 0, len = allBuffers.length; i < len; ++i) {
526
+ allBuffers[i].needsCommit = false;
527
+ }
528
+ };
529
+
530
+ VertexArrayFacade.prototype._destroyVA = function() {
531
+ var vaByPurpose = this.vaByPurpose;
532
+ if (typeof vaByPurpose === 'undefined') {
533
+ return;
534
+ }
535
+
536
+ for (var purpose in vaByPurpose) {
537
+ if (vaByPurpose.hasOwnProperty(purpose)) {
538
+ var va = vaByPurpose[purpose];
539
+ var length = va.length;
540
+ for (var i = 0; i < length; ++i) {
541
+ va[i].va.destroy();
542
+ }
543
+ }
544
+ }
545
+
546
+ this.vaByPurpose = undefined;
547
+ };
548
+
549
+ /**
550
+ * DOC_TBA
551
+ * @memberof VertexArrayFacade
552
+ */
553
+ VertexArrayFacade.prototype.isDestroyed = function() {
554
+ return false;
555
+ };
556
+
557
+ /**
558
+ * DOC_TBA
559
+ * @memberof VertexArrayFacade
560
+ */
561
+ VertexArrayFacade.prototype.destroy = function() {
562
+ var allBuffers = this._allBuffers;
563
+ for (var i = 0, len = allBuffers.length; i < len; ++i) {
564
+ var buffer = allBuffers[i];
565
+ buffer.vertexBuffer = buffer.vertexBuffer && buffer.vertexBuffer.destroy();
566
+ }
567
+
568
+ this._destroyVA();
569
+
570
+ return destroyObject(this);
571
+ };
572
+
573
+ return VertexArrayFacade;
574
+ });