@itwin/core-frontend 3.5.0-dev.5 → 3.5.0-dev.52

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 (418) hide show
  1. package/CHANGELOG.md +60 -1
  2. package/lib/cjs/AccuSnap.d.ts +7 -1
  3. package/lib/cjs/AccuSnap.d.ts.map +1 -1
  4. package/lib/cjs/AccuSnap.js +26 -3
  5. package/lib/cjs/AccuSnap.js.map +1 -1
  6. package/lib/cjs/BriefcaseConnection.d.ts +28 -1
  7. package/lib/cjs/BriefcaseConnection.d.ts.map +1 -1
  8. package/lib/cjs/BriefcaseConnection.js +29 -8
  9. package/lib/cjs/BriefcaseConnection.js.map +1 -1
  10. package/lib/cjs/BriefcaseTxns.js +9 -9
  11. package/lib/cjs/BriefcaseTxns.js.map +1 -1
  12. package/lib/cjs/GraphicalEditingScope.js +2 -2
  13. package/lib/cjs/GraphicalEditingScope.js.map +1 -1
  14. package/lib/cjs/IModelApp.d.ts +6 -0
  15. package/lib/cjs/IModelApp.d.ts.map +1 -1
  16. package/lib/cjs/IModelApp.js +6 -0
  17. package/lib/cjs/IModelApp.js.map +1 -1
  18. package/lib/cjs/IModelConnection.d.ts +20 -2
  19. package/lib/cjs/IModelConnection.d.ts.map +1 -1
  20. package/lib/cjs/IModelConnection.js +27 -5
  21. package/lib/cjs/IModelConnection.js.map +1 -1
  22. package/lib/cjs/IpcApp.d.ts +14 -1
  23. package/lib/cjs/IpcApp.d.ts.map +1 -1
  24. package/lib/cjs/IpcApp.js +25 -0
  25. package/lib/cjs/IpcApp.js.map +1 -1
  26. package/lib/cjs/MarginPercent.d.ts +27 -2
  27. package/lib/cjs/MarginPercent.d.ts.map +1 -1
  28. package/lib/cjs/MarginPercent.js +8 -2
  29. package/lib/cjs/MarginPercent.js.map +1 -1
  30. package/lib/cjs/ModelState.d.ts +2 -1
  31. package/lib/cjs/ModelState.d.ts.map +1 -1
  32. package/lib/cjs/ModelState.js +5 -3
  33. package/lib/cjs/ModelState.js.map +1 -1
  34. package/lib/cjs/NativeApp.d.ts +5 -1
  35. package/lib/cjs/NativeApp.d.ts.map +1 -1
  36. package/lib/cjs/NativeApp.js +25 -20
  37. package/lib/cjs/NativeApp.js.map +1 -1
  38. package/lib/cjs/NativeAppLogger.js +1 -1
  39. package/lib/cjs/NativeAppLogger.js.map +1 -1
  40. package/lib/cjs/RealityDataSource.d.ts +44 -1
  41. package/lib/cjs/RealityDataSource.d.ts.map +1 -1
  42. package/lib/cjs/RealityDataSource.js +41 -14
  43. package/lib/cjs/RealityDataSource.js.map +1 -1
  44. package/lib/cjs/RealityDataSourceCesiumIonAssetImpl.d.ts +1 -0
  45. package/lib/cjs/RealityDataSourceCesiumIonAssetImpl.d.ts.map +1 -1
  46. package/lib/cjs/RealityDataSourceCesiumIonAssetImpl.js +3 -0
  47. package/lib/cjs/RealityDataSourceCesiumIonAssetImpl.js.map +1 -1
  48. package/lib/cjs/RealityDataSourceContextShareImpl.d.ts +1 -0
  49. package/lib/cjs/RealityDataSourceContextShareImpl.d.ts.map +1 -1
  50. package/lib/cjs/RealityDataSourceContextShareImpl.js +3 -0
  51. package/lib/cjs/RealityDataSourceContextShareImpl.js.map +1 -1
  52. package/lib/cjs/RealityDataSourceTilesetUrlImpl.d.ts +1 -0
  53. package/lib/cjs/RealityDataSourceTilesetUrlImpl.d.ts.map +1 -1
  54. package/lib/cjs/RealityDataSourceTilesetUrlImpl.js +3 -0
  55. package/lib/cjs/RealityDataSourceTilesetUrlImpl.js.map +1 -1
  56. package/lib/cjs/ViewAnimation.d.ts +10 -2
  57. package/lib/cjs/ViewAnimation.d.ts.map +1 -1
  58. package/lib/cjs/ViewAnimation.js.map +1 -1
  59. package/lib/cjs/ViewCreator2d.js +3 -2
  60. package/lib/cjs/ViewCreator2d.js.map +1 -1
  61. package/lib/cjs/ViewState.d.ts.map +1 -1
  62. package/lib/cjs/ViewState.js +22 -2
  63. package/lib/cjs/ViewState.js.map +1 -1
  64. package/lib/cjs/Viewport.d.ts.map +1 -1
  65. package/lib/cjs/Viewport.js +7 -2
  66. package/lib/cjs/Viewport.js.map +1 -1
  67. package/lib/cjs/extension/ExtensionRuntime.js +11 -0
  68. package/lib/cjs/extension/ExtensionRuntime.js.map +1 -1
  69. package/lib/cjs/render/RenderMaterial.d.ts +57 -30
  70. package/lib/cjs/render/RenderMaterial.d.ts.map +1 -1
  71. package/lib/cjs/render/RenderMaterial.js.map +1 -1
  72. package/lib/cjs/render/primitives/SurfaceParams.d.ts +0 -1
  73. package/lib/cjs/render/primitives/SurfaceParams.d.ts.map +1 -1
  74. package/lib/cjs/render/primitives/SurfaceParams.js.map +1 -1
  75. package/lib/cjs/render/primitives/VertexTable.d.ts.map +1 -1
  76. package/lib/cjs/render/primitives/VertexTable.js +0 -1
  77. package/lib/cjs/render/primitives/VertexTable.js.map +1 -1
  78. package/lib/cjs/render/primitives/VertexTableSplitter.d.ts.map +1 -1
  79. package/lib/cjs/render/primitives/VertexTableSplitter.js +0 -1
  80. package/lib/cjs/render/primitives/VertexTableSplitter.js.map +1 -1
  81. package/lib/cjs/render/primitives/mesh/MeshPrimitives.d.ts +0 -1
  82. package/lib/cjs/render/primitives/mesh/MeshPrimitives.d.ts.map +1 -1
  83. package/lib/cjs/render/primitives/mesh/MeshPrimitives.js +0 -1
  84. package/lib/cjs/render/primitives/mesh/MeshPrimitives.js.map +1 -1
  85. package/lib/cjs/render/webgl/FeatureOverrides.d.ts +0 -1
  86. package/lib/cjs/render/webgl/FeatureOverrides.d.ts.map +1 -1
  87. package/lib/cjs/render/webgl/FeatureOverrides.js +16 -11
  88. package/lib/cjs/render/webgl/FeatureOverrides.js.map +1 -1
  89. package/lib/cjs/render/webgl/MeshData.d.ts +0 -1
  90. package/lib/cjs/render/webgl/MeshData.d.ts.map +1 -1
  91. package/lib/cjs/render/webgl/MeshData.js +0 -1
  92. package/lib/cjs/render/webgl/MeshData.js.map +1 -1
  93. package/lib/cjs/render/webgl/MeshGeometry.d.ts +0 -1
  94. package/lib/cjs/render/webgl/MeshGeometry.d.ts.map +1 -1
  95. package/lib/cjs/render/webgl/MeshGeometry.js +0 -1
  96. package/lib/cjs/render/webgl/MeshGeometry.js.map +1 -1
  97. package/lib/cjs/render/webgl/RenderFlags.d.ts +12 -3
  98. package/lib/cjs/render/webgl/RenderFlags.d.ts.map +1 -1
  99. package/lib/cjs/render/webgl/RenderFlags.js.map +1 -1
  100. package/lib/cjs/render/webgl/SurfaceGeometry.d.ts +0 -1
  101. package/lib/cjs/render/webgl/SurfaceGeometry.d.ts.map +1 -1
  102. package/lib/cjs/render/webgl/SurfaceGeometry.js +2 -6
  103. package/lib/cjs/render/webgl/SurfaceGeometry.js.map +1 -1
  104. package/lib/cjs/render/webgl/System.d.ts +1 -1
  105. package/lib/cjs/render/webgl/glsl/FeatureSymbology.d.ts.map +1 -1
  106. package/lib/cjs/render/webgl/glsl/FeatureSymbology.js +9 -1
  107. package/lib/cjs/render/webgl/glsl/FeatureSymbology.js.map +1 -1
  108. package/lib/cjs/render/webgl/glsl/Lighting.js +1 -1
  109. package/lib/cjs/render/webgl/glsl/Lighting.js.map +1 -1
  110. package/lib/cjs/render/webgl/glsl/PointCloud.d.ts.map +1 -1
  111. package/lib/cjs/render/webgl/glsl/PointCloud.js +7 -2
  112. package/lib/cjs/render/webgl/glsl/PointCloud.js.map +1 -1
  113. package/lib/cjs/render/webgl/glsl/Surface.js +1 -1
  114. package/lib/cjs/render/webgl/glsl/Surface.js.map +1 -1
  115. package/lib/cjs/tile/GltfReader.d.ts +9 -0
  116. package/lib/cjs/tile/GltfReader.d.ts.map +1 -1
  117. package/lib/cjs/tile/GltfReader.js +4 -1
  118. package/lib/cjs/tile/GltfReader.js.map +1 -1
  119. package/lib/cjs/tile/IModelTileRequestChannels.js +1 -1
  120. package/lib/cjs/tile/IModelTileRequestChannels.js.map +1 -1
  121. package/lib/cjs/tile/ImdlReader.d.ts +5 -0
  122. package/lib/cjs/tile/ImdlReader.d.ts.map +1 -1
  123. package/lib/cjs/tile/ImdlReader.js +8 -2
  124. package/lib/cjs/tile/ImdlReader.js.map +1 -1
  125. package/lib/cjs/tile/PrimaryTileTree.js +2 -2
  126. package/lib/cjs/tile/PrimaryTileTree.js.map +1 -1
  127. package/lib/cjs/tile/RealityModelTileTree.d.ts.map +1 -1
  128. package/lib/cjs/tile/RealityModelTileTree.js +51 -20
  129. package/lib/cjs/tile/RealityModelTileTree.js.map +1 -1
  130. package/lib/cjs/tile/RealityTile.d.ts +2 -2
  131. package/lib/cjs/tile/RealityTile.d.ts.map +1 -1
  132. package/lib/cjs/tile/RealityTile.js +11 -4
  133. package/lib/cjs/tile/RealityTile.js.map +1 -1
  134. package/lib/cjs/tile/RealityTileLoader.d.ts +1 -0
  135. package/lib/cjs/tile/RealityTileLoader.d.ts.map +1 -1
  136. package/lib/cjs/tile/RealityTileLoader.js +13 -0
  137. package/lib/cjs/tile/RealityTileLoader.js.map +1 -1
  138. package/lib/cjs/tile/RealityTileTree.js +1 -1
  139. package/lib/cjs/tile/RealityTileTree.js.map +1 -1
  140. package/lib/cjs/tile/Tile.d.ts +5 -0
  141. package/lib/cjs/tile/Tile.d.ts.map +1 -1
  142. package/lib/cjs/tile/Tile.js +5 -0
  143. package/lib/cjs/tile/Tile.js.map +1 -1
  144. package/lib/cjs/tile/TileAdmin.d.ts.map +1 -1
  145. package/lib/cjs/tile/TileAdmin.js +13 -6
  146. package/lib/cjs/tile/TileAdmin.js.map +1 -1
  147. package/lib/cjs/tile/TileDrawArgs.d.ts +5 -1
  148. package/lib/cjs/tile/TileDrawArgs.d.ts.map +1 -1
  149. package/lib/cjs/tile/TileDrawArgs.js +2 -0
  150. package/lib/cjs/tile/TileDrawArgs.js.map +1 -1
  151. package/lib/cjs/tile/TileRequestChannels.js +1 -1
  152. package/lib/cjs/tile/TileRequestChannels.js.map +1 -1
  153. package/lib/cjs/tile/TileStorage.d.ts.map +1 -1
  154. package/lib/cjs/tile/TileStorage.js +12 -6
  155. package/lib/cjs/tile/TileStorage.js.map +1 -1
  156. package/lib/cjs/tile/internal.d.ts +1 -0
  157. package/lib/cjs/tile/internal.d.ts.map +1 -1
  158. package/lib/cjs/tile/internal.js +1 -0
  159. package/lib/cjs/tile/internal.js.map +1 -1
  160. package/lib/cjs/tile/map/ArcGISTileMap.d.ts +5 -2
  161. package/lib/cjs/tile/map/ArcGISTileMap.d.ts.map +1 -1
  162. package/lib/cjs/tile/map/ArcGISTileMap.js +17 -2
  163. package/lib/cjs/tile/map/ArcGISTileMap.js.map +1 -1
  164. package/lib/cjs/tile/map/ArcGisUtilities.d.ts +50 -5
  165. package/lib/cjs/tile/map/ArcGisUtilities.d.ts.map +1 -1
  166. package/lib/cjs/tile/map/ArcGisUtilities.js +119 -48
  167. package/lib/cjs/tile/map/ArcGisUtilities.js.map +1 -1
  168. package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts +26 -0
  169. package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -0
  170. package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.js +97 -0
  171. package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -0
  172. package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts +2 -4
  173. package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
  174. package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +11 -96
  175. package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  176. package/lib/cjs/tile/map/ImageryProviders/WmsMapLayerImageryProvider.d.ts.map +1 -1
  177. package/lib/cjs/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +2 -1
  178. package/lib/cjs/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
  179. package/lib/cjs/tile/map/ImageryTileTree.d.ts +2 -0
  180. package/lib/cjs/tile/map/ImageryTileTree.d.ts.map +1 -1
  181. package/lib/cjs/tile/map/ImageryTileTree.js +6 -4
  182. package/lib/cjs/tile/map/ImageryTileTree.js.map +1 -1
  183. package/lib/cjs/tile/map/MapLayerFormatRegistry.d.ts +18 -4
  184. package/lib/cjs/tile/map/MapLayerFormatRegistry.d.ts.map +1 -1
  185. package/lib/cjs/tile/map/MapLayerFormatRegistry.js +25 -5
  186. package/lib/cjs/tile/map/MapLayerFormatRegistry.js.map +1 -1
  187. package/lib/cjs/tile/map/MapLayerImageryFormats.d.ts +6 -4
  188. package/lib/cjs/tile/map/MapLayerImageryFormats.d.ts.map +1 -1
  189. package/lib/cjs/tile/map/MapLayerImageryFormats.js +12 -16
  190. package/lib/cjs/tile/map/MapLayerImageryFormats.js.map +1 -1
  191. package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts +26 -5
  192. package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
  193. package/lib/cjs/tile/map/MapLayerImageryProvider.js +69 -48
  194. package/lib/cjs/tile/map/MapLayerImageryProvider.js.map +1 -1
  195. package/lib/cjs/tile/map/MapLayerSources.js +1 -1
  196. package/lib/cjs/tile/map/MapLayerSources.js.map +1 -1
  197. package/lib/cjs/tile/map/MapTileTree.d.ts.map +1 -1
  198. package/lib/cjs/tile/map/MapTileTree.js +10 -7
  199. package/lib/cjs/tile/map/MapTileTree.js.map +1 -1
  200. package/lib/cjs/tile/map/WmsCapabilities.d.ts.map +1 -1
  201. package/lib/cjs/tile/map/WmsCapabilities.js +4 -1
  202. package/lib/cjs/tile/map/WmsCapabilities.js.map +1 -1
  203. package/lib/cjs/tools/EditManipulator.d.ts.map +1 -1
  204. package/lib/cjs/tools/EditManipulator.js +2 -1
  205. package/lib/cjs/tools/EditManipulator.js.map +1 -1
  206. package/lib/cjs/tools/ToolAdmin.d.ts.map +1 -1
  207. package/lib/cjs/tools/ToolAdmin.js +6 -4
  208. package/lib/cjs/tools/ToolAdmin.js.map +1 -1
  209. package/lib/esm/AccuSnap.d.ts +7 -1
  210. package/lib/esm/AccuSnap.d.ts.map +1 -1
  211. package/lib/esm/AccuSnap.js +27 -4
  212. package/lib/esm/AccuSnap.js.map +1 -1
  213. package/lib/esm/BriefcaseConnection.d.ts +28 -1
  214. package/lib/esm/BriefcaseConnection.d.ts.map +1 -1
  215. package/lib/esm/BriefcaseConnection.js +30 -9
  216. package/lib/esm/BriefcaseConnection.js.map +1 -1
  217. package/lib/esm/BriefcaseTxns.js +9 -9
  218. package/lib/esm/BriefcaseTxns.js.map +1 -1
  219. package/lib/esm/GraphicalEditingScope.js +2 -2
  220. package/lib/esm/GraphicalEditingScope.js.map +1 -1
  221. package/lib/esm/IModelApp.d.ts +6 -0
  222. package/lib/esm/IModelApp.d.ts.map +1 -1
  223. package/lib/esm/IModelApp.js +6 -0
  224. package/lib/esm/IModelApp.js.map +1 -1
  225. package/lib/esm/IModelConnection.d.ts +20 -2
  226. package/lib/esm/IModelConnection.d.ts.map +1 -1
  227. package/lib/esm/IModelConnection.js +27 -5
  228. package/lib/esm/IModelConnection.js.map +1 -1
  229. package/lib/esm/IpcApp.d.ts +14 -1
  230. package/lib/esm/IpcApp.d.ts.map +1 -1
  231. package/lib/esm/IpcApp.js +25 -0
  232. package/lib/esm/IpcApp.js.map +1 -1
  233. package/lib/esm/MarginPercent.d.ts +27 -2
  234. package/lib/esm/MarginPercent.d.ts.map +1 -1
  235. package/lib/esm/MarginPercent.js +8 -2
  236. package/lib/esm/MarginPercent.js.map +1 -1
  237. package/lib/esm/ModelState.d.ts +2 -1
  238. package/lib/esm/ModelState.d.ts.map +1 -1
  239. package/lib/esm/ModelState.js +5 -3
  240. package/lib/esm/ModelState.js.map +1 -1
  241. package/lib/esm/NativeApp.d.ts +5 -1
  242. package/lib/esm/NativeApp.d.ts.map +1 -1
  243. package/lib/esm/NativeApp.js +25 -20
  244. package/lib/esm/NativeApp.js.map +1 -1
  245. package/lib/esm/NativeAppLogger.js +1 -1
  246. package/lib/esm/NativeAppLogger.js.map +1 -1
  247. package/lib/esm/RealityDataSource.d.ts +44 -1
  248. package/lib/esm/RealityDataSource.d.ts.map +1 -1
  249. package/lib/esm/RealityDataSource.js +39 -13
  250. package/lib/esm/RealityDataSource.js.map +1 -1
  251. package/lib/esm/RealityDataSourceCesiumIonAssetImpl.d.ts +1 -0
  252. package/lib/esm/RealityDataSourceCesiumIonAssetImpl.d.ts.map +1 -1
  253. package/lib/esm/RealityDataSourceCesiumIonAssetImpl.js +3 -0
  254. package/lib/esm/RealityDataSourceCesiumIonAssetImpl.js.map +1 -1
  255. package/lib/esm/RealityDataSourceContextShareImpl.d.ts +1 -0
  256. package/lib/esm/RealityDataSourceContextShareImpl.d.ts.map +1 -1
  257. package/lib/esm/RealityDataSourceContextShareImpl.js +3 -0
  258. package/lib/esm/RealityDataSourceContextShareImpl.js.map +1 -1
  259. package/lib/esm/RealityDataSourceTilesetUrlImpl.d.ts +1 -0
  260. package/lib/esm/RealityDataSourceTilesetUrlImpl.d.ts.map +1 -1
  261. package/lib/esm/RealityDataSourceTilesetUrlImpl.js +3 -0
  262. package/lib/esm/RealityDataSourceTilesetUrlImpl.js.map +1 -1
  263. package/lib/esm/ViewAnimation.d.ts +10 -2
  264. package/lib/esm/ViewAnimation.d.ts.map +1 -1
  265. package/lib/esm/ViewAnimation.js.map +1 -1
  266. package/lib/esm/ViewCreator2d.js +3 -2
  267. package/lib/esm/ViewCreator2d.js.map +1 -1
  268. package/lib/esm/ViewState.d.ts.map +1 -1
  269. package/lib/esm/ViewState.js +22 -2
  270. package/lib/esm/ViewState.js.map +1 -1
  271. package/lib/esm/Viewport.d.ts.map +1 -1
  272. package/lib/esm/Viewport.js +7 -2
  273. package/lib/esm/Viewport.js.map +1 -1
  274. package/lib/esm/extension/ExtensionRuntime.js +12 -1
  275. package/lib/esm/extension/ExtensionRuntime.js.map +1 -1
  276. package/lib/esm/render/RenderMaterial.d.ts +57 -30
  277. package/lib/esm/render/RenderMaterial.d.ts.map +1 -1
  278. package/lib/esm/render/RenderMaterial.js.map +1 -1
  279. package/lib/esm/render/primitives/SurfaceParams.d.ts +0 -1
  280. package/lib/esm/render/primitives/SurfaceParams.d.ts.map +1 -1
  281. package/lib/esm/render/primitives/SurfaceParams.js.map +1 -1
  282. package/lib/esm/render/primitives/VertexTable.d.ts.map +1 -1
  283. package/lib/esm/render/primitives/VertexTable.js +0 -1
  284. package/lib/esm/render/primitives/VertexTable.js.map +1 -1
  285. package/lib/esm/render/primitives/VertexTableSplitter.d.ts.map +1 -1
  286. package/lib/esm/render/primitives/VertexTableSplitter.js +0 -1
  287. package/lib/esm/render/primitives/VertexTableSplitter.js.map +1 -1
  288. package/lib/esm/render/primitives/mesh/MeshPrimitives.d.ts +0 -1
  289. package/lib/esm/render/primitives/mesh/MeshPrimitives.d.ts.map +1 -1
  290. package/lib/esm/render/primitives/mesh/MeshPrimitives.js +0 -1
  291. package/lib/esm/render/primitives/mesh/MeshPrimitives.js.map +1 -1
  292. package/lib/esm/render/webgl/FeatureOverrides.d.ts +0 -1
  293. package/lib/esm/render/webgl/FeatureOverrides.d.ts.map +1 -1
  294. package/lib/esm/render/webgl/FeatureOverrides.js +16 -11
  295. package/lib/esm/render/webgl/FeatureOverrides.js.map +1 -1
  296. package/lib/esm/render/webgl/MeshData.d.ts +0 -1
  297. package/lib/esm/render/webgl/MeshData.d.ts.map +1 -1
  298. package/lib/esm/render/webgl/MeshData.js +0 -1
  299. package/lib/esm/render/webgl/MeshData.js.map +1 -1
  300. package/lib/esm/render/webgl/MeshGeometry.d.ts +0 -1
  301. package/lib/esm/render/webgl/MeshGeometry.d.ts.map +1 -1
  302. package/lib/esm/render/webgl/MeshGeometry.js +0 -1
  303. package/lib/esm/render/webgl/MeshGeometry.js.map +1 -1
  304. package/lib/esm/render/webgl/RenderFlags.d.ts +12 -3
  305. package/lib/esm/render/webgl/RenderFlags.d.ts.map +1 -1
  306. package/lib/esm/render/webgl/RenderFlags.js.map +1 -1
  307. package/lib/esm/render/webgl/SurfaceGeometry.d.ts +0 -1
  308. package/lib/esm/render/webgl/SurfaceGeometry.d.ts.map +1 -1
  309. package/lib/esm/render/webgl/SurfaceGeometry.js +2 -6
  310. package/lib/esm/render/webgl/SurfaceGeometry.js.map +1 -1
  311. package/lib/esm/render/webgl/System.d.ts +1 -1
  312. package/lib/esm/render/webgl/glsl/FeatureSymbology.d.ts.map +1 -1
  313. package/lib/esm/render/webgl/glsl/FeatureSymbology.js +9 -1
  314. package/lib/esm/render/webgl/glsl/FeatureSymbology.js.map +1 -1
  315. package/lib/esm/render/webgl/glsl/Lighting.js +1 -1
  316. package/lib/esm/render/webgl/glsl/Lighting.js.map +1 -1
  317. package/lib/esm/render/webgl/glsl/PointCloud.d.ts.map +1 -1
  318. package/lib/esm/render/webgl/glsl/PointCloud.js +7 -2
  319. package/lib/esm/render/webgl/glsl/PointCloud.js.map +1 -1
  320. package/lib/esm/render/webgl/glsl/Surface.js +1 -1
  321. package/lib/esm/render/webgl/glsl/Surface.js.map +1 -1
  322. package/lib/esm/tile/GltfReader.d.ts +9 -0
  323. package/lib/esm/tile/GltfReader.d.ts.map +1 -1
  324. package/lib/esm/tile/GltfReader.js +4 -1
  325. package/lib/esm/tile/GltfReader.js.map +1 -1
  326. package/lib/esm/tile/IModelTileRequestChannels.js +1 -1
  327. package/lib/esm/tile/IModelTileRequestChannels.js.map +1 -1
  328. package/lib/esm/tile/ImdlReader.d.ts +5 -0
  329. package/lib/esm/tile/ImdlReader.d.ts.map +1 -1
  330. package/lib/esm/tile/ImdlReader.js +8 -2
  331. package/lib/esm/tile/ImdlReader.js.map +1 -1
  332. package/lib/esm/tile/PrimaryTileTree.js +2 -2
  333. package/lib/esm/tile/PrimaryTileTree.js.map +1 -1
  334. package/lib/esm/tile/RealityModelTileTree.d.ts.map +1 -1
  335. package/lib/esm/tile/RealityModelTileTree.js +51 -20
  336. package/lib/esm/tile/RealityModelTileTree.js.map +1 -1
  337. package/lib/esm/tile/RealityTile.d.ts +2 -2
  338. package/lib/esm/tile/RealityTile.d.ts.map +1 -1
  339. package/lib/esm/tile/RealityTile.js +11 -4
  340. package/lib/esm/tile/RealityTile.js.map +1 -1
  341. package/lib/esm/tile/RealityTileLoader.d.ts +1 -0
  342. package/lib/esm/tile/RealityTileLoader.d.ts.map +1 -1
  343. package/lib/esm/tile/RealityTileLoader.js +14 -1
  344. package/lib/esm/tile/RealityTileLoader.js.map +1 -1
  345. package/lib/esm/tile/RealityTileTree.js +1 -1
  346. package/lib/esm/tile/RealityTileTree.js.map +1 -1
  347. package/lib/esm/tile/Tile.d.ts +5 -0
  348. package/lib/esm/tile/Tile.d.ts.map +1 -1
  349. package/lib/esm/tile/Tile.js +5 -0
  350. package/lib/esm/tile/Tile.js.map +1 -1
  351. package/lib/esm/tile/TileAdmin.d.ts.map +1 -1
  352. package/lib/esm/tile/TileAdmin.js +13 -6
  353. package/lib/esm/tile/TileAdmin.js.map +1 -1
  354. package/lib/esm/tile/TileDrawArgs.d.ts +5 -1
  355. package/lib/esm/tile/TileDrawArgs.d.ts.map +1 -1
  356. package/lib/esm/tile/TileDrawArgs.js +2 -0
  357. package/lib/esm/tile/TileDrawArgs.js.map +1 -1
  358. package/lib/esm/tile/TileRequestChannels.js +1 -1
  359. package/lib/esm/tile/TileRequestChannels.js.map +1 -1
  360. package/lib/esm/tile/TileStorage.d.ts.map +1 -1
  361. package/lib/esm/tile/TileStorage.js +12 -6
  362. package/lib/esm/tile/TileStorage.js.map +1 -1
  363. package/lib/esm/tile/internal.d.ts +1 -0
  364. package/lib/esm/tile/internal.d.ts.map +1 -1
  365. package/lib/esm/tile/internal.js +1 -0
  366. package/lib/esm/tile/internal.js.map +1 -1
  367. package/lib/esm/tile/map/ArcGISTileMap.d.ts +5 -2
  368. package/lib/esm/tile/map/ArcGISTileMap.d.ts.map +1 -1
  369. package/lib/esm/tile/map/ArcGISTileMap.js +18 -3
  370. package/lib/esm/tile/map/ArcGISTileMap.js.map +1 -1
  371. package/lib/esm/tile/map/ArcGisUtilities.d.ts +50 -5
  372. package/lib/esm/tile/map/ArcGisUtilities.d.ts.map +1 -1
  373. package/lib/esm/tile/map/ArcGisUtilities.js +120 -49
  374. package/lib/esm/tile/map/ArcGisUtilities.js.map +1 -1
  375. package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts +26 -0
  376. package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -0
  377. package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.js +93 -0
  378. package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -0
  379. package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts +2 -4
  380. package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
  381. package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +10 -95
  382. package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  383. package/lib/esm/tile/map/ImageryProviders/WmsMapLayerImageryProvider.d.ts.map +1 -1
  384. package/lib/esm/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +2 -1
  385. package/lib/esm/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
  386. package/lib/esm/tile/map/ImageryTileTree.d.ts +2 -0
  387. package/lib/esm/tile/map/ImageryTileTree.d.ts.map +1 -1
  388. package/lib/esm/tile/map/ImageryTileTree.js +6 -4
  389. package/lib/esm/tile/map/ImageryTileTree.js.map +1 -1
  390. package/lib/esm/tile/map/MapLayerFormatRegistry.d.ts +18 -4
  391. package/lib/esm/tile/map/MapLayerFormatRegistry.d.ts.map +1 -1
  392. package/lib/esm/tile/map/MapLayerFormatRegistry.js +26 -6
  393. package/lib/esm/tile/map/MapLayerFormatRegistry.js.map +1 -1
  394. package/lib/esm/tile/map/MapLayerImageryFormats.d.ts +6 -4
  395. package/lib/esm/tile/map/MapLayerImageryFormats.d.ts.map +1 -1
  396. package/lib/esm/tile/map/MapLayerImageryFormats.js +12 -16
  397. package/lib/esm/tile/map/MapLayerImageryFormats.js.map +1 -1
  398. package/lib/esm/tile/map/MapLayerImageryProvider.d.ts +26 -5
  399. package/lib/esm/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
  400. package/lib/esm/tile/map/MapLayerImageryProvider.js +70 -49
  401. package/lib/esm/tile/map/MapLayerImageryProvider.js.map +1 -1
  402. package/lib/esm/tile/map/MapLayerSources.js +1 -1
  403. package/lib/esm/tile/map/MapLayerSources.js.map +1 -1
  404. package/lib/esm/tile/map/MapTileTree.d.ts.map +1 -1
  405. package/lib/esm/tile/map/MapTileTree.js +10 -7
  406. package/lib/esm/tile/map/MapTileTree.js.map +1 -1
  407. package/lib/esm/tile/map/WmsCapabilities.d.ts.map +1 -1
  408. package/lib/esm/tile/map/WmsCapabilities.js +4 -1
  409. package/lib/esm/tile/map/WmsCapabilities.js.map +1 -1
  410. package/lib/esm/tools/EditManipulator.d.ts.map +1 -1
  411. package/lib/esm/tools/EditManipulator.js +2 -1
  412. package/lib/esm/tools/EditManipulator.js.map +1 -1
  413. package/lib/esm/tools/ToolAdmin.d.ts.map +1 -1
  414. package/lib/esm/tools/ToolAdmin.js +6 -4
  415. package/lib/esm/tools/ToolAdmin.js.map +1 -1
  416. package/package.json +23 -21
  417. package/lib/cjs/tile/object-storage-azure.js +0 -5
  418. package/lib/esm/tile/object-storage-azure.js +0 -5
@@ -248,6 +248,7 @@ export function addMaxAlpha(builder) {
248
248
  }
249
249
  /** @internal */
250
250
  function addEmphasisFlags(builder) {
251
+ // Must be kept in sync with EmphasisFlags enum.
251
252
  builder.addBitFlagConstant("kEmphBit_Hilite", 0);
252
253
  builder.addBitFlagConstant("kEmphBit_Emphasize", 1);
253
254
  builder.addBitFlagConstant("kEmphBit_Flash", 2);
@@ -664,7 +665,14 @@ export function addFeatureSymbology(builder, feat, opts) {
664
665
  * @internal
665
666
  */
666
667
  export function addUniformHiliter(builder) {
667
- builder.frag.set(1 /* ComputeBaseColor */, `return vec4(1.0, 0.0, 0.0, 0.0);`);
668
+ builder.frag.addUniform("v_feature_hilited", 2 /* Float */, (prog) => {
669
+ prog.addGraphicUniform("v_feature_hilited", (uniform, params) => {
670
+ params.target.uniforms.batch.bindUniformSymbologyFlags(uniform);
671
+ });
672
+ });
673
+ addEmphasisFlags(builder.frag);
674
+ addExtractNthBit(builder.frag);
675
+ builder.frag.set(1 /* ComputeBaseColor */, computeHiliteColor);
668
676
  builder.frag.set(16 /* AssignFragData */, assignFragColor);
669
677
  }
670
678
  /** For a uniform feature table, the feature ID output to pick buffers is equal to the batch ID.
@@ -1 +1 @@
1
- {"version":3,"file":"FeatureSymbology.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/FeatureSymbology.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { OvrFlags, Pass, RenderOrder, TextureUnit } from \"../RenderFlags\";\r\nimport {\r\n FragmentShaderBuilder, FragmentShaderComponent, ProgramBuilder, ShaderBuilder, VariablePrecision, VariableType, VertexShaderBuilder,\r\n VertexShaderComponent,\r\n} from \"../ShaderBuilder\";\r\nimport { System } from \"../System\";\r\nimport { FeatureMode, TechniqueFlags } from \"../TechniqueFlags\";\r\nimport { addExtractNthBit, addEyeSpace, addUInt32s } from \"./Common\";\r\nimport { decodeDepthRgb, decodeUint24 } from \"./Decode\";\r\nimport { addWindowToTexCoords, assignFragColor, computeLinearDepth } from \"./Fragment\";\r\nimport { addLookupTable } from \"./LookupTable\";\r\nimport { addRenderPass } from \"./RenderPass\";\r\nimport { addAlpha, addLineWeight, replaceLineCode, replaceLineWeight } from \"./Vertex\";\r\n\r\n/* eslint-disable no-restricted-syntax */\r\n\r\n/** @internal */\r\nexport const enum FeatureSymbologyOptions {\r\n None = 0,\r\n Weight = 1 << 0,\r\n LineCode = 1 << 1,\r\n HasOverrides = 1 << 2,\r\n Color = 1 << 3,\r\n Alpha = 1 << 4,\r\n\r\n Surface = HasOverrides | Color | Alpha,\r\n Point = HasOverrides | Color | Weight | Alpha,\r\n Linear = HasOverrides | Color | Weight | LineCode | Alpha,\r\n}\r\n\r\n/** @internal */\r\nexport function addOvrFlagConstants(builder: ShaderBuilder): void {\r\n // NB: These are the bit positions of each flag in OvrFlags enum - not the flag values\r\n builder.addBitFlagConstant(\"kOvrBit_Visibility\", 0);\r\n builder.addBitFlagConstant(\"kOvrBit_Rgb\", 1);\r\n builder.addBitFlagConstant(\"kOvrBit_Alpha\", 2);\r\n builder.addBitFlagConstant(\"kOvrBit_IgnoreMaterial\", 3);\r\n builder.addBitFlagConstant(\"kOvrBit_Flashed\", 4);\r\n builder.addBitFlagConstant(\"kOvrBit_NonLocatable\", 5);\r\n builder.addBitFlagConstant(\"kOvrBit_LineCode\", 6);\r\n builder.addBitFlagConstant(\"kOvrBit_Weight\", 7);\r\n\r\n // NB: We treat the 16-bit flags as 2 bytes - so subtract 8 from each of these bit indices.\r\n builder.addBitFlagConstant(\"kOvrBit_Hilited\", 0);\r\n builder.addBitFlagConstant(\"kOvrBit_Emphasized\", 1);\r\n builder.addBitFlagConstant(\"kOvrBit_ViewIndependentTransparency\", 2);\r\n}\r\n\r\nconst computeLUTFeatureIndex = `g_featureAndMaterialIndex.xyz`;\r\nconst computeInstanceFeatureIndex = `g_isAreaPattern ? u_patternFeatureId : a_featureId`;\r\nfunction computeFeatureIndex(vertex: VertexShaderBuilder): string {\r\n if (vertex.usesInstancedGeometry) {\r\n vertex.addUniform(\"u_patternFeatureId\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"u_patternFeatureId\", (uniform, params) => {\r\n const id = params.geometry.asInstanced?.patternFeatureId;\r\n assert(undefined !== id);\r\n if (id)\r\n uniform.setUniform3fv(id);\r\n });\r\n });\r\n\r\n return `g_featureIndex = ${computeInstanceFeatureIndex};`;\r\n }\r\n\r\n return vertex.usesVertexTable ? `g_featureIndex = ${computeLUTFeatureIndex};` : \"\";\r\n}\r\nfunction getFeatureIndex(vertex: VertexShaderBuilder): string {\r\n return `\r\nfloat getFeatureIndex() {\r\n ${computeFeatureIndex(vertex)}\r\n return decodeUInt24(g_featureIndex);\r\n}\r\n`;\r\n}\r\n\r\n// Returns true if the specified flag is not globally overridden and is set in flags\r\nconst nthFeatureBitSet = `\r\nbool nthFeatureBitSet(float flags, float n) {\r\n return !nthBitSet(u_globalOvrFlags, n) && nthBitSet(flags, n);\r\n}\r\n`;\r\nconst nthFeatureBitSet2 = `\r\nbool nthFeatureBitSet(float flags, uint n) {\r\n return 0u == (u_globalOvrFlags & n) && nthBitSet(flags, n);\r\n}\r\n`;\r\n\r\n// Returns 1.0 if the specified flag is not globally overridden and is set in flags\r\nconst extractNthFeatureBit = `\r\nfloat extractNthFeatureBit(float flags, float n) {\r\n return !nthBitSet(u_globalOvrFlags, n) && nthBitSet(flags, n) ? 1.0 : 0.0;\r\n}\r\n`;\r\nconst extractNthFeatureBit2 = `\r\nfloat extractNthFeatureBit(float flags, uint n) {\r\n return 0u == (u_globalOvrFlags & n) && nthBitSet(flags, n) ? 1.0 : 0.0;\r\n}\r\n`;\r\n\r\nconst computeFeatureTextureCoords = `\r\nvec2 computeFeatureTextureCoords() { return compute_feature_coords(getFeatureIndex()); }\r\n`;\r\n\r\nconst getFirstFeatureRgba = `\r\nvec4 getFirstFeatureRgba() {\r\n feature_texCoord = computeFeatureTextureCoords();\r\n return TEXTURE(u_featureLUT, feature_texCoord);\r\n}\r\n`;\r\n\r\nconst getSecondFeatureRgba = `\r\nvec4 getSecondFeatureRgba() {\r\n vec2 coord = feature_texCoord;\r\n coord.x += g_feature_stepX;\r\n return TEXTURE(u_featureLUT, coord);\r\n}\r\n`;\r\n\r\nconst computeLineWeight = `\r\nfloat computeLineWeight() {\r\n return linear_feature_overrides.x > 0.5 ? linear_feature_overrides.y : g_lineWeight;\r\n}\r\n`;\r\n\r\nconst computeLineCode = `\r\nfloat computeLineCode() {\r\n return linear_feature_overrides.z > 0.5 ? linear_feature_overrides.w : g_lineCode;\r\n}\r\n`;\r\n\r\nfunction addFeatureIndex(vert: VertexShaderBuilder): void {\r\n vert.addGlobal(\"g_featureIndex\", VariableType.Vec3);\r\n\r\n vert.addFunction(decodeUint24);\r\n vert.addFunction(getFeatureIndex(vert));\r\n}\r\n\r\n// Discards vertex if feature is invisible; or rendering opaque during translucent pass or vice-versa\r\n// (The latter occurs when some translucent feature is overridden to be opaque, or vice-versa)\r\nconst checkVertexDiscard = `\r\n if (feature_invisible)\r\n return true;\r\n\r\n bool hasAlpha = 1.0 == u_hasAlpha;\r\n if (feature_alpha > 0.0)\r\n hasAlpha = feature_alpha <= s_maxAlpha;\r\n\r\n int discardFlags = u_transparencyDiscardFlags;\r\n bool discardViewIndependentDuringOpaque = discardFlags >= 4;\r\n if (discardViewIndependentDuringOpaque)\r\n discardFlags = discardFlags - 4;\r\n\r\n bool isOpaquePass = (kRenderPass_OpaqueLinear <= u_renderPass && kRenderPass_OpaqueGeneral >= u_renderPass);\r\n bool discardTranslucentDuringOpaquePass = 1 == discardFlags || 3 == discardFlags || (feature_viewIndependentTransparency && discardViewIndependentDuringOpaque);\r\n if (isOpaquePass && !discardTranslucentDuringOpaquePass)\r\n return false;\r\n\r\n bool isTranslucentPass = kRenderPass_Translucent == u_renderPass;\r\n bool discardOpaqueDuringTranslucentPass = 2 == discardFlags || 3 == discardFlags;\r\n if (isTranslucentPass && !discardOpaqueDuringTranslucentPass)\r\n return false;\r\n\r\n return (isOpaquePass && hasAlpha) || (isTranslucentPass && !hasAlpha);\r\n`;\r\n\r\nfunction addTransparencyDiscardFlags(vert: VertexShaderBuilder) {\r\n // Even when transparency view flag is off, we need to allow features to override transparency, because it\r\n // is used when applying transparency threshold. However, we need to ensure we don't DISCARD transparent stuff during\r\n // opaque pass if transparency is off (see checkVertexDiscard). Especially important for transparency threshold and readPixels().\r\n // Also, if we override raster text to be opaque we must still draw it in the translucent pass.\r\n // Finally, if the transparency override is view-independent (i.e., ignores view flags and render mode) we want to discard it during opaque pass\r\n // unless we're reading pixels.\r\n // So we have a bit field:\r\n // 1: discard translucent during opaque.\r\n // 2: discard opaque during translucent.\r\n // 4: discard view-independent translucent during opaque.\r\n vert.addUniform(\"u_transparencyDiscardFlags\", VariableType.Int, (prog) => {\r\n prog.addGraphicUniform(\"u_transparencyDiscardFlags\", (uniform, params) => {\r\n let flags = 0;\r\n\r\n // Textured surfaces may render in both passes. If so, it's up to fragment shader to handle discard.\r\n const pass = params.geometry.getPass(params.target);\r\n if (!Pass.rendersOpaqueAndTranslucent(pass)) {\r\n // During readPixels() we force transparency off. Make sure to ignore a Branch that turns it back on.\r\n if (!params.target.isReadPixelsInProgress)\r\n flags = params.target.currentViewFlags.transparency ? 1 : 4;\r\n\r\n if (!params.geometry.alwaysRenderTranslucent)\r\n flags += 2;\r\n }\r\n\r\n uniform.setUniform1i(flags);\r\n });\r\n });\r\n}\r\n\r\nfunction addCommon(builder: ProgramBuilder, mode: FeatureMode, opts: FeatureSymbologyOptions, wantGlobalOvrFlags = true): boolean {\r\n if (FeatureMode.None === mode)\r\n return false;\r\n\r\n const vert = builder.vert;\r\n addFeatureIndex(vert);\r\n\r\n const haveOverrides = FeatureSymbologyOptions.None !== (opts & FeatureSymbologyOptions.HasOverrides);\r\n if (!haveOverrides) {\r\n // For pick output we must compute g_featureIndex...\r\n if (FeatureMode.Pick === mode)\r\n vert.set(VertexShaderComponent.ComputeFeatureOverrides, computeFeatureIndex(vert));\r\n\r\n return true;\r\n }\r\n\r\n const wantWeight = FeatureSymbologyOptions.None !== (opts & FeatureSymbologyOptions.Weight);\r\n const wantLineCode = FeatureSymbologyOptions.None !== (opts & FeatureSymbologyOptions.LineCode);\r\n const wantColor = FeatureSymbologyOptions.None !== (opts & FeatureSymbologyOptions.Color);\r\n const wantAlpha = FeatureSymbologyOptions.None !== (opts & FeatureSymbologyOptions.Alpha);\r\n assert(wantColor || !wantAlpha);\r\n\r\n addExtractNthBit(vert);\r\n addOvrFlagConstants(vert);\r\n\r\n vert.addGlobal(\"linear_feature_overrides\", VariableType.Vec4, \"vec4(0.0)\");\r\n vert.addGlobal(\"feature_ignore_material\", VariableType.Boolean, \"false\");\r\n\r\n if (wantWeight || wantLineCode) {\r\n if (wantLineCode)\r\n replaceLineCode(vert, computeLineCode);\r\n\r\n if (wantWeight) {\r\n replaceLineWeight(vert, computeLineWeight);\r\n }\r\n }\r\n\r\n if (wantGlobalOvrFlags) {\r\n let bitmapType;\r\n if (System.instance.capabilities.isWebGL2) {\r\n vert.addFunction(nthFeatureBitSet2);\r\n vert.addFunction(extractNthFeatureBit2);\r\n bitmapType = VariableType.Uint;\r\n } else {\r\n vert.addFunction(nthFeatureBitSet);\r\n vert.addFunction(extractNthFeatureBit);\r\n bitmapType = VariableType.Float;\r\n }\r\n vert.addUniform(\"u_globalOvrFlags\", bitmapType, (prog) => {\r\n prog.addGraphicUniform(\"u_globalOvrFlags\", (uniform, params) => {\r\n let flags = 0.0;\r\n if (params.geometry.isEdge) {\r\n const settings = params.target.currentEdgeSettings;\r\n flags = settings.computeOvrFlags(params.renderPass, params.target.currentViewFlags);\r\n }\r\n\r\n if (!params.geometry.allowColorOverride)\r\n flags |= OvrFlags.Rgba;\r\n\r\n uniform.setUniformBitflags(flags);\r\n });\r\n });\r\n }\r\n\r\n addLookupTable(vert, \"feature\", \"2.0\");\r\n vert.addGlobal(\"feature_texCoord\", VariableType.Vec2);\r\n vert.addFunction(computeFeatureTextureCoords);\r\n vert.addFunction(getFirstFeatureRgba);\r\n\r\n vert.addUniform(\"u_featureLUT\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_featureLUT\", (uniform, params) => {\r\n params.target.uniforms.batch.bindLUT(uniform);\r\n });\r\n });\r\n vert.addUniform(\"u_featureParams\", VariableType.Vec2, (prog) => {\r\n prog.addGraphicUniform(\"u_featureParams\", (uniform, params) => {\r\n params.target.uniforms.batch.bindLUTParams(uniform);\r\n });\r\n });\r\n\r\n if (wantColor) {\r\n vert.addFunction(getSecondFeatureRgba);\r\n if (wantAlpha) {\r\n addMaxAlpha(vert);\r\n addRenderPass(vert);\r\n addAlpha(vert);\r\n addTransparencyDiscardFlags(vert);\r\n\r\n vert.set(VertexShaderComponent.CheckForDiscard, checkVertexDiscard);\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function addMaxAlpha(builder: ShaderBuilder): void {\r\n const minTransparency = 15.0; // NB: See DisplayParams.getMinTransparency() - this must match!\r\n const maxAlpha = (255 - minTransparency) / 255;\r\n builder.addConstant(\"s_maxAlpha\", VariableType.Float, maxAlpha.toString());\r\n}\r\n\r\n/** @internal */\r\nfunction addEmphasisFlags(builder: ShaderBuilder): void {\r\n builder.addBitFlagConstant(\"kEmphBit_Hilite\", 0);\r\n builder.addBitFlagConstant(\"kEmphBit_Emphasize\", 1);\r\n builder.addBitFlagConstant(\"kEmphBit_Flash\", 2);\r\n builder.addBitFlagConstant(\"kEmphBit_NonLocatable\", 3);\r\n builder.addConstant(\"kEmphFlag_Hilite\", VariableType.Float, \"1.0\");\r\n builder.addConstant(\"kEmphFlag_Emphasize\", VariableType.Float, \"2.0\");\r\n builder.addConstant(\"kEmphFlag_Flash\", VariableType.Float, \"4.0\");\r\n builder.addConstant(\"kEmphFlag_NonLocatable\", VariableType.Float, \"8.0\");\r\n}\r\n\r\nfunction addHiliteSettings(frag: FragmentShaderBuilder, wantFlashMode: boolean): void {\r\n frag.addUniform(\"u_hilite_settings\", VariableType.Mat3, (prog) => {\r\n prog.addProgramUniform(\"u_hilite_settings\", (uniform, params) => {\r\n params.target.uniforms.hilite.bindFeatureSettings(uniform);\r\n });\r\n });\r\n\r\n if (wantFlashMode) {\r\n frag.addUniform(\"u_flash_mode\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"u_flash_mode\", (uniform, params) => {\r\n uniform.setUniform1f(params.geometry.getFlashMode(params));\r\n });\r\n });\r\n }\r\n}\r\n\r\n// If feature is not hilited, discard it.\r\nconst checkVertexHiliteDiscard = \"return 0.0 == v_feature_hilited;\";\r\n\r\n// The result is a mask in which each pixel's r=1 if hilited and g=1 if emphasized (and not hilited).\r\nconst computeHiliteColor = `\r\n float flags = floor(v_feature_hilited + 0.5);\r\n float hilited = extractNthBit(flags, kEmphBit_Hilite);\r\n float emphasized = extractNthBit(flags, kEmphBit_Emphasize);\r\n return vec4(hilited, emphasized, 0.0, 0.0);\r\n`;\r\n\r\nconst computeSurfaceHiliteColor = `\r\n if (isSurfaceBitSet(kSurfaceBit_HasTexture) && TEXTURE(s_texture, v_texCoord).a <= 0.15)\r\n return vec4(0.0);\r\n${computeHiliteColor}`;\r\n\r\nconst computeHiliteOverrides = `\r\n vec4 value = getFirstFeatureRgba();\r\n float emphFlags = value.g * 256.0;\r\n v_feature_hilited = kEmphFlag_Hilite * extractNthBit(emphFlags, kOvrBit_Hilited) + kEmphFlag_Emphasize * extractNthBit(emphFlags, kOvrBit_Emphasized);\r\n`;\r\n\r\nconst computeHiliteOverridesWithWeight = `${computeHiliteOverrides}\r\n float flags = value.r * 256.0;\r\n linear_feature_overrides = vec4(nthFeatureBitSet(flags, kOvrBit_Weight),\r\n value.a * 256.0,\r\n nthFeatureBitSet(flags, kOvrBit_LineCode),\r\n value.b * 256.0);\r\n`;\r\n\r\n/** @internal */\r\nexport function addSurfaceHiliter(builder: ProgramBuilder, wantWeight: boolean = false): void {\r\n addHiliter(builder, wantWeight);\r\n builder.frag.set(FragmentShaderComponent.ComputeBaseColor, computeSurfaceHiliteColor);\r\n}\r\n\r\n/** @internal */\r\nexport function addHiliter(builder: ProgramBuilder, wantWeight: boolean = false): void {\r\n let opts = FeatureSymbologyOptions.HasOverrides;\r\n if (wantWeight)\r\n opts |= FeatureSymbologyOptions.Weight; // hiliter never needs line code or color...\r\n\r\n if (!addCommon(builder, FeatureMode.Overrides, opts, wantWeight))\r\n return;\r\n\r\n builder.addVarying(\"v_feature_hilited\", VariableType.Float);\r\n\r\n addEmphasisFlags(builder.vert);\r\n builder.vert.set(VertexShaderComponent.ComputeFeatureOverrides, wantWeight ? computeHiliteOverridesWithWeight : computeHiliteOverrides);\r\n builder.vert.set(VertexShaderComponent.CheckForDiscard, checkVertexHiliteDiscard);\r\n\r\n addEmphasisFlags(builder.frag);\r\n addExtractNthBit(builder.frag);\r\n builder.frag.set(FragmentShaderComponent.ComputeBaseColor, computeHiliteColor);\r\n builder.frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\r\n}\r\n\r\nfunction addSamplers(frag: FragmentShaderBuilder, testFeatureId: boolean) {\r\n if (testFeatureId) {\r\n frag.addUniform(\"u_pickFeatureId\", VariableType.Sampler2D, (prog) => {\r\n prog.addProgramUniform(\"u_pickFeatureId\", (uniform, params) => {\r\n params.target.compositor.featureIds.bindSampler(uniform, TextureUnit.PickFeatureId);\r\n });\r\n }, VariablePrecision.High);\r\n }\r\n\r\n frag.addUniform(\"u_pickDepthAndOrder\", VariableType.Sampler2D, (prog) => {\r\n prog.addProgramUniform(\"u_pickDepthAndOrder\", (uniform, params) => {\r\n params.target.compositor.depthAndOrder.bindSampler(uniform, TextureUnit.PickDepthAndOrder);\r\n });\r\n }, VariablePrecision.High);\r\n}\r\n\r\n/** @internal */\r\nexport const readDepthAndOrder = `\r\nvec2 readDepthAndOrder(vec2 tc) {\r\n vec4 pdo = TEXTURE(u_pickDepthAndOrder, tc);\r\n float order = floor(pdo.x * 16.0 + 0.5);\r\n return vec2(order, decodeDepthRgb(pdo.yzw));\r\n}\r\n`;\r\n\r\nconst checkForEarlySurfaceDiscard = `\r\n float factor = float(u_renderPass <= kRenderPass_Translucent); // never discard during specific passes\r\n float term = 0.0;\r\n\r\n vec2 tc = windowCoordsToTexCoords(gl_FragCoord.xy);\r\n vec2 depthAndOrder = readDepthAndOrder(tc);\r\n\r\n float surfaceDepth = computeLinearDepth(v_eyeSpace.z);\r\n term += float(depthAndOrder.x > u_renderOrder && abs(depthAndOrder.y - surfaceDepth) < 4.0e-5);\r\n return factor * term > 0.0;\r\n`;\r\n\r\nconst checkForEarlySurfaceDiscardWithFeatureID = `\r\n // No normals => unlt => reality model => no edges.\r\n if (u_renderPass > kRenderPass_Translucent || u_renderPass == kRenderPass_Layers || !u_surfaceFlags[kSurfaceBitIndex_HasNormals])\r\n return false;\r\n\r\n vec2 tc = windowCoordsToTexCoords(gl_FragCoord.xy);\r\n vec2 depthAndOrder = readDepthAndOrder(tc);\r\n\r\n if (depthAndOrder.x <= u_renderOrder)\r\n return false;\r\n\r\n // Calculate depthTolerance for letting edges show through their own surfaces\r\n float perspectiveFrustum = step(kFrustumType_Perspective, u_frustum.z);\r\n vec4 eyeDirAndWidthFactor = mix(vec4(0.0, 0.0, 1.0, u_pixelWidthFactor), vec4(normalize(-v_eyeSpace.xyz), -v_eyeSpace.z * u_pixelWidthFactor), perspectiveFrustum);\r\n vec3 eyeDir = eyeDirAndWidthFactor.xyz;\r\n float dtWidthFactor = eyeDirAndWidthFactor.w;\r\n\r\n // Compute depth tolerance based on angle of triangle to screen\r\n float isSilhouette = float(depthAndOrder.x == kRenderOrder_Silhouette);\r\n float dSq = dot(eyeDir, v_n);\r\n dSq *= 0.5 + 0.4 * (1.0 - isSilhouette);\r\n dSq = dSq * dSq;\r\n dSq = max(dSq, 0.0001);\r\n dSq = min(dSq, 0.999);\r\n\r\n float depthTolerance = dtWidthFactor * v_lineWeight * sqrt((1.0 - dSq) / dSq);\r\n depthTolerance *= 1.0 + .333 * isSilhouette;\r\n\r\n // Make sure stuff behind camera doesn't get pushed in front of it\r\n depthTolerance = max(depthTolerance, 0.0);\r\n\r\n // Convert depthTolerance from eye space to linear depth\r\n depthTolerance /= (u_frustum.y - u_frustum.x);\r\n\r\n float surfaceDepth = computeLinearDepth(v_eyeSpace.z);\r\n float depthDelta = abs(depthAndOrder.y - surfaceDepth);\r\n if (depthDelta > depthTolerance)\r\n return false;\r\n\r\n // Does pick buffer contain same feature?\r\n vec4 featId = TEXTURE(u_pickFeatureId, tc);\r\n\r\n // Converting to ints to test since varying floats can be interpolated incorrectly\r\n ivec4 featId_i = ivec4(featId * 255.0 + 0.5);\r\n ivec4 feature_id_i = ivec4(feature_id * 255.0 + 0.5);\r\n if (featId_i == feature_id_i)\r\n return true;\r\n\r\n // In 2d, display priority controls draw order of different elements.\r\n if (!u_checkInterElementDiscard)\r\n return false;\r\n\r\n // Use a tighter tolerance for two different elements since we're only fighting roundoff error.\r\n return depthDelta <= 4.0e-5;\r\n`;\r\n\r\n// This only adds the constants that are actually used in shader code.\r\nexport function addRenderOrderConstants(builder: ShaderBuilder) {\r\n builder.addConstant(\"kRenderOrder_BlankingRegion\", VariableType.Float, RenderOrder.BlankingRegion.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_Linear\", VariableType.Float, RenderOrder.Linear.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_Edge\", VariableType.Float, RenderOrder.Edge.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_PlanarEdge\", VariableType.Float, RenderOrder.PlanarEdge.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_Silhouette\", VariableType.Float, RenderOrder.Silhouette.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_PlanarSilhouette\", VariableType.Float, RenderOrder.PlanarSilhouette.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_UnlitSurface\", VariableType.Float, RenderOrder.UnlitSurface.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_LitSurface\", VariableType.Float, RenderOrder.LitSurface.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_PlanarUnlitSurface\", VariableType.Float, RenderOrder.PlanarUnlitSurface.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_PlanarLitSurface\", VariableType.Float, RenderOrder.PlanarLitSurface.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_PlanarBit\", VariableType.Float, RenderOrder.PlanarBit.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_Background\", VariableType.Float, RenderOrder.Background.toFixed(1));\r\n}\r\n\r\n/** @internal */\r\nexport function addRenderOrder(builder: ShaderBuilder) {\r\n builder.addUniform(\"u_renderOrder\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"u_renderOrder\", (uniform, params) => {\r\n const order = params.target.drawingBackgroundForReadPixels ? RenderOrder.Background : params.geometry.renderOrder;\r\n uniform.setUniform1f(order);\r\n });\r\n });\r\n}\r\n\r\nfunction addPixelWidthFactor(builder: ShaderBuilder) {\r\n builder.addUniform(\"u_pixelWidthFactor\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"u_pixelWidthFactor\", (uniform, params) => {\r\n params.target.uniforms.bindPixelWidthFactor(uniform);\r\n });\r\n });\r\n}\r\n\r\nfunction addBatchId(builder: ShaderBuilder) {\r\n builder.addUniform(\"u_batch_id\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_batch_id\", (uniform, params) => {\r\n params.target.uniforms.batch.bindBatchId(uniform);\r\n });\r\n }, VariablePrecision.High);\r\n}\r\n\r\nconst computeIdVert = `v_feature_id = addUInt32s(u_batch_id, vec4(g_featureIndex, 0.0)) / 255.0;`;\r\nconst computeIdFrag = `\r\n vec4 featureIndex = vec4(floor(v_feature_index + 0.5), 0.0);\r\n feature_id = addUInt32s(u_batch_id, featureIndex) / 255.0;\r\n`;\r\n\r\n/** @internal */\r\nexport function addFeatureId(builder: ProgramBuilder, computeInFrag: boolean) {\r\n const vert = builder.vert;\r\n const frag = builder.frag;\r\n frag.addGlobal(\"feature_id\", VariableType.Vec4);\r\n if (!computeInFrag) {\r\n vert.addFunction(addUInt32s);\r\n addBatchId(vert);\r\n builder.addInlineComputedVarying(\"v_feature_id\", VariableType.Vec4, computeIdVert);\r\n\r\n frag.addInitializer(\"feature_id = v_feature_id;\");\r\n } else {\r\n frag.addFunction(addUInt32s);\r\n builder.addInlineComputedVarying(\"v_feature_index\", VariableType.Vec3, \"v_feature_index = g_featureIndex;\");\r\n\r\n addBatchId(frag);\r\n frag.addInitializer(computeIdFrag);\r\n }\r\n}\r\n\r\n// Discard vertex if transparency is less than the display style's transparency threshold, IFF the specific bit is set. The bit is set if:\r\n// - Solid Fill or Hidden Line mode; or\r\n// - Shaded mode and generating shadow map (sufficiently transparent surfaces receive but do not cast shadows).\r\nconst isBelowTransparencyThreshold = `\r\n return v_color.a < u_transparencyThreshold && u_surfaceFlags[kSurfaceBitIndex_TransparencyThreshold];\r\n`;\r\n\r\n/** @internal */\r\nexport function addSurfaceDiscard(builder: ProgramBuilder, flags: TechniqueFlags) {\r\n const feat = flags.featureMode;\r\n const isEdgeTestNeeded = flags.isEdgeTestNeeded;\r\n const isClassified = flags.isClassified;\r\n const computeIdInFrag = !flags.isTranslucent && 0 !== flags.isClassified && FeatureMode.Overrides === feat;\r\n\r\n const frag = builder.frag;\r\n const vert = builder.vert;\r\n\r\n vert.set(VertexShaderComponent.CheckForLateDiscard, isBelowTransparencyThreshold);\r\n vert.addUniform(\"u_transparencyThreshold\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"u_transparencyThreshold\", (uniform, params) => {\r\n uniform.setUniform1f(params.target.currentTransparencyThreshold);\r\n });\r\n });\r\n\r\n if (isEdgeTestNeeded) {\r\n addWindowToTexCoords(frag);\r\n\r\n if (!flags.isHilite)\r\n addEyeSpace(builder);\r\n\r\n if (FeatureMode.None === feat) {\r\n addSamplers(frag, false);\r\n frag.addFunction(computeLinearDepth);\r\n frag.addFunction(decodeDepthRgb);\r\n frag.addFunction(readDepthAndOrder);\r\n frag.set(FragmentShaderComponent.CheckForEarlyDiscard, checkForEarlySurfaceDiscard);\r\n } else {\r\n frag.addUniform(\"u_checkInterElementDiscard\", VariableType.Boolean, (prog) => {\r\n prog.addGraphicUniform(\"u_checkInterElementDiscard\", (uniform, params) => {\r\n uniform.setUniform1i(params.target.uniforms.branch.top.is3d ? 1 : 0);\r\n });\r\n });\r\n\r\n addFeatureIndex(vert);\r\n addLineWeight(vert);\r\n\r\n addSamplers(frag, true);\r\n addRenderOrderConstants(frag);\r\n addPixelWidthFactor(frag);\r\n frag.addFunction(computeLinearDepth);\r\n frag.addFunction(decodeDepthRgb);\r\n frag.addFunction(readDepthAndOrder);\r\n\r\n frag.set(FragmentShaderComponent.CheckForEarlyDiscard, checkForEarlySurfaceDiscardWithFeatureID);\r\n\r\n builder.addInlineComputedVarying(\"v_lineWeight\", VariableType.Float, \"v_lineWeight = computeLineWeight();\");\r\n addFeatureId(builder, computeIdInFrag);\r\n }\r\n\r\n addRenderOrder(frag);\r\n addRenderPass(frag);\r\n } else if (isClassified && FeatureMode.None !== feat) {\r\n addFeatureIndex(vert);\r\n addFeatureId(builder, computeIdInFrag);\r\n\r\n if (!flags.isTranslucent)\r\n addRenderOrder(frag);\r\n }\r\n}\r\n\r\n// bool feature_invisible = false;\r\n// vec3 feature_rgb; // if not overridden, .r < 0; else rgb color override\r\n// float feature_alpha // alpha if overridden, else < 0\r\n// varying float v_feature_emphasis // bitmask - see kEmph_* constants\r\n// vec4 linear_feature_overrides; // x: weight overridden y: weight z: line code overridden w: line code\r\nconst computeFeatureOverrides = `\r\n feature_rgb = vec3(-1.0);\r\n feature_alpha = -1.0;\r\n vec4 value = getFirstFeatureRgba();\r\n\r\n float emphFlags = value.y * 256.0;\r\n v_feature_emphasis = kEmphFlag_Hilite * extractNthBit(emphFlags, kOvrBit_Hilited) + kEmphFlag_Emphasize * extractNthBit(emphFlags, kOvrBit_Emphasized);\r\n\r\n float flags = value.x * 256.0;\r\n if (0.0 == flags)\r\n return; // nothing overridden for this feature\r\n\r\n bool nonLocatable = (u_shaderFlags[kShaderBit_IgnoreNonLocatable] ? nthFeatureBitSet(flags, kOvrBit_NonLocatable) : false);\r\n v_feature_emphasis += kEmphFlag_NonLocatable * float(nthFeatureBitSet(flags, kOvrBit_NonLocatable));\r\n bool invisible = nthFeatureBitSet(flags, kOvrBit_Visibility);\r\n feature_invisible = invisible || nonLocatable;\r\n if (feature_invisible)\r\n return;\r\n\r\n bool rgbOverridden = nthFeatureBitSet(flags, kOvrBit_Rgb);\r\n bool alphaOverridden = nthFeatureBitSet(flags, kOvrBit_Alpha);\r\n if (alphaOverridden || rgbOverridden) {\r\n vec4 rgba = getSecondFeatureRgba();\r\n if (rgbOverridden)\r\n feature_rgb = rgba.rgb;\r\n\r\n if (alphaOverridden) {\r\n feature_alpha = rgba.a;\r\n feature_viewIndependentTransparency = nthFeatureBitSet(emphFlags, kOvrBit_ViewIndependentTransparency);\r\n }\r\n }\r\n\r\n linear_feature_overrides = vec4(nthFeatureBitSet(flags, kOvrBit_Weight),\r\n value.w * 256.0,\r\n nthFeatureBitSet(flags, kOvrBit_LineCode),\r\n value.z * 256.0);\r\n\r\n feature_ignore_material = nthFeatureBitSet(flags, kOvrBit_IgnoreMaterial);\r\n use_material = use_material && !feature_ignore_material;\r\n\r\n v_feature_emphasis += kEmphFlag_Flash * extractNthFeatureBit(flags, kOvrBit_Flashed);\r\n`;\r\n\r\n// feature_rgb.r = -1.0 if rgb color not overridden for feature.\r\n// feature_alpha = -1.0 if alpha not overridden for feature.\r\nconst applyFeatureColor = `\r\n vec3 rgb = mix(baseColor.rgb, feature_rgb.rgb, step(0.0, feature_rgb.r));\r\n float alpha = mix(baseColor.a, feature_alpha, step(0.0, feature_alpha));\r\n return vec4(rgb, alpha);\r\n`;\r\n\r\n// feature_rgb.r = -1.0 if rgb color not overridden for feature, else mix based on u_overrrideColorMix.\r\n// feature_alpha = -1.0 if alpha not overridden for feature.\r\nexport const mixFeatureColor = `\r\n vec3 rgb = mix(baseColor.rgb, mix(baseColor.rgb, feature_rgb.rgb, u_overrideColorMix), step(0.0, feature_rgb.r));\r\n float alpha = mix(baseColor.a, feature_alpha, step(0.0, feature_alpha));\r\n return vec4(rgb, alpha);\r\n `;\r\n\r\nconst applyFlash = `\r\n float flashHilite = floor(v_feature_emphasis + 0.5);\r\n return doApplyFlash(flashHilite, baseColor);\r\n`;\r\n\r\nconst doApplyFlash = `\r\nvec4 doApplyFlash(float flags, vec4 baseColor) {\r\n bool isFlashed = nthBitSet(flags, kEmphBit_Flash);\r\n bool isHilited = nthBitSet(flags, kEmphBit_Hilite);\r\n bool isEmphasized = !isHilited && nthBitSet(flags, kEmphBit_Emphasize);\r\n vec3 hiliteRgb = isEmphasized ? u_hilite_settings[1] : u_hilite_settings[0];\r\n\r\n isHilited = isEmphasized || isHilited;\r\n float hiliteRatio = isHilited ? (isEmphasized ? u_hilite_settings[2][1] : u_hilite_settings[2][0]) : 0.0;\r\n baseColor.rgb = mix(baseColor.rgb, hiliteRgb, hiliteRatio);\r\n\r\n const float maxBrighten = 0.2;\r\n float brighten = isFlashed ? u_flash_intensity * maxBrighten : 0.0;\r\n vec3 brightRgb = baseColor.rgb + brighten;\r\n\r\n const float maxTween = 0.75;\r\n float hiliteFraction = isFlashed ? u_flash_intensity * maxTween : 0.0;\r\n vec3 tweenRgb = baseColor.rgb * (1.0 - hiliteFraction);\r\n tweenRgb += u_hilite_settings[0] * hiliteFraction;\r\n\r\n return vec4(mix(tweenRgb, brightRgb, u_flash_mode), baseColor.a);\r\n}\r\n`;\r\n\r\nconst doClassifierFlash = `\r\nvec4 applyClassifierFlash(vec4 baseColor) {\r\n const float maxBrighten = 0.2;\r\n float brighten = u_flash_intensity * maxBrighten;\r\n vec3 brightRgb = baseColor.rgb + brighten;\r\n return vec4(brightRgb, baseColor.a);\r\n}\r\n`;\r\n\r\n/** @internal */\r\nexport function addClassifierFlash(frag: FragmentShaderBuilder): void {\r\n addFlashIntensity(frag);\r\n addHiliteSettings(frag, false);\r\n frag.addFunction(doClassifierFlash);\r\n}\r\n\r\nfunction addFlashIntensity(frag: FragmentShaderBuilder): void {\r\n frag.addUniform(\"u_flash_intensity\", VariableType.Float, (prog) => {\r\n prog.addProgramUniform(\"u_flash_intensity\", (uniform, params) => {\r\n uniform.setUniform1f(params.target.flashIntensity);\r\n });\r\n });\r\n}\r\n\r\nfunction addApplyFlash(frag: FragmentShaderBuilder) {\r\n addHiliteSettings(frag, true);\r\n addEmphasisFlags(frag);\r\n\r\n addExtractNthBit(frag);\r\n frag.addFunction(doApplyFlash);\r\n frag.set(FragmentShaderComponent.ApplyFlash, applyFlash);\r\n addFlashIntensity(frag);\r\n}\r\n\r\n/** @internal */\r\nexport function addFeatureSymbology(builder: ProgramBuilder, feat: FeatureMode, opts: FeatureSymbologyOptions): void {\r\n if (!addCommon(builder, feat, opts) || FeatureSymbologyOptions.None === opts)\r\n return;\r\n\r\n assert((FeatureSymbologyOptions.HasOverrides | FeatureSymbologyOptions.Color) === (opts & (FeatureSymbologyOptions.HasOverrides | FeatureSymbologyOptions.Color)));\r\n\r\n builder.addGlobal(\"feature_rgb\", VariableType.Vec3);\r\n builder.addGlobal(\"feature_alpha\", VariableType.Float);\r\n builder.addVarying(\"v_feature_emphasis\", VariableType.Float);\r\n\r\n const vert = builder.vert;\r\n vert.addGlobal(\"feature_invisible\", VariableType.Boolean, \"false\");\r\n vert.addGlobal(\"feature_viewIndependentTransparency\", VariableType.Boolean, \"false\");\r\n\r\n addEmphasisFlags(vert);\r\n vert.addGlobal(\"use_material\", VariableType.Boolean, \"true\");\r\n vert.set(VertexShaderComponent.ComputeFeatureOverrides, computeFeatureOverrides);\r\n vert.set(VertexShaderComponent.ApplyFeatureColor, applyFeatureColor);\r\n\r\n addApplyFlash(builder.frag);\r\n}\r\n\r\n/** If we're running the hilite shader for a uniform feature, it follows that the feature must be hilited.\r\n * So the hilite shader simply needs to output '1' for every fragment.\r\n * @internal\r\n */\r\nexport function addUniformHiliter(builder: ProgramBuilder): void {\r\n builder.frag.set(FragmentShaderComponent.ComputeBaseColor, `return vec4(1.0, 0.0, 0.0, 0.0);`);\r\n builder.frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\r\n}\r\n\r\n/** For a uniform feature table, the feature ID output to pick buffers is equal to the batch ID.\r\n * The following symbology overrides are supported:\r\n * - Visibility - implcitly, because if the feature is invisible its geometry will never be drawn.\r\n * - Flash\r\n * - Hilite\r\n * - Color and Transparency- only for point clouds currently which set addFeatureColor to true.\r\n * This shader could be simplified, but want to share code with the non-uniform versions...hence uniforms/globals with \"v_\" prefix typically used for varyings on no prefix...\r\n * @internal\r\n */\r\nexport function addUniformFeatureSymbology(builder: ProgramBuilder, addFeatureColor: boolean): void {\r\n builder.vert.addGlobal(\"g_featureIndex\", VariableType.Vec3, \"vec3(0.0)\", true);\r\n\r\n builder.frag.addUniform(\"v_feature_emphasis\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"v_feature_emphasis\", (uniform, params) => {\r\n params.target.uniforms.batch.bindUniformSymbologyFlags(uniform);\r\n });\r\n });\r\n\r\n if (addFeatureColor) {\r\n builder.vert.addUniform(\"feature_rgb\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"feature_rgb\", (uniform, params) => {\r\n params.target.uniforms.batch.bindUniformColorOverride(uniform);\r\n });\r\n });\r\n\r\n builder.vert.addUniform(\"feature_alpha\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"feature_alpha\", (uniform, params) => {\r\n params.target.uniforms.batch.bindUniformTransparencyOverride(uniform);\r\n });\r\n });\r\n\r\n builder.vert.set(VertexShaderComponent.ApplyFeatureColor, applyFeatureColor);\r\n addAlpha(builder.vert);\r\n addMaxAlpha(builder.vert);\r\n addRenderPass(builder.vert);\r\n addTransparencyDiscardFlags(builder.vert);\r\n builder.vert.set(VertexShaderComponent.CheckForDiscard, checkVertexDiscard);\r\n } else {\r\n builder.vert.set(VertexShaderComponent.CheckForDiscard, \"return feature_invisible;\");\r\n }\r\n\r\n // Non-Locatable... Discard if picking\r\n builder.vert.addUniform(\"feature_invisible\", VariableType.Boolean, (prog) => {\r\n prog.addGraphicUniform(\"feature_invisible\", (uniform, params) => {\r\n params.target.uniforms.batch.bindUniformNonLocatable(uniform, params.target.drawNonLocatable);\r\n });\r\n });\r\n\r\n builder.vert.addGlobal(\"feature_viewIndependentTransparency\", VariableType.Boolean, \"false\");\r\n\r\n addApplyFlash(builder.frag);\r\n}\r\n"]}
1
+ {"version":3,"file":"FeatureSymbology.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/FeatureSymbology.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { OvrFlags, Pass, RenderOrder, TextureUnit } from \"../RenderFlags\";\r\nimport {\r\n FragmentShaderBuilder, FragmentShaderComponent, ProgramBuilder, ShaderBuilder, VariablePrecision, VariableType, VertexShaderBuilder,\r\n VertexShaderComponent,\r\n} from \"../ShaderBuilder\";\r\nimport { System } from \"../System\";\r\nimport { FeatureMode, TechniqueFlags } from \"../TechniqueFlags\";\r\nimport { addExtractNthBit, addEyeSpace, addUInt32s } from \"./Common\";\r\nimport { decodeDepthRgb, decodeUint24 } from \"./Decode\";\r\nimport { addWindowToTexCoords, assignFragColor, computeLinearDepth } from \"./Fragment\";\r\nimport { addLookupTable } from \"./LookupTable\";\r\nimport { addRenderPass } from \"./RenderPass\";\r\nimport { addAlpha, addLineWeight, replaceLineCode, replaceLineWeight } from \"./Vertex\";\r\n\r\n/* eslint-disable no-restricted-syntax */\r\n\r\n/** @internal */\r\nexport const enum FeatureSymbologyOptions {\r\n None = 0,\r\n Weight = 1 << 0,\r\n LineCode = 1 << 1,\r\n HasOverrides = 1 << 2,\r\n Color = 1 << 3,\r\n Alpha = 1 << 4,\r\n\r\n Surface = HasOverrides | Color | Alpha,\r\n Point = HasOverrides | Color | Weight | Alpha,\r\n Linear = HasOverrides | Color | Weight | LineCode | Alpha,\r\n}\r\n\r\n/** @internal */\r\nexport function addOvrFlagConstants(builder: ShaderBuilder): void {\r\n // NB: These are the bit positions of each flag in OvrFlags enum - not the flag values\r\n builder.addBitFlagConstant(\"kOvrBit_Visibility\", 0);\r\n builder.addBitFlagConstant(\"kOvrBit_Rgb\", 1);\r\n builder.addBitFlagConstant(\"kOvrBit_Alpha\", 2);\r\n builder.addBitFlagConstant(\"kOvrBit_IgnoreMaterial\", 3);\r\n builder.addBitFlagConstant(\"kOvrBit_Flashed\", 4);\r\n builder.addBitFlagConstant(\"kOvrBit_NonLocatable\", 5);\r\n builder.addBitFlagConstant(\"kOvrBit_LineCode\", 6);\r\n builder.addBitFlagConstant(\"kOvrBit_Weight\", 7);\r\n\r\n // NB: We treat the 16-bit flags as 2 bytes - so subtract 8 from each of these bit indices.\r\n builder.addBitFlagConstant(\"kOvrBit_Hilited\", 0);\r\n builder.addBitFlagConstant(\"kOvrBit_Emphasized\", 1);\r\n builder.addBitFlagConstant(\"kOvrBit_ViewIndependentTransparency\", 2);\r\n}\r\n\r\nconst computeLUTFeatureIndex = `g_featureAndMaterialIndex.xyz`;\r\nconst computeInstanceFeatureIndex = `g_isAreaPattern ? u_patternFeatureId : a_featureId`;\r\nfunction computeFeatureIndex(vertex: VertexShaderBuilder): string {\r\n if (vertex.usesInstancedGeometry) {\r\n vertex.addUniform(\"u_patternFeatureId\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"u_patternFeatureId\", (uniform, params) => {\r\n const id = params.geometry.asInstanced?.patternFeatureId;\r\n assert(undefined !== id);\r\n if (id)\r\n uniform.setUniform3fv(id);\r\n });\r\n });\r\n\r\n return `g_featureIndex = ${computeInstanceFeatureIndex};`;\r\n }\r\n\r\n return vertex.usesVertexTable ? `g_featureIndex = ${computeLUTFeatureIndex};` : \"\";\r\n}\r\nfunction getFeatureIndex(vertex: VertexShaderBuilder): string {\r\n return `\r\nfloat getFeatureIndex() {\r\n ${computeFeatureIndex(vertex)}\r\n return decodeUInt24(g_featureIndex);\r\n}\r\n`;\r\n}\r\n\r\n// Returns true if the specified flag is not globally overridden and is set in flags\r\nconst nthFeatureBitSet = `\r\nbool nthFeatureBitSet(float flags, float n) {\r\n return !nthBitSet(u_globalOvrFlags, n) && nthBitSet(flags, n);\r\n}\r\n`;\r\nconst nthFeatureBitSet2 = `\r\nbool nthFeatureBitSet(float flags, uint n) {\r\n return 0u == (u_globalOvrFlags & n) && nthBitSet(flags, n);\r\n}\r\n`;\r\n\r\n// Returns 1.0 if the specified flag is not globally overridden and is set in flags\r\nconst extractNthFeatureBit = `\r\nfloat extractNthFeatureBit(float flags, float n) {\r\n return !nthBitSet(u_globalOvrFlags, n) && nthBitSet(flags, n) ? 1.0 : 0.0;\r\n}\r\n`;\r\nconst extractNthFeatureBit2 = `\r\nfloat extractNthFeatureBit(float flags, uint n) {\r\n return 0u == (u_globalOvrFlags & n) && nthBitSet(flags, n) ? 1.0 : 0.0;\r\n}\r\n`;\r\n\r\nconst computeFeatureTextureCoords = `\r\nvec2 computeFeatureTextureCoords() { return compute_feature_coords(getFeatureIndex()); }\r\n`;\r\n\r\nconst getFirstFeatureRgba = `\r\nvec4 getFirstFeatureRgba() {\r\n feature_texCoord = computeFeatureTextureCoords();\r\n return TEXTURE(u_featureLUT, feature_texCoord);\r\n}\r\n`;\r\n\r\nconst getSecondFeatureRgba = `\r\nvec4 getSecondFeatureRgba() {\r\n vec2 coord = feature_texCoord;\r\n coord.x += g_feature_stepX;\r\n return TEXTURE(u_featureLUT, coord);\r\n}\r\n`;\r\n\r\nconst computeLineWeight = `\r\nfloat computeLineWeight() {\r\n return linear_feature_overrides.x > 0.5 ? linear_feature_overrides.y : g_lineWeight;\r\n}\r\n`;\r\n\r\nconst computeLineCode = `\r\nfloat computeLineCode() {\r\n return linear_feature_overrides.z > 0.5 ? linear_feature_overrides.w : g_lineCode;\r\n}\r\n`;\r\n\r\nfunction addFeatureIndex(vert: VertexShaderBuilder): void {\r\n vert.addGlobal(\"g_featureIndex\", VariableType.Vec3);\r\n\r\n vert.addFunction(decodeUint24);\r\n vert.addFunction(getFeatureIndex(vert));\r\n}\r\n\r\n// Discards vertex if feature is invisible; or rendering opaque during translucent pass or vice-versa\r\n// (The latter occurs when some translucent feature is overridden to be opaque, or vice-versa)\r\nconst checkVertexDiscard = `\r\n if (feature_invisible)\r\n return true;\r\n\r\n bool hasAlpha = 1.0 == u_hasAlpha;\r\n if (feature_alpha > 0.0)\r\n hasAlpha = feature_alpha <= s_maxAlpha;\r\n\r\n int discardFlags = u_transparencyDiscardFlags;\r\n bool discardViewIndependentDuringOpaque = discardFlags >= 4;\r\n if (discardViewIndependentDuringOpaque)\r\n discardFlags = discardFlags - 4;\r\n\r\n bool isOpaquePass = (kRenderPass_OpaqueLinear <= u_renderPass && kRenderPass_OpaqueGeneral >= u_renderPass);\r\n bool discardTranslucentDuringOpaquePass = 1 == discardFlags || 3 == discardFlags || (feature_viewIndependentTransparency && discardViewIndependentDuringOpaque);\r\n if (isOpaquePass && !discardTranslucentDuringOpaquePass)\r\n return false;\r\n\r\n bool isTranslucentPass = kRenderPass_Translucent == u_renderPass;\r\n bool discardOpaqueDuringTranslucentPass = 2 == discardFlags || 3 == discardFlags;\r\n if (isTranslucentPass && !discardOpaqueDuringTranslucentPass)\r\n return false;\r\n\r\n return (isOpaquePass && hasAlpha) || (isTranslucentPass && !hasAlpha);\r\n`;\r\n\r\nfunction addTransparencyDiscardFlags(vert: VertexShaderBuilder) {\r\n // Even when transparency view flag is off, we need to allow features to override transparency, because it\r\n // is used when applying transparency threshold. However, we need to ensure we don't DISCARD transparent stuff during\r\n // opaque pass if transparency is off (see checkVertexDiscard). Especially important for transparency threshold and readPixels().\r\n // Also, if we override raster text to be opaque we must still draw it in the translucent pass.\r\n // Finally, if the transparency override is view-independent (i.e., ignores view flags and render mode) we want to discard it during opaque pass\r\n // unless we're reading pixels.\r\n // So we have a bit field:\r\n // 1: discard translucent during opaque.\r\n // 2: discard opaque during translucent.\r\n // 4: discard view-independent translucent during opaque.\r\n vert.addUniform(\"u_transparencyDiscardFlags\", VariableType.Int, (prog) => {\r\n prog.addGraphicUniform(\"u_transparencyDiscardFlags\", (uniform, params) => {\r\n let flags = 0;\r\n\r\n // Textured surfaces may render in both passes. If so, it's up to fragment shader to handle discard.\r\n const pass = params.geometry.getPass(params.target);\r\n if (!Pass.rendersOpaqueAndTranslucent(pass)) {\r\n // During readPixels() we force transparency off. Make sure to ignore a Branch that turns it back on.\r\n if (!params.target.isReadPixelsInProgress)\r\n flags = params.target.currentViewFlags.transparency ? 1 : 4;\r\n\r\n if (!params.geometry.alwaysRenderTranslucent)\r\n flags += 2;\r\n }\r\n\r\n uniform.setUniform1i(flags);\r\n });\r\n });\r\n}\r\n\r\nfunction addCommon(builder: ProgramBuilder, mode: FeatureMode, opts: FeatureSymbologyOptions, wantGlobalOvrFlags = true): boolean {\r\n if (FeatureMode.None === mode)\r\n return false;\r\n\r\n const vert = builder.vert;\r\n addFeatureIndex(vert);\r\n\r\n const haveOverrides = FeatureSymbologyOptions.None !== (opts & FeatureSymbologyOptions.HasOverrides);\r\n if (!haveOverrides) {\r\n // For pick output we must compute g_featureIndex...\r\n if (FeatureMode.Pick === mode)\r\n vert.set(VertexShaderComponent.ComputeFeatureOverrides, computeFeatureIndex(vert));\r\n\r\n return true;\r\n }\r\n\r\n const wantWeight = FeatureSymbologyOptions.None !== (opts & FeatureSymbologyOptions.Weight);\r\n const wantLineCode = FeatureSymbologyOptions.None !== (opts & FeatureSymbologyOptions.LineCode);\r\n const wantColor = FeatureSymbologyOptions.None !== (opts & FeatureSymbologyOptions.Color);\r\n const wantAlpha = FeatureSymbologyOptions.None !== (opts & FeatureSymbologyOptions.Alpha);\r\n assert(wantColor || !wantAlpha);\r\n\r\n addExtractNthBit(vert);\r\n addOvrFlagConstants(vert);\r\n\r\n vert.addGlobal(\"linear_feature_overrides\", VariableType.Vec4, \"vec4(0.0)\");\r\n vert.addGlobal(\"feature_ignore_material\", VariableType.Boolean, \"false\");\r\n\r\n if (wantWeight || wantLineCode) {\r\n if (wantLineCode)\r\n replaceLineCode(vert, computeLineCode);\r\n\r\n if (wantWeight) {\r\n replaceLineWeight(vert, computeLineWeight);\r\n }\r\n }\r\n\r\n if (wantGlobalOvrFlags) {\r\n let bitmapType;\r\n if (System.instance.capabilities.isWebGL2) {\r\n vert.addFunction(nthFeatureBitSet2);\r\n vert.addFunction(extractNthFeatureBit2);\r\n bitmapType = VariableType.Uint;\r\n } else {\r\n vert.addFunction(nthFeatureBitSet);\r\n vert.addFunction(extractNthFeatureBit);\r\n bitmapType = VariableType.Float;\r\n }\r\n vert.addUniform(\"u_globalOvrFlags\", bitmapType, (prog) => {\r\n prog.addGraphicUniform(\"u_globalOvrFlags\", (uniform, params) => {\r\n let flags = 0.0;\r\n if (params.geometry.isEdge) {\r\n const settings = params.target.currentEdgeSettings;\r\n flags = settings.computeOvrFlags(params.renderPass, params.target.currentViewFlags);\r\n }\r\n\r\n if (!params.geometry.allowColorOverride)\r\n flags |= OvrFlags.Rgba;\r\n\r\n uniform.setUniformBitflags(flags);\r\n });\r\n });\r\n }\r\n\r\n addLookupTable(vert, \"feature\", \"2.0\");\r\n vert.addGlobal(\"feature_texCoord\", VariableType.Vec2);\r\n vert.addFunction(computeFeatureTextureCoords);\r\n vert.addFunction(getFirstFeatureRgba);\r\n\r\n vert.addUniform(\"u_featureLUT\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_featureLUT\", (uniform, params) => {\r\n params.target.uniforms.batch.bindLUT(uniform);\r\n });\r\n });\r\n vert.addUniform(\"u_featureParams\", VariableType.Vec2, (prog) => {\r\n prog.addGraphicUniform(\"u_featureParams\", (uniform, params) => {\r\n params.target.uniforms.batch.bindLUTParams(uniform);\r\n });\r\n });\r\n\r\n if (wantColor) {\r\n vert.addFunction(getSecondFeatureRgba);\r\n if (wantAlpha) {\r\n addMaxAlpha(vert);\r\n addRenderPass(vert);\r\n addAlpha(vert);\r\n addTransparencyDiscardFlags(vert);\r\n\r\n vert.set(VertexShaderComponent.CheckForDiscard, checkVertexDiscard);\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function addMaxAlpha(builder: ShaderBuilder): void {\r\n const minTransparency = 15.0; // NB: See DisplayParams.getMinTransparency() - this must match!\r\n const maxAlpha = (255 - minTransparency) / 255;\r\n builder.addConstant(\"s_maxAlpha\", VariableType.Float, maxAlpha.toString());\r\n}\r\n\r\n/** @internal */\r\nfunction addEmphasisFlags(builder: ShaderBuilder): void {\r\n // Must be kept in sync with EmphasisFlags enum.\r\n builder.addBitFlagConstant(\"kEmphBit_Hilite\", 0);\r\n builder.addBitFlagConstant(\"kEmphBit_Emphasize\", 1);\r\n builder.addBitFlagConstant(\"kEmphBit_Flash\", 2);\r\n builder.addBitFlagConstant(\"kEmphBit_NonLocatable\", 3);\r\n builder.addConstant(\"kEmphFlag_Hilite\", VariableType.Float, \"1.0\");\r\n builder.addConstant(\"kEmphFlag_Emphasize\", VariableType.Float, \"2.0\");\r\n builder.addConstant(\"kEmphFlag_Flash\", VariableType.Float, \"4.0\");\r\n builder.addConstant(\"kEmphFlag_NonLocatable\", VariableType.Float, \"8.0\");\r\n}\r\n\r\nfunction addHiliteSettings(frag: FragmentShaderBuilder, wantFlashMode: boolean): void {\r\n frag.addUniform(\"u_hilite_settings\", VariableType.Mat3, (prog) => {\r\n prog.addProgramUniform(\"u_hilite_settings\", (uniform, params) => {\r\n params.target.uniforms.hilite.bindFeatureSettings(uniform);\r\n });\r\n });\r\n\r\n if (wantFlashMode) {\r\n frag.addUniform(\"u_flash_mode\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"u_flash_mode\", (uniform, params) => {\r\n uniform.setUniform1f(params.geometry.getFlashMode(params));\r\n });\r\n });\r\n }\r\n}\r\n\r\n// If feature is not hilited, discard it.\r\nconst checkVertexHiliteDiscard = \"return 0.0 == v_feature_hilited;\";\r\n\r\n// The result is a mask in which each pixel's r=1 if hilited and g=1 if emphasized (and not hilited).\r\nconst computeHiliteColor = `\r\n float flags = floor(v_feature_hilited + 0.5);\r\n float hilited = extractNthBit(flags, kEmphBit_Hilite);\r\n float emphasized = extractNthBit(flags, kEmphBit_Emphasize);\r\n return vec4(hilited, emphasized, 0.0, 0.0);\r\n`;\r\n\r\nconst computeSurfaceHiliteColor = `\r\n if (isSurfaceBitSet(kSurfaceBit_HasTexture) && TEXTURE(s_texture, v_texCoord).a <= 0.15)\r\n return vec4(0.0);\r\n${computeHiliteColor}`;\r\n\r\nconst computeHiliteOverrides = `\r\n vec4 value = getFirstFeatureRgba();\r\n float emphFlags = value.g * 256.0;\r\n v_feature_hilited = kEmphFlag_Hilite * extractNthBit(emphFlags, kOvrBit_Hilited) + kEmphFlag_Emphasize * extractNthBit(emphFlags, kOvrBit_Emphasized);\r\n`;\r\n\r\nconst computeHiliteOverridesWithWeight = `${computeHiliteOverrides}\r\n float flags = value.r * 256.0;\r\n linear_feature_overrides = vec4(nthFeatureBitSet(flags, kOvrBit_Weight),\r\n value.a * 256.0,\r\n nthFeatureBitSet(flags, kOvrBit_LineCode),\r\n value.b * 256.0);\r\n`;\r\n\r\n/** @internal */\r\nexport function addSurfaceHiliter(builder: ProgramBuilder, wantWeight: boolean = false): void {\r\n addHiliter(builder, wantWeight);\r\n builder.frag.set(FragmentShaderComponent.ComputeBaseColor, computeSurfaceHiliteColor);\r\n}\r\n\r\n/** @internal */\r\nexport function addHiliter(builder: ProgramBuilder, wantWeight: boolean = false): void {\r\n let opts = FeatureSymbologyOptions.HasOverrides;\r\n if (wantWeight)\r\n opts |= FeatureSymbologyOptions.Weight; // hiliter never needs line code or color...\r\n\r\n if (!addCommon(builder, FeatureMode.Overrides, opts, wantWeight))\r\n return;\r\n\r\n builder.addVarying(\"v_feature_hilited\", VariableType.Float);\r\n\r\n addEmphasisFlags(builder.vert);\r\n builder.vert.set(VertexShaderComponent.ComputeFeatureOverrides, wantWeight ? computeHiliteOverridesWithWeight : computeHiliteOverrides);\r\n builder.vert.set(VertexShaderComponent.CheckForDiscard, checkVertexHiliteDiscard);\r\n\r\n addEmphasisFlags(builder.frag);\r\n addExtractNthBit(builder.frag);\r\n builder.frag.set(FragmentShaderComponent.ComputeBaseColor, computeHiliteColor);\r\n builder.frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\r\n}\r\n\r\nfunction addSamplers(frag: FragmentShaderBuilder, testFeatureId: boolean) {\r\n if (testFeatureId) {\r\n frag.addUniform(\"u_pickFeatureId\", VariableType.Sampler2D, (prog) => {\r\n prog.addProgramUniform(\"u_pickFeatureId\", (uniform, params) => {\r\n params.target.compositor.featureIds.bindSampler(uniform, TextureUnit.PickFeatureId);\r\n });\r\n }, VariablePrecision.High);\r\n }\r\n\r\n frag.addUniform(\"u_pickDepthAndOrder\", VariableType.Sampler2D, (prog) => {\r\n prog.addProgramUniform(\"u_pickDepthAndOrder\", (uniform, params) => {\r\n params.target.compositor.depthAndOrder.bindSampler(uniform, TextureUnit.PickDepthAndOrder);\r\n });\r\n }, VariablePrecision.High);\r\n}\r\n\r\n/** @internal */\r\nexport const readDepthAndOrder = `\r\nvec2 readDepthAndOrder(vec2 tc) {\r\n vec4 pdo = TEXTURE(u_pickDepthAndOrder, tc);\r\n float order = floor(pdo.x * 16.0 + 0.5);\r\n return vec2(order, decodeDepthRgb(pdo.yzw));\r\n}\r\n`;\r\n\r\nconst checkForEarlySurfaceDiscard = `\r\n float factor = float(u_renderPass <= kRenderPass_Translucent); // never discard during specific passes\r\n float term = 0.0;\r\n\r\n vec2 tc = windowCoordsToTexCoords(gl_FragCoord.xy);\r\n vec2 depthAndOrder = readDepthAndOrder(tc);\r\n\r\n float surfaceDepth = computeLinearDepth(v_eyeSpace.z);\r\n term += float(depthAndOrder.x > u_renderOrder && abs(depthAndOrder.y - surfaceDepth) < 4.0e-5);\r\n return factor * term > 0.0;\r\n`;\r\n\r\nconst checkForEarlySurfaceDiscardWithFeatureID = `\r\n // No normals => unlt => reality model => no edges.\r\n if (u_renderPass > kRenderPass_Translucent || u_renderPass == kRenderPass_Layers || !u_surfaceFlags[kSurfaceBitIndex_HasNormals])\r\n return false;\r\n\r\n vec2 tc = windowCoordsToTexCoords(gl_FragCoord.xy);\r\n vec2 depthAndOrder = readDepthAndOrder(tc);\r\n\r\n if (depthAndOrder.x <= u_renderOrder)\r\n return false;\r\n\r\n // Calculate depthTolerance for letting edges show through their own surfaces\r\n float perspectiveFrustum = step(kFrustumType_Perspective, u_frustum.z);\r\n vec4 eyeDirAndWidthFactor = mix(vec4(0.0, 0.0, 1.0, u_pixelWidthFactor), vec4(normalize(-v_eyeSpace.xyz), -v_eyeSpace.z * u_pixelWidthFactor), perspectiveFrustum);\r\n vec3 eyeDir = eyeDirAndWidthFactor.xyz;\r\n float dtWidthFactor = eyeDirAndWidthFactor.w;\r\n\r\n // Compute depth tolerance based on angle of triangle to screen\r\n float isSilhouette = float(depthAndOrder.x == kRenderOrder_Silhouette);\r\n float dSq = dot(eyeDir, v_n);\r\n dSq *= 0.5 + 0.4 * (1.0 - isSilhouette);\r\n dSq = dSq * dSq;\r\n dSq = max(dSq, 0.0001);\r\n dSq = min(dSq, 0.999);\r\n\r\n float depthTolerance = dtWidthFactor * v_lineWeight * sqrt((1.0 - dSq) / dSq);\r\n depthTolerance *= 1.0 + .333 * isSilhouette;\r\n\r\n // Make sure stuff behind camera doesn't get pushed in front of it\r\n depthTolerance = max(depthTolerance, 0.0);\r\n\r\n // Convert depthTolerance from eye space to linear depth\r\n depthTolerance /= (u_frustum.y - u_frustum.x);\r\n\r\n float surfaceDepth = computeLinearDepth(v_eyeSpace.z);\r\n float depthDelta = abs(depthAndOrder.y - surfaceDepth);\r\n if (depthDelta > depthTolerance)\r\n return false;\r\n\r\n // Does pick buffer contain same feature?\r\n vec4 featId = TEXTURE(u_pickFeatureId, tc);\r\n\r\n // Converting to ints to test since varying floats can be interpolated incorrectly\r\n ivec4 featId_i = ivec4(featId * 255.0 + 0.5);\r\n ivec4 feature_id_i = ivec4(feature_id * 255.0 + 0.5);\r\n if (featId_i == feature_id_i)\r\n return true;\r\n\r\n // In 2d, display priority controls draw order of different elements.\r\n if (!u_checkInterElementDiscard)\r\n return false;\r\n\r\n // Use a tighter tolerance for two different elements since we're only fighting roundoff error.\r\n return depthDelta <= 4.0e-5;\r\n`;\r\n\r\n// This only adds the constants that are actually used in shader code.\r\nexport function addRenderOrderConstants(builder: ShaderBuilder) {\r\n builder.addConstant(\"kRenderOrder_BlankingRegion\", VariableType.Float, RenderOrder.BlankingRegion.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_Linear\", VariableType.Float, RenderOrder.Linear.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_Edge\", VariableType.Float, RenderOrder.Edge.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_PlanarEdge\", VariableType.Float, RenderOrder.PlanarEdge.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_Silhouette\", VariableType.Float, RenderOrder.Silhouette.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_PlanarSilhouette\", VariableType.Float, RenderOrder.PlanarSilhouette.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_UnlitSurface\", VariableType.Float, RenderOrder.UnlitSurface.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_LitSurface\", VariableType.Float, RenderOrder.LitSurface.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_PlanarUnlitSurface\", VariableType.Float, RenderOrder.PlanarUnlitSurface.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_PlanarLitSurface\", VariableType.Float, RenderOrder.PlanarLitSurface.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_PlanarBit\", VariableType.Float, RenderOrder.PlanarBit.toFixed(1));\r\n builder.addConstant(\"kRenderOrder_Background\", VariableType.Float, RenderOrder.Background.toFixed(1));\r\n}\r\n\r\n/** @internal */\r\nexport function addRenderOrder(builder: ShaderBuilder) {\r\n builder.addUniform(\"u_renderOrder\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"u_renderOrder\", (uniform, params) => {\r\n const order = params.target.drawingBackgroundForReadPixels ? RenderOrder.Background : params.geometry.renderOrder;\r\n uniform.setUniform1f(order);\r\n });\r\n });\r\n}\r\n\r\nfunction addPixelWidthFactor(builder: ShaderBuilder) {\r\n builder.addUniform(\"u_pixelWidthFactor\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"u_pixelWidthFactor\", (uniform, params) => {\r\n params.target.uniforms.bindPixelWidthFactor(uniform);\r\n });\r\n });\r\n}\r\n\r\nfunction addBatchId(builder: ShaderBuilder) {\r\n builder.addUniform(\"u_batch_id\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_batch_id\", (uniform, params) => {\r\n params.target.uniforms.batch.bindBatchId(uniform);\r\n });\r\n }, VariablePrecision.High);\r\n}\r\n\r\nconst computeIdVert = `v_feature_id = addUInt32s(u_batch_id, vec4(g_featureIndex, 0.0)) / 255.0;`;\r\nconst computeIdFrag = `\r\n vec4 featureIndex = vec4(floor(v_feature_index + 0.5), 0.0);\r\n feature_id = addUInt32s(u_batch_id, featureIndex) / 255.0;\r\n`;\r\n\r\n/** @internal */\r\nexport function addFeatureId(builder: ProgramBuilder, computeInFrag: boolean) {\r\n const vert = builder.vert;\r\n const frag = builder.frag;\r\n frag.addGlobal(\"feature_id\", VariableType.Vec4);\r\n if (!computeInFrag) {\r\n vert.addFunction(addUInt32s);\r\n addBatchId(vert);\r\n builder.addInlineComputedVarying(\"v_feature_id\", VariableType.Vec4, computeIdVert);\r\n\r\n frag.addInitializer(\"feature_id = v_feature_id;\");\r\n } else {\r\n frag.addFunction(addUInt32s);\r\n builder.addInlineComputedVarying(\"v_feature_index\", VariableType.Vec3, \"v_feature_index = g_featureIndex;\");\r\n\r\n addBatchId(frag);\r\n frag.addInitializer(computeIdFrag);\r\n }\r\n}\r\n\r\n// Discard vertex if transparency is less than the display style's transparency threshold, IFF the specific bit is set. The bit is set if:\r\n// - Solid Fill or Hidden Line mode; or\r\n// - Shaded mode and generating shadow map (sufficiently transparent surfaces receive but do not cast shadows).\r\nconst isBelowTransparencyThreshold = `\r\n return v_color.a < u_transparencyThreshold && u_surfaceFlags[kSurfaceBitIndex_TransparencyThreshold];\r\n`;\r\n\r\n/** @internal */\r\nexport function addSurfaceDiscard(builder: ProgramBuilder, flags: TechniqueFlags) {\r\n const feat = flags.featureMode;\r\n const isEdgeTestNeeded = flags.isEdgeTestNeeded;\r\n const isClassified = flags.isClassified;\r\n const computeIdInFrag = !flags.isTranslucent && 0 !== flags.isClassified && FeatureMode.Overrides === feat;\r\n\r\n const frag = builder.frag;\r\n const vert = builder.vert;\r\n\r\n vert.set(VertexShaderComponent.CheckForLateDiscard, isBelowTransparencyThreshold);\r\n vert.addUniform(\"u_transparencyThreshold\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"u_transparencyThreshold\", (uniform, params) => {\r\n uniform.setUniform1f(params.target.currentTransparencyThreshold);\r\n });\r\n });\r\n\r\n if (isEdgeTestNeeded) {\r\n addWindowToTexCoords(frag);\r\n\r\n if (!flags.isHilite)\r\n addEyeSpace(builder);\r\n\r\n if (FeatureMode.None === feat) {\r\n addSamplers(frag, false);\r\n frag.addFunction(computeLinearDepth);\r\n frag.addFunction(decodeDepthRgb);\r\n frag.addFunction(readDepthAndOrder);\r\n frag.set(FragmentShaderComponent.CheckForEarlyDiscard, checkForEarlySurfaceDiscard);\r\n } else {\r\n frag.addUniform(\"u_checkInterElementDiscard\", VariableType.Boolean, (prog) => {\r\n prog.addGraphicUniform(\"u_checkInterElementDiscard\", (uniform, params) => {\r\n uniform.setUniform1i(params.target.uniforms.branch.top.is3d ? 1 : 0);\r\n });\r\n });\r\n\r\n addFeatureIndex(vert);\r\n addLineWeight(vert);\r\n\r\n addSamplers(frag, true);\r\n addRenderOrderConstants(frag);\r\n addPixelWidthFactor(frag);\r\n frag.addFunction(computeLinearDepth);\r\n frag.addFunction(decodeDepthRgb);\r\n frag.addFunction(readDepthAndOrder);\r\n\r\n frag.set(FragmentShaderComponent.CheckForEarlyDiscard, checkForEarlySurfaceDiscardWithFeatureID);\r\n\r\n builder.addInlineComputedVarying(\"v_lineWeight\", VariableType.Float, \"v_lineWeight = computeLineWeight();\");\r\n addFeatureId(builder, computeIdInFrag);\r\n }\r\n\r\n addRenderOrder(frag);\r\n addRenderPass(frag);\r\n } else if (isClassified && FeatureMode.None !== feat) {\r\n addFeatureIndex(vert);\r\n addFeatureId(builder, computeIdInFrag);\r\n\r\n if (!flags.isTranslucent)\r\n addRenderOrder(frag);\r\n }\r\n}\r\n\r\n// bool feature_invisible = false;\r\n// vec3 feature_rgb; // if not overridden, .r < 0; else rgb color override\r\n// float feature_alpha // alpha if overridden, else < 0\r\n// varying float v_feature_emphasis // bitmask - see kEmph_* constants\r\n// vec4 linear_feature_overrides; // x: weight overridden y: weight z: line code overridden w: line code\r\nconst computeFeatureOverrides = `\r\n feature_rgb = vec3(-1.0);\r\n feature_alpha = -1.0;\r\n vec4 value = getFirstFeatureRgba();\r\n\r\n float emphFlags = value.y * 256.0;\r\n v_feature_emphasis = kEmphFlag_Hilite * extractNthBit(emphFlags, kOvrBit_Hilited) + kEmphFlag_Emphasize * extractNthBit(emphFlags, kOvrBit_Emphasized);\r\n\r\n float flags = value.x * 256.0;\r\n if (0.0 == flags)\r\n return; // nothing overridden for this feature\r\n\r\n bool nonLocatable = (u_shaderFlags[kShaderBit_IgnoreNonLocatable] ? nthFeatureBitSet(flags, kOvrBit_NonLocatable) : false);\r\n v_feature_emphasis += kEmphFlag_NonLocatable * float(nthFeatureBitSet(flags, kOvrBit_NonLocatable));\r\n bool invisible = nthFeatureBitSet(flags, kOvrBit_Visibility);\r\n feature_invisible = invisible || nonLocatable;\r\n if (feature_invisible)\r\n return;\r\n\r\n bool rgbOverridden = nthFeatureBitSet(flags, kOvrBit_Rgb);\r\n bool alphaOverridden = nthFeatureBitSet(flags, kOvrBit_Alpha);\r\n if (alphaOverridden || rgbOverridden) {\r\n vec4 rgba = getSecondFeatureRgba();\r\n if (rgbOverridden)\r\n feature_rgb = rgba.rgb;\r\n\r\n if (alphaOverridden) {\r\n feature_alpha = rgba.a;\r\n feature_viewIndependentTransparency = nthFeatureBitSet(emphFlags, kOvrBit_ViewIndependentTransparency);\r\n }\r\n }\r\n\r\n linear_feature_overrides = vec4(nthFeatureBitSet(flags, kOvrBit_Weight),\r\n value.w * 256.0,\r\n nthFeatureBitSet(flags, kOvrBit_LineCode),\r\n value.z * 256.0);\r\n\r\n feature_ignore_material = nthFeatureBitSet(flags, kOvrBit_IgnoreMaterial);\r\n use_material = use_material && !feature_ignore_material;\r\n\r\n v_feature_emphasis += kEmphFlag_Flash * extractNthFeatureBit(flags, kOvrBit_Flashed);\r\n`;\r\n\r\n// feature_rgb.r = -1.0 if rgb color not overridden for feature.\r\n// feature_alpha = -1.0 if alpha not overridden for feature.\r\nconst applyFeatureColor = `\r\n vec3 rgb = mix(baseColor.rgb, feature_rgb.rgb, step(0.0, feature_rgb.r));\r\n float alpha = mix(baseColor.a, feature_alpha, step(0.0, feature_alpha));\r\n return vec4(rgb, alpha);\r\n`;\r\n\r\n// feature_rgb.r = -1.0 if rgb color not overridden for feature, else mix based on u_overrrideColorMix.\r\n// feature_alpha = -1.0 if alpha not overridden for feature.\r\nexport const mixFeatureColor = `\r\n vec3 rgb = mix(baseColor.rgb, mix(baseColor.rgb, feature_rgb.rgb, u_overrideColorMix), step(0.0, feature_rgb.r));\r\n float alpha = mix(baseColor.a, feature_alpha, step(0.0, feature_alpha));\r\n return vec4(rgb, alpha);\r\n `;\r\n\r\nconst applyFlash = `\r\n float flashHilite = floor(v_feature_emphasis + 0.5);\r\n return doApplyFlash(flashHilite, baseColor);\r\n`;\r\n\r\nconst doApplyFlash = `\r\nvec4 doApplyFlash(float flags, vec4 baseColor) {\r\n bool isFlashed = nthBitSet(flags, kEmphBit_Flash);\r\n bool isHilited = nthBitSet(flags, kEmphBit_Hilite);\r\n bool isEmphasized = !isHilited && nthBitSet(flags, kEmphBit_Emphasize);\r\n vec3 hiliteRgb = isEmphasized ? u_hilite_settings[1] : u_hilite_settings[0];\r\n\r\n isHilited = isEmphasized || isHilited;\r\n float hiliteRatio = isHilited ? (isEmphasized ? u_hilite_settings[2][1] : u_hilite_settings[2][0]) : 0.0;\r\n baseColor.rgb = mix(baseColor.rgb, hiliteRgb, hiliteRatio);\r\n\r\n const float maxBrighten = 0.2;\r\n float brighten = isFlashed ? u_flash_intensity * maxBrighten : 0.0;\r\n vec3 brightRgb = baseColor.rgb + brighten;\r\n\r\n const float maxTween = 0.75;\r\n float hiliteFraction = isFlashed ? u_flash_intensity * maxTween : 0.0;\r\n vec3 tweenRgb = baseColor.rgb * (1.0 - hiliteFraction);\r\n tweenRgb += u_hilite_settings[0] * hiliteFraction;\r\n\r\n return vec4(mix(tweenRgb, brightRgb, u_flash_mode), baseColor.a);\r\n}\r\n`;\r\n\r\nconst doClassifierFlash = `\r\nvec4 applyClassifierFlash(vec4 baseColor) {\r\n const float maxBrighten = 0.2;\r\n float brighten = u_flash_intensity * maxBrighten;\r\n vec3 brightRgb = baseColor.rgb + brighten;\r\n return vec4(brightRgb, baseColor.a);\r\n}\r\n`;\r\n\r\n/** @internal */\r\nexport function addClassifierFlash(frag: FragmentShaderBuilder): void {\r\n addFlashIntensity(frag);\r\n addHiliteSettings(frag, false);\r\n frag.addFunction(doClassifierFlash);\r\n}\r\n\r\nfunction addFlashIntensity(frag: FragmentShaderBuilder): void {\r\n frag.addUniform(\"u_flash_intensity\", VariableType.Float, (prog) => {\r\n prog.addProgramUniform(\"u_flash_intensity\", (uniform, params) => {\r\n uniform.setUniform1f(params.target.flashIntensity);\r\n });\r\n });\r\n}\r\n\r\nfunction addApplyFlash(frag: FragmentShaderBuilder) {\r\n addHiliteSettings(frag, true);\r\n addEmphasisFlags(frag);\r\n\r\n addExtractNthBit(frag);\r\n frag.addFunction(doApplyFlash);\r\n frag.set(FragmentShaderComponent.ApplyFlash, applyFlash);\r\n addFlashIntensity(frag);\r\n}\r\n\r\n/** @internal */\r\nexport function addFeatureSymbology(builder: ProgramBuilder, feat: FeatureMode, opts: FeatureSymbologyOptions): void {\r\n if (!addCommon(builder, feat, opts) || FeatureSymbologyOptions.None === opts)\r\n return;\r\n\r\n assert((FeatureSymbologyOptions.HasOverrides | FeatureSymbologyOptions.Color) === (opts & (FeatureSymbologyOptions.HasOverrides | FeatureSymbologyOptions.Color)));\r\n\r\n builder.addGlobal(\"feature_rgb\", VariableType.Vec3);\r\n builder.addGlobal(\"feature_alpha\", VariableType.Float);\r\n builder.addVarying(\"v_feature_emphasis\", VariableType.Float);\r\n\r\n const vert = builder.vert;\r\n vert.addGlobal(\"feature_invisible\", VariableType.Boolean, \"false\");\r\n vert.addGlobal(\"feature_viewIndependentTransparency\", VariableType.Boolean, \"false\");\r\n\r\n addEmphasisFlags(vert);\r\n vert.addGlobal(\"use_material\", VariableType.Boolean, \"true\");\r\n vert.set(VertexShaderComponent.ComputeFeatureOverrides, computeFeatureOverrides);\r\n vert.set(VertexShaderComponent.ApplyFeatureColor, applyFeatureColor);\r\n\r\n addApplyFlash(builder.frag);\r\n}\r\n\r\n/** If we're running the hilite shader for a uniform feature, it follows that the feature must be hilited.\r\n * So the hilite shader simply needs to output '1' for every fragment.\r\n * @internal\r\n */\r\nexport function addUniformHiliter(builder: ProgramBuilder): void {\r\n builder.frag.addUniform(\"v_feature_hilited\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"v_feature_hilited\", (uniform, params) => {\r\n params.target.uniforms.batch.bindUniformSymbologyFlags(uniform);\r\n });\r\n });\r\n\r\n addEmphasisFlags(builder.frag);\r\n addExtractNthBit(builder.frag);\r\n builder.frag.set(FragmentShaderComponent.ComputeBaseColor, computeHiliteColor);\r\n builder.frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\r\n}\r\n\r\n/** For a uniform feature table, the feature ID output to pick buffers is equal to the batch ID.\r\n * The following symbology overrides are supported:\r\n * - Visibility - implcitly, because if the feature is invisible its geometry will never be drawn.\r\n * - Flash\r\n * - Hilite\r\n * - Color and Transparency- only for point clouds currently which set addFeatureColor to true.\r\n * This shader could be simplified, but want to share code with the non-uniform versions...hence uniforms/globals with \"v_\" prefix typically used for varyings on no prefix...\r\n * @internal\r\n */\r\nexport function addUniformFeatureSymbology(builder: ProgramBuilder, addFeatureColor: boolean): void {\r\n builder.vert.addGlobal(\"g_featureIndex\", VariableType.Vec3, \"vec3(0.0)\", true);\r\n\r\n builder.frag.addUniform(\"v_feature_emphasis\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"v_feature_emphasis\", (uniform, params) => {\r\n params.target.uniforms.batch.bindUniformSymbologyFlags(uniform);\r\n });\r\n });\r\n\r\n if (addFeatureColor) {\r\n builder.vert.addUniform(\"feature_rgb\", VariableType.Vec3, (prog) => {\r\n prog.addGraphicUniform(\"feature_rgb\", (uniform, params) => {\r\n params.target.uniforms.batch.bindUniformColorOverride(uniform);\r\n });\r\n });\r\n\r\n builder.vert.addUniform(\"feature_alpha\", VariableType.Float, (prog) => {\r\n prog.addGraphicUniform(\"feature_alpha\", (uniform, params) => {\r\n params.target.uniforms.batch.bindUniformTransparencyOverride(uniform);\r\n });\r\n });\r\n\r\n builder.vert.set(VertexShaderComponent.ApplyFeatureColor, applyFeatureColor);\r\n addAlpha(builder.vert);\r\n addMaxAlpha(builder.vert);\r\n addRenderPass(builder.vert);\r\n addTransparencyDiscardFlags(builder.vert);\r\n builder.vert.set(VertexShaderComponent.CheckForDiscard, checkVertexDiscard);\r\n } else {\r\n builder.vert.set(VertexShaderComponent.CheckForDiscard, \"return feature_invisible;\");\r\n }\r\n\r\n // Non-Locatable... Discard if picking\r\n builder.vert.addUniform(\"feature_invisible\", VariableType.Boolean, (prog) => {\r\n prog.addGraphicUniform(\"feature_invisible\", (uniform, params) => {\r\n params.target.uniforms.batch.bindUniformNonLocatable(uniform, params.target.drawNonLocatable);\r\n });\r\n });\r\n\r\n builder.vert.addGlobal(\"feature_viewIndependentTransparency\", VariableType.Boolean, \"false\");\r\n\r\n addApplyFlash(builder.frag);\r\n}\r\n"]}
@@ -23,7 +23,7 @@ const applyLighting = `
23
23
  // Extract surface properties
24
24
  vec3 rgb = baseColor.rgb;
25
25
  vec3 normal = normalize(v_n.xyz);
26
- normal *= 2.0 * float(!u_surfaceFlags[kSurfaceBitIndex_NoFaceFront] && gl_FrontFacing) - 1.0;
26
+ normal *= 2.0 * float(gl_FrontFacing) - 1.0;
27
27
  vec3 toEye = kFrustumType_Perspective == u_frustum.z ? normalize(v_eyeSpace.xyz) : vec3(0.0, 0.0, -1.0);
28
28
 
29
29
  // Extract material properties
@@ -1 +1 @@
1
- {"version":3,"file":"Lighting.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Lighting.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,0BAA0B,GAAG;;;;;;;;CAQlC,CAAC;AAEF,oCAAoC;AACpC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFrB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAuB;IACjD,UAAU,CAAC,OAAO,CAAC,CAAC;IAEpB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1B,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,wBAAwC,aAAa,CAAC,CAAC;IAE/D,IAAI,CAAC,UAAU,CAAC,UAAU,gBAAqB,CAAC,IAAI,EAAE,EAAE;QACtD,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,eAAyB,CAAC;IAE3B,IAAI,CAAC,UAAU,CAAC,qBAAqB,iBAAsB,CAAC,IAAI,EAAE,EAAE;QAClE,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC/D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,UAAU,CAAC,YAAY,gBAAqB,CAAC,IAAI,EAAE,EAAE;QACxD,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACvD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { FragmentShaderComponent, ProgramBuilder, VariablePrecision, VariableType } from \"../ShaderBuilder\";\r\nimport { addFrustum } from \"./Common\";\r\n\r\nconst computeDirectionalLighting = `\r\nvoid computeDirectionalLight (inout float diffuse, inout float specular, vec3 normal, vec3 toEye, vec3 lightDir, float lightIntensity, float specularExponent) {\r\n diffuse += lightIntensity * max(dot(normal, lightDir), 0.0);\r\n vec3 toReflectedLight = normalize(reflect(lightDir, normal));\r\n float specularDot = max(dot(toReflectedLight, toEye), 0.0001);\r\n // NB: If specularDot and specularExponent are both zero, 0^0 done below can return NaN. Must make sure specularDot is larger than zero (hence 0.0001 or greater, as ensured above).\r\n specular += lightIntensity * pow(specularDot, specularExponent);\r\n}\r\n`;\r\n\r\n// mat_weights: x=diffuse y=specular\r\nconst applyLighting = `\r\n if (baseColor.a <= 0.0 || !u_surfaceFlags[kSurfaceBitIndex_ApplyLighting])\r\n return baseColor;\r\n\r\n // Extract surface properties\r\n vec3 rgb = baseColor.rgb;\r\n vec3 normal = normalize(v_n.xyz);\r\n normal *= 2.0 * float(!u_surfaceFlags[kSurfaceBitIndex_NoFaceFront] && gl_FrontFacing) - 1.0;\r\n vec3 toEye = kFrustumType_Perspective == u_frustum.z ? normalize(v_eyeSpace.xyz) : vec3(0.0, 0.0, -1.0);\r\n\r\n // Extract material properties\r\n float diffuseWeight = mat_weights.x;\r\n float specularWeight = mat_weights.y * u_lightSettings[13];\r\n float specularExponent = mat_specular.a;\r\n vec3 specularColor = mat_specular.rgb;\r\n const float ambientWeight = 1.0; // Ignore MicroStation's ambient weights - usually bogus.\r\n\r\n // Compute directional lights\r\n const vec3 portraitDir = vec3(-0.7071, 0.0, 0.7071);\r\n float portraitIntensity = u_lightSettings[12];\r\n float sunIntensity = u_lightSettings[0];\r\n\r\n float directionalDiffuseIntensity = 0.0;\r\n float directionalSpecularIntensity = 0.0;\r\n computeDirectionalLight(directionalDiffuseIntensity, directionalSpecularIntensity, normal, toEye, u_sunDir, sunIntensity, specularExponent);\r\n computeDirectionalLight(directionalDiffuseIntensity, directionalSpecularIntensity, normal ,toEye, portraitDir, portraitIntensity, specularExponent);\r\n\r\n const float directionalFudge = 0.92; // leftover from old lighting implementation\r\n vec3 diffuseAccum = directionalDiffuseIntensity * diffuseWeight * rgb * directionalFudge; // directional light is white.\r\n vec3 specularAccum = directionalSpecularIntensity * specularWeight * specularColor;\r\n\r\n // Compute ambient light\r\n float ambientIntensity = u_lightSettings[4];\r\n vec3 ambientColor = vec3(u_lightSettings[1], u_lightSettings[2], u_lightSettings[3]);\r\n if (ambientColor.r + ambientColor.g + ambientColor.b == 0.0)\r\n ambientColor = rgb;\r\n\r\n diffuseAccum += ambientIntensity * ambientWeight * ambientColor;\r\n\r\n // Compute hemisphere lights\r\n vec3 ground = vec3(u_lightSettings[5], u_lightSettings[6], u_lightSettings[7]);\r\n vec3 sky = vec3(u_lightSettings[8], u_lightSettings[9], u_lightSettings[10]);\r\n float hemiIntensity = u_lightSettings[11];\r\n\r\n // diffuse\r\n float hemiDot = dot(normal, u_upVector);\r\n float hemiDiffuseWeight = 0.5 * hemiDot + 0.5;\r\n vec3 hemiColor = mix(ground, sky, hemiDiffuseWeight);\r\n diffuseAccum += hemiIntensity * hemiColor * rgb;\r\n\r\n // sky specular\r\n vec3 reflectSky = normalize(reflect(u_upVector, normal));\r\n float skyDot = max(dot(reflectSky, toEye), 0.0001);\r\n float hemiSpecWeight = hemiIntensity * pow(skyDot, specularExponent);\r\n\r\n // ground specular\r\n vec3 reflectGround = normalize(reflect(-u_upVector, normal));\r\n float groundDot = max(dot(reflectGround, toEye), 0.0001);\r\n hemiSpecWeight += hemiIntensity * pow(groundDot, specularExponent);\r\n\r\n specularAccum += hemiSpecWeight * specularColor * hemiColor;\r\n\r\n vec3 litColor = diffuseAccum + specularAccum;\r\n\r\n // Apply fresnel reflection.\r\n float fresnelIntensity = u_lightSettings[15];\r\n if (0.0 != fresnelIntensity) {\r\n float fresnel = -dot(toEye, normal);\r\n if (fresnelIntensity < 0.0) {\r\n fresnelIntensity = abs(fresnelIntensity);\r\n fresnel = 1.0 - fresnel;\r\n }\r\n\r\n fresnel = clamp(1.0 - fresnel, 0.0, 1.0);\r\n litColor = litColor * (1.0 + fresnelIntensity * fresnel);\r\n }\r\n\r\n // Clamp while preserving hue.\r\n float maxIntensity = max(litColor.r, max(litColor.g, litColor.b));\r\n float numCel = u_lightSettings[14];\r\n if (numCel > 0.0)\r\n baseColor.rgb = baseColor.rgb * ceil(maxIntensity * numCel) / numCel;\r\n else\r\n baseColor.rgb = litColor / max(1.0, maxIntensity);\r\n\r\n return baseColor;\r\n`;\r\n\r\n/** NB: addMaterial() sets up the mat_* variables used by applyLighting.\r\n * @internal\r\n */\r\nexport function addLighting(builder: ProgramBuilder) {\r\n addFrustum(builder);\r\n\r\n const frag = builder.frag;\r\n\r\n frag.addFunction(computeDirectionalLighting);\r\n frag.set(FragmentShaderComponent.ApplyLighting, applyLighting);\r\n\r\n frag.addUniform(\"u_sunDir\", VariableType.Vec3, (prog) => {\r\n prog.addProgramUniform(\"u_sunDir\", (uniform, params) => {\r\n params.target.uniforms.bindSunDirection(uniform);\r\n });\r\n }, VariablePrecision.High);\r\n\r\n frag.addUniform(\"u_lightSettings[16]\", VariableType.Float, (prog) => {\r\n prog.addProgramUniform(\"u_lightSettings[0]\", (uniform, params) => {\r\n params.target.uniforms.lights.bind(uniform);\r\n });\r\n });\r\n\r\n frag.addUniform(\"u_upVector\", VariableType.Vec3, (prog) => {\r\n prog.addProgramUniform(\"u_upVector\", (uniform, params) => {\r\n params.target.uniforms.frustum.bindUpVector(uniform);\r\n });\r\n });\r\n}\r\n"]}
1
+ {"version":3,"file":"Lighting.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Lighting.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,0BAA0B,GAAG;;;;;;;;CAQlC,CAAC;AAEF,oCAAoC;AACpC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFrB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAuB;IACjD,UAAU,CAAC,OAAO,CAAC,CAAC;IAEpB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1B,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,wBAAwC,aAAa,CAAC,CAAC;IAE/D,IAAI,CAAC,UAAU,CAAC,UAAU,gBAAqB,CAAC,IAAI,EAAE,EAAE;QACtD,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,eAAyB,CAAC;IAE3B,IAAI,CAAC,UAAU,CAAC,qBAAqB,iBAAsB,CAAC,IAAI,EAAE,EAAE;QAClE,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC/D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,UAAU,CAAC,YAAY,gBAAqB,CAAC,IAAI,EAAE,EAAE;QACxD,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACvD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { FragmentShaderComponent, ProgramBuilder, VariablePrecision, VariableType } from \"../ShaderBuilder\";\r\nimport { addFrustum } from \"./Common\";\r\n\r\nconst computeDirectionalLighting = `\r\nvoid computeDirectionalLight (inout float diffuse, inout float specular, vec3 normal, vec3 toEye, vec3 lightDir, float lightIntensity, float specularExponent) {\r\n diffuse += lightIntensity * max(dot(normal, lightDir), 0.0);\r\n vec3 toReflectedLight = normalize(reflect(lightDir, normal));\r\n float specularDot = max(dot(toReflectedLight, toEye), 0.0001);\r\n // NB: If specularDot and specularExponent are both zero, 0^0 done below can return NaN. Must make sure specularDot is larger than zero (hence 0.0001 or greater, as ensured above).\r\n specular += lightIntensity * pow(specularDot, specularExponent);\r\n}\r\n`;\r\n\r\n// mat_weights: x=diffuse y=specular\r\nconst applyLighting = `\r\n if (baseColor.a <= 0.0 || !u_surfaceFlags[kSurfaceBitIndex_ApplyLighting])\r\n return baseColor;\r\n\r\n // Extract surface properties\r\n vec3 rgb = baseColor.rgb;\r\n vec3 normal = normalize(v_n.xyz);\r\n normal *= 2.0 * float(gl_FrontFacing) - 1.0;\r\n vec3 toEye = kFrustumType_Perspective == u_frustum.z ? normalize(v_eyeSpace.xyz) : vec3(0.0, 0.0, -1.0);\r\n\r\n // Extract material properties\r\n float diffuseWeight = mat_weights.x;\r\n float specularWeight = mat_weights.y * u_lightSettings[13];\r\n float specularExponent = mat_specular.a;\r\n vec3 specularColor = mat_specular.rgb;\r\n const float ambientWeight = 1.0; // Ignore MicroStation's ambient weights - usually bogus.\r\n\r\n // Compute directional lights\r\n const vec3 portraitDir = vec3(-0.7071, 0.0, 0.7071);\r\n float portraitIntensity = u_lightSettings[12];\r\n float sunIntensity = u_lightSettings[0];\r\n\r\n float directionalDiffuseIntensity = 0.0;\r\n float directionalSpecularIntensity = 0.0;\r\n computeDirectionalLight(directionalDiffuseIntensity, directionalSpecularIntensity, normal, toEye, u_sunDir, sunIntensity, specularExponent);\r\n computeDirectionalLight(directionalDiffuseIntensity, directionalSpecularIntensity, normal ,toEye, portraitDir, portraitIntensity, specularExponent);\r\n\r\n const float directionalFudge = 0.92; // leftover from old lighting implementation\r\n vec3 diffuseAccum = directionalDiffuseIntensity * diffuseWeight * rgb * directionalFudge; // directional light is white.\r\n vec3 specularAccum = directionalSpecularIntensity * specularWeight * specularColor;\r\n\r\n // Compute ambient light\r\n float ambientIntensity = u_lightSettings[4];\r\n vec3 ambientColor = vec3(u_lightSettings[1], u_lightSettings[2], u_lightSettings[3]);\r\n if (ambientColor.r + ambientColor.g + ambientColor.b == 0.0)\r\n ambientColor = rgb;\r\n\r\n diffuseAccum += ambientIntensity * ambientWeight * ambientColor;\r\n\r\n // Compute hemisphere lights\r\n vec3 ground = vec3(u_lightSettings[5], u_lightSettings[6], u_lightSettings[7]);\r\n vec3 sky = vec3(u_lightSettings[8], u_lightSettings[9], u_lightSettings[10]);\r\n float hemiIntensity = u_lightSettings[11];\r\n\r\n // diffuse\r\n float hemiDot = dot(normal, u_upVector);\r\n float hemiDiffuseWeight = 0.5 * hemiDot + 0.5;\r\n vec3 hemiColor = mix(ground, sky, hemiDiffuseWeight);\r\n diffuseAccum += hemiIntensity * hemiColor * rgb;\r\n\r\n // sky specular\r\n vec3 reflectSky = normalize(reflect(u_upVector, normal));\r\n float skyDot = max(dot(reflectSky, toEye), 0.0001);\r\n float hemiSpecWeight = hemiIntensity * pow(skyDot, specularExponent);\r\n\r\n // ground specular\r\n vec3 reflectGround = normalize(reflect(-u_upVector, normal));\r\n float groundDot = max(dot(reflectGround, toEye), 0.0001);\r\n hemiSpecWeight += hemiIntensity * pow(groundDot, specularExponent);\r\n\r\n specularAccum += hemiSpecWeight * specularColor * hemiColor;\r\n\r\n vec3 litColor = diffuseAccum + specularAccum;\r\n\r\n // Apply fresnel reflection.\r\n float fresnelIntensity = u_lightSettings[15];\r\n if (0.0 != fresnelIntensity) {\r\n float fresnel = -dot(toEye, normal);\r\n if (fresnelIntensity < 0.0) {\r\n fresnelIntensity = abs(fresnelIntensity);\r\n fresnel = 1.0 - fresnel;\r\n }\r\n\r\n fresnel = clamp(1.0 - fresnel, 0.0, 1.0);\r\n litColor = litColor * (1.0 + fresnelIntensity * fresnel);\r\n }\r\n\r\n // Clamp while preserving hue.\r\n float maxIntensity = max(litColor.r, max(litColor.g, litColor.b));\r\n float numCel = u_lightSettings[14];\r\n if (numCel > 0.0)\r\n baseColor.rgb = baseColor.rgb * ceil(maxIntensity * numCel) / numCel;\r\n else\r\n baseColor.rgb = litColor / max(1.0, maxIntensity);\r\n\r\n return baseColor;\r\n`;\r\n\r\n/** NB: addMaterial() sets up the mat_* variables used by applyLighting.\r\n * @internal\r\n */\r\nexport function addLighting(builder: ProgramBuilder) {\r\n addFrustum(builder);\r\n\r\n const frag = builder.frag;\r\n\r\n frag.addFunction(computeDirectionalLighting);\r\n frag.set(FragmentShaderComponent.ApplyLighting, applyLighting);\r\n\r\n frag.addUniform(\"u_sunDir\", VariableType.Vec3, (prog) => {\r\n prog.addProgramUniform(\"u_sunDir\", (uniform, params) => {\r\n params.target.uniforms.bindSunDirection(uniform);\r\n });\r\n }, VariablePrecision.High);\r\n\r\n frag.addUniform(\"u_lightSettings[16]\", VariableType.Float, (prog) => {\r\n prog.addProgramUniform(\"u_lightSettings[0]\", (uniform, params) => {\r\n params.target.uniforms.lights.bind(uniform);\r\n });\r\n });\r\n\r\n frag.addUniform(\"u_upVector\", VariableType.Vec3, (prog) => {\r\n prog.addProgramUniform(\"u_upVector\", (uniform, params) => {\r\n params.target.uniforms.frustum.bindUpVector(uniform);\r\n });\r\n });\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"PointCloud.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/PointCloud.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAA2B,cAAc,EAAuC,MAAM,kBAAkB,CAAC;AAChH,OAAO,EAAE,WAAW,EAAc,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAgFtF,gBAAgB;AAChB,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,GAAG,cAAc,CAqBhI;AAED,gBAAgB;AAChB,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,YAAY,GAAG,cAAc,CAOhF"}
1
+ {"version":3,"file":"PointCloud.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/PointCloud.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAA2B,cAAc,EAAuC,MAAM,kBAAkB,CAAC;AAChH,OAAO,EAAE,WAAW,EAAc,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAiFtF,gBAAgB;AAChB,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,GAAG,cAAc,CAqBhI;AAED,gBAAgB;AAChB,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,YAAY,GAAG,cAAc,CAUhF"}
@@ -14,6 +14,7 @@ import { addModelViewProjectionMatrix } from "./Vertex";
14
14
  import { addViewportTransformation } from "./Viewport";
15
15
  import { addThematicDisplay } from "./Thematic";
16
16
  import { addTexture } from "./Surface";
17
+ import { assignFragColor } from "./Fragment";
17
18
  // Revert components if color format is BGR instead of RGB.
18
19
  const computeColor = `
19
20
  return u_pointCloud.y == 1.0 ? vec4(a_color.b, a_color.g, a_color.r, 1.0) : vec4(a_color, 1.0);
@@ -95,9 +96,13 @@ export function createPointCloudBuilder(classified, featureMode, thematic) {
95
96
  /** @internal */
96
97
  export function createPointCloudHiliter(classified) {
97
98
  const builder = createBuilder();
98
- addUniformHiliter(builder);
99
- if (classified)
99
+ if (classified) {
100
100
  addHilitePlanarClassifier(builder, false);
101
+ builder.frag.set(16 /* AssignFragData */, assignFragColor);
102
+ }
103
+ else {
104
+ addUniformHiliter(builder);
105
+ }
101
106
  return builder;
102
107
  }
103
108
  //# sourceMappingURL=PointCloud.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PointCloud.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/PointCloud.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { AttributeMap } from \"../AttributeMap\";\r\nimport { FragmentShaderComponent, ProgramBuilder, VariableType, VertexShaderComponent } from \"../ShaderBuilder\";\r\nimport { FeatureMode, IsAnimated, IsClassified, IsThematic } from \"../TechniqueFlags\";\r\nimport { TechniqueId } from \"../TechniqueId\";\r\nimport { addUniformHiliter } from \"./FeatureSymbology\";\r\nimport { addColorPlanarClassifier, addFeaturePlanarClassifier, addHilitePlanarClassifier } from \"./PlanarClassification\";\r\nimport { addModelViewProjectionMatrix } from \"./Vertex\";\r\nimport { addViewportTransformation } from \"./Viewport\";\r\nimport { addThematicDisplay } from \"./Thematic\";\r\nimport { addTexture } from \"./Surface\";\r\n\r\n// Revert components if color format is BGR instead of RGB.\r\nconst computeColor = `\r\n return u_pointCloud.y == 1.0 ? vec4(a_color.b, a_color.g, a_color.r, 1.0) : vec4(a_color, 1.0);\r\n`;\r\n\r\nconst computeBaseColor = \"return v_color;\";\r\n\r\n// Round the point unless drawing square points.\r\nconst roundPointDiscard = `\r\n if (u_pointCloudSettings.w == 1.0)\r\n return false;\r\n\r\n vec2 pointXY = (2.0 * gl_PointCoord - 1.0);\r\n return dot(pointXY, pointXY) > 1.0;\r\n`;\r\n\r\nconst checkForClassifiedDiscard = \"return baseColor.a == 0.0;\";\r\n\r\nconst computePosition = `\r\n gl_PointSize = 1.0;\r\n vec4 pos = MAT_MVP * rawPos;\r\n if (u_pointCloudSettings.x > 0.0) {\r\n // Size is specified in pixels.\r\n gl_PointSize = u_pointCloudSettings.x;\r\n return pos;\r\n }\r\n\r\n // Point size is in meters (voxel size).\r\n if (pos.w <= 0.0) {\r\n // Cannot perform perspective divide below.\r\n return pos;\r\n }\r\n\r\n // Convert voxel size in meters into pixel size, then compute pixel size, taking perspective into account.\r\n mat4 toView = u_viewportTransformation * MAT_MVP;\r\n float scale = length(toView[0].xyz);\r\n gl_PointSize = -u_pointCloudSettings.x * clamp(u_pointCloud.x * scale / pos.w, u_pointCloudSettings.y, u_pointCloudSettings.z);\r\n return pos;\r\n`;\r\n\r\nfunction createBuilder(): ProgramBuilder {\r\n const builder = new ProgramBuilder(AttributeMap.findAttributeMap(TechniqueId.PointCloud, false));\r\n const vert = builder.vert;\r\n addViewportTransformation(vert);\r\n vert.set(VertexShaderComponent.ComputePosition, computePosition);\r\n addModelViewProjectionMatrix(vert);\r\n\r\n builder.frag.set(FragmentShaderComponent.CheckForEarlyDiscard, roundPointDiscard);\r\n\r\n // Uniforms based on the PointCloudDisplaySettings.\r\n builder.addUniform(\"u_pointCloudSettings\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_pointCloudSettings\", (uniform, params) => {\r\n params.target.uniforms.realityModel.pointCloud.bind(uniform);\r\n });\r\n });\r\n\r\n // Uniforms based on the PointCloudGeometry.\r\n builder.vert.addUniform(\"u_pointCloud\", VariableType.Vec2, (prog) => {\r\n prog.addGraphicUniform(\"u_pointCloud\", (uniform, params) => {\r\n assert(params.geometry.asPointCloud !== undefined);\r\n scratchPointCloud[0] = params.geometry.asPointCloud.voxelSize;\r\n scratchPointCloud[1] = params.geometry.asPointCloud.colorIsBgr ? 1 : 0;\r\n uniform.setUniform2fv(scratchPointCloud);\r\n });\r\n });\r\n\r\n return builder;\r\n}\r\n\r\nconst scratchPointCloud = new Float32Array([0, 0]);\r\n\r\n/** @internal */\r\nexport function createPointCloudBuilder(classified: IsClassified, featureMode: FeatureMode, thematic: IsThematic): ProgramBuilder {\r\n const builder = createBuilder();\r\n\r\n builder.addVarying(\"v_color\", VariableType.Vec4);\r\n builder.vert.set(VertexShaderComponent.ComputeBaseColor, computeColor);\r\n\r\n builder.frag.set(FragmentShaderComponent.ComputeBaseColor, computeBaseColor);\r\n if (classified) {\r\n addColorPlanarClassifier(builder, false, thematic);\r\n builder.frag.set(FragmentShaderComponent.CheckForDiscard, checkForClassifiedDiscard);\r\n\r\n if (FeatureMode.None !== featureMode)\r\n addFeaturePlanarClassifier(builder);\r\n }\r\n\r\n if (IsThematic.Yes === thematic) {\r\n addThematicDisplay(builder, true);\r\n addTexture(builder, IsAnimated.No, IsThematic.Yes, true);\r\n }\r\n\r\n return builder;\r\n}\r\n\r\n/** @internal */\r\nexport function createPointCloudHiliter(classified: IsClassified): ProgramBuilder {\r\n const builder = createBuilder();\r\n addUniformHiliter(builder);\r\n if (classified)\r\n addHilitePlanarClassifier(builder, false);\r\n\r\n return builder;\r\n}\r\n"]}
1
+ {"version":3,"file":"PointCloud.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/PointCloud.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { AttributeMap } from \"../AttributeMap\";\r\nimport { FragmentShaderComponent, ProgramBuilder, VariableType, VertexShaderComponent } from \"../ShaderBuilder\";\r\nimport { FeatureMode, IsAnimated, IsClassified, IsThematic } from \"../TechniqueFlags\";\r\nimport { TechniqueId } from \"../TechniqueId\";\r\nimport { addUniformHiliter } from \"./FeatureSymbology\";\r\nimport { addColorPlanarClassifier, addFeaturePlanarClassifier, addHilitePlanarClassifier } from \"./PlanarClassification\";\r\nimport { addModelViewProjectionMatrix } from \"./Vertex\";\r\nimport { addViewportTransformation } from \"./Viewport\";\r\nimport { addThematicDisplay } from \"./Thematic\";\r\nimport { addTexture } from \"./Surface\";\r\nimport { assignFragColor } from \"./Fragment\";\r\n\r\n// Revert components if color format is BGR instead of RGB.\r\nconst computeColor = `\r\n return u_pointCloud.y == 1.0 ? vec4(a_color.b, a_color.g, a_color.r, 1.0) : vec4(a_color, 1.0);\r\n`;\r\n\r\nconst computeBaseColor = \"return v_color;\";\r\n\r\n// Round the point unless drawing square points.\r\nconst roundPointDiscard = `\r\n if (u_pointCloudSettings.w == 1.0)\r\n return false;\r\n\r\n vec2 pointXY = (2.0 * gl_PointCoord - 1.0);\r\n return dot(pointXY, pointXY) > 1.0;\r\n`;\r\n\r\nconst checkForClassifiedDiscard = \"return baseColor.a == 0.0;\";\r\n\r\nconst computePosition = `\r\n gl_PointSize = 1.0;\r\n vec4 pos = MAT_MVP * rawPos;\r\n if (u_pointCloudSettings.x > 0.0) {\r\n // Size is specified in pixels.\r\n gl_PointSize = u_pointCloudSettings.x;\r\n return pos;\r\n }\r\n\r\n // Point size is in meters (voxel size).\r\n if (pos.w <= 0.0) {\r\n // Cannot perform perspective divide below.\r\n return pos;\r\n }\r\n\r\n // Convert voxel size in meters into pixel size, then compute pixel size, taking perspective into account.\r\n mat4 toView = u_viewportTransformation * MAT_MVP;\r\n float scale = length(toView[0].xyz);\r\n gl_PointSize = -u_pointCloudSettings.x * clamp(u_pointCloud.x * scale / pos.w, u_pointCloudSettings.y, u_pointCloudSettings.z);\r\n return pos;\r\n`;\r\n\r\nfunction createBuilder(): ProgramBuilder {\r\n const builder = new ProgramBuilder(AttributeMap.findAttributeMap(TechniqueId.PointCloud, false));\r\n const vert = builder.vert;\r\n addViewportTransformation(vert);\r\n vert.set(VertexShaderComponent.ComputePosition, computePosition);\r\n addModelViewProjectionMatrix(vert);\r\n\r\n builder.frag.set(FragmentShaderComponent.CheckForEarlyDiscard, roundPointDiscard);\r\n\r\n // Uniforms based on the PointCloudDisplaySettings.\r\n builder.addUniform(\"u_pointCloudSettings\", VariableType.Vec4, (prog) => {\r\n prog.addGraphicUniform(\"u_pointCloudSettings\", (uniform, params) => {\r\n params.target.uniforms.realityModel.pointCloud.bind(uniform);\r\n });\r\n });\r\n\r\n // Uniforms based on the PointCloudGeometry.\r\n builder.vert.addUniform(\"u_pointCloud\", VariableType.Vec2, (prog) => {\r\n prog.addGraphicUniform(\"u_pointCloud\", (uniform, params) => {\r\n assert(params.geometry.asPointCloud !== undefined);\r\n scratchPointCloud[0] = params.geometry.asPointCloud.voxelSize;\r\n scratchPointCloud[1] = params.geometry.asPointCloud.colorIsBgr ? 1 : 0;\r\n uniform.setUniform2fv(scratchPointCloud);\r\n });\r\n });\r\n\r\n return builder;\r\n}\r\n\r\nconst scratchPointCloud = new Float32Array([0, 0]);\r\n\r\n/** @internal */\r\nexport function createPointCloudBuilder(classified: IsClassified, featureMode: FeatureMode, thematic: IsThematic): ProgramBuilder {\r\n const builder = createBuilder();\r\n\r\n builder.addVarying(\"v_color\", VariableType.Vec4);\r\n builder.vert.set(VertexShaderComponent.ComputeBaseColor, computeColor);\r\n\r\n builder.frag.set(FragmentShaderComponent.ComputeBaseColor, computeBaseColor);\r\n if (classified) {\r\n addColorPlanarClassifier(builder, false, thematic);\r\n builder.frag.set(FragmentShaderComponent.CheckForDiscard, checkForClassifiedDiscard);\r\n\r\n if (FeatureMode.None !== featureMode)\r\n addFeaturePlanarClassifier(builder);\r\n }\r\n\r\n if (IsThematic.Yes === thematic) {\r\n addThematicDisplay(builder, true);\r\n addTexture(builder, IsAnimated.No, IsThematic.Yes, true);\r\n }\r\n\r\n return builder;\r\n}\r\n\r\n/** @internal */\r\nexport function createPointCloudHiliter(classified: IsClassified): ProgramBuilder {\r\n const builder = createBuilder();\r\n if (classified) {\r\n addHilitePlanarClassifier(builder, false);\r\n builder.frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\r\n } else {\r\n addUniformHiliter(builder);\r\n }\r\n\r\n return builder;\r\n}\r\n"]}
@@ -243,7 +243,7 @@ function addSurfaceFlagsLookup(builder) {
243
243
  builder.addConstant("kSurfaceBitIndex_BackgroundFill", 1 /* Int */, 5 /* BackgroundFill */.toString());
244
244
  builder.addConstant("kSurfaceBitIndex_HasColorAndNormal", 1 /* Int */, 6 /* HasColorAndNormal */.toString());
245
245
  builder.addConstant("kSurfaceBitIndex_OverrideRgb", 1 /* Int */, 7 /* OverrideRgb */.toString());
246
- builder.addConstant("kSurfaceBitIndex_NoFaceFront", 1 /* Int */, 8 /* NoFaceFront */.toString());
246
+ builder.addConstant("kSurfaceBitIndex_HasNormalMap", 1 /* Int */, 8 /* HasNormalMap */.toString());
247
247
  builder.addConstant("kSurfaceBitIndex_HasMaterialAtlas", 1 /* Int */, 9 /* HasMaterialAtlas */.toString());
248
248
  // Surface flags which get modified in vertex shader are still passed to fragment shader as a single float & are thus
249
249
  // used differently there & so require different constants. Unused constants are commented out.