@itwin/core-frontend 4.0.0-dev.23 → 4.0.0-dev.28

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 (470) hide show
  1. package/CHANGELOG.md +43 -36
  2. package/lib/cjs/AccuDraw.js +1 -1
  3. package/lib/cjs/AccuDraw.js.map +1 -1
  4. package/lib/cjs/AccuSnap.js +3 -3
  5. package/lib/cjs/AccuSnap.js.map +1 -1
  6. package/lib/cjs/BriefcaseConnection.js +9 -11
  7. package/lib/cjs/BriefcaseConnection.js.map +1 -1
  8. package/lib/cjs/DisplayStyleState.js +8 -12
  9. package/lib/cjs/DisplayStyleState.js.map +1 -1
  10. package/lib/cjs/DrawingViewState.js +4 -6
  11. package/lib/cjs/DrawingViewState.js.map +1 -1
  12. package/lib/cjs/EnvironmentDecorations.js +2 -3
  13. package/lib/cjs/EnvironmentDecorations.js.map +1 -1
  14. package/lib/cjs/FlashSettings.js +3 -4
  15. package/lib/cjs/FlashSettings.js.map +1 -1
  16. package/lib/cjs/GeoServices.js +7 -9
  17. package/lib/cjs/GeoServices.js.map +1 -1
  18. package/lib/cjs/IModelApp.js +19 -21
  19. package/lib/cjs/IModelApp.js.map +1 -1
  20. package/lib/cjs/IModelConnection.js +1 -1
  21. package/lib/cjs/IModelConnection.js.map +1 -1
  22. package/lib/cjs/IpcApp.js +1 -1
  23. package/lib/cjs/IpcApp.js.map +1 -1
  24. package/lib/cjs/LocalhostIpcApp.js +3 -4
  25. package/lib/cjs/LocalhostIpcApp.js.map +1 -1
  26. package/lib/cjs/ModelState.js +2 -3
  27. package/lib/cjs/ModelState.js.map +1 -1
  28. package/lib/cjs/NativeApp.js +4 -7
  29. package/lib/cjs/NativeApp.js.map +1 -1
  30. package/lib/cjs/NoRenderApp.js +1 -2
  31. package/lib/cjs/NoRenderApp.js.map +1 -1
  32. package/lib/cjs/PlanarClipMaskState.js +1 -1
  33. package/lib/cjs/PlanarClipMaskState.js.map +1 -1
  34. package/lib/cjs/RealityDataSourceContextShareImpl.js +2 -4
  35. package/lib/cjs/RealityDataSourceContextShareImpl.js.map +1 -1
  36. package/lib/cjs/SheetViewState.js +15 -23
  37. package/lib/cjs/SheetViewState.js.map +1 -1
  38. package/lib/cjs/Tiles.js +2 -2
  39. package/lib/cjs/Tiles.js.map +1 -1
  40. package/lib/cjs/ViewContext.js +1 -1
  41. package/lib/cjs/ViewContext.js.map +1 -1
  42. package/lib/cjs/ViewCreator2d.js +4 -5
  43. package/lib/cjs/ViewCreator2d.js.map +1 -1
  44. package/lib/cjs/ViewCreator3d.js +5 -5
  45. package/lib/cjs/ViewCreator3d.js.map +1 -1
  46. package/lib/cjs/ViewState.js +17 -24
  47. package/lib/cjs/ViewState.js.map +1 -1
  48. package/lib/cjs/Viewport.js +22 -32
  49. package/lib/cjs/Viewport.js.map +1 -1
  50. package/lib/cjs/extension/ExtensionImpl.js +1 -1
  51. package/lib/cjs/extension/ExtensionImpl.js.map +1 -1
  52. package/lib/cjs/quantity-formatting/BaseUnitFormattingSettingsProvider.js +2 -3
  53. package/lib/cjs/quantity-formatting/BaseUnitFormattingSettingsProvider.js.map +1 -1
  54. package/lib/cjs/quantity-formatting/QuantityFormatter.js +7 -9
  55. package/lib/cjs/quantity-formatting/QuantityFormatter.js.map +1 -1
  56. package/lib/cjs/render/FeatureSymbology.js +1 -2
  57. package/lib/cjs/render/FeatureSymbology.js.map +1 -1
  58. package/lib/cjs/render/GraphicBuilder.js +7 -9
  59. package/lib/cjs/render/GraphicBuilder.js.map +1 -1
  60. package/lib/cjs/render/MockRender.js +1 -2
  61. package/lib/cjs/render/MockRender.js.map +1 -1
  62. package/lib/cjs/render/ParticleCollectionBuilder.js +2 -3
  63. package/lib/cjs/render/ParticleCollectionBuilder.js.map +1 -1
  64. package/lib/cjs/render/RealityMeshParams.js +7 -10
  65. package/lib/cjs/render/RealityMeshParams.js.map +1 -1
  66. package/lib/cjs/render/RenderPlan.js +1 -1
  67. package/lib/cjs/render/RenderPlan.js.map +1 -1
  68. package/lib/cjs/render/RenderSystem.js +1 -2
  69. package/lib/cjs/render/RenderSystem.js.map +1 -1
  70. package/lib/cjs/render/VisibleFeature.js +2 -4
  71. package/lib/cjs/render/VisibleFeature.js.map +1 -1
  72. package/lib/cjs/render/primitives/AuxChannelTable.js +6 -9
  73. package/lib/cjs/render/primitives/AuxChannelTable.js.map +1 -1
  74. package/lib/cjs/render/primitives/EdgeParams.js +6 -7
  75. package/lib/cjs/render/primitives/EdgeParams.js.map +1 -1
  76. package/lib/cjs/render/primitives/PolylineParams.js +2 -3
  77. package/lib/cjs/render/primitives/PolylineParams.js.map +1 -1
  78. package/lib/cjs/render/primitives/VertexKey.js +1 -1
  79. package/lib/cjs/render/primitives/VertexKey.js.map +1 -1
  80. package/lib/cjs/render/primitives/VertexTable.js +1 -1
  81. package/lib/cjs/render/primitives/VertexTable.js.map +1 -1
  82. package/lib/cjs/render/primitives/VertexTableSplitter.js +6 -8
  83. package/lib/cjs/render/primitives/VertexTableSplitter.js.map +1 -1
  84. package/lib/cjs/render/primitives/geometry/GeometryAccumulator.js +9 -11
  85. package/lib/cjs/render/primitives/geometry/GeometryAccumulator.js.map +1 -1
  86. package/lib/cjs/render/primitives/geometry/GeometryListBuilder.js +3 -5
  87. package/lib/cjs/render/primitives/geometry/GeometryListBuilder.js.map +1 -1
  88. package/lib/cjs/render/primitives/mesh/MeshBuilder.js +1 -1
  89. package/lib/cjs/render/primitives/mesh/MeshBuilder.js.map +1 -1
  90. package/lib/cjs/render/primitives/mesh/MeshPrimitives.js +2 -3
  91. package/lib/cjs/render/primitives/mesh/MeshPrimitives.js.map +1 -1
  92. package/lib/cjs/render/webgl/BranchState.js +9 -10
  93. package/lib/cjs/render/webgl/BranchState.js.map +1 -1
  94. package/lib/cjs/render/webgl/EDL.js +17 -21
  95. package/lib/cjs/render/webgl/EDL.js.map +1 -1
  96. package/lib/cjs/render/webgl/FeatureOverrides.js +2 -2
  97. package/lib/cjs/render/webgl/FeatureOverrides.js.map +1 -1
  98. package/lib/cjs/render/webgl/Graphic.js +3 -5
  99. package/lib/cjs/render/webgl/Graphic.js.map +1 -1
  100. package/lib/cjs/render/webgl/IndexedEdgeGeometry.js +1 -1
  101. package/lib/cjs/render/webgl/IndexedEdgeGeometry.js.map +1 -1
  102. package/lib/cjs/render/webgl/InstancedGeometry.js +2 -3
  103. package/lib/cjs/render/webgl/InstancedGeometry.js.map +1 -1
  104. package/lib/cjs/render/webgl/Mesh.js +7 -10
  105. package/lib/cjs/render/webgl/Mesh.js.map +1 -1
  106. package/lib/cjs/render/webgl/MeshData.js +1 -2
  107. package/lib/cjs/render/webgl/MeshData.js.map +1 -1
  108. package/lib/cjs/render/webgl/PlanarClassifier.js +10 -15
  109. package/lib/cjs/render/webgl/PlanarClassifier.js.map +1 -1
  110. package/lib/cjs/render/webgl/RealityMesh.js +5 -8
  111. package/lib/cjs/render/webgl/RealityMesh.js.map +1 -1
  112. package/lib/cjs/render/webgl/RealityModelUniforms.js +3 -4
  113. package/lib/cjs/render/webgl/RealityModelUniforms.js.map +1 -1
  114. package/lib/cjs/render/webgl/RenderCommands.js +7 -8
  115. package/lib/cjs/render/webgl/RenderCommands.js.map +1 -1
  116. package/lib/cjs/render/webgl/SceneCompositor.js +7 -9
  117. package/lib/cjs/render/webgl/SceneCompositor.js.map +1 -1
  118. package/lib/cjs/render/webgl/ShaderBuilder.js +1 -2
  119. package/lib/cjs/render/webgl/ShaderBuilder.js.map +1 -1
  120. package/lib/cjs/render/webgl/SolarShadowMap.js +1 -2
  121. package/lib/cjs/render/webgl/SolarShadowMap.js.map +1 -1
  122. package/lib/cjs/render/webgl/SurfaceGeometry.js +1 -1
  123. package/lib/cjs/render/webgl/SurfaceGeometry.js.map +1 -1
  124. package/lib/cjs/render/webgl/System.js +12 -16
  125. package/lib/cjs/render/webgl/System.js.map +1 -1
  126. package/lib/cjs/render/webgl/Target.js +9 -14
  127. package/lib/cjs/render/webgl/Target.js.map +1 -1
  128. package/lib/cjs/render/webgl/TargetGraphics.js +1 -2
  129. package/lib/cjs/render/webgl/TargetGraphics.js.map +1 -1
  130. package/lib/cjs/render/webgl/Texture.js +1 -2
  131. package/lib/cjs/render/webgl/Texture.js.map +1 -1
  132. package/lib/cjs/render/webgl/ThematicSensors.js +2 -4
  133. package/lib/cjs/render/webgl/ThematicSensors.js.map +1 -1
  134. package/lib/cjs/render/webgl/VisibleTileFeatures.js +1 -2
  135. package/lib/cjs/render/webgl/VisibleTileFeatures.js.map +1 -1
  136. package/lib/cjs/render/webgl/glsl/Animation.js +6 -9
  137. package/lib/cjs/render/webgl/glsl/Animation.js.map +1 -1
  138. package/lib/cjs/render/webgl/glsl/FeatureSymbology.js +1 -2
  139. package/lib/cjs/render/webgl/glsl/FeatureSymbology.js.map +1 -1
  140. package/lib/cjs/render/webgl/glsl/Instancing.js +4 -5
  141. package/lib/cjs/render/webgl/glsl/Instancing.js.map +1 -1
  142. package/lib/cjs/render/webgl/glsl/RealityMesh.js +2 -4
  143. package/lib/cjs/render/webgl/glsl/RealityMesh.js.map +1 -1
  144. package/lib/cjs/render/webgl/glsl/Surface.js +1 -2
  145. package/lib/cjs/render/webgl/glsl/Surface.js.map +1 -1
  146. package/lib/cjs/render/webgl/glsl/Thematic.js +1 -2
  147. package/lib/cjs/render/webgl/glsl/Thematic.js.map +1 -1
  148. package/lib/cjs/tile/ClassifierTileTree.js +3 -3
  149. package/lib/cjs/tile/ClassifierTileTree.js.map +1 -1
  150. package/lib/cjs/tile/GltfReader.js +61 -75
  151. package/lib/cjs/tile/GltfReader.js.map +1 -1
  152. package/lib/cjs/tile/IModelTile.js +2 -3
  153. package/lib/cjs/tile/IModelTile.js.map +1 -1
  154. package/lib/cjs/tile/IModelTileRequestChannels.js +6 -11
  155. package/lib/cjs/tile/IModelTileRequestChannels.js.map +1 -1
  156. package/lib/cjs/tile/IModelTileTree.js +5 -9
  157. package/lib/cjs/tile/IModelTileTree.js.map +1 -1
  158. package/lib/cjs/tile/ImdlReader.js +13 -17
  159. package/lib/cjs/tile/ImdlReader.js.map +1 -1
  160. package/lib/cjs/tile/OrbitGtTileTree.js +2 -2
  161. package/lib/cjs/tile/OrbitGtTileTree.js.map +1 -1
  162. package/lib/cjs/tile/PntsReader.js +4 -5
  163. package/lib/cjs/tile/PntsReader.js.map +1 -1
  164. package/lib/cjs/tile/PrimaryTileTree.js +22 -32
  165. package/lib/cjs/tile/PrimaryTileTree.js.map +1 -1
  166. package/lib/cjs/tile/RealityModelTileTree.js +12 -19
  167. package/lib/cjs/tile/RealityModelTileTree.js.map +1 -1
  168. package/lib/cjs/tile/RealityTile.js +3 -5
  169. package/lib/cjs/tile/RealityTile.js.map +1 -1
  170. package/lib/cjs/tile/RealityTileLoader.js +2 -2
  171. package/lib/cjs/tile/RealityTileLoader.js.map +1 -1
  172. package/lib/cjs/tile/ThreeDTileFormatInterpreter.js +3 -5
  173. package/lib/cjs/tile/ThreeDTileFormatInterpreter.js.map +1 -1
  174. package/lib/cjs/tile/Tile.js +1 -1
  175. package/lib/cjs/tile/Tile.js.map +1 -1
  176. package/lib/cjs/tile/TileAdmin.js +22 -27
  177. package/lib/cjs/tile/TileAdmin.js.map +1 -1
  178. package/lib/cjs/tile/TileDrawArgs.js +3 -6
  179. package/lib/cjs/tile/TileDrawArgs.js.map +1 -1
  180. package/lib/cjs/tile/TileRequestChannels.js +1 -1
  181. package/lib/cjs/tile/TileRequestChannels.js.map +1 -1
  182. package/lib/cjs/tile/TileTree.js +2 -3
  183. package/lib/cjs/tile/TileTree.js.map +1 -1
  184. package/lib/cjs/tile/TiledGraphicsProvider.js +1 -1
  185. package/lib/cjs/tile/TiledGraphicsProvider.js.map +1 -1
  186. package/lib/cjs/tile/map/ArcGISTileMap.js +5 -6
  187. package/lib/cjs/tile/map/ArcGISTileMap.js.map +1 -1
  188. package/lib/cjs/tile/map/ArcGisUtilities.js +6 -8
  189. package/lib/cjs/tile/map/ArcGisUtilities.js.map +1 -1
  190. package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.js +4 -7
  191. package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
  192. package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +6 -8
  193. package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  194. package/lib/cjs/tile/map/ImageryProviders/BingImageryProvider.js +1 -2
  195. package/lib/cjs/tile/map/ImageryProviders/BingImageryProvider.js.map +1 -1
  196. package/lib/cjs/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +14 -19
  197. package/lib/cjs/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
  198. package/lib/cjs/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js +14 -20
  199. package/lib/cjs/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
  200. package/lib/cjs/tile/map/MapCartoRectangle.js +1 -1
  201. package/lib/cjs/tile/map/MapCartoRectangle.js.map +1 -1
  202. package/lib/cjs/tile/map/MapLayerFormatRegistry.js +5 -6
  203. package/lib/cjs/tile/map/MapLayerFormatRegistry.js.map +1 -1
  204. package/lib/cjs/tile/map/MapLayerImageryFormats.js +11 -14
  205. package/lib/cjs/tile/map/MapLayerImageryFormats.js.map +1 -1
  206. package/lib/cjs/tile/map/MapLayerImageryProvider.js +2 -3
  207. package/lib/cjs/tile/map/MapLayerImageryProvider.js.map +1 -1
  208. package/lib/cjs/tile/map/MapLayerSources.js +1 -1
  209. package/lib/cjs/tile/map/MapLayerSources.js.map +1 -1
  210. package/lib/cjs/tile/map/MapTile.js +6 -8
  211. package/lib/cjs/tile/map/MapTile.js.map +1 -1
  212. package/lib/cjs/tile/map/MapTileLoader.js +1 -1
  213. package/lib/cjs/tile/map/MapTileLoader.js.map +1 -1
  214. package/lib/cjs/tile/map/MapTileTree.js +13 -18
  215. package/lib/cjs/tile/map/MapTileTree.js.map +1 -1
  216. package/lib/cjs/tile/map/MapTiledGraphicsProvider.js +6 -7
  217. package/lib/cjs/tile/map/MapTiledGraphicsProvider.js.map +1 -1
  218. package/lib/cjs/tile/map/WmsCapabilities.js +4 -5
  219. package/lib/cjs/tile/map/WmsCapabilities.js.map +1 -1
  220. package/lib/cjs/tile/map/WmtsCapabilities.js +17 -25
  221. package/lib/cjs/tile/map/WmtsCapabilities.js.map +1 -1
  222. package/lib/cjs/tools/ClipViewTool.js +1 -1
  223. package/lib/cjs/tools/ClipViewTool.js.map +1 -1
  224. package/lib/cjs/tools/MeasureTool.js +2 -4
  225. package/lib/cjs/tools/MeasureTool.js.map +1 -1
  226. package/lib/cjs/tools/PrimitiveTool.js +2 -3
  227. package/lib/cjs/tools/PrimitiveTool.js.map +1 -1
  228. package/lib/cjs/tools/SelectTool.js +1 -2
  229. package/lib/cjs/tools/SelectTool.js.map +1 -1
  230. package/lib/cjs/tools/Tool.js +2 -3
  231. package/lib/cjs/tools/Tool.js.map +1 -1
  232. package/lib/cjs/tools/ToolAdmin.js +2 -4
  233. package/lib/cjs/tools/ToolAdmin.js.map +1 -1
  234. package/lib/cjs/tools/ViewTool.js +3 -3
  235. package/lib/cjs/tools/ViewTool.js.map +1 -1
  236. package/lib/esm/AccuDraw.js +1 -1
  237. package/lib/esm/AccuDraw.js.map +1 -1
  238. package/lib/esm/AccuSnap.js +3 -3
  239. package/lib/esm/AccuSnap.js.map +1 -1
  240. package/lib/esm/BriefcaseConnection.js +9 -11
  241. package/lib/esm/BriefcaseConnection.js.map +1 -1
  242. package/lib/esm/DisplayStyleState.js +8 -12
  243. package/lib/esm/DisplayStyleState.js.map +1 -1
  244. package/lib/esm/DrawingViewState.js +4 -6
  245. package/lib/esm/DrawingViewState.js.map +1 -1
  246. package/lib/esm/EnvironmentDecorations.js +2 -3
  247. package/lib/esm/EnvironmentDecorations.js.map +1 -1
  248. package/lib/esm/FlashSettings.js +3 -4
  249. package/lib/esm/FlashSettings.js.map +1 -1
  250. package/lib/esm/GeoServices.js +7 -9
  251. package/lib/esm/GeoServices.js.map +1 -1
  252. package/lib/esm/IModelApp.js +19 -21
  253. package/lib/esm/IModelApp.js.map +1 -1
  254. package/lib/esm/IModelConnection.js +1 -1
  255. package/lib/esm/IModelConnection.js.map +1 -1
  256. package/lib/esm/IpcApp.js +1 -1
  257. package/lib/esm/IpcApp.js.map +1 -1
  258. package/lib/esm/LocalhostIpcApp.js +3 -4
  259. package/lib/esm/LocalhostIpcApp.js.map +1 -1
  260. package/lib/esm/ModelState.js +2 -3
  261. package/lib/esm/ModelState.js.map +1 -1
  262. package/lib/esm/NativeApp.js +4 -7
  263. package/lib/esm/NativeApp.js.map +1 -1
  264. package/lib/esm/NoRenderApp.js +1 -2
  265. package/lib/esm/NoRenderApp.js.map +1 -1
  266. package/lib/esm/PlanarClipMaskState.js +1 -1
  267. package/lib/esm/PlanarClipMaskState.js.map +1 -1
  268. package/lib/esm/RealityDataSourceContextShareImpl.js +2 -4
  269. package/lib/esm/RealityDataSourceContextShareImpl.js.map +1 -1
  270. package/lib/esm/SheetViewState.js +15 -23
  271. package/lib/esm/SheetViewState.js.map +1 -1
  272. package/lib/esm/Tiles.js +2 -2
  273. package/lib/esm/Tiles.js.map +1 -1
  274. package/lib/esm/ViewContext.js +1 -1
  275. package/lib/esm/ViewContext.js.map +1 -1
  276. package/lib/esm/ViewCreator2d.js +4 -5
  277. package/lib/esm/ViewCreator2d.js.map +1 -1
  278. package/lib/esm/ViewCreator3d.js +5 -5
  279. package/lib/esm/ViewCreator3d.js.map +1 -1
  280. package/lib/esm/ViewState.js +17 -24
  281. package/lib/esm/ViewState.js.map +1 -1
  282. package/lib/esm/Viewport.js +22 -32
  283. package/lib/esm/Viewport.js.map +1 -1
  284. package/lib/esm/extension/ExtensionImpl.js +1 -1
  285. package/lib/esm/extension/ExtensionImpl.js.map +1 -1
  286. package/lib/esm/quantity-formatting/BaseUnitFormattingSettingsProvider.js +2 -3
  287. package/lib/esm/quantity-formatting/BaseUnitFormattingSettingsProvider.js.map +1 -1
  288. package/lib/esm/quantity-formatting/QuantityFormatter.js +7 -9
  289. package/lib/esm/quantity-formatting/QuantityFormatter.js.map +1 -1
  290. package/lib/esm/render/FeatureSymbology.js +1 -2
  291. package/lib/esm/render/FeatureSymbology.js.map +1 -1
  292. package/lib/esm/render/GraphicBuilder.js +7 -9
  293. package/lib/esm/render/GraphicBuilder.js.map +1 -1
  294. package/lib/esm/render/MockRender.js +1 -2
  295. package/lib/esm/render/MockRender.js.map +1 -1
  296. package/lib/esm/render/ParticleCollectionBuilder.js +2 -3
  297. package/lib/esm/render/ParticleCollectionBuilder.js.map +1 -1
  298. package/lib/esm/render/RealityMeshParams.js +7 -10
  299. package/lib/esm/render/RealityMeshParams.js.map +1 -1
  300. package/lib/esm/render/RenderPlan.js +1 -1
  301. package/lib/esm/render/RenderPlan.js.map +1 -1
  302. package/lib/esm/render/RenderSystem.js +1 -2
  303. package/lib/esm/render/RenderSystem.js.map +1 -1
  304. package/lib/esm/render/VisibleFeature.js +2 -4
  305. package/lib/esm/render/VisibleFeature.js.map +1 -1
  306. package/lib/esm/render/primitives/AuxChannelTable.js +6 -9
  307. package/lib/esm/render/primitives/AuxChannelTable.js.map +1 -1
  308. package/lib/esm/render/primitives/EdgeParams.js +6 -7
  309. package/lib/esm/render/primitives/EdgeParams.js.map +1 -1
  310. package/lib/esm/render/primitives/PolylineParams.js +2 -3
  311. package/lib/esm/render/primitives/PolylineParams.js.map +1 -1
  312. package/lib/esm/render/primitives/VertexKey.js +1 -1
  313. package/lib/esm/render/primitives/VertexKey.js.map +1 -1
  314. package/lib/esm/render/primitives/VertexTable.js +1 -1
  315. package/lib/esm/render/primitives/VertexTable.js.map +1 -1
  316. package/lib/esm/render/primitives/VertexTableSplitter.js +6 -8
  317. package/lib/esm/render/primitives/VertexTableSplitter.js.map +1 -1
  318. package/lib/esm/render/primitives/geometry/GeometryAccumulator.js +9 -11
  319. package/lib/esm/render/primitives/geometry/GeometryAccumulator.js.map +1 -1
  320. package/lib/esm/render/primitives/geometry/GeometryListBuilder.js +3 -5
  321. package/lib/esm/render/primitives/geometry/GeometryListBuilder.js.map +1 -1
  322. package/lib/esm/render/primitives/mesh/MeshBuilder.js +1 -1
  323. package/lib/esm/render/primitives/mesh/MeshBuilder.js.map +1 -1
  324. package/lib/esm/render/primitives/mesh/MeshPrimitives.js +2 -3
  325. package/lib/esm/render/primitives/mesh/MeshPrimitives.js.map +1 -1
  326. package/lib/esm/render/webgl/BranchState.js +9 -10
  327. package/lib/esm/render/webgl/BranchState.js.map +1 -1
  328. package/lib/esm/render/webgl/EDL.js +17 -21
  329. package/lib/esm/render/webgl/EDL.js.map +1 -1
  330. package/lib/esm/render/webgl/FeatureOverrides.js +2 -2
  331. package/lib/esm/render/webgl/FeatureOverrides.js.map +1 -1
  332. package/lib/esm/render/webgl/Graphic.js +3 -5
  333. package/lib/esm/render/webgl/Graphic.js.map +1 -1
  334. package/lib/esm/render/webgl/IndexedEdgeGeometry.js +1 -1
  335. package/lib/esm/render/webgl/IndexedEdgeGeometry.js.map +1 -1
  336. package/lib/esm/render/webgl/InstancedGeometry.js +2 -3
  337. package/lib/esm/render/webgl/InstancedGeometry.js.map +1 -1
  338. package/lib/esm/render/webgl/Mesh.js +7 -10
  339. package/lib/esm/render/webgl/Mesh.js.map +1 -1
  340. package/lib/esm/render/webgl/MeshData.js +1 -2
  341. package/lib/esm/render/webgl/MeshData.js.map +1 -1
  342. package/lib/esm/render/webgl/PlanarClassifier.js +10 -15
  343. package/lib/esm/render/webgl/PlanarClassifier.js.map +1 -1
  344. package/lib/esm/render/webgl/RealityMesh.js +5 -8
  345. package/lib/esm/render/webgl/RealityMesh.js.map +1 -1
  346. package/lib/esm/render/webgl/RealityModelUniforms.js +3 -4
  347. package/lib/esm/render/webgl/RealityModelUniforms.js.map +1 -1
  348. package/lib/esm/render/webgl/RenderCommands.js +7 -8
  349. package/lib/esm/render/webgl/RenderCommands.js.map +1 -1
  350. package/lib/esm/render/webgl/SceneCompositor.js +7 -9
  351. package/lib/esm/render/webgl/SceneCompositor.js.map +1 -1
  352. package/lib/esm/render/webgl/ShaderBuilder.js +1 -2
  353. package/lib/esm/render/webgl/ShaderBuilder.js.map +1 -1
  354. package/lib/esm/render/webgl/SolarShadowMap.js +1 -2
  355. package/lib/esm/render/webgl/SolarShadowMap.js.map +1 -1
  356. package/lib/esm/render/webgl/SurfaceGeometry.js +1 -1
  357. package/lib/esm/render/webgl/SurfaceGeometry.js.map +1 -1
  358. package/lib/esm/render/webgl/System.js +12 -16
  359. package/lib/esm/render/webgl/System.js.map +1 -1
  360. package/lib/esm/render/webgl/Target.js +9 -14
  361. package/lib/esm/render/webgl/Target.js.map +1 -1
  362. package/lib/esm/render/webgl/TargetGraphics.js +1 -2
  363. package/lib/esm/render/webgl/TargetGraphics.js.map +1 -1
  364. package/lib/esm/render/webgl/Texture.js +1 -2
  365. package/lib/esm/render/webgl/Texture.js.map +1 -1
  366. package/lib/esm/render/webgl/ThematicSensors.js +2 -4
  367. package/lib/esm/render/webgl/ThematicSensors.js.map +1 -1
  368. package/lib/esm/render/webgl/VisibleTileFeatures.js +1 -2
  369. package/lib/esm/render/webgl/VisibleTileFeatures.js.map +1 -1
  370. package/lib/esm/render/webgl/glsl/Animation.js +6 -9
  371. package/lib/esm/render/webgl/glsl/Animation.js.map +1 -1
  372. package/lib/esm/render/webgl/glsl/FeatureSymbology.js +1 -2
  373. package/lib/esm/render/webgl/glsl/FeatureSymbology.js.map +1 -1
  374. package/lib/esm/render/webgl/glsl/Instancing.js +4 -5
  375. package/lib/esm/render/webgl/glsl/Instancing.js.map +1 -1
  376. package/lib/esm/render/webgl/glsl/RealityMesh.js +2 -4
  377. package/lib/esm/render/webgl/glsl/RealityMesh.js.map +1 -1
  378. package/lib/esm/render/webgl/glsl/Surface.js +1 -2
  379. package/lib/esm/render/webgl/glsl/Surface.js.map +1 -1
  380. package/lib/esm/render/webgl/glsl/Thematic.js +1 -2
  381. package/lib/esm/render/webgl/glsl/Thematic.js.map +1 -1
  382. package/lib/esm/tile/ClassifierTileTree.js +3 -3
  383. package/lib/esm/tile/ClassifierTileTree.js.map +1 -1
  384. package/lib/esm/tile/GltfReader.js +61 -75
  385. package/lib/esm/tile/GltfReader.js.map +1 -1
  386. package/lib/esm/tile/IModelTile.js +2 -3
  387. package/lib/esm/tile/IModelTile.js.map +1 -1
  388. package/lib/esm/tile/IModelTileRequestChannels.js +6 -11
  389. package/lib/esm/tile/IModelTileRequestChannels.js.map +1 -1
  390. package/lib/esm/tile/IModelTileTree.js +5 -9
  391. package/lib/esm/tile/IModelTileTree.js.map +1 -1
  392. package/lib/esm/tile/ImdlReader.js +13 -17
  393. package/lib/esm/tile/ImdlReader.js.map +1 -1
  394. package/lib/esm/tile/OrbitGtTileTree.js +2 -2
  395. package/lib/esm/tile/OrbitGtTileTree.js.map +1 -1
  396. package/lib/esm/tile/PntsReader.js +4 -5
  397. package/lib/esm/tile/PntsReader.js.map +1 -1
  398. package/lib/esm/tile/PrimaryTileTree.js +22 -32
  399. package/lib/esm/tile/PrimaryTileTree.js.map +1 -1
  400. package/lib/esm/tile/RealityModelTileTree.js +12 -19
  401. package/lib/esm/tile/RealityModelTileTree.js.map +1 -1
  402. package/lib/esm/tile/RealityTile.js +3 -5
  403. package/lib/esm/tile/RealityTile.js.map +1 -1
  404. package/lib/esm/tile/RealityTileLoader.js +2 -2
  405. package/lib/esm/tile/RealityTileLoader.js.map +1 -1
  406. package/lib/esm/tile/ThreeDTileFormatInterpreter.js +3 -5
  407. package/lib/esm/tile/ThreeDTileFormatInterpreter.js.map +1 -1
  408. package/lib/esm/tile/Tile.js +1 -1
  409. package/lib/esm/tile/Tile.js.map +1 -1
  410. package/lib/esm/tile/TileAdmin.js +22 -27
  411. package/lib/esm/tile/TileAdmin.js.map +1 -1
  412. package/lib/esm/tile/TileDrawArgs.js +3 -6
  413. package/lib/esm/tile/TileDrawArgs.js.map +1 -1
  414. package/lib/esm/tile/TileRequestChannels.js +1 -1
  415. package/lib/esm/tile/TileRequestChannels.js.map +1 -1
  416. package/lib/esm/tile/TileTree.js +2 -3
  417. package/lib/esm/tile/TileTree.js.map +1 -1
  418. package/lib/esm/tile/TiledGraphicsProvider.js +1 -1
  419. package/lib/esm/tile/TiledGraphicsProvider.js.map +1 -1
  420. package/lib/esm/tile/map/ArcGISTileMap.js +5 -6
  421. package/lib/esm/tile/map/ArcGISTileMap.js.map +1 -1
  422. package/lib/esm/tile/map/ArcGisUtilities.js +6 -8
  423. package/lib/esm/tile/map/ArcGisUtilities.js.map +1 -1
  424. package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.js +4 -7
  425. package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
  426. package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +6 -8
  427. package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  428. package/lib/esm/tile/map/ImageryProviders/BingImageryProvider.js +1 -2
  429. package/lib/esm/tile/map/ImageryProviders/BingImageryProvider.js.map +1 -1
  430. package/lib/esm/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +14 -19
  431. package/lib/esm/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
  432. package/lib/esm/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js +14 -20
  433. package/lib/esm/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
  434. package/lib/esm/tile/map/MapCartoRectangle.js +1 -1
  435. package/lib/esm/tile/map/MapCartoRectangle.js.map +1 -1
  436. package/lib/esm/tile/map/MapLayerFormatRegistry.js +5 -6
  437. package/lib/esm/tile/map/MapLayerFormatRegistry.js.map +1 -1
  438. package/lib/esm/tile/map/MapLayerImageryFormats.js +11 -14
  439. package/lib/esm/tile/map/MapLayerImageryFormats.js.map +1 -1
  440. package/lib/esm/tile/map/MapLayerImageryProvider.js +2 -3
  441. package/lib/esm/tile/map/MapLayerImageryProvider.js.map +1 -1
  442. package/lib/esm/tile/map/MapLayerSources.js +1 -1
  443. package/lib/esm/tile/map/MapLayerSources.js.map +1 -1
  444. package/lib/esm/tile/map/MapTile.js +6 -8
  445. package/lib/esm/tile/map/MapTile.js.map +1 -1
  446. package/lib/esm/tile/map/MapTileLoader.js +1 -1
  447. package/lib/esm/tile/map/MapTileLoader.js.map +1 -1
  448. package/lib/esm/tile/map/MapTileTree.js +13 -18
  449. package/lib/esm/tile/map/MapTileTree.js.map +1 -1
  450. package/lib/esm/tile/map/MapTiledGraphicsProvider.js +6 -7
  451. package/lib/esm/tile/map/MapTiledGraphicsProvider.js.map +1 -1
  452. package/lib/esm/tile/map/WmsCapabilities.js +4 -5
  453. package/lib/esm/tile/map/WmsCapabilities.js.map +1 -1
  454. package/lib/esm/tile/map/WmtsCapabilities.js +17 -25
  455. package/lib/esm/tile/map/WmtsCapabilities.js.map +1 -1
  456. package/lib/esm/tools/ClipViewTool.js +1 -1
  457. package/lib/esm/tools/ClipViewTool.js.map +1 -1
  458. package/lib/esm/tools/MeasureTool.js +2 -4
  459. package/lib/esm/tools/MeasureTool.js.map +1 -1
  460. package/lib/esm/tools/PrimitiveTool.js +2 -3
  461. package/lib/esm/tools/PrimitiveTool.js.map +1 -1
  462. package/lib/esm/tools/SelectTool.js +1 -2
  463. package/lib/esm/tools/SelectTool.js.map +1 -1
  464. package/lib/esm/tools/Tool.js +2 -3
  465. package/lib/esm/tools/Tool.js.map +1 -1
  466. package/lib/esm/tools/ToolAdmin.js +2 -4
  467. package/lib/esm/tools/ToolAdmin.js.map +1 -1
  468. package/lib/esm/tools/ViewTool.js +3 -3
  469. package/lib/esm/tools/ViewTool.js.map +1 -1
  470. package/package.json +18 -18
@@ -1 +1 @@
1
- {"version":3,"file":"Surface.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Surface.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module WebGL\n */\n\nimport { assert } from \"@itwin/core-bentley\";\nimport { AttributeMap } from \"../AttributeMap\";\nimport { Material } from \"../Material\";\nimport { Pass, SurfaceBitIndex, SurfaceFlags, TextureUnit } from \"../RenderFlags\";\nimport {\n FragmentShaderBuilder, FragmentShaderComponent, ProgramBuilder, ShaderBuilder, VariableType, VertexShaderComponent,\n} from \"../ShaderBuilder\";\nimport { System } from \"../System\";\nimport {\n FeatureMode, IsAnimated, IsClassified, IsInstanced, IsShadowable, IsThematic, PositionType, TechniqueFlags,\n} from \"../TechniqueFlags\";\nimport { TechniqueId } from \"../TechniqueId\";\nimport { Texture } from \"../Texture\";\nimport { addAnimation } from \"./Animation\";\nimport { unpackFloat } from \"./Clipping\";\nimport { addColor } from \"./Color\";\nimport { addChooseVec2WithBitFlagsFunction, addChooseVec3WithBitFlagFunction, addExtractNthBit, addFrustum, addShaderFlags } from \"./Common\";\nimport { addUnpackAndNormalize2Bytes, decodeDepthRgb, unquantize2d } from \"./Decode\";\nimport {\n addFeatureSymbology, addMaxAlpha, addRenderOrder, addRenderOrderConstants, addSurfaceDiscard, addSurfaceHiliter, FeatureSymbologyOptions,\n} from \"./FeatureSymbology\";\nimport {\n addAltPickBufferOutputs, addFragColorWithPreMultipliedAlpha, addPickBufferOutputs, addWhiteOnWhiteReversal, assignFragColor,\n} from \"./Fragment\";\nimport { addLighting } from \"./Lighting\";\nimport { addSurfaceMonochrome } from \"./Monochrome\";\nimport { addColorPlanarClassifier, addFeaturePlanarClassifier, addHilitePlanarClassifier, addOverrideClassifierColor } from \"./PlanarClassification\";\nimport { addRenderPass } from \"./RenderPass\";\nimport { addSolarShadowMap } from \"./SolarShadowMapping\";\nimport { addThematicDisplay, getComputeThematicIndex } from \"./Thematic\";\nimport { addTranslucency } from \"./Translucency\";\nimport { addModelViewMatrix, addNormalMatrix, addProjectionMatrix } from \"./Vertex\";\nimport { wantMaterials } from \"../SurfaceGeometry\";\nimport { addWiremesh } from \"./Wiremesh\";\n\n// NB: Textures do not contain pre-multiplied alpha.\nconst sampleSurfaceTexture = `\nvec4 sampleSurfaceTexture() {\n return TEXTURE(s_texture, v_texCoord);\n}\n`;\n\nconst applyMaterialColor = `\n float useMatColor = float(use_material);\n vec3 rgb = mix(baseColor.rgb, mat_rgb.rgb, useMatColor * mat_rgb.a);\n float a = mix(baseColor.a, mat_alpha.x, useMatColor * mat_alpha.y);\n return vec4(rgb, a);\n`;\n\n// if this is a raster glyph, the sampled color has already been modified - do not modify further.\n// Mix diffuse color with texel based on texture weight.\n// Replace with diffuse RGB if RGB overridden.\n// Replace with diffuse alpha if alpha overridden.\n// Multiply texel alpha with diffuse alpha if specified.\nconst applyTextureWeight = `\n bool applyTexture = !u_applyGlyphTex && isSurfaceBitSet(kSurfaceBit_HasTexture);\n float textureWeight = applyTexture ? mat_texture_weight : 0.0;\n vec3 rgb = mix(baseColor.rgb, g_surfaceTexel.rgb, textureWeight);\n rgb = chooseVec3WithBitFlag(rgb, baseColor.rgb, surfaceFlags, kSurfaceBit_OverrideRgb);\n\n float a = applyTexture ? baseColor.a * g_surfaceTexel.a : baseColor.a;\n\n return vec4(rgb, a);\n`;\n\nconst decodeFragMaterialParams = `\nvoid decodeMaterialParams(vec4 params) {\n mat_weights = unpackAndNormalize2Bytes(params.x);\n\n vec2 texAndSpecR = unpackAndNormalize2Bytes(params.y);\n mat_texture_weight = texAndSpecR.x;\n\n vec2 specGB = unpackAndNormalize2Bytes(params.z);\n mat_specular = vec4(texAndSpecR.y, specGB, params.w);\n}\n`;\n\nconst decodeMaterialColor = `\nvoid decodeMaterialColor(vec4 rgba) {\n mat_rgb = vec4(rgba.rgb, float(rgba.r >= 0.0));\n mat_alpha = vec2(rgba.a, float(rgba.a >= 0.0));\n}\n`;\n\n// defaults: (0x6699, 0xffff, 0xffff, 13.5)\nconst computeMaterialParams = `\n const vec4 defaults = vec4(26265.0, 65535.0, 65535.0, 13.5);\n return use_material ? g_materialParams : defaults;\n`;\n\n// The 8-bit material index is stored with the 24-bit feature index, in the high byte.\nconst readMaterialAtlas = `\nvoid readMaterialAtlas() {\n float materialAtlasStart = u_vertParams.z * u_vertParams.w + u_numColors;\n float materialIndex = g_featureAndMaterialIndex.w * 4.0 + materialAtlasStart;\n\n vec2 tc = computeLUTCoords(materialIndex, u_vertParams.xy, g_vert_center, 1.0);\n vec4 rgba = TEXTURE(u_vertLUT, tc);\n\n tc = computeLUTCoords(materialIndex + 1.0, u_vertParams.xy, g_vert_center, 1.0);\n vec4 weightsAndFlags = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);\n\n tc = computeLUTCoords(materialIndex + 2.0, u_vertParams.xy, g_vert_center, 1.0);\n vec3 specularRgb = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5).rgb;\n\n tc = computeLUTCoords(materialIndex + 3.0, u_vertParams.xy, g_vert_center, 1.0);\n vec4 packedSpecularExponent = TEXTURE(u_vertLUT, tc);\n\n float flags = weightsAndFlags.w;\n mat_rgb = vec4(rgba.rgb, float(flags == 1.0 || flags == 3.0));\n mat_alpha = vec2(rgba.a, float(flags == 2.0 || flags == 3.0));\n\n float specularExponent = unpackFloat(packedSpecularExponent);\n g_materialParams.x = weightsAndFlags.y + weightsAndFlags.z * 256.0;\n g_materialParams.y = 255.0 + specularRgb.r * 256.0;\n g_materialParams.z = specularRgb.g + specularRgb.b * 256.0;\n g_materialParams.w = specularExponent;\n}\n`;\n\nconst computeMaterial = `\n if (u_surfaceFlags[kSurfaceBitIndex_HasMaterialAtlas]) {\n readMaterialAtlas();\n } else {\n decodeMaterialColor(u_materialColor);\n g_materialParams = u_materialParams;\n }\n`;\n\nconst computeMaterialInstanced = `\n decodeMaterialColor(u_materialColor);\n g_materialParams = u_materialParams;\n`;\n\nfunction addMaterial(builder: ProgramBuilder, instanced: boolean): void {\n const frag = builder.frag;\n assert(undefined !== frag.find(\"v_surfaceFlags\"));\n\n frag.addGlobal(\"mat_texture_weight\", VariableType.Float);\n frag.addGlobal(\"mat_weights\", VariableType.Vec2); // diffuse, specular\n frag.addGlobal(\"mat_specular\", VariableType.Vec4); // rgb, exponent\n\n addUnpackAndNormalize2Bytes(frag);\n frag.addFunction(decodeFragMaterialParams);\n frag.addInitializer(\"decodeMaterialParams(v_materialParams);\");\n\n addChooseVec3WithBitFlagFunction(frag);\n frag.set(FragmentShaderComponent.ApplyMaterialOverrides, applyTextureWeight);\n\n const vert = builder.vert;\n vert.addGlobal(\"mat_rgb\", VariableType.Vec4); // a = 0 if not overridden, else 1\n vert.addGlobal(\"mat_alpha\", VariableType.Vec2); // a = 0 if not overridden, else 1\n vert.addGlobal(\"use_material\", VariableType.Boolean);\n vert.addInitializer(\"use_material = (0u == (surfaceFlags & kSurfaceBit_IgnoreMaterial));\");\n\n // Uniform material\n vert.addFunction(decodeMaterialColor);\n vert.addUniform(\"u_materialColor\", VariableType.Vec4, (prog) => {\n prog.addGraphicUniform(\"u_materialColor\", (uniform, params) => {\n const info = wantMaterials(params.target.currentViewFlags) ? params.geometry.materialInfo : undefined;\n const mat = undefined !== info && !info.isAtlas ? info : Material.default;\n uniform.setUniform4fv(mat.rgba);\n });\n });\n\n vert.addUniform(\"u_materialParams\", VariableType.Vec4, (prog) => {\n prog.addGraphicUniform(\"u_materialParams\", (uniform, params) => {\n const info = wantMaterials(params.target.currentViewFlags) ? params.geometry.materialInfo : undefined;\n const mat = undefined !== info && !info.isAtlas ? info : Material.default;\n uniform.setUniform4fv(mat.fragUniforms);\n });\n });\n\n if (!instanced) {\n // Material atlas\n vert.addFunction(unpackFloat);\n vert.addFunction(readMaterialAtlas);\n vert.addUniform(\"u_numColors\", VariableType.Float, (prog) => {\n prog.addGraphicUniform(\"u_numColors\", (uniform, params) => {\n const info = params.geometry.materialInfo;\n const numColors = undefined !== info && info.isAtlas ? info.vertexTableOffset : 0;\n uniform.setUniform1f(numColors);\n });\n });\n }\n vert.addGlobal(\"g_materialParams\", VariableType.Vec4);\n vert.set(VertexShaderComponent.ComputeMaterial, instanced ? computeMaterialInstanced : computeMaterial);\n vert.set(VertexShaderComponent.ApplyMaterialColor, applyMaterialColor);\n builder.addFunctionComputedVarying(\"v_materialParams\", VariableType.Vec4, \"computeMaterialParams\", computeMaterialParams);\n}\n\nconst computePositionPrelude = `\n vec4 pos = MAT_MV * rawPos;\n`;\n\n// We used to use gl.polygonOffset() for blanking regions, but that doesn't work with logarithmic depth buffer which overwrites the\n// computed Z. Instead we must manually offset in vertex shader. We do this even if log depth is not enabled/supported.\n// NOTE: If log depth is *not* supported, then the hilite surface vertex shaders previously would still include this logic, but the\n// fragment shaders would not use v_eyeSpace. Some Ubuntu 20.04 graphics drivers cleverly and correctly optimized out the varying and the uniform,\n// causing an exception when gl.getProgramLocation() failed. So, omit this bit in that case.\nconst adjustEyeSpace = `\n v_eyeSpace = pos.xyz;\n const float blankingRegionOffset = 2.0 / 65536.0;\n if (kRenderOrder_BlankingRegion == u_renderOrder)\n v_eyeSpace.z -= blankingRegionOffset * (u_frustum.y - u_frustum.x);\n`;\n\nconst computePositionPostlude = `\n return u_proj * pos;\n`;\n\nfunction createCommon(isInstanced: IsInstanced, animated: IsAnimated, shadowable: IsShadowable, isHiliter: boolean, positionType: PositionType): ProgramBuilder {\n const instanced = IsInstanced.Yes === isInstanced;\n const attrMap = AttributeMap.findAttributeMap(TechniqueId.Surface, instanced);\n const builder = new ProgramBuilder(attrMap, { positionType, instanced });\n const vert = builder.vert;\n\n if (animated)\n addAnimation(vert, true);\n\n if (shadowable)\n addSolarShadowMap(builder);\n\n addProjectionMatrix(vert);\n addModelViewMatrix(vert);\n\n let computePosition;\n if (isHiliter && !System.instance.supportsLogZBuffer) {\n computePosition = computePositionPrelude + computePositionPostlude;\n } else {\n addFrustum(builder);\n addRenderOrder(builder.vert);\n addRenderOrderConstants(builder.vert);\n builder.addVarying(\"v_eyeSpace\", VariableType.Vec3);\n computePosition = computePositionPrelude + adjustEyeSpace + computePositionPostlude;\n }\n\n vert.set(VertexShaderComponent.ComputePosition, computePosition);\n\n return builder;\n}\n\n/** @internal */\nexport function createSurfaceHiliter(instanced: IsInstanced, classified: IsClassified, posType: PositionType): ProgramBuilder {\n const builder = createCommon(instanced, IsAnimated.No, IsShadowable.No, true, posType);\n\n addSurfaceFlags(builder, true, false);\n addTexture(builder, IsAnimated.No, IsThematic.No, false, true);\n if (classified) {\n addHilitePlanarClassifier(builder);\n builder.vert.addGlobal(\"feature_ignore_material\", VariableType.Boolean, \"false\");\n builder.frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\n } else {\n addSurfaceHiliter(builder);\n }\n\n return builder;\n}\n\nconst isSurfaceBitSet = `\nbool isSurfaceBitSet(uint flag) { return 0u != (surfaceFlags & flag); }\n`;\n\n/** @internal */\nfunction addSurfaceFlagsLookup(builder: ShaderBuilder) {\n builder.addConstant(\"kSurfaceBitIndex_HasTexture\", VariableType.Int, SurfaceBitIndex.HasTexture.toString());\n builder.addConstant(\"kSurfaceBitIndex_ApplyLighting\", VariableType.Int, SurfaceBitIndex.ApplyLighting.toString());\n builder.addConstant(\"kSurfaceBitIndex_HasNormals\", VariableType.Int, SurfaceBitIndex.HasNormals.toString());\n builder.addConstant(\"kSurfaceBitIndex_IgnoreMaterial\", VariableType.Int, SurfaceBitIndex.IgnoreMaterial.toString());\n builder.addConstant(\"kSurfaceBitIndex_TransparencyThreshold\", VariableType.Int, SurfaceBitIndex.TransparencyThreshold.toString());\n builder.addConstant(\"kSurfaceBitIndex_BackgroundFill\", VariableType.Int, SurfaceBitIndex.BackgroundFill.toString());\n builder.addConstant(\"kSurfaceBitIndex_HasColorAndNormal\", VariableType.Int, SurfaceBitIndex.HasColorAndNormal.toString());\n builder.addConstant(\"kSurfaceBitIndex_OverrideRgb\", VariableType.Int, SurfaceBitIndex.OverrideRgb.toString());\n builder.addConstant(\"kSurfaceBitIndex_HasNormalMap\", VariableType.Int, SurfaceBitIndex.HasNormalMap.toString());\n builder.addConstant(\"kSurfaceBitIndex_HasMaterialAtlas\", VariableType.Int, SurfaceBitIndex.HasMaterialAtlas.toString());\n\n // Surface flags which get modified in vertex shader are still passed to fragment shader as a single float & are thus\n // used differently there & so require different constants. Unused constants are commented out.\n builder.addBitFlagConstant(\"kSurfaceBit_HasTexture\", SurfaceBitIndex.HasTexture);\n builder.addBitFlagConstant(\"kSurfaceBit_IgnoreMaterial\", SurfaceBitIndex.IgnoreMaterial);\n builder.addBitFlagConstant(\"kSurfaceBit_OverrideRgb\", SurfaceBitIndex.OverrideRgb);\n builder.addBitFlagConstant(\"kSurfaceBit_HasNormalMap\", SurfaceBitIndex.HasNormalMap);\n\n // Only need masks for flags modified in vertex shader\n const suffix = \"u\";\n const type = VariableType.Uint;\n builder.addConstant(\"kSurfaceMask_HasTexture\", type, SurfaceFlags.HasTexture.toString() + suffix);\n builder.addConstant(\"kSurfaceMask_IgnoreMaterial\", type, SurfaceFlags.IgnoreMaterial.toString() + suffix);\n builder.addConstant(\"kSurfaceMask_OverrideRgb\", type, SurfaceFlags.OverrideRgb.toString() + suffix);\n builder.addConstant(\"kSurfaceMask_HasNormalMap\", type, SurfaceFlags.HasNormalMap.toString() + suffix);\n\n addExtractNthBit(builder);\n builder.addFunction(isSurfaceBitSet);\n builder.addGlobal(\"surfaceFlags\", VariableType.Uint);\n}\n\nconst initSurfaceFlags = `\n surfaceFlags = u_surfaceFlags[kSurfaceBitIndex_HasTexture] ? kSurfaceMask_HasTexture : 0u;\n surfaceFlags += u_surfaceFlags[kSurfaceBitIndex_IgnoreMaterial] ? kSurfaceMask_IgnoreMaterial : 0u;\n surfaceFlags += u_surfaceFlags[kSurfaceBitIndex_OverrideRgb] ? kSurfaceMask_OverrideRgb : 0u;\n surfaceFlags += u_surfaceFlags[kSurfaceBitIndex_HasNormalMap] ? kSurfaceMask_HasNormalMap : 0u;\n`;\n\nconst computeBaseSurfaceFlags = `\n if (feature_ignore_material) {\n if (u_surfaceFlags[kSurfaceBitIndex_HasTexture])\n surfaceFlags -= kSurfaceMask_HasTexture;\n if (u_surfaceFlags[kSurfaceBitIndex_HasNormalMap])\n surfaceFlags -= kSurfaceMask_HasNormalMap;\n\n surfaceFlags += kSurfaceMask_IgnoreMaterial;\n }\n`;\n\n// Textured surfaces (including raster glyphs) always *multiply* the sampled alpha by the alpha override.\nconst computeColorSurfaceFlags = `\n if (feature_rgb.r >= 0.0)\n surfaceFlags += kSurfaceMask_OverrideRgb;\n`;\n\nconst returnSurfaceFlags = \" return float(surfaceFlags);\\n\";\n\nconst computeSurfaceFlags = computeBaseSurfaceFlags;\nconst computeSurfaceFlagsWithColor = computeBaseSurfaceFlags + computeColorSurfaceFlags;\n\n/** @internal */\nexport const octDecodeNormal = `\nvec3 octDecodeNormal(vec2 e) {\n e = e / 255.0 * 2.0 - 1.0;\n vec3 n = vec3(e.x, e.y, 1.0 - abs(e.x) - abs(e.y));\n if (n.z < 0.0) {\n vec2 signNotZero = vec2(n.x >= 0.0 ? 1.0 : -1.0, n.y >= 0.0 ? 1.0 : -1.0);\n n.xy = (1.0 - abs(n.yx)) * signNotZero;\n }\n\n return normalize(n);\n}\n`;\n\nfunction getComputeNormal(quantized: boolean): string {\n const a = quantized ? \"g_vertLutData3.xy\" : \"g_vertLutData4.zw\";\n const b = quantized ? \"g_vertLutData1.zw\" : \"g_vertLutData5.xy\";\n return `\n if (!u_surfaceFlags[kSurfaceBitIndex_HasNormals])\n return vec3(0.0);\n\n vec2 normal = (u_surfaceFlags[kSurfaceBitIndex_HasColorAndNormal]) ? ${a} : ${b};\n return normalize(MAT_NORM * octDecodeNormal(normal));\n`;\n}\n\nconst finalizeNormalPrelude = `\n vec3 normal = normalize(v_n) * (2.0 * float(gl_FrontFacing) - 1.0);\n`;\n\nconst finalizeNormalNormalMap = `\n if (isSurfaceBitSet(kSurfaceBit_HasNormalMap)) {\n // Modify the normal with the normal map texture.\n // First calculate the tangent.\n vec3 dp1 = dFdx(v_eyeSpace);\n vec3 dp2 = dFdy(v_eyeSpace);\n vec2 duv1 = dFdx(v_texCoord);\n vec2 duv2 = dFdy(v_texCoord);\n vec3 tangent = normalize(duv2.y * dp1 - duv1.y * dp2);\n tangent = normalize (tangent - normal * dot (normal, tangent)); // re-orthogonalize with normal\n bool flip = (duv1.x * duv2.y - duv2.x * duv1.y) < 0.0;\n if (flip)\n tangent = -tangent;\n vec3 biTangent = cross (normal, tangent);\n if (flip)\n biTangent = -biTangent;\n vec3 normM = TEXTURE(s_normalMap, v_texCoord).xyz;\n if (length (normM) > 0.0001) { // check for empty normal texture\n normM = (normM - 0.5) * 2.0;\n normM = normalize (normM);\n normM.x *= abs(u_normalMapScale);\n normM.y *= u_normalMapScale;\n normM = normalize (normM);\n normal = normalize (normM.x * tangent + normM.y * biTangent + normM.z * normal);\n }\n }\n`;\n\nconst finalizeNormalPostlude = `\n return normal;\n`;\n\nfunction getComputeAnimatedNormal(quantized: boolean): string {\n return `\n if (u_animNormalParams.x >= 0.0)\n return normalize(MAT_NORM * computeAnimationNormal(u_animNormalParams.x, u_animNormalParams.y, u_animNormalParams.z));\n\n ${getComputeNormal(quantized)}`;\n}\n\nconst applyBackgroundColor = `\n return u_surfaceFlags[kSurfaceBitIndex_BackgroundFill] ? vec4(u_bgColor.rgb, baseColor.a) : baseColor;\n`;\n\nfunction getComputeTexCoord(quantized: boolean): string {\n const vertData = quantized ? \"g_vertLutData3\" : \"g_vertLutData4\";\n return `\n vec4 rgba = ${vertData};\n vec2 qcoords = vec2(decodeUInt16(rgba.xy), decodeUInt16(rgba.zw));\n return chooseVec2With2BitFlags(vec2(0.0), unquantize2d(qcoords, u_qTexCoordParams), surfaceFlags, kSurfaceBit_HasTexture, kSurfaceBit_HasNormalMap);\n`;\n}\n\nfunction getComputeAnimatedTexCoord(quantized: boolean): string {\n return `\n if (u_animScalarQParams.x >= 0.0)\n return computeAnimationParam(u_animScalarParams.x, u_animScalarParams.y, u_animScalarParams.z, u_animScalarQParams.x, u_animScalarQParams.y);\n\n ${getComputeTexCoord(quantized)}\n`;\n}\n\nconst getSurfaceColor = `\nvec4 getSurfaceColor() { return v_color; }\n`;\n\n// If we have texture weight < 1.0 we must compute the element/material color first then mix with texture color\n// in ApplyMaterialOverrides(). Do the sample once, here, and store in a global variable for possible later use.\n// If a glyph texture, must mix getSurfaceColor() with texture color so texture color alpha is applied 100% and\n// surface color rgb is scaled by texture color rgb (latter is full white originally but stretched via mipmapping).\nconst computeBaseColor = `\n g_surfaceTexel = sampleSurfaceTexture();\n vec4 surfaceColor = getSurfaceColor();\n\n if (!u_applyGlyphTex)\n return surfaceColor;\n\n // Compute color for raster glyph.\n const vec3 white = vec3(1.0);\n const vec3 epsilon = vec3(0.0001);\n const vec3 almostWhite = white - epsilon;\n\n // set to black if almost white and reverse white-on-white is on\n bvec3 isAlmostWhite = greaterThan(surfaceColor.rgb, almostWhite);\n surfaceColor.rgb = (u_reverseWhiteOnWhite && isAlmostWhite.r && isAlmostWhite.g && isAlmostWhite.b ? vec3(0.0, 0.0, 0.0) : surfaceColor.rgb);\n return vec4(surfaceColor.rgb * g_surfaceTexel.rgb, g_surfaceTexel.a);\n`;\n\nconst surfaceFlagArray = new Int32Array(SurfaceBitIndex.Count);\n\n/** @internal */\nexport function addSurfaceFlags(builder: ProgramBuilder, withFeatureOverrides: boolean, withFeatureColor: boolean) {\n addSurfaceFlagsLookup(builder.vert);\n addSurfaceFlagsLookup(builder.frag);\n\n let compute = initSurfaceFlags;\n if (withFeatureOverrides)\n compute += `${withFeatureColor ? computeSurfaceFlagsWithColor : computeSurfaceFlags}\\n`;\n compute += returnSurfaceFlags;\n builder.addFunctionComputedVarying(\"v_surfaceFlags\", VariableType.Float, \"computeSurfaceFlags\", compute);\n\n builder.frag.addInitializer(\"surfaceFlags = uint(floor(v_surfaceFlags + 0.5));\");\n\n builder.addUniformArray(\"u_surfaceFlags\", VariableType.Boolean, SurfaceBitIndex.Count, (prog) => {\n prog.addGraphicUniform(\"u_surfaceFlags\", (uniform, params) => {\n assert(undefined !== params.geometry.asSurface);\n const mesh = params.geometry.asSurface;\n mesh.computeSurfaceFlags(params.programParams, surfaceFlagArray);\n uniform.setUniform1iv(surfaceFlagArray);\n });\n });\n}\n\nfunction addNormal(builder: ProgramBuilder, animated: IsAnimated) {\n addNormalMatrix(builder.vert);\n\n const quantized = \"quantized\" === builder.vert.positionType;\n builder.vert.addFunction(octDecodeNormal);\n builder.vert.addFunction(\"vec3 computeSurfaceNormal()\", getComputeNormal(quantized));\n builder.addFunctionComputedVarying(\"v_n\", VariableType.Vec3, \"computeLightingNormal\", animated ? getComputeAnimatedNormal(quantized) : \"return computeSurfaceNormal();\");\n builder.frag.addGlobal(\"g_normal\", VariableType.Vec3);\n let finalizeNormal = finalizeNormalPrelude;\n\n finalizeNormal += finalizeNormalNormalMap;\n builder.frag.addUniform(\"u_normalMapScale\", VariableType.Float, (prog) => {\n prog.addGraphicUniform(\"u_normalMapScale\", (uniform, params) => {\n let normalMapScale = 1.0;\n if (undefined !== params.geometry.materialInfo && !params.geometry.materialInfo.isAtlas &&\n undefined !== params.geometry.materialInfo.textureMapping &&\n undefined !== params.geometry.materialInfo.textureMapping.normalMapParams) {\n normalMapScale = params.geometry.materialInfo.textureMapping.normalMapParams.scale ?? 1.0;\n if (params.geometry.materialInfo.textureMapping.normalMapParams.greenUp)\n normalMapScale = -normalMapScale;\n }\n uniform.setUniform1f(normalMapScale);\n });\n });\n\n finalizeNormal += finalizeNormalPostlude;\n builder.frag.set(FragmentShaderComponent.FinalizeNormal, finalizeNormal);\n\n // Set to true to colorize surfaces based on normals (in world space).\n // You must also set checkMaxVarying to false in ProgramBuilder.buildProgram to avoid assertions, if using a non-optimized build.\n const debugNormals = false;\n if (debugNormals) {\n builder.frag.set(FragmentShaderComponent.ApplyDebugColor, \"return vec4(vec3(v_normal / 2.0 + 0.5), baseColor.a);\");\n builder.addInlineComputedVarying(\"v_normal\", VariableType.Vec3, \"v_normal = computeSurfaceNormal();\");\n }\n}\n\n/** @internal */\nexport function addTexture(builder: ProgramBuilder, animated: IsAnimated, isThematic: IsThematic, isPointCloud: boolean, isHilite: boolean) {\n if (isThematic) {\n builder.addInlineComputedVarying(\"v_thematicIndex\", VariableType.Float, getComputeThematicIndex(builder.vert.usesInstancedGeometry, isPointCloud, true));\n }\n\n // Point clouds do not need to compute texture coordinates since the only texture they use is the thematic gradient.\n // Surfaces now need texture coordinates even for thematic in case they have a normal map.\n if (!isPointCloud) {\n builder.vert.addFunction(unquantize2d);\n addChooseVec2WithBitFlagsFunction(builder.vert);\n const quantized = \"quantized\" === builder.vert.positionType;\n builder.addFunctionComputedVarying(\"v_texCoord\", VariableType.Vec2, \"computeTexCoord\", animated ? getComputeAnimatedTexCoord(quantized) : getComputeTexCoord(quantized));\n builder.vert.addUniform(\"u_qTexCoordParams\", VariableType.Vec4, (prog) => {\n prog.addGraphicUniform(\"u_qTexCoordParams\", (uniform, params) => {\n const surfGeom = params.geometry.asSurface!;\n if (surfGeom.useTexture(params.programParams) || (surfGeom.useNormalMap(params.programParams) && !isPointCloud)) {\n const uvQParams = surfGeom.lut.uvQParams;\n if (undefined !== uvQParams) {\n uniform.setUniform4fv(uvQParams);\n }\n }\n });\n });\n builder.frag.addFunction(sampleSurfaceTexture);\n }\n\n builder.frag.addUniform(\"s_texture\", VariableType.Sampler2D, (prog) => {\n prog.addGraphicUniform(\"s_texture\", (uniform, params) => {\n const surfGeom = params.geometry.asSurface!;\n if (params.geometry.supportsThematicDisplay && params.target.wantThematicDisplay) { // NB: if thematic display is enabled, bind the thematic texture and ignore any applied surface textures\n params.target.uniforms.thematic.bindTexture(uniform, TextureUnit.SurfaceTexture);\n } else if (surfGeom.useTexture(params.programParams)) {\n const texture = (params.geometry.hasAnimation && params.target.analysisTexture) ? (params.target.analysisTexture as Texture) : surfGeom.texture;\n assert(undefined !== texture);\n texture.texture.bindSampler(uniform, TextureUnit.SurfaceTexture);\n } else {\n System.instance.ensureSamplerBound(uniform, TextureUnit.SurfaceTexture);\n }\n });\n });\n\n if (!isHilite && !isPointCloud) {\n builder.frag.addUniform(\"s_normalMap\", VariableType.Sampler2D, (prog) => {\n prog.addGraphicUniform(\"s_normalMap\", (uniform, params) => {\n const surfGeom = params.geometry.asSurface!;\n if (surfGeom.useNormalMap(params.programParams)) {\n const normalMap = surfGeom.normalMap;\n assert(undefined !== normalMap);\n normalMap.texture.bindSampler(uniform, TextureUnit.NormalMap);\n } else {\n System.instance.ensureSamplerBound(uniform, TextureUnit.NormalMap);\n }\n });\n });\n }\n}\n\nexport const discardClassifiedByAlpha = `\n if (u_no_classifier_discard)\n return false;\n\n bool hasAlpha = alpha <= s_maxAlpha;\n bool isOpaquePass = (kRenderPass_OpaqueLinear <= u_renderPass && kRenderPass_OpaqueGeneral >= u_renderPass);\n bool isTranslucentPass = kRenderPass_Translucent == u_renderPass;\n return (isOpaquePass && hasAlpha) || (isTranslucentPass && !hasAlpha);\n`;\n\nconst discardByTextureAlpha = `\n if (isSurfaceBitSet(kSurfaceBit_HasTexture)) {\n float cutoff = abs(u_alphaCutoff);\n if (kRenderPass_Translucent == u_renderPass)\n return u_alphaCutoff > 0.0 && alpha >= cutoff;\n else\n return alpha < cutoff;\n }\n\n return false;\n`;\n\nfunction addTransparencyDiscard(frag: FragmentShaderBuilder): void {\n addRenderPass(frag);\n frag.addUniform(\"u_alphaCutoff\", VariableType.Float, (prog) => {\n prog.addGraphicUniform(\"u_alphaCutoff\", (uniform, params) => {\n // This cutoff is used to discard pixels based on the alpha value sampled from the surface texture.\n // During readPixels, or when transparency is disabled, only discard 100% opaque pixels.\n // Otherwise, if the geometry draws in both opaque and translucent passes, use DisplayParams.minTransparency to filter pixels into appropriate pass to produce appropriate blending.\n // Negative cutoff applies only during opaque pass; positive cutoff applies during opaque and translucent passes.\n const pass = params.geometry.getPass(params.target);\n const cutoff = (!Pass.rendersOpaqueAndTranslucent(pass) || params.target.isReadPixelsInProgress || !params.target.currentViewFlags.transparency) ? -1 / 255 : 241 / 255;\n uniform.setUniform1f(cutoff);\n });\n });\n\n frag.set(FragmentShaderComponent.DiscardByAlpha, discardByTextureAlpha);\n}\n\n/** @internal */\nexport function createSurfaceBuilder(flags: TechniqueFlags): ProgramBuilder {\n const builder = createCommon(flags.isInstanced, flags.isAnimated, flags.isShadowable, false, flags.positionType);\n addShaderFlags(builder);\n\n const feat = flags.featureMode;\n let opts = FeatureMode.Overrides === feat ? FeatureSymbologyOptions.Surface : FeatureSymbologyOptions.None;\n if (flags.isClassified) {\n opts &= ~FeatureSymbologyOptions.Alpha;\n addColorPlanarClassifier(builder, flags.isTranslucent, flags.isThematic);\n }\n\n if (flags.isThematic)\n addThematicDisplay(builder);\n\n addFeatureSymbology(builder, feat, opts);\n addSurfaceFlags(builder, FeatureMode.Overrides === feat, true);\n addSurfaceDiscard(builder, flags);\n addNormal(builder, flags.isAnimated);\n\n // In HiddenLine mode, we must compute the base color (plus feature overrides etc) in order to get the alpha, then replace with background color (preserving alpha for the transparency threshold test).\n builder.frag.set(FragmentShaderComponent.FinalizeBaseColor, applyBackgroundColor);\n builder.frag.addUniform(\"u_bgColor\", VariableType.Vec3, (prog) => {\n prog.addProgramUniform(\"u_bgColor\", (uniform, params) => {\n params.target.uniforms.style.bindBackgroundRgb(uniform);\n });\n });\n\n addTexture(builder, flags.isAnimated, flags.isThematic, false, false);\n\n builder.frag.addUniform(\"u_applyGlyphTex\", VariableType.Boolean, (prog) => {\n prog.addGraphicUniform(\"u_applyGlyphTex\", (uniform, params) => {\n const surfGeom = params.geometry.asSurface!;\n uniform.setUniform1i(surfGeom.useTexture(params.programParams) && surfGeom.isGlyph ? 1 : 0);\n });\n });\n\n // Fragment and Vertex\n addColor(builder);\n\n // Fragment\n builder.frag.addFunction(getSurfaceColor);\n addLighting(builder);\n addWhiteOnWhiteReversal(builder.frag);\n\n if (flags.isTranslucent) {\n addTranslucency(builder);\n } else {\n if (FeatureMode.None === feat) {\n addFragColorWithPreMultipliedAlpha(builder.frag);\n } else {\n if (!flags.isClassified)\n addOverrideClassifierColor(builder, flags.isThematic);\n else\n addFeaturePlanarClassifier(builder);\n\n builder.frag.addFunction(decodeDepthRgb);\n if (flags.isEdgeTestNeeded || flags.isClassified)\n addPickBufferOutputs(builder.frag);\n else\n addAltPickBufferOutputs(builder.frag);\n }\n }\n\n builder.frag.addGlobal(\"g_surfaceTexel\", VariableType.Vec4);\n builder.frag.set(FragmentShaderComponent.ComputeBaseColor, (flags.isThematic === IsThematic.No) ? computeBaseColor : \"return getSurfaceColor();\");\n\n if (flags.isClassified)\n addClassificationTranslucencyDiscard(builder);\n else\n addTransparencyDiscard(builder.frag);\n\n addSurfaceMonochrome(builder.frag);\n addMaterial(builder, flags.isInstanced === IsInstanced.Yes);\n\n if (flags.isWiremesh)\n addWiremesh(builder);\n\n return builder;\n}\n\nexport function addClassificationTranslucencyDiscard(builder: ProgramBuilder) {\n // For unclassified geometry, we need to render in both the translucent and opaque passes if any feature transparency overrides are applied that would change the default render pass used.\n // Those shaders compute the transparency in the vertex shader and discard the vertex in one pass or the other.\n // For classified geometry, the transparency comes from the classifier geometry (when using Display.ElementColor), so even if there are no feature overrides, we may need to draw in both passes.\n // Since the transparency is not known until the fragment shader, we must perform the discard there instead.\n addMaxAlpha(builder.frag);\n addRenderPass(builder.frag);\n\n // Do not discard transparent classified geometry if we're trying to do a pick...\n builder.frag.addUniform(\"u_no_classifier_discard\", VariableType.Boolean, (prog) => {\n prog.addProgramUniform(\"u_no_classifier_discard\", (uniform, params) => {\n uniform.setUniform1i(params.target.isReadPixelsInProgress ? 1 : 0);\n });\n });\n\n builder.frag.set(FragmentShaderComponent.DiscardByAlpha, discardClassifiedByAlpha);\n}\n"]}
1
+ {"version":3,"file":"Surface.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Surface.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module WebGL\n */\n\nimport { assert } from \"@itwin/core-bentley\";\nimport { AttributeMap } from \"../AttributeMap\";\nimport { Material } from \"../Material\";\nimport { Pass, SurfaceBitIndex, SurfaceFlags, TextureUnit } from \"../RenderFlags\";\nimport {\n FragmentShaderBuilder, FragmentShaderComponent, ProgramBuilder, ShaderBuilder, VariableType, VertexShaderComponent,\n} from \"../ShaderBuilder\";\nimport { System } from \"../System\";\nimport {\n FeatureMode, IsAnimated, IsClassified, IsInstanced, IsShadowable, IsThematic, PositionType, TechniqueFlags,\n} from \"../TechniqueFlags\";\nimport { TechniqueId } from \"../TechniqueId\";\nimport { Texture } from \"../Texture\";\nimport { addAnimation } from \"./Animation\";\nimport { unpackFloat } from \"./Clipping\";\nimport { addColor } from \"./Color\";\nimport { addChooseVec2WithBitFlagsFunction, addChooseVec3WithBitFlagFunction, addExtractNthBit, addFrustum, addShaderFlags } from \"./Common\";\nimport { addUnpackAndNormalize2Bytes, decodeDepthRgb, unquantize2d } from \"./Decode\";\nimport {\n addFeatureSymbology, addMaxAlpha, addRenderOrder, addRenderOrderConstants, addSurfaceDiscard, addSurfaceHiliter, FeatureSymbologyOptions,\n} from \"./FeatureSymbology\";\nimport {\n addAltPickBufferOutputs, addFragColorWithPreMultipliedAlpha, addPickBufferOutputs, addWhiteOnWhiteReversal, assignFragColor,\n} from \"./Fragment\";\nimport { addLighting } from \"./Lighting\";\nimport { addSurfaceMonochrome } from \"./Monochrome\";\nimport { addColorPlanarClassifier, addFeaturePlanarClassifier, addHilitePlanarClassifier, addOverrideClassifierColor } from \"./PlanarClassification\";\nimport { addRenderPass } from \"./RenderPass\";\nimport { addSolarShadowMap } from \"./SolarShadowMapping\";\nimport { addThematicDisplay, getComputeThematicIndex } from \"./Thematic\";\nimport { addTranslucency } from \"./Translucency\";\nimport { addModelViewMatrix, addNormalMatrix, addProjectionMatrix } from \"./Vertex\";\nimport { wantMaterials } from \"../SurfaceGeometry\";\nimport { addWiremesh } from \"./Wiremesh\";\n\n// NB: Textures do not contain pre-multiplied alpha.\nconst sampleSurfaceTexture = `\nvec4 sampleSurfaceTexture() {\n return TEXTURE(s_texture, v_texCoord);\n}\n`;\n\nconst applyMaterialColor = `\n float useMatColor = float(use_material);\n vec3 rgb = mix(baseColor.rgb, mat_rgb.rgb, useMatColor * mat_rgb.a);\n float a = mix(baseColor.a, mat_alpha.x, useMatColor * mat_alpha.y);\n return vec4(rgb, a);\n`;\n\n// if this is a raster glyph, the sampled color has already been modified - do not modify further.\n// Mix diffuse color with texel based on texture weight.\n// Replace with diffuse RGB if RGB overridden.\n// Replace with diffuse alpha if alpha overridden.\n// Multiply texel alpha with diffuse alpha if specified.\nconst applyTextureWeight = `\n bool applyTexture = !u_applyGlyphTex && isSurfaceBitSet(kSurfaceBit_HasTexture);\n float textureWeight = applyTexture ? mat_texture_weight : 0.0;\n vec3 rgb = mix(baseColor.rgb, g_surfaceTexel.rgb, textureWeight);\n rgb = chooseVec3WithBitFlag(rgb, baseColor.rgb, surfaceFlags, kSurfaceBit_OverrideRgb);\n\n float a = applyTexture ? baseColor.a * g_surfaceTexel.a : baseColor.a;\n\n return vec4(rgb, a);\n`;\n\nconst decodeFragMaterialParams = `\nvoid decodeMaterialParams(vec4 params) {\n mat_weights = unpackAndNormalize2Bytes(params.x);\n\n vec2 texAndSpecR = unpackAndNormalize2Bytes(params.y);\n mat_texture_weight = texAndSpecR.x;\n\n vec2 specGB = unpackAndNormalize2Bytes(params.z);\n mat_specular = vec4(texAndSpecR.y, specGB, params.w);\n}\n`;\n\nconst decodeMaterialColor = `\nvoid decodeMaterialColor(vec4 rgba) {\n mat_rgb = vec4(rgba.rgb, float(rgba.r >= 0.0));\n mat_alpha = vec2(rgba.a, float(rgba.a >= 0.0));\n}\n`;\n\n// defaults: (0x6699, 0xffff, 0xffff, 13.5)\nconst computeMaterialParams = `\n const vec4 defaults = vec4(26265.0, 65535.0, 65535.0, 13.5);\n return use_material ? g_materialParams : defaults;\n`;\n\n// The 8-bit material index is stored with the 24-bit feature index, in the high byte.\nconst readMaterialAtlas = `\nvoid readMaterialAtlas() {\n float materialAtlasStart = u_vertParams.z * u_vertParams.w + u_numColors;\n float materialIndex = g_featureAndMaterialIndex.w * 4.0 + materialAtlasStart;\n\n vec2 tc = computeLUTCoords(materialIndex, u_vertParams.xy, g_vert_center, 1.0);\n vec4 rgba = TEXTURE(u_vertLUT, tc);\n\n tc = computeLUTCoords(materialIndex + 1.0, u_vertParams.xy, g_vert_center, 1.0);\n vec4 weightsAndFlags = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5);\n\n tc = computeLUTCoords(materialIndex + 2.0, u_vertParams.xy, g_vert_center, 1.0);\n vec3 specularRgb = floor(TEXTURE(u_vertLUT, tc) * 255.0 + 0.5).rgb;\n\n tc = computeLUTCoords(materialIndex + 3.0, u_vertParams.xy, g_vert_center, 1.0);\n vec4 packedSpecularExponent = TEXTURE(u_vertLUT, tc);\n\n float flags = weightsAndFlags.w;\n mat_rgb = vec4(rgba.rgb, float(flags == 1.0 || flags == 3.0));\n mat_alpha = vec2(rgba.a, float(flags == 2.0 || flags == 3.0));\n\n float specularExponent = unpackFloat(packedSpecularExponent);\n g_materialParams.x = weightsAndFlags.y + weightsAndFlags.z * 256.0;\n g_materialParams.y = 255.0 + specularRgb.r * 256.0;\n g_materialParams.z = specularRgb.g + specularRgb.b * 256.0;\n g_materialParams.w = specularExponent;\n}\n`;\n\nconst computeMaterial = `\n if (u_surfaceFlags[kSurfaceBitIndex_HasMaterialAtlas]) {\n readMaterialAtlas();\n } else {\n decodeMaterialColor(u_materialColor);\n g_materialParams = u_materialParams;\n }\n`;\n\nconst computeMaterialInstanced = `\n decodeMaterialColor(u_materialColor);\n g_materialParams = u_materialParams;\n`;\n\nfunction addMaterial(builder: ProgramBuilder, instanced: boolean): void {\n const frag = builder.frag;\n assert(undefined !== frag.find(\"v_surfaceFlags\"));\n\n frag.addGlobal(\"mat_texture_weight\", VariableType.Float);\n frag.addGlobal(\"mat_weights\", VariableType.Vec2); // diffuse, specular\n frag.addGlobal(\"mat_specular\", VariableType.Vec4); // rgb, exponent\n\n addUnpackAndNormalize2Bytes(frag);\n frag.addFunction(decodeFragMaterialParams);\n frag.addInitializer(\"decodeMaterialParams(v_materialParams);\");\n\n addChooseVec3WithBitFlagFunction(frag);\n frag.set(FragmentShaderComponent.ApplyMaterialOverrides, applyTextureWeight);\n\n const vert = builder.vert;\n vert.addGlobal(\"mat_rgb\", VariableType.Vec4); // a = 0 if not overridden, else 1\n vert.addGlobal(\"mat_alpha\", VariableType.Vec2); // a = 0 if not overridden, else 1\n vert.addGlobal(\"use_material\", VariableType.Boolean);\n vert.addInitializer(\"use_material = (0u == (surfaceFlags & kSurfaceBit_IgnoreMaterial));\");\n\n // Uniform material\n vert.addFunction(decodeMaterialColor);\n vert.addUniform(\"u_materialColor\", VariableType.Vec4, (prog) => {\n prog.addGraphicUniform(\"u_materialColor\", (uniform, params) => {\n const info = wantMaterials(params.target.currentViewFlags) ? params.geometry.materialInfo : undefined;\n const mat = undefined !== info && !info.isAtlas ? info : Material.default;\n uniform.setUniform4fv(mat.rgba);\n });\n });\n\n vert.addUniform(\"u_materialParams\", VariableType.Vec4, (prog) => {\n prog.addGraphicUniform(\"u_materialParams\", (uniform, params) => {\n const info = wantMaterials(params.target.currentViewFlags) ? params.geometry.materialInfo : undefined;\n const mat = undefined !== info && !info.isAtlas ? info : Material.default;\n uniform.setUniform4fv(mat.fragUniforms);\n });\n });\n\n if (!instanced) {\n // Material atlas\n vert.addFunction(unpackFloat);\n vert.addFunction(readMaterialAtlas);\n vert.addUniform(\"u_numColors\", VariableType.Float, (prog) => {\n prog.addGraphicUniform(\"u_numColors\", (uniform, params) => {\n const info = params.geometry.materialInfo;\n const numColors = undefined !== info && info.isAtlas ? info.vertexTableOffset : 0;\n uniform.setUniform1f(numColors);\n });\n });\n }\n vert.addGlobal(\"g_materialParams\", VariableType.Vec4);\n vert.set(VertexShaderComponent.ComputeMaterial, instanced ? computeMaterialInstanced : computeMaterial);\n vert.set(VertexShaderComponent.ApplyMaterialColor, applyMaterialColor);\n builder.addFunctionComputedVarying(\"v_materialParams\", VariableType.Vec4, \"computeMaterialParams\", computeMaterialParams);\n}\n\nconst computePositionPrelude = `\n vec4 pos = MAT_MV * rawPos;\n`;\n\n// We used to use gl.polygonOffset() for blanking regions, but that doesn't work with logarithmic depth buffer which overwrites the\n// computed Z. Instead we must manually offset in vertex shader. We do this even if log depth is not enabled/supported.\n// NOTE: If log depth is *not* supported, then the hilite surface vertex shaders previously would still include this logic, but the\n// fragment shaders would not use v_eyeSpace. Some Ubuntu 20.04 graphics drivers cleverly and correctly optimized out the varying and the uniform,\n// causing an exception when gl.getProgramLocation() failed. So, omit this bit in that case.\nconst adjustEyeSpace = `\n v_eyeSpace = pos.xyz;\n const float blankingRegionOffset = 2.0 / 65536.0;\n if (kRenderOrder_BlankingRegion == u_renderOrder)\n v_eyeSpace.z -= blankingRegionOffset * (u_frustum.y - u_frustum.x);\n`;\n\nconst computePositionPostlude = `\n return u_proj * pos;\n`;\n\nfunction createCommon(isInstanced: IsInstanced, animated: IsAnimated, shadowable: IsShadowable, isHiliter: boolean, positionType: PositionType): ProgramBuilder {\n const instanced = IsInstanced.Yes === isInstanced;\n const attrMap = AttributeMap.findAttributeMap(TechniqueId.Surface, instanced);\n const builder = new ProgramBuilder(attrMap, { positionType, instanced });\n const vert = builder.vert;\n\n if (animated)\n addAnimation(vert, true);\n\n if (shadowable)\n addSolarShadowMap(builder);\n\n addProjectionMatrix(vert);\n addModelViewMatrix(vert);\n\n let computePosition;\n if (isHiliter && !System.instance.supportsLogZBuffer) {\n computePosition = computePositionPrelude + computePositionPostlude;\n } else {\n addFrustum(builder);\n addRenderOrder(builder.vert);\n addRenderOrderConstants(builder.vert);\n builder.addVarying(\"v_eyeSpace\", VariableType.Vec3);\n computePosition = computePositionPrelude + adjustEyeSpace + computePositionPostlude;\n }\n\n vert.set(VertexShaderComponent.ComputePosition, computePosition);\n\n return builder;\n}\n\n/** @internal */\nexport function createSurfaceHiliter(instanced: IsInstanced, classified: IsClassified, posType: PositionType): ProgramBuilder {\n const builder = createCommon(instanced, IsAnimated.No, IsShadowable.No, true, posType);\n\n addSurfaceFlags(builder, true, false);\n addTexture(builder, IsAnimated.No, IsThematic.No, false, true);\n if (classified) {\n addHilitePlanarClassifier(builder);\n builder.vert.addGlobal(\"feature_ignore_material\", VariableType.Boolean, \"false\");\n builder.frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\n } else {\n addSurfaceHiliter(builder);\n }\n\n return builder;\n}\n\nconst isSurfaceBitSet = `\nbool isSurfaceBitSet(uint flag) { return 0u != (surfaceFlags & flag); }\n`;\n\n/** @internal */\nfunction addSurfaceFlagsLookup(builder: ShaderBuilder) {\n builder.addConstant(\"kSurfaceBitIndex_HasTexture\", VariableType.Int, SurfaceBitIndex.HasTexture.toString());\n builder.addConstant(\"kSurfaceBitIndex_ApplyLighting\", VariableType.Int, SurfaceBitIndex.ApplyLighting.toString());\n builder.addConstant(\"kSurfaceBitIndex_HasNormals\", VariableType.Int, SurfaceBitIndex.HasNormals.toString());\n builder.addConstant(\"kSurfaceBitIndex_IgnoreMaterial\", VariableType.Int, SurfaceBitIndex.IgnoreMaterial.toString());\n builder.addConstant(\"kSurfaceBitIndex_TransparencyThreshold\", VariableType.Int, SurfaceBitIndex.TransparencyThreshold.toString());\n builder.addConstant(\"kSurfaceBitIndex_BackgroundFill\", VariableType.Int, SurfaceBitIndex.BackgroundFill.toString());\n builder.addConstant(\"kSurfaceBitIndex_HasColorAndNormal\", VariableType.Int, SurfaceBitIndex.HasColorAndNormal.toString());\n builder.addConstant(\"kSurfaceBitIndex_OverrideRgb\", VariableType.Int, SurfaceBitIndex.OverrideRgb.toString());\n builder.addConstant(\"kSurfaceBitIndex_HasNormalMap\", VariableType.Int, SurfaceBitIndex.HasNormalMap.toString());\n builder.addConstant(\"kSurfaceBitIndex_HasMaterialAtlas\", VariableType.Int, SurfaceBitIndex.HasMaterialAtlas.toString());\n\n // Surface flags which get modified in vertex shader are still passed to fragment shader as a single float & are thus\n // used differently there & so require different constants. Unused constants are commented out.\n builder.addBitFlagConstant(\"kSurfaceBit_HasTexture\", SurfaceBitIndex.HasTexture);\n builder.addBitFlagConstant(\"kSurfaceBit_IgnoreMaterial\", SurfaceBitIndex.IgnoreMaterial);\n builder.addBitFlagConstant(\"kSurfaceBit_OverrideRgb\", SurfaceBitIndex.OverrideRgb);\n builder.addBitFlagConstant(\"kSurfaceBit_HasNormalMap\", SurfaceBitIndex.HasNormalMap);\n\n // Only need masks for flags modified in vertex shader\n const suffix = \"u\";\n const type = VariableType.Uint;\n builder.addConstant(\"kSurfaceMask_HasTexture\", type, SurfaceFlags.HasTexture.toString() + suffix);\n builder.addConstant(\"kSurfaceMask_IgnoreMaterial\", type, SurfaceFlags.IgnoreMaterial.toString() + suffix);\n builder.addConstant(\"kSurfaceMask_OverrideRgb\", type, SurfaceFlags.OverrideRgb.toString() + suffix);\n builder.addConstant(\"kSurfaceMask_HasNormalMap\", type, SurfaceFlags.HasNormalMap.toString() + suffix);\n\n addExtractNthBit(builder);\n builder.addFunction(isSurfaceBitSet);\n builder.addGlobal(\"surfaceFlags\", VariableType.Uint);\n}\n\nconst initSurfaceFlags = `\n surfaceFlags = u_surfaceFlags[kSurfaceBitIndex_HasTexture] ? kSurfaceMask_HasTexture : 0u;\n surfaceFlags += u_surfaceFlags[kSurfaceBitIndex_IgnoreMaterial] ? kSurfaceMask_IgnoreMaterial : 0u;\n surfaceFlags += u_surfaceFlags[kSurfaceBitIndex_OverrideRgb] ? kSurfaceMask_OverrideRgb : 0u;\n surfaceFlags += u_surfaceFlags[kSurfaceBitIndex_HasNormalMap] ? kSurfaceMask_HasNormalMap : 0u;\n`;\n\nconst computeBaseSurfaceFlags = `\n if (feature_ignore_material) {\n if (u_surfaceFlags[kSurfaceBitIndex_HasTexture])\n surfaceFlags -= kSurfaceMask_HasTexture;\n if (u_surfaceFlags[kSurfaceBitIndex_HasNormalMap])\n surfaceFlags -= kSurfaceMask_HasNormalMap;\n\n surfaceFlags += kSurfaceMask_IgnoreMaterial;\n }\n`;\n\n// Textured surfaces (including raster glyphs) always *multiply* the sampled alpha by the alpha override.\nconst computeColorSurfaceFlags = `\n if (feature_rgb.r >= 0.0)\n surfaceFlags += kSurfaceMask_OverrideRgb;\n`;\n\nconst returnSurfaceFlags = \" return float(surfaceFlags);\\n\";\n\nconst computeSurfaceFlags = computeBaseSurfaceFlags;\nconst computeSurfaceFlagsWithColor = computeBaseSurfaceFlags + computeColorSurfaceFlags;\n\n/** @internal */\nexport const octDecodeNormal = `\nvec3 octDecodeNormal(vec2 e) {\n e = e / 255.0 * 2.0 - 1.0;\n vec3 n = vec3(e.x, e.y, 1.0 - abs(e.x) - abs(e.y));\n if (n.z < 0.0) {\n vec2 signNotZero = vec2(n.x >= 0.0 ? 1.0 : -1.0, n.y >= 0.0 ? 1.0 : -1.0);\n n.xy = (1.0 - abs(n.yx)) * signNotZero;\n }\n\n return normalize(n);\n}\n`;\n\nfunction getComputeNormal(quantized: boolean): string {\n const a = quantized ? \"g_vertLutData3.xy\" : \"g_vertLutData4.zw\";\n const b = quantized ? \"g_vertLutData1.zw\" : \"g_vertLutData5.xy\";\n return `\n if (!u_surfaceFlags[kSurfaceBitIndex_HasNormals])\n return vec3(0.0);\n\n vec2 normal = (u_surfaceFlags[kSurfaceBitIndex_HasColorAndNormal]) ? ${a} : ${b};\n return normalize(MAT_NORM * octDecodeNormal(normal));\n`;\n}\n\nconst finalizeNormalPrelude = `\n vec3 normal = normalize(v_n) * (2.0 * float(gl_FrontFacing) - 1.0);\n`;\n\nconst finalizeNormalNormalMap = `\n if (isSurfaceBitSet(kSurfaceBit_HasNormalMap)) {\n // Modify the normal with the normal map texture.\n // First calculate the tangent.\n vec3 dp1 = dFdx(v_eyeSpace);\n vec3 dp2 = dFdy(v_eyeSpace);\n vec2 duv1 = dFdx(v_texCoord);\n vec2 duv2 = dFdy(v_texCoord);\n vec3 tangent = normalize(duv2.y * dp1 - duv1.y * dp2);\n tangent = normalize (tangent - normal * dot (normal, tangent)); // re-orthogonalize with normal\n bool flip = (duv1.x * duv2.y - duv2.x * duv1.y) < 0.0;\n if (flip)\n tangent = -tangent;\n vec3 biTangent = cross (normal, tangent);\n if (flip)\n biTangent = -biTangent;\n vec3 normM = TEXTURE(s_normalMap, v_texCoord).xyz;\n if (length (normM) > 0.0001) { // check for empty normal texture\n normM = (normM - 0.5) * 2.0;\n normM = normalize (normM);\n normM.x *= abs(u_normalMapScale);\n normM.y *= u_normalMapScale;\n normM = normalize (normM);\n normal = normalize (normM.x * tangent + normM.y * biTangent + normM.z * normal);\n }\n }\n`;\n\nconst finalizeNormalPostlude = `\n return normal;\n`;\n\nfunction getComputeAnimatedNormal(quantized: boolean): string {\n return `\n if (u_animNormalParams.x >= 0.0)\n return normalize(MAT_NORM * computeAnimationNormal(u_animNormalParams.x, u_animNormalParams.y, u_animNormalParams.z));\n\n ${getComputeNormal(quantized)}`;\n}\n\nconst applyBackgroundColor = `\n return u_surfaceFlags[kSurfaceBitIndex_BackgroundFill] ? vec4(u_bgColor.rgb, baseColor.a) : baseColor;\n`;\n\nfunction getComputeTexCoord(quantized: boolean): string {\n const vertData = quantized ? \"g_vertLutData3\" : \"g_vertLutData4\";\n return `\n vec4 rgba = ${vertData};\n vec2 qcoords = vec2(decodeUInt16(rgba.xy), decodeUInt16(rgba.zw));\n return chooseVec2With2BitFlags(vec2(0.0), unquantize2d(qcoords, u_qTexCoordParams), surfaceFlags, kSurfaceBit_HasTexture, kSurfaceBit_HasNormalMap);\n`;\n}\n\nfunction getComputeAnimatedTexCoord(quantized: boolean): string {\n return `\n if (u_animScalarQParams.x >= 0.0)\n return computeAnimationParam(u_animScalarParams.x, u_animScalarParams.y, u_animScalarParams.z, u_animScalarQParams.x, u_animScalarQParams.y);\n\n ${getComputeTexCoord(quantized)}\n`;\n}\n\nconst getSurfaceColor = `\nvec4 getSurfaceColor() { return v_color; }\n`;\n\n// If we have texture weight < 1.0 we must compute the element/material color first then mix with texture color\n// in ApplyMaterialOverrides(). Do the sample once, here, and store in a global variable for possible later use.\n// If a glyph texture, must mix getSurfaceColor() with texture color so texture color alpha is applied 100% and\n// surface color rgb is scaled by texture color rgb (latter is full white originally but stretched via mipmapping).\nconst computeBaseColor = `\n g_surfaceTexel = sampleSurfaceTexture();\n vec4 surfaceColor = getSurfaceColor();\n\n if (!u_applyGlyphTex)\n return surfaceColor;\n\n // Compute color for raster glyph.\n const vec3 white = vec3(1.0);\n const vec3 epsilon = vec3(0.0001);\n const vec3 almostWhite = white - epsilon;\n\n // set to black if almost white and reverse white-on-white is on\n bvec3 isAlmostWhite = greaterThan(surfaceColor.rgb, almostWhite);\n surfaceColor.rgb = (u_reverseWhiteOnWhite && isAlmostWhite.r && isAlmostWhite.g && isAlmostWhite.b ? vec3(0.0, 0.0, 0.0) : surfaceColor.rgb);\n return vec4(surfaceColor.rgb * g_surfaceTexel.rgb, g_surfaceTexel.a);\n`;\n\nconst surfaceFlagArray = new Int32Array(SurfaceBitIndex.Count);\n\n/** @internal */\nexport function addSurfaceFlags(builder: ProgramBuilder, withFeatureOverrides: boolean, withFeatureColor: boolean) {\n addSurfaceFlagsLookup(builder.vert);\n addSurfaceFlagsLookup(builder.frag);\n\n let compute = initSurfaceFlags;\n if (withFeatureOverrides)\n compute += `${withFeatureColor ? computeSurfaceFlagsWithColor : computeSurfaceFlags}\\n`;\n compute += returnSurfaceFlags;\n builder.addFunctionComputedVarying(\"v_surfaceFlags\", VariableType.Float, \"computeSurfaceFlags\", compute);\n\n builder.frag.addInitializer(\"surfaceFlags = uint(floor(v_surfaceFlags + 0.5));\");\n\n builder.addUniformArray(\"u_surfaceFlags\", VariableType.Boolean, SurfaceBitIndex.Count, (prog) => {\n prog.addGraphicUniform(\"u_surfaceFlags\", (uniform, params) => {\n assert(undefined !== params.geometry.asSurface);\n const mesh = params.geometry.asSurface;\n mesh.computeSurfaceFlags(params.programParams, surfaceFlagArray);\n uniform.setUniform1iv(surfaceFlagArray);\n });\n });\n}\n\nfunction addNormal(builder: ProgramBuilder, animated: IsAnimated) {\n addNormalMatrix(builder.vert);\n\n const quantized = \"quantized\" === builder.vert.positionType;\n builder.vert.addFunction(octDecodeNormal);\n builder.vert.addFunction(\"vec3 computeSurfaceNormal()\", getComputeNormal(quantized));\n builder.addFunctionComputedVarying(\"v_n\", VariableType.Vec3, \"computeLightingNormal\", animated ? getComputeAnimatedNormal(quantized) : \"return computeSurfaceNormal();\");\n builder.frag.addGlobal(\"g_normal\", VariableType.Vec3);\n let finalizeNormal = finalizeNormalPrelude;\n\n finalizeNormal += finalizeNormalNormalMap;\n builder.frag.addUniform(\"u_normalMapScale\", VariableType.Float, (prog) => {\n prog.addGraphicUniform(\"u_normalMapScale\", (uniform, params) => {\n let normalMapScale = 1.0;\n if (undefined !== params.geometry.materialInfo && !params.geometry.materialInfo.isAtlas &&\n undefined !== params.geometry.materialInfo.textureMapping &&\n undefined !== params.geometry.materialInfo.textureMapping.normalMapParams) {\n normalMapScale = params.geometry.materialInfo.textureMapping.normalMapParams.scale ?? 1.0;\n if (params.geometry.materialInfo.textureMapping.normalMapParams.greenUp)\n normalMapScale = -normalMapScale;\n }\n uniform.setUniform1f(normalMapScale);\n });\n });\n\n finalizeNormal += finalizeNormalPostlude;\n builder.frag.set(FragmentShaderComponent.FinalizeNormal, finalizeNormal);\n\n // Set to true to colorize surfaces based on normals (in world space).\n // You must also set checkMaxVarying to false in ProgramBuilder.buildProgram to avoid assertions, if using a non-optimized build.\n const debugNormals = false;\n if (debugNormals) {\n builder.frag.set(FragmentShaderComponent.ApplyDebugColor, \"return vec4(vec3(v_normal / 2.0 + 0.5), baseColor.a);\");\n builder.addInlineComputedVarying(\"v_normal\", VariableType.Vec3, \"v_normal = computeSurfaceNormal();\");\n }\n}\n\n/** @internal */\nexport function addTexture(builder: ProgramBuilder, animated: IsAnimated, isThematic: IsThematic, isPointCloud: boolean, isHilite: boolean) {\n if (isThematic) {\n builder.addInlineComputedVarying(\"v_thematicIndex\", VariableType.Float, getComputeThematicIndex(builder.vert.usesInstancedGeometry, isPointCloud, true));\n }\n\n // Point clouds do not need to compute texture coordinates since the only texture they use is the thematic gradient.\n // Surfaces now need texture coordinates even for thematic in case they have a normal map.\n if (!isPointCloud) {\n builder.vert.addFunction(unquantize2d);\n addChooseVec2WithBitFlagsFunction(builder.vert);\n const quantized = \"quantized\" === builder.vert.positionType;\n builder.addFunctionComputedVarying(\"v_texCoord\", VariableType.Vec2, \"computeTexCoord\", animated ? getComputeAnimatedTexCoord(quantized) : getComputeTexCoord(quantized));\n builder.vert.addUniform(\"u_qTexCoordParams\", VariableType.Vec4, (prog) => {\n prog.addGraphicUniform(\"u_qTexCoordParams\", (uniform, params) => {\n const surfGeom = params.geometry.asSurface!;\n if (surfGeom.useTexture(params.programParams) || (surfGeom.useNormalMap(params.programParams) && !isPointCloud)) {\n const uvQParams = surfGeom.lut.uvQParams;\n if (undefined !== uvQParams) {\n uniform.setUniform4fv(uvQParams);\n }\n }\n });\n });\n builder.frag.addFunction(sampleSurfaceTexture);\n }\n\n builder.frag.addUniform(\"s_texture\", VariableType.Sampler2D, (prog) => {\n prog.addGraphicUniform(\"s_texture\", (uniform, params) => {\n const surfGeom = params.geometry.asSurface!;\n if (params.geometry.supportsThematicDisplay && params.target.wantThematicDisplay) { // NB: if thematic display is enabled, bind the thematic texture and ignore any applied surface textures\n params.target.uniforms.thematic.bindTexture(uniform, TextureUnit.SurfaceTexture);\n } else if (surfGeom.useTexture(params.programParams)) {\n const texture = (params.geometry.hasAnimation && params.target.analysisTexture) ? (params.target.analysisTexture as Texture) : surfGeom.texture;\n assert(undefined !== texture);\n texture.texture.bindSampler(uniform, TextureUnit.SurfaceTexture);\n } else {\n System.instance.ensureSamplerBound(uniform, TextureUnit.SurfaceTexture);\n }\n });\n });\n\n if (!isHilite && !isPointCloud) {\n builder.frag.addUniform(\"s_normalMap\", VariableType.Sampler2D, (prog) => {\n prog.addGraphicUniform(\"s_normalMap\", (uniform, params) => {\n const surfGeom = params.geometry.asSurface!;\n if (surfGeom.useNormalMap(params.programParams)) {\n const normalMap = surfGeom.normalMap;\n assert(undefined !== normalMap);\n normalMap.texture.bindSampler(uniform, TextureUnit.NormalMap);\n } else {\n System.instance.ensureSamplerBound(uniform, TextureUnit.NormalMap);\n }\n });\n });\n }\n}\n\nexport const discardClassifiedByAlpha = `\n if (u_no_classifier_discard)\n return false;\n\n bool hasAlpha = alpha <= s_maxAlpha;\n bool isOpaquePass = (kRenderPass_OpaqueLinear <= u_renderPass && kRenderPass_OpaqueGeneral >= u_renderPass);\n bool isTranslucentPass = kRenderPass_Translucent == u_renderPass;\n return (isOpaquePass && hasAlpha) || (isTranslucentPass && !hasAlpha);\n`;\n\nconst discardByTextureAlpha = `\n if (isSurfaceBitSet(kSurfaceBit_HasTexture)) {\n float cutoff = abs(u_alphaCutoff);\n if (kRenderPass_Translucent == u_renderPass)\n return u_alphaCutoff > 0.0 && alpha >= cutoff;\n else\n return alpha < cutoff;\n }\n\n return false;\n`;\n\nfunction addTransparencyDiscard(frag: FragmentShaderBuilder): void {\n addRenderPass(frag);\n frag.addUniform(\"u_alphaCutoff\", VariableType.Float, (prog) => {\n prog.addGraphicUniform(\"u_alphaCutoff\", (uniform, params) => {\n // This cutoff is used to discard pixels based on the alpha value sampled from the surface texture.\n // During readPixels, or when transparency is disabled, only discard 100% opaque pixels.\n // Otherwise, if the geometry draws in both opaque and translucent passes, use DisplayParams.minTransparency to filter pixels into appropriate pass to produce appropriate blending.\n // Negative cutoff applies only during opaque pass; positive cutoff applies during opaque and translucent passes.\n const pass = params.geometry.getPass(params.target);\n const cutoff = (!Pass.rendersOpaqueAndTranslucent(pass) || params.target.isReadPixelsInProgress || !params.target.currentViewFlags.transparency) ? -1 / 255 : 241 / 255;\n uniform.setUniform1f(cutoff);\n });\n });\n\n frag.set(FragmentShaderComponent.DiscardByAlpha, discardByTextureAlpha);\n}\n\n/** @internal */\nexport function createSurfaceBuilder(flags: TechniqueFlags): ProgramBuilder {\n const builder = createCommon(flags.isInstanced, flags.isAnimated, flags.isShadowable, false, flags.positionType);\n addShaderFlags(builder);\n\n const feat = flags.featureMode;\n let opts = FeatureMode.Overrides === feat ? FeatureSymbologyOptions.Surface : FeatureSymbologyOptions.None;\n if (flags.isClassified) {\n opts &= ~FeatureSymbologyOptions.Alpha;\n addColorPlanarClassifier(builder, flags.isTranslucent, flags.isThematic);\n }\n\n if (flags.isThematic)\n addThematicDisplay(builder);\n\n addFeatureSymbology(builder, feat, opts);\n addSurfaceFlags(builder, FeatureMode.Overrides === feat, true);\n addSurfaceDiscard(builder, flags);\n addNormal(builder, flags.isAnimated);\n\n // In HiddenLine mode, we must compute the base color (plus feature overrides etc) in order to get the alpha, then replace with background color (preserving alpha for the transparency threshold test).\n builder.frag.set(FragmentShaderComponent.FinalizeBaseColor, applyBackgroundColor);\n builder.frag.addUniform(\"u_bgColor\", VariableType.Vec3, (prog) => {\n prog.addProgramUniform(\"u_bgColor\", (uniform, params) => {\n params.target.uniforms.style.bindBackgroundRgb(uniform);\n });\n });\n\n addTexture(builder, flags.isAnimated, flags.isThematic, false, false);\n\n builder.frag.addUniform(\"u_applyGlyphTex\", VariableType.Boolean, (prog) => {\n prog.addGraphicUniform(\"u_applyGlyphTex\", (uniform, params) => {\n const surfGeom = params.geometry.asSurface!;\n uniform.setUniform1i(surfGeom.useTexture(params.programParams) && surfGeom.isGlyph ? 1 : 0);\n });\n });\n\n // Fragment and Vertex\n addColor(builder);\n\n // Fragment\n builder.frag.addFunction(getSurfaceColor);\n addLighting(builder);\n addWhiteOnWhiteReversal(builder.frag);\n\n if (flags.isTranslucent) {\n addTranslucency(builder);\n } else {\n if (FeatureMode.None === feat) {\n addFragColorWithPreMultipliedAlpha(builder.frag);\n } else {\n if (!flags.isClassified)\n addOverrideClassifierColor(builder, flags.isThematic);\n else\n addFeaturePlanarClassifier(builder);\n\n builder.frag.addFunction(decodeDepthRgb);\n if (flags.isEdgeTestNeeded || flags.isClassified)\n addPickBufferOutputs(builder.frag);\n else\n addAltPickBufferOutputs(builder.frag);\n }\n }\n\n builder.frag.addGlobal(\"g_surfaceTexel\", VariableType.Vec4);\n builder.frag.set(FragmentShaderComponent.ComputeBaseColor, (flags.isThematic === IsThematic.No) ? computeBaseColor : \"return getSurfaceColor();\");\n\n if (flags.isClassified)\n addClassificationTranslucencyDiscard(builder);\n else\n addTransparencyDiscard(builder.frag);\n\n addSurfaceMonochrome(builder.frag);\n addMaterial(builder, flags.isInstanced === IsInstanced.Yes);\n\n if (flags.isWiremesh)\n addWiremesh(builder);\n\n return builder;\n}\n\nexport function addClassificationTranslucencyDiscard(builder: ProgramBuilder) {\n // For unclassified geometry, we need to render in both the translucent and opaque passes if any feature transparency overrides are applied that would change the default render pass used.\n // Those shaders compute the transparency in the vertex shader and discard the vertex in one pass or the other.\n // For classified geometry, the transparency comes from the classifier geometry (when using Display.ElementColor), so even if there are no feature overrides, we may need to draw in both passes.\n // Since the transparency is not known until the fragment shader, we must perform the discard there instead.\n addMaxAlpha(builder.frag);\n addRenderPass(builder.frag);\n\n // Do not discard transparent classified geometry if we're trying to do a pick...\n builder.frag.addUniform(\"u_no_classifier_discard\", VariableType.Boolean, (prog) => {\n prog.addProgramUniform(\"u_no_classifier_discard\", (uniform, params) => {\n uniform.setUniform1i(params.target.isReadPixelsInProgress ? 1 : 0);\n });\n });\n\n builder.frag.set(FragmentShaderComponent.DiscardByAlpha, discardClassifiedByAlpha);\n}\n"]}
@@ -247,8 +247,7 @@ export function addThematicDisplay(builder, isForPointClouds = false, isForTerra
247
247
  if (isForPointClouds || isForTerrainMesh) {
248
248
  builder.frag.addUniform("u_thematicColorMix", 2 /* Float */, (prog) => {
249
249
  prog.addGraphicUniform("u_thematicColorMix", (uniform, params) => {
250
- var _a;
251
- uniform.setUniform1f(((_a = params.target.uniforms.thematic.thematicDisplay) === null || _a === void 0 ? void 0 : _a.gradientSettings.colorMix) || 0.0);
250
+ uniform.setUniform1f(params.target.uniforms.thematic.thematicDisplay?.gradientSettings.colorMix || 0.0);
252
251
  });
253
252
  });
254
253
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Thematic.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Thematic.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module WebGL\n */\n\nimport { ThematicDisplayMode, ThematicGradientMode } from \"@itwin/core-common\";\nimport { FragmentShaderComponent, ProgramBuilder, ShaderBuilder, VariableType } from \"../ShaderBuilder\";\nimport { System } from \"../System\";\nimport { addRenderPass } from \"./RenderPass\";\nimport { addInstancedRtcMatrix, addProjectionMatrix } from \"./Vertex\";\nimport { TextureUnit } from \"../RenderFlags\";\nimport { addEyeSpace } from \"./Common\";\n\nconst getSensorFloat = `\nvec4 getSensor(int index) {\n float x = 0.5;\n float y = (float(index) + 0.5) / float(u_numSensors);\n return TEXTURE(s_sensorSampler, vec2(x, y));\n}\n`;\n\n// Access a gradient texture at the specified index.\n// A stepped gradient texture is arranged with single unique color pixels for each step. The dimension of a stepped gradient texture is stepCount.\n// A smooth gradient texture is arranged with blended color pixels across the entire span of the texture. The dimension of a smooth gradient texture is the system's maximum texture size.\nconst getColor = `\nvec3 getColor(float ndx) {\n if (ndx < 0.0 || ndx > 1.0)\n return u_marginColor;\n\n return TEXTURE(s_texture, vec2(0.0, ndx)).rgb;\n}\n`;\n\n// Access a stepped gradient texture at the specified index taking into account isolines.\n// The texture format is exactly as described above for stepped mode. We just access the gradient differently,\n// specifically to ensure that the texels sampled result in lines of overall singular colors - no stepping into the\n// neighboring bands.\nconst getIsoLineColor = `\nvec3 getIsoLineColor(float ndx, float stepCount) {\n if (ndx < 0.01 || ndx > 0.99)\n return u_marginColor;\n\n ndx += 0.5 / stepCount; // center on step pixels\n return TEXTURE(s_texture, vec2(0.0, ndx)).rgb;\n}\n`;\n\nconst fwidth = `\\nfloat _universal_fwidth(float coord) { return fwidth(coord); }\\n`;\n\nconst slopeAndHillShadeShader = ` else if (kThematicDisplayMode_Slope == u_thematicDisplayMode) {\n float d = dot(g_normal, u_thematicAxis);\n if (d < 0.0)\n d = -d;\n\n // The range of d is now 0 to 1 (90 degrees to 0 degrees).\n // However, the range from 0 to 1 is not linear. Therefore, we use acos() to find the actual angle in radians.\n d = acos(d);\n\n // range of d is currently 1.5708 to 0 radians.\n if (d < u_thematicRange.x || d > u_thematicRange.y)\n d = -1.0; // use marginColor if outside the requested range\n else { // convert d from radians to 0 to 1 using requested range\n d -= u_thematicRange.x;\n d /= (u_thematicRange.y - u_thematicRange.x);\n }\n\n ndx = d;\n } else if (kThematicDisplayMode_HillShade == u_thematicDisplayMode) {\n float d = dot(g_normal, u_thematicSunDirection);\n\n ndx = max(0.0, d);\n }`;\n\n// Access the appropriate gradient texel for a particular index based on display mode and gradient mode.\nconst applyThematicColorPrelude = `\n float ndx = v_thematicIndex;\n\n if (kThematicDisplayMode_InverseDistanceWeightedSensors == u_thematicDisplayMode) {\n float sensorSum = 0.0;\n float contributionSum = 0.0;\n\n vec3 sensorPos;\n float sensorValue;\n float sensorWeight;\n\n ndx = -1.0; // default index = marginColor\n\n float distanceCutoff = u_thematicSettings.y;\n\n for (int i = 0; i < 8192; i++) { // ###TODO: set maximum number of sensors during an incremental form of shader construction\n if (i >= u_numSensors)\n break;\n\n vec4 sensor = getSensor(i);\n\n float dist = distance(v_eyeSpace, sensor.xyz);\n\n bool skipThisSensor = (distanceCutoff > 0.0 && dist > distanceCutoff);\n if (!skipThisSensor) {\n float contribution = 1.0 / pow(dist, 2.0);\n sensorSum += sensor.w * contribution;\n contributionSum += contribution;\n }\n }\n\n if (contributionSum > 0.0) // avoid division by zero\n ndx = sensorSum / contributionSum;\n }`;\n\nconst applyThematicColorPostlude = `\n float gradientMode = u_thematicSettings.x;\n float stepCount = u_thematicSettings.z;\n\n vec4 rgba = vec4((kThematicGradientMode_IsoLines == gradientMode) ? getIsoLineColor(ndx, stepCount) : getColor(ndx), baseColor.a);\n rgba = mix(rgba, baseColor, u_thematicColorMix);\n\n if (kThematicGradientMode_IsoLines == gradientMode) {\n float coord = v_thematicIndex * stepCount;\n float line = abs(fract(coord - 0.5) - 0.5) / _universal_fwidth(coord);\n rgba.a = 1.0 - min(line, 1.0);\n if (u_discardBetweenIsolines && 0.0 == rgba.a)\n discard;\n } else if (kThematicGradientMode_SteppedWithDelimiter == gradientMode) {\n float coord = v_thematicIndex * stepCount;\n float line = abs(fract(coord - 0.5) - 0.5) / _universal_fwidth(coord);\n float value = min(line, 1.0);\n rgba.rgb *= value;\n }\n\n return rgba;\n`;\n\n// fwidth does not function for point clouds, so we work around the limitation with a less-than-ideal rendering of isolines and delimiters\n// using a tolerance not based on neighboring fragments.\nconst delimiterToleranceForPointClouds = `0.025`; // / (stepCount * 40.0)`;\nconst applyThematicColorPostludeForPointClouds = `\n float gradientMode = u_thematicSettings.x;\n float stepCount = u_thematicSettings.z;\n\n vec4 rgba = vec4((kThematicGradientMode_IsoLines == gradientMode) ? getIsoLineColor(ndx, stepCount) : getColor(ndx), baseColor.a);\n rgba = mix(rgba, baseColor, u_thematicColorMix);\n\n if (kThematicGradientMode_IsoLines == gradientMode) {\n float coord = v_thematicIndex * stepCount;\n float line = abs(fract(coord - 0.5) - 0.5);\n if (line > ${delimiterToleranceForPointClouds})\n discard;\n } else if (kThematicGradientMode_SteppedWithDelimiter == gradientMode) {\n float coord = v_thematicIndex * stepCount;\n float line = abs(fract(coord - 0.5) - 0.5);\n float value = min(line, 1.0);\n if (line < ${delimiterToleranceForPointClouds} && value < 1.0)\n rgba.rgb *= 0.0;\n }\n\n return rgba;\n`;\n\nfunction _getShader(isPointCloud: boolean) {\n return isPointCloud ?\n applyThematicColorPrelude + applyThematicColorPostludeForPointClouds : // do not include slope and hillshade for point clouds\n applyThematicColorPrelude + slopeAndHillShadeShader + applyThematicColorPostlude; // include all modes for everything else\n}\n\n// Compute the value for the varying to be interpolated to the fragment shader in order to access the color in the thematic gradient texture\n// We will project a vector onto another vector using this equation: proju = (v . u) / (v . v) * v\nexport function getComputeThematicIndex(instanced: boolean, skipSlopeAndHillShade: boolean, decodeNormal: boolean): string {\n const modelPos = instanced ? \"(g_instancedRtcMatrix * rawPosition)\" : \"rawPosition\";\n const heightMode = `\n if (kThematicDisplayMode_Height == u_thematicDisplayMode) {\n vec3 u = (u_modelToWorld * ${modelPos}).xyz;\n vec3 v = u_thematicAxis;\n vec3 proju = (dot(v, u) / dot(v, v)) * v;\n vec3 a = v * u_thematicRange.s;\n vec3 b = v * u_thematicRange.t;\n vec3 c = proju;\n v_thematicIndex = findFractionalPositionOnLine(a, b, c);\n }`;\n const hillShadeMode = ` else if (kThematicDisplayMode_HillShade == u_thematicDisplayMode) {\n v_thematicIndex = computeSurfaceNormal().z;\n }`;\n const hillShadeMode2 = ` else if (kThematicDisplayMode_HillShade == u_thematicDisplayMode) {\n v_thematicIndex = g_hillshadeIndex;\n }`;\n return skipSlopeAndHillShade ? heightMode : heightMode + (decodeNormal ? hillShadeMode : hillShadeMode2);\n}\n\n// Determine the fractional position of c on line segment ab. Assumes the three points are aligned on the same axis.\nconst findFractionalPositionOnLine = `\n float abDist = distance(a, b);\n return dot(b - a, c - a) / (abDist * abDist);\n`;\n\nfunction addThematicDisplayModeConstants(builder: ShaderBuilder) {\n builder.addDefine(\"kThematicDisplayMode_Height\", ThematicDisplayMode.Height.toFixed(1));\n builder.addDefine(\"kThematicDisplayMode_InverseDistanceWeightedSensors\", ThematicDisplayMode.InverseDistanceWeightedSensors.toFixed(1));\n builder.addDefine(\"kThematicDisplayMode_Slope\", ThematicDisplayMode.Slope.toFixed(1));\n builder.addDefine(\"kThematicDisplayMode_HillShade\", ThematicDisplayMode.HillShade.toFixed(1));\n}\n\nfunction addThematicGradientModeConstants(builder: ShaderBuilder) {\n builder.addDefine(\"kThematicGradientMode_Smooth\", ThematicGradientMode.Smooth.toFixed(1));\n builder.addDefine(\"kThematicGradientMode_Stepped\", ThematicGradientMode.Stepped.toFixed(1));\n builder.addDefine(\"kThematicGradientMode_SteppedWithDelimiter\", ThematicGradientMode.SteppedWithDelimiter.toFixed(1));\n builder.addDefine(\"kThematicGradientMode_IsoLines\", ThematicGradientMode.IsoLines.toFixed(1));\n}\n\n/** @internal */\nexport function addThematicDisplay(builder: ProgramBuilder, isForPointClouds = false, isForTerrainMesh = false) {\n const frag = builder.frag;\n const vert = builder.vert;\n\n addRenderPass(builder.frag);\n\n if (!isForPointClouds && !isForTerrainMesh)\n addProjectionMatrix(vert);\n\n addEyeSpace(builder);\n\n if (vert.usesInstancedGeometry)\n addInstancedRtcMatrix(vert);\n\n vert.addFunction(\"float findFractionalPositionOnLine(vec3 a, vec3 b, vec3 c)\", findFractionalPositionOnLine);\n\n vert.addUniform(\"u_modelToWorld\", VariableType.Mat4, (prog) => {\n prog.addGraphicUniform(\"u_modelToWorld\", (uniform, params) => {\n params.target.uniforms.branch.bindModelToWorldTransform(uniform, params.geometry, false);\n });\n });\n\n builder.addUniform(\"u_thematicRange\", VariableType.Vec2, (prog) => {\n prog.addGraphicUniform(\"u_thematicRange\", (uniform, params) => {\n params.target.uniforms.thematic.bindRange(uniform);\n });\n });\n\n builder.addUniform(\"u_thematicAxis\", VariableType.Vec3, (prog) => {\n prog.addGraphicUniform(\"u_thematicAxis\", (uniform, params) => {\n params.target.uniforms.thematic.bindAxis(uniform);\n });\n });\n\n if (!isForPointClouds) {\n builder.addUniform(\"u_thematicSunDirection\", VariableType.Vec3, (prog) => {\n prog.addGraphicUniform(\"u_thematicSunDirection\", (uniform, params) => {\n params.target.uniforms.thematic.bindSunDirection(uniform);\n });\n });\n }\n\n addThematicGradientModeConstants(builder.frag);\n\n addThematicDisplayModeConstants(builder.frag);\n addThematicDisplayModeConstants(builder.vert);\n\n builder.addUniform(\"u_thematicDisplayMode\", VariableType.Float, (prog) => {\n prog.addGraphicUniform(\"u_thematicDisplayMode\", (uniform, params) => {\n params.target.uniforms.thematic.bindDisplayMode(uniform);\n });\n });\n\n frag.addUniform(\"u_marginColor\", VariableType.Vec3, (prog) => {\n prog.addGraphicUniform(\"u_marginColor\", (uniform, params) => {\n params.target.uniforms.thematic.bindMarginColor(uniform);\n });\n });\n\n // gradientMode, distanceCutoff, stepCount\n builder.addUniform(\"u_thematicSettings\", VariableType.Vec3, (prog) => {\n prog.addGraphicUniform(\"u_thematicSettings\", (uniform, params) => {\n params.target.uniforms.thematic.bindFragSettings(uniform);\n });\n });\n\n if (isForPointClouds || isForTerrainMesh) {\n builder.frag.addUniform(\"u_thematicColorMix\", VariableType.Float, (prog) => {\n prog.addGraphicUniform(\"u_thematicColorMix\", (uniform, params) => {\n uniform.setUniform1f(params.target.uniforms.thematic.thematicDisplay?.gradientSettings.colorMix || 0.0);\n });\n });\n } else {\n builder.frag.addUniform(\"u_thematicColorMix\", VariableType.Float, (prog) => {\n prog.addGraphicUniform(\"u_thematicColorMix\", (uniform, _params) => {\n uniform.setUniform1f(0.0);\n });\n });\n }\n\n frag.addUniform(\"u_numSensors\", VariableType.Int, (prog) => {\n prog.addGraphicUniform(\"u_numSensors\", (uniform, params) => {\n if (params.target.wantThematicSensors) {\n if (params.target.uniforms.thematic.wantGlobalSensorTexture)\n params.target.uniforms.thematic.bindNumSensors(uniform);\n else // we are batching separate sensor textures per-tile; use the number of sensors from the batch\n params.target.uniforms.batch.bindNumThematicSensors(uniform);\n } else {\n uniform.setUniform1i(0);\n }\n });\n });\n\n frag.addUniform(\"s_sensorSampler\", VariableType.Sampler2D, (prog) => {\n prog.addGraphicUniform(\"s_sensorSampler\", (uniform, params) => {\n if (params.target.wantThematicSensors) {\n if (params.target.uniforms.thematic.wantGlobalSensorTexture) {\n params.target.uniforms.thematic.bindSensors(uniform);\n } else { // we are batching separate sensor textures per-tile; bind the batch's sensor texture\n params.target.uniforms.batch.bindThematicSensors(uniform);\n }\n } else {\n System.instance.ensureSamplerBound(uniform, TextureUnit.ThematicSensors);\n }\n });\n });\n\n if (!isForPointClouds) { // allows us to know when to discard between isolines to make them pickable\n builder.frag.addUniform(\"u_discardBetweenIsolines\", VariableType.Boolean, (prog) => {\n prog.addProgramUniform(\"u_discardBetweenIsolines\", (uniform, params) => {\n uniform.setUniform1i(params.target.isReadPixelsInProgress ? 1 : 0);\n });\n });\n }\n\n frag.addFunction(fwidth);\n frag.addFunction(getSensorFloat);\n\n frag.addFunction(getColor);\n frag.addFunction(getIsoLineColor);\n\n frag.set(FragmentShaderComponent.ApplyThematicDisplay, _getShader(isForPointClouds));\n}\n"]}
1
+ {"version":3,"file":"Thematic.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Thematic.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module WebGL\n */\n\nimport { ThematicDisplayMode, ThematicGradientMode } from \"@itwin/core-common\";\nimport { FragmentShaderComponent, ProgramBuilder, ShaderBuilder, VariableType } from \"../ShaderBuilder\";\nimport { System } from \"../System\";\nimport { addRenderPass } from \"./RenderPass\";\nimport { addInstancedRtcMatrix, addProjectionMatrix } from \"./Vertex\";\nimport { TextureUnit } from \"../RenderFlags\";\nimport { addEyeSpace } from \"./Common\";\n\nconst getSensorFloat = `\nvec4 getSensor(int index) {\n float x = 0.5;\n float y = (float(index) + 0.5) / float(u_numSensors);\n return TEXTURE(s_sensorSampler, vec2(x, y));\n}\n`;\n\n// Access a gradient texture at the specified index.\n// A stepped gradient texture is arranged with single unique color pixels for each step. The dimension of a stepped gradient texture is stepCount.\n// A smooth gradient texture is arranged with blended color pixels across the entire span of the texture. The dimension of a smooth gradient texture is the system's maximum texture size.\nconst getColor = `\nvec3 getColor(float ndx) {\n if (ndx < 0.0 || ndx > 1.0)\n return u_marginColor;\n\n return TEXTURE(s_texture, vec2(0.0, ndx)).rgb;\n}\n`;\n\n// Access a stepped gradient texture at the specified index taking into account isolines.\n// The texture format is exactly as described above for stepped mode. We just access the gradient differently,\n// specifically to ensure that the texels sampled result in lines of overall singular colors - no stepping into the\n// neighboring bands.\nconst getIsoLineColor = `\nvec3 getIsoLineColor(float ndx, float stepCount) {\n if (ndx < 0.01 || ndx > 0.99)\n return u_marginColor;\n\n ndx += 0.5 / stepCount; // center on step pixels\n return TEXTURE(s_texture, vec2(0.0, ndx)).rgb;\n}\n`;\n\nconst fwidth = `\\nfloat _universal_fwidth(float coord) { return fwidth(coord); }\\n`;\n\nconst slopeAndHillShadeShader = ` else if (kThematicDisplayMode_Slope == u_thematicDisplayMode) {\n float d = dot(g_normal, u_thematicAxis);\n if (d < 0.0)\n d = -d;\n\n // The range of d is now 0 to 1 (90 degrees to 0 degrees).\n // However, the range from 0 to 1 is not linear. Therefore, we use acos() to find the actual angle in radians.\n d = acos(d);\n\n // range of d is currently 1.5708 to 0 radians.\n if (d < u_thematicRange.x || d > u_thematicRange.y)\n d = -1.0; // use marginColor if outside the requested range\n else { // convert d from radians to 0 to 1 using requested range\n d -= u_thematicRange.x;\n d /= (u_thematicRange.y - u_thematicRange.x);\n }\n\n ndx = d;\n } else if (kThematicDisplayMode_HillShade == u_thematicDisplayMode) {\n float d = dot(g_normal, u_thematicSunDirection);\n\n ndx = max(0.0, d);\n }`;\n\n// Access the appropriate gradient texel for a particular index based on display mode and gradient mode.\nconst applyThematicColorPrelude = `\n float ndx = v_thematicIndex;\n\n if (kThematicDisplayMode_InverseDistanceWeightedSensors == u_thematicDisplayMode) {\n float sensorSum = 0.0;\n float contributionSum = 0.0;\n\n vec3 sensorPos;\n float sensorValue;\n float sensorWeight;\n\n ndx = -1.0; // default index = marginColor\n\n float distanceCutoff = u_thematicSettings.y;\n\n for (int i = 0; i < 8192; i++) { // ###TODO: set maximum number of sensors during an incremental form of shader construction\n if (i >= u_numSensors)\n break;\n\n vec4 sensor = getSensor(i);\n\n float dist = distance(v_eyeSpace, sensor.xyz);\n\n bool skipThisSensor = (distanceCutoff > 0.0 && dist > distanceCutoff);\n if (!skipThisSensor) {\n float contribution = 1.0 / pow(dist, 2.0);\n sensorSum += sensor.w * contribution;\n contributionSum += contribution;\n }\n }\n\n if (contributionSum > 0.0) // avoid division by zero\n ndx = sensorSum / contributionSum;\n }`;\n\nconst applyThematicColorPostlude = `\n float gradientMode = u_thematicSettings.x;\n float stepCount = u_thematicSettings.z;\n\n vec4 rgba = vec4((kThematicGradientMode_IsoLines == gradientMode) ? getIsoLineColor(ndx, stepCount) : getColor(ndx), baseColor.a);\n rgba = mix(rgba, baseColor, u_thematicColorMix);\n\n if (kThematicGradientMode_IsoLines == gradientMode) {\n float coord = v_thematicIndex * stepCount;\n float line = abs(fract(coord - 0.5) - 0.5) / _universal_fwidth(coord);\n rgba.a = 1.0 - min(line, 1.0);\n if (u_discardBetweenIsolines && 0.0 == rgba.a)\n discard;\n } else if (kThematicGradientMode_SteppedWithDelimiter == gradientMode) {\n float coord = v_thematicIndex * stepCount;\n float line = abs(fract(coord - 0.5) - 0.5) / _universal_fwidth(coord);\n float value = min(line, 1.0);\n rgba.rgb *= value;\n }\n\n return rgba;\n`;\n\n// fwidth does not function for point clouds, so we work around the limitation with a less-than-ideal rendering of isolines and delimiters\n// using a tolerance not based on neighboring fragments.\nconst delimiterToleranceForPointClouds = `0.025`; // / (stepCount * 40.0)`;\nconst applyThematicColorPostludeForPointClouds = `\n float gradientMode = u_thematicSettings.x;\n float stepCount = u_thematicSettings.z;\n\n vec4 rgba = vec4((kThematicGradientMode_IsoLines == gradientMode) ? getIsoLineColor(ndx, stepCount) : getColor(ndx), baseColor.a);\n rgba = mix(rgba, baseColor, u_thematicColorMix);\n\n if (kThematicGradientMode_IsoLines == gradientMode) {\n float coord = v_thematicIndex * stepCount;\n float line = abs(fract(coord - 0.5) - 0.5);\n if (line > ${delimiterToleranceForPointClouds})\n discard;\n } else if (kThematicGradientMode_SteppedWithDelimiter == gradientMode) {\n float coord = v_thematicIndex * stepCount;\n float line = abs(fract(coord - 0.5) - 0.5);\n float value = min(line, 1.0);\n if (line < ${delimiterToleranceForPointClouds} && value < 1.0)\n rgba.rgb *= 0.0;\n }\n\n return rgba;\n`;\n\nfunction _getShader(isPointCloud: boolean) {\n return isPointCloud ?\n applyThematicColorPrelude + applyThematicColorPostludeForPointClouds : // do not include slope and hillshade for point clouds\n applyThematicColorPrelude + slopeAndHillShadeShader + applyThematicColorPostlude; // include all modes for everything else\n}\n\n// Compute the value for the varying to be interpolated to the fragment shader in order to access the color in the thematic gradient texture\n// We will project a vector onto another vector using this equation: proju = (v . u) / (v . v) * v\nexport function getComputeThematicIndex(instanced: boolean, skipSlopeAndHillShade: boolean, decodeNormal: boolean): string {\n const modelPos = instanced ? \"(g_instancedRtcMatrix * rawPosition)\" : \"rawPosition\";\n const heightMode = `\n if (kThematicDisplayMode_Height == u_thematicDisplayMode) {\n vec3 u = (u_modelToWorld * ${modelPos}).xyz;\n vec3 v = u_thematicAxis;\n vec3 proju = (dot(v, u) / dot(v, v)) * v;\n vec3 a = v * u_thematicRange.s;\n vec3 b = v * u_thematicRange.t;\n vec3 c = proju;\n v_thematicIndex = findFractionalPositionOnLine(a, b, c);\n }`;\n const hillShadeMode = ` else if (kThematicDisplayMode_HillShade == u_thematicDisplayMode) {\n v_thematicIndex = computeSurfaceNormal().z;\n }`;\n const hillShadeMode2 = ` else if (kThematicDisplayMode_HillShade == u_thematicDisplayMode) {\n v_thematicIndex = g_hillshadeIndex;\n }`;\n return skipSlopeAndHillShade ? heightMode : heightMode + (decodeNormal ? hillShadeMode : hillShadeMode2);\n}\n\n// Determine the fractional position of c on line segment ab. Assumes the three points are aligned on the same axis.\nconst findFractionalPositionOnLine = `\n float abDist = distance(a, b);\n return dot(b - a, c - a) / (abDist * abDist);\n`;\n\nfunction addThematicDisplayModeConstants(builder: ShaderBuilder) {\n builder.addDefine(\"kThematicDisplayMode_Height\", ThematicDisplayMode.Height.toFixed(1));\n builder.addDefine(\"kThematicDisplayMode_InverseDistanceWeightedSensors\", ThematicDisplayMode.InverseDistanceWeightedSensors.toFixed(1));\n builder.addDefine(\"kThematicDisplayMode_Slope\", ThematicDisplayMode.Slope.toFixed(1));\n builder.addDefine(\"kThematicDisplayMode_HillShade\", ThematicDisplayMode.HillShade.toFixed(1));\n}\n\nfunction addThematicGradientModeConstants(builder: ShaderBuilder) {\n builder.addDefine(\"kThematicGradientMode_Smooth\", ThematicGradientMode.Smooth.toFixed(1));\n builder.addDefine(\"kThematicGradientMode_Stepped\", ThematicGradientMode.Stepped.toFixed(1));\n builder.addDefine(\"kThematicGradientMode_SteppedWithDelimiter\", ThematicGradientMode.SteppedWithDelimiter.toFixed(1));\n builder.addDefine(\"kThematicGradientMode_IsoLines\", ThematicGradientMode.IsoLines.toFixed(1));\n}\n\n/** @internal */\nexport function addThematicDisplay(builder: ProgramBuilder, isForPointClouds = false, isForTerrainMesh = false) {\n const frag = builder.frag;\n const vert = builder.vert;\n\n addRenderPass(builder.frag);\n\n if (!isForPointClouds && !isForTerrainMesh)\n addProjectionMatrix(vert);\n\n addEyeSpace(builder);\n\n if (vert.usesInstancedGeometry)\n addInstancedRtcMatrix(vert);\n\n vert.addFunction(\"float findFractionalPositionOnLine(vec3 a, vec3 b, vec3 c)\", findFractionalPositionOnLine);\n\n vert.addUniform(\"u_modelToWorld\", VariableType.Mat4, (prog) => {\n prog.addGraphicUniform(\"u_modelToWorld\", (uniform, params) => {\n params.target.uniforms.branch.bindModelToWorldTransform(uniform, params.geometry, false);\n });\n });\n\n builder.addUniform(\"u_thematicRange\", VariableType.Vec2, (prog) => {\n prog.addGraphicUniform(\"u_thematicRange\", (uniform, params) => {\n params.target.uniforms.thematic.bindRange(uniform);\n });\n });\n\n builder.addUniform(\"u_thematicAxis\", VariableType.Vec3, (prog) => {\n prog.addGraphicUniform(\"u_thematicAxis\", (uniform, params) => {\n params.target.uniforms.thematic.bindAxis(uniform);\n });\n });\n\n if (!isForPointClouds) {\n builder.addUniform(\"u_thematicSunDirection\", VariableType.Vec3, (prog) => {\n prog.addGraphicUniform(\"u_thematicSunDirection\", (uniform, params) => {\n params.target.uniforms.thematic.bindSunDirection(uniform);\n });\n });\n }\n\n addThematicGradientModeConstants(builder.frag);\n\n addThematicDisplayModeConstants(builder.frag);\n addThematicDisplayModeConstants(builder.vert);\n\n builder.addUniform(\"u_thematicDisplayMode\", VariableType.Float, (prog) => {\n prog.addGraphicUniform(\"u_thematicDisplayMode\", (uniform, params) => {\n params.target.uniforms.thematic.bindDisplayMode(uniform);\n });\n });\n\n frag.addUniform(\"u_marginColor\", VariableType.Vec3, (prog) => {\n prog.addGraphicUniform(\"u_marginColor\", (uniform, params) => {\n params.target.uniforms.thematic.bindMarginColor(uniform);\n });\n });\n\n // gradientMode, distanceCutoff, stepCount\n builder.addUniform(\"u_thematicSettings\", VariableType.Vec3, (prog) => {\n prog.addGraphicUniform(\"u_thematicSettings\", (uniform, params) => {\n params.target.uniforms.thematic.bindFragSettings(uniform);\n });\n });\n\n if (isForPointClouds || isForTerrainMesh) {\n builder.frag.addUniform(\"u_thematicColorMix\", VariableType.Float, (prog) => {\n prog.addGraphicUniform(\"u_thematicColorMix\", (uniform, params) => {\n uniform.setUniform1f(params.target.uniforms.thematic.thematicDisplay?.gradientSettings.colorMix || 0.0);\n });\n });\n } else {\n builder.frag.addUniform(\"u_thematicColorMix\", VariableType.Float, (prog) => {\n prog.addGraphicUniform(\"u_thematicColorMix\", (uniform, _params) => {\n uniform.setUniform1f(0.0);\n });\n });\n }\n\n frag.addUniform(\"u_numSensors\", VariableType.Int, (prog) => {\n prog.addGraphicUniform(\"u_numSensors\", (uniform, params) => {\n if (params.target.wantThematicSensors) {\n if (params.target.uniforms.thematic.wantGlobalSensorTexture)\n params.target.uniforms.thematic.bindNumSensors(uniform);\n else // we are batching separate sensor textures per-tile; use the number of sensors from the batch\n params.target.uniforms.batch.bindNumThematicSensors(uniform);\n } else {\n uniform.setUniform1i(0);\n }\n });\n });\n\n frag.addUniform(\"s_sensorSampler\", VariableType.Sampler2D, (prog) => {\n prog.addGraphicUniform(\"s_sensorSampler\", (uniform, params) => {\n if (params.target.wantThematicSensors) {\n if (params.target.uniforms.thematic.wantGlobalSensorTexture) {\n params.target.uniforms.thematic.bindSensors(uniform);\n } else { // we are batching separate sensor textures per-tile; bind the batch's sensor texture\n params.target.uniforms.batch.bindThematicSensors(uniform);\n }\n } else {\n System.instance.ensureSamplerBound(uniform, TextureUnit.ThematicSensors);\n }\n });\n });\n\n if (!isForPointClouds) { // allows us to know when to discard between isolines to make them pickable\n builder.frag.addUniform(\"u_discardBetweenIsolines\", VariableType.Boolean, (prog) => {\n prog.addProgramUniform(\"u_discardBetweenIsolines\", (uniform, params) => {\n uniform.setUniform1i(params.target.isReadPixelsInProgress ? 1 : 0);\n });\n });\n }\n\n frag.addFunction(fwidth);\n frag.addFunction(getSensorFloat);\n\n frag.addFunction(getColor);\n frag.addFunction(getIsoLineColor);\n\n frag.set(FragmentShaderComponent.ApplyThematicDisplay, _getShader(isForPointClouds));\n}\n"]}
@@ -136,13 +136,13 @@ function createClassifierId(classifier, source) {
136
136
  if (undefined === classifier)
137
137
  return { modelId: Id64.invalid, type: BatchType.PlanarClassifier, expansion: 0, animationId: undefined };
138
138
  const type = classifier.flags.isVolumeClassifier ? BatchType.VolumeClassifier : BatchType.PlanarClassifier;
139
- const scriptInfo = IModelApp.tileAdmin.getScriptInfoForTreeId(classifier.modelId, source === null || source === void 0 ? void 0 : source.scheduleScriptReference); // eslint-disable-line deprecation/deprecation
139
+ const scriptInfo = IModelApp.tileAdmin.getScriptInfoForTreeId(classifier.modelId, source?.scheduleScriptReference); // eslint-disable-line deprecation/deprecation
140
140
  return {
141
141
  modelId: classifier.modelId,
142
142
  type,
143
143
  expansion: classifier.expand,
144
- animationId: scriptInfo === null || scriptInfo === void 0 ? void 0 : scriptInfo.animationId,
145
- timeline: scriptInfo === null || scriptInfo === void 0 ? void 0 : scriptInfo.timeline,
144
+ animationId: scriptInfo?.animationId,
145
+ timeline: scriptInfo?.timeline,
146
146
  };
147
147
  }
148
148
  //# sourceMappingURL=ClassifierTileTree.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClassifierTileTree.js","sourceRoot":"","sources":["../../../src/tile/ClassifierTileTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Tiles\n */\nimport { comparePossiblyUndefined, compareStrings, compareStringsOrUndefined, Id64, Id64String } from \"@itwin/core-bentley\";\nimport {\n BatchType, ClassifierTileTreeId, iModelTileTreeIdToString, RenderMode, RenderSchedule, SpatialClassifier, SpatialClassifiers, ViewFlagsProperties,\n} from \"@itwin/core-common\";\nimport { DisplayStyleState } from \"../DisplayStyleState\";\nimport { IModelApp } from \"../IModelApp\";\nimport { IModelConnection } from \"../IModelConnection\";\nimport { GeometricModelState } from \"../ModelState\";\nimport { SceneContext } from \"../ViewContext\";\nimport { ViewState } from \"../ViewState\";\nimport {\n DisclosedTileTreeSet, IModelTileTree, iModelTileTreeParamsFromJSON, TileTree, TileTreeLoadStatus, TileTreeOwner, TileTreeReference, TileTreeSupplier,\n} from \"./internal\";\n\ninterface ClassifierTreeId extends ClassifierTileTreeId {\n modelId: Id64String;\n timeline?: RenderSchedule.ModelTimeline;\n}\n\nfunction compareIds(lhs: ClassifierTreeId, rhs: ClassifierTreeId): number {\n return compareStrings(lhs.modelId, rhs.modelId) || compareStringsOrUndefined(lhs.animationId, rhs.animationId)\n || comparePossiblyUndefined((x, y) => x.compareTo(y), lhs.timeline, rhs.timeline);\n}\n\nclass ClassifierTreeSupplier implements TileTreeSupplier {\n private readonly _nonexistentTreeOwner = {\n tileTree: undefined,\n loadStatus: TileTreeLoadStatus.NotFound,\n load: () => undefined,\n dispose: () => undefined,\n loadTree: async () => undefined,\n iModel: undefined as unknown as IModelConnection,\n };\n\n public compareTileTreeIds(lhs: ClassifierTreeId, rhs: ClassifierTreeId): number {\n return compareIds(lhs, rhs);\n }\n\n public async createTileTree(id: ClassifierTreeId, iModel: IModelConnection): Promise<TileTree | undefined> {\n await iModel.models.load(id.modelId);\n const model = iModel.models.getLoaded(id.modelId);\n if (undefined === model || !(model instanceof GeometricModelState))\n return undefined;\n\n const idStr = iModelTileTreeIdToString(id.modelId, id, IModelApp.tileAdmin);\n const props = await IModelApp.tileAdmin.requestTileTreeProps(iModel, idStr);\n\n const params = iModelTileTreeParamsFromJSON(props, iModel, id.modelId, {\n edges: false,\n allowInstancing: false,\n is3d: true,\n batchType: id.type,\n timeline: id.timeline,\n });\n\n return new IModelTileTree(params, id);\n }\n\n public getOwner(id: ClassifierTreeId, iModel: IModelConnection): TileTreeOwner {\n return Id64.isValid(id.modelId) ? iModel.tiles.getTileTreeOwner(id, this) : this._nonexistentTreeOwner;\n }\n\n public addModelsAnimatedByScript(modelIds: Set<Id64String>, scriptSourceId: Id64String, trees: Iterable<{ id: ClassifierTreeId, owner: TileTreeOwner }>): void {\n // Note: This is invoked when an element hosting a schedule script is updated - it doesn't care about frontend schedule scripts.\n for (const tree of trees)\n if (scriptSourceId === tree.id.animationId)\n modelIds.add(tree.id.modelId);\n }\n\n public addSpatialModels(modelIds: Set<Id64String>, trees: Iterable<{ id: ClassifierTreeId, owner: TileTreeOwner }>): void {\n for (const tree of trees)\n modelIds.add(tree.id.modelId);\n }\n}\n\nconst classifierTreeSupplier = new ClassifierTreeSupplier();\n\n/** @internal */\nexport abstract class SpatialClassifierTileTreeReference extends TileTreeReference {\n public abstract get isPlanar(): boolean;\n public abstract get activeClassifier(): SpatialClassifier | undefined;\n public get isOpaque() { return false; } /** When referenced as a map layer reference, BIM models are never opaque. */\n public abstract get viewFlags(): Partial<ViewFlagsProperties>;\n public get transparency(): number | undefined { return undefined; }\n}\n\n/** @internal */\nclass ClassifierTreeReference extends SpatialClassifierTileTreeReference {\n private _id: ClassifierTreeId;\n private readonly _classifiers: SpatialClassifiers;\n private readonly _source: ViewState | DisplayStyleState;\n private readonly _iModel: IModelConnection;\n private readonly _classifiedTree: TileTreeReference;\n private _owner: TileTreeOwner;\n\n public constructor(classifiers: SpatialClassifiers, classifiedTree: TileTreeReference, iModel: IModelConnection, source: ViewState | DisplayStyleState) {\n super();\n this._id = createClassifierId(classifiers.active, source);\n this._source = source;\n this._iModel = iModel;\n this._classifiers = classifiers;\n this._classifiedTree = classifiedTree;\n this._owner = classifierTreeSupplier.getOwner(this._id, iModel);\n }\n\n public get classifiers(): SpatialClassifiers { return this._classifiers; }\n public get activeClassifier(): SpatialClassifier | undefined { return this.classifiers.active; }\n\n public override get castsShadows() {\n return false;\n }\n\n public get treeOwner(): TileTreeOwner {\n const newId = createClassifierId(this._classifiers.active, this._source);\n if (0 !== compareIds(this._id, newId)) {\n this._id = newId;\n this._owner = classifierTreeSupplier.getOwner(this._id, this._iModel);\n }\n\n return this._owner;\n }\n\n public override discloseTileTrees(trees: DisclosedTileTreeSet): void {\n // NB: We do NOT call super because we don't use our tree if no classifier is active.\n trees.disclose(this._classifiedTree);\n\n const classifier = this.activeClassifier;\n const classifierTree = undefined !== classifier ? this.treeOwner.tileTree : undefined;\n if (undefined !== classifierTree)\n trees.add(classifierTree);\n }\n public get isPlanar() { return BatchType.PlanarClassifier === this._id.type; }\n\n public get viewFlags(): Partial<ViewFlagsProperties> {\n return {\n renderMode: RenderMode.SmoothShade,\n transparency: true, // Igored for point clouds as they don't support transparency.\n textures: false,\n lighting: false,\n shadows: false,\n monochrome: false,\n materials: false,\n ambientOcclusion: false,\n visibleEdges: false,\n hiddenEdges: false,\n };\n }\n\n // Add volume classifiers to scene (planar classifiers are added seperately.)\n public override addToScene(context: SceneContext): void {\n if (this.isPlanar)\n return;\n\n const classifiedTree = this._classifiedTree.treeOwner.load();\n if (undefined === classifiedTree)\n return;\n\n const classifier = this._classifiers.active;\n if (undefined === classifier)\n return;\n\n const classifierTree = this.treeOwner.load();\n if (undefined === classifierTree)\n return;\n\n context.setVolumeClassifier(classifier, classifiedTree.modelId);\n super.addToScene(context);\n }\n\n}\n\n/** @internal */\nexport function createClassifierTileTreeReference(classifiers: SpatialClassifiers, classifiedTree: TileTreeReference, iModel: IModelConnection, source: ViewState | DisplayStyleState): SpatialClassifierTileTreeReference {\n return new ClassifierTreeReference(classifiers, classifiedTree, iModel, source);\n}\n\nfunction createClassifierId(classifier: SpatialClassifier | undefined, source: ViewState | DisplayStyleState | undefined): ClassifierTreeId {\n if (undefined === classifier)\n return { modelId: Id64.invalid, type: BatchType.PlanarClassifier, expansion: 0, animationId: undefined };\n\n const type = classifier.flags.isVolumeClassifier ? BatchType.VolumeClassifier : BatchType.PlanarClassifier;\n const scriptInfo = IModelApp.tileAdmin.getScriptInfoForTreeId(classifier.modelId, source?.scheduleScriptReference); // eslint-disable-line deprecation/deprecation\n return {\n modelId: classifier.modelId,\n type,\n expansion: classifier.expand,\n animationId: scriptInfo?.animationId,\n timeline: scriptInfo?.timeline,\n };\n}\n"]}
1
+ {"version":3,"file":"ClassifierTileTree.js","sourceRoot":"","sources":["../../../src/tile/ClassifierTileTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Tiles\n */\nimport { comparePossiblyUndefined, compareStrings, compareStringsOrUndefined, Id64, Id64String } from \"@itwin/core-bentley\";\nimport {\n BatchType, ClassifierTileTreeId, iModelTileTreeIdToString, RenderMode, RenderSchedule, SpatialClassifier, SpatialClassifiers, ViewFlagsProperties,\n} from \"@itwin/core-common\";\nimport { DisplayStyleState } from \"../DisplayStyleState\";\nimport { IModelApp } from \"../IModelApp\";\nimport { IModelConnection } from \"../IModelConnection\";\nimport { GeometricModelState } from \"../ModelState\";\nimport { SceneContext } from \"../ViewContext\";\nimport { ViewState } from \"../ViewState\";\nimport {\n DisclosedTileTreeSet, IModelTileTree, iModelTileTreeParamsFromJSON, TileTree, TileTreeLoadStatus, TileTreeOwner, TileTreeReference, TileTreeSupplier,\n} from \"./internal\";\n\ninterface ClassifierTreeId extends ClassifierTileTreeId {\n modelId: Id64String;\n timeline?: RenderSchedule.ModelTimeline;\n}\n\nfunction compareIds(lhs: ClassifierTreeId, rhs: ClassifierTreeId): number {\n return compareStrings(lhs.modelId, rhs.modelId) || compareStringsOrUndefined(lhs.animationId, rhs.animationId)\n || comparePossiblyUndefined((x, y) => x.compareTo(y), lhs.timeline, rhs.timeline);\n}\n\nclass ClassifierTreeSupplier implements TileTreeSupplier {\n private readonly _nonexistentTreeOwner = {\n tileTree: undefined,\n loadStatus: TileTreeLoadStatus.NotFound,\n load: () => undefined,\n dispose: () => undefined,\n loadTree: async () => undefined,\n iModel: undefined as unknown as IModelConnection,\n };\n\n public compareTileTreeIds(lhs: ClassifierTreeId, rhs: ClassifierTreeId): number {\n return compareIds(lhs, rhs);\n }\n\n public async createTileTree(id: ClassifierTreeId, iModel: IModelConnection): Promise<TileTree | undefined> {\n await iModel.models.load(id.modelId);\n const model = iModel.models.getLoaded(id.modelId);\n if (undefined === model || !(model instanceof GeometricModelState))\n return undefined;\n\n const idStr = iModelTileTreeIdToString(id.modelId, id, IModelApp.tileAdmin);\n const props = await IModelApp.tileAdmin.requestTileTreeProps(iModel, idStr);\n\n const params = iModelTileTreeParamsFromJSON(props, iModel, id.modelId, {\n edges: false,\n allowInstancing: false,\n is3d: true,\n batchType: id.type,\n timeline: id.timeline,\n });\n\n return new IModelTileTree(params, id);\n }\n\n public getOwner(id: ClassifierTreeId, iModel: IModelConnection): TileTreeOwner {\n return Id64.isValid(id.modelId) ? iModel.tiles.getTileTreeOwner(id, this) : this._nonexistentTreeOwner;\n }\n\n public addModelsAnimatedByScript(modelIds: Set<Id64String>, scriptSourceId: Id64String, trees: Iterable<{ id: ClassifierTreeId, owner: TileTreeOwner }>): void {\n // Note: This is invoked when an element hosting a schedule script is updated - it doesn't care about frontend schedule scripts.\n for (const tree of trees)\n if (scriptSourceId === tree.id.animationId)\n modelIds.add(tree.id.modelId);\n }\n\n public addSpatialModels(modelIds: Set<Id64String>, trees: Iterable<{ id: ClassifierTreeId, owner: TileTreeOwner }>): void {\n for (const tree of trees)\n modelIds.add(tree.id.modelId);\n }\n}\n\nconst classifierTreeSupplier = new ClassifierTreeSupplier();\n\n/** @internal */\nexport abstract class SpatialClassifierTileTreeReference extends TileTreeReference {\n public abstract get isPlanar(): boolean;\n public abstract get activeClassifier(): SpatialClassifier | undefined;\n public get isOpaque() { return false; } /** When referenced as a map layer reference, BIM models are never opaque. */\n public abstract get viewFlags(): Partial<ViewFlagsProperties>;\n public get transparency(): number | undefined { return undefined; }\n}\n\n/** @internal */\nclass ClassifierTreeReference extends SpatialClassifierTileTreeReference {\n private _id: ClassifierTreeId;\n private readonly _classifiers: SpatialClassifiers;\n private readonly _source: ViewState | DisplayStyleState;\n private readonly _iModel: IModelConnection;\n private readonly _classifiedTree: TileTreeReference;\n private _owner: TileTreeOwner;\n\n public constructor(classifiers: SpatialClassifiers, classifiedTree: TileTreeReference, iModel: IModelConnection, source: ViewState | DisplayStyleState) {\n super();\n this._id = createClassifierId(classifiers.active, source);\n this._source = source;\n this._iModel = iModel;\n this._classifiers = classifiers;\n this._classifiedTree = classifiedTree;\n this._owner = classifierTreeSupplier.getOwner(this._id, iModel);\n }\n\n public get classifiers(): SpatialClassifiers { return this._classifiers; }\n public get activeClassifier(): SpatialClassifier | undefined { return this.classifiers.active; }\n\n public override get castsShadows() {\n return false;\n }\n\n public get treeOwner(): TileTreeOwner {\n const newId = createClassifierId(this._classifiers.active, this._source);\n if (0 !== compareIds(this._id, newId)) {\n this._id = newId;\n this._owner = classifierTreeSupplier.getOwner(this._id, this._iModel);\n }\n\n return this._owner;\n }\n\n public override discloseTileTrees(trees: DisclosedTileTreeSet): void {\n // NB: We do NOT call super because we don't use our tree if no classifier is active.\n trees.disclose(this._classifiedTree);\n\n const classifier = this.activeClassifier;\n const classifierTree = undefined !== classifier ? this.treeOwner.tileTree : undefined;\n if (undefined !== classifierTree)\n trees.add(classifierTree);\n }\n public get isPlanar() { return BatchType.PlanarClassifier === this._id.type; }\n\n public get viewFlags(): Partial<ViewFlagsProperties> {\n return {\n renderMode: RenderMode.SmoothShade,\n transparency: true, // Igored for point clouds as they don't support transparency.\n textures: false,\n lighting: false,\n shadows: false,\n monochrome: false,\n materials: false,\n ambientOcclusion: false,\n visibleEdges: false,\n hiddenEdges: false,\n };\n }\n\n // Add volume classifiers to scene (planar classifiers are added seperately.)\n public override addToScene(context: SceneContext): void {\n if (this.isPlanar)\n return;\n\n const classifiedTree = this._classifiedTree.treeOwner.load();\n if (undefined === classifiedTree)\n return;\n\n const classifier = this._classifiers.active;\n if (undefined === classifier)\n return;\n\n const classifierTree = this.treeOwner.load();\n if (undefined === classifierTree)\n return;\n\n context.setVolumeClassifier(classifier, classifiedTree.modelId);\n super.addToScene(context);\n }\n\n}\n\n/** @internal */\nexport function createClassifierTileTreeReference(classifiers: SpatialClassifiers, classifiedTree: TileTreeReference, iModel: IModelConnection, source: ViewState | DisplayStyleState): SpatialClassifierTileTreeReference {\n return new ClassifierTreeReference(classifiers, classifiedTree, iModel, source);\n}\n\nfunction createClassifierId(classifier: SpatialClassifier | undefined, source: ViewState | DisplayStyleState | undefined): ClassifierTreeId {\n if (undefined === classifier)\n return { modelId: Id64.invalid, type: BatchType.PlanarClassifier, expansion: 0, animationId: undefined };\n\n const type = classifier.flags.isVolumeClassifier ? BatchType.VolumeClassifier : BatchType.PlanarClassifier;\n const scriptInfo = IModelApp.tileAdmin.getScriptInfoForTreeId(classifier.modelId, source?.scheduleScriptReference); // eslint-disable-line deprecation/deprecation\n return {\n modelId: classifier.modelId,\n type,\n expansion: classifier.expand,\n animationId: scriptInfo?.animationId,\n timeline: scriptInfo?.timeline,\n };\n}\n"]}