@cesium/engine 26.0.0 → 26.2.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 (471) hide show
  1. package/Build/ThirdParty/Workers/zip-web-worker.js +586 -480
  2. package/Build/Workers/{chunk-7J2HKPRH.js → chunk-27FWRTJI.js} +9 -9
  3. package/Build/Workers/{chunk-EF2QYXGA.js → chunk-2EFYUSUY.js} +14 -14
  4. package/Build/Workers/chunk-2H5264K7.js +1284 -0
  5. package/Build/Workers/{chunk-DOBXCNC3.js → chunk-2H73KDBM.js} +13 -13
  6. package/Build/Workers/chunk-2RGJPWQX.js +1284 -0
  7. package/Build/Workers/chunk-2Z4ZLVOD.js +352 -0
  8. package/Build/Workers/{chunk-F6QDY6HU.js → chunk-2ZKH2QZB.js} +13 -13
  9. package/Build/Workers/chunk-36NI5E6W.js +3820 -0
  10. package/Build/Workers/{chunk-ZK3CF7ZD.js → chunk-37SW7SYS.js} +12 -12
  11. package/Build/Workers/chunk-3GHVJ3SO.js +455 -0
  12. package/Build/Workers/chunk-3LB4UVPU.js +387 -0
  13. package/Build/Workers/chunk-3PONLKEL.js +778 -0
  14. package/Build/Workers/{chunk-Y57HREW5.js → chunk-3PSS3T43.js} +4 -4
  15. package/Build/Workers/chunk-3QR662HH.js +3820 -0
  16. package/Build/Workers/{chunk-QN67VG36.js → chunk-3SX2WYSO.js} +6 -6
  17. package/Build/Workers/{chunk-G7PXZRVF.js → chunk-3UDN6LYX.js} +7 -7
  18. package/Build/Workers/chunk-47MCBSXI.js +9237 -0
  19. package/Build/Workers/{chunk-KKOSKAZB.js → chunk-4E626OCE.js} +17 -17
  20. package/Build/Workers/chunk-4NW2MJKH.js +455 -0
  21. package/Build/Workers/{chunk-DBOEKL43.js → chunk-52YK5BSN.js} +7 -7
  22. package/Build/Workers/{chunk-KFSTQKNM.js → chunk-5LSOO2KD.js} +7 -7
  23. package/Build/Workers/chunk-5RNAQZK6.js +9234 -0
  24. package/Build/Workers/chunk-5YPQBFRD.js +519 -0
  25. package/Build/Workers/{chunk-S4MCOY6I.js → chunk-6FHT43QR.js} +5 -5
  26. package/Build/Workers/chunk-6FZDPMTO.js +455 -0
  27. package/Build/Workers/{chunk-VQYETPWC.js → chunk-6HK6IXK2.js} +4 -4
  28. package/Build/Workers/chunk-6R5X2GUA.js +1284 -0
  29. package/Build/Workers/{chunk-AYKR4VBR.js → chunk-6YR6JBMY.js} +2 -2
  30. package/Build/Workers/chunk-76FDC45O.js +511 -0
  31. package/Build/Workers/chunk-7A2OGDHT.js +305 -0
  32. package/Build/Workers/chunk-7CGEQUM2.js +305 -0
  33. package/Build/Workers/{chunk-54I6Y66F.js → chunk-7D2HZKH7.js} +6 -6
  34. package/Build/Workers/{chunk-3VFEWOBI.js → chunk-7I325HV6.js} +7 -7
  35. package/Build/Workers/{chunk-4MGMYHOO.js → chunk-7KVKHY7O.js} +6 -6
  36. package/Build/Workers/chunk-7MM3N2VE.js +1067 -0
  37. package/Build/Workers/chunk-7TKLTCZW.js +219 -0
  38. package/Build/Workers/chunk-7UUKBDH6.js +1054 -0
  39. package/Build/Workers/chunk-7W6DUHAB.js +693 -0
  40. package/Build/Workers/{chunk-DDWSZVMY.js → chunk-7XM5JK5F.js} +5 -5
  41. package/Build/Workers/chunk-7YG3ND3P.js +454 -0
  42. package/Build/Workers/{chunk-IRBKFCEJ.js → chunk-A3O6EDBK.js} +2 -2
  43. package/Build/Workers/chunk-A62YI6S6.js +305 -0
  44. package/Build/Workers/{chunk-V7VQKN6N.js → chunk-A6X24AZI.js} +5 -5
  45. package/Build/Workers/chunk-A7TTWVTF.js +2719 -0
  46. package/Build/Workers/chunk-ACTVJHSP.js +519 -0
  47. package/Build/Workers/chunk-ADX3CBKD.js +9234 -0
  48. package/Build/Workers/{chunk-52JDLOEM.js → chunk-AF7DTMJ7.js} +14 -14
  49. package/Build/Workers/{chunk-ZP7JMQV4.js → chunk-AHWAZRBV.js} +6 -2
  50. package/Build/Workers/chunk-AJSFRY4U.js +1344 -0
  51. package/Build/Workers/{chunk-EBSIOBXY.js → chunk-ARZICEEP.js} +8 -8
  52. package/Build/Workers/chunk-B3QHNA4A.js +147 -0
  53. package/Build/Workers/{chunk-YLY7NKAB.js → chunk-B4CQSLZJ.js} +4 -4
  54. package/Build/Workers/chunk-BKPQFCXH.js +511 -0
  55. package/Build/Workers/{chunk-O3EA5HS7.js → chunk-BSPCI2LO.js} +10 -10
  56. package/Build/Workers/chunk-BUJWSX5S.js +301 -0
  57. package/Build/Workers/{chunk-J6BWOHUF.js → chunk-C7JQVRLM.js} +3 -3
  58. package/Build/Workers/chunk-C7QDUNI3.js +138 -0
  59. package/Build/Workers/{chunk-KSSWJIZW.js → chunk-CDJDJ5LK.js} +2 -2
  60. package/Build/Workers/chunk-CEEZE3YZ.js +476 -0
  61. package/Build/Workers/chunk-CIV5DJOQ.js +778 -0
  62. package/Build/Workers/{chunk-INUEEEQA.js → chunk-CLCTQVVL.js} +8 -8
  63. package/Build/Workers/{chunk-C6J67V5A.js → chunk-CQNFIAZU.js} +1 -1
  64. package/Build/Workers/chunk-CRCGE4J4.js +9237 -0
  65. package/Build/Workers/{chunk-SMQZZOW6.js → chunk-CUTRKXUQ.js} +10 -10
  66. package/Build/Workers/{chunk-Q3PY526V.js → chunk-D6AY775A.js} +6 -6
  67. package/Build/Workers/chunk-DBD5WWG2.js +959 -0
  68. package/Build/Workers/{chunk-E7VQ76KE.js → chunk-DIGUUD6G.js} +6 -6
  69. package/Build/Workers/{chunk-P3CK7MCY.js → chunk-DSGLDRTI.js} +4 -4
  70. package/Build/Workers/chunk-DZBQUULR.js +138 -0
  71. package/Build/Workers/chunk-DZUFEE4L.js +140 -0
  72. package/Build/Workers/chunk-E2NKV5YT.js +3820 -0
  73. package/Build/Workers/{chunk-424RNO3D.js → chunk-E7NZJOK7.js} +196 -22
  74. package/Build/Workers/{chunk-UOOIQ3KX.js → chunk-EB3Y5P3A.js} +12 -12
  75. package/Build/Workers/{chunk-ACXQXN46.js → chunk-EHTS2YPT.js} +16 -16
  76. package/Build/Workers/{chunk-EPYXRCDB.js → chunk-ELE6SC2C.js} +12 -12
  77. package/Build/Workers/{chunk-VWV2IJRB.js → chunk-ENNFMWDW.js} +11 -11
  78. package/Build/Workers/chunk-EOWDZN5S.js +288 -0
  79. package/Build/Workers/chunk-ERKUET22.js +3201 -0
  80. package/Build/Workers/chunk-EZGQPOIG.js +162 -0
  81. package/Build/Workers/chunk-F2IMBMZY.js +241 -0
  82. package/Build/Workers/chunk-F4CSNRZO.js +219 -0
  83. package/Build/Workers/chunk-FBP4DUQJ.js +693 -0
  84. package/Build/Workers/{chunk-FRQZECAO.js → chunk-FCP2QY4G.js} +5 -5
  85. package/Build/Workers/{chunk-ZZ46LWL6.js → chunk-FDK4K5IA.js} +1 -1
  86. package/Build/Workers/{chunk-C6KNZ7T4.js → chunk-FGQFQHN5.js} +17 -17
  87. package/Build/Workers/chunk-FJWZMGOQ.js +1992 -0
  88. package/Build/Workers/{chunk-Y5BF6AFU.js → chunk-FQ42MT7M.js} +2 -2
  89. package/Build/Workers/chunk-FU4BGABC.js +398 -0
  90. package/Build/Workers/chunk-FX3VEAIU.js +2719 -0
  91. package/Build/Workers/chunk-GGNWQWSB.js +301 -0
  92. package/Build/Workers/chunk-GHXVQVUM.js +1344 -0
  93. package/Build/Workers/{chunk-CZEYZU4N.js → chunk-GNKXEN4C.js} +10 -10
  94. package/Build/Workers/{chunk-MYP774IS.js → chunk-GSWMAFTE.js} +8 -8
  95. package/Build/Workers/chunk-GVA7XQI2.js +368 -0
  96. package/Build/Workers/chunk-GXDHRC4J.js +1344 -0
  97. package/Build/Workers/chunk-GXWQZBAI.js +58 -0
  98. package/Build/Workers/chunk-GYSYP6PC.js +1067 -0
  99. package/Build/Workers/chunk-H2WCFXLP.js +241 -0
  100. package/Build/Workers/chunk-HDL4HOXZ.js +778 -0
  101. package/Build/Workers/chunk-HHV3MCGV.js +162 -0
  102. package/Build/Workers/chunk-HLW2ZRVK.js +368 -0
  103. package/Build/Workers/chunk-HS6AD4P2.js +398 -0
  104. package/Build/Workers/chunk-HT6FASOT.js +973 -0
  105. package/Build/Workers/chunk-I74ZH5LK.js +959 -0
  106. package/Build/Workers/{chunk-7WM2PX4V.js → chunk-IDVHUDZT.js} +5 -5
  107. package/Build/Workers/chunk-IGAZBTFZ.js +3201 -0
  108. package/Build/Workers/chunk-IJZJMIUY.js +789 -0
  109. package/Build/Workers/chunk-ILME5BXA.js +301 -0
  110. package/Build/Workers/chunk-IMBVP57H.js +44 -0
  111. package/Build/Workers/chunk-IOO7Z2AV.js +57 -0
  112. package/Build/Workers/chunk-IUIFLOYO.js +44 -0
  113. package/Build/Workers/chunk-J73T2VOY.js +171 -0
  114. package/Build/Workers/chunk-JALGQYDY.js +288 -0
  115. package/Build/Workers/chunk-JKXV6PG5.js +56 -0
  116. package/Build/Workers/chunk-JW6OZT4R.js +288 -0
  117. package/Build/Workers/{chunk-CXOYE2WM.js → chunk-JXYLJCTC.js} +5 -5
  118. package/Build/Workers/{chunk-CFQP6LYM.js → chunk-K27QOAW6.js} +4 -4
  119. package/Build/Workers/chunk-KGXSYGBG.js +387 -0
  120. package/Build/Workers/chunk-KMV25A63.js +789 -0
  121. package/Build/Workers/chunk-KP5QD7WU.js +693 -0
  122. package/Build/Workers/chunk-KZWFWJML.js +2719 -0
  123. package/Build/Workers/chunk-LCXRRALY.js +387 -0
  124. package/Build/Workers/chunk-LD64RPYV.js +368 -0
  125. package/Build/Workers/{chunk-U3ZA64U7.js → chunk-LDRQSYBN.js} +2 -2
  126. package/Build/Workers/chunk-LGNDTZVX.js +97 -0
  127. package/Build/Workers/chunk-LNSQVXFH.js +1800 -0
  128. package/Build/Workers/chunk-M4JZ6TSZ.js +959 -0
  129. package/Build/Workers/chunk-M6QKXVAU.js +1054 -0
  130. package/Build/Workers/chunk-MAAHFYPC.js +198 -0
  131. package/Build/Workers/chunk-MCJDRDJQ.js +102 -0
  132. package/Build/Workers/chunk-MEENMEAH.js +198 -0
  133. package/Build/Workers/{chunk-TKKIREQ6.js → chunk-N7CCOFLX.js} +1 -1
  134. package/Build/Workers/chunk-NAWU5RF4.js +162 -0
  135. package/Build/Workers/{chunk-M3B5JKSM.js → chunk-NCL22ZUX.js} +1 -1
  136. package/Build/Workers/chunk-NEFDMMLY.js +241 -0
  137. package/Build/Workers/{chunk-UA25D5MX.js → chunk-NIWITKQK.js} +10 -10
  138. package/Build/Workers/chunk-NJVBJG63.js +124 -0
  139. package/Build/Workers/chunk-NLLCQBX3.js +73 -0
  140. package/Build/Workers/chunk-NSKZ6SBK.js +1483 -0
  141. package/Build/Workers/chunk-NXGQBQWE.js +837 -0
  142. package/Build/Workers/chunk-O3DKEX7Q.js +352 -0
  143. package/Build/Workers/chunk-O3XFXGPZ.js +476 -0
  144. package/Build/Workers/chunk-OA6MYL2C.js +837 -0
  145. package/Build/Workers/chunk-OBEU25PI.js +1067 -0
  146. package/Build/Workers/chunk-OHP4ELS7.js +198 -0
  147. package/Build/Workers/chunk-OZGPS7FB.js +138 -0
  148. package/Build/Workers/chunk-PCL3Y7H5.js +82 -0
  149. package/Build/Workers/chunk-PD4GK4EM.js +57 -0
  150. package/Build/Workers/chunk-PEDU33QG.js +2342 -0
  151. package/Build/Workers/chunk-PRWUMCXF.js +682 -0
  152. package/Build/Workers/chunk-PVTSNNVI.js +288 -0
  153. package/Build/Workers/chunk-QFSSCLLZ.js +973 -0
  154. package/Build/Workers/chunk-QHPZH22L.js +241 -0
  155. package/Build/Workers/chunk-QIZDWZK6.js +301 -0
  156. package/Build/Workers/chunk-QV6DG2YX.js +1483 -0
  157. package/Build/Workers/chunk-QVLAFFJY.js +56 -0
  158. package/Build/Workers/{chunk-6YEE6JDR.js → chunk-R4FPNAZ2.js} +6 -6
  159. package/Build/Workers/chunk-R4K7EHOU.js +171 -0
  160. package/Build/Workers/chunk-R7JGHDD6.js +789 -0
  161. package/Build/Workers/chunk-RASQEYD4.js +1483 -0
  162. package/Build/Workers/chunk-RG4F5R57.js +454 -0
  163. package/Build/Workers/chunk-RW6ITX7Q.js +3820 -0
  164. package/Build/Workers/chunk-RYSQVJR6.js +398 -0
  165. package/Build/Workers/chunk-S6RJU5NM.js +1054 -0
  166. package/Build/Workers/chunk-SA2A2AN5.js +2342 -0
  167. package/Build/Workers/chunk-SDFHDNS4.js +147 -0
  168. package/Build/Workers/chunk-SF6K72D7.js +124 -0
  169. package/Build/Workers/chunk-SGRGNDOD.js +682 -0
  170. package/Build/Workers/{chunk-QRWGUWI6.js → chunk-SJYSIOEM.js} +11 -11
  171. package/Build/Workers/chunk-SM2CDCYF.js +198 -0
  172. package/Build/Workers/chunk-SMTGMFBL.js +97 -0
  173. package/Build/Workers/chunk-SS5ABQGY.js +102 -0
  174. package/Build/Workers/{chunk-IYOUHCZB.js → chunk-SXSP3JHS.js} +1 -1
  175. package/Build/Workers/chunk-T5QBPLE3.js +414 -0
  176. package/Build/Workers/chunk-TN35HP5B.js +1067 -0
  177. package/Build/Workers/chunk-TNWKJNUZ.js +454 -0
  178. package/Build/Workers/chunk-TOAF47AQ.js +102 -0
  179. package/Build/Workers/chunk-TQ4QCOXT.js +2719 -0
  180. package/Build/Workers/chunk-TSDSILQB.js +124 -0
  181. package/Build/Workers/chunk-TVZD72WJ.js +778 -0
  182. package/Build/Workers/chunk-U5LV3F3Z.js +1054 -0
  183. package/Build/Workers/chunk-UAZUP4I5.js +1992 -0
  184. package/Build/Workers/chunk-UEY73NRN.js +38 -0
  185. package/Build/Workers/chunk-UF46SZEZ.js +789 -0
  186. package/Build/Workers/chunk-UNRTMCET.js +398 -0
  187. package/Build/Workers/chunk-UTB7U3O6.js +1992 -0
  188. package/Build/Workers/chunk-UVO6COT2.js +352 -0
  189. package/Build/Workers/chunk-V46YGZE6.js +352 -0
  190. package/Build/Workers/chunk-VAL7DYNR.js +278 -0
  191. package/Build/Workers/chunk-VDGOCROW.js +57 -0
  192. package/Build/Workers/chunk-VFWSSBPT.js +511 -0
  193. package/Build/Workers/chunk-VVYMXI3I.js +1284 -0
  194. package/Build/Workers/chunk-VXWHPYQM.js +837 -0
  195. package/Build/Workers/chunk-VXYUBRSB.js +219 -0
  196. package/Build/Workers/chunk-VZLDLEWI.js +387 -0
  197. package/Build/Workers/{chunk-4S7IE3LB.js → chunk-W5OCKMPJ.js} +2 -2
  198. package/Build/Workers/chunk-WBSY7HDY.js +837 -0
  199. package/Build/Workers/chunk-WN3F4CVG.js +3201 -0
  200. package/Build/Workers/chunk-WPRUWXGV.js +693 -0
  201. package/Build/Workers/chunk-WTO2ERBP.js +414 -0
  202. package/Build/Workers/chunk-WVHMDVG4.js +959 -0
  203. package/Build/Workers/chunk-XCBZVTIV.js +280 -0
  204. package/Build/Workers/chunk-XDWCTQCZ.js +101 -0
  205. package/Build/Workers/chunk-XGA23TAX.js +73 -0
  206. package/Build/Workers/chunk-XLQZNQ4Z.js +163 -0
  207. package/Build/Workers/chunk-XLXSDIP5.js +973 -0
  208. package/Build/Workers/chunk-XQ3SKCMM.js +140 -0
  209. package/Build/Workers/chunk-XQH66YJC.js +147 -0
  210. package/Build/Workers/chunk-XTA7BXJG.js +682 -0
  211. package/Build/Workers/chunk-XTIDAFRS.js +476 -0
  212. package/Build/Workers/chunk-XUEDWBUD.js +682 -0
  213. package/Build/Workers/chunk-XYFLRH3H.js +124 -0
  214. package/Build/Workers/chunk-Y7JRTRTO.js +305 -0
  215. package/Build/Workers/chunk-Y7QSMDCJ.js +352 -0
  216. package/Build/Workers/chunk-YCB5TYTR.js +1483 -0
  217. package/Build/Workers/chunk-YEYOSTJX.js +219 -0
  218. package/Build/Workers/chunk-YGFVAGYF.js +630 -0
  219. package/Build/Workers/chunk-YIIACKQO.js +368 -0
  220. package/Build/Workers/chunk-YJGSP6PE.js +511 -0
  221. package/Build/Workers/{chunk-XZMBNNDX.js → chunk-YKU2Q3A2.js} +9 -9
  222. package/Build/Workers/chunk-Z4LR5EHE.js +454 -0
  223. package/Build/Workers/chunk-Z66EVE2A.js +44 -0
  224. package/Build/Workers/chunk-ZHIHHHTB.js +414 -0
  225. package/Build/Workers/chunk-ZMBHFYOX.js +1344 -0
  226. package/Build/Workers/chunk-ZNWHFSLE.js +171 -0
  227. package/Build/Workers/chunk-ZQLZG4IN.js +2342 -0
  228. package/Build/Workers/chunk-ZRTSMUZ2.js +414 -0
  229. package/Build/Workers/{chunk-MPZHGZU6.js → chunk-ZSGUV73H.js} +4 -4
  230. package/Build/Workers/chunk-ZZUVT5BM.js +476 -0
  231. package/Build/Workers/combineGeometry.js +24 -24
  232. package/Build/Workers/createBoxGeometry.js +18 -18
  233. package/Build/Workers/createBoxOutlineGeometry.js +16 -16
  234. package/Build/Workers/createCircleGeometry.js +26 -26
  235. package/Build/Workers/createCircleOutlineGeometry.js +19 -19
  236. package/Build/Workers/createCoplanarPolygonGeometry.js +35 -35
  237. package/Build/Workers/createCoplanarPolygonOutlineGeometry.js +31 -31
  238. package/Build/Workers/createCorridorGeometry.js +31 -33
  239. package/Build/Workers/createCorridorOutlineGeometry.js +29 -31
  240. package/Build/Workers/createCylinderGeometry.js +20 -20
  241. package/Build/Workers/createCylinderOutlineGeometry.js +18 -18
  242. package/Build/Workers/createEllipseGeometry.js +26 -26
  243. package/Build/Workers/createEllipseOutlineGeometry.js +19 -19
  244. package/Build/Workers/createEllipsoidGeometry.js +19 -19
  245. package/Build/Workers/createEllipsoidOutlineGeometry.js +18 -18
  246. package/Build/Workers/createFrustumGeometry.js +18 -18
  247. package/Build/Workers/createFrustumOutlineGeometry.js +18 -18
  248. package/Build/Workers/createGeometry.js +24 -24
  249. package/Build/Workers/createGroundPolylineGeometry.js +24 -24
  250. package/Build/Workers/createPlaneGeometry.js +16 -16
  251. package/Build/Workers/createPlaneOutlineGeometry.js +15 -15
  252. package/Build/Workers/createPolygonGeometry.js +34 -34
  253. package/Build/Workers/createPolygonOutlineGeometry.js +31 -31
  254. package/Build/Workers/createPolylineGeometry.js +26 -26
  255. package/Build/Workers/createPolylineVolumeGeometry.js +31 -31
  256. package/Build/Workers/createPolylineVolumeOutlineGeometry.js +27 -27
  257. package/Build/Workers/createRectangleGeometry.js +27 -27
  258. package/Build/Workers/createRectangleOutlineGeometry.js +21 -21
  259. package/Build/Workers/createSimplePolylineGeometry.js +24 -24
  260. package/Build/Workers/createSphereGeometry.js +19 -19
  261. package/Build/Workers/createSphereOutlineGeometry.js +18 -18
  262. package/Build/Workers/createTaskProcessorWorker.js +3 -3
  263. package/Build/Workers/createVectorTileClampedPolylines.js +14 -14
  264. package/Build/Workers/createVectorTileGeometries.js +24 -24
  265. package/Build/Workers/createVectorTilePoints.js +13 -13
  266. package/Build/Workers/createVectorTilePolygons.js +22 -22
  267. package/Build/Workers/createVectorTilePolylines.js +14 -14
  268. package/Build/Workers/createVerticesFromCesium3DTilesTerrain.js +25 -25
  269. package/Build/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +22 -22
  270. package/Build/Workers/createVerticesFromHeightmap.js +22 -22
  271. package/Build/Workers/createVerticesFromQuantizedTerrainMesh.js +20 -20
  272. package/Build/Workers/createWallGeometry.js +24 -24
  273. package/Build/Workers/createWallOutlineGeometry.js +24 -24
  274. package/Build/Workers/decodeDraco.js +10 -10
  275. package/Build/Workers/decodeGoogleEarthEnterprisePacket.js +987 -2320
  276. package/Build/Workers/decodeI3S.js +10 -10
  277. package/Build/Workers/gaussianSplatSorter.js +4 -4
  278. package/Build/Workers/gaussianSplatTextureGenerator.js +4 -4
  279. package/Build/Workers/incrementallyBuildTerrainPicker.js +10 -10
  280. package/Build/Workers/transcodeKTX2.js +6 -6
  281. package/Build/Workers/transferTypedArrayTest.js +1 -1
  282. package/Build/Workers/upsampleQuantizedTerrainMesh.js +22 -22
  283. package/Build/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +25 -25
  284. package/Source/Core/ArcGISTiledElevationTerrainProvider.js +1 -5
  285. package/Source/Core/BoundingRectangle.js +6 -8
  286. package/Source/Core/BoundingSphere.js +0 -3
  287. package/Source/Core/Cesium3DTilesTerrainGeometryProcessor.js +3 -4
  288. package/Source/Core/Color.js +1 -0
  289. package/Source/Core/CoplanarPolygonGeometry.js +2 -2
  290. package/Source/Core/CorridorGeometry.js +2 -4
  291. package/Source/Core/CorridorOutlineGeometry.js +1 -3
  292. package/Source/Core/EarthOrientationParameters.js +2 -2
  293. package/Source/Core/EllipseGeometryLibrary.js +2 -2
  294. package/Source/Core/EllipsoidGeodesic.js +3 -3
  295. package/Source/Core/EllipsoidRhumbLine.js +1 -1
  296. package/Source/Core/GroundPolylineGeometry.js +2 -2
  297. package/Source/Core/Heap.js +1 -1
  298. package/Source/Core/HermitePolynomialApproximation.js +215 -179
  299. package/Source/Core/InterpolationAlgorithm.js +58 -50
  300. package/Source/Core/Ion.js +1 -1
  301. package/Source/Core/JulianDate.js +1 -1
  302. package/Source/Core/LagrangePolynomialApproximation.js +55 -52
  303. package/Source/Core/LinearApproximation.js +69 -66
  304. package/Source/Core/Math.js +59 -0
  305. package/Source/Core/Matrix2.js +2 -2
  306. package/Source/Core/Matrix3.js +2 -2
  307. package/Source/Core/OrthographicFrustum.js +1 -1
  308. package/Source/Core/PerspectiveFrustum.js +1 -1
  309. package/Source/Core/PolygonGeometry.js +2 -2
  310. package/Source/Core/PolygonGeometryLibrary.js +1 -1
  311. package/Source/Core/PolygonOutlineGeometry.js +1 -1
  312. package/Source/Core/PolylineGeometry.js +1 -1
  313. package/Source/Core/PolylineVolumeGeometryLibrary.js +1 -1
  314. package/Source/Core/Rectangle.js +7 -1
  315. package/Source/Core/RectangleOutlineGeometry.js +1 -1
  316. package/Source/Core/SimplePolylineGeometry.js +1 -1
  317. package/Source/Core/TerrainEncoding.js +2 -2
  318. package/Source/Core/TerrainMesh.js +3 -3
  319. package/Source/Core/TerrainPicker.js +180 -168
  320. package/Source/Core/TimeIntervalCollection.js +1 -3
  321. package/Source/Core/Tipsify.js +1 -1
  322. package/Source/Core/Transforms.js +5 -1
  323. package/Source/Core/VectorPipeline.js +1117 -0
  324. package/Source/Core/VectorProvider.js +429 -0
  325. package/Source/Core/WallOutlineGeometry.js +1 -1
  326. package/Source/Core/getTimestamp.js +4 -2
  327. package/Source/Core/writeTextToCanvas.js +1 -0
  328. package/Source/DataSources/CompositeEntityCollection.js +0 -1
  329. package/Source/DataSources/CzmlDataSource.js +14 -0
  330. package/Source/DataSources/DataSourceDisplay.js +1 -1
  331. package/Source/DataSources/GeoJsonDataSource.js +0 -1
  332. package/Source/DataSources/GeometryVisualizer.js +1 -1
  333. package/Source/DataSources/KmlDataSource.js +529 -557
  334. package/Source/DataSources/PathGraphics.js +8 -1
  335. package/Source/DataSources/PathMode.js +27 -0
  336. package/Source/DataSources/PathVisualizer.js +298 -1
  337. package/Source/DataSources/PolylineVisualizer.js +1 -1
  338. package/Source/DataSources/StaticOutlineGeometryBatch.js +1 -1
  339. package/Source/Renderer/AutomaticUniforms.js +23 -0
  340. package/Source/Renderer/Context.js +9 -3
  341. package/Source/Renderer/DrawCommand.js +22 -0
  342. package/Source/Renderer/Framebuffer.js +4 -0
  343. package/Source/Renderer/Pass.js +11 -10
  344. package/Source/Renderer/Texture.js +12 -1
  345. package/Source/Renderer/UniformState.js +7 -0
  346. package/Source/Renderer/VertexArray.js +1 -1
  347. package/Source/Scene/ArcGisMapServerImageryProvider.js +0 -5
  348. package/Source/Scene/ArcGisMapService.js +1 -1
  349. package/Source/Scene/Billboard.js +2 -1
  350. package/Source/Scene/BillboardCollection.js +7 -3
  351. package/Source/Scene/BillboardTexture.js +5 -3
  352. package/Source/Scene/BufferPrimitiveCollection.js +27 -5
  353. package/Source/Scene/Camera.js +71 -5
  354. package/Source/Scene/Cesium3DTileOptimizations.js +4 -6
  355. package/Source/Scene/Cesium3DTileset.js +1 -1
  356. package/Source/Scene/ClippingPlaneCollection.js +4 -4
  357. package/Source/Scene/ClippingPolygon.js +2 -0
  358. package/Source/Scene/ClippingPolygonCollection.js +2 -2
  359. package/Source/Scene/Controllers/Controller.js +63 -0
  360. package/Source/Scene/Controllers/ControllerHost.js +78 -0
  361. package/Source/Scene/Controllers/HybridScreenSpacePanCameraController.js +106 -0
  362. package/Source/Scene/Controllers/MouseButton.js +32 -0
  363. package/Source/Scene/Controllers/ScreenSpaceElevatorCameraController.js +295 -0
  364. package/Source/Scene/Controllers/ScreenSpaceInputBindings.js +154 -0
  365. package/Source/Scene/Controllers/ScreenSpaceMapCameraController.js +310 -0
  366. package/Source/Scene/Controllers/ScreenSpaceTiltOrbitCameraController.js +642 -0
  367. package/Source/Scene/Controllers/ScreenSpaceZoomCameraController.js +431 -0
  368. package/Source/Scene/Controllers/defaultPickWorldPosition.js +84 -0
  369. package/Source/Scene/DerivedCommand.js +98 -0
  370. package/Source/Scene/EdgeFramebuffer.js +1 -5
  371. package/Source/Scene/Expression.js +6 -8
  372. package/Source/Scene/FrameState.js +17 -0
  373. package/Source/Scene/Globe.js +20 -0
  374. package/Source/Scene/GlobeDepth.js +27 -1
  375. package/Source/Scene/GlobeSurfaceShaderSet.js +511 -409
  376. package/Source/Scene/GlobeSurfaceTile.js +575 -398
  377. package/Source/Scene/GlobeSurfaceTileProvider.js +1382 -1151
  378. package/Source/Scene/GltfBufferViewLoader.js +3 -3
  379. package/Source/Scene/GltfLoader.js +33 -3
  380. package/Source/Scene/GltfLoaderUtil.js +20 -4
  381. package/Source/Scene/GltfPipeline/forEachTextureInMaterial.js +10 -0
  382. package/Source/Scene/GltfPipeline/removeUnusedElements.js +21 -11
  383. package/Source/Scene/GltfSpzLoader.js +1 -1
  384. package/Source/Scene/GltfVertexBufferLoader.js +6 -3
  385. package/Source/Scene/I3SDataProvider.js +1 -1
  386. package/Source/Scene/I3SLayer.js +1 -1
  387. package/Source/Scene/I3SNode.js +2 -2
  388. package/Source/Scene/ImageryLayer.js +2 -2
  389. package/Source/Scene/ImageryLayerCollection.js +190 -6
  390. package/Source/Scene/IonImageryProvider.js +1 -5
  391. package/Source/Scene/Label.js +4 -4
  392. package/Source/Scene/LabelCollection.js +1 -1
  393. package/Source/Scene/MVTDataProvider.js +2 -0
  394. package/Source/Scene/Material.js +1 -0
  395. package/Source/Scene/Model/B3dmLoader.js +1 -2
  396. package/Source/Scene/Model/EdgeVisibilityPipelineStage.js +10 -8
  397. package/Source/Scene/Model/Extensions/Gpm/GltfGpmLoader.js +4 -0
  398. package/Source/Scene/Model/I3dmLoader.js +1 -1
  399. package/Source/Scene/Model/InstancingPipelineStage.js +4 -7
  400. package/Source/Scene/Model/MaterialPipelineStage.js +124 -1
  401. package/Source/Scene/Model/Model.js +11 -10
  402. package/Source/Scene/Model/ModelClippingPlanesPipelineStage.js +28 -1
  403. package/Source/Scene/Model/ModelDrawCommand.js +160 -16
  404. package/Source/Scene/Model/ModelDrawCommands.js +4 -0
  405. package/Source/Scene/Model/ModelSceneGraph.js +21 -0
  406. package/Source/Scene/Model/ModelUtility.js +1 -0
  407. package/Source/Scene/Model/PickingPipelineStage.js +29 -0
  408. package/Source/Scene/Model/PrimitiveRenderResources.js +24 -0
  409. package/Source/Scene/ModelComponents.js +71 -0
  410. package/Source/Scene/Picking.js +19 -3
  411. package/Source/Scene/PlanarFillIdFramebuffer.js +172 -0
  412. package/Source/Scene/PntsParser.js +1 -1
  413. package/Source/Scene/PolylineCollection.js +1 -1
  414. package/Source/Scene/PostProcessStage.js +4 -2
  415. package/Source/Scene/QuadtreePrimitive.js +3 -2
  416. package/Source/Scene/ResourceCache.js +7 -4
  417. package/Source/Scene/ResourceCacheKey.js +21 -18
  418. package/Source/Scene/Scene.js +203 -5
  419. package/Source/Scene/ScreenSpaceCameraController.js +1 -2
  420. package/Source/Scene/ShadowMap.js +9 -3
  421. package/Source/Scene/ShadowMapShader.js +50 -2
  422. package/Source/Scene/SnapFramebuffer.js +121 -0
  423. package/Source/Scene/Snapping.js +184 -0
  424. package/Source/Scene/TerrainFillMesh.js +3 -2
  425. package/Source/Scene/UrlTemplate3DTilesDataProvider.js +1 -1
  426. package/Source/Scene/Vector3DTileContent.js +2 -3
  427. package/Source/Scene/VectorGltf3DTileContent.js +23 -3
  428. package/Source/Scene/View.js +10 -8
  429. package/Source/Scene/VoxelTraversal.js +1 -1
  430. package/Source/Scene/createElevationBandMaterial.js +1 -1
  431. package/Source/Scene/findMeshoptExtension.js +23 -0
  432. package/Source/Scene/renderBufferPointCollection.js +14 -10
  433. package/Source/Scene/renderBufferPolygonCollection.js +10 -15
  434. package/Source/Scene/renderBufferPolylineCollection.js +121 -194
  435. package/Source/Shaders/Builtin/Constants/passCesium3DTile.glsl +1 -1
  436. package/Source/Shaders/Builtin/Constants/passCesium3DTile.js +1 -1
  437. package/Source/Shaders/Builtin/Constants/passCesium3DTileClassification.glsl +1 -1
  438. package/Source/Shaders/Builtin/Constants/passCesium3DTileClassification.js +1 -1
  439. package/Source/Shaders/Builtin/Constants/passCesium3DTileClassificationIgnoreShow.glsl +1 -1
  440. package/Source/Shaders/Builtin/Constants/passCesium3DTileClassificationIgnoreShow.js +1 -1
  441. package/Source/Shaders/Builtin/Constants/passCesium3DTilePlanarFillId.glsl +9 -0
  442. package/Source/Shaders/Builtin/Constants/passCesium3DTilePlanarFillId.js +11 -0
  443. package/Source/Shaders/Builtin/Constants/passClassification.glsl +1 -1
  444. package/Source/Shaders/Builtin/Constants/passClassification.js +1 -1
  445. package/Source/Shaders/Builtin/Constants/passGaussianSplats.glsl +1 -1
  446. package/Source/Shaders/Builtin/Constants/passGaussianSplats.js +1 -1
  447. package/Source/Shaders/Builtin/Constants/passOpaque.glsl +1 -1
  448. package/Source/Shaders/Builtin/Constants/passOpaque.js +1 -1
  449. package/Source/Shaders/Builtin/Constants/passTranslucent.glsl +1 -1
  450. package/Source/Shaders/Builtin/Constants/passTranslucent.js +1 -1
  451. package/Source/Shaders/Builtin/Constants/passVoxels.glsl +1 -1
  452. package/Source/Shaders/Builtin/Constants/passVoxels.js +1 -1
  453. package/Source/Shaders/Builtin/CzmBuiltins.js +2 -0
  454. package/Source/Shaders/GlobeFS.glsl +10 -5
  455. package/Source/Shaders/GlobeFS.js +9 -5
  456. package/Source/Shaders/Materials/PolylineGlowMaterial.glsl +1 -1
  457. package/Source/Shaders/Materials/PolylineGlowMaterial.js +1 -1
  458. package/Source/Shaders/Model/MaterialStageFS.glsl +8 -2
  459. package/Source/Shaders/Model/MaterialStageFS.js +8 -2
  460. package/Source/Shaders/Model/ModelFS.glsl +105 -0
  461. package/Source/Shaders/Model/ModelFS.js +105 -0
  462. package/Source/Shaders/VectorCommon.glsl +178 -0
  463. package/Source/Shaders/VectorCommon.js +75 -0
  464. package/Source/ThirdParty/Workers/zip-web-worker.js +1 -1
  465. package/Source/ThirdParty/zip-module.wasm +0 -0
  466. package/Source/Widget/CesiumWidget.js +30 -0
  467. package/Source/Workers/decodeGoogleEarthEnterprisePacket.js +2 -2
  468. package/Source/Workers/incrementallyBuildTerrainPicker.js +2 -0
  469. package/index.d.ts +825 -260
  470. package/index.js +29 -10
  471. package/package.json +4 -4
@@ -276,15 +276,17 @@ function generateEdgeFaceNormals(edgeIndices, edgeData, edgeVisibility) {
276
276
  // No silhouette edges in this primitive, the shader only checks normals for SILHOUETTE edges.
277
277
  return edgeFaceNormals;
278
278
  }
279
- const silhouetteNormalsFloat = new Float32Array(raw.length * 3);
279
+ // raw is a packed typed array (x0,y0,z0, x1,y1,z1, ...) of float, byte, or
280
+ // short components. The vectors are normalized below, which cancels the
281
+ // quantization scale, so raw components can be used directly for all three.
282
+ const normalCount = raw.length / 3;
283
+ const silhouetteNormalsFloat = new Float32Array(raw.length);
280
284
  const scratchNormal = new Cartesian3();
281
285
 
282
- for (let i = 0; i < raw.length; i++) {
283
- const vec3 = raw[i];
284
- // Signed byte float: map [-128,127] → [-1,1]
285
- scratchNormal.x = 2 * ((vec3.x + 128) / 255) - 1;
286
- scratchNormal.y = 2 * ((vec3.y + 128) / 255) - 1;
287
- scratchNormal.z = 2 * ((vec3.z + 128) / 255) - 1;
286
+ for (let i = 0; i < normalCount; i++) {
287
+ scratchNormal.x = raw[i * 3];
288
+ scratchNormal.y = raw[i * 3 + 1];
289
+ scratchNormal.z = raw[i * 3 + 2];
288
290
 
289
291
  if (Cartesian3.magnitudeSquared(scratchNormal) > 0) {
290
292
  Cartesian3.normalize(scratchNormal, scratchNormal);
@@ -609,7 +611,7 @@ function collectVertexColors(runtimePrimitive) {
609
611
  * @param {number} edgeOtherPosLocation Shader attribute location for the other endpoint position
610
612
  * @param {number} edgeOffsetLocation Shader attribute location for edge offset (-1 or +1)
611
613
  * @param {VertexColorInfo} [vertexColorInfo] Packed per-vertex colors (optional)
612
- * @param {Object} edgeVisibility Edge visibility extension object (may contain silhouetteNormals[])
614
+ * @param {Object} edgeVisibility Edge visibility extension object (may contain silhouetteNormals, a packed typed array of VEC3 components)
613
615
  * @param {Float32Array} edgeFaceNormals Packed face normals (6 floats per edge)
614
616
  * @param {Object} [cumDistAttribute] Cumulative distance attribute
615
617
  * @param {number} [edgeCumDistLocation] Cumulative distance location
@@ -30,6 +30,7 @@ function GltfGpmLoader() {}
30
30
  *
31
31
  * @param {number[]} array The input array
32
32
  * @returns {Matrix3} The Matrix3
33
+ * @ignore
33
34
  */
34
35
  function createCovarianceMatrixFromUpperTriangle(array) {
35
36
  const covarianceMatrix = new Matrix3(
@@ -51,6 +52,7 @@ function createCovarianceMatrixFromUpperTriangle(array) {
51
52
  *
52
53
  * @param {object} anchorPointDirectJson The input JSON
53
54
  * @returns {AnchorPointDirect} The direct anchor point
55
+ * @ignore
54
56
  */
55
57
  function createAnchorPointDirect(anchorPointDirectJson) {
56
58
  const position = Cartesian3.fromArray(
@@ -75,6 +77,7 @@ function createAnchorPointDirect(anchorPointDirectJson) {
75
77
  *
76
78
  * @param {object} anchorPointIndirectJson The input JSON
77
79
  * @returns {AnchorPointIndirect} The indirect anchor point
80
+ * @ignore
78
81
  */
79
82
  function createAnchorPointIndirect(anchorPointIndirectJson) {
80
83
  const position = Cartesian3.fromArray(
@@ -103,6 +106,7 @@ function createAnchorPointIndirect(anchorPointIndirectJson) {
103
106
  *
104
107
  * @param {object} correlationGroupJson The input JSON
105
108
  * @returns {CorrelationGroup} The correlation group
109
+ * @ignore
106
110
  */
107
111
  function createCorrelationGroup(correlationGroupJson) {
108
112
  const groupFlags = correlationGroupJson.groupFlags;
@@ -407,7 +407,7 @@ function createInstances(loader, components, frameState) {
407
407
  const featureIdArray = new Float32Array(instancesLength);
408
408
 
409
409
  const instancePositions = Cartesian3.unpackArray(translationTypedArray);
410
- let instancePosition = new Cartesian3();
410
+ let instancePosition;
411
411
 
412
412
  const instanceNormalRight = new Cartesian3();
413
413
  const instanceNormalUp = new Cartesian3();
@@ -294,13 +294,13 @@ function getModelMatrixAndNodeTransform(
294
294
  const instances = renderResources.runtimeNode.node.instances;
295
295
  if (instances.transformInWorldSpace) {
296
296
  // Replicate the multiplication order in LegacyInstancingStageVS.
297
- modelMatrix = Matrix4.multiplyTransformation(
297
+ Matrix4.multiplyTransformation(
298
298
  model.modelMatrix,
299
299
  sceneGraph.components.transform,
300
300
  modelMatrix,
301
301
  );
302
302
 
303
- nodeComputedTransform = Matrix4.multiplyTransformation(
303
+ Matrix4.multiplyTransformation(
304
304
  sceneGraph.axisCorrectionMatrix,
305
305
  renderResources.runtimeNode.computedTransform,
306
306
  nodeComputedTransform,
@@ -308,16 +308,13 @@ function getModelMatrixAndNodeTransform(
308
308
  } else {
309
309
  // The node transform should be pre-multiplied with the instancing transform.
310
310
  modelMatrix = Matrix4.clone(sceneGraph.computedModelMatrix, modelMatrix);
311
- modelMatrix = Matrix4.multiplyTransformation(
311
+ Matrix4.multiplyTransformation(
312
312
  modelMatrix,
313
313
  renderResources.runtimeNode.computedTransform,
314
314
  modelMatrix,
315
315
  );
316
316
 
317
- nodeComputedTransform = Matrix4.clone(
318
- Matrix4.IDENTITY,
319
- nodeComputedTransform,
320
- );
317
+ Matrix4.clone(Matrix4.IDENTITY, nodeComputedTransform);
321
318
  }
322
319
  }
323
320
 
@@ -170,13 +170,28 @@ MaterialPipelineStage.process = function (
170
170
  const disablePointCloudNormals =
171
171
  defined(model.pointCloudShading) && !model.pointCloudShading.normalShading;
172
172
 
173
+ if (defined(material.planarFill)) {
174
+ processPlanarFill(
175
+ material.planarFill,
176
+ primitive,
177
+ renderResources,
178
+ frameState,
179
+ );
180
+ }
181
+
182
+ // When backgroundFill is true (BENTLEY_materials_planar_fill), the primitive
183
+ // must be unlit so it matches the background color exactly.
184
+ const hasBackgroundFill =
185
+ defined(material.planarFill) && material.planarFill.backgroundFill;
186
+
173
187
  // Classification models will be rendered as unlit.
174
188
  const lightingOptions = renderResources.lightingOptions;
175
189
  if (
176
190
  material.unlit ||
177
191
  !hasNormals ||
178
192
  hasClassification ||
179
- disablePointCloudNormals
193
+ disablePointCloudNormals ||
194
+ hasBackgroundFill
180
195
  ) {
181
196
  lightingOptions.lightingModel = LightingModel.UNLIT;
182
197
  } else {
@@ -232,6 +247,114 @@ MaterialPipelineStage.process = function (
232
247
  }
233
248
  };
234
249
 
250
+ /**
251
+ * Add uniforms and defines for the BENTLEY_materials_planar_fill extension.
252
+ *
253
+ * Per the BENTLEY_materials_planar_fill spec:
254
+ * <ul>
255
+ * <li>ALL planar primitives must render in front of non-planar (Depth Ordering).</li>
256
+ * <li><code>behind</code> fills must render behind coplanar geometry from the SAME
257
+ * logical object only (same feature ID from EXT_mesh_features).</li>
258
+ * </ul>
259
+ *
260
+ * Instead of using fixed polygon offset units (which don't scale well with
261
+ * logarithmic depth), we use proportional depth scaling in the shader.
262
+ * This approach matches the edge visibility system and scales naturally
263
+ * at all viewing distances.
264
+ *
265
+ * @param {ModelComponents.PlanarFill} planarFill The planar fill properties of the material
266
+ * @param {ModelComponents.Primitive} primitive The primitive to be rendered
267
+ * @param {PrimitiveRenderResources} renderResources The render resources for the primitive
268
+ * @param {FrameState} frameState The frame state.
269
+ * @private
270
+ */
271
+ function processPlanarFill(planarFill, primitive, renderResources, frameState) {
272
+ const { uniformMap, shaderBuilder } = renderResources;
273
+
274
+ // Signal to Scene that the planar fill ID framebuffer is needed.
275
+ frameState.planarFillRequested = true;
276
+
277
+ // All planar fills get a proportional depth pull toward camera. Behind fills
278
+ // additionally sample the planar fill ID texture to test same-feature; if so,
279
+ // they apply a small proportional push to sit behind non-behind geometry.
280
+ shaderBuilder.addDefine(
281
+ "HAS_PLANAR_FILL_DEPTH",
282
+ undefined,
283
+ ShaderDestination.FRAGMENT,
284
+ );
285
+
286
+ // Configure background fill for BENTLEY_materials_planar_fill extension.
287
+ // When backgroundFill is true, the fill is rendered using the view's background color
288
+ // to create an invisible masking polygon. Lighting is forced to unlit in process().
289
+ //
290
+ // NOTE: The wireframeFill property from BENTLEY_materials_planar_fill is intentionally
291
+ // not handled here. CesiumJS does not yet have a proper wireframe rendering mode
292
+ // (debugWireframe is not a true wireframe mode), so wireframeFill is loaded as a NO-OP.
293
+ // When a proper wireframe mode is added to CesiumJS, wireframeFill support should be
294
+ // implemented here to control fill visibility in that mode. See
295
+ // https://github.com/CesiumGS/cesium/issues/13620.
296
+ if (planarFill.backgroundFill) {
297
+ shaderBuilder.addDefine(
298
+ "HAS_BACKGROUND_FILL",
299
+ undefined,
300
+ ShaderDestination.FRAGMENT,
301
+ );
302
+ }
303
+
304
+ const hasFeatureIds =
305
+ defined(primitive.featureIds) && primitive.featureIds.length > 0;
306
+ if (!hasFeatureIds) {
307
+ return;
308
+ }
309
+
310
+ // "Same logical object" is implementation-defined per the spec; this
311
+ // implementation uses the primitive's first feature ID set. Primitives
312
+ // without feature IDs (checked above) don't participate in the
313
+ // behind-fill same-object test.
314
+ const featureIdMember = primitive.featureIds[0].positionalLabel;
315
+ shaderBuilder.addDefine(
316
+ "PLANAR_FILL_FEATURE_ID",
317
+ featureIdMember,
318
+ ShaderDestination.FRAGMENT,
319
+ );
320
+
321
+ if (planarFill.behind) {
322
+ // Behind fills READ the planar fill ID texture to test whether the
323
+ // pixel they cover belongs to the same logical object.
324
+ shaderBuilder.addDefine(
325
+ "HAS_PLANAR_FILL_BEHIND",
326
+ undefined,
327
+ ShaderDestination.FRAGMENT,
328
+ );
329
+ } else {
330
+ // Non-behind fills WRITE their feature IDs to the planar fill ID
331
+ // texture in a pre-pass so behind fills can test same-object
332
+ // coplanarity. Mark this primitive for the pre-pass derived command.
333
+ renderResources.planarFillIdPass = true;
334
+
335
+ // Add a define so that during the pre-pass the shader outputs
336
+ // the feature ID instead of the normal color.
337
+ shaderBuilder.addDefine(
338
+ "HAS_PLANAR_FILL_ID_PASS",
339
+ undefined,
340
+ ShaderDestination.FRAGMENT,
341
+ );
342
+
343
+ // Runtime uniform to distinguish the pre-pass from the main pass
344
+ // (same shader program serves both commands). This default returns false
345
+ // for the main command; the derived pre-pass command overrides it to
346
+ // return true (see derivePlanarFillIdCommand in ModelDrawCommand.js).
347
+ shaderBuilder.addUniform(
348
+ "bool",
349
+ "u_isPlanarFillIdPass",
350
+ ShaderDestination.FRAGMENT,
351
+ );
352
+ uniformMap.u_isPlanarFillIdPass = function () {
353
+ return false;
354
+ };
355
+ }
356
+ }
357
+
235
358
  /**
236
359
  * Process constant LOD extension for a texture
237
360
  *
@@ -73,7 +73,7 @@ import ModelImagery from "./ModelImagery.js";
73
73
  * {@link https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Vendor/EXT_mesh_gpu_instancing|EXT_mesh_gpu_instancing}
74
74
  * </li>
75
75
  * <li>
76
- * {@link https://github.com/KhronosGroup/glTF/pull/2514|EXT_mesh_primitive_restart}
76
+ * {@link https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Vendor/EXT_mesh_primitive_restart|EXT_mesh_primitive_restart}
77
77
  * </li>
78
78
  * <li>
79
79
  * {@link https://github.com/KhronosGroup/glTF/pull/2479|EXT_mesh_primitive_edge_visibility}
@@ -105,9 +105,16 @@ import ModelImagery from "./ModelImagery.js";
105
105
  * {@link https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit/README.md|KHR_materials_unlit}
106
106
  * </li>
107
107
  * <li>
108
+ * {@link https://github.com/KhronosGroup/glTF/pull/2569|KHR_mesh_primitive_restart}
109
+ * (requires a WebGL 2 context; behavior on WebGL 1 is undefined)
110
+ * </li>
111
+ * <li>
108
112
  * {@link https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_mesh_quantization|KHR_mesh_quantization}
109
113
  * </li>
110
114
  * <li>
115
+ * {@link https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_meshopt_compression|KHR_meshopt_compression}
116
+ * </li>
117
+ * <li>
111
118
  * {@link https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_texture_basisu|KHR_texture_basisu}
112
119
  * </li>
113
120
  * <li>
@@ -266,6 +273,7 @@ function Model(options) {
266
273
  */
267
274
  this.referenceMatrix = undefined;
268
275
  this._iblReferenceFrameMatrix = Matrix3.clone(Matrix3.IDENTITY); // Derived from reference matrix and the current view matrix
276
+ this._clippingPlanesMatrix = Matrix4.clone(Matrix4.IDENTITY); // Derived from the reference matrix and the clipping planes' own model matrix
269
277
 
270
278
  this._resourcesLoaded = false;
271
279
  this._drawCommandsBuilt = false;
@@ -377,7 +385,6 @@ function Model(options) {
377
385
  this._clippingPlanes = clippingPlanes;
378
386
  }
379
387
  this._clippingPlanesState = 0; // If this value changes, the shaders need to be regenerated.
380
- this._clippingPlanesMatrix = Matrix4.clone(Matrix4.IDENTITY); // Derived from reference matrix and the current view matrix
381
388
 
382
389
  // If the given clipping polygons don't have an owner, make this model its owner.
383
390
  // Otherwise, the clipping polygons are passed down from a tileset.
@@ -2476,16 +2483,10 @@ function updateReferenceMatrices(model, frameState) {
2476
2483
  );
2477
2484
 
2478
2485
  if (model.isClippingEnabled()) {
2479
- let clippingPlanesMatrix = scratchClippingPlanesMatrix;
2480
- clippingPlanesMatrix = Matrix4.multiply(
2481
- context.uniformState.view3D,
2486
+ const clippingPlanesMatrix = Matrix4.multiply(
2482
2487
  referenceMatrix,
2483
- clippingPlanesMatrix,
2484
- );
2485
- clippingPlanesMatrix = Matrix4.multiply(
2486
- clippingPlanesMatrix,
2487
2488
  model._clippingPlanes.modelMatrix,
2488
- clippingPlanesMatrix,
2489
+ scratchClippingPlanesMatrix,
2489
2490
  );
2490
2491
  model._clippingPlanesMatrix = Matrix4.inverseTranspose(
2491
2492
  clippingPlanesMatrix,
@@ -2,6 +2,7 @@ import Cartesian2 from "../../Core/Cartesian2.js";
2
2
  import ClippingPlaneCollection from "../ClippingPlaneCollection.js";
3
3
  import combine from "../../Core/combine.js";
4
4
  import Color from "../../Core/Color.js";
5
+ import Matrix4 from "../../Core/Matrix4.js";
5
6
  import ModelClippingPlanesStageFS from "../../Shaders/Model/ModelClippingPlanesStageFS.js";
6
7
  import ShaderDestination from "../../Renderer/ShaderDestination.js";
7
8
 
@@ -17,6 +18,9 @@ const ModelClippingPlanesPipelineStage = {
17
18
  };
18
19
 
19
20
  const textureResolutionScratch = new Cartesian2();
21
+ const scratchClippingPlanesMatrix = new Matrix4();
22
+ const scratchClippingPlanesMatrix2 = new Matrix4();
23
+
20
24
  /**
21
25
  * Process a model. This modifies the following parts of the render resources:
22
26
  *
@@ -116,7 +120,30 @@ ModelClippingPlanesPipelineStage.process = function (
116
120
  return style;
117
121
  },
118
122
  model_clippingPlanesMatrix: function () {
119
- return model._clippingPlanesMatrix;
123
+ // The clipping planes matrix is factored into a view-dependent and a
124
+ // view-independent part:
125
+ // inverseTranspose(view3D * reference * clipping)
126
+ // = transpose(inverseView3D) * inverseTranspose(reference * clipping).
127
+ //
128
+ // The view-dependent part, transpose(inverseView3D), reuses inverseView3D
129
+ // already maintained on UniformState. Since it uses the active view, this is
130
+ // also correct in the shadow cast pass, where inverseView3D is the light's
131
+ // view rather than the camera's. Only a transpose is needed here, no inverse.
132
+ const inverseViewTranspose = Matrix4.transpose(
133
+ context.uniformState.inverseView3D,
134
+ scratchClippingPlanesMatrix,
135
+ );
136
+ // The view-independent part, inverseTranspose(reference * clipping), is
137
+ // computed once per frame in Model.updateReferenceMatrices.
138
+ //
139
+ // This recomputes the same product for every primitive of a model within
140
+ // a pass. If it ever shows up in profiling, see the discussion of
141
+ // alternatives in https://github.com/CesiumGS/cesium/pull/13388.
142
+ return Matrix4.multiply(
143
+ inverseViewTranspose,
144
+ model._clippingPlanesMatrix,
145
+ scratchClippingPlanesMatrix2,
146
+ );
120
147
  },
121
148
  };
122
149
 
@@ -103,6 +103,9 @@ function ModelDrawCommand(options) {
103
103
  this._needsSkipLevelOfDetailCommands = needsSkipLevelOfDetailCommands;
104
104
  this._needsSilhouetteCommands = needsSilhouetteCommands;
105
105
  this._needsEdgeCommands = needsEdgeCommands;
106
+ // Non-behind planar fill primitives write their feature IDs in a pre-pass
107
+ // so that behind fills can test same-object coplanarity.
108
+ this._needsPlanarFillIdCommand = renderResources.planarFillIdPass;
106
109
 
107
110
  // Derived commands
108
111
  this._originalCommand = undefined;
@@ -112,6 +115,10 @@ function ModelDrawCommand(options) {
112
115
  this._silhouetteModelCommand = undefined;
113
116
  this._silhouetteColorCommand = undefined;
114
117
  this._edgeCommand = undefined;
118
+ // Snap-pass variant of the edge command, pinned at 1 px width.
119
+ // See deriveEdgeCommand.
120
+ this._edgeSnapCommand = undefined;
121
+ this._planarFillIdCommand = undefined;
115
122
 
116
123
  // All derived commands (including 2D commands)
117
124
  this._derivedCommands = [];
@@ -226,8 +233,27 @@ function initialize(drawCommand) {
226
233
 
227
234
  if (drawCommand._needsEdgeCommands) {
228
235
  const renderResources = drawCommand._primitiveRenderResources;
236
+ const edgeGeometry = renderResources.edgeGeometry;
237
+ const colorLineWidth = defined(edgeGeometry.lineWidth)
238
+ ? edgeGeometry.lineWidth
239
+ : 1.0;
240
+ // Snap-pass edge width is held at 1 px independent of the color width.
241
+ // A wider snap band results in snap wiggle: as the cursor moves
242
+ // perpendicular to an edge inside the band, the "edge pixel nearest
243
+ // the cursor" shifts, so Snapping.snap returns a slightly different
244
+ // point each frame.
245
+ const snapLineWidth = 1.0;
246
+
229
247
  drawCommand._edgeCommand = new ModelDerivedCommand({
230
- command: deriveEdgeCommand(command, renderResources, model),
248
+ command: deriveEdgeCommand(command, renderResources, colorLineWidth),
249
+ updateShadows: false,
250
+ updateBackFaceCulling: false,
251
+ updateCullFace: false,
252
+ updateDebugShowBoundingVolume: false,
253
+ });
254
+
255
+ drawCommand._edgeSnapCommand = new ModelDerivedCommand({
256
+ command: deriveEdgeCommand(command, renderResources, snapLineWidth),
231
257
  updateShadows: false,
232
258
  updateBackFaceCulling: false,
233
259
  updateCullFace: false,
@@ -235,6 +261,19 @@ function initialize(drawCommand) {
235
261
  });
236
262
 
237
263
  derivedCommands.push(drawCommand._edgeCommand);
264
+ derivedCommands.push(drawCommand._edgeSnapCommand);
265
+ }
266
+
267
+ if (drawCommand._needsPlanarFillIdCommand) {
268
+ drawCommand._planarFillIdCommand = new ModelDerivedCommand({
269
+ command: derivePlanarFillIdCommand(command),
270
+ updateShadows: false,
271
+ updateBackFaceCulling: false,
272
+ updateCullFace: false,
273
+ updateDebugShowBoundingVolume: false,
274
+ });
275
+
276
+ derivedCommands.push(drawCommand._planarFillIdCommand);
238
277
  }
239
278
  }
240
279
 
@@ -584,14 +623,6 @@ ModelDrawCommand.prototype.pushCommands = function (frameState, result) {
584
623
 
585
624
  pushCommand(result, this._originalCommand, use2D);
586
625
 
587
- // Push edge commands after the original command
588
- if (
589
- this._needsEdgeCommands &&
590
- this._model.edgeDisplayMode !== EdgeDisplayMode.SURFACES_ONLY
591
- ) {
592
- pushCommand(result, this._edgeCommand, use2D);
593
- }
594
-
595
626
  return result;
596
627
  };
597
628
 
@@ -636,15 +667,51 @@ ModelDrawCommand.prototype.pushEdgeCommands = function (frameState, result) {
636
667
  return result;
637
668
  }
638
669
 
639
- // SURFACES_ONLY mode suppresses all edge rendering
640
- if (this._model.edgeDisplayMode === EdgeDisplayMode.SURFACES_ONLY) {
670
+ const mode = this._model.edgeDisplayMode;
671
+ const passes = frameState.passes;
672
+ const use2D = shouldUse2DCommands(this, frameState);
673
+
674
+ if (passes.snap) {
675
+ // Snapping pass: route the 1 px snap variant directly into the bound
676
+ // snap framebuffer, regardless of display mode -- snapping works even
677
+ // when edges are visually suppressed (SURFACES_ONLY).
678
+ const edgeCommand = this._edgeSnapCommand;
679
+ edgeCommand.command.pass = Pass.CESIUM_3D_TILE_EDGES_DIRECT;
680
+ if (defined(edgeCommand.derivedCommand2D)) {
681
+ edgeCommand.derivedCommand2D.command.pass =
682
+ Pass.CESIUM_3D_TILE_EDGES_DIRECT;
683
+ }
684
+ pushCommand(result, edgeCommand, use2D);
685
+ return result;
686
+ }
687
+
688
+ if (passes.pick) {
689
+ // Plain pick pass: edges contribute nothing to the RGBA8 pick
690
+ // framebuffer except in EDGES_ONLY mode, where they are the only
691
+ // pickable geometry (pushCommands skips the surface command).
692
+ if (mode !== EdgeDisplayMode.EDGES_ONLY) {
693
+ return result;
694
+ }
695
+ const edgeCommand = this._edgeCommand;
696
+ edgeCommand.command.pass = Pass.CESIUM_3D_TILE_EDGES_DIRECT;
697
+ if (defined(edgeCommand.derivedCommand2D)) {
698
+ edgeCommand.derivedCommand2D.command.pass =
699
+ Pass.CESIUM_3D_TILE_EDGES_DIRECT;
700
+ }
701
+ pushCommand(result, edgeCommand, use2D);
641
702
  return result;
642
703
  }
643
704
 
644
- // Use direct pass (renders to main framebuffer) when EDGES_ONLY mode is enabled,
645
- // otherwise use MRT pass (renders to edge framebuffer for compositing)
705
+ // Color pass. SURFACES_ONLY mode suppresses all edge rendering.
706
+ if (mode === EdgeDisplayMode.SURFACES_ONLY) {
707
+ return result;
708
+ }
709
+
710
+ // Use direct pass (renders to currently bound framebuffer) when EDGES_ONLY
711
+ // mode is enabled, otherwise use MRT pass (renders to edge framebuffer for
712
+ // compositing).
646
713
  const edgePass =
647
- this._model.edgeDisplayMode === EdgeDisplayMode.EDGES_ONLY
714
+ mode === EdgeDisplayMode.EDGES_ONLY
648
715
  ? Pass.CESIUM_3D_TILE_EDGES_DIRECT
649
716
  : Pass.CESIUM_3D_TILE_EDGES;
650
717
 
@@ -653,12 +720,34 @@ ModelDrawCommand.prototype.pushEdgeCommands = function (frameState, result) {
653
720
  this._edgeCommand.derivedCommand2D.command.pass = edgePass;
654
721
  }
655
722
 
656
- const use2D = shouldUse2DCommands(this, frameState);
657
723
  pushCommand(result, this._edgeCommand, use2D);
658
724
 
659
725
  return result;
660
726
  };
661
727
 
728
+ /**
729
+ * Push the planar fill feature-ID pre-pass command (if any).
730
+ *
731
+ * @param {FrameState} frameState The frame state.
732
+ * @param {DrawCommand[]} result The draw commands to push to.
733
+ * @returns {DrawCommand[]} The modified command list.
734
+ *
735
+ * @private
736
+ */
737
+ ModelDrawCommand.prototype.pushPlanarFillIdCommands = function (
738
+ frameState,
739
+ result,
740
+ ) {
741
+ if (!defined(this._planarFillIdCommand)) {
742
+ return result;
743
+ }
744
+
745
+ const use2D = shouldUse2DCommands(this, frameState);
746
+ pushCommand(result, this._planarFillIdCommand, use2D);
747
+
748
+ return result;
749
+ };
750
+
662
751
  function pushCommand(commandList, derivedCommand, use2D) {
663
752
  commandList.push(derivedCommand.command);
664
753
  if (use2D) {
@@ -718,6 +807,8 @@ function derive2DCommands(drawCommand) {
718
807
  derive2DCommand(drawCommand, drawCommand._silhouetteModelCommand);
719
808
  derive2DCommand(drawCommand, drawCommand._silhouetteColorCommand);
720
809
  derive2DCommand(drawCommand, drawCommand._edgeCommand);
810
+ derive2DCommand(drawCommand, drawCommand._edgeSnapCommand);
811
+ derive2DCommand(drawCommand, drawCommand._planarFillIdCommand);
721
812
  }
722
813
 
723
814
  function deriveTranslucentCommand(command) {
@@ -826,7 +917,13 @@ function deriveSilhouetteColorCommand(command, model) {
826
917
  return silhouetteColorCommand;
827
918
  }
828
919
 
829
- function deriveEdgeCommand(command, renderResources) {
920
+ // Builds an edge draw command at the given screen-space line width.
921
+ //
922
+ // Two variants are derived per primitive (one for the color pass and one
923
+ // for the snapping pass). Therefore, the visual line width and the snap-pass line
924
+ // width can be set independently. The snap variant is pinned at 1 px to
925
+ // avoid snap wiggle (see initialize). In practice both default to 1 px.
926
+ function deriveEdgeCommand(command, renderResources, lineWidth) {
830
927
  const edgeGeometry = renderResources.edgeGeometry;
831
928
  const edgeCommand = DrawCommand.shallowClone(command);
832
929
 
@@ -848,6 +945,12 @@ function deriveEdgeCommand(command, renderResources) {
848
945
  uniformMap.u_isEdgePass = function () {
849
946
  return true; // This is the edge pass
850
947
  };
948
+
949
+ // Set line width uniform for quad-based edge rendering
950
+ uniformMap.u_lineWidth = function () {
951
+ return lineWidth;
952
+ };
953
+
851
954
  edgeCommand.uniformMap = uniformMap;
852
955
  edgeCommand.castShadows = false;
853
956
  edgeCommand.receiveShadows = false;
@@ -855,6 +958,47 @@ function deriveEdgeCommand(command, renderResources) {
855
958
  return edgeCommand;
856
959
  }
857
960
 
961
+ /**
962
+ * Derive a command for the planar fill feature-ID pre-pass.
963
+ *
964
+ * This command uses the same geometry as the original but writes only a
965
+ * feature-ID value to the color attachment (no lighting, no material).
966
+ * The fragment shader outputs <code>vec4(featureId, 0, 0, 1)</code>
967
+ * via the <code>PLANAR_FILL_ID_PASS</code> define.
968
+ *
969
+ * No polygon offset is applied: the pre-pass uses the natural depth of the
970
+ * non-behind planar fill geometry (same program as the main command minus
971
+ * the POLYGON_OFFSET path that would shift it).
972
+ *
973
+ * Like the other derived commands (translucent, silhouette, edge, etc.),
974
+ * this is called once per draw command from <code>initialize</code> when the
975
+ * ModelDrawCommand is constructed — not per frame.
976
+ *
977
+ * @param {DrawCommand} command The original draw command.
978
+ * @returns {DrawCommand} The derived command for the feature-ID pass.
979
+ * @private
980
+ */
981
+ function derivePlanarFillIdCommand(command) {
982
+ const derived = DrawCommand.shallowClone(command);
983
+ derived.pass = Pass.CESIUM_3D_TILE_PLANAR_FILL_ID;
984
+ derived.castShadows = false;
985
+ derived.receiveShadows = false;
986
+
987
+ // Use the same render state but disable blending.
988
+ const rs = clone(command.renderState, true);
989
+ rs.blending.enabled = false;
990
+ derived.renderState = RenderState.fromCache(rs);
991
+
992
+ // Override uniformMap to set u_isPlanarFillIdPass to true for the pre-pass
993
+ const uniformMap = clone(command.uniformMap);
994
+ uniformMap.u_isPlanarFillIdPass = function () {
995
+ return true;
996
+ };
997
+ derived.uniformMap = uniformMap;
998
+
999
+ return derived;
1000
+ }
1001
+
858
1002
  function updateSkipLodStencilCommand(drawCommand, tile, use2D) {
859
1003
  const stencilDerivedComand = drawCommand._skipLodStencilCommand;
860
1004
  const stencilCommand = stencilDerivedComand.command;
@@ -169,6 +169,9 @@ function buildDrawCommandForModel(
169
169
  const pickId = hasClassification
170
170
  ? undefined
171
171
  : primitiveRenderResources.pickId;
172
+ const snapId = hasClassification
173
+ ? undefined
174
+ : primitiveRenderResources.snapId;
172
175
 
173
176
  const command = new DrawCommand({
174
177
  boundingVolume: boundingSphere,
@@ -182,6 +185,7 @@ function buildDrawCommandForModel(
182
185
  count: primitiveRenderResources.count,
183
186
  owner: model,
184
187
  pickId: pickId,
188
+ snapId: snapId,
185
189
  pickMetadataAllowed: true,
186
190
  instanceCount: primitiveRenderResources.instanceCount,
187
191
  primitiveType: primitiveRenderResources.primitiveType,