@itwin/core-frontend 4.3.0-dev.9 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/CHANGELOG.md +74 -1
  2. package/lib/cjs/DrawingViewState.d.ts +4 -2
  3. package/lib/cjs/DrawingViewState.d.ts.map +1 -1
  4. package/lib/cjs/DrawingViewState.js +6 -3
  5. package/lib/cjs/DrawingViewState.js.map +1 -1
  6. package/lib/cjs/ModelState.d.ts.map +1 -1
  7. package/lib/cjs/ModelState.js +1 -1
  8. package/lib/cjs/ModelState.js.map +1 -1
  9. package/lib/cjs/SheetViewState.d.ts +5 -1
  10. package/lib/cjs/SheetViewState.d.ts.map +1 -1
  11. package/lib/cjs/SheetViewState.js +25 -5
  12. package/lib/cjs/SheetViewState.js.map +1 -1
  13. package/lib/cjs/SpatialViewState.d.ts.map +1 -1
  14. package/lib/cjs/SpatialViewState.js +1 -0
  15. package/lib/cjs/SpatialViewState.js.map +1 -1
  16. package/lib/cjs/Viewport.d.ts +3 -1
  17. package/lib/cjs/Viewport.d.ts.map +1 -1
  18. package/lib/cjs/Viewport.js +6 -0
  19. package/lib/cjs/Viewport.js.map +1 -1
  20. package/lib/cjs/common/render/primitives/VertexTableSplitter.d.ts.map +1 -1
  21. package/lib/cjs/common/render/primitives/VertexTableSplitter.js +13 -1
  22. package/lib/cjs/common/render/primitives/VertexTableSplitter.js.map +1 -1
  23. package/lib/cjs/extension/ExtensionRuntime.js +2 -0
  24. package/lib/cjs/extension/ExtensionRuntime.js.map +1 -1
  25. package/lib/cjs/render/webgl/BranchState.d.ts.map +1 -1
  26. package/lib/cjs/render/webgl/BranchState.js +10 -2
  27. package/lib/cjs/render/webgl/BranchState.js.map +1 -1
  28. package/lib/cjs/render/webgl/ClipStack.d.ts +11 -1
  29. package/lib/cjs/render/webgl/ClipStack.d.ts.map +1 -1
  30. package/lib/cjs/render/webgl/ClipStack.js +23 -0
  31. package/lib/cjs/render/webgl/ClipStack.js.map +1 -1
  32. package/lib/cjs/render/webgl/Graphic.d.ts.map +1 -1
  33. package/lib/cjs/render/webgl/Graphic.js +2 -0
  34. package/lib/cjs/render/webgl/Graphic.js.map +1 -1
  35. package/lib/cjs/render/webgl/ShaderBuilder.d.ts +2 -1
  36. package/lib/cjs/render/webgl/ShaderBuilder.d.ts.map +1 -1
  37. package/lib/cjs/render/webgl/ShaderBuilder.js +9 -3
  38. package/lib/cjs/render/webgl/ShaderBuilder.js.map +1 -1
  39. package/lib/cjs/render/webgl/SurfaceGeometry.d.ts.map +1 -1
  40. package/lib/cjs/render/webgl/SurfaceGeometry.js +28 -2
  41. package/lib/cjs/render/webgl/SurfaceGeometry.js.map +1 -1
  42. package/lib/cjs/render/webgl/ThematicUniforms.d.ts.map +1 -1
  43. package/lib/cjs/render/webgl/ThematicUniforms.js +6 -8
  44. package/lib/cjs/render/webgl/ThematicUniforms.js.map +1 -1
  45. package/lib/cjs/render/webgl/glsl/Clipping.d.ts.map +1 -1
  46. package/lib/cjs/render/webgl/glsl/Clipping.js +90 -33
  47. package/lib/cjs/render/webgl/glsl/Clipping.js.map +1 -1
  48. package/lib/cjs/render/webgl/glsl/Composite.d.ts.map +1 -1
  49. package/lib/cjs/render/webgl/glsl/Composite.js +8 -3
  50. package/lib/cjs/render/webgl/glsl/Composite.js.map +1 -1
  51. package/lib/cjs/render/webgl/glsl/FeatureSymbology.d.ts +1 -0
  52. package/lib/cjs/render/webgl/glsl/FeatureSymbology.d.ts.map +1 -1
  53. package/lib/cjs/render/webgl/glsl/FeatureSymbology.js +2 -1
  54. package/lib/cjs/render/webgl/glsl/FeatureSymbology.js.map +1 -1
  55. package/lib/cjs/render/webgl/glsl/Surface.d.ts.map +1 -1
  56. package/lib/cjs/render/webgl/glsl/Surface.js +8 -12
  57. package/lib/cjs/render/webgl/glsl/Surface.js.map +1 -1
  58. package/lib/cjs/render/webgl/glsl/Thematic.d.ts.map +1 -1
  59. package/lib/cjs/render/webgl/glsl/Thematic.js +10 -8
  60. package/lib/cjs/render/webgl/glsl/Thematic.js.map +1 -1
  61. package/lib/cjs/render/webgl/glsl/Translucency.d.ts +2 -0
  62. package/lib/cjs/render/webgl/glsl/Translucency.d.ts.map +1 -1
  63. package/lib/cjs/render/webgl/glsl/Translucency.js +6 -6
  64. package/lib/cjs/render/webgl/glsl/Translucency.js.map +1 -1
  65. package/lib/cjs/tile/RealityModelTileTree.js +1 -1
  66. package/lib/cjs/tile/RealityModelTileTree.js.map +1 -1
  67. package/lib/cjs/tile/map/ArcGISTileMap.d.ts +5 -3
  68. package/lib/cjs/tile/map/ArcGISTileMap.d.ts.map +1 -1
  69. package/lib/cjs/tile/map/ArcGISTileMap.js +4 -16
  70. package/lib/cjs/tile/map/ArcGISTileMap.js.map +1 -1
  71. package/lib/cjs/tile/map/ArcGisUtilities.d.ts +27 -12
  72. package/lib/cjs/tile/map/ArcGisUtilities.d.ts.map +1 -1
  73. package/lib/cjs/tile/map/ArcGisUtilities.js +25 -17
  74. package/lib/cjs/tile/map/ArcGisUtilities.js.map +1 -1
  75. package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -1
  76. package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.js +6 -1
  77. package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
  78. package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
  79. package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +7 -3
  80. package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  81. package/lib/cjs/tile/map/ImageryProviders/TileUrlImageryProvider.d.ts.map +1 -1
  82. package/lib/cjs/tile/map/ImageryProviders/TileUrlImageryProvider.js +2 -1
  83. package/lib/cjs/tile/map/ImageryProviders/TileUrlImageryProvider.js.map +1 -1
  84. package/lib/cjs/tile/map/ImageryProviders/WmsMapLayerImageryProvider.d.ts.map +1 -1
  85. package/lib/cjs/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +4 -2
  86. package/lib/cjs/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
  87. package/lib/cjs/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.d.ts.map +1 -1
  88. package/lib/cjs/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js +5 -4
  89. package/lib/cjs/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
  90. package/lib/cjs/tile/map/MapLayerFormatRegistry.d.ts +16 -2
  91. package/lib/cjs/tile/map/MapLayerFormatRegistry.d.ts.map +1 -1
  92. package/lib/cjs/tile/map/MapLayerFormatRegistry.js +34 -10
  93. package/lib/cjs/tile/map/MapLayerFormatRegistry.js.map +1 -1
  94. package/lib/cjs/tile/map/MapLayerImageryFormats.d.ts +3 -4
  95. package/lib/cjs/tile/map/MapLayerImageryFormats.d.ts.map +1 -1
  96. package/lib/cjs/tile/map/MapLayerImageryFormats.js +32 -4
  97. package/lib/cjs/tile/map/MapLayerImageryFormats.js.map +1 -1
  98. package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts +5 -0
  99. package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
  100. package/lib/cjs/tile/map/MapLayerImageryProvider.js +41 -0
  101. package/lib/cjs/tile/map/MapLayerImageryProvider.js.map +1 -1
  102. package/lib/cjs/tile/map/MapLayerSources.d.ts +26 -5
  103. package/lib/cjs/tile/map/MapLayerSources.d.ts.map +1 -1
  104. package/lib/cjs/tile/map/MapLayerSources.js +22 -4
  105. package/lib/cjs/tile/map/MapLayerSources.js.map +1 -1
  106. package/lib/cjs/tile/map/WmsCapabilities.d.ts +3 -1
  107. package/lib/cjs/tile/map/WmsCapabilities.d.ts.map +1 -1
  108. package/lib/cjs/tile/map/WmsCapabilities.js +11 -2
  109. package/lib/cjs/tile/map/WmsCapabilities.js.map +1 -1
  110. package/lib/cjs/tile/map/WmtsCapabilities.d.ts +3 -1
  111. package/lib/cjs/tile/map/WmtsCapabilities.d.ts.map +1 -1
  112. package/lib/cjs/tile/map/WmtsCapabilities.js +11 -2
  113. package/lib/cjs/tile/map/WmtsCapabilities.js.map +1 -1
  114. package/lib/esm/DrawingViewState.d.ts +4 -2
  115. package/lib/esm/DrawingViewState.d.ts.map +1 -1
  116. package/lib/esm/DrawingViewState.js +6 -3
  117. package/lib/esm/DrawingViewState.js.map +1 -1
  118. package/lib/esm/ModelState.d.ts.map +1 -1
  119. package/lib/esm/ModelState.js +1 -1
  120. package/lib/esm/ModelState.js.map +1 -1
  121. package/lib/esm/SheetViewState.d.ts +5 -1
  122. package/lib/esm/SheetViewState.d.ts.map +1 -1
  123. package/lib/esm/SheetViewState.js +25 -5
  124. package/lib/esm/SheetViewState.js.map +1 -1
  125. package/lib/esm/SpatialViewState.d.ts.map +1 -1
  126. package/lib/esm/SpatialViewState.js +1 -0
  127. package/lib/esm/SpatialViewState.js.map +1 -1
  128. package/lib/esm/Viewport.d.ts +3 -1
  129. package/lib/esm/Viewport.d.ts.map +1 -1
  130. package/lib/esm/Viewport.js +6 -0
  131. package/lib/esm/Viewport.js.map +1 -1
  132. package/lib/esm/common/render/primitives/VertexTableSplitter.d.ts.map +1 -1
  133. package/lib/esm/common/render/primitives/VertexTableSplitter.js +13 -1
  134. package/lib/esm/common/render/primitives/VertexTableSplitter.js.map +1 -1
  135. package/lib/esm/extension/ExtensionRuntime.js +4 -2
  136. package/lib/esm/extension/ExtensionRuntime.js.map +1 -1
  137. package/lib/esm/render/webgl/BranchState.d.ts.map +1 -1
  138. package/lib/esm/render/webgl/BranchState.js +10 -2
  139. package/lib/esm/render/webgl/BranchState.js.map +1 -1
  140. package/lib/esm/render/webgl/ClipStack.d.ts +11 -1
  141. package/lib/esm/render/webgl/ClipStack.d.ts.map +1 -1
  142. package/lib/esm/render/webgl/ClipStack.js +23 -0
  143. package/lib/esm/render/webgl/ClipStack.js.map +1 -1
  144. package/lib/esm/render/webgl/Graphic.d.ts.map +1 -1
  145. package/lib/esm/render/webgl/Graphic.js +2 -0
  146. package/lib/esm/render/webgl/Graphic.js.map +1 -1
  147. package/lib/esm/render/webgl/ShaderBuilder.d.ts +2 -1
  148. package/lib/esm/render/webgl/ShaderBuilder.d.ts.map +1 -1
  149. package/lib/esm/render/webgl/ShaderBuilder.js +9 -3
  150. package/lib/esm/render/webgl/ShaderBuilder.js.map +1 -1
  151. package/lib/esm/render/webgl/SurfaceGeometry.d.ts.map +1 -1
  152. package/lib/esm/render/webgl/SurfaceGeometry.js +29 -3
  153. package/lib/esm/render/webgl/SurfaceGeometry.js.map +1 -1
  154. package/lib/esm/render/webgl/ThematicUniforms.d.ts.map +1 -1
  155. package/lib/esm/render/webgl/ThematicUniforms.js +8 -10
  156. package/lib/esm/render/webgl/ThematicUniforms.js.map +1 -1
  157. package/lib/esm/render/webgl/glsl/Clipping.d.ts.map +1 -1
  158. package/lib/esm/render/webgl/glsl/Clipping.js +91 -34
  159. package/lib/esm/render/webgl/glsl/Clipping.js.map +1 -1
  160. package/lib/esm/render/webgl/glsl/Composite.d.ts.map +1 -1
  161. package/lib/esm/render/webgl/glsl/Composite.js +8 -3
  162. package/lib/esm/render/webgl/glsl/Composite.js.map +1 -1
  163. package/lib/esm/render/webgl/glsl/FeatureSymbology.d.ts +1 -0
  164. package/lib/esm/render/webgl/glsl/FeatureSymbology.d.ts.map +1 -1
  165. package/lib/esm/render/webgl/glsl/FeatureSymbology.js +1 -1
  166. package/lib/esm/render/webgl/glsl/FeatureSymbology.js.map +1 -1
  167. package/lib/esm/render/webgl/glsl/Surface.d.ts.map +1 -1
  168. package/lib/esm/render/webgl/glsl/Surface.js +8 -12
  169. package/lib/esm/render/webgl/glsl/Surface.js.map +1 -1
  170. package/lib/esm/render/webgl/glsl/Thematic.d.ts.map +1 -1
  171. package/lib/esm/render/webgl/glsl/Thematic.js +10 -8
  172. package/lib/esm/render/webgl/glsl/Thematic.js.map +1 -1
  173. package/lib/esm/render/webgl/glsl/Translucency.d.ts +2 -0
  174. package/lib/esm/render/webgl/glsl/Translucency.d.ts.map +1 -1
  175. package/lib/esm/render/webgl/glsl/Translucency.js +3 -3
  176. package/lib/esm/render/webgl/glsl/Translucency.js.map +1 -1
  177. package/lib/esm/tile/RealityModelTileTree.js +1 -1
  178. package/lib/esm/tile/RealityModelTileTree.js.map +1 -1
  179. package/lib/esm/tile/map/ArcGISTileMap.d.ts +5 -3
  180. package/lib/esm/tile/map/ArcGISTileMap.d.ts.map +1 -1
  181. package/lib/esm/tile/map/ArcGISTileMap.js +5 -17
  182. package/lib/esm/tile/map/ArcGISTileMap.js.map +1 -1
  183. package/lib/esm/tile/map/ArcGisUtilities.d.ts +27 -12
  184. package/lib/esm/tile/map/ArcGisUtilities.d.ts.map +1 -1
  185. package/lib/esm/tile/map/ArcGisUtilities.js +25 -17
  186. package/lib/esm/tile/map/ArcGisUtilities.js.map +1 -1
  187. package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -1
  188. package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.js +6 -1
  189. package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
  190. package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
  191. package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +7 -3
  192. package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  193. package/lib/esm/tile/map/ImageryProviders/TileUrlImageryProvider.d.ts.map +1 -1
  194. package/lib/esm/tile/map/ImageryProviders/TileUrlImageryProvider.js +2 -1
  195. package/lib/esm/tile/map/ImageryProviders/TileUrlImageryProvider.js.map +1 -1
  196. package/lib/esm/tile/map/ImageryProviders/WmsMapLayerImageryProvider.d.ts.map +1 -1
  197. package/lib/esm/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +4 -2
  198. package/lib/esm/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
  199. package/lib/esm/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.d.ts.map +1 -1
  200. package/lib/esm/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js +5 -4
  201. package/lib/esm/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
  202. package/lib/esm/tile/map/MapLayerFormatRegistry.d.ts +16 -2
  203. package/lib/esm/tile/map/MapLayerFormatRegistry.d.ts.map +1 -1
  204. package/lib/esm/tile/map/MapLayerFormatRegistry.js +35 -11
  205. package/lib/esm/tile/map/MapLayerFormatRegistry.js.map +1 -1
  206. package/lib/esm/tile/map/MapLayerImageryFormats.d.ts +3 -4
  207. package/lib/esm/tile/map/MapLayerImageryFormats.d.ts.map +1 -1
  208. package/lib/esm/tile/map/MapLayerImageryFormats.js +33 -5
  209. package/lib/esm/tile/map/MapLayerImageryFormats.js.map +1 -1
  210. package/lib/esm/tile/map/MapLayerImageryProvider.d.ts +5 -0
  211. package/lib/esm/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
  212. package/lib/esm/tile/map/MapLayerImageryProvider.js +41 -0
  213. package/lib/esm/tile/map/MapLayerImageryProvider.js.map +1 -1
  214. package/lib/esm/tile/map/MapLayerSources.d.ts +26 -5
  215. package/lib/esm/tile/map/MapLayerSources.d.ts.map +1 -1
  216. package/lib/esm/tile/map/MapLayerSources.js +22 -4
  217. package/lib/esm/tile/map/MapLayerSources.js.map +1 -1
  218. package/lib/esm/tile/map/WmsCapabilities.d.ts +3 -1
  219. package/lib/esm/tile/map/WmsCapabilities.d.ts.map +1 -1
  220. package/lib/esm/tile/map/WmsCapabilities.js +11 -2
  221. package/lib/esm/tile/map/WmsCapabilities.js.map +1 -1
  222. package/lib/esm/tile/map/WmtsCapabilities.d.ts +3 -1
  223. package/lib/esm/tile/map/WmtsCapabilities.d.ts.map +1 -1
  224. package/lib/esm/tile/map/WmtsCapabilities.js +11 -2
  225. package/lib/esm/tile/map/WmtsCapabilities.js.map +1 -1
  226. package/lib/public/scripts/parse-imdl-worker.js +1 -1
  227. package/lib/workers/webpack/parse-imdl-worker.js +1 -1
  228. package/package.json +18 -19
@@ -26,9 +26,9 @@ class ThematicUniforms {
26
26
  this._colorMix = 0.0;
27
27
  this._axis = new Float32Array(3);
28
28
  this._sunDirection = new Float32Array(3);
29
- this._marginColor = new Float32Array(3);
29
+ this._marginColor = new FloatRGBA_1.FloatRgba();
30
30
  this._displayMode = new Float32Array(1);
31
- this._fragSettings = new Float32Array(3); // gradientMode, distanceCutoff, stepCount
31
+ this._fragSettings = new Float32Array(4); // gradientMode, distanceCutoff, stepCount, > 0.0 if multiply gradient alpha
32
32
  this._numSensors = 0;
33
33
  this._gradientDimension = _getGradientDimension();
34
34
  this.syncKey = 0;
@@ -102,15 +102,13 @@ class ThematicUniforms {
102
102
  this._updateAxis(this.thematicDisplay.axis, (core_common_1.ThematicDisplayMode.Slope === this.thematicDisplay.displayMode) ? target.uniforms.frustum.viewMatrix : undefined);
103
103
  if (core_common_1.ThematicDisplayMode.HillShade === this.thematicDisplay.displayMode)
104
104
  this._updateSunDirection(this.thematicDisplay.sunDirection, target.uniforms.frustum.viewMatrix);
105
- const marginRgb = FloatRGBA_1.FloatRgb.fromColorDef(this.thematicDisplay.gradientSettings.marginColor);
106
- this._marginColor[0] = marginRgb.red;
107
- this._marginColor[1] = marginRgb.green;
108
- this._marginColor[2] = marginRgb.blue;
105
+ this._marginColor.setColorDef(this.thematicDisplay.gradientSettings.marginColor);
109
106
  this._displayMode[0] = this.thematicDisplay.displayMode;
110
107
  this._fragSettings[0] = this.thematicDisplay.gradientSettings.mode;
111
108
  const sensorSettings = this.thematicDisplay.sensorSettings;
112
109
  this._fragSettings[1] = (undefined === sensorSettings) ? 0 : this.thematicDisplay.sensorSettings.distanceCutoff;
113
110
  this._fragSettings[2] = Math.min(this.thematicDisplay.gradientSettings.stepCount, this._gradientDimension);
111
+ this._fragSettings[3] = this.thematicDisplay.gradientSettings.transparencyMode === core_common_1.ThematicGradientTransparencyMode.SurfaceOnly ? 0.0 : 1.0;
114
112
  // If we want sensors and have no distance cutoff, then create a global shared sensor texture.
115
113
  if (target.wantThematicSensors && !(this._distanceCutoff > 0)) {
116
114
  this._numSensors = sensorSettings.sensors.length;
@@ -135,7 +133,7 @@ class ThematicUniforms {
135
133
  }
136
134
  bindMarginColor(uniform) {
137
135
  if (!(0, Sync_1.sync)(this, uniform))
138
- uniform.setUniform3fv(this._marginColor);
136
+ this._marginColor.bind(uniform);
139
137
  }
140
138
  bindDisplayMode(uniform) {
141
139
  if (!(0, Sync_1.sync)(this, uniform))
@@ -143,7 +141,7 @@ class ThematicUniforms {
143
141
  }
144
142
  bindFragSettings(uniform) {
145
143
  if (!(0, Sync_1.sync)(this, uniform))
146
- uniform.setUniform3fv(this._fragSettings);
144
+ uniform.setUniform4fv(this._fragSettings);
147
145
  }
148
146
  bindTexture(uniform, unit) {
149
147
  (0, core_bentley_1.assert)(undefined !== this._texture);
@@ -1 +1 @@
1
- {"version":3,"file":"ThematicUniforms.js","sourceRoot":"","sources":["../../../../src/render/webgl/ThematicUniforms.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert, dispose } from \"@itwin/core-bentley\";\r\nimport { Gradient, RenderTexture, ThematicDisplay, ThematicDisplayMode, ThematicGradientMode } from \"@itwin/core-common\";\r\nimport { WebGLDisposable } from \"./Disposable\";\r\nimport { UniformHandle } from \"./UniformHandle\";\r\nimport { TextureUnit } from \"./RenderFlags\";\r\nimport { desync, sync } from \"./Sync\";\r\nimport { TextureHandle } from \"./Texture\";\r\nimport { ThematicSensors } from \"./ThematicSensors\";\r\nimport { Angle, Range3d, Transform, Vector3d } from \"@itwin/core-geometry\";\r\nimport { Target } from \"./Target\";\r\nimport { System } from \"./System\";\r\nimport { FloatRgb } from \"./FloatRGBA\";\r\n\r\n/** Maintains state for uniforms related to thematic display.\r\n * @internal\r\n */\r\nexport class ThematicUniforms implements WebGLDisposable {\r\n private _sensors?: ThematicSensors; // NB: This is only used if no distance cutoff is applied (this is shared among all batches)\r\n private _texture?: TextureHandle;\r\n private readonly _range = new Float32Array(2);\r\n private _colorMix = 0.0;\r\n private readonly _axis = new Float32Array(3);\r\n private readonly _sunDirection = new Float32Array(3);\r\n private readonly _marginColor = new Float32Array(3);\r\n private readonly _displayMode = new Float32Array(1);\r\n private readonly _fragSettings = new Float32Array(3); // gradientMode, distanceCutoff, stepCount\r\n private _numSensors = 0;\r\n private _gradientDimension = _getGradientDimension();\r\n private _thematicDisplay?: ThematicDisplay;\r\n\r\n public syncKey = 0;\r\n\r\n private get _distanceCutoff(): number { return this._fragSettings[1]; }\r\n\r\n public get thematicDisplay(): ThematicDisplay | undefined {\r\n return this._thematicDisplay;\r\n }\r\n\r\n public get wantIsoLines(): boolean {\r\n if (undefined !== this.thematicDisplay)\r\n return ThematicDisplayMode.Height === this._displayMode[0] && ThematicGradientMode.IsoLines === this.thematicDisplay.gradientSettings.mode;\r\n return false;\r\n }\r\n\r\n public get wantSlopeMode(): boolean {\r\n return (undefined !== this.thematicDisplay) ? ThematicDisplayMode.Slope === this._displayMode[0] : false;\r\n }\r\n\r\n public get wantHillShadeMode(): boolean {\r\n return (undefined !== this.thematicDisplay) ? ThematicDisplayMode.HillShade === this._displayMode[0] : false;\r\n }\r\n\r\n public get wantGlobalSensorTexture(): boolean {\r\n return !(this._distanceCutoff > 0);\r\n }\r\n\r\n public get bytesUsed(): number {\r\n return this._sensors ? this._sensors.bytesUsed : 0;\r\n }\r\n\r\n private _scratchVector = new Vector3d();\r\n\r\n private _updateAxis(axis: Vector3d, viewMatrix?: Transform) {\r\n const tAxis = (viewMatrix !== undefined) ? viewMatrix.multiplyVector(axis, this._scratchVector) : axis;\r\n tAxis.normalizeInPlace();\r\n this._axis[0] = tAxis.x;\r\n this._axis[1] = tAxis.y;\r\n this._axis[2] = tAxis.z;\r\n }\r\n\r\n private _updateSunDirection(sunDir: Vector3d, viewMatrix: Transform) {\r\n viewMatrix.multiplyVector(sunDir, this._scratchVector);\r\n this._scratchVector.negate(this._scratchVector);\r\n this._scratchVector.normalizeInPlace();\r\n this._sunDirection[0] = this._scratchVector.x;\r\n this._sunDirection[1] = this._scratchVector.y;\r\n this._sunDirection[2] = this._scratchVector.z;\r\n }\r\n\r\n public update(target: Target): void {\r\n const plan = target.plan;\r\n\r\n if (this.thematicDisplay && plan.thematic && this.thematicDisplay.equals(plan.thematic) && this._texture) {\r\n if (undefined !== this._sensors)\r\n this._sensors.update(target.uniforms.frustum.viewMatrix);\r\n\r\n if (ThematicDisplayMode.Slope === this.thematicDisplay.displayMode) {\r\n this._updateAxis(this.thematicDisplay.axis, target.uniforms.frustum.viewMatrix);\r\n desync(this);\r\n } else if (ThematicDisplayMode.HillShade === this.thematicDisplay.displayMode) {\r\n this._updateSunDirection(this.thematicDisplay.sunDirection, target.uniforms.frustum.viewMatrix);\r\n desync(this);\r\n }\r\n\r\n return;\r\n }\r\n\r\n desync(this);\r\n\r\n this._thematicDisplay = plan.thematic;\r\n this._texture = dispose(this._texture);\r\n if (!this.thematicDisplay)\r\n return;\r\n\r\n if (ThematicDisplayMode.Slope === this.thematicDisplay.displayMode) {\r\n this._range[0] = Angle.degreesToRadians(this.thematicDisplay.range.low);\r\n this._range[1] = Angle.degreesToRadians(this.thematicDisplay.range.high);\r\n } else {\r\n this._range[0] = this.thematicDisplay.range.low;\r\n this._range[1] = this.thematicDisplay.range.high;\r\n }\r\n\r\n this._colorMix = this.thematicDisplay.gradientSettings.colorMix;\r\n\r\n this._updateAxis(this.thematicDisplay.axis, (ThematicDisplayMode.Slope === this.thematicDisplay.displayMode) ? target.uniforms.frustum.viewMatrix : undefined);\r\n\r\n if (ThematicDisplayMode.HillShade === this.thematicDisplay.displayMode)\r\n this._updateSunDirection(this.thematicDisplay.sunDirection, target.uniforms.frustum.viewMatrix);\r\n\r\n const marginRgb = FloatRgb.fromColorDef(this.thematicDisplay.gradientSettings.marginColor);\r\n this._marginColor[0] = marginRgb.red;\r\n this._marginColor[1] = marginRgb.green;\r\n this._marginColor[2] = marginRgb.blue;\r\n\r\n this._displayMode[0] = this.thematicDisplay.displayMode;\r\n\r\n this._fragSettings[0] = this.thematicDisplay.gradientSettings.mode;\r\n\r\n const sensorSettings = this.thematicDisplay.sensorSettings;\r\n this._fragSettings[1] = (undefined === sensorSettings) ? 0 : this.thematicDisplay.sensorSettings.distanceCutoff;\r\n\r\n this._fragSettings[2] = Math.min(this.thematicDisplay.gradientSettings.stepCount, this._gradientDimension);\r\n\r\n // If we want sensors and have no distance cutoff, then create a global shared sensor texture.\r\n if (target.wantThematicSensors && !(this._distanceCutoff > 0)) {\r\n this._numSensors = sensorSettings.sensors.length;\r\n this._sensors = dispose(this._sensors);\r\n this._sensors = ThematicSensors.create(target, Range3d.createNull());\r\n }\r\n\r\n const symb = Gradient.Symb.createThematic(this.thematicDisplay.gradientSettings);\r\n const image = symb.getThematicImageForRenderer(this._gradientDimension);\r\n this._texture = TextureHandle.createForImageBuffer(image, RenderTexture.Type.ThematicGradient);\r\n }\r\n\r\n public bindRange(uniform: UniformHandle): void {\r\n if (!sync(this, uniform))\r\n uniform.setUniform2fv(this._range);\r\n }\r\n\r\n public bindAxis(uniform: UniformHandle): void {\r\n if (!sync(this, uniform))\r\n uniform.setUniform3fv(this._axis);\r\n }\r\n\r\n public bindSunDirection(uniform: UniformHandle): void {\r\n if (!sync(this, uniform))\r\n uniform.setUniform3fv(this._sunDirection);\r\n }\r\n\r\n public bindMarginColor(uniform: UniformHandle): void {\r\n if (!sync(this, uniform))\r\n uniform.setUniform3fv(this._marginColor);\r\n }\r\n\r\n public bindDisplayMode(uniform: UniformHandle): void {\r\n if (!sync(this, uniform))\r\n uniform.setUniform1fv(this._displayMode);\r\n }\r\n\r\n public bindFragSettings(uniform: UniformHandle): void {\r\n if (!sync(this, uniform))\r\n uniform.setUniform3fv(this._fragSettings);\r\n }\r\n\r\n public bindTexture(uniform: UniformHandle, unit: TextureUnit): void {\r\n assert(undefined !== this._texture);\r\n this._texture.bindSampler(uniform, unit);\r\n }\r\n\r\n public bindNumSensors(uniform: UniformHandle): void {\r\n if (!sync(this, uniform))\r\n uniform.setUniform1i(this._numSensors);\r\n }\r\n\r\n public bindSensors(uniform: UniformHandle): void {\r\n assert(undefined !== this._sensors);\r\n this._sensors.texture.bindSampler(uniform, TextureUnit.ThematicSensors);\r\n }\r\n\r\n public get isDisposed(): boolean {\r\n return undefined === this._texture && undefined === this._sensors;\r\n }\r\n\r\n public dispose() {\r\n this._texture = dispose(this._texture);\r\n this._sensors = dispose(this._sensors);\r\n }\r\n}\r\n\r\nfunction _getGradientDimension(): number {\r\n const preferDimension = 8192;\r\n const maxDimension = System.instance.maxTextureSize;\r\n return (preferDimension > maxDimension) ? maxDimension : preferDimension;\r\n}\r\n"]}
1
+ {"version":3,"file":"ThematicUniforms.js","sourceRoot":"","sources":["../../../../src/render/webgl/ThematicUniforms.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert, dispose } from \"@itwin/core-bentley\";\r\nimport {\r\n Gradient, RenderTexture, ThematicDisplay, ThematicDisplayMode, ThematicGradientMode, ThematicGradientTransparencyMode,\r\n} from \"@itwin/core-common\";\r\nimport { WebGLDisposable } from \"./Disposable\";\r\nimport { UniformHandle } from \"./UniformHandle\";\r\nimport { TextureUnit } from \"./RenderFlags\";\r\nimport { desync, sync } from \"./Sync\";\r\nimport { TextureHandle } from \"./Texture\";\r\nimport { ThematicSensors } from \"./ThematicSensors\";\r\nimport { Angle, Range3d, Transform, Vector3d } from \"@itwin/core-geometry\";\r\nimport { Target } from \"./Target\";\r\nimport { System } from \"./System\";\r\nimport { FloatRgba } from \"./FloatRGBA\";\r\n\r\n/** Maintains state for uniforms related to thematic display.\r\n * @internal\r\n */\r\nexport class ThematicUniforms implements WebGLDisposable {\r\n private _sensors?: ThematicSensors; // NB: This is only used if no distance cutoff is applied (this is shared among all batches)\r\n private _texture?: TextureHandle;\r\n private readonly _range = new Float32Array(2);\r\n private _colorMix = 0.0;\r\n private readonly _axis = new Float32Array(3);\r\n private readonly _sunDirection = new Float32Array(3);\r\n private readonly _marginColor = new FloatRgba();\r\n private readonly _displayMode = new Float32Array(1);\r\n private readonly _fragSettings = new Float32Array(4); // gradientMode, distanceCutoff, stepCount, > 0.0 if multiply gradient alpha\r\n private _numSensors = 0;\r\n private _gradientDimension = _getGradientDimension();\r\n private _thematicDisplay?: ThematicDisplay;\r\n\r\n public syncKey = 0;\r\n\r\n private get _distanceCutoff(): number { return this._fragSettings[1]; }\r\n\r\n public get thematicDisplay(): ThematicDisplay | undefined {\r\n return this._thematicDisplay;\r\n }\r\n\r\n public get wantIsoLines(): boolean {\r\n if (undefined !== this.thematicDisplay)\r\n return ThematicDisplayMode.Height === this._displayMode[0] && ThematicGradientMode.IsoLines === this.thematicDisplay.gradientSettings.mode;\r\n return false;\r\n }\r\n\r\n public get wantSlopeMode(): boolean {\r\n return (undefined !== this.thematicDisplay) ? ThematicDisplayMode.Slope === this._displayMode[0] : false;\r\n }\r\n\r\n public get wantHillShadeMode(): boolean {\r\n return (undefined !== this.thematicDisplay) ? ThematicDisplayMode.HillShade === this._displayMode[0] : false;\r\n }\r\n\r\n public get wantGlobalSensorTexture(): boolean {\r\n return !(this._distanceCutoff > 0);\r\n }\r\n\r\n public get bytesUsed(): number {\r\n return this._sensors ? this._sensors.bytesUsed : 0;\r\n }\r\n\r\n private _scratchVector = new Vector3d();\r\n\r\n private _updateAxis(axis: Vector3d, viewMatrix?: Transform) {\r\n const tAxis = (viewMatrix !== undefined) ? viewMatrix.multiplyVector(axis, this._scratchVector) : axis;\r\n tAxis.normalizeInPlace();\r\n this._axis[0] = tAxis.x;\r\n this._axis[1] = tAxis.y;\r\n this._axis[2] = tAxis.z;\r\n }\r\n\r\n private _updateSunDirection(sunDir: Vector3d, viewMatrix: Transform) {\r\n viewMatrix.multiplyVector(sunDir, this._scratchVector);\r\n this._scratchVector.negate(this._scratchVector);\r\n this._scratchVector.normalizeInPlace();\r\n this._sunDirection[0] = this._scratchVector.x;\r\n this._sunDirection[1] = this._scratchVector.y;\r\n this._sunDirection[2] = this._scratchVector.z;\r\n }\r\n\r\n public update(target: Target): void {\r\n const plan = target.plan;\r\n\r\n if (this.thematicDisplay && plan.thematic && this.thematicDisplay.equals(plan.thematic) && this._texture) {\r\n if (undefined !== this._sensors)\r\n this._sensors.update(target.uniforms.frustum.viewMatrix);\r\n\r\n if (ThematicDisplayMode.Slope === this.thematicDisplay.displayMode) {\r\n this._updateAxis(this.thematicDisplay.axis, target.uniforms.frustum.viewMatrix);\r\n desync(this);\r\n } else if (ThematicDisplayMode.HillShade === this.thematicDisplay.displayMode) {\r\n this._updateSunDirection(this.thematicDisplay.sunDirection, target.uniforms.frustum.viewMatrix);\r\n desync(this);\r\n }\r\n\r\n return;\r\n }\r\n\r\n desync(this);\r\n\r\n this._thematicDisplay = plan.thematic;\r\n this._texture = dispose(this._texture);\r\n if (!this.thematicDisplay)\r\n return;\r\n\r\n if (ThematicDisplayMode.Slope === this.thematicDisplay.displayMode) {\r\n this._range[0] = Angle.degreesToRadians(this.thematicDisplay.range.low);\r\n this._range[1] = Angle.degreesToRadians(this.thematicDisplay.range.high);\r\n } else {\r\n this._range[0] = this.thematicDisplay.range.low;\r\n this._range[1] = this.thematicDisplay.range.high;\r\n }\r\n\r\n this._colorMix = this.thematicDisplay.gradientSettings.colorMix;\r\n\r\n this._updateAxis(this.thematicDisplay.axis, (ThematicDisplayMode.Slope === this.thematicDisplay.displayMode) ? target.uniforms.frustum.viewMatrix : undefined);\r\n\r\n if (ThematicDisplayMode.HillShade === this.thematicDisplay.displayMode)\r\n this._updateSunDirection(this.thematicDisplay.sunDirection, target.uniforms.frustum.viewMatrix);\r\n\r\n this._marginColor.setColorDef(this.thematicDisplay.gradientSettings.marginColor);\r\n\r\n this._displayMode[0] = this.thematicDisplay.displayMode;\r\n\r\n this._fragSettings[0] = this.thematicDisplay.gradientSettings.mode;\r\n\r\n const sensorSettings = this.thematicDisplay.sensorSettings;\r\n this._fragSettings[1] = (undefined === sensorSettings) ? 0 : this.thematicDisplay.sensorSettings.distanceCutoff;\r\n\r\n this._fragSettings[2] = Math.min(this.thematicDisplay.gradientSettings.stepCount, this._gradientDimension);\r\n this._fragSettings[3] = this.thematicDisplay.gradientSettings.transparencyMode === ThematicGradientTransparencyMode.SurfaceOnly ? 0.0 : 1.0;\r\n\r\n // If we want sensors and have no distance cutoff, then create a global shared sensor texture.\r\n if (target.wantThematicSensors && !(this._distanceCutoff > 0)) {\r\n this._numSensors = sensorSettings.sensors.length;\r\n this._sensors = dispose(this._sensors);\r\n this._sensors = ThematicSensors.create(target, Range3d.createNull());\r\n }\r\n\r\n const symb = Gradient.Symb.createThematic(this.thematicDisplay.gradientSettings);\r\n const image = symb.getThematicImageForRenderer(this._gradientDimension);\r\n this._texture = TextureHandle.createForImageBuffer(image, RenderTexture.Type.ThematicGradient);\r\n }\r\n\r\n public bindRange(uniform: UniformHandle): void {\r\n if (!sync(this, uniform))\r\n uniform.setUniform2fv(this._range);\r\n }\r\n\r\n public bindAxis(uniform: UniformHandle): void {\r\n if (!sync(this, uniform))\r\n uniform.setUniform3fv(this._axis);\r\n }\r\n\r\n public bindSunDirection(uniform: UniformHandle): void {\r\n if (!sync(this, uniform))\r\n uniform.setUniform3fv(this._sunDirection);\r\n }\r\n\r\n public bindMarginColor(uniform: UniformHandle): void {\r\n if (!sync(this, uniform))\r\n this._marginColor.bind(uniform);\r\n }\r\n\r\n public bindDisplayMode(uniform: UniformHandle): void {\r\n if (!sync(this, uniform))\r\n uniform.setUniform1fv(this._displayMode);\r\n }\r\n\r\n public bindFragSettings(uniform: UniformHandle): void {\r\n if (!sync(this, uniform))\r\n uniform.setUniform4fv(this._fragSettings);\r\n }\r\n\r\n public bindTexture(uniform: UniformHandle, unit: TextureUnit): void {\r\n assert(undefined !== this._texture);\r\n this._texture.bindSampler(uniform, unit);\r\n }\r\n\r\n public bindNumSensors(uniform: UniformHandle): void {\r\n if (!sync(this, uniform))\r\n uniform.setUniform1i(this._numSensors);\r\n }\r\n\r\n public bindSensors(uniform: UniformHandle): void {\r\n assert(undefined !== this._sensors);\r\n this._sensors.texture.bindSampler(uniform, TextureUnit.ThematicSensors);\r\n }\r\n\r\n public get isDisposed(): boolean {\r\n return undefined === this._texture && undefined === this._sensors;\r\n }\r\n\r\n public dispose() {\r\n this._texture = dispose(this._texture);\r\n this._sensors = dispose(this._sensors);\r\n }\r\n}\r\n\r\nfunction _getGradientDimension(): number {\r\n const preferDimension = 8192;\r\n const maxDimension = System.instance.maxTextureSize;\r\n return (preferDimension > maxDimension) ? maxDimension : preferDimension;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Clipping.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Clipping.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAA2B,cAAc,EAAmC,MAAM,kBAAkB,CAAC;AAY5G,eAAO,MAAM,WAAW,wbAYvB,CAAC;AAwDF,gBAAgB;AAChB,wBAAgB,WAAW,CAAC,IAAI,EAAE,cAAc,QAkD/C"}
1
+ {"version":3,"file":"Clipping.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Clipping.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAA2B,cAAc,EAAmC,MAAM,kBAAkB,CAAC;AAY5G,eAAO,MAAM,WAAW,wbAYvB,CAAC;AAoGF,gBAAgB;AAChB,wBAAgB,WAAW,CAAC,IAAI,EAAE,cAAc,QAwE/C"}
@@ -11,12 +11,12 @@ exports.addClipping = exports.unpackFloat = void 0;
11
11
  const core_bentley_1 = require("@itwin/core-bentley");
12
12
  const RenderFlags_1 = require("../RenderFlags");
13
13
  const Common_1 = require("./Common");
14
+ const FeatureSymbology_1 = require("./FeatureSymbology");
15
+ const Translucency_1 = require("./Translucency");
14
16
  const Vertex_1 = require("./Vertex");
15
17
  const getClipPlaneFloat = `
16
18
  vec4 getClipPlane(int index) {
17
- float x = 0.5;
18
- float y = (float(index) + 0.5) / float(u_clipParams[2]);
19
- return TEXTURE(s_clipSampler, vec2(x, y));
19
+ return texelFetch(s_clipSampler, ivec2(0, index), 0);
20
20
  }
21
21
  `;
22
22
  exports.unpackFloat = `
@@ -37,57 +37,112 @@ float calcClipPlaneDist(vec3 camPos, vec4 plane) {
37
37
  return dot(vec4(camPos, 1.0), plane);
38
38
  }
39
39
  `;
40
+ const applyClipPlanesLoop = `
41
+ for (int i = u_clipParams[0]; i < u_clipParams[1]; i++) {
42
+ `;
43
+ const applyClipPlanesLoopBody = `
44
+ vec4 plane = getClipPlane(i);
45
+ if (plane.x == 2.0) { // indicates start of new UnionOfConvexClipPlaneSets
46
+ if (numSetsClippedBy + int(clippedByCurrentPlaneSet) == numPlaneSets)
47
+ break;
48
+
49
+ numPlaneSets = 1;
50
+ numSetsClippedBy = 0;
51
+ clippedByCurrentPlaneSet = false;
52
+ } else if (plane.xyz == vec3(0.0)) { // indicates start of new clip plane set
53
+ numPlaneSets = numPlaneSets + 1;
54
+ numSetsClippedBy += int(clippedByCurrentPlaneSet);
55
+ clippedByCurrentPlaneSet = false;
56
+ } else if (!clippedByCurrentPlaneSet && calcClipPlaneDist(v_eyeSpace, plane) < 0.0) {
57
+ clippedByCurrentPlaneSet = true;
58
+ }
59
+ `;
60
+ const applyClipPlanesIntersectionLoopBody = `
61
+ if ((i <= u_clipParams[1] - 2) && (!clippedByCurrentPlaneSet)) {
62
+
63
+ //Obtaining closest point on plane to current frag in eyespace
64
+ vec3 pointOnPlane = v_eyeSpace - (abs(calcClipPlaneDist(v_eyeSpace, plane)) * plane.xyz);
65
+
66
+ //determining whether to colorize
67
+ if (distance(v_eyeSpace, pointOnPlane) <= (kFrustumType_Perspective == u_frustum.z ? -pointOnPlane.z * widthFactor : widthFactor)) {
68
+ colorizeIntersection = true;
69
+ }
70
+ }
71
+ }
72
+
73
+ //Need to pull this condition out of the loop for when there are multiple clip planes defined
74
+ if (colorizeIntersection && !clippedByCurrentPlaneSet) {
75
+ g_clipColor = u_clipIntersection.rgb;
76
+ return bvec2(true, true);
77
+ }
78
+ `;
40
79
  const applyClipPlanesPrelude = `
41
80
  int numPlaneSets = 1;
42
81
  int numSetsClippedBy = 0;
43
82
  bool clippedByCurrentPlaneSet = false;
44
- `;
45
- const applyClipPlanesLoop = `
46
- for (int i = u_clipParams[0]; i < u_clipParams[1]; i++) {
83
+ bool colorizeIntersection = false;
84
+ if (u_colorizeIntersection) {
85
+ float widthFactor = u_pixelWidthFactor * 2.0 * u_clipIntersection.a;
86
+ ${applyClipPlanesLoop}${applyClipPlanesLoopBody}${applyClipPlanesIntersectionLoopBody}
87
+ } else {
88
+ ${applyClipPlanesLoop}${applyClipPlanesLoopBody} }\n
89
+ }
47
90
  `;
48
91
  const applyClipPlanesPostlude = `
49
- vec4 plane = getClipPlane(i);
50
- if (plane.x == 2.0) { // indicates start of new UnionOfConvexClipPlaneSets
51
- if (numSetsClippedBy + int(clippedByCurrentPlaneSet) == numPlaneSets)
52
- break;
53
-
54
- numPlaneSets = 1;
55
- numSetsClippedBy = 0;
56
- clippedByCurrentPlaneSet = false;
57
- } else if (plane.xyz == vec3(0.0)) { // indicates start of new clip plane set
58
- numPlaneSets = numPlaneSets + 1;
59
- numSetsClippedBy += int(clippedByCurrentPlaneSet);
60
- clippedByCurrentPlaneSet = false;
61
- } else if (!clippedByCurrentPlaneSet && calcClipPlaneDist(v_eyeSpace, plane) < 0.0) {
62
- clippedByCurrentPlaneSet = true;
63
- }
64
- }
65
92
 
66
93
  numSetsClippedBy += int(clippedByCurrentPlaneSet);
67
94
  if (numSetsClippedBy == numPlaneSets) {
68
95
  if (u_outsideRgba.a > 0.0) {
69
96
  g_clipColor = u_outsideRgba.rgb;
70
- return true;
97
+ return bvec2(true,false);
71
98
  } else {
72
99
  discard;
73
100
  }
74
101
  } else if (u_insideRgba.a > 0.0) {
75
102
  g_clipColor = u_insideRgba.rgb;
76
- return true;
103
+ return bvec2(true,false);
77
104
  }
78
105
 
79
- return false;
106
+ return bvec2(false,false);
107
+ `;
108
+ const assignFragData = `
109
+ if (g_hasClipColor.y) {
110
+ vec4 output0 = vec4(g_clipColor, 1.0);
111
+ vec4 output1 = vec4(1.0, 1.0, 0.0, 1.0);
112
+
113
+ FragColor0 = output0;
114
+ FragColor1 = output1;
115
+ } else {
116
+ ${Translucency_1.computeOutputs}
117
+
118
+ FragColor0 = output0;
119
+ FragColor1 = output1;
120
+ }
80
121
  `;
81
- const applyClipPlanes = applyClipPlanesPrelude + applyClipPlanesLoop + applyClipPlanesPostlude;
122
+ const applyClipPlanes = applyClipPlanesPrelude + applyClipPlanesPostlude;
82
123
  const clipParams = new Int32Array(3);
83
124
  /** @internal */
84
125
  function addClipping(prog) {
85
126
  const frag = prog.frag;
86
127
  const vert = prog.vert;
87
128
  (0, Common_1.addEyeSpace)(prog);
129
+ prog.addUniform("u_outsideRgba", 5 /* VariableType.Vec4 */, (program) => {
130
+ program.addGraphicUniform("u_outsideRgba", (uniform, params) => {
131
+ params.target.uniforms.branch.clipStack.outsideColor.bind(uniform);
132
+ });
133
+ });
134
+ prog.addUniform("u_insideRgba", 5 /* VariableType.Vec4 */, (program) => {
135
+ program.addGraphicUniform("u_insideRgba", (uniform, params) => {
136
+ params.target.uniforms.branch.clipStack.insideColor.bind(uniform);
137
+ });
138
+ });
139
+ (0, Common_1.addFrustum)(prog);
140
+ (0, FeatureSymbology_1.addPixelWidthFactor)(frag);
141
+ (0, Vertex_1.addModelViewMatrix)(vert);
88
142
  // [0] = index of first plane
89
143
  // [1] = index of last plane (one past the end)
90
144
  // [2] = texture height
145
+ prog.frag.addGlobal("g_hasClipColor", 11 /* VariableType.BVec2 */);
91
146
  prog.addUniformArray("u_clipParams", 1 /* VariableType.Int */, 3, (program) => {
92
147
  program.addGraphicUniform("u_clipParams", (uniform, params) => {
93
148
  // Set this to false to visualize pre-shader culling of geometry.
@@ -100,17 +155,16 @@ function addClipping(prog) {
100
155
  uniform.setUniform1iv(clipParams);
101
156
  });
102
157
  });
103
- prog.addUniform("u_outsideRgba", 5 /* VariableType.Vec4 */, (program) => {
104
- program.addGraphicUniform("u_outsideRgba", (uniform, params) => {
105
- params.target.uniforms.branch.clipStack.outsideColor.bind(uniform);
158
+ prog.frag.addUniform("u_colorizeIntersection", 0 /* VariableType.Boolean */, (program) => {
159
+ program.addProgramUniform("u_colorizeIntersection", (uniform, params) => {
160
+ uniform.setUniform1i(params.target.uniforms.branch.clipStack.colorizeIntersection ? 1 : 0);
106
161
  });
107
162
  });
108
- prog.addUniform("u_insideRgba", 5 /* VariableType.Vec4 */, (program) => {
109
- program.addGraphicUniform("u_insideRgba", (uniform, params) => {
110
- params.target.uniforms.branch.clipStack.insideColor.bind(uniform);
163
+ prog.frag.addUniform("u_clipIntersection", 5 /* VariableType.Vec4 */, (program) => {
164
+ program.addGraphicUniform("u_clipIntersection", (uniform, params) => {
165
+ params.target.uniforms.branch.clipStack.intersectionStyle.bind(uniform);
111
166
  });
112
167
  });
113
- (0, Vertex_1.addModelViewMatrix)(vert);
114
168
  frag.addFunction(getClipPlaneFloat);
115
169
  frag.addFunction(calcClipPlaneDist);
116
170
  frag.addUniform("s_clipSampler", 8 /* VariableType.Sampler2D */, (program) => {
@@ -122,6 +176,9 @@ function addClipping(prog) {
122
176
  });
123
177
  }, 3 /* VariablePrecision.High */);
124
178
  frag.set(10 /* FragmentShaderComponent.ApplyClipping */, applyClipPlanes);
179
+ // modify translucent shaders
180
+ if (frag.findFunction(Translucency_1.computeAlphaWeight))
181
+ frag.set(16 /* FragmentShaderComponent.AssignFragData */, assignFragData);
125
182
  }
126
183
  exports.addClipping = addClipping;
127
184
  //# sourceMappingURL=Clipping.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Clipping.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Clipping.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { TextureUnit } from \"../RenderFlags\";\r\nimport { FragmentShaderComponent, ProgramBuilder, VariablePrecision, VariableType } from \"../ShaderBuilder\";\r\nimport { addEyeSpace } from \"./Common\";\r\nimport { addModelViewMatrix } from \"./Vertex\";\r\n\r\nconst getClipPlaneFloat = `\r\nvec4 getClipPlane(int index) {\r\n float x = 0.5;\r\n float y = (float(index) + 0.5) / float(u_clipParams[2]);\r\n return TEXTURE(s_clipSampler, vec2(x, y));\r\n}\r\n`;\r\n\r\nexport const unpackFloat = `\r\nfloat unpackFloat(vec4 v) {\r\n const float bias = 38.0;\r\n v = floor(v * 255.0 + 0.5);\r\n float temp = v.w / 2.0;\r\n float exponent = floor(temp);\r\n float sign = (temp - exponent) * 2.0;\r\n exponent = exponent - bias;\r\n sign = -(sign * 2.0 - 1.0);\r\n float unpacked = dot(sign * v.xyz, vec3(1.0 / 256.0, 1.0 / 65536.0, 1.0 / 16777216.0)); // shift x right 8, y right 16 and z right 24\r\n return unpacked * pow(10.0, exponent);\r\n}\r\n`;\r\n\r\nconst calcClipPlaneDist = `\r\nfloat calcClipPlaneDist(vec3 camPos, vec4 plane) {\r\n return dot(vec4(camPos, 1.0), plane);\r\n}\r\n`;\r\n\r\nconst applyClipPlanesPrelude = `\r\n int numPlaneSets = 1;\r\n int numSetsClippedBy = 0;\r\n bool clippedByCurrentPlaneSet = false;\r\n`;\r\n\r\nconst applyClipPlanesLoop = `\r\n for (int i = u_clipParams[0]; i < u_clipParams[1]; i++) {\r\n`;\r\n\r\nconst applyClipPlanesPostlude = `\r\n vec4 plane = getClipPlane(i);\r\n if (plane.x == 2.0) { // indicates start of new UnionOfConvexClipPlaneSets\r\n if (numSetsClippedBy + int(clippedByCurrentPlaneSet) == numPlaneSets)\r\n break;\r\n\r\n numPlaneSets = 1;\r\n numSetsClippedBy = 0;\r\n clippedByCurrentPlaneSet = false;\r\n } else if (plane.xyz == vec3(0.0)) { // indicates start of new clip plane set\r\n numPlaneSets = numPlaneSets + 1;\r\n numSetsClippedBy += int(clippedByCurrentPlaneSet);\r\n clippedByCurrentPlaneSet = false;\r\n } else if (!clippedByCurrentPlaneSet && calcClipPlaneDist(v_eyeSpace, plane) < 0.0) {\r\n clippedByCurrentPlaneSet = true;\r\n }\r\n }\r\n\r\n numSetsClippedBy += int(clippedByCurrentPlaneSet);\r\n if (numSetsClippedBy == numPlaneSets) {\r\n if (u_outsideRgba.a > 0.0) {\r\n g_clipColor = u_outsideRgba.rgb;\r\n return true;\r\n } else {\r\n discard;\r\n }\r\n } else if (u_insideRgba.a > 0.0) {\r\n g_clipColor = u_insideRgba.rgb;\r\n return true;\r\n }\r\n\r\n return false;\r\n`;\r\n\r\nconst applyClipPlanes = applyClipPlanesPrelude + applyClipPlanesLoop + applyClipPlanesPostlude;\r\n\r\nconst clipParams = new Int32Array(3);\r\n\r\n/** @internal */\r\nexport function addClipping(prog: ProgramBuilder) {\r\n const frag = prog.frag;\r\n const vert = prog.vert;\r\n\r\n addEyeSpace(prog);\r\n\r\n // [0] = index of first plane\r\n // [1] = index of last plane (one past the end)\r\n // [2] = texture height\r\n prog.addUniformArray(\"u_clipParams\", VariableType.Int, 3, (program) => {\r\n program.addGraphicUniform(\"u_clipParams\", (uniform, params) => {\r\n // Set this to false to visualize pre-shader culling of geometry.\r\n const doClipping = true;\r\n\r\n const stack = params.target.uniforms.branch.clipStack;\r\n clipParams[0] = stack.startIndex;\r\n clipParams[1] = stack.endIndex;\r\n clipParams[2] = doClipping ? stack.textureHeight : 0;\r\n assert(clipParams[2] > 0 || !doClipping);\r\n uniform.setUniform1iv(clipParams);\r\n });\r\n });\r\n\r\n prog.addUniform(\"u_outsideRgba\", VariableType.Vec4, (program) => {\r\n program.addGraphicUniform(\"u_outsideRgba\", (uniform, params) => {\r\n params.target.uniforms.branch.clipStack.outsideColor.bind(uniform);\r\n });\r\n });\r\n\r\n prog.addUniform(\"u_insideRgba\", VariableType.Vec4, (program) => {\r\n program.addGraphicUniform(\"u_insideRgba\", (uniform, params) => {\r\n params.target.uniforms.branch.clipStack.insideColor.bind(uniform);\r\n });\r\n });\r\n\r\n addModelViewMatrix(vert);\r\n\r\n frag.addFunction(getClipPlaneFloat);\r\n\r\n frag.addFunction(calcClipPlaneDist);\r\n frag.addUniform(\"s_clipSampler\", VariableType.Sampler2D, (program) => {\r\n program.addGraphicUniform(\"s_clipSampler\", (uniform, params) => {\r\n const texture = params.target.uniforms.branch.clipStack.texture;\r\n assert(texture !== undefined);\r\n if (texture !== undefined)\r\n texture.bindSampler(uniform, TextureUnit.ClipVolume);\r\n });\r\n }, VariablePrecision.High);\r\n\r\n frag.set(FragmentShaderComponent.ApplyClipping, applyClipPlanes);\r\n}\r\n"]}
1
+ {"version":3,"file":"Clipping.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Clipping.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { TextureUnit } from \"../RenderFlags\";\r\nimport { FragmentShaderComponent, ProgramBuilder, VariablePrecision, VariableType } from \"../ShaderBuilder\";\r\nimport { addEyeSpace, addFrustum } from \"./Common\";\r\nimport { addPixelWidthFactor } from \"./FeatureSymbology\";\r\nimport { computeAlphaWeight, computeOutputs } from \"./Translucency\";\r\nimport { addModelViewMatrix } from \"./Vertex\";\r\n\r\nconst getClipPlaneFloat = `\r\nvec4 getClipPlane(int index) {\r\n return texelFetch(s_clipSampler, ivec2(0, index), 0);\r\n}\r\n`;\r\n\r\nexport const unpackFloat = `\r\nfloat unpackFloat(vec4 v) {\r\n const float bias = 38.0;\r\n v = floor(v * 255.0 + 0.5);\r\n float temp = v.w / 2.0;\r\n float exponent = floor(temp);\r\n float sign = (temp - exponent) * 2.0;\r\n exponent = exponent - bias;\r\n sign = -(sign * 2.0 - 1.0);\r\n float unpacked = dot(sign * v.xyz, vec3(1.0 / 256.0, 1.0 / 65536.0, 1.0 / 16777216.0)); // shift x right 8, y right 16 and z right 24\r\n return unpacked * pow(10.0, exponent);\r\n}\r\n`;\r\n\r\nconst calcClipPlaneDist = `\r\nfloat calcClipPlaneDist(vec3 camPos, vec4 plane) {\r\n return dot(vec4(camPos, 1.0), plane);\r\n}\r\n`;\r\n\r\nconst applyClipPlanesLoop = `\r\n for (int i = u_clipParams[0]; i < u_clipParams[1]; i++) {\r\n`;\r\n\r\nconst applyClipPlanesLoopBody = `\r\n vec4 plane = getClipPlane(i);\r\n if (plane.x == 2.0) { // indicates start of new UnionOfConvexClipPlaneSets\r\n if (numSetsClippedBy + int(clippedByCurrentPlaneSet) == numPlaneSets)\r\n break;\r\n\r\n numPlaneSets = 1;\r\n numSetsClippedBy = 0;\r\n clippedByCurrentPlaneSet = false;\r\n } else if (plane.xyz == vec3(0.0)) { // indicates start of new clip plane set\r\n numPlaneSets = numPlaneSets + 1;\r\n numSetsClippedBy += int(clippedByCurrentPlaneSet);\r\n clippedByCurrentPlaneSet = false;\r\n } else if (!clippedByCurrentPlaneSet && calcClipPlaneDist(v_eyeSpace, plane) < 0.0) {\r\n clippedByCurrentPlaneSet = true;\r\n }\r\n`;\r\n\r\nconst applyClipPlanesIntersectionLoopBody = `\r\n if ((i <= u_clipParams[1] - 2) && (!clippedByCurrentPlaneSet)) {\r\n\r\n //Obtaining closest point on plane to current frag in eyespace\r\n vec3 pointOnPlane = v_eyeSpace - (abs(calcClipPlaneDist(v_eyeSpace, plane)) * plane.xyz);\r\n\r\n //determining whether to colorize\r\n if (distance(v_eyeSpace, pointOnPlane) <= (kFrustumType_Perspective == u_frustum.z ? -pointOnPlane.z * widthFactor : widthFactor)) {\r\n colorizeIntersection = true;\r\n }\r\n }\r\n }\r\n\r\n //Need to pull this condition out of the loop for when there are multiple clip planes defined\r\n if (colorizeIntersection && !clippedByCurrentPlaneSet) {\r\n g_clipColor = u_clipIntersection.rgb;\r\n return bvec2(true, true);\r\n }\r\n`;\r\n\r\nconst applyClipPlanesPrelude = `\r\n int numPlaneSets = 1;\r\n int numSetsClippedBy = 0;\r\n bool clippedByCurrentPlaneSet = false;\r\n bool colorizeIntersection = false;\r\n if (u_colorizeIntersection) {\r\n float widthFactor = u_pixelWidthFactor * 2.0 * u_clipIntersection.a;\r\n ${applyClipPlanesLoop}${applyClipPlanesLoopBody}${applyClipPlanesIntersectionLoopBody}\r\n } else {\r\n ${applyClipPlanesLoop}${applyClipPlanesLoopBody} }\\n\r\n }\r\n`;\r\n\r\nconst applyClipPlanesPostlude = `\r\n\r\n numSetsClippedBy += int(clippedByCurrentPlaneSet);\r\n if (numSetsClippedBy == numPlaneSets) {\r\n if (u_outsideRgba.a > 0.0) {\r\n g_clipColor = u_outsideRgba.rgb;\r\n return bvec2(true,false);\r\n } else {\r\n discard;\r\n }\r\n } else if (u_insideRgba.a > 0.0) {\r\n g_clipColor = u_insideRgba.rgb;\r\n return bvec2(true,false);\r\n }\r\n\r\n return bvec2(false,false);\r\n`;\r\n\r\nconst assignFragData = `\r\n if (g_hasClipColor.y) {\r\n vec4 output0 = vec4(g_clipColor, 1.0);\r\n vec4 output1 = vec4(1.0, 1.0, 0.0, 1.0);\r\n\r\n FragColor0 = output0;\r\n FragColor1 = output1;\r\n } else {\r\n ${computeOutputs}\r\n\r\n FragColor0 = output0;\r\n FragColor1 = output1;\r\n }\r\n`;\r\n\r\nconst applyClipPlanes = applyClipPlanesPrelude + applyClipPlanesPostlude;\r\n\r\nconst clipParams = new Int32Array(3);\r\n\r\n/** @internal */\r\nexport function addClipping(prog: ProgramBuilder) {\r\n const frag = prog.frag;\r\n const vert = prog.vert;\r\n\r\n addEyeSpace(prog);\r\n\r\n prog.addUniform(\"u_outsideRgba\", VariableType.Vec4, (program) => {\r\n program.addGraphicUniform(\"u_outsideRgba\", (uniform, params) => {\r\n params.target.uniforms.branch.clipStack.outsideColor.bind(uniform);\r\n });\r\n });\r\n\r\n prog.addUniform(\"u_insideRgba\", VariableType.Vec4, (program) => {\r\n program.addGraphicUniform(\"u_insideRgba\", (uniform, params) => {\r\n params.target.uniforms.branch.clipStack.insideColor.bind(uniform);\r\n });\r\n });\r\n\r\n addFrustum(prog);\r\n addPixelWidthFactor(frag);\r\n\r\n addModelViewMatrix(vert);\r\n\r\n // [0] = index of first plane\r\n // [1] = index of last plane (one past the end)\r\n // [2] = texture height\r\n\r\n prog.frag.addGlobal(\"g_hasClipColor\", VariableType.BVec2);\r\n\r\n prog.addUniformArray(\"u_clipParams\", VariableType.Int, 3, (program) => {\r\n program.addGraphicUniform(\"u_clipParams\", (uniform, params) => {\r\n // Set this to false to visualize pre-shader culling of geometry.\r\n const doClipping = true;\r\n\r\n const stack = params.target.uniforms.branch.clipStack;\r\n clipParams[0] = stack.startIndex;\r\n clipParams[1] = stack.endIndex;\r\n clipParams[2] = doClipping ? stack.textureHeight : 0;\r\n assert(clipParams[2] > 0 || !doClipping);\r\n uniform.setUniform1iv(clipParams);\r\n });\r\n });\r\n\r\n prog.frag.addUniform(\"u_colorizeIntersection\", VariableType.Boolean, (program) => {\r\n program.addProgramUniform(\"u_colorizeIntersection\", (uniform, params) => {\r\n uniform.setUniform1i(params.target.uniforms.branch.clipStack.colorizeIntersection ? 1 : 0);\r\n });\r\n });\r\n\r\n prog.frag.addUniform(\"u_clipIntersection\", VariableType.Vec4, (program) => {\r\n program.addGraphicUniform(\"u_clipIntersection\", (uniform, params) => {\r\n params.target.uniforms.branch.clipStack.intersectionStyle.bind(uniform);\r\n });\r\n });\r\n\r\n frag.addFunction(getClipPlaneFloat);\r\n\r\n frag.addFunction(calcClipPlaneDist);\r\n frag.addUniform(\"s_clipSampler\", VariableType.Sampler2D, (program) => {\r\n program.addGraphicUniform(\"s_clipSampler\", (uniform, params) => {\r\n const texture = params.target.uniforms.branch.clipStack.texture;\r\n assert(texture !== undefined);\r\n if (texture !== undefined)\r\n texture.bindSampler(uniform, TextureUnit.ClipVolume);\r\n });\r\n }, VariablePrecision.High);\r\n\r\n frag.set(FragmentShaderComponent.ApplyClipping, applyClipPlanes);\r\n\r\n // modify translucent shaders\r\n if (frag.findFunction(computeAlphaWeight))\r\n frag.set(FragmentShaderComponent.AssignFragData, assignFragData);\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Composite.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Composite.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAE,cAAc,EAAe,MAAM,gBAAgB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA4GjD,gBAAgB;AAChB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,sBAAsB,GAAG,aAAa,CAyE5G"}
1
+ {"version":3,"file":"Composite.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Composite.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAE,cAAc,EAAe,MAAM,gBAAgB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA4GjD,gBAAgB;AAChB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,sBAAsB,GAAG,aAAa,CA+E5G"}
@@ -97,10 +97,10 @@ const computeTranslucentColor = `
97
97
  vec4 computeColor() {
98
98
  vec4 opaque = computeOpaqueColor();
99
99
  vec4 accum = TEXTURE(u_accumulation, v_texCoord);
100
- float r = TEXTURE(u_revealage, v_texCoord).r;
100
+ vec2 rg = TEXTURE(u_revealage, v_texCoord).rg;
101
101
 
102
- vec4 transparent = vec4(accum.rgb / clamp(r, 1e-4, 5e4), accum.a);
103
- vec4 col = (1.0 - transparent.a) * transparent + transparent.a * opaque;
102
+ vec4 transparent = vec4(accum.rgb / clamp(rg.r, 1e-4, 5e4), accum.a);
103
+ vec4 col = mix((1.0 - transparent.a) * transparent + transparent.a * opaque, vec4(u_clipIntersection.rgb, 1.0), rg.g);
104
104
  return col;
105
105
  }
106
106
  `;
@@ -148,6 +148,11 @@ function createCompositeProgram(flags, context) {
148
148
  Texture_1.Texture2DHandle.bindSampler(uniform, params.geometry.reveal, RenderFlags_1.TextureUnit.Two);
149
149
  });
150
150
  });
151
+ builder.frag.addUniform("u_clipIntersection", 5 /* VariableType.Vec4 */, (program) => {
152
+ program.addGraphicUniform("u_clipIntersection", (uniform, params) => {
153
+ params.target.uniforms.branch.clipStack.intersectionStyle.bind(uniform);
154
+ });
155
+ });
151
156
  frag.addFunction(computeTranslucentColor);
152
157
  if (!wantHilite) {
153
158
  frag.set(1 /* FragmentShaderComponent.ComputeBaseColor */, computeTranslucentBaseColor);
@@ -1 +1 @@
1
- {"version":3,"file":"Composite.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Composite.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { CompositeGeometry } from \"../CachedGeometry\";\r\nimport { CompositeFlags, TextureUnit } from \"../RenderFlags\";\r\nimport { FragmentShaderBuilder, FragmentShaderComponent, VariableType } from \"../ShaderBuilder\";\r\nimport { ShaderProgram } from \"../ShaderProgram\";\r\nimport { Texture2DHandle } from \"../Texture\";\r\nimport { addWindowToTexCoords, assignFragColor } from \"./Fragment\";\r\nimport { createViewportQuadBuilder } from \"./ViewportQuad\";\r\n\r\nfunction addHiliteSettings(frag: FragmentShaderBuilder): void {\r\n frag.addUniform(\"u_hilite_settings\", VariableType.Mat3, (prog) => {\r\n prog.addProgramUniform(\"u_hilite_settings\", (uniform, params) => {\r\n params.target.uniforms.hilite.bindCompositeSettings(uniform);\r\n });\r\n });\r\n\r\n frag.addUniform(\"u_hilite_width\", VariableType.Vec2, (prog) => {\r\n prog.addProgramUniform(\"u_hilite_width\", (uniform, params) => {\r\n params.target.uniforms.hilite.bindCompositeWidths(uniform);\r\n });\r\n });\r\n}\r\n\r\nconst readEdgePixel = `\r\nvec2 readEdgePixel(float xOffset, float yOffset) {\r\n vec2 t = windowCoordsToTexCoords(gl_FragCoord.xy + vec2(xOffset, yOffset));\r\n return TEXTURE(u_hilite, t).xy;\r\n}\r\n`;\r\n\r\nconst computeNearbyHilites = `\r\nvec2 computeNearbyHilites() {\r\n float hiliteWidth = u_hilite_width.x;\r\n float emphWidth = u_hilite_width.y;\r\n float maxWidth = max(hiliteWidth, emphWidth);\r\n if (0.0 == maxWidth)\r\n return vec2(0.0);\r\n\r\n vec2 nearest = vec2(0.0, 0.0);\r\n for (int x = -1; x <= 1; x++)\r\n for (int y = -1; y <= 1; y++)\r\n if (0 != x || 0 != y)\r\n nearest = nearest + readEdgePixel(float(x), float(y));\r\n\r\n nearest = nearest * vec2(float(hiliteWidth > 0.0), float(emphWidth > 0.0));\r\n\r\n if ((0.0 == nearest.x && hiliteWidth > 1.0) || (0.0 == nearest.y && emphWidth > 1.0)) {\r\n vec2 farthest = vec2(0.0, 0.0);\r\n for (int i = -2; i <= 2; i++) {\r\n float f = float(i);\r\n farthest = farthest + readEdgePixel(f, -2.0) + readEdgePixel(-2.0, f) + readEdgePixel(f, 2.0) + readEdgePixel(2.0, f);\r\n }\r\n\r\n farthest = farthest * vec2(float(hiliteWidth > 1.0), float(emphWidth > 1.0));\r\n nearest = nearest + farthest;\r\n }\r\n\r\n return nearest;\r\n}\r\n`;\r\n\r\nconst computeOpaqueColor = `\r\nvec4 computeOpaqueColor() {\r\n vec4 opaque = TEXTURE(u_opaque, v_texCoord);\r\n opaque.rgb *= computeAmbientOcclusion();\r\n return opaque;\r\n}\r\n`;\r\n\r\nconst computeDefaultAmbientOcclusion = `\\nfloat computeAmbientOcclusion() { return 1.0; }\\n`;\r\nconst computeAmbientOcclusion = `\\nfloat computeAmbientOcclusion() { return TEXTURE(u_occlusion, v_texCoord).r; }\\n`;\r\n\r\nconst computeHiliteColor = \"\\nvec4 computeColor() { return computeOpaqueColor(); }\\n\";\r\n\r\nconst computeHiliteBaseColor = `\r\n vec4 baseColor = computeColor();\r\n vec2 flags = TEXTURE(u_hilite, v_texCoord).rg;\r\n vec2 outline = computeNearbyHilites();\r\n if (u_hilite_width.y < u_hilite_width.x) { // check for emphasis outline first if it is thinner\r\n if (outline.y > 0.0 && flags.y == 0.0)\r\n return vec4(u_hilite_settings[1], 1.0);\r\n if (outline.x > 0.0 && flags.x == 0.0)\r\n return vec4(u_hilite_settings[0], 1.0);\r\n } else {\r\n if (outline.x > 0.0 && flags.x == 0.0)\r\n return vec4(u_hilite_settings[0], 1.0);\r\n if (outline.y > 0.0 && flags.y == 0.0)\r\n return vec4(u_hilite_settings[1], 1.0);\r\n }\r\n float hiliteMix = flags.x * u_hilite_settings[2][0];\r\n float emphasisMix = flags.y * u_hilite_settings[2][1];\r\n baseColor.rgb *= (1.0 - (hiliteMix + emphasisMix));\r\n baseColor.rgb += u_hilite_settings[0] * hiliteMix;\r\n baseColor.rgb += u_hilite_settings[1] * emphasisMix;\r\n return baseColor;\r\n`;\r\n\r\nconst computeTranslucentColor = `\r\nvec4 computeColor() {\r\n vec4 opaque = computeOpaqueColor();\r\n vec4 accum = TEXTURE(u_accumulation, v_texCoord);\r\n float r = TEXTURE(u_revealage, v_texCoord).r;\r\n\r\n vec4 transparent = vec4(accum.rgb / clamp(r, 1e-4, 5e4), accum.a);\r\n vec4 col = (1.0 - transparent.a) * transparent + transparent.a * opaque;\r\n return col;\r\n}\r\n`;\r\n\r\nconst computeTranslucentBaseColor = \"return computeColor();\";\r\nconst computeAmbientOcclusionBaseColor = \"return computeOpaqueColor();\";\r\n\r\n/** @internal */\r\nexport function createCompositeProgram(flags: CompositeFlags, context: WebGL2RenderingContext): ShaderProgram {\r\n assert(CompositeFlags.None !== flags);\r\n\r\n const wantHilite = CompositeFlags.None !== (flags & CompositeFlags.Hilite);\r\n const wantTranslucent = CompositeFlags.None !== (flags & CompositeFlags.Translucent);\r\n const wantOcclusion = CompositeFlags.None !== (flags & CompositeFlags.AmbientOcclusion);\r\n\r\n const builder = createViewportQuadBuilder(true);\r\n const frag = builder.frag;\r\n\r\n frag.addFunction(wantOcclusion ? computeAmbientOcclusion : computeDefaultAmbientOcclusion);\r\n frag.addFunction(computeOpaqueColor);\r\n\r\n frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\r\n frag.addUniform(\"u_opaque\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_opaque\", (uniform, params) => {\r\n Texture2DHandle.bindSampler(uniform, (params.geometry as CompositeGeometry).opaque, TextureUnit.Zero);\r\n });\r\n });\r\n\r\n if (wantHilite) {\r\n addHiliteSettings(frag);\r\n addWindowToTexCoords(frag);\r\n frag.addFunction(readEdgePixel);\r\n frag.addFunction(computeNearbyHilites);\r\n\r\n frag.addUniform(\"u_hilite\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_hilite\", (uniform, params) => {\r\n Texture2DHandle.bindSampler(uniform, (params.geometry as CompositeGeometry).hilite, TextureUnit.Three);\r\n });\r\n });\r\n\r\n frag.set(FragmentShaderComponent.ComputeBaseColor, computeHiliteBaseColor);\r\n if (!wantTranslucent) {\r\n frag.addFunction(computeHiliteColor);\r\n }\r\n }\r\n\r\n if (wantTranslucent) {\r\n frag.addUniform(\"u_accumulation\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_accumulation\", (uniform, params) => {\r\n Texture2DHandle.bindSampler(uniform, (params.geometry as CompositeGeometry).accum, TextureUnit.One);\r\n });\r\n });\r\n\r\n frag.addUniform(\"u_revealage\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_revealage\", (uniform, params) => {\r\n Texture2DHandle.bindSampler(uniform, (params.geometry as CompositeGeometry).reveal, TextureUnit.Two);\r\n });\r\n });\r\n\r\n frag.addFunction(computeTranslucentColor);\r\n if (!wantHilite) {\r\n frag.set(FragmentShaderComponent.ComputeBaseColor, computeTranslucentBaseColor);\r\n }\r\n }\r\n\r\n if (wantOcclusion) {\r\n frag.addUniform(\"u_occlusion\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_occlusion\", (uniform, params) => {\r\n Texture2DHandle.bindSampler(uniform, (params.geometry as CompositeGeometry).occlusion!, TextureUnit.Four);\r\n });\r\n });\r\n\r\n if (!wantHilite && !wantTranslucent)\r\n frag.set(FragmentShaderComponent.ComputeBaseColor, computeAmbientOcclusionBaseColor);\r\n }\r\n\r\n const flagString = (wantHilite ? \"-Hilite\" : \"\") + (wantTranslucent ? \"-Translucent\" : \"\") + (wantOcclusion ? \"-Occlusion\" : \"\");\r\n builder.vert.headerComment = `//!V! CombineTextures${flagString}`;\r\n builder.frag.headerComment = `//!F! CombineTextures${flagString}`;\r\n\r\n return builder.buildProgram(context);\r\n}\r\n"]}
1
+ {"version":3,"file":"Composite.js","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/Composite.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { CompositeGeometry } from \"../CachedGeometry\";\r\nimport { CompositeFlags, TextureUnit } from \"../RenderFlags\";\r\nimport { FragmentShaderBuilder, FragmentShaderComponent, VariableType } from \"../ShaderBuilder\";\r\nimport { ShaderProgram } from \"../ShaderProgram\";\r\nimport { Texture2DHandle } from \"../Texture\";\r\nimport { addWindowToTexCoords, assignFragColor } from \"./Fragment\";\r\nimport { createViewportQuadBuilder } from \"./ViewportQuad\";\r\n\r\nfunction addHiliteSettings(frag: FragmentShaderBuilder): void {\r\n frag.addUniform(\"u_hilite_settings\", VariableType.Mat3, (prog) => {\r\n prog.addProgramUniform(\"u_hilite_settings\", (uniform, params) => {\r\n params.target.uniforms.hilite.bindCompositeSettings(uniform);\r\n });\r\n });\r\n\r\n frag.addUniform(\"u_hilite_width\", VariableType.Vec2, (prog) => {\r\n prog.addProgramUniform(\"u_hilite_width\", (uniform, params) => {\r\n params.target.uniforms.hilite.bindCompositeWidths(uniform);\r\n });\r\n });\r\n}\r\n\r\nconst readEdgePixel = `\r\nvec2 readEdgePixel(float xOffset, float yOffset) {\r\n vec2 t = windowCoordsToTexCoords(gl_FragCoord.xy + vec2(xOffset, yOffset));\r\n return TEXTURE(u_hilite, t).xy;\r\n}\r\n`;\r\n\r\nconst computeNearbyHilites = `\r\nvec2 computeNearbyHilites() {\r\n float hiliteWidth = u_hilite_width.x;\r\n float emphWidth = u_hilite_width.y;\r\n float maxWidth = max(hiliteWidth, emphWidth);\r\n if (0.0 == maxWidth)\r\n return vec2(0.0);\r\n\r\n vec2 nearest = vec2(0.0, 0.0);\r\n for (int x = -1; x <= 1; x++)\r\n for (int y = -1; y <= 1; y++)\r\n if (0 != x || 0 != y)\r\n nearest = nearest + readEdgePixel(float(x), float(y));\r\n\r\n nearest = nearest * vec2(float(hiliteWidth > 0.0), float(emphWidth > 0.0));\r\n\r\n if ((0.0 == nearest.x && hiliteWidth > 1.0) || (0.0 == nearest.y && emphWidth > 1.0)) {\r\n vec2 farthest = vec2(0.0, 0.0);\r\n for (int i = -2; i <= 2; i++) {\r\n float f = float(i);\r\n farthest = farthest + readEdgePixel(f, -2.0) + readEdgePixel(-2.0, f) + readEdgePixel(f, 2.0) + readEdgePixel(2.0, f);\r\n }\r\n\r\n farthest = farthest * vec2(float(hiliteWidth > 1.0), float(emphWidth > 1.0));\r\n nearest = nearest + farthest;\r\n }\r\n\r\n return nearest;\r\n}\r\n`;\r\n\r\nconst computeOpaqueColor = `\r\nvec4 computeOpaqueColor() {\r\n vec4 opaque = TEXTURE(u_opaque, v_texCoord);\r\n opaque.rgb *= computeAmbientOcclusion();\r\n return opaque;\r\n}\r\n`;\r\n\r\nconst computeDefaultAmbientOcclusion = `\\nfloat computeAmbientOcclusion() { return 1.0; }\\n`;\r\nconst computeAmbientOcclusion = `\\nfloat computeAmbientOcclusion() { return TEXTURE(u_occlusion, v_texCoord).r; }\\n`;\r\n\r\nconst computeHiliteColor = \"\\nvec4 computeColor() { return computeOpaqueColor(); }\\n\";\r\n\r\nconst computeHiliteBaseColor = `\r\n vec4 baseColor = computeColor();\r\n vec2 flags = TEXTURE(u_hilite, v_texCoord).rg;\r\n vec2 outline = computeNearbyHilites();\r\n if (u_hilite_width.y < u_hilite_width.x) { // check for emphasis outline first if it is thinner\r\n if (outline.y > 0.0 && flags.y == 0.0)\r\n return vec4(u_hilite_settings[1], 1.0);\r\n if (outline.x > 0.0 && flags.x == 0.0)\r\n return vec4(u_hilite_settings[0], 1.0);\r\n } else {\r\n if (outline.x > 0.0 && flags.x == 0.0)\r\n return vec4(u_hilite_settings[0], 1.0);\r\n if (outline.y > 0.0 && flags.y == 0.0)\r\n return vec4(u_hilite_settings[1], 1.0);\r\n }\r\n float hiliteMix = flags.x * u_hilite_settings[2][0];\r\n float emphasisMix = flags.y * u_hilite_settings[2][1];\r\n baseColor.rgb *= (1.0 - (hiliteMix + emphasisMix));\r\n baseColor.rgb += u_hilite_settings[0] * hiliteMix;\r\n baseColor.rgb += u_hilite_settings[1] * emphasisMix;\r\n return baseColor;\r\n`;\r\n\r\nconst computeTranslucentColor = `\r\nvec4 computeColor() {\r\n vec4 opaque = computeOpaqueColor();\r\n vec4 accum = TEXTURE(u_accumulation, v_texCoord);\r\n vec2 rg = TEXTURE(u_revealage, v_texCoord).rg;\r\n\r\n vec4 transparent = vec4(accum.rgb / clamp(rg.r, 1e-4, 5e4), accum.a);\r\n vec4 col = mix((1.0 - transparent.a) * transparent + transparent.a * opaque, vec4(u_clipIntersection.rgb, 1.0), rg.g);\r\n return col;\r\n}\r\n`;\r\n\r\nconst computeTranslucentBaseColor = \"return computeColor();\";\r\nconst computeAmbientOcclusionBaseColor = \"return computeOpaqueColor();\";\r\n\r\n/** @internal */\r\nexport function createCompositeProgram(flags: CompositeFlags, context: WebGL2RenderingContext): ShaderProgram {\r\n assert(CompositeFlags.None !== flags);\r\n\r\n const wantHilite = CompositeFlags.None !== (flags & CompositeFlags.Hilite);\r\n const wantTranslucent = CompositeFlags.None !== (flags & CompositeFlags.Translucent);\r\n const wantOcclusion = CompositeFlags.None !== (flags & CompositeFlags.AmbientOcclusion);\r\n\r\n const builder = createViewportQuadBuilder(true);\r\n const frag = builder.frag;\r\n\r\n frag.addFunction(wantOcclusion ? computeAmbientOcclusion : computeDefaultAmbientOcclusion);\r\n frag.addFunction(computeOpaqueColor);\r\n\r\n frag.set(FragmentShaderComponent.AssignFragData, assignFragColor);\r\n frag.addUniform(\"u_opaque\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_opaque\", (uniform, params) => {\r\n Texture2DHandle.bindSampler(uniform, (params.geometry as CompositeGeometry).opaque, TextureUnit.Zero);\r\n });\r\n });\r\n\r\n if (wantHilite) {\r\n addHiliteSettings(frag);\r\n addWindowToTexCoords(frag);\r\n frag.addFunction(readEdgePixel);\r\n frag.addFunction(computeNearbyHilites);\r\n\r\n frag.addUniform(\"u_hilite\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_hilite\", (uniform, params) => {\r\n Texture2DHandle.bindSampler(uniform, (params.geometry as CompositeGeometry).hilite, TextureUnit.Three);\r\n });\r\n });\r\n\r\n frag.set(FragmentShaderComponent.ComputeBaseColor, computeHiliteBaseColor);\r\n if (!wantTranslucent) {\r\n frag.addFunction(computeHiliteColor);\r\n }\r\n }\r\n\r\n if (wantTranslucent) {\r\n frag.addUniform(\"u_accumulation\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_accumulation\", (uniform, params) => {\r\n Texture2DHandle.bindSampler(uniform, (params.geometry as CompositeGeometry).accum, TextureUnit.One);\r\n });\r\n });\r\n\r\n frag.addUniform(\"u_revealage\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_revealage\", (uniform, params) => {\r\n Texture2DHandle.bindSampler(uniform, (params.geometry as CompositeGeometry).reveal, TextureUnit.Two);\r\n });\r\n });\r\n\r\n builder.frag.addUniform(\"u_clipIntersection\", VariableType.Vec4, (program) => {\r\n program.addGraphicUniform(\"u_clipIntersection\", (uniform, params) => {\r\n params.target.uniforms.branch.clipStack.intersectionStyle.bind(uniform);\r\n });\r\n });\r\n\r\n frag.addFunction(computeTranslucentColor);\r\n if (!wantHilite) {\r\n frag.set(FragmentShaderComponent.ComputeBaseColor, computeTranslucentBaseColor);\r\n }\r\n }\r\n\r\n if (wantOcclusion) {\r\n frag.addUniform(\"u_occlusion\", VariableType.Sampler2D, (prog) => {\r\n prog.addGraphicUniform(\"u_occlusion\", (uniform, params) => {\r\n Texture2DHandle.bindSampler(uniform, (params.geometry as CompositeGeometry).occlusion!, TextureUnit.Four);\r\n });\r\n });\r\n\r\n if (!wantHilite && !wantTranslucent)\r\n frag.set(FragmentShaderComponent.ComputeBaseColor, computeAmbientOcclusionBaseColor);\r\n }\r\n\r\n const flagString = (wantHilite ? \"-Hilite\" : \"\") + (wantTranslucent ? \"-Translucent\" : \"\") + (wantOcclusion ? \"-Occlusion\" : \"\");\r\n builder.vert.headerComment = `//!V! CombineTextures${flagString}`;\r\n builder.frag.headerComment = `//!F! CombineTextures${flagString}`;\r\n\r\n return builder.buildProgram(context);\r\n}\r\n"]}
@@ -27,6 +27,7 @@ export declare const readDepthAndOrder = "\nvec2 readDepthAndOrder(vec2 tc) {\n
27
27
  export declare function addRenderOrderConstants(builder: ShaderBuilder): void;
28
28
  /** @internal */
29
29
  export declare function addRenderOrder(builder: ShaderBuilder): void;
30
+ export declare function addPixelWidthFactor(builder: ShaderBuilder): void;
30
31
  /** @internal */
31
32
  export declare function addFeatureId(builder: ProgramBuilder, computeInFrag: boolean): void;
32
33
  /** @internal */
@@ -1 +1 @@
1
- {"version":3,"file":"FeatureSymbology.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/FeatureSymbology.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EACL,qBAAqB,EAA2B,cAAc,EAAE,aAAa,EAE9E,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAUhE,gBAAgB;AAChB,0BAAkB,uBAAuB;IACvC,IAAI,IAAI;IACR,MAAM,IAAS;IACf,QAAQ,IAAS;IACjB,YAAY,IAAS;IACrB,KAAK,IAAS;IACd,KAAK,KAAS;IAEd,OAAO,KAA+B;IACtC,KAAK,KAAwC;IAC7C,MAAM,KAAmD;CAC1D;AAED,gBAAgB;AAChB,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAehE;AAmOD,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAIxD;AA6DD,gBAAgB;AAChB,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,GAAE,OAAe,GAAG,IAAI,CAG5F;AAED,gBAAgB;AAChB,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,GAAE,OAAe,GAAG,IAAI,CAkBrF;AAkBD,gBAAgB;AAChB,eAAO,MAAM,iBAAiB,yLAM7B,CAAC;AAuEF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,aAAa,QAa7D;AAED,gBAAgB;AAChB,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,QAOpD;AAwBD,gBAAgB;AAChB,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,QAiB3E;AASD,gBAAgB;AAChB,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,QA4D/E;AA4DD,eAAO,MAAM,eAAe,sOAIzB,CAAC;AAwCJ,gBAAgB;AAChB,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAIpE;AAoBD,gBAAgB;AAChB,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAoBnH;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAW/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,OAAO,GAAG,IAAI,CA0ClG"}
1
+ {"version":3,"file":"FeatureSymbology.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/FeatureSymbology.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EACL,qBAAqB,EAA2B,cAAc,EAAE,aAAa,EAE9E,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAUhE,gBAAgB;AAChB,0BAAkB,uBAAuB;IACvC,IAAI,IAAI;IACR,MAAM,IAAS;IACf,QAAQ,IAAS;IACjB,YAAY,IAAS;IACrB,KAAK,IAAS;IACd,KAAK,KAAS;IAEd,OAAO,KAA+B;IACtC,KAAK,KAAwC;IAC7C,MAAM,KAAmD;CAC1D;AAED,gBAAgB;AAChB,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAehE;AAmOD,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAIxD;AA6DD,gBAAgB;AAChB,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,GAAE,OAAe,GAAG,IAAI,CAG5F;AAED,gBAAgB;AAChB,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,GAAE,OAAe,GAAG,IAAI,CAkBrF;AAkBD,gBAAgB;AAChB,eAAO,MAAM,iBAAiB,yLAM7B,CAAC;AAuEF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,aAAa,QAa7D;AAED,gBAAgB;AAChB,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,QAOpD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,QAMzD;AAgBD,gBAAgB;AAChB,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,QAiB3E;AASD,gBAAgB;AAChB,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,QA4D/E;AA4DD,eAAO,MAAM,eAAe,sOAIzB,CAAC;AAwCJ,gBAAgB;AAChB,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAIpE;AAoBD,gBAAgB;AAChB,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAoBnH;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAW/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,OAAO,GAAG,IAAI,CA0ClG"}
@@ -7,7 +7,7 @@
7
7
  * @module WebGL
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.addUniformFeatureSymbology = exports.addUniformHiliter = exports.addFeatureSymbology = exports.addClassifierFlash = exports.mixFeatureColor = exports.addSurfaceDiscard = exports.addFeatureId = exports.addRenderOrder = exports.addRenderOrderConstants = exports.readDepthAndOrder = exports.addHiliter = exports.addSurfaceHiliter = exports.addMaxAlpha = exports.addOvrFlagConstants = void 0;
10
+ exports.addUniformFeatureSymbology = exports.addUniformHiliter = exports.addFeatureSymbology = exports.addClassifierFlash = exports.mixFeatureColor = exports.addSurfaceDiscard = exports.addFeatureId = exports.addPixelWidthFactor = exports.addRenderOrder = exports.addRenderOrderConstants = exports.readDepthAndOrder = exports.addHiliter = exports.addSurfaceHiliter = exports.addMaxAlpha = exports.addOvrFlagConstants = void 0;
11
11
  const core_bentley_1 = require("@itwin/core-bentley");
12
12
  const RenderFlags_1 = require("../RenderFlags");
13
13
  const Common_1 = require("./Common");
@@ -424,6 +424,7 @@ function addPixelWidthFactor(builder) {
424
424
  });
425
425
  });
426
426
  }
427
+ exports.addPixelWidthFactor = addPixelWidthFactor;
427
428
  function addBatchId(builder) {
428
429
  builder.addUniform("u_batch_id", 5 /* VariableType.Vec4 */, (prog) => {
429
430
  prog.addGraphicUniform("u_batch_id", (uniform, params) => {