@cesium/engine 26.2.0 → 26.3.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 (366) hide show
  1. package/Build/ThirdParty/Workers/zip-web-worker.js +656 -518
  2. package/Build/Workers/{chunk-FU4BGABC.js → chunk-2DKJSPYF.js} +14 -14
  3. package/Build/Workers/{chunk-NCL22ZUX.js → chunk-2PWVICP6.js} +1 -1
  4. package/Build/Workers/{chunk-ILME5BXA.js → chunk-2YY724ZX.js} +8 -8
  5. package/Build/Workers/{chunk-IJZJMIUY.js → chunk-4DMAXPKB.js} +11 -11
  6. package/Build/Workers/{chunk-IMBVP57H.js → chunk-4LRFYRBX.js} +2 -2
  7. package/Build/Workers/{chunk-76FDC45O.js → chunk-5JCZHJUU.js} +13 -13
  8. package/Build/Workers/{chunk-5LSOO2KD.js → chunk-5KG7KDDW.js} +7 -7
  9. package/Build/Workers/{chunk-UAZUP4I5.js → chunk-6BSNYZZG.js} +5 -5
  10. package/Build/Workers/{chunk-D6AY775A.js → chunk-6R6SGKYN.js} +6 -6
  11. package/Build/Workers/{chunk-3PSS3T43.js → chunk-6V2KDEHL.js} +4 -4
  12. package/Build/Workers/{chunk-GHXVQVUM.js → chunk-75BC2IHI.js} +7 -7
  13. package/Build/Workers/{chunk-SMTGMFBL.js → chunk-7SESBH2I.js} +4 -4
  14. package/Build/Workers/{chunk-NEFDMMLY.js → chunk-7WXBTNRV.js} +8 -8
  15. package/Build/Workers/{chunk-NXGQBQWE.js → chunk-A7SMPV6B.js} +12 -12
  16. package/Build/Workers/{chunk-O3XFXGPZ.js → chunk-ATSXKJ3L.js} +7 -7
  17. package/Build/Workers/{chunk-AHWAZRBV.js → chunk-B4AVL7VI.js} +1 -1
  18. package/Build/Workers/{chunk-OZGPS7FB.js → chunk-B7Q2WF6Q.js} +4 -4
  19. package/Build/Workers/{chunk-2RGJPWQX.js → chunk-BNDSDQ7D.js} +9 -9
  20. package/Build/Workers/{chunk-2Z4ZLVOD.js → chunk-CKK6CUXK.js} +6 -6
  21. package/Build/Workers/{chunk-FCP2QY4G.js → chunk-COKOYTRS.js} +5 -5
  22. package/Build/Workers/{chunk-6FZDPMTO.js → chunk-CQ4TZXAT.js} +6 -6
  23. package/Build/Workers/{chunk-HDL4HOXZ.js → chunk-DKSANM4A.js} +12 -12
  24. package/Build/Workers/{chunk-XCBZVTIV.js → chunk-DZK34ZVD.js} +1 -1
  25. package/Build/Workers/{chunk-N7CCOFLX.js → chunk-E7G32DWL.js} +1 -1
  26. package/Build/Workers/{chunk-XDWCTQCZ.js → chunk-EDETO6NY.js} +2 -2
  27. package/Build/Workers/{chunk-NSKZ6SBK.js → chunk-F34TJJLA.js} +14 -14
  28. package/Build/Workers/{chunk-GXWQZBAI.js → chunk-GLHDTTTO.js} +2 -2
  29. package/Build/Workers/{chunk-SJYSIOEM.js → chunk-GS7RY2DH.js} +11 -11
  30. package/Build/Workers/{chunk-5YPQBFRD.js → chunk-HDD3RFLT.js} +3 -3
  31. package/Build/Workers/{chunk-36NI5E6W.js → chunk-HDPNFEPP.js} +18 -18
  32. package/Build/Workers/{chunk-DSGLDRTI.js → chunk-JBJ6BRIM.js} +4 -4
  33. package/Build/Workers/{chunk-DZUFEE4L.js → chunk-JKTWW7IO.js} +5 -5
  34. package/Build/Workers/{chunk-O3DKEX7Q.js → chunk-JL4NWWQY.js} +5 -5
  35. package/Build/Workers/{chunk-I74ZH5LK.js → chunk-JMUUAW4X.js} +10 -10
  36. package/Build/Workers/{chunk-SXSP3JHS.js → chunk-KBGAHN5R.js} +1 -1
  37. package/Build/Workers/{chunk-GVA7XQI2.js → chunk-KEWK6VZL.js} +12 -12
  38. package/Build/Workers/{chunk-EOWDZN5S.js → chunk-L73K5UPP.js} +10 -10
  39. package/Build/Workers/{chunk-J73T2VOY.js → chunk-LL2SGJYH.js} +6 -6
  40. package/Build/Workers/{chunk-QFSSCLLZ.js → chunk-LYJUL4XQ.js} +6 -6
  41. package/Build/Workers/{chunk-MAAHFYPC.js → chunk-M6W46OAP.js} +7 -7
  42. package/Build/Workers/{chunk-FX3VEAIU.js → chunk-MDDKCLMF.js} +16 -16
  43. package/Build/Workers/{chunk-M6QKXVAU.js → chunk-MUW4DJV7.js} +17 -17
  44. package/Build/Workers/{chunk-EZGQPOIG.js → chunk-N5YK44FS.js} +5 -5
  45. package/Build/Workers/{chunk-27FWRTJI.js → chunk-NZQUP52G.js} +9 -9
  46. package/Build/Workers/{chunk-A62YI6S6.js → chunk-PKZA44LH.js} +4 -4
  47. package/Build/Workers/{chunk-7MM3N2VE.js → chunk-Q2JS5LCB.js} +17 -17
  48. package/Build/Workers/{chunk-KGXSYGBG.js → chunk-QTAEVUED.js} +13 -13
  49. package/Build/Workers/{chunk-KP5QD7WU.js → chunk-SEJIXZZ4.js} +10 -10
  50. package/Build/Workers/{chunk-PRWUMCXF.js → chunk-SL2HCFYW.js} +10 -10
  51. package/Build/Workers/{chunk-NJVBJG63.js → chunk-SLHK3KAR.js} +5 -5
  52. package/Build/Workers/{chunk-JKXV6PG5.js → chunk-UZY5XRL2.js} +1 -1
  53. package/Build/Workers/{chunk-LDRQSYBN.js → chunk-VRECSMG3.js} +2 -2
  54. package/Build/Workers/{chunk-NLLCQBX3.js → chunk-X27HKF5E.js} +2 -2
  55. package/Build/Workers/{chunk-B3QHNA4A.js → chunk-XBY3354M.js} +6 -6
  56. package/Build/Workers/{chunk-CRCGE4J4.js → chunk-XRZCS3HE.js} +8 -8
  57. package/Build/Workers/{chunk-XLQZNQ4Z.js → chunk-XSIUYAT6.js} +2 -2
  58. package/Build/Workers/{chunk-SA2A2AN5.js → chunk-Z2DW5NM2.js} +4 -4
  59. package/Build/Workers/combineGeometry.js +24 -24
  60. package/Build/Workers/createBoxGeometry.js +18 -18
  61. package/Build/Workers/createBoxOutlineGeometry.js +16 -16
  62. package/Build/Workers/createCircleGeometry.js +26 -26
  63. package/Build/Workers/createCircleOutlineGeometry.js +19 -19
  64. package/Build/Workers/createCoplanarPolygonGeometry.js +33 -33
  65. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +31 -31
  66. package/Build/Workers/createCorridorGeometry.js +29 -29
  67. package/Build/Workers/createCorridorOutlineGeometry.js +28 -28
  68. package/Build/Workers/createCylinderGeometry.js +20 -20
  69. package/Build/Workers/createCylinderOutlineGeometry.js +18 -18
  70. package/Build/Workers/createEllipseGeometry.js +26 -26
  71. package/Build/Workers/createEllipseOutlineGeometry.js +19 -19
  72. package/Build/Workers/createEllipsoidGeometry.js +19 -19
  73. package/Build/Workers/createEllipsoidOutlineGeometry.js +18 -18
  74. package/Build/Workers/createFrustumGeometry.js +18 -18
  75. package/Build/Workers/createFrustumOutlineGeometry.js +18 -18
  76. package/Build/Workers/createGeometry.js +24 -24
  77. package/Build/Workers/createGroundPolylineGeometry.js +22 -22
  78. package/Build/Workers/createPlaneGeometry.js +16 -16
  79. package/Build/Workers/createPlaneOutlineGeometry.js +15 -15
  80. package/Build/Workers/createPolygonGeometry.js +32 -32
  81. package/Build/Workers/createPolygonOutlineGeometry.js +30 -30
  82. package/Build/Workers/createPolylineGeometry.js +25 -25
  83. package/Build/Workers/createPolylineVolumeGeometry.js +31 -31
  84. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +27 -27
  85. package/Build/Workers/createRectangleGeometry.js +27 -27
  86. package/Build/Workers/createRectangleOutlineGeometry.js +20 -20
  87. package/Build/Workers/createSimplePolylineGeometry.js +23 -23
  88. package/Build/Workers/createSphereGeometry.js +19 -19
  89. package/Build/Workers/createSphereOutlineGeometry.js +18 -18
  90. package/Build/Workers/createTaskProcessorWorker.js +3 -3
  91. package/Build/Workers/createVectorTileClampedPolylines.js +14 -14
  92. package/Build/Workers/createVectorTileGeometries.js +24 -24
  93. package/Build/Workers/createVectorTilePoints.js +13 -13
  94. package/Build/Workers/createVectorTilePolygons.js +22 -22
  95. package/Build/Workers/createVectorTilePolylines.js +14 -14
  96. package/Build/Workers/createVerticesFromCesium3DTilesTerrain.js +25 -25
  97. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +22 -22
  98. package/Build/Workers/createVerticesFromHeightmap.js +22 -22
  99. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +20 -20
  100. package/Build/Workers/createWallGeometry.js +24 -24
  101. package/Build/Workers/createWallOutlineGeometry.js +23 -23
  102. package/Build/Workers/decodeDraco.js +10 -10
  103. package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +5 -5
  104. package/Build/Workers/decodeI3S.js +10 -10
  105. package/Build/Workers/gaussianSplatSorter.js +4 -4
  106. package/Build/Workers/gaussianSplatTextureGenerator.js +4 -4
  107. package/Build/Workers/incrementallyBuildTerrainPicker.js +10 -10
  108. package/Build/Workers/transcodeKTX2.js +6 -6
  109. package/Build/Workers/transferTypedArrayTest.js +1 -1
  110. package/Build/Workers/upsampleQuantizedTerrainMesh.js +22 -22
  111. package/Build/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +25 -25
  112. package/Source/Core/Ion.js +1 -1
  113. package/Source/Core/IonResource.js +5 -0
  114. package/Source/Core/IonSnapGeometryType.js +59 -0
  115. package/Source/Core/IonSnapHeat.js +33 -0
  116. package/Source/Core/IonSnapMode.js +45 -0
  117. package/Source/Core/IonSnapParentGeometryType.js +52 -0
  118. package/Source/Core/IonSnapService.js +369 -0
  119. package/Source/Core/SnapService.js +63 -0
  120. package/Source/Core/VectorPipeline.js +139 -45
  121. package/Source/Core/VectorProvider.js +311 -71
  122. package/Source/Renderer/AutomaticUniforms.js +44 -2
  123. package/Source/Renderer/ShaderBuilder.js +1 -1
  124. package/Source/Renderer/UniformState.js +47 -1
  125. package/Source/Scene/ArcGisMapService.js +1 -1
  126. package/Source/Scene/BufferPointCollection.js +4 -7
  127. package/Source/Scene/BufferPolygonCollection.js +56 -27
  128. package/Source/Scene/BufferPolylineCollection.js +61 -8
  129. package/Source/Scene/BufferPolylineMaterial.js +6 -5
  130. package/Source/Scene/BufferPrimitiveCollection.js +199 -29
  131. package/Source/Scene/Cesium3DTile.js +12 -0
  132. package/Source/Scene/Cesium3DTileset.js +61 -8
  133. package/Source/Scene/Cesium3DTilesetBaseTraversal.js +15 -3
  134. package/Source/Scene/Cesium3DTilesetCache.js +15 -0
  135. package/Source/Scene/ClippingPolygon.js +154 -100
  136. package/Source/Scene/ClippingPolygonCollection.js +352 -694
  137. package/Source/Scene/CreditDisplay.js +62 -0
  138. package/Source/Scene/GeoJsonPrimitive.js +114 -24
  139. package/Source/Scene/GlobeSurfaceShaderSet.js +33 -54
  140. package/Source/Scene/GlobeSurfaceTile.js +14 -1
  141. package/Source/Scene/GlobeSurfaceTileProvider.js +232 -25
  142. package/Source/Scene/GltfLoader.js +56 -6
  143. package/Source/Scene/HeightReference.js +1 -1
  144. package/Source/Scene/MVTDataProvider.js +9 -0
  145. package/Source/Scene/Model/Model.js +242 -16
  146. package/Source/Scene/Model/Model3DTileContent.js +5 -0
  147. package/Source/Scene/Model/ModelClippingPolygonsPipelineStage.js +54 -19
  148. package/Source/Scene/Model/ModelRenderResources.js +2 -3
  149. package/Source/Scene/Model/ModelSceneGraph.js +10 -1
  150. package/Source/Scene/Model/ModelVectorLookupPipelineStage.js +205 -0
  151. package/Source/Scene/Model/PickingPipelineStage.js +4 -0
  152. package/Source/Scene/PostProcessStage.js +22 -3
  153. package/Source/Scene/Scene.js +56 -1
  154. package/Source/Scene/Snapping.js +57 -0
  155. package/Source/Scene/UrlTemplate3DTilesDataProvider.js +12 -1
  156. package/Source/Scene/VectorGltf3DTileContent.js +10 -2
  157. package/Source/Scene/WebMapServiceImageryProvider.js +5 -1
  158. package/Source/Scene/WebMapTileServiceImageryProvider.js +6 -1
  159. package/Source/Scene/renderBufferPolylineCollection.js +5 -1
  160. package/Source/Shaders/BufferPolylineMaterialVS.glsl +14 -2
  161. package/Source/Shaders/BufferPolylineMaterialVS.js +14 -2
  162. package/Source/Shaders/Builtin/CzmBuiltins.js +2 -4
  163. package/Source/Shaders/Builtin/Functions/eyeToCartographicDelta.glsl +74 -0
  164. package/Source/Shaders/Builtin/Functions/eyeToCartographicDelta.js +76 -0
  165. package/Source/Shaders/GlobeFS.glsl +10 -9
  166. package/Source/Shaders/GlobeFS.js +11 -9
  167. package/Source/Shaders/GlobeVS.glsl +0 -32
  168. package/Source/Shaders/GlobeVS.js +0 -32
  169. package/Source/Shaders/Model/ModelClippingPolygonsStageFS.glsl +15 -3
  170. package/Source/Shaders/Model/ModelClippingPolygonsStageFS.js +15 -3
  171. package/Source/Shaders/Model/ModelClippingPolygonsStageVS.glsl +20 -24
  172. package/Source/Shaders/Model/ModelClippingPolygonsStageVS.js +20 -24
  173. package/Source/Shaders/Model/ModelFS.glsl +4 -0
  174. package/Source/Shaders/Model/ModelFS.js +4 -0
  175. package/Source/Shaders/Model/ModelVS.glsl +7 -2
  176. package/Source/Shaders/Model/ModelVS.js +7 -2
  177. package/Source/Shaders/Model/ModelVectorLookupStageFS.glsl +6 -0
  178. package/Source/Shaders/Model/ModelVectorLookupStageFS.js +8 -0
  179. package/Source/Shaders/Model/ModelVectorLookupStageVS.glsl +15 -0
  180. package/Source/Shaders/Model/ModelVectorLookupStageVS.js +17 -0
  181. package/Source/Shaders/Model/VerticalExaggerationStageVS.glsl +9 -10
  182. package/Source/Shaders/Model/VerticalExaggerationStageVS.js +9 -11
  183. package/Source/Shaders/VectorCommon.glsl +177 -50
  184. package/Source/Shaders/VectorCommon.js +251 -19
  185. package/Source/ThirdParty/Workers/zip-web-worker.js +1 -1
  186. package/index.d.ts +556 -55
  187. package/index.js +20 -13
  188. package/package.json +6 -6
  189. package/Build/Workers/chunk-2EFYUSUY.js +0 -1483
  190. package/Build/Workers/chunk-2H5264K7.js +0 -1284
  191. package/Build/Workers/chunk-2H73KDBM.js +0 -511
  192. package/Build/Workers/chunk-2ZKH2QZB.js +0 -387
  193. package/Build/Workers/chunk-37SW7SYS.js +0 -778
  194. package/Build/Workers/chunk-3GHVJ3SO.js +0 -455
  195. package/Build/Workers/chunk-3LB4UVPU.js +0 -387
  196. package/Build/Workers/chunk-3PONLKEL.js +0 -778
  197. package/Build/Workers/chunk-3QR662HH.js +0 -3820
  198. package/Build/Workers/chunk-3SX2WYSO.js +0 -973
  199. package/Build/Workers/chunk-3UDN6LYX.js +0 -476
  200. package/Build/Workers/chunk-47MCBSXI.js +0 -9237
  201. package/Build/Workers/chunk-4E626OCE.js +0 -1067
  202. package/Build/Workers/chunk-4NW2MJKH.js +0 -455
  203. package/Build/Workers/chunk-52YK5BSN.js +0 -198
  204. package/Build/Workers/chunk-5RNAQZK6.js +0 -9234
  205. package/Build/Workers/chunk-6FHT43QR.js +0 -140
  206. package/Build/Workers/chunk-6HK6IXK2.js +0 -138
  207. package/Build/Workers/chunk-6R5X2GUA.js +0 -1284
  208. package/Build/Workers/chunk-6YR6JBMY.js +0 -163
  209. package/Build/Workers/chunk-7A2OGDHT.js +0 -305
  210. package/Build/Workers/chunk-7CGEQUM2.js +0 -305
  211. package/Build/Workers/chunk-7D2HZKH7.js +0 -455
  212. package/Build/Workers/chunk-7I325HV6.js +0 -1344
  213. package/Build/Workers/chunk-7KVKHY7O.js +0 -147
  214. package/Build/Workers/chunk-7TKLTCZW.js +0 -219
  215. package/Build/Workers/chunk-7UUKBDH6.js +0 -1054
  216. package/Build/Workers/chunk-7W6DUHAB.js +0 -693
  217. package/Build/Workers/chunk-7XM5JK5F.js +0 -162
  218. package/Build/Workers/chunk-7YG3ND3P.js +0 -454
  219. package/Build/Workers/chunk-A3O6EDBK.js +0 -73
  220. package/Build/Workers/chunk-A6X24AZI.js +0 -1992
  221. package/Build/Workers/chunk-A7TTWVTF.js +0 -2719
  222. package/Build/Workers/chunk-ACTVJHSP.js +0 -519
  223. package/Build/Workers/chunk-ADX3CBKD.js +0 -9234
  224. package/Build/Workers/chunk-AF7DTMJ7.js +0 -398
  225. package/Build/Workers/chunk-AJSFRY4U.js +0 -1344
  226. package/Build/Workers/chunk-ARZICEEP.js +0 -301
  227. package/Build/Workers/chunk-B4CQSLZJ.js +0 -305
  228. package/Build/Workers/chunk-BKPQFCXH.js +0 -511
  229. package/Build/Workers/chunk-BSPCI2LO.js +0 -959
  230. package/Build/Workers/chunk-BUJWSX5S.js +0 -301
  231. package/Build/Workers/chunk-C7JQVRLM.js +0 -497
  232. package/Build/Workers/chunk-C7QDUNI3.js +0 -138
  233. package/Build/Workers/chunk-CDJDJ5LK.js +0 -44
  234. package/Build/Workers/chunk-CEEZE3YZ.js +0 -476
  235. package/Build/Workers/chunk-CIV5DJOQ.js +0 -778
  236. package/Build/Workers/chunk-CLCTQVVL.js +0 -241
  237. package/Build/Workers/chunk-CQNFIAZU.js +0 -56
  238. package/Build/Workers/chunk-CUTRKXUQ.js +0 -288
  239. package/Build/Workers/chunk-DBD5WWG2.js +0 -959
  240. package/Build/Workers/chunk-DIGUUD6G.js +0 -171
  241. package/Build/Workers/chunk-DZBQUULR.js +0 -138
  242. package/Build/Workers/chunk-E2NKV5YT.js +0 -3820
  243. package/Build/Workers/chunk-E7NZJOK7.js +0 -3792
  244. package/Build/Workers/chunk-EB3Y5P3A.js +0 -368
  245. package/Build/Workers/chunk-EHTS2YPT.js +0 -2719
  246. package/Build/Workers/chunk-ELE6SC2C.js +0 -837
  247. package/Build/Workers/chunk-ENNFMWDW.js +0 -789
  248. package/Build/Workers/chunk-ERKUET22.js +0 -3201
  249. package/Build/Workers/chunk-F2IMBMZY.js +0 -241
  250. package/Build/Workers/chunk-F4CSNRZO.js +0 -219
  251. package/Build/Workers/chunk-FBP4DUQJ.js +0 -693
  252. package/Build/Workers/chunk-FDK4K5IA.js +0 -280
  253. package/Build/Workers/chunk-FGQFQHN5.js +0 -1054
  254. package/Build/Workers/chunk-FJWZMGOQ.js +0 -1992
  255. package/Build/Workers/chunk-FQ42MT7M.js +0 -58
  256. package/Build/Workers/chunk-GGNWQWSB.js +0 -301
  257. package/Build/Workers/chunk-GNKXEN4C.js +0 -682
  258. package/Build/Workers/chunk-GSWMAFTE.js +0 -9230
  259. package/Build/Workers/chunk-GXDHRC4J.js +0 -1344
  260. package/Build/Workers/chunk-GYSYP6PC.js +0 -1067
  261. package/Build/Workers/chunk-H2WCFXLP.js +0 -241
  262. package/Build/Workers/chunk-HHV3MCGV.js +0 -162
  263. package/Build/Workers/chunk-HLW2ZRVK.js +0 -368
  264. package/Build/Workers/chunk-HS6AD4P2.js +0 -398
  265. package/Build/Workers/chunk-HT6FASOT.js +0 -973
  266. package/Build/Workers/chunk-IDVHUDZT.js +0 -352
  267. package/Build/Workers/chunk-IGAZBTFZ.js +0 -3201
  268. package/Build/Workers/chunk-IOO7Z2AV.js +0 -57
  269. package/Build/Workers/chunk-IUIFLOYO.js +0 -44
  270. package/Build/Workers/chunk-JALGQYDY.js +0 -288
  271. package/Build/Workers/chunk-JW6OZT4R.js +0 -288
  272. package/Build/Workers/chunk-JXYLJCTC.js +0 -124
  273. package/Build/Workers/chunk-K27QOAW6.js +0 -97
  274. package/Build/Workers/chunk-KMV25A63.js +0 -789
  275. package/Build/Workers/chunk-KZWFWJML.js +0 -2719
  276. package/Build/Workers/chunk-LCXRRALY.js +0 -387
  277. package/Build/Workers/chunk-LD64RPYV.js +0 -368
  278. package/Build/Workers/chunk-LGNDTZVX.js +0 -97
  279. package/Build/Workers/chunk-LNSQVXFH.js +0 -1800
  280. package/Build/Workers/chunk-M4JZ6TSZ.js +0 -959
  281. package/Build/Workers/chunk-MCJDRDJQ.js +0 -102
  282. package/Build/Workers/chunk-MEENMEAH.js +0 -198
  283. package/Build/Workers/chunk-NAWU5RF4.js +0 -162
  284. package/Build/Workers/chunk-NIWITKQK.js +0 -693
  285. package/Build/Workers/chunk-OA6MYL2C.js +0 -837
  286. package/Build/Workers/chunk-OBEU25PI.js +0 -1067
  287. package/Build/Workers/chunk-OHP4ELS7.js +0 -198
  288. package/Build/Workers/chunk-PCL3Y7H5.js +0 -82
  289. package/Build/Workers/chunk-PD4GK4EM.js +0 -57
  290. package/Build/Workers/chunk-PEDU33QG.js +0 -2342
  291. package/Build/Workers/chunk-PVTSNNVI.js +0 -288
  292. package/Build/Workers/chunk-QHPZH22L.js +0 -241
  293. package/Build/Workers/chunk-QIZDWZK6.js +0 -301
  294. package/Build/Workers/chunk-QV6DG2YX.js +0 -1483
  295. package/Build/Workers/chunk-QVLAFFJY.js +0 -56
  296. package/Build/Workers/chunk-R4FPNAZ2.js +0 -352
  297. package/Build/Workers/chunk-R4K7EHOU.js +0 -171
  298. package/Build/Workers/chunk-R7JGHDD6.js +0 -789
  299. package/Build/Workers/chunk-RASQEYD4.js +0 -1483
  300. package/Build/Workers/chunk-RG4F5R57.js +0 -454
  301. package/Build/Workers/chunk-RW6ITX7Q.js +0 -3820
  302. package/Build/Workers/chunk-RYSQVJR6.js +0 -398
  303. package/Build/Workers/chunk-S6RJU5NM.js +0 -1054
  304. package/Build/Workers/chunk-SDFHDNS4.js +0 -147
  305. package/Build/Workers/chunk-SF6K72D7.js +0 -124
  306. package/Build/Workers/chunk-SGRGNDOD.js +0 -682
  307. package/Build/Workers/chunk-SM2CDCYF.js +0 -198
  308. package/Build/Workers/chunk-SS5ABQGY.js +0 -102
  309. package/Build/Workers/chunk-T5QBPLE3.js +0 -414
  310. package/Build/Workers/chunk-TN35HP5B.js +0 -1067
  311. package/Build/Workers/chunk-TNWKJNUZ.js +0 -454
  312. package/Build/Workers/chunk-TOAF47AQ.js +0 -102
  313. package/Build/Workers/chunk-TQ4QCOXT.js +0 -2719
  314. package/Build/Workers/chunk-TSDSILQB.js +0 -124
  315. package/Build/Workers/chunk-TVZD72WJ.js +0 -778
  316. package/Build/Workers/chunk-U5LV3F3Z.js +0 -1054
  317. package/Build/Workers/chunk-UEY73NRN.js +0 -38
  318. package/Build/Workers/chunk-UF46SZEZ.js +0 -789
  319. package/Build/Workers/chunk-UNRTMCET.js +0 -398
  320. package/Build/Workers/chunk-UTB7U3O6.js +0 -1992
  321. package/Build/Workers/chunk-UVO6COT2.js +0 -352
  322. package/Build/Workers/chunk-V46YGZE6.js +0 -352
  323. package/Build/Workers/chunk-VAL7DYNR.js +0 -278
  324. package/Build/Workers/chunk-VDGOCROW.js +0 -57
  325. package/Build/Workers/chunk-VFWSSBPT.js +0 -511
  326. package/Build/Workers/chunk-VVYMXI3I.js +0 -1284
  327. package/Build/Workers/chunk-VXWHPYQM.js +0 -837
  328. package/Build/Workers/chunk-VXYUBRSB.js +0 -219
  329. package/Build/Workers/chunk-VZLDLEWI.js +0 -387
  330. package/Build/Workers/chunk-W5OCKMPJ.js +0 -101
  331. package/Build/Workers/chunk-WBSY7HDY.js +0 -837
  332. package/Build/Workers/chunk-WN3F4CVG.js +0 -3201
  333. package/Build/Workers/chunk-WPRUWXGV.js +0 -693
  334. package/Build/Workers/chunk-WTO2ERBP.js +0 -414
  335. package/Build/Workers/chunk-WVHMDVG4.js +0 -959
  336. package/Build/Workers/chunk-XGA23TAX.js +0 -73
  337. package/Build/Workers/chunk-XLXSDIP5.js +0 -973
  338. package/Build/Workers/chunk-XQ3SKCMM.js +0 -140
  339. package/Build/Workers/chunk-XQH66YJC.js +0 -147
  340. package/Build/Workers/chunk-XTA7BXJG.js +0 -682
  341. package/Build/Workers/chunk-XTIDAFRS.js +0 -476
  342. package/Build/Workers/chunk-XUEDWBUD.js +0 -682
  343. package/Build/Workers/chunk-XYFLRH3H.js +0 -124
  344. package/Build/Workers/chunk-Y7JRTRTO.js +0 -305
  345. package/Build/Workers/chunk-Y7QSMDCJ.js +0 -352
  346. package/Build/Workers/chunk-YCB5TYTR.js +0 -1483
  347. package/Build/Workers/chunk-YEYOSTJX.js +0 -219
  348. package/Build/Workers/chunk-YGFVAGYF.js +0 -630
  349. package/Build/Workers/chunk-YIIACKQO.js +0 -368
  350. package/Build/Workers/chunk-YJGSP6PE.js +0 -511
  351. package/Build/Workers/chunk-YKU2Q3A2.js +0 -1287
  352. package/Build/Workers/chunk-Z4LR5EHE.js +0 -454
  353. package/Build/Workers/chunk-Z66EVE2A.js +0 -44
  354. package/Build/Workers/chunk-ZHIHHHTB.js +0 -414
  355. package/Build/Workers/chunk-ZMBHFYOX.js +0 -1344
  356. package/Build/Workers/chunk-ZNWHFSLE.js +0 -171
  357. package/Build/Workers/chunk-ZQLZG4IN.js +0 -2342
  358. package/Build/Workers/chunk-ZRTSMUZ2.js +0 -414
  359. package/Build/Workers/chunk-ZSGUV73H.js +0 -2342
  360. package/Build/Workers/chunk-ZZUVT5BM.js +0 -476
  361. package/Source/Shaders/Builtin/Functions/clipPolygons.glsl +0 -37
  362. package/Source/Shaders/Builtin/Functions/clipPolygons.js +0 -39
  363. package/Source/Shaders/Builtin/Functions/unpackClippingExtents.glsl +0 -14
  364. package/Source/Shaders/Builtin/Functions/unpackClippingExtents.js +0 -15
  365. package/Source/Shaders/PolygonSignedDistanceFS.glsl +0 -131
  366. package/Source/Shaders/PolygonSignedDistanceFS.js +0 -132
@@ -0,0 +1,205 @@
1
+ // @ts-check
2
+
3
+ import Cartesian2 from "../../Core/Cartesian2.js";
4
+ import combine from "../../Core/combine.js";
5
+ import CesiumMath from "../../Core/Math.js";
6
+ import ShaderDestination from "../../Renderer/ShaderDestination.js";
7
+ import VectorCommon from "../../Shaders/VectorCommon.js";
8
+ import ModelVectorLookupStageVS from "../../Shaders/Model/ModelVectorLookupStageVS.js";
9
+ import ModelVectorLookupStageFS from "../../Shaders/Model/ModelVectorLookupStageFS.js";
10
+
11
+ /** @import FrameState from "../FrameState.js"; */
12
+ /** @import Model from "./Model.js"; */
13
+ /** @import ModelRenderResources from "./ModelRenderResources.js"; */
14
+
15
+ /**
16
+ * The model vector lookup stage drapes vector data, baked into
17
+ * per-content lookup textures by the scene's VectorProvider, onto the model's
18
+ * surface.
19
+ *
20
+ * @namespace ModelVectorLookupPipelineStage
21
+ *
22
+ * @private
23
+ */
24
+ const ModelVectorLookupPipelineStage = {
25
+ name: "ModelVectorLookupPipelineStage", // Helps with debugging
26
+ process: process,
27
+ };
28
+
29
+ const scratchCameraUv = new Cartesian2();
30
+ const scratchRectangleInverseSize = new Cartesian2();
31
+
32
+ /**
33
+ * Processes a model with baked vector lookup data. This modifies the
34
+ * following parts of the render resources:
35
+ *
36
+ * <ul>
37
+ * <li>adds the HAS_VECTOR_LOOKUP define to both shaders</li>
38
+ * <li>adds a vertex shader function computing the vertex's UV within the baked rectangle</li>
39
+ * <li>adds the shared vector lookup functions and a compositing function to the fragment shader</li>
40
+ * <li>adds the uniforms for the baked rectangle and the lookup textures</li>
41
+ * </ul>
42
+ *
43
+ * @param {ModelRenderResources} renderResources The render resources for this model.
44
+ * @param {Model} model The model.
45
+ * @param {FrameState} frameState The frameState.
46
+ *
47
+ * @private
48
+ */
49
+ function process(renderResources, model, frameState) {
50
+ const shaderBuilder = renderResources.shaderBuilder;
51
+ const vectorData = model._vectorData;
52
+ const hasPolylines = vectorData.hasPolylines;
53
+ const hasPolygons = vectorData.hasPolygons;
54
+
55
+ shaderBuilder.addDefine(
56
+ "HAS_VECTOR_LOOKUP",
57
+ undefined,
58
+ ShaderDestination.BOTH,
59
+ );
60
+
61
+ if (hasPolylines) {
62
+ shaderBuilder.addDefine(
63
+ "HAS_VECTOR_POLYLINES",
64
+ undefined,
65
+ ShaderDestination.FRAGMENT,
66
+ );
67
+
68
+ if (vectorData.hasMeterWidths) {
69
+ shaderBuilder.addDefine(
70
+ "VECTOR_WIDTH_IN_METERS",
71
+ undefined,
72
+ ShaderDestination.FRAGMENT,
73
+ );
74
+ if (vectorData.hasPixelWidths) {
75
+ shaderBuilder.addDefine(
76
+ "VECTOR_WIDTH_MIXED_UNITS",
77
+ undefined,
78
+ ShaderDestination.FRAGMENT,
79
+ );
80
+ }
81
+ shaderBuilder.addUniform(
82
+ "vec2",
83
+ "u_vectorMetersPerUv",
84
+ ShaderDestination.FRAGMENT,
85
+ );
86
+ }
87
+ }
88
+
89
+ if (hasPolygons) {
90
+ shaderBuilder.addDefine(
91
+ "HAS_VECTOR_POLYGONS",
92
+ undefined,
93
+ ShaderDestination.FRAGMENT,
94
+ );
95
+ }
96
+
97
+ shaderBuilder.addUniform(
98
+ "vec2",
99
+ "u_vectorCameraUv",
100
+ ShaderDestination.VERTEX,
101
+ );
102
+ shaderBuilder.addUniform(
103
+ "vec2",
104
+ "u_vectorRectangleInverseSize",
105
+ ShaderDestination.VERTEX,
106
+ );
107
+
108
+ shaderBuilder.addVarying("vec2", "v_vectorUv");
109
+ shaderBuilder.addVertexLines(ModelVectorLookupStageVS);
110
+ // VectorCommon declares the lookup texture uniforms and sampling functions
111
+ // shared with the terrain path.
112
+ shaderBuilder.addFragmentLines(VectorCommon);
113
+ shaderBuilder.addFragmentLines(ModelVectorLookupStageFS);
114
+
115
+ // A re-bake replaces _vectorData, and its rectangle, without rebuilding draw
116
+ // commands, so the callbacks read the rectangle per call.
117
+ const buildRectangle = vectorData.rectangle;
118
+
119
+ const defaultTexture = function () {
120
+ return frameState.context.defaultTexture;
121
+ };
122
+
123
+ /** @type {Object<string, Function>} */
124
+ const uniformMap = {
125
+ // The UV coordinates of the camera within the baked rectangle.
126
+ u_vectorCameraUv: function () {
127
+ const rectangle = model._vectorData?.rectangle ?? buildRectangle;
128
+ const carto = frameState.camera.positionCartographic;
129
+
130
+ const halfWidth = rectangle.width * 0.5;
131
+ const centerLongitude = rectangle.west + halfWidth;
132
+ const longitudeOffset =
133
+ CesiumMath.negativePiToPi(carto.longitude - centerLongitude) +
134
+ halfWidth;
135
+ return Cartesian2.fromElements(
136
+ longitudeOffset / rectangle.width,
137
+ (carto.latitude - rectangle.south) / rectangle.height,
138
+ scratchCameraUv,
139
+ );
140
+ },
141
+ u_vectorRectangleInverseSize: function () {
142
+ const rectangle = model._vectorData?.rectangle ?? buildRectangle;
143
+ return Cartesian2.fromElements(
144
+ 1.0 / rectangle.width,
145
+ 1.0 / rectangle.height,
146
+ scratchRectangleInverseSize,
147
+ );
148
+ },
149
+ u_vectorColorTexture: function () {
150
+ return model._vectorData?.colorTexture ?? defaultTexture();
151
+ },
152
+ u_vectorPickColorTexture: function () {
153
+ return model._vectorData?.pickColorTexture ?? defaultTexture();
154
+ },
155
+ };
156
+
157
+ if (hasPolylines) {
158
+ uniformMap.u_vectorSegmentTexture = function () {
159
+ return model._vectorData?.polylineSegmentTexture ?? defaultTexture();
160
+ };
161
+ uniformMap.u_vectorWidthTexture = function () {
162
+ return model._vectorData?.widthTexture ?? defaultTexture();
163
+ };
164
+ uniformMap.u_vectorSegmentPrimitiveIndicesTexture = function () {
165
+ return (
166
+ model._vectorData?.polylineSegmentPrimitiveIndicesTexture ??
167
+ defaultTexture()
168
+ );
169
+ };
170
+ uniformMap.u_vectorGridCellIndicesTexture = function () {
171
+ return (
172
+ model._vectorData?.polylineGridCellIndicesTexture ?? defaultTexture()
173
+ );
174
+ };
175
+
176
+ if (vectorData.hasMeterWidths) {
177
+ uniformMap.u_vectorMetersPerUv = function () {
178
+ return model._vectorData.metersPerUv;
179
+ };
180
+ }
181
+ }
182
+
183
+ if (hasPolygons) {
184
+ uniformMap.u_vectorPolygonEdgeTexture = function () {
185
+ return model._vectorData?.polygonEdgeTexture ?? defaultTexture();
186
+ };
187
+ uniformMap.u_vectorPolygonEdgePrimitiveIndicesTexture = function () {
188
+ return (
189
+ model._vectorData?.polygonEdgePrimitiveIndicesTexture ??
190
+ defaultTexture()
191
+ );
192
+ };
193
+ uniformMap.u_vectorPolygonGridCellIndicesTexture = function () {
194
+ return (
195
+ model._vectorData?.polygonGridCellIndicesTexture ?? defaultTexture()
196
+ );
197
+ };
198
+ }
199
+
200
+ renderResources.uniformMap = /** @type {Object<string, Function>} */ (
201
+ combine(uniformMap, renderResources.uniformMap)
202
+ );
203
+ }
204
+
205
+ export default ModelVectorLookupPipelineStage;
@@ -93,6 +93,10 @@ PickingPipelineStage.process = function (
93
93
  renderResources.pickId = "czm_pickColor";
94
94
  renderResources.snapId = snapIdFromPickId(renderResources.pickId);
95
95
  }
96
+
97
+ if (!defined(model.classificationType) && model.hasDrapedVectors()) {
98
+ renderResources.pickId = `vectorPickColorOver(${renderResources.pickId})`;
99
+ }
96
100
  };
97
101
 
98
102
  /**
@@ -7,8 +7,10 @@ import Frozen from "../Core/Frozen.js";
7
7
  import defined from "../Core/defined.js";
8
8
  import destroyObject from "../Core/destroyObject.js";
9
9
  import DeveloperError from "../Core/DeveloperError.js";
10
+ import oneTimeWarning from "../Core/oneTimeWarning.js";
10
11
  import PixelFormat from "../Core/PixelFormat.js";
11
12
  import Resource from "../Core/Resource.js";
13
+ import ContextLimits from "../Renderer/ContextLimits.js";
12
14
  import PassState from "../Renderer/PassState.js";
13
15
  import PixelDatatype from "../Renderer/PixelDatatype.js";
14
16
  import RenderState from "../Renderer/RenderState.js";
@@ -796,6 +798,19 @@ function createSelectedTexture(stage, context) {
796
798
  }
797
799
  }
798
800
 
801
+ // The selected ids are stored in a texture that is one texel per id, so the
802
+ // number of ids cannot exceed the maximum texture width supported by the
803
+ // hardware. Clamp instead of throwing so that a very large selection
804
+ // degrades gracefully (ids beyond the limit are not highlighted).
805
+ const maximumTextureSize = ContextLimits.maximumTextureSize;
806
+ if (textureLength > maximumTextureSize) {
807
+ PostProcessStage._oneTimeWarning(
808
+ "postProcessStageSelectedTextureSize",
809
+ `The number of selected feature ids (${textureLength}) exceeds the maximum texture size (${maximumTextureSize}). Features beyond the limit will not have the post-process effect applied.`,
810
+ );
811
+ textureLength = maximumTextureSize;
812
+ }
813
+
799
814
  if (features.length === 0 || textureLength === 0) {
800
815
  // max pick id is reserved
801
816
  const empty = new Uint8Array([255, 255, 255, 255]);
@@ -814,13 +829,14 @@ function createSelectedTexture(stage, context) {
814
829
  }
815
830
 
816
831
  let offset = 0;
817
- const ids = new Uint8Array(textureLength * 4);
818
- for (let i = 0; i < features.length; ++i) {
832
+ const idByteLength = textureLength * 4;
833
+ const ids = new Uint8Array(idByteLength);
834
+ for (let i = 0; i < features.length && offset < idByteLength; ++i) {
819
835
  const feature = features[i];
820
836
  if (defined(feature.pickIds)) {
821
837
  const pickIds = feature.pickIds;
822
838
  const pickIdsLength = pickIds.length;
823
- for (let j = 0; j < pickIdsLength; ++j) {
839
+ for (let j = 0; j < pickIdsLength && offset < idByteLength; ++j) {
824
840
  const pickColor = pickIds[j].color;
825
841
  ids[offset] = Color.floatToByte(pickColor.red);
826
842
  ids[offset + 1] = Color.floatToByte(pickColor.green);
@@ -999,4 +1015,7 @@ PostProcessStage.prototype.destroy = function () {
999
1015
  releaseResources(this);
1000
1016
  return destroyObject(this);
1001
1017
  };
1018
+
1019
+ // Exposed for testing
1020
+ PostProcessStage._oneTimeWarning = oneTimeWarning;
1002
1021
  export default PostProcessStage;
@@ -19,7 +19,7 @@ import Event from "../Core/Event.js";
19
19
  import GeographicProjection from "../Core/GeographicProjection.js";
20
20
  import GeometryInstance from "../Core/GeometryInstance.js";
21
21
  import GeometryPipeline from "../Core/GeometryPipeline.js";
22
- import HeightReference from "./HeightReference.js";
22
+ import HeightReference, { isHeightReferenceClamp } from "./HeightReference.js";
23
23
  import Intersect from "../Core/Intersect.js";
24
24
  import JulianDate from "../Core/JulianDate.js";
25
25
  import CesiumMath from "../Core/Math.js";
@@ -34,6 +34,7 @@ import Rectangle from "../Core/Rectangle.js";
34
34
  import RequestScheduler from "../Core/RequestScheduler.js";
35
35
  import TaskProcessor from "../Core/TaskProcessor.js";
36
36
  import Transforms from "../Core/Transforms.js";
37
+ import VectorProvider from "../Core/VectorProvider.js";
37
38
  import ClearCommand from "../Renderer/ClearCommand.js";
38
39
  import ComputeEngine from "../Renderer/ComputeEngine.js";
39
40
  import Context from "../Renderer/Context.js";
@@ -84,6 +85,7 @@ import getMetadataClassProperty from "./getMetadataClassProperty.js";
84
85
  import PickedMetadataInfo from "./PickedMetadataInfo.js";
85
86
  import getMetadataProperty from "./getMetadataProperty.js";
86
87
 
88
+ /** @ignore */
87
89
  const requestRenderAfterFrame = function (scene) {
88
90
  return function () {
89
91
  scene.frameState.afterRender.push(function () {
@@ -3659,6 +3661,56 @@ function executeCommandsInViewport(firstViewport, scene, passState) {
3659
3661
 
3660
3662
  const scratchCullingVolume = new CullingVolume();
3661
3663
 
3664
+ /**
3665
+ * Marks every drapeable collection in the subtree so the vector provider bakes it this frame
3666
+ *
3667
+ * @param {PrimitiveCollection} collection
3668
+ * @param {VectorProvider} vectorProvider
3669
+ * @param {number} frameNumber
3670
+ * @private
3671
+ */
3672
+ function markVectorCollections(collection, vectorProvider, frameNumber) {
3673
+ if (!collection.show) {
3674
+ return;
3675
+ }
3676
+
3677
+ const length = collection.length;
3678
+ for (let i = 0; i < length; ++i) {
3679
+ const primitive = collection.get(i);
3680
+ if (primitive instanceof PrimitiveCollection) {
3681
+ markVectorCollections(primitive, vectorProvider, frameNumber);
3682
+ continue;
3683
+ }
3684
+
3685
+ if (
3686
+ primitive.show &&
3687
+ VectorProvider.isSupported(primitive) &&
3688
+ isHeightReferenceClamp(primitive.heightReference)
3689
+ ) {
3690
+ vectorProvider.markForFrame(
3691
+ primitive,
3692
+ frameNumber,
3693
+ primitive.heightReference,
3694
+ );
3695
+ }
3696
+ }
3697
+ }
3698
+
3699
+ /**
3700
+ * @param {Scene} scene
3701
+ * @param {FrameState} frameState
3702
+ * @private
3703
+ */
3704
+ function updateVectorProvider(scene, frameState) {
3705
+ const vectorProvider = scene.vectorProvider;
3706
+ if (!defined(vectorProvider)) {
3707
+ return;
3708
+ }
3709
+
3710
+ const frameNumber = frameState.frameNumber;
3711
+ markVectorCollections(scene._primitives, vectorProvider, frameNumber);
3712
+ }
3713
+
3662
3714
  /**
3663
3715
  * @private
3664
3716
  */
@@ -3793,6 +3845,8 @@ Scene.prototype.updateEnvironment = function () {
3793
3845
  if (defined(this._specularEnvironmentCubeMap)) {
3794
3846
  this._specularEnvironmentCubeMap.update(frameState);
3795
3847
  }
3848
+
3849
+ updateVectorProvider(this, frameState);
3796
3850
  };
3797
3851
 
3798
3852
  function updateDebugFrustumPlanes(scene) {
@@ -4724,6 +4778,7 @@ Scene.prototype.pick = function (windowPosition, width, height) {
4724
4778
  * @typedef {object} SceneSnapResult
4725
4779
  * @property {object} object The snapped primitive or feature.
4726
4780
  * @property {Cartesian3} position The world-space position of the snap point, un-projected from the snap framebuffer's eye-space depth.
4781
+ * @property {Cartesian3|undefined} surfacePosition The world-space position of the same object's surface fragment nearest the snap point. For a surface snap this equals <code>position</code>; for an edge snap it is a point on a face of the object rather than on its silhouette, or <code>undefined</code> if no surface fragment of the object is visible in the search region.
4727
4782
  * @property {Cartesian2} screenPosition The window coordinates of the snap point.
4728
4783
  * @property {boolean} isEdge <code>true</code> if the snap point lies on an edge; <code>false</code> if it lies on a surface.
4729
4784
  *
@@ -35,6 +35,7 @@ const Snapping = {};
35
35
 
36
36
  const scratchRectangle = new BoundingRectangle(0.0, 0.0, 3.0, 3.0);
37
37
  const scratchSnapCoord = new Cartesian2();
38
+ const scratchSurfaceCoord = new Cartesian2();
38
39
  const scratchSnapRay = new Ray();
39
40
  const scratchSnapOffset = new Cartesian3();
40
41
 
@@ -48,6 +49,13 @@ const SNAP_OCCLUDER_RADIUS_PIXELS = 3.0;
48
49
  // object the cursor is on.
49
50
  const SNAP_OCCLUSION_TOLERANCE = 0.1;
50
51
 
52
+ // Width of the region, centered on a winning edge hit, read to find the
53
+ // adjacent surface fragment for surfacePosition. Deliberately centered on the
54
+ // edge hit rather than the cursor: the cursor-centered snap region can clip
55
+ // away the object's surface, potentially causing the server-side backend to
56
+ // give a mismatched snap.
57
+ const SNAP_SURFACE_REGION_WIDTH = 9.0;
58
+
51
59
  function cursorDist(hit) {
52
60
  return Math.sqrt(hit.x * hit.x + hit.y * hit.y);
53
61
  }
@@ -76,6 +84,25 @@ function selectBestHit(hits) {
76
84
  );
77
85
  }
78
86
 
87
+ // Find the surface hit belonging to the same object that lies closest to the
88
+ // region center, if any. Unlike an edge hit, whose position lies exactly on
89
+ // the object's silhouette, this point is unambiguously on the object.
90
+ function nearestSurfaceHit(hits, object) {
91
+ let best;
92
+ let bestDist = Number.POSITIVE_INFINITY;
93
+ for (const hit of hits) {
94
+ if (hit.isEdge || hit.object !== object) {
95
+ continue;
96
+ }
97
+ const dist = hit.x * hit.x + hit.y * hit.y;
98
+ if (dist < bestDist) {
99
+ best = hit;
100
+ bestDist = dist;
101
+ }
102
+ }
103
+ return best;
104
+ }
105
+
79
106
  // Unproject a snap hit's eye-space depth (channel B of the snap framebuffer,
80
107
  // written by the snap shader at the edge fragment itself) into a world
81
108
  // position.
@@ -166,10 +193,39 @@ Snapping.snap = function (scene, windowPosition, options) {
166
193
  return undefined;
167
194
  }
168
195
 
196
+ // For edge hits, also unproject the nearest same-object surface fragment so
197
+ // consumers have a seed point that is on the object but off its silhouette.
198
+ // Found with a read centered on the edge hit itself, so the seed does not
199
+ // depend on where in the snap region the cursor was.
200
+ let surfacePosition = position;
201
+ if (best.isEdge) {
202
+ const surfaceOrigin = scratchSurfaceCoord;
203
+ surfaceOrigin.x = windowPosition.x + best.x;
204
+ surfaceOrigin.y = windowPosition.y + best.y;
205
+ pickBegin(
206
+ scene,
207
+ surfaceOrigin,
208
+ drawingBufferRectangle,
209
+ SNAP_SURFACE_REGION_WIDTH,
210
+ SNAP_SURFACE_REGION_WIDTH,
211
+ {
212
+ framebuffer: snapFramebuffer,
213
+ snap: true,
214
+ },
215
+ );
216
+ const surfaceHits = snapFramebuffer.end(drawingBufferRectangle);
217
+ pickEnd(scene);
218
+ const surfaceHit = nearestSurfaceHit(surfaceHits, best.object);
219
+ surfacePosition = defined(surfaceHit)
220
+ ? snapHitToWorld(scene, surfaceOrigin, surfaceHit)
221
+ : undefined;
222
+ }
223
+
169
224
  return {
170
225
  object: best.object,
171
226
  isEdge: best.isEdge,
172
227
  position: position,
228
+ surfacePosition: surfacePosition,
173
229
  screenPosition: new Cartesian2(
174
230
  windowPosition.x + best.x,
175
231
  windowPosition.y + best.y,
@@ -179,6 +235,7 @@ Snapping.snap = function (scene, windowPosition, options) {
179
235
 
180
236
  // Exposed for testing.
181
237
  Snapping._selectBestHit = selectBestHit;
238
+ Snapping._nearestSurfaceHit = nearestSurfaceHit;
182
239
  Snapping._snapHitToWorld = snapHitToWorld;
183
240
 
184
241
  export default Snapping;
@@ -13,7 +13,9 @@ import destroyObject from "../Core/destroyObject.js";
13
13
  import CesiumMath from "../Core/Math.js";
14
14
 
15
15
  /** @import FrameState from "./FrameState.js"; */
16
+ /** @import HeightReference from "./HeightReference.js"; */
16
17
  /** @import PassState from "../Renderer/PassState.js"; */
18
+ /** @import Scene from "./Scene.js"; */
17
19
  /** @import TilingScheme from "../Core/TilingScheme.js"; */
18
20
 
19
21
  /**
@@ -51,6 +53,10 @@ class UrlTemplate3DTilesDataProvider {
51
53
  * @param {number} [options.maxZoom=14] Maximum zoom level represented in the generated tileset.
52
54
  * @param {Rectangle} [options.extent] Optional geographic extent in radians to constrain the generated tile tree.
53
55
  * @param {string} [options.featureIdProperty] Feature property name to use as feature ID when supported by content decoding.
56
+ * @param {HeightReference} [options.heightReference] Drapes the vector content onto the surfaces selected by the
57
+ * value. Requires <code>options.scene</code>.
58
+ * @param {Scene} [options.scene] The scene the generated tileset is rendered in, required when
59
+ * <code>options.heightReference</code> is a clamping value.
54
60
  */
55
61
  constructor(urlTemplate, options) {
56
62
  options = options ?? {};
@@ -61,6 +67,8 @@ class UrlTemplate3DTilesDataProvider {
61
67
  this._minZoom = options.minZoom ?? DEFAULT_MIN_ZOOM;
62
68
  this._maxZoom = options.maxZoom ?? DEFAULT_MAX_ZOOM;
63
69
  this._featureIdProperty = options.featureIdProperty;
70
+ this._heightReference = options.heightReference;
71
+ this._scene = options.scene;
64
72
  this._show = true;
65
73
  this._tileset = undefined;
66
74
  this._tilesetJsonUrl = undefined;
@@ -149,7 +157,10 @@ class UrlTemplate3DTilesDataProvider {
149
157
  * @returns {object}
150
158
  */
151
159
  _createTilesetLoadOptions() {
152
- return {};
160
+ return {
161
+ heightReference: this._heightReference,
162
+ scene: this._scene,
163
+ };
153
164
  }
154
165
 
155
166
  /**
@@ -14,6 +14,7 @@ import Matrix4 from "../Core/Matrix4.js";
14
14
  import Model from "./Model/Model.js";
15
15
  import ModelUtility from "./Model/ModelUtility.js";
16
16
  import Pass from "../Renderer/Pass.js";
17
+ import VectorProvider from "../Core/VectorProvider.js";
17
18
  import createVectorTileBuffersFromModelComponents from "./Model/createVectorTileBuffersFromModelComponents.js";
18
19
  import defined from "../Core/defined.js";
19
20
  import destroyObject from "../Core/destroyObject.js";
@@ -354,10 +355,17 @@ class VectorGltf3DTileContent {
354
355
  collection.modelMatrix,
355
356
  );
356
357
 
357
- if (!isHeightReferenceClamp(tileset._heightReference)) {
358
+ if (
359
+ !isHeightReferenceClamp(tileset._heightReference) ||
360
+ !VectorProvider.isSupported(collection)
361
+ ) {
358
362
  collection.update(frameState);
359
363
  } else if (isSelected) {
360
- vectorProvider.markSelected(collection, frameState.frameNumber);
364
+ vectorProvider.markForFrame(
365
+ collection,
366
+ frameState.frameNumber,
367
+ tileset._heightReference,
368
+ );
361
369
  }
362
370
  }
363
371
  }
@@ -48,7 +48,10 @@ const excludesReverseAxis = [
48
48
  * @property {object} [getFeatureInfoParameters=WebMapServiceImageryProvider.GetFeatureInfoDefaultParameters] Additional parameters to pass to the WMS server in the GetFeatureInfo URL.
49
49
  * @property {Resource|string} [getFeatureInfoUrl] The getFeatureInfo URL of the WMS service. If the property is not defined then we use the property value of url.
50
50
  * @property {GetFeatureInfoFormat[]} [getFeatureInfoFormats=WebMapServiceImageryProvider.DefaultGetFeatureInfoFormats] The formats
51
- * in which to try WMS GetFeatureInfo requests.
51
+ * in which to try WMS GetFeatureInfo requests. Since feature info responses vary across WMS services,
52
+ * you may need to supply a custom format and parsing callback; see the
53
+ * {@link https://sandcastle.cesium.com/?id=web-map-tile-service-picking|Sandcastle example} for a complete
54
+ * example of writing your own callback.
52
55
  * @property {Rectangle} [rectangle=Rectangle.MAX_VALUE] The rectangle of the layer.
53
56
  * @property {TilingScheme} [tilingScheme=new GeographicTilingScheme()] The tiling scheme to use to divide the world into tiles.
54
57
  * @property {Ellipsoid} [ellipsoid] The ellipsoid. If the tilingScheme is specified,
@@ -90,6 +93,7 @@ const excludesReverseAxis = [
90
93
  *
91
94
  * @see {@link https://enterprise.arcgis.com/en/server/latest/publish-services/linux/wms-services.htm|ArcGIS Server WMS Services}
92
95
  * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
96
+ * @see {@link https://sandcastle.cesium.com/?id=web-map-tile-service-picking|Custom GetFeatureInfo Sandcastle Example}
93
97
  *
94
98
  * @example
95
99
  * // WMS servers operated by the US government https://apps.nationalmap.gov/services/
@@ -29,7 +29,10 @@ import GetFeatureInfoFormat from "./GetFeatureInfoFormat.js";
29
29
  * @property {object} [getFeatureInfoParameters] Additional parameters to include in GetFeatureInfo requests. Keys are lowercased internally.
30
30
  * @property {Resource|string} [getFeatureInfoUrl] The GetFeatureInfo URL of the WMTS service. If not specified, the value of <code>url</code> is used.
31
31
  * @property {GetFeatureInfoFormat[]} [getFeatureInfoFormats=WebMapTileServiceImageryProvider.DefaultGetFeatureInfoFormats] The formats
32
- * in which to try WMTS GetFeatureInfo requests.
32
+ * in which to try WMTS GetFeatureInfo requests. Since feature info responses vary across WMTS services,
33
+ * you may need to supply a custom format and parsing callback; see the
34
+ * {@link https://sandcastle.cesium.com/?id=web-map-tile-service-picking|Sandcastle example} for a complete
35
+ * example of writing your own callback.
33
36
  * @property {Rectangle} [rectangle=Rectangle.MAX_VALUE] The rectangle covered by the layer.
34
37
  * @property {TilingScheme} [tilingScheme] The tiling scheme corresponding to the organization of the tiles in the TileMatrixSet.
35
38
  * @property {Ellipsoid} [ellipsoid] The ellipsoid. If not specified, the WGS84 ellipsoid is used.
@@ -176,6 +179,8 @@ import GetFeatureInfoFormat from "./GetFeatureInfoFormat.js";
176
179
  * @see TileMapServiceImageryProvider
177
180
  * @see WebMapServiceImageryProvider
178
181
  * @see UrlTemplateImageryProvider
182
+ *
183
+ * @see {@link https://sandcastle.cesium.com/?id=web-map-tile-service-picking|Custom GetFeatureInfo Sandcastle Example}
179
184
  */
180
185
  function WebMapTileServiceImageryProvider(options) {
181
186
  options = options ?? Frozen.EMPTY_OBJECT;
@@ -168,6 +168,8 @@ function renderBufferPolylineCollection(collection, frameState, renderContext) {
168
168
  if (collection._dirtyCount > 0) {
169
169
  const { _dirtyOffset, _dirtyCount } = collection;
170
170
 
171
+ const widthInMeters = collection.widthUnits === "meters";
172
+
171
173
  const indexArray = renderContext.indexArray;
172
174
 
173
175
  const {
@@ -200,6 +202,8 @@ function renderBufferPolylineCollection(collection, frameState, renderContext) {
200
202
  polyline.getMaterial(material);
201
203
  const encodedColor = AttributeCompression.encodeRGB8(material.color);
202
204
  const colorAlpha = material.color.alpha;
205
+ // A negative width marks a width in meters, which the shader converts to pixels.
206
+ const signedWidth = widthInMeters ? -material.width : material.width;
203
207
  Color.fromRgba(polyline._pickId, pickColor);
204
208
  const show = polyline.show;
205
209
 
@@ -306,7 +310,7 @@ function renderBufferPolylineCollection(collection, frameState, renderContext) {
306
310
 
307
311
  showColorWidthAndTexCoordArray[vOffset * 4] = show ? 1 : 0;
308
312
  showColorWidthAndTexCoordArray[vOffset * 4 + 1] = encodedColor;
309
- showColorWidthAndTexCoordArray[vOffset * 4 + 2] = material.width;
313
+ showColorWidthAndTexCoordArray[vOffset * 4 + 2] = signedWidth;
310
314
  showColorWidthAndTexCoordArray[vOffset * 4 + 3] = j / (jl - 1);
311
315
 
312
316
  alphaArray[vOffset] = colorAlpha * 255.0;
@@ -24,7 +24,7 @@ void main()
24
24
  {
25
25
  float show = showColorWidthAndTexCoord.x;
26
26
  vec4 color = czm_decodeRGB8(showColorWidthAndTexCoord.y);
27
- float width = showColorWidthAndTexCoord.z;
27
+ float signedWidth = showColorWidthAndTexCoord.z;
28
28
  float texCoord = showColorWidthAndTexCoord.w;
29
29
 
30
30
  ///////////////////////////////////////////////////////////////////////////
@@ -37,11 +37,23 @@ void main()
37
37
  vec4 positionEC = czm_translateRelativeToEye(positionHigh, positionLow);
38
38
  vec4 prevPositionEC = czm_translateRelativeToEye(prevPositionHigh, prevPositionLow);
39
39
  vec4 nextPositionEC = czm_translateRelativeToEye(nextPositionHigh, nextPositionLow);
40
- vec4 positionWC = getPolylineWindowCoordinates(positionEC, prevPositionEC, nextPositionEC, expandDir, width, usePrevious, polylineAngle);
41
40
  #else
42
41
  vec4 positionEC = czm_modelView * vec4(position, 1.0);
43
42
  vec4 prevPositionEC = czm_modelView * vec4(prevPosition, 1.0);
44
43
  vec4 nextPositionEC = czm_modelView * vec4(nextPosition, 1.0);
44
+ #endif
45
+
46
+ // A negative width is in meters; see renderBufferPolylineCollection. The quad is
47
+ // extruded in window coordinates, so convert it at this vertex's depth.
48
+ float width = abs(signedWidth);
49
+ if (signedWidth < 0.0)
50
+ {
51
+ width /= max(czm_metersPerPixel(positionEC), czm_epsilon7);
52
+ }
53
+
54
+ #ifdef USE_FLOAT64
55
+ vec4 positionWC = getPolylineWindowCoordinates(positionEC, prevPositionEC, nextPositionEC, expandDir, width, usePrevious, polylineAngle);
56
+ #else
45
57
  // Positions are already in eye space; use the EC variant to skip the redundant transform.
46
58
  vec4 positionWC = getPolylineWindowCoordinatesEC(positionEC, prevPositionEC, nextPositionEC, expandDir, width, usePrevious, polylineAngle);
47
59
  #endif
@@ -25,7 +25,7 @@ void main()\n\
25
25
  {\n\
26
26
  float show = showColorWidthAndTexCoord.x;\n\
27
27
  vec4 color = czm_decodeRGB8(showColorWidthAndTexCoord.y);\n\
28
- float width = showColorWidthAndTexCoord.z;\n\
28
+ float signedWidth = showColorWidthAndTexCoord.z;\n\
29
29
  float texCoord = showColorWidthAndTexCoord.w;\n\
30
30
  \n\
31
31
  ///////////////////////////////////////////////////////////////////////////\n\
@@ -38,11 +38,23 @@ void main()\n\
38
38
  vec4 positionEC = czm_translateRelativeToEye(positionHigh, positionLow);\n\
39
39
  vec4 prevPositionEC = czm_translateRelativeToEye(prevPositionHigh, prevPositionLow);\n\
40
40
  vec4 nextPositionEC = czm_translateRelativeToEye(nextPositionHigh, nextPositionLow);\n\
41
- vec4 positionWC = getPolylineWindowCoordinates(positionEC, prevPositionEC, nextPositionEC, expandDir, width, usePrevious, polylineAngle);\n\
42
41
  #else\n\
43
42
  vec4 positionEC = czm_modelView * vec4(position, 1.0);\n\
44
43
  vec4 prevPositionEC = czm_modelView * vec4(prevPosition, 1.0);\n\
45
44
  vec4 nextPositionEC = czm_modelView * vec4(nextPosition, 1.0);\n\
45
+ #endif\n\
46
+ \n\
47
+ // A negative width is in meters; see renderBufferPolylineCollection. The quad is\n\
48
+ // extruded in window coordinates, so convert it at this vertex's depth.\n\
49
+ float width = abs(signedWidth);\n\
50
+ if (signedWidth < 0.0)\n\
51
+ {\n\
52
+ width /= max(czm_metersPerPixel(positionEC), czm_epsilon7);\n\
53
+ }\n\
54
+ \n\
55
+ #ifdef USE_FLOAT64\n\
56
+ vec4 positionWC = getPolylineWindowCoordinates(positionEC, prevPositionEC, nextPositionEC, expandDir, width, usePrevious, polylineAngle);\n\
57
+ #else\n\
46
58
  // Positions are already in eye space; use the EC variant to skip the redundant transform.\n\
47
59
  vec4 positionWC = getPolylineWindowCoordinatesEC(positionEC, prevPositionEC, nextPositionEC, expandDir, width, usePrevious, polylineAngle);\n\
48
60
  #endif\n\