@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
@@ -13,6 +13,7 @@ import Ellipsoid from "../../Core/Ellipsoid.js";
13
13
  import Event from "../../Core/Event.js";
14
14
  import Matrix3 from "../../Core/Matrix3.js";
15
15
  import Matrix4 from "../../Core/Matrix4.js";
16
+ import Rectangle from "../../Core/Rectangle.js";
16
17
  import Resource from "../../Core/Resource.js";
17
18
  import RuntimeError from "../../Core/RuntimeError.js";
18
19
  import Pass from "../../Renderer/Pass.js";
@@ -46,6 +47,8 @@ import StyleCommandsNeeded from "./StyleCommandsNeeded.js";
46
47
  import pickModel from "./pickModel.js";
47
48
  import ModelImagery from "./ModelImagery.js";
48
49
 
50
+ /** @import { VectorTileData } from "../../Core/VectorPipeline.js"; */
51
+
49
52
  /**
50
53
  * <div class="notice">
51
54
  * To construct a Model, call {@link Model.fromGltfAsync}. Do not call the constructor directly.
@@ -399,6 +402,30 @@ function Model(options) {
399
402
  this._clippingPolygons = clippingPolygons;
400
403
  }
401
404
  this._clippingPolygonsState = 0; // If this value changes, the shaders need to be regenerated.
405
+ this._clippingPolygonsNeedRebake = false; // If true, the clipping textures are rebaked.
406
+ this._removeClippingPolygonAdded = undefined;
407
+ this._removeClippingPolygonRemoved = undefined;
408
+ updateClippingPolygonListeners(this);
409
+
410
+ /**
411
+ * Vector lookup data baked for this model's bounding region by the scene's
412
+ * VectorProvider, draping vector data onto the model's surface.
413
+ * @type {VectorTileData|undefined}
414
+ * @ignore
415
+ */
416
+ this._vectorData = undefined;
417
+
418
+ this._vectorLookupFlags = 0; // If this value changes, the shaders need to be regenerated.
419
+
420
+ /*
421
+ * Textures and other intermediate data used in polygon clipping workflows.
422
+ * Clipping polygons build on top of the vector tile data system (both rely on the same rendering technique), thus the type.
423
+ * @type {VectorTileData | undefined}
424
+ * @private
425
+ */
426
+ this._clippingPolygonData = undefined;
427
+
428
+ this._rectangle = new Rectangle();
402
429
 
403
430
  this._modelImagery = new ModelImagery(this);
404
431
 
@@ -1376,7 +1403,17 @@ Object.defineProperties(Model.prototype, {
1376
1403
  if (value !== this._clippingPolygons) {
1377
1404
  // Handle destroying old clipping polygons, new clipping polygons ownership
1378
1405
  ClippingPolygonCollection.setOwner(value, this, "_clippingPolygons");
1406
+ updateClippingPolygonListeners(this);
1379
1407
  this.resetDrawCommands();
1408
+
1409
+ this._clippingPolygonsState = 0;
1410
+ this._clippingPolygonsNeedRebake = true;
1411
+ if (defined(this._clippingPolygonData)) {
1412
+ ClippingPolygonCollection.releaseRectangleData(
1413
+ this._clippingPolygonData,
1414
+ );
1415
+ this._clippingPolygonData = undefined;
1416
+ }
1380
1417
  }
1381
1418
  },
1382
1419
  },
@@ -1788,6 +1825,41 @@ Object.defineProperties(Model.prototype, {
1788
1825
  },
1789
1826
  });
1790
1827
 
1828
+ /**
1829
+ * A rectangle that bounds the model in geodetic coordinates. For 3D tile content with a
1830
+ * region bounding volume this is the tile's rectangle. Otherwise the model's bounding sphere
1831
+ * is projected onto the given ellipsoid.
1832
+ *
1833
+ * @param {Ellipsoid} [ellipsoid=Ellipsoid.default] Projects the bounding sphere (for models without a region bounding volume).
1834
+ * @returns {Rectangle} The bounding rectangle.
1835
+ *
1836
+ * @exception {DeveloperError} The model is not loaded. Use Model.readyEvent or wait for Model.ready to be true.
1837
+ *
1838
+ * @private
1839
+ */
1840
+ Model.prototype.getRectangle = function (ellipsoid) {
1841
+ //>>includeStart('debug', pragmas.debug);
1842
+ if (!this._ready) {
1843
+ throw new DeveloperError(
1844
+ "The model is not loaded. Use Model.readyEvent or wait for Model.ready to be true.",
1845
+ );
1846
+ }
1847
+ //>>includeEnd('debug');
1848
+
1849
+ // A region bounding volume's rectangle is fixed in WGS84, so the ellipsoid argument does not apply.
1850
+ const bv = this._content?.tile?.contentBoundingVolume;
1851
+ if (defined(bv?.rectangle)) {
1852
+ return bv.rectangle;
1853
+ }
1854
+
1855
+ ellipsoid = ellipsoid ?? this._scene?.ellipsoid ?? Ellipsoid.default;
1856
+ return Rectangle.fromBoundingSphere(
1857
+ this.boundingSphere,
1858
+ ellipsoid,
1859
+ this._rectangle,
1860
+ );
1861
+ };
1862
+
1791
1863
  /**
1792
1864
  * Returns the node with the given <code>name</code> in the glTF. This is used to
1793
1865
  * modify a node's transform for user-defined animation.
@@ -2016,6 +2088,7 @@ Model.prototype.update = function (frameState) {
2016
2088
  updateSkipLevelOfDetail(this, frameState);
2017
2089
  updateClippingPlanes(this, frameState);
2018
2090
  updateClippingPolygons(this, frameState);
2091
+ updateVectorLookup(this, frameState);
2019
2092
  updateSceneMode(this, frameState);
2020
2093
  updateFog(this, frameState);
2021
2094
  updateVerticalExaggeration(this, frameState);
@@ -2219,22 +2292,140 @@ function updateClippingPlanes(model, frameState) {
2219
2292
  }
2220
2293
  }
2221
2294
 
2295
+ // Only the collection's owner subscribes to its add/remove events. Tileset-owned
2296
+ // collections are handled by the tileset, which marks its tiles dirty instead.
2297
+ function updateClippingPolygonListeners(model) {
2298
+ model._removeClippingPolygonAdded =
2299
+ model._removeClippingPolygonAdded && model._removeClippingPolygonAdded();
2300
+ model._removeClippingPolygonRemoved =
2301
+ model._removeClippingPolygonRemoved &&
2302
+ model._removeClippingPolygonRemoved();
2303
+
2304
+ const clippingPolygons = model._clippingPolygons;
2305
+ if (!defined(clippingPolygons) || clippingPolygons.owner !== model) {
2306
+ return;
2307
+ }
2308
+
2309
+ const markDirty = () => {
2310
+ model._clippingPolygonsNeedRebake = true;
2311
+ };
2312
+ model._removeClippingPolygonAdded =
2313
+ clippingPolygons.polygonAdded.addEventListener(markDirty);
2314
+ model._removeClippingPolygonRemoved =
2315
+ clippingPolygons.polygonRemoved.addEventListener(markDirty);
2316
+ }
2317
+
2222
2318
  function updateClippingPolygons(model, frameState) {
2223
- // Update the clipping polygon collection / state for this model to detect any changes.
2319
+ const clippingPolygons = model._clippingPolygons;
2320
+ const enabled = model.isClippingPolygonsEnabled();
2321
+
2322
+ // Detect enabled/inverse changes, which require shader regeneration.
2224
2323
  let currentClippingPolygonsState = 0;
2225
- if (model.isClippingPolygonsEnabled()) {
2226
- if (model._clippingPolygons.owner === model) {
2227
- model._clippingPolygons.update(frameState);
2228
- model._clippingPolygons.queueCommands(frameState);
2324
+ if (enabled) {
2325
+ if (clippingPolygons.owner === model) {
2326
+ clippingPolygons.update(frameState);
2229
2327
  }
2230
- currentClippingPolygonsState =
2231
- model._clippingPolygons.clippingPolygonsState;
2328
+ currentClippingPolygonsState = clippingPolygons.clippingPolygonsState;
2232
2329
  }
2233
2330
 
2234
2331
  if (currentClippingPolygonsState !== model._clippingPolygonsState) {
2235
2332
  model.resetDrawCommands();
2236
2333
  model._clippingPolygonsState = currentClippingPolygonsState;
2237
2334
  }
2335
+
2336
+ const wasClipped = (model._clippingPolygonData?.polygonRings.length ?? 0) > 0;
2337
+
2338
+ // A polygon add/remove or a model move only requires rebaking the clipping textures.
2339
+ if (model._clippingPolygonsNeedRebake) {
2340
+ model._clippingPolygonsNeedRebake = false;
2341
+ if (defined(model._clippingPolygonData)) {
2342
+ ClippingPolygonCollection.releaseRectangleData(
2343
+ model._clippingPolygonData,
2344
+ );
2345
+ model._clippingPolygonData = undefined;
2346
+ }
2347
+ }
2348
+
2349
+ if (!enabled || !model._ready) {
2350
+ return;
2351
+ }
2352
+
2353
+ if (!defined(model._clippingPolygonData)) {
2354
+ model._clippingPolygonData = clippingPolygons.requestRectangleData(
2355
+ model.getRectangle(clippingPolygons.ellipsoid),
2356
+ frameState.context,
2357
+ );
2358
+ }
2359
+
2360
+ const isClipped = (model._clippingPolygonData?.polygonRings.length ?? 0) > 0;
2361
+ if (wasClipped !== isClipped) {
2362
+ // Rerun the model pipeline to enable/disable clipping
2363
+ model.resetDrawCommands();
2364
+ }
2365
+ }
2366
+
2367
+ const scratchVectorRectangle = new Rectangle();
2368
+
2369
+ function releaseVectorData(model) {
2370
+ if (!defined(model._vectorData)) {
2371
+ return;
2372
+ }
2373
+
2374
+ model._scene?.vectorProvider?.releaseTileData(model._vectorData);
2375
+ model._vectorData = undefined;
2376
+ }
2377
+
2378
+ // Each kind of geometry declares its own lookup textures, so the mix drives the shader.
2379
+ function vectorLookupFlags(vectorData) {
2380
+ if (vectorData?.show !== true) {
2381
+ return 0;
2382
+ }
2383
+
2384
+ let flags = 1;
2385
+ flags |= vectorData.hasPolylines ? 2 : 0;
2386
+ flags |= vectorData.hasPolygons ? 4 : 0;
2387
+ return flags;
2388
+ }
2389
+
2390
+ function updateVectorLookup(model, frameState) {
2391
+ const provider = model._scene?.vectorProvider;
2392
+ // HeightReference.CLAMP_TO_3D_TILE covers tileset content only, not standalone glTF.
2393
+ const active =
2394
+ defined(provider) &&
2395
+ defined(model._content) &&
2396
+ model.ready &&
2397
+ frameState.mode === SceneMode.SCENE3D;
2398
+
2399
+ if (active) {
2400
+ // A tile's content region is far tighter than a rectangle circumscribing the bounding sphere.
2401
+ const rectangle =
2402
+ model._content?.tile?.contentBoundingVolume.rectangle ??
2403
+ Rectangle.fromBoundingSphere(
2404
+ model.boundingSphere,
2405
+ provider.ellipsoid,
2406
+ scratchVectorRectangle,
2407
+ );
2408
+ model._vectorData = defined(model._vectorData)
2409
+ ? provider.updateDataForRectangle(
2410
+ rectangle,
2411
+ frameState.context,
2412
+ model._vectorData,
2413
+ HeightReference.CLAMP_TO_3D_TILE,
2414
+ )
2415
+ : provider.requestDataForRectangle(
2416
+ rectangle,
2417
+ frameState.context,
2418
+ HeightReference.CLAMP_TO_3D_TILE,
2419
+ );
2420
+ } else {
2421
+ releaseVectorData(model);
2422
+ }
2423
+
2424
+ const flags = vectorLookupFlags(model._vectorData);
2425
+ if (flags !== model._vectorLookupFlags) {
2426
+ model.resetDrawCommands();
2427
+ model._vectorLookupFlags = flags;
2428
+ }
2238
2429
  }
2239
2430
 
2240
2431
  function updateSceneMode(model, frameState) {
@@ -2502,6 +2693,10 @@ function updateSceneGraph(model, frameState) {
2502
2693
  ? model._clampedModelMatrix
2503
2694
  : model.modelMatrix;
2504
2695
  sceneGraph.updateModelMatrix(modelMatrix, frameState);
2696
+ if (model._updateModelMatrix) {
2697
+ // The model moved, so re-bake the clipping textures for its new rectangle.
2698
+ model._clippingPolygonsNeedRebake = true;
2699
+ }
2505
2700
  model._updateModelMatrix = false;
2506
2701
  }
2507
2702
 
@@ -2561,6 +2756,22 @@ function updateShowCreditsOnScreen(model) {
2561
2756
  }
2562
2757
  }
2563
2758
 
2759
+ /**
2760
+ * Determines whether a model is wholly clipped away by inverse clipping. In
2761
+ * inverse mode a model with no polygon geometry lies entirely outside every
2762
+ * polygon, so all of it is clipped and it should not be drawn.
2763
+ * @param {Model} model
2764
+ * @returns {boolean}
2765
+ * @private
2766
+ */
2767
+ function isModelClippedAwayByInversePolygons(model) {
2768
+ return (
2769
+ model.isClippingPolygonsEnabled() &&
2770
+ model._clippingPolygons.inverse &&
2771
+ (model._clippingPolygonData?.polygonRings.length ?? 0) === 0
2772
+ );
2773
+ }
2774
+
2564
2775
  function submitDrawCommands(model, frameState) {
2565
2776
  // Check that show is true after draw commands are built;
2566
2777
  // we want the user to be able to instantly see the model
@@ -2581,7 +2792,8 @@ function submitDrawCommands(model, frameState) {
2581
2792
  model._show &&
2582
2793
  model._computedScale !== 0 &&
2583
2794
  displayConditionPassed &&
2584
- (!invisible || silhouette);
2795
+ (!invisible || silhouette) &&
2796
+ !isModelClippedAwayByInversePolygons(model);
2585
2797
 
2586
2798
  const passes = frameState.passes;
2587
2799
  const submitCommandsForPass =
@@ -2806,6 +3018,16 @@ Model.prototype.isClippingPolygonsEnabled = function () {
2806
3018
  );
2807
3019
  };
2808
3020
 
3021
+ /**
3022
+ * Gets whether draped vector data is baked and renderable for this model.
3023
+ *
3024
+ * @returns {boolean} <code>true</code> if the model drapes vector data.
3025
+ * @private
3026
+ */
3027
+ Model.prototype.hasDrapedVectors = function () {
3028
+ return this._vectorData?.show === true;
3029
+ };
3030
+
2809
3031
  /**
2810
3032
  * Returns true if this object was destroyed; otherwise, false.
2811
3033
  * <br /><br />
@@ -2853,6 +3075,8 @@ Model.prototype.destroy = function () {
2853
3075
  this.destroyPipelineResources();
2854
3076
  this.destroyModelResources();
2855
3077
 
3078
+ releaseVectorData(this);
3079
+
2856
3080
  // Remove callbacks for height reference behavior.
2857
3081
  if (defined(this._removeUpdateHeightCallback)) {
2858
3082
  this._removeUpdateHeightCallback();
@@ -2864,6 +3088,12 @@ Model.prototype.destroy = function () {
2864
3088
  this._terrainProviderChangedCallback = undefined;
2865
3089
  }
2866
3090
 
3091
+ // Remove clipping polygon event listeners if this model subscribed to them.
3092
+ this._removeClippingPolygonAdded =
3093
+ this._removeClippingPolygonAdded && this._removeClippingPolygonAdded();
3094
+ this._removeClippingPolygonRemoved =
3095
+ this._removeClippingPolygonRemoved && this._removeClippingPolygonRemoved();
3096
+
2867
3097
  // Only destroy the ClippingPlaneCollection if this is the owner.
2868
3098
  const clippingPlaneCollection = this._clippingPlanes;
2869
3099
  if (
@@ -2875,15 +3105,11 @@ Model.prototype.destroy = function () {
2875
3105
  }
2876
3106
  this._clippingPlanes = undefined;
2877
3107
 
2878
- // Only destroy the ClippingPolygonCollection if this is the owner.
2879
- const clippingPolygonCollection = this._clippingPolygons;
2880
- if (
2881
- defined(clippingPolygonCollection) &&
2882
- !clippingPolygonCollection.isDestroyed() &&
2883
- clippingPolygonCollection.owner === this
2884
- ) {
2885
- clippingPolygonCollection.destroy();
3108
+ if (defined(this._clippingPolygonData)) {
3109
+ ClippingPolygonCollection.releaseRectangleData(this._clippingPolygonData);
2886
3110
  }
3111
+ this._clippingPolygonData = undefined;
3112
+
2887
3113
  this._clippingPolygons = undefined;
2888
3114
 
2889
3115
  // Only destroy the ImageBasedLighting if this is the owner.
@@ -310,6 +310,10 @@ class Model3DTileContent {
310
310
  model._clippingPolygonsState = 0;
311
311
  }
312
312
 
313
+ if (tile.clippingPolygonsNeedRebake) {
314
+ model._clippingPolygonsNeedRebake = true;
315
+ }
316
+
313
317
  model.update(frameState);
314
318
 
315
319
  if (!this._ready && model.ready) {
@@ -490,6 +494,7 @@ function makeModelOptions(tileset, tile, content, additionalOptions) {
490
494
  incrementallyLoadTextures: false,
491
495
  customShader: tileset.customShader,
492
496
  content: content,
497
+ scene: tileset._scene,
493
498
  colorBlendMode: tileset.colorBlendMode,
494
499
  colorBlendAmount: tileset.colorBlendAmount,
495
500
  lightColor: tileset.lightColor,
@@ -1,7 +1,11 @@
1
1
  import combine from "../../Core/combine.js";
2
- import ModelClippingPolygonsStageVS from "../../Shaders/Model/ModelClippingPolygonsStageVS.js";
3
2
  import ModelClippingPolygonsStageFS from "../../Shaders/Model/ModelClippingPolygonsStageFS.js";
3
+ import ModelClippingPolygonsStageVS from "../../Shaders/Model/ModelClippingPolygonsStageVS.js";
4
4
  import ShaderDestination from "../../Renderer/ShaderDestination.js";
5
+ import VectorCommon from "../../Shaders/VectorCommon.js";
6
+ import Cartesian2 from "../../Core/Cartesian2.js";
7
+ import CesiumMath from "../../Core/Math.js";
8
+ import Rectangle from "../../Core/Rectangle.js";
5
9
 
6
10
  /**
7
11
  * The model clipping planes stage is responsible for applying clipping planes to the model.
@@ -14,6 +18,10 @@ const ModelClippingPolygonsPipelineStage = {
14
18
  name: "ModelClippingPolygonsPipelineStage", // Helps with debugging
15
19
  };
16
20
 
21
+ const scratchCameraUv = new Cartesian2();
22
+ const scratchRectangleInverseSize = new Cartesian2();
23
+ const defaultRectangle = Rectangle.MAX_VALUE;
24
+
17
25
  /**
18
26
  * Process a model for polygon clipping. This modifies the following parts of the render resources:
19
27
  *
@@ -54,40 +62,67 @@ ModelClippingPolygonsPipelineStage.process = function (
54
62
  );
55
63
  }
56
64
 
57
- shaderBuilder.addDefine(
58
- "CLIPPING_POLYGON_REGIONS_LENGTH",
59
- clippingPolygons.extentsCount,
60
- ShaderDestination.BOTH,
61
- );
65
+ shaderBuilder.addVarying("vec2", "v_clippingUv");
62
66
 
63
67
  shaderBuilder.addUniform(
64
- "sampler2D",
65
- "model_clippingDistance",
66
- ShaderDestination.FRAGMENT,
68
+ "vec2",
69
+ "u_clippingCameraUv",
70
+ ShaderDestination.VERTEX,
67
71
  );
68
72
 
69
73
  shaderBuilder.addUniform(
70
- "sampler2D",
71
- "model_clippingExtents",
74
+ "vec2",
75
+ "u_clippingRectangleInverseSize",
72
76
  ShaderDestination.VERTEX,
73
77
  );
74
78
 
75
- shaderBuilder.addVarying("vec2", "v_clippingPosition");
76
- shaderBuilder.addVarying("int", "v_regionIndex", "flat");
77
79
  shaderBuilder.addVertexLines(ModelClippingPolygonsStageVS);
80
+ shaderBuilder.addFragmentLines(VectorCommon);
78
81
  shaderBuilder.addFragmentLines(ModelClippingPolygonsStageFS);
79
82
 
80
83
  const uniformMap = {
81
- model_clippingDistance: function () {
84
+ // The UV coordinates of the camera within the model's clipping rectangle.
85
+ u_clippingCameraUv: function () {
86
+ const rectangle =
87
+ model._clippingPolygonData?.rectangle ?? defaultRectangle;
88
+ const halfWidth = rectangle.width * 0.5;
89
+ const centerLongitude = rectangle.west + halfWidth;
90
+ const carto = frameState.camera.positionCartographic;
91
+
92
+ const longitudeOffset =
93
+ CesiumMath.negativePiToPi(carto.longitude - centerLongitude) +
94
+ halfWidth;
95
+ return Cartesian2.fromElements(
96
+ longitudeOffset / rectangle.width,
97
+ (carto.latitude - rectangle.south) / rectangle.height,
98
+ scratchCameraUv,
99
+ );
100
+ },
101
+ u_clippingRectangleInverseSize: function () {
102
+ const rectangle =
103
+ model._clippingPolygonData?.rectangle ?? defaultRectangle;
104
+ return Cartesian2.fromElements(
105
+ 1.0 / rectangle.width,
106
+ 1.0 / rectangle.height,
107
+ scratchRectangleInverseSize,
108
+ );
109
+ },
110
+ u_clippingEdgeTexture: function () {
111
+ return (
112
+ model._clippingPolygonData?.polygonEdgeTexture ??
113
+ frameState.context.defaultTexture
114
+ );
115
+ },
116
+ u_clippingEdgePrimitiveIndicesTexture: function () {
82
117
  return (
83
- // The later should never happen during a render pass, see https://github.com/CesiumGS/cesium/issues/12725
84
- clippingPolygons.clippingTexture ?? frameState.context.defaultTexture
118
+ model._clippingPolygonData?.polygonEdgePrimitiveIndicesTexture ??
119
+ frameState.context.defaultTexture
85
120
  );
86
121
  },
87
- model_clippingExtents: function () {
122
+ u_clippingGridCellIndicesTexture: function () {
88
123
  return (
89
- // The later should never happen during a render pass, see https://github.com/CesiumGS/cesium/issues/12725
90
- clippingPolygons.extentsTexture ?? frameState.context.defaultTexture
124
+ model._clippingPolygonData?.polygonGridCellIndicesTexture ??
125
+ frameState.context.defaultTexture
91
126
  );
92
127
  },
93
128
  };
@@ -25,7 +25,7 @@ function ModelRenderResources(model) {
25
25
  * @type {ShaderBuilder}
26
26
  * @readonly
27
27
  *
28
- * @private
28
+ * @ignore
29
29
  */
30
30
  this.shaderBuilder = new ShaderBuilder();
31
31
 
@@ -44,9 +44,8 @@ function ModelRenderResources(model) {
44
44
  * values.
45
45
  *
46
46
  * @type {Object<string, Function>}
47
- * @readonly
48
47
  *
49
- * @private
48
+ * @ignore
50
49
  */
51
50
  this.uniformMap = {};
52
51
 
@@ -14,6 +14,7 @@ import ModelArticulation from "./ModelArticulation.js";
14
14
  import ModelColorPipelineStage from "./ModelColorPipelineStage.js";
15
15
  import ModelClippingPlanesPipelineStage from "./ModelClippingPlanesPipelineStage.js";
16
16
  import ModelClippingPolygonsPipelineStage from "./ModelClippingPolygonsPipelineStage.js";
17
+ import ModelVectorLookupPipelineStage from "./ModelVectorLookupPipelineStage.js";
17
18
  import ModelNode from "./ModelNode.js";
18
19
  import ModelRuntimeNode from "./ModelRuntimeNode.js";
19
20
  import ModelRuntimePrimitive from "./ModelRuntimePrimitive.js";
@@ -735,10 +736,18 @@ ModelSceneGraph.prototype.configurePipeline = function (frameState) {
735
736
  modelPipelineStages.push(ModelClippingPlanesPipelineStage);
736
737
  }
737
738
 
738
- if (model.isClippingPolygonsEnabled()) {
739
+ // Even if a model has a clipping polygon collection, the polygons may not overlap the model geometry,
740
+ // in which case the clipping polygon pipeline stage should not be added.
741
+ const hasClippingPolygonGeometry =
742
+ (model._clippingPolygonData?.polygonRings.length ?? 0) > 0;
743
+ if (model.isClippingPolygonsEnabled() && hasClippingPolygonGeometry) {
739
744
  modelPipelineStages.push(ModelClippingPolygonsPipelineStage);
740
745
  }
741
746
 
747
+ if (model.hasDrapedVectors()) {
748
+ modelPipelineStages.push(ModelVectorLookupPipelineStage);
749
+ }
750
+
742
751
  if (model.hasSilhouette(frameState)) {
743
752
  modelPipelineStages.push(ModelSilhouettePipelineStage);
744
753
  }