@itwin/core-frontend 4.3.0-dev.8 → 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 +79 -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
@@ -1 +1 @@
1
- {"version":3,"file":"ShaderBuilder.js","sourceRoot":"","sources":["../../../../src/render/webgl/ShaderBuilder.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 { AttributeDetails } from \"./AttributeMap\";\r\nimport { addInstancedModelMatrixRTC } from \"./glsl/Instancing\";\r\nimport { volClassOpaqueColor } from \"./glsl/PlanarClassification\";\r\nimport { addPosition, earlyVertexDiscard, lateVertexDiscard, vertexDiscard } from \"./glsl/Vertex\";\r\nimport { ShaderProgram } from \"./ShaderProgram\";\r\nimport { PositionType } from \"./TechniqueFlags\";\r\n\r\n/* eslint-disable no-restricted-syntax */\r\n\r\n/** Describes the data type of a shader program variable.\r\n * @internal\r\n */\r\nexport const enum VariableType {\r\n Boolean, // bool\r\n Int, // int\r\n Float, // float\r\n Vec2, // vec2\r\n Vec3, // vec3\r\n Vec4, // vec4\r\n Mat3, // mat3\r\n Mat4, // mat4\r\n Sampler2D, // sampler2D\r\n SamplerCube, // samplerCube\r\n Uint, // uint\r\n\r\n COUNT,\r\n}\r\n\r\n/** Describes the qualifier associated with a shader program variable.\r\n * @internal\r\n */\r\nexport const enum VariableScope {\r\n Global, // no qualifier\r\n Varying, // varying\r\n Uniform, // uniform\r\n\r\n COUNT,\r\n}\r\n\r\n/** Describes the declared or undeclared precision of a shader program variable.\r\n * @internal\r\n */\r\nexport const enum VariablePrecision {\r\n Default, // undeclared precision - variable uses the explicit or implicit precision default for its type\r\n Low, // lowp\r\n Medium, // mediump\r\n High, // highp\r\n\r\n COUNT,\r\n}\r\n\r\n/** @internal */\r\nnamespace Convert {\r\n export function typeToString(type: VariableType): string {\r\n switch (type) {\r\n case VariableType.Boolean: return \"bool\";\r\n case VariableType.Int: return \"int\";\r\n case VariableType.Float: return \"float\";\r\n case VariableType.Vec2: return \"vec2\";\r\n case VariableType.Vec3: return \"vec3\";\r\n case VariableType.Vec4: return \"vec4\";\r\n case VariableType.Mat3: return \"mat3\";\r\n case VariableType.Mat4: return \"mat4\";\r\n case VariableType.Sampler2D: return \"sampler2D\";\r\n case VariableType.SamplerCube: return \"samplerCube\";\r\n case VariableType.Uint: return \"uint\";\r\n default:\r\n assert(false);\r\n return \"undefined\";\r\n }\r\n }\r\n\r\n export function scopeToString(scope: VariableScope, isVertexShader: boolean): string {\r\n switch (scope) {\r\n case VariableScope.Global: return \"\";\r\n case VariableScope.Varying: return (isVertexShader ? \"out\" : \"in\");\r\n case VariableScope.Uniform: return \"uniform\";\r\n default:\r\n assert(false);\r\n return \"undefined\";\r\n }\r\n }\r\n\r\n export function precisionToString(precision: VariablePrecision): string {\r\n switch (precision) {\r\n case VariablePrecision.Default: return \"\";\r\n case VariablePrecision.Low: return \"lowp\";\r\n case VariablePrecision.Medium: return \"mediump\";\r\n case VariablePrecision.High: return \"highp\";\r\n default:\r\n assert(false);\r\n return \"undefined\";\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Function invoked by ShaderVariable::AddBinding() to bind the variable to the compiled program.\r\n * The implementation should call ShaderProgram::AddShaderUniform or ShaderProgram::AddGraphicUniform/Attribute to register a function\r\n * which can be used to bind the value of the variable when program is used.\r\n * @internal\r\n */\r\nexport type AddVariableBinding = (prog: ShaderProgram) => void;\r\n\r\n/** Represents a variable within a fragment or vertex shader.\r\n * @internal\r\n */\r\nexport class ShaderVariable {\r\n private readonly _addBinding?: AddVariableBinding;\r\n public readonly name: string;\r\n public readonly value?: string; // for global variables only\r\n public readonly type: VariableType;\r\n public readonly scope: VariableScope;\r\n public readonly precision: VariablePrecision;\r\n public readonly isConst: boolean = false; // for global variables only\r\n public readonly length: number; // for uniform arrays only\r\n\r\n private constructor(name: string, type: VariableType, scope: VariableScope, precision: VariablePrecision, isConst: boolean, addBinding?: AddVariableBinding, value?: string, length: number = 0) {\r\n this._addBinding = addBinding;\r\n this.name = name;\r\n this.value = value;\r\n this.type = type;\r\n this.scope = scope;\r\n this.precision = precision;\r\n this.isConst = isConst;\r\n this.length = length;\r\n }\r\n\r\n public static create(name: string, type: VariableType, scope: VariableScope, addBinding?: AddVariableBinding, precision: VariablePrecision = VariablePrecision.Default): ShaderVariable {\r\n return new ShaderVariable(name, type, scope, precision, false, addBinding, undefined);\r\n }\r\n\r\n public static createArray(name: string, type: VariableType, length: number, scope: VariableScope, addBinding?: AddVariableBinding, precision: VariablePrecision = VariablePrecision.Default): ShaderVariable {\r\n return new ShaderVariable(name, type, scope, precision, false, addBinding, undefined, length);\r\n }\r\n\r\n public static createGlobal(name: string, type: VariableType, value?: string, isConst: boolean = false) {\r\n return new ShaderVariable(name, type, VariableScope.Global, VariablePrecision.Default, isConst, undefined, value);\r\n }\r\n\r\n public get hasBinding(): boolean { return undefined !== this._addBinding; }\r\n public addBinding(prog: ShaderProgram) {\r\n if (undefined !== this._addBinding)\r\n this._addBinding(prog);\r\n }\r\n\r\n public get typeName(): string { return Convert.typeToString(this.type); }\r\n public getScopeName(isVertexShader: boolean): string { return Convert.scopeToString(this.scope, isVertexShader); }\r\n public get precisionName(): string { return Convert.precisionToString(this.precision); }\r\n\r\n /** Constructs the single-line declaration of this variable */\r\n public buildDeclaration(isVertexShader: boolean): string {\r\n const parts = new Array<string>();\r\n if (this.isConst)\r\n parts.push(\"const\");\r\n\r\n const scopeName = this.getScopeName(isVertexShader);\r\n if (0 < scopeName.length)\r\n parts.push(scopeName);\r\n\r\n const precisionName = this.precisionName;\r\n if (0 < precisionName.length)\r\n parts.push(precisionName);\r\n\r\n parts.push(this.typeName);\r\n\r\n if (this.length > 0)\r\n parts.push(`${this.name}[${this.length.toFixed(0)}]`);\r\n else\r\n parts.push(this.name);\r\n\r\n if (undefined !== this.value && 0 < this.value.length) {\r\n parts.push(\"=\");\r\n parts.push(this.value);\r\n }\r\n\r\n return `${parts.join(\" \")};`;\r\n }\r\n}\r\n\r\n/**\r\n * Represents the set of variables defined and used within a fragment or vertex shader.\r\n * If the same variable is used in both the fragment and vertex shader (e.g., a varying variable), it should be defined in both ShaderBuilders' ShaderVariables object.\r\n * @internal\r\n */\r\nexport class ShaderVariables {\r\n protected _list: ShaderVariable[] = new Array<ShaderVariable>();\r\n\r\n /** Find an existing variable with the specified name */\r\n public find(name: string): ShaderVariable | undefined { return this._list.find((v: ShaderVariable) => v.name === name); }\r\n\r\n /** Add a new variable, if a variable with the same name does not already exist. return true if added */\r\n public addVariable(v: ShaderVariable): boolean {\r\n const found = this.find(v.name);\r\n if (undefined !== found) {\r\n assert(found.type === v.type);\r\n // assume same binding etc...\r\n return false;\r\n } else {\r\n this._list.push(v);\r\n return true;\r\n }\r\n }\r\n\r\n public addUniform(name: string, type: VariableType, binding: AddVariableBinding, precision: VariablePrecision = VariablePrecision.Default) {\r\n this.addVariable(ShaderVariable.create(name, type, VariableScope.Uniform, binding, precision));\r\n }\r\n\r\n public addVarying(name: string, type: VariableType): boolean {\r\n return this.addVariable(ShaderVariable.create(name, type, VariableScope.Varying));\r\n }\r\n\r\n public addGlobal(name: string, type: VariableType, value?: string, isConst: boolean = false) {\r\n this.addVariable(ShaderVariable.createGlobal(name, type, value, isConst));\r\n }\r\n\r\n public addConstant(name: string, type: VariableType, value: string) {\r\n this.addGlobal(name, type, value, true);\r\n }\r\n\r\n public addBitFlagConstant(name: string, value: number) {\r\n this.addGlobal(name, VariableType.Uint, `${(2 ** value).toFixed(0)}u`, true);\r\n }\r\n\r\n /** Constructs the lines of glsl code declaring the variables of a certain scope. */\r\n public buildScopeDeclarations(isVertexShader: boolean, scope: VariableScope, constants?: boolean): string {\r\n let decls = \"\";\r\n for (const v of this._list) {\r\n if (scope === v.scope && (undefined === constants ? true : v.isConst === constants))\r\n decls += `${v.buildDeclaration(isVertexShader)}\\n`;\r\n }\r\n\r\n return decls;\r\n }\r\n\r\n /** Constructs the lines of glsl code declaring all of the variables. */\r\n public buildDeclarations(isVertexShader: boolean): string {\r\n let decls = \"\";\r\n if (isVertexShader) {\r\n decls += this.buildScopeDeclarations(isVertexShader, VariableScope.Uniform);\r\n decls += this.buildScopeDeclarations(isVertexShader, VariableScope.Global, true);\r\n decls += this.buildScopeDeclarations(isVertexShader, VariableScope.Global, false);\r\n decls += this.buildScopeDeclarations(isVertexShader, VariableScope.Varying);\r\n } else {\r\n decls += this.buildScopeDeclarations(isVertexShader, VariableScope.Varying);\r\n decls += this.buildScopeDeclarations(isVertexShader, VariableScope.Uniform);\r\n decls += this.buildScopeDeclarations(isVertexShader, VariableScope.Global, true);\r\n decls += this.buildScopeDeclarations(isVertexShader, VariableScope.Global, false);\r\n }\r\n return decls;\r\n }\r\n\r\n /**\r\n * For every uniform and attribute variable not contained in the optional 'predefined' list, invokes the associated binding function\r\n * to add the corresponding Uniform or Attribute object to the ShaderProgram.\r\n */\r\n public addBindings(prog: ShaderProgram, predefined?: ShaderVariables): void {\r\n for (const v of this._list) {\r\n // Some variables exist in both frag and vert shaders - only add them to the program once.\r\n if (v.hasBinding && (undefined === predefined || undefined === predefined.find(v.name))) {\r\n v.addBinding(prog);\r\n }\r\n }\r\n }\r\n\r\n public get length(): number { return this._list.length; }\r\n\r\n private findSlot(variableSize: number, loopSize: number, registers: number[]): number {\r\n // Find the first available slot into which to insert this variable\r\n for (let i = 0; i < loopSize; i++) {\r\n const newSize = registers[i] + variableSize;\r\n if (newSize <= 4) {\r\n registers[i] = newSize;\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n // Return string of varying types with their theoretical slot numbers\r\n public checkMaxVaryingVectors(fragSource: string): string {\r\n // Varyings go into a matrix of 4 columns and GL_MAX_VARYING_VECTORS rows of floats.\r\n // The packing rules are defined by the standard. Specifically each row can contain one of:\r\n // vec4\r\n // vec3 (+ float)\r\n // vec2 (+ vec2)\r\n // vec2 (+ float (+ float))\r\n // float (+ float (+ float (+ float)))\r\n // Varyings are packed in order of size from largest to smallest\r\n const loopSize = 64;\r\n const registers = Array(loopSize + 1).fill(0);\r\n let outStr = \"\";\r\n let slot = 0;\r\n\r\n const varyings = this._list.filter((variable) => VariableScope.Varying === variable.scope);\r\n // Add in any built in vars that count as varyings if they are used\r\n if (fragSource.includes(\"gl_FragCoord\")) {\r\n varyings.push(ShaderVariable.create(\"gl_FragCoord\", VariableType.Vec4, VariableScope.Varying));\r\n }\r\n if (fragSource.includes(\"gl_PointCoord\")) {\r\n varyings.push(ShaderVariable.create(\"gl_PointCoord\", VariableType.Vec2, VariableScope.Varying));\r\n }\r\n if (fragSource.includes(\"gl_FrontFacing\")) {\r\n varyings.push(ShaderVariable.create(\"gl_FrontFacing\", VariableType.Boolean, VariableScope.Varying));\r\n }\r\n // Need to process in size order (largest first)\r\n varyings.sort((a, b) => b.type - a.type); // this is good enough to sort by\r\n\r\n for (const variable of varyings) {\r\n let variableSize = 0;\r\n switch (variable.type) {\r\n case VariableType.Boolean:\r\n case VariableType.Int:\r\n case VariableType.Float:\r\n variableSize = 1;\r\n break;\r\n case VariableType.Vec2:\r\n variableSize = 2;\r\n break;\r\n case VariableType.Vec3:\r\n variableSize = 3;\r\n break;\r\n case VariableType.Vec4:\r\n variableSize = 4;\r\n break;\r\n default:\r\n assert(false, \"Invalid varying variable type\");\r\n continue;\r\n }\r\n slot = this.findSlot(variableSize, loopSize, registers);\r\n outStr += `// varying slot ${slot} ${Convert.typeToString(variable.type)} ${variable.name}\\n`;\r\n }\r\n const slotsUsed = registers.indexOf(0);\r\n registers.length = slotsUsed;\r\n outStr += `// Slots used: ${slotsUsed} [${registers.toString()}]\\n`;\r\n\r\n // debug output modes\r\n const outputAll = true; // false just outputs varyings that use more than 8\r\n if (outputAll) {\r\n return outStr;\r\n } else {\r\n if (slotsUsed > 8)\r\n return outStr;\r\n else\r\n return \"\";\r\n }\r\n }\r\n\r\n // Return the number of varying vectors used by the shader.\r\n // Varyings go into a matrix of 4 columns and GL_MAX_VARYING_VECTORS rows of floats.\r\n // The packing rules are defined by the standard. Specifically each row can contain one of:\r\n // vec4\r\n // vec3 (+ float)\r\n // vec2 (+ vec2)\r\n // vec2 (+ float (+ float))\r\n // float (+ float (+ float (+ float)))\r\n // Varyings are packed in order of size from largest to smallest\r\n public computeNumVaryingVectors(fragSource: string): number {\r\n const loopSize = 64;\r\n const registers = Array(loopSize + 1).fill(0);\r\n\r\n const varyings = this._list.filter((variable) => VariableScope.Varying === variable.scope);\r\n // Add in any built in vars that count as varyings if they are used\r\n if (fragSource.includes(\"gl_FragCoord\")) {\r\n varyings.push(ShaderVariable.create(\"gl_FragCoord\", VariableType.Vec4, VariableScope.Varying));\r\n }\r\n if (fragSource.includes(\"gl_PointCoord\")) {\r\n varyings.push(ShaderVariable.create(\"gl_PointCoord\", VariableType.Vec2, VariableScope.Varying));\r\n }\r\n if (fragSource.includes(\"gl_FrontFacing\")) {\r\n varyings.push(ShaderVariable.create(\"gl_FrontFacing\", VariableType.Boolean, VariableScope.Varying));\r\n }\r\n // Need to process in size order (largest first)\r\n varyings.sort((a, b) => b.type - a.type); // this is good enough to sort by\r\n\r\n for (const variable of varyings) {\r\n if (VariableScope.Varying !== variable.scope)\r\n continue;\r\n\r\n let variableSize = 0;\r\n switch (variable.type) {\r\n case VariableType.Boolean:\r\n case VariableType.Int:\r\n case VariableType.Float:\r\n variableSize = 1;\r\n break;\r\n case VariableType.Vec2:\r\n variableSize = 2;\r\n break;\r\n case VariableType.Vec3:\r\n variableSize = 3;\r\n break;\r\n case VariableType.Vec4:\r\n variableSize = 4;\r\n break;\r\n default:\r\n assert(false, \"Invalid varying variable type\");\r\n continue;\r\n }\r\n\r\n this.findSlot(variableSize, loopSize, registers);\r\n }\r\n\r\n const slotsUsed = registers.indexOf(0);\r\n return slotsUsed;\r\n }\r\n}\r\n\r\n/** Convenience API for assembling glsl source code.\r\n * @internal\r\n */\r\nexport class SourceBuilder {\r\n public source: string = \"\";\r\n\r\n /* Append the specified string to the glsl source */\r\n public add(what: string): void { this.source += what; }\r\n\r\n /* Append a new-line to the glsl source */\r\n public newline(): void { this.add(\"\\n\"); }\r\n\r\n /* Append the specified string to the glsl source, followed by a new-line */\r\n public addline(what: string): void {\r\n this.add(what);\r\n this.newline();\r\n }\r\n\r\n /**\r\n * Construct a function definition given the function signature and body. For example:\r\n * buildFunctionDefinition(\"float average(float a, float b)\", \"\\n return (a + b) / 2.0;\\n\");\r\n * will produce:\r\n * \"float average(float a, float b) {\r\n * return (a + b) / 2.0;\r\n * }\"\r\n * For an inline function:\r\n * buildFunctionDefinition(\"float average(float a, float b)\", \"return (a + b) / 2.0;\");\r\n * will produce:\r\n * \"float average(float a, float b) { return (a + b) / 2.0; }\"\r\n */\r\n public static buildFunctionDefinition(declaration: string, implementation: string): string {\r\n // If implementation does not start with a newline then assume it is an inline function & add spaces between braces.\r\n if (\"\\n\" === implementation.charAt(0))\r\n return `${declaration} {${implementation}}\\n\\n`;\r\n else\r\n return `${declaration} { ${implementation} }\\n\\n`;\r\n }\r\n\r\n /** Constructs a function definition as described by buildFunctionDefinition() and appends it to the glsl source. */\r\n public addFunction(declaration: string, implementation: string): void { this.add(SourceBuilder.buildFunctionDefinition(declaration, implementation)); }\r\n\r\n /** Constructs the definition of the main() function using the supplied function body and appends it to the glsl source. */\r\n public addMain(implementation: string): void { this.addFunction(\"void main()\", implementation); }\r\n}\r\n\r\n/** @internal */\r\nexport interface ShaderBuilderFlags {\r\n /** If defined and true, the geometry is instanced. */\r\n readonly instanced?: boolean;\r\n /** If defined, indicates the vertex data comes from a texture and specifies whether the positions are quantized 16-bit integers or unquantized 32-bit floats. */\r\n readonly positionType?: PositionType;\r\n}\r\n\r\n/**\r\n * Represents a fragment or vertex shader under construction. The shader consists of a set of defined variables,\r\n * plus a set of code snippets which can be concatenated together to form the shader source.\r\n * @internal\r\n */\r\nexport class ShaderBuilder extends ShaderVariables {\r\n protected _components = new Array<string | undefined>();\r\n protected _functions: string[] = [];\r\n protected _extensions: string[] = [];\r\n protected _macros: string[] = [];\r\n protected _fragOutputs: string[] = [];\r\n protected _version: string = \"\";\r\n public headerComment: string = \"\";\r\n protected readonly _flags: ShaderBuilderFlags;\r\n protected _initializers: string[] = new Array<string>();\r\n\r\n public get usesInstancedGeometry(): boolean {\r\n return !!this._flags.instanced;\r\n }\r\n\r\n public addInitializer(initializer: string): void {\r\n if (-1 === this._initializers.indexOf(initializer))\r\n this._initializers.push(initializer);\r\n }\r\n\r\n protected constructor(maxComponents: number, flags: ShaderBuilderFlags) {\r\n super();\r\n this._components.length = maxComponents;\r\n this._flags = flags;\r\n this._version = \"#version 300 es\";\r\n this.addDefine(\"TEXTURE\", \"texture\");\r\n this.addDefine(\"TEXTURE_CUBE\", \"texture\");\r\n this.addDefine(\"TEXTURE_PROJ\", \"textureProj\");\r\n }\r\n\r\n protected addComponent(index: number, component: string): void {\r\n assert(index < this._components.length);\r\n\r\n // assume if caller is replacing an existing component, they know what they're doing...\r\n this._components[index] = component;\r\n }\r\n protected removeComponent(index: number) {\r\n assert(index < this._components.length);\r\n this._components[index] = undefined;\r\n }\r\n\r\n protected getComponent(index: number): string | undefined {\r\n assert(index < this._components.length);\r\n return this._components[index];\r\n }\r\n\r\n public addFunction(declarationOrFull: string, implementation?: string): void {\r\n let def = declarationOrFull;\r\n if (undefined !== implementation)\r\n def = SourceBuilder.buildFunctionDefinition(`\\n${declarationOrFull}`, implementation);\r\n\r\n if (undefined === this.findFunction(def))\r\n this._functions.push(def);\r\n }\r\n\r\n public replaceFunction(existing: string, replacement: string): boolean {\r\n const index = this._functions.indexOf(existing);\r\n if (-1 !== index) {\r\n this._functions[index] = replacement;\r\n }\r\n\r\n assert(-1 !== index);\r\n return -1 !== index;\r\n }\r\n\r\n public findFunction(func: string): string | undefined {\r\n return this._functions.find((f: string | undefined) => f === func);\r\n }\r\n\r\n public addExtension(extName: string): void {\r\n if (-1 === this._extensions.indexOf(extName))\r\n this._extensions.push(extName);\r\n }\r\n\r\n public addMacro(macro: string): void {\r\n if (-1 === this._macros.indexOf(macro))\r\n this._macros.push(macro);\r\n }\r\n\r\n public addDefine(name: string, value: string): void {\r\n const defineName = `#define ${name} `;\r\n const macro = defineName + value;\r\n\r\n const index = this._macros.findIndex((x) => x.startsWith(defineName));\r\n if (-1 !== index)\r\n this._macros[index] = macro;\r\n else\r\n this._macros.push(defineName + value);\r\n }\r\n\r\n public clearFragOutput(): void {\r\n while (this._fragOutputs.length > 0)\r\n this._fragOutputs.pop();\r\n }\r\n\r\n public addFragOutput(name: string, value: number): void {\r\n if (-1 === value) {\r\n this._fragOutputs.push(\"out vec4 FragColor;\");\r\n return;\r\n }\r\n this._fragOutputs.push(`layout(location = ${value}) out vec4 ${name};`);\r\n }\r\n\r\n protected buildPreludeCommon(attrMap: Map<string, AttributeDetails> | undefined, isVertexShader: boolean): SourceBuilder {\r\n const src = new SourceBuilder();\r\n\r\n // Version number (must be first thing for GLSL 300)\r\n src.addline(this._version);\r\n\r\n // Header comment\r\n src.newline();\r\n if (\"\" !== this.headerComment) {\r\n src.addline(this.headerComment);\r\n src.newline();\r\n }\r\n\r\n // Macros\r\n for (const macro of this._macros)\r\n src.addline(macro);\r\n\r\n // Extensions\r\n for (const ext of this._extensions)\r\n src.addline(`#extension ${ext} : enable`);\r\n\r\n // Default precisions\r\n src.addline(\"precision highp float;\");\r\n src.addline(\"precision highp int;\");\r\n src.newline();\r\n\r\n // Attribute declarations\r\n if (attrMap !== undefined) {\r\n attrMap.forEach((attr: AttributeDetails, key: string) => {\r\n src.addline(`in ${Convert.typeToString(attr.type)} ${key};`);\r\n });\r\n }\r\n\r\n // Variable declarations\r\n src.add(this.buildDeclarations(isVertexShader));\r\n\r\n // Layouts\r\n for (const layout of this._fragOutputs)\r\n src.addline(layout);\r\n\r\n // Functions\r\n for (const func of this._functions) {\r\n src.add(func);\r\n }\r\n\r\n if (!src.source.endsWith(\"\\n\\n\"))\r\n src.newline();\r\n\r\n return src;\r\n }\r\n\r\n protected copyCommon(src: ShaderBuilder): void {\r\n this._version = src._version;\r\n this.headerComment = src.headerComment;\r\n this._initializers = [...src._initializers];\r\n this._components = [...src._components];\r\n this._functions = [...src._functions];\r\n this._extensions = [...src._extensions];\r\n this._list = [...src._list];\r\n this._macros = [...src._macros];\r\n this._fragOutputs = [...src._fragOutputs];\r\n }\r\n}\r\n\r\n/** Describes the optional and required components which can be assembled into complete\r\n * @internal\r\n */\r\nexport const enum VertexShaderComponent {\r\n // (Optional) Compute the quantized position. By default this simply returns the `a_pos` attribute.\r\n // This runs before any initializers.\r\n // vec3 computeQuantizedPosition()\r\n ComputeQuantizedPosition,\r\n // (Optional) Adjust the result of computeVertexPosition().\r\n // vec4 adjustRawPosition(vec4 rawPosition)\r\n AdjustRawPosition,\r\n // (Optional) Return true to discard this vertex before evaluating feature overrides etc, given the model-space position.\r\n // bool checkForEarlyDiscard(vec4 rawPos)\r\n CheckForEarlyDiscard,\r\n // (Optional) Compute feature overrides like visibility, rgb, transparency, line weight.\r\n // void computeFeatureOverrides()\r\n ComputeFeatureOverrides,\r\n // (Optional) Compute material parameters.\r\n // void computeMaterial()\r\n ComputeMaterial,\r\n // (Optional) Compute the vertex's base color. Requires the program to have a `varying vec4 v_color`.\r\n // vec4 computeBaseColor()\r\n ComputeBaseColor,\r\n // (Optional - does nothing if ComputeBaseColor not specified) Apply material overrides to vertex color\r\n // vec4 applyMaterialColor(vec4 baseColor)\r\n ApplyMaterialColor,\r\n // (Optional - does nothing if ComputeBaseColor not specified) Apply feature overrides to vertex color\r\n // vec4 applyFeatureColor(vec4 baseColor)\r\n ApplyFeatureColor,\r\n // (Optional - does nothing if ComputeBaseColor not specified)) Adjust base color for contrast\r\n // vec4 adjustContrast(vec4 baseColor)\r\n AdjustContrast,\r\n // (Optional - does nothing if ComputeBaseColor not specified) Return true if this vertex should be \"discarded\" (is not visible)\r\n // bool checkForDiscard()\r\n // If this returns true, gl_Position will be set to 0; presumably related vertices will also do so, resulting in a degenerate triangle.\r\n // If this returns true, no further processing will be performed.\r\n CheckForDiscard,\r\n // (Required) Return this vertex's position in clip space.\r\n // vec4 computePosition(vec4 rawPos)\r\n ComputePosition,\r\n // (Optional) Compute all atmospheric scattering values in one pass and assign them to varyings (For Skybox and RealityMesh only)\r\n // void computeAtmosphericScatteringVaryings\r\n ComputeAtmosphericScatteringVaryings,\r\n // (Optional) After all output (varying) values have been computed, return true if this vertex should be discarded.\r\n // bool checkForLateDiscard()\r\n CheckForLateDiscard,\r\n // (Optional) Adjust the final position\r\n // vec4 adjustPosition(vec4 pos)\r\n FinalizePosition,\r\n\r\n COUNT,\r\n}\r\n\r\n/** Assembles the source code for a vertex shader from a set of modular components.\r\n * @internal\r\n */\r\nexport class VertexShaderBuilder extends ShaderBuilder {\r\n private _computedVarying: string[] = new Array<string>();\r\n\r\n private buildPrelude(attrMap?: Map<string, AttributeDetails>): SourceBuilder { return this.buildPreludeCommon(attrMap, true); }\r\n\r\n public constructor(flags: ShaderBuilderFlags = {}) {\r\n super(VertexShaderComponent.COUNT, flags);\r\n\r\n this.addDefine(\"MAT_NORM\", \"g_nmx\");\r\n if (this.usesInstancedGeometry) {\r\n addInstancedModelMatrixRTC(this);\r\n this.addDefine(\"MAT_MV\", \"g_mv\");\r\n this.addDefine(\"MAT_MVP\", \"g_mvp\");\r\n } else {\r\n this.addDefine(\"MAT_MV\", \"u_mv\");\r\n this.addDefine(\"MAT_MVP\", \"u_mvp\");\r\n }\r\n\r\n addPosition(this, this.usesVertexTable);\r\n }\r\n\r\n public get usesVertexTable(): boolean {\r\n return undefined !== this._flags.positionType;\r\n }\r\n\r\n public get positionType(): PositionType {\r\n assert(undefined !== this._flags.positionType);\r\n return this._flags.positionType;\r\n }\r\n\r\n public get(id: VertexShaderComponent): string | undefined { return this.getComponent(id); }\r\n public set(id: VertexShaderComponent, component: string) { this.addComponent(id, component); }\r\n public unset(id: VertexShaderComponent) { this.removeComponent(id); }\r\n\r\n public addComputedVarying(name: string, type: VariableType, computation: string): void {\r\n this.addVarying(name, type);\r\n this._computedVarying.push(computation);\r\n }\r\n\r\n public buildSource(attrMap?: Map<string, AttributeDetails>): string {\r\n const prelude = this.buildPrelude(attrMap);\r\n const main = new SourceBuilder();\r\n main.newline();\r\n\r\n const computePosition = this.get(VertexShaderComponent.ComputePosition);\r\n assert(undefined !== computePosition);\r\n if (undefined !== computePosition) {\r\n prelude.addFunction(\"vec4 computePosition(vec4 rawPos)\", computePosition);\r\n }\r\n\r\n const computeQPos = this.get(VertexShaderComponent.ComputeQuantizedPosition) ?? \"return a_pos;\";\r\n prelude.addFunction(\"vec3 computeQuantizedPosition()\", computeQPos);\r\n main.addline(\" vec3 qpos = computeQuantizedPosition();\");\r\n\r\n // Initialization logic that should occur at start of main() - primarily global variables whose values\r\n // are too complex to compute inline or which depend on uniforms and/or other globals.\r\n for (const init of this._initializers) {\r\n if (\"\\n\" === init.charAt(0))\r\n main.addline(` {${init} }\\n`);\r\n else\r\n main.addline(` { ${init} }\\n`);\r\n }\r\n\r\n main.addline(\" vec4 rawPosition = computeVertexPosition(qpos);\");\r\n const adjustRawPosition = this.get(VertexShaderComponent.AdjustRawPosition);\r\n if (undefined !== adjustRawPosition) {\r\n prelude.addFunction(\"vec4 adjustRawPosition(vec4 rawPos)\", adjustRawPosition);\r\n main.addline(\" rawPosition = adjustRawPosition(rawPosition);\");\r\n }\r\n\r\n const checkForEarlyDiscard = this.get(VertexShaderComponent.CheckForEarlyDiscard);\r\n if (undefined !== checkForEarlyDiscard) {\r\n prelude.addFunction(\"bool checkForEarlyDiscard(vec4 rawPos)\", checkForEarlyDiscard);\r\n main.add(earlyVertexDiscard);\r\n }\r\n\r\n const computeFeatureOverrides = this.get(VertexShaderComponent.ComputeFeatureOverrides);\r\n if (undefined !== computeFeatureOverrides) {\r\n prelude.addFunction(\"void computeFeatureOverrides()\", computeFeatureOverrides);\r\n main.addline(\" computeFeatureOverrides();\");\r\n }\r\n\r\n const computeMaterial = this.get(VertexShaderComponent.ComputeMaterial);\r\n if (undefined !== computeMaterial) {\r\n prelude.addFunction(\"void computeMaterial()\", computeMaterial);\r\n main.addline(\" computeMaterial();\");\r\n }\r\n\r\n const computeBaseColor = this.get(VertexShaderComponent.ComputeBaseColor);\r\n if (undefined !== computeBaseColor) {\r\n assert(undefined !== this.find(\"v_color\"));\r\n prelude.addFunction(\"vec4 computeBaseColor()\", computeBaseColor);\r\n main.addline(\" vec4 baseColor = computeBaseColor();\");\r\n\r\n const applyMaterialColor = this.get(VertexShaderComponent.ApplyMaterialColor);\r\n if (undefined !== applyMaterialColor) {\r\n prelude.addFunction(\"vec4 applyMaterialColor(vec4 baseColor)\", applyMaterialColor);\r\n main.addline(\" baseColor = applyMaterialColor(baseColor);\");\r\n }\r\n\r\n const applyFeatureColor = this.get(VertexShaderComponent.ApplyFeatureColor);\r\n if (undefined !== applyFeatureColor) {\r\n prelude.addFunction(\"vec4 applyFeatureColor(vec4 baseColor)\", applyFeatureColor);\r\n main.addline(\" baseColor = applyFeatureColor(baseColor);\");\r\n }\r\n\r\n const adjustContrast = this.get(VertexShaderComponent.AdjustContrast);\r\n if (adjustContrast) {\r\n prelude.addFunction(\"vec4 adjustContrast(vec4 baseColor)\", adjustContrast);\r\n main.addline(\" baseColor = adjustContrast(baseColor);\");\r\n }\r\n\r\n main.addline(\" v_color = baseColor;\");\r\n }\r\n\r\n const checkForDiscard = this.get(VertexShaderComponent.CheckForDiscard);\r\n if (undefined !== checkForDiscard) {\r\n prelude.addFunction(\"bool checkForDiscard()\", checkForDiscard);\r\n main.add(vertexDiscard);\r\n }\r\n\r\n main.addline(\" gl_Position = computePosition(rawPosition);\");\r\n\r\n const finalizePos = this.get(VertexShaderComponent.FinalizePosition);\r\n if (undefined !== finalizePos) {\r\n prelude.addFunction(\"vec4 finalizePosition(vec4 pos)\", finalizePos);\r\n main.addline(\" gl_Position = finalizePosition(gl_Position);\");\r\n }\r\n\r\n for (const comp of this._computedVarying) {\r\n main.addline(` ${comp}`);\r\n }\r\n\r\n const computeAtmosphericScatteringVaryings = this.get(VertexShaderComponent.ComputeAtmosphericScatteringVaryings);\r\n if (undefined !== computeAtmosphericScatteringVaryings) {\r\n prelude.addFunction(\"void computeAtmosphericScatteringVaryings()\", computeAtmosphericScatteringVaryings);\r\n main.addline(\" computeAtmosphericScatteringVaryings();\");\r\n }\r\n\r\n const checkForLateDiscard = this.get(VertexShaderComponent.CheckForLateDiscard);\r\n if (undefined !== checkForLateDiscard) {\r\n prelude.addFunction(\"bool checkForLateDiscard()\", checkForLateDiscard);\r\n main.addline(lateVertexDiscard);\r\n }\r\n\r\n prelude.addMain(main.source);\r\n return prelude.source;\r\n }\r\n\r\n public copyFrom(src: VertexShaderBuilder): void {\r\n this.copyCommon(src);\r\n this._computedVarying = [...src._computedVarying];\r\n }\r\n}\r\n\r\n/** Describes the optional and required components which can be assembled into complete\r\n * @internal\r\n */\r\nexport const enum FragmentShaderComponent {\r\n // (Optional) Return true to immediately discard this fragment.\r\n // bool checkForEarlyDiscard()\r\n CheckForEarlyDiscard,\r\n // (Required) Compute this fragment's base color\r\n // vec4 computeBaseColor()\r\n ComputeBaseColor,\r\n // (Optional) Apply material overrides to base color\r\n // vec4 applyMaterialOverrides(vec4 baseColor)\r\n ApplyMaterialOverrides,\r\n // (Optional) Adjust base color after material and/or feature overrides have been applied.\r\n // vec4 finalizeBaseColor(vec4 baseColor)\r\n FinalizeBaseColor,\r\n // (Optional) Return true if this fragment should be discarded\r\n // Do not invoke discard directly in your shader components - instead, return true from this function to generate a discard statement.\r\n // bool checkForDiscard(vec4 baseColor)\r\n CheckForDiscard,\r\n // (Optional) Return true if the alpha value is not suitable for the current render pass\r\n // bool discardByAlpha(float alpha)\r\n DiscardByAlpha,\r\n // (Optional) Apply monochrome overrides to base color\r\n // vec4 applyMonochrome(vec4 baseColor)\r\n ApplyMonochrome,\r\n // (Optional) Apply thematic display to base color. This happens before lighting and can alter the fragment color that is lit.\r\n // vec4 applyThematicDisplay(vec4 baseColor)\r\n ApplyThematicDisplay,\r\n // (Optional) Apply lighting to base color\r\n // vec4 applyLighting(vec4 baseColor)\r\n ApplyLighting,\r\n // (Optional) Apply white-on-white reversal to base color\r\n ReverseWhiteOnWhite,\r\n // (Optional) Discard if outside any clipping planes\r\n // void applyClipping()\r\n ApplyClipping,\r\n // (Optional) Apply flash hilite to lit base color\r\n // vec4 applyFlash(vec4 baseColor)\r\n ApplyFlash,\r\n // (Optional) Apply planar classifier.\r\n // vec4 applyPlanarClassification(vec4)\r\n ApplyPlanarClassifier,\r\n // (Optional) Apply solar shadow map.\r\n // vec4 applySolarShadowMap(vec4)\r\n ApplySolarShadowMap,\r\n // (Optional) Apply wiremesh to edges of triangles\r\n // vec4 applyWiremesh(vec4 baseColor)\r\n ApplyWiremesh,\r\n // (Optional) Apply a debug color\r\n // vec4 applyDebugColor(vec4 baseColor)\r\n ApplyDebugColor,\r\n // (Required) Assign the final color to gl_FragColor or gl_FragData\r\n // void assignFragData(vec4 baseColor)\r\n AssignFragData,\r\n // (Optional) Override current featureId\r\n // vec4 overrideFeatureId(vec4 currentId)\r\n OverrideFeatureId,\r\n // (Optional) Override fragment depth\r\n // float finalizeDepth()\r\n FinalizeDepth,\r\n // (Optional) Override fragment color. This is invoked just after alpha is multiplied, and just before FragColor is assigned.\r\n // vec4 overrideColor(vec4 currentColor)\r\n OverrideColor,\r\n // (Optional) Override render order to be output to pick buffers.\r\n // float overrideRenderOrder(float renderOrder)\r\n OverrideRenderOrder,\r\n // (Optional) Apply atmospheric scattering effect. (For Skybox and RealityMesh only)\r\n // vec4 applyAtmosphericScattering()\r\n ApplyAtmosphericScattering,\r\n // (Optional) Override normal\r\n // float finalizeNormal()\r\n FinalizeNormal,\r\n COUNT,\r\n}\r\n\r\n/** Assembles the source code for a fragment shader from a set of modular components.\r\n * @internal\r\n */\r\nexport class FragmentShaderBuilder extends ShaderBuilder {\r\n public requiresEarlyZWorkaround = false;\r\n\r\n public constructor(flags: ShaderBuilderFlags = {}) {\r\n super(FragmentShaderComponent.COUNT, flags);\r\n this.addFragOutput(\"FragColor\", -1);\r\n }\r\n\r\n public get(id: FragmentShaderComponent): string | undefined { return this.getComponent(id); }\r\n public set(id: FragmentShaderComponent, component: string) { this.addComponent(id, component); }\r\n public unset(id: FragmentShaderComponent) { this.removeComponent(id); }\r\n\r\n public addDrawBuffersExtension(n: number): void {\r\n this.clearFragOutput();\r\n for (let i = 0; i < n; i++)\r\n this.addFragOutput(`FragColor${i}`, i);\r\n }\r\n\r\n public buildSource(): string {\r\n const applyLighting = this.get(FragmentShaderComponent.ApplyLighting);\r\n const prelude = this.buildPrelude(undefined);\r\n\r\n const computeBaseColor = this.get(FragmentShaderComponent.ComputeBaseColor);\r\n assert(undefined !== computeBaseColor);\r\n if (undefined !== computeBaseColor) {\r\n prelude.addFunction(\"vec4 computeBaseColor()\", computeBaseColor);\r\n }\r\n\r\n const main = new SourceBuilder();\r\n main.newline();\r\n\r\n // Initialization logic that should occur at start of main() - primarily global variables whose values\r\n // are too complex to compute inline or which depend on uniforms and/or other globals.\r\n for (const init of this._initializers) {\r\n if (\"\\n\" === init.charAt(0))\r\n main.addline(` {${init} }\\n`);\r\n else\r\n main.addline(` { ${init} }\\n`);\r\n }\r\n\r\n const checkForEarlyDiscard = this.get(FragmentShaderComponent.CheckForEarlyDiscard);\r\n if (undefined !== checkForEarlyDiscard) {\r\n prelude.addFunction(\"bool checkForEarlyDiscard()\", checkForEarlyDiscard);\r\n main.addline(\" if (checkForEarlyDiscard()) { discard; return; }\");\r\n }\r\n\r\n const finalizeNormal = this.get(FragmentShaderComponent.FinalizeNormal);\r\n if (undefined !== finalizeNormal) {\r\n prelude.addFunction(\"vec3 finalizeNormal()\", finalizeNormal);\r\n main.addline(\" g_normal = finalizeNormal();\");\r\n }\r\n\r\n main.addline(\" vec4 baseColor = computeBaseColor();\");\r\n\r\n const finalizeDepth = this.get(FragmentShaderComponent.FinalizeDepth);\r\n if (undefined !== finalizeDepth) {\r\n prelude.addFunction(\"float finalizeDepth()\", finalizeDepth);\r\n main.addline(\" float finalDepth = finalizeDepth();\");\r\n main.addline(\" gl_FragDepth = finalDepth;\");\r\n }\r\n\r\n let clipIndent = \"\";\r\n const applyClipping = this.get(FragmentShaderComponent.ApplyClipping);\r\n if (undefined !== applyClipping) {\r\n prelude.addline(\"vec3 g_clipColor;\\n\");\r\n prelude.addFunction(\"bool applyClipping(vec4 baseColor)\", applyClipping);\r\n main.addline(\" bool hasClipColor = applyClipping(baseColor);\");\r\n main.addline(\" if (hasClipColor) { baseColor.rgb = g_clipColor; } else {\");\r\n clipIndent = \" \";\r\n }\r\n\r\n const applyMaterialOverrides = this.get(FragmentShaderComponent.ApplyMaterialOverrides);\r\n if (undefined !== applyMaterialOverrides) {\r\n prelude.addFunction(\"vec4 applyMaterialOverrides(vec4 baseColor)\", applyMaterialOverrides);\r\n main.addline(`${clipIndent} baseColor = applyMaterialOverrides(baseColor);`);\r\n }\r\n\r\n const applyThematicDisplay = this.get(FragmentShaderComponent.ApplyThematicDisplay);\r\n if (undefined !== applyThematicDisplay) {\r\n prelude.addFunction(\"vec4 applyThematicDisplay(vec4 baseColor)\", applyThematicDisplay);\r\n main.addline(`${clipIndent} if (u_renderPass != kRenderPass_PlanarClassification)`);\r\n main.addline(`${clipIndent} baseColor = applyThematicDisplay(baseColor);`);\r\n }\r\n\r\n const applyPlanarClassifier = this.get(FragmentShaderComponent.ApplyPlanarClassifier);\r\n if (undefined !== applyPlanarClassifier) {\r\n if (undefined === finalizeDepth) {\r\n if (this.findFunction(volClassOpaqueColor))\r\n main.addline(`${clipIndent} float finalDepth = gl_FragCoord.z;`);\r\n else\r\n main.addline(`${clipIndent} float finalDepth = 1.0;`);\r\n }\r\n prelude.addFunction(\"vec4 applyPlanarClassifications(vec4 baseColor, float depth)\", applyPlanarClassifier);\r\n main.addline(`${clipIndent} baseColor = applyPlanarClassifications(baseColor, finalDepth);`);\r\n }\r\n\r\n const applySolarShadowMap = this.get(FragmentShaderComponent.ApplySolarShadowMap);\r\n if (undefined !== applySolarShadowMap) {\r\n prelude.addFunction(\"vec4 applySolarShadowMap(vec4 baseColor)\", applySolarShadowMap);\r\n main.addline(`${clipIndent} baseColor = applySolarShadowMap(baseColor);`);\r\n }\r\n\r\n const finalize = this.get(FragmentShaderComponent.FinalizeBaseColor);\r\n if (undefined !== finalize) {\r\n prelude.addFunction(\"vec4 finalizeBaseColor(vec4 baseColor)\", finalize);\r\n main.addline(`${clipIndent} baseColor = finalizeBaseColor(baseColor);`);\r\n }\r\n\r\n const checkForDiscard = this.get(FragmentShaderComponent.CheckForDiscard);\r\n if (undefined !== checkForDiscard) {\r\n prelude.addFunction(\"bool checkForDiscard(vec4 baseColor)\", checkForDiscard);\r\n main.addline(`${clipIndent} if (checkForDiscard(baseColor)) { discard; return; }`);\r\n }\r\n\r\n const discardByAlpha = this.get(FragmentShaderComponent.DiscardByAlpha);\r\n if (undefined !== discardByAlpha) {\r\n prelude.addFunction(\"bool discardByAlpha(float alpha)\", discardByAlpha);\r\n main.addline(`${clipIndent} if (discardByAlpha(baseColor.a)) { discard; return; }`);\r\n }\r\n\r\n if (undefined !== applyClipping)\r\n main.addline(\" }\");\r\n\r\n const applyMonochrome = this.get(FragmentShaderComponent.ApplyMonochrome);\r\n if (undefined !== applyMonochrome) {\r\n prelude.addFunction(\"vec4 applyMonochrome(vec4 baseColor)\", applyMonochrome);\r\n main.addline(\" baseColor = applyMonochrome(baseColor);\");\r\n }\r\n\r\n if (undefined !== applyLighting) {\r\n prelude.addFunction(\"vec4 applyLighting(vec4 baseColor)\", applyLighting);\r\n main.addline(\" baseColor = applyLighting(baseColor);\");\r\n }\r\n\r\n const reverseWoW = this.get(FragmentShaderComponent.ReverseWhiteOnWhite);\r\n if (undefined !== reverseWoW) {\r\n prelude.addFunction(\"vec4 reverseWhiteOnWhite(vec4 baseColor)\", reverseWoW);\r\n main.addline(\" baseColor = reverseWhiteOnWhite(baseColor);\");\r\n }\r\n\r\n const applyFlash = this.get(FragmentShaderComponent.ApplyFlash);\r\n if (undefined !== applyFlash) {\r\n prelude.addFunction(\"vec4 applyFlash(vec4 baseColor)\", applyFlash);\r\n main.addline(\" baseColor = applyFlash(baseColor);\");\r\n }\r\n\r\n const applyWiremesh = this.get(FragmentShaderComponent.ApplyWiremesh);\r\n if (applyWiremesh) {\r\n prelude.addFunction(\"vec4 applyWiremesh(vec4 baseColor)\", applyWiremesh);\r\n main.addline(\" baseColor = applyWiremesh(baseColor);\");\r\n }\r\n\r\n const applyAtmosphericScattering = this.get(FragmentShaderComponent.ApplyAtmosphericScattering);\r\n if (applyAtmosphericScattering) {\r\n prelude.addFunction(\"vec4 applyAtmosphericScattering(vec4 baseColor)\", applyAtmosphericScattering);\r\n main.addline(\" baseColor = applyAtmosphericScattering(baseColor);\");\r\n }\r\n\r\n const applyDebug = this.get(FragmentShaderComponent.ApplyDebugColor);\r\n if (undefined !== applyDebug) {\r\n prelude.addFunction(\"vec4 applyDebugColor(vec4 baseColor)\", applyDebug);\r\n main.addline(\" baseColor = applyDebugColor(baseColor);\");\r\n }\r\n\r\n const assignFragData = this.get(FragmentShaderComponent.AssignFragData);\r\n assert(undefined !== assignFragData);\r\n if (undefined !== assignFragData) {\r\n prelude.addFunction(\"void assignFragData(vec4 baseColor)\", assignFragData);\r\n main.addline(\" assignFragData(baseColor);\");\r\n }\r\n\r\n if (this.requiresEarlyZWorkaround) {\r\n // Add a conditional discard that never executes to force buggy Intel driver to skip early Z despite our fragment shader writing depth.\r\n main.addline(\"if (v_eyeSpace.z == 9999999.0) discard;\");\r\n }\r\n\r\n prelude.addMain(main.source);\r\n return prelude.source;\r\n }\r\n\r\n private buildPrelude(attrMap: Map<string, AttributeDetails> | undefined): SourceBuilder {\r\n return this.buildPreludeCommon(attrMap, false);\r\n }\r\n\r\n public copyFrom(src: FragmentShaderBuilder): void {\r\n this.copyCommon(src);\r\n this.requiresEarlyZWorkaround = src.requiresEarlyZWorkaround;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport const enum ShaderType {\r\n Fragment = 1 << 0,\r\n Vertex = 1 << 1,\r\n Both = Fragment | Vertex,\r\n}\r\n\r\n/**\r\n * Assembles vertex and fragment shaders from a set of modular components to produce a compiled ShaderProgram.\r\n * Be very careful with components which use samplers to ensure that no conflicts exist with texture units used by other components (see TextureUnit enum).\r\n * @internal\r\n */\r\nexport class ProgramBuilder {\r\n public readonly vert: VertexShaderBuilder;\r\n public readonly frag: FragmentShaderBuilder;\r\n private readonly _flags: ShaderBuilderFlags;\r\n private readonly _attrMap?: Map<string, AttributeDetails>;\r\n\r\n public constructor(attrMap?: Map<string, AttributeDetails>, flags: ShaderBuilderFlags = {}) {\r\n this._attrMap = attrMap;\r\n this.vert = new VertexShaderBuilder(flags);\r\n this.frag = new FragmentShaderBuilder(flags);\r\n this._flags = flags; // only needed for clone - though could look up from vert or frag shader.\r\n }\r\n\r\n private addVariable(v: ShaderVariable, which: ShaderType) {\r\n if (which & ShaderType.Fragment) {\r\n this.frag.addVariable(v);\r\n }\r\n\r\n if (which & ShaderType.Vertex) {\r\n this.vert.addVariable(v);\r\n }\r\n }\r\n\r\n public addUniform(name: string, type: VariableType, binding: AddVariableBinding, which: ShaderType = ShaderType.Both) {\r\n this.addVariable(ShaderVariable.create(name, type, VariableScope.Uniform, binding), which);\r\n }\r\n public addUniformArray(name: string, type: VariableType, length: number, binding: AddVariableBinding, which: ShaderType = ShaderType.Both) {\r\n this.addVariable(ShaderVariable.createArray(name, type, length, VariableScope.Uniform, binding), which);\r\n }\r\n public addVarying(name: string, type: VariableType) {\r\n this.addVariable(ShaderVariable.create(name, type, VariableScope.Varying), ShaderType.Both);\r\n }\r\n public addGlobal(name: string, type: VariableType, which: ShaderType = ShaderType.Both, value?: string, isConst: boolean = false) {\r\n this.addVariable(ShaderVariable.createGlobal(name, type, value, isConst), which);\r\n }\r\n\r\n public addInlineComputedVarying(name: string, type: VariableType, inlineComputation: string) {\r\n if (this.frag.addVarying(name, type))\r\n this.vert.addComputedVarying(name, type, inlineComputation);\r\n }\r\n public addFunctionComputedVarying(name: string, type: VariableType, funcName: string, funcBody: string) {\r\n let funcDecl = `\\n${Convert.typeToString(type)} ${funcName}()`;\r\n funcDecl = SourceBuilder.buildFunctionDefinition(funcDecl, funcBody);\r\n\r\n const funcCall = `${funcName}()`;\r\n this.addFunctionComputedVaryingWithArgs(name, type, funcCall, funcDecl);\r\n }\r\n public addFunctionComputedVaryingWithArgs(name: string, type: VariableType, funcCall: string, funcDef: string) {\r\n this.vert.addFunction(funcDef);\r\n const computation = `${name} = ${funcCall};`;\r\n this.addInlineComputedVarying(name, type, computation);\r\n }\r\n\r\n /** Assembles the vertex and fragment shader code and returns a ready-to-compile shader program */\r\n public buildProgram(gl: WebGL2RenderingContext): ShaderProgram {\r\n const vertSource = this.vert.buildSource(this._attrMap);\r\n const fragSource = this.frag.buildSource(); // NB: frag has no need to specify attributes, only vertex does.\r\n\r\n // Debug output\r\n const debugVaryings = false;\r\n if (debugVaryings) {\r\n const dbgLog = (x: string) => console.log(x); // eslint-disable-line no-console\r\n const outSrc = false; // true for source out, false for just varying info\r\n if (this.frag.headerComment) {\r\n let tStr = \"\";\r\n if (!outSrc) {\r\n tStr = `${this.frag.headerComment}\\n`;\r\n }\r\n const tStr2 = this.vert.checkMaxVaryingVectors(fragSource);\r\n if (tStr2) {\r\n if (outSrc) {\r\n dbgLog(\"//===============================================================================================================\");\r\n dbgLog(vertSource);\r\n dbgLog(\"//========= Varying Info =========\");\r\n dbgLog(tStr2);\r\n dbgLog(fragSource);\r\n } else {\r\n dbgLog(tStr + tStr2);\r\n }\r\n }\r\n }\r\n }\r\n\r\n const prog = new ShaderProgram(gl, vertSource, fragSource, this._attrMap, this.vert.headerComment, this.frag.headerComment);\r\n this.vert.addBindings(prog);\r\n this.frag.addBindings(prog, this.vert);\r\n return prog;\r\n }\r\n\r\n public setDebugDescription(description: string): void {\r\n this.vert.headerComment = (`//!V! ${description}`);\r\n this.frag.headerComment = (`//!F! ${description}`);\r\n }\r\n\r\n /** Returns a deep copy of this program builder. */\r\n public clone(): ProgramBuilder {\r\n const clone = new ProgramBuilder(this._attrMap, this._flags);\r\n clone.vert.copyFrom(this.vert);\r\n clone.frag.copyFrom(this.frag);\r\n return clone;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ShaderBuilder.js","sourceRoot":"","sources":["../../../../src/render/webgl/ShaderBuilder.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 { AttributeDetails } from \"./AttributeMap\";\r\nimport { addInstancedModelMatrixRTC } from \"./glsl/Instancing\";\r\nimport { volClassOpaqueColor } from \"./glsl/PlanarClassification\";\r\nimport { addPosition, earlyVertexDiscard, lateVertexDiscard, vertexDiscard } from \"./glsl/Vertex\";\r\nimport { ShaderProgram } from \"./ShaderProgram\";\r\nimport { PositionType } from \"./TechniqueFlags\";\r\n\r\n/* eslint-disable no-restricted-syntax */\r\n\r\n/** Describes the data type of a shader program variable.\r\n * @internal\r\n */\r\nexport const enum VariableType {\r\n Boolean, // bool\r\n Int, // int\r\n Float, // float\r\n Vec2, // vec2\r\n Vec3, // vec3\r\n Vec4, // vec4\r\n Mat3, // mat3\r\n Mat4, // mat4\r\n Sampler2D, // sampler2D\r\n SamplerCube, // samplerCube\r\n Uint, // uint\r\n BVec2, // bvec2\r\n\r\n COUNT,\r\n}\r\n\r\n/** Describes the qualifier associated with a shader program variable.\r\n * @internal\r\n */\r\nexport const enum VariableScope {\r\n Global, // no qualifier\r\n Varying, // varying\r\n Uniform, // uniform\r\n\r\n COUNT,\r\n}\r\n\r\n/** Describes the declared or undeclared precision of a shader program variable.\r\n * @internal\r\n */\r\nexport const enum VariablePrecision {\r\n Default, // undeclared precision - variable uses the explicit or implicit precision default for its type\r\n Low, // lowp\r\n Medium, // mediump\r\n High, // highp\r\n\r\n COUNT,\r\n}\r\n\r\n/** @internal */\r\nnamespace Convert {\r\n export function typeToString(type: VariableType): string {\r\n switch (type) {\r\n case VariableType.Boolean: return \"bool\";\r\n case VariableType.Int: return \"int\";\r\n case VariableType.Float: return \"float\";\r\n case VariableType.Vec2: return \"vec2\";\r\n case VariableType.Vec3: return \"vec3\";\r\n case VariableType.Vec4: return \"vec4\";\r\n case VariableType.Mat3: return \"mat3\";\r\n case VariableType.Mat4: return \"mat4\";\r\n case VariableType.Sampler2D: return \"sampler2D\";\r\n case VariableType.SamplerCube: return \"samplerCube\";\r\n case VariableType.Uint: return \"uint\";\r\n case VariableType.BVec2: return \"bvec2\";\r\n default:\r\n assert(false);\r\n return \"undefined\";\r\n }\r\n }\r\n\r\n export function scopeToString(scope: VariableScope, isVertexShader: boolean): string {\r\n switch (scope) {\r\n case VariableScope.Global: return \"\";\r\n case VariableScope.Varying: return (isVertexShader ? \"out\" : \"in\");\r\n case VariableScope.Uniform: return \"uniform\";\r\n default:\r\n assert(false);\r\n return \"undefined\";\r\n }\r\n }\r\n\r\n export function precisionToString(precision: VariablePrecision): string {\r\n switch (precision) {\r\n case VariablePrecision.Default: return \"\";\r\n case VariablePrecision.Low: return \"lowp\";\r\n case VariablePrecision.Medium: return \"mediump\";\r\n case VariablePrecision.High: return \"highp\";\r\n default:\r\n assert(false);\r\n return \"undefined\";\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Function invoked by ShaderVariable::AddBinding() to bind the variable to the compiled program.\r\n * The implementation should call ShaderProgram::AddShaderUniform or ShaderProgram::AddGraphicUniform/Attribute to register a function\r\n * which can be used to bind the value of the variable when program is used.\r\n * @internal\r\n */\r\nexport type AddVariableBinding = (prog: ShaderProgram) => void;\r\n\r\n/** Represents a variable within a fragment or vertex shader.\r\n * @internal\r\n */\r\nexport class ShaderVariable {\r\n private readonly _addBinding?: AddVariableBinding;\r\n public readonly name: string;\r\n public readonly value?: string; // for global variables only\r\n public readonly type: VariableType;\r\n public readonly scope: VariableScope;\r\n public readonly precision: VariablePrecision;\r\n public readonly isConst: boolean = false; // for global variables only\r\n public readonly length: number; // for uniform arrays only\r\n\r\n private constructor(name: string, type: VariableType, scope: VariableScope, precision: VariablePrecision, isConst: boolean, addBinding?: AddVariableBinding, value?: string, length: number = 0) {\r\n this._addBinding = addBinding;\r\n this.name = name;\r\n this.value = value;\r\n this.type = type;\r\n this.scope = scope;\r\n this.precision = precision;\r\n this.isConst = isConst;\r\n this.length = length;\r\n }\r\n\r\n public static create(name: string, type: VariableType, scope: VariableScope, addBinding?: AddVariableBinding, precision: VariablePrecision = VariablePrecision.Default): ShaderVariable {\r\n return new ShaderVariable(name, type, scope, precision, false, addBinding, undefined);\r\n }\r\n\r\n public static createArray(name: string, type: VariableType, length: number, scope: VariableScope, addBinding?: AddVariableBinding, precision: VariablePrecision = VariablePrecision.Default): ShaderVariable {\r\n return new ShaderVariable(name, type, scope, precision, false, addBinding, undefined, length);\r\n }\r\n\r\n public static createGlobal(name: string, type: VariableType, value?: string, isConst: boolean = false) {\r\n return new ShaderVariable(name, type, VariableScope.Global, VariablePrecision.Default, isConst, undefined, value);\r\n }\r\n\r\n public get hasBinding(): boolean { return undefined !== this._addBinding; }\r\n public addBinding(prog: ShaderProgram) {\r\n if (undefined !== this._addBinding)\r\n this._addBinding(prog);\r\n }\r\n\r\n public get typeName(): string { return Convert.typeToString(this.type); }\r\n public getScopeName(isVertexShader: boolean): string { return Convert.scopeToString(this.scope, isVertexShader); }\r\n public get precisionName(): string { return Convert.precisionToString(this.precision); }\r\n\r\n /** Constructs the single-line declaration of this variable */\r\n public buildDeclaration(isVertexShader: boolean): string {\r\n const parts = new Array<string>();\r\n if (this.isConst)\r\n parts.push(\"const\");\r\n\r\n const scopeName = this.getScopeName(isVertexShader);\r\n if (0 < scopeName.length)\r\n parts.push(scopeName);\r\n\r\n const precisionName = this.precisionName;\r\n if (0 < precisionName.length)\r\n parts.push(precisionName);\r\n\r\n parts.push(this.typeName);\r\n\r\n if (this.length > 0)\r\n parts.push(`${this.name}[${this.length.toFixed(0)}]`);\r\n else\r\n parts.push(this.name);\r\n\r\n if (undefined !== this.value && 0 < this.value.length) {\r\n parts.push(\"=\");\r\n parts.push(this.value);\r\n }\r\n\r\n return `${parts.join(\" \")};`;\r\n }\r\n}\r\n\r\n/**\r\n * Represents the set of variables defined and used within a fragment or vertex shader.\r\n * If the same variable is used in both the fragment and vertex shader (e.g., a varying variable), it should be defined in both ShaderBuilders' ShaderVariables object.\r\n * @internal\r\n */\r\nexport class ShaderVariables {\r\n protected _list: ShaderVariable[] = new Array<ShaderVariable>();\r\n\r\n /** Find an existing variable with the specified name */\r\n public find(name: string): ShaderVariable | undefined { return this._list.find((v: ShaderVariable) => v.name === name); }\r\n\r\n /** Add a new variable, if a variable with the same name does not already exist. return true if added */\r\n public addVariable(v: ShaderVariable): boolean {\r\n const found = this.find(v.name);\r\n if (undefined !== found) {\r\n assert(found.type === v.type);\r\n // assume same binding etc...\r\n return false;\r\n } else {\r\n this._list.push(v);\r\n return true;\r\n }\r\n }\r\n\r\n public addUniform(name: string, type: VariableType, binding: AddVariableBinding, precision: VariablePrecision = VariablePrecision.Default) {\r\n this.addVariable(ShaderVariable.create(name, type, VariableScope.Uniform, binding, precision));\r\n }\r\n\r\n public addVarying(name: string, type: VariableType): boolean {\r\n return this.addVariable(ShaderVariable.create(name, type, VariableScope.Varying));\r\n }\r\n\r\n public addGlobal(name: string, type: VariableType, value?: string, isConst: boolean = false) {\r\n this.addVariable(ShaderVariable.createGlobal(name, type, value, isConst));\r\n }\r\n\r\n public addConstant(name: string, type: VariableType, value: string) {\r\n this.addGlobal(name, type, value, true);\r\n }\r\n\r\n public addBitFlagConstant(name: string, value: number) {\r\n this.addGlobal(name, VariableType.Uint, `${(2 ** value).toFixed(0)}u`, true);\r\n }\r\n\r\n /** Constructs the lines of glsl code declaring the variables of a certain scope. */\r\n public buildScopeDeclarations(isVertexShader: boolean, scope: VariableScope, constants?: boolean): string {\r\n let decls = \"\";\r\n for (const v of this._list) {\r\n if (scope === v.scope && (undefined === constants ? true : v.isConst === constants))\r\n decls += `${v.buildDeclaration(isVertexShader)}\\n`;\r\n }\r\n\r\n return decls;\r\n }\r\n\r\n /** Constructs the lines of glsl code declaring all of the variables. */\r\n public buildDeclarations(isVertexShader: boolean): string {\r\n let decls = \"\";\r\n if (isVertexShader) {\r\n decls += this.buildScopeDeclarations(isVertexShader, VariableScope.Uniform);\r\n decls += this.buildScopeDeclarations(isVertexShader, VariableScope.Global, true);\r\n decls += this.buildScopeDeclarations(isVertexShader, VariableScope.Global, false);\r\n decls += this.buildScopeDeclarations(isVertexShader, VariableScope.Varying);\r\n } else {\r\n decls += this.buildScopeDeclarations(isVertexShader, VariableScope.Varying);\r\n decls += this.buildScopeDeclarations(isVertexShader, VariableScope.Uniform);\r\n decls += this.buildScopeDeclarations(isVertexShader, VariableScope.Global, true);\r\n decls += this.buildScopeDeclarations(isVertexShader, VariableScope.Global, false);\r\n }\r\n return decls;\r\n }\r\n\r\n /**\r\n * For every uniform and attribute variable not contained in the optional 'predefined' list, invokes the associated binding function\r\n * to add the corresponding Uniform or Attribute object to the ShaderProgram.\r\n */\r\n public addBindings(prog: ShaderProgram, predefined?: ShaderVariables): void {\r\n for (const v of this._list) {\r\n // Some variables exist in both frag and vert shaders - only add them to the program once.\r\n if (v.hasBinding && (undefined === predefined || undefined === predefined.find(v.name))) {\r\n v.addBinding(prog);\r\n }\r\n }\r\n }\r\n\r\n public get length(): number { return this._list.length; }\r\n\r\n private findSlot(variableSize: number, loopSize: number, registers: number[]): number {\r\n // Find the first available slot into which to insert this variable\r\n for (let i = 0; i < loopSize; i++) {\r\n const newSize = registers[i] + variableSize;\r\n if (newSize <= 4) {\r\n registers[i] = newSize;\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n // Return string of varying types with their theoretical slot numbers\r\n public checkMaxVaryingVectors(fragSource: string): string {\r\n // Varyings go into a matrix of 4 columns and GL_MAX_VARYING_VECTORS rows of floats.\r\n // The packing rules are defined by the standard. Specifically each row can contain one of:\r\n // vec4\r\n // vec3 (+ float)\r\n // vec2 (+ vec2)\r\n // vec2 (+ float (+ float))\r\n // float (+ float (+ float (+ float)))\r\n // Varyings are packed in order of size from largest to smallest\r\n const loopSize = 64;\r\n const registers = Array(loopSize + 1).fill(0);\r\n let outStr = \"\";\r\n let slot = 0;\r\n\r\n const varyings = this._list.filter((variable) => VariableScope.Varying === variable.scope);\r\n // Add in any built in vars that count as varyings if they are used\r\n if (fragSource.includes(\"gl_FragCoord\")) {\r\n varyings.push(ShaderVariable.create(\"gl_FragCoord\", VariableType.Vec4, VariableScope.Varying));\r\n }\r\n if (fragSource.includes(\"gl_PointCoord\")) {\r\n varyings.push(ShaderVariable.create(\"gl_PointCoord\", VariableType.Vec2, VariableScope.Varying));\r\n }\r\n if (fragSource.includes(\"gl_FrontFacing\")) {\r\n varyings.push(ShaderVariable.create(\"gl_FrontFacing\", VariableType.Boolean, VariableScope.Varying));\r\n }\r\n // Need to process in size order (largest first)\r\n varyings.sort((a, b) => b.type - a.type); // this is good enough to sort by\r\n\r\n for (const variable of varyings) {\r\n let variableSize = 0;\r\n switch (variable.type) {\r\n case VariableType.Boolean:\r\n case VariableType.Int:\r\n case VariableType.Float:\r\n variableSize = 1;\r\n break;\r\n case VariableType.Vec2:\r\n case VariableType.BVec2:\r\n variableSize = 2;\r\n break;\r\n case VariableType.Vec3:\r\n variableSize = 3;\r\n break;\r\n case VariableType.Vec4:\r\n variableSize = 4;\r\n break;\r\n default:\r\n assert(false, \"Invalid varying variable type\");\r\n continue;\r\n }\r\n slot = this.findSlot(variableSize, loopSize, registers);\r\n outStr += `// varying slot ${slot} ${Convert.typeToString(variable.type)} ${variable.name}\\n`;\r\n }\r\n const slotsUsed = registers.indexOf(0);\r\n registers.length = slotsUsed;\r\n outStr += `// Slots used: ${slotsUsed} [${registers.toString()}]\\n`;\r\n\r\n // debug output modes\r\n const outputAll = true; // false just outputs varyings that use more than 8\r\n if (outputAll) {\r\n return outStr;\r\n } else {\r\n if (slotsUsed > 8)\r\n return outStr;\r\n else\r\n return \"\";\r\n }\r\n }\r\n\r\n // Return the number of varying vectors used by the shader.\r\n // Varyings go into a matrix of 4 columns and GL_MAX_VARYING_VECTORS rows of floats.\r\n // The packing rules are defined by the standard. Specifically each row can contain one of:\r\n // vec4\r\n // vec3 (+ float)\r\n // vec2 (+ vec2)\r\n // vec2 (+ float (+ float))\r\n // float (+ float (+ float (+ float)))\r\n // Varyings are packed in order of size from largest to smallest\r\n public computeNumVaryingVectors(fragSource: string): number {\r\n const loopSize = 64;\r\n const registers = Array(loopSize + 1).fill(0);\r\n\r\n const varyings = this._list.filter((variable) => VariableScope.Varying === variable.scope);\r\n // Add in any built in vars that count as varyings if they are used\r\n if (fragSource.includes(\"gl_FragCoord\")) {\r\n varyings.push(ShaderVariable.create(\"gl_FragCoord\", VariableType.Vec4, VariableScope.Varying));\r\n }\r\n if (fragSource.includes(\"gl_PointCoord\")) {\r\n varyings.push(ShaderVariable.create(\"gl_PointCoord\", VariableType.Vec2, VariableScope.Varying));\r\n }\r\n if (fragSource.includes(\"gl_FrontFacing\")) {\r\n varyings.push(ShaderVariable.create(\"gl_FrontFacing\", VariableType.Boolean, VariableScope.Varying));\r\n }\r\n // Need to process in size order (largest first)\r\n varyings.sort((a, b) => b.type - a.type); // this is good enough to sort by\r\n\r\n for (const variable of varyings) {\r\n if (VariableScope.Varying !== variable.scope)\r\n continue;\r\n\r\n let variableSize = 0;\r\n switch (variable.type) {\r\n case VariableType.Boolean:\r\n case VariableType.Int:\r\n case VariableType.Float:\r\n variableSize = 1;\r\n break;\r\n case VariableType.Vec2:\r\n case VariableType.BVec2:\r\n variableSize = 2;\r\n break;\r\n case VariableType.Vec3:\r\n variableSize = 3;\r\n break;\r\n case VariableType.Vec4:\r\n variableSize = 4;\r\n break;\r\n default:\r\n assert(false, \"Invalid varying variable type\");\r\n continue;\r\n }\r\n\r\n this.findSlot(variableSize, loopSize, registers);\r\n }\r\n\r\n const slotsUsed = registers.indexOf(0);\r\n return slotsUsed;\r\n }\r\n}\r\n\r\n/** Convenience API for assembling glsl source code.\r\n * @internal\r\n */\r\nexport class SourceBuilder {\r\n public source: string = \"\";\r\n\r\n /* Append the specified string to the glsl source */\r\n public add(what: string): void { this.source += what; }\r\n\r\n /* Append a new-line to the glsl source */\r\n public newline(): void { this.add(\"\\n\"); }\r\n\r\n /* Append the specified string to the glsl source, followed by a new-line */\r\n public addline(what: string): void {\r\n this.add(what);\r\n this.newline();\r\n }\r\n\r\n /**\r\n * Construct a function definition given the function signature and body. For example:\r\n * buildFunctionDefinition(\"float average(float a, float b)\", \"\\n return (a + b) / 2.0;\\n\");\r\n * will produce:\r\n * \"float average(float a, float b) {\r\n * return (a + b) / 2.0;\r\n * }\"\r\n * For an inline function:\r\n * buildFunctionDefinition(\"float average(float a, float b)\", \"return (a + b) / 2.0;\");\r\n * will produce:\r\n * \"float average(float a, float b) { return (a + b) / 2.0; }\"\r\n */\r\n public static buildFunctionDefinition(declaration: string, implementation: string): string {\r\n // If implementation does not start with a newline then assume it is an inline function & add spaces between braces.\r\n if (\"\\n\" === implementation.charAt(0))\r\n return `${declaration} {${implementation}}\\n\\n`;\r\n else\r\n return `${declaration} { ${implementation} }\\n\\n`;\r\n }\r\n\r\n /** Constructs a function definition as described by buildFunctionDefinition() and appends it to the glsl source. */\r\n public addFunction(declaration: string, implementation: string): void { this.add(SourceBuilder.buildFunctionDefinition(declaration, implementation)); }\r\n\r\n /** Constructs the definition of the main() function using the supplied function body and appends it to the glsl source. */\r\n public addMain(implementation: string): void { this.addFunction(\"void main()\", implementation); }\r\n}\r\n\r\n/** @internal */\r\nexport interface ShaderBuilderFlags {\r\n /** If defined and true, the geometry is instanced. */\r\n readonly instanced?: boolean;\r\n /** If defined, indicates the vertex data comes from a texture and specifies whether the positions are quantized 16-bit integers or unquantized 32-bit floats. */\r\n readonly positionType?: PositionType;\r\n}\r\n\r\n/**\r\n * Represents a fragment or vertex shader under construction. The shader consists of a set of defined variables,\r\n * plus a set of code snippets which can be concatenated together to form the shader source.\r\n * @internal\r\n */\r\nexport class ShaderBuilder extends ShaderVariables {\r\n protected _components = new Array<string | undefined>();\r\n protected _functions: string[] = [];\r\n protected _extensions: string[] = [];\r\n protected _macros: string[] = [];\r\n protected _fragOutputs: string[] = [];\r\n protected _version: string = \"\";\r\n public headerComment: string = \"\";\r\n protected readonly _flags: ShaderBuilderFlags;\r\n protected _initializers: string[] = new Array<string>();\r\n\r\n public get usesInstancedGeometry(): boolean {\r\n return !!this._flags.instanced;\r\n }\r\n\r\n public addInitializer(initializer: string): void {\r\n if (-1 === this._initializers.indexOf(initializer))\r\n this._initializers.push(initializer);\r\n }\r\n\r\n protected constructor(maxComponents: number, flags: ShaderBuilderFlags) {\r\n super();\r\n this._components.length = maxComponents;\r\n this._flags = flags;\r\n this._version = \"#version 300 es\";\r\n this.addDefine(\"TEXTURE\", \"texture\");\r\n this.addDefine(\"TEXTURE_CUBE\", \"texture\");\r\n this.addDefine(\"TEXTURE_PROJ\", \"textureProj\");\r\n }\r\n\r\n protected addComponent(index: number, component: string): void {\r\n assert(index < this._components.length);\r\n\r\n // assume if caller is replacing an existing component, they know what they're doing...\r\n this._components[index] = component;\r\n }\r\n protected removeComponent(index: number) {\r\n assert(index < this._components.length);\r\n this._components[index] = undefined;\r\n }\r\n\r\n protected getComponent(index: number): string | undefined {\r\n assert(index < this._components.length);\r\n return this._components[index];\r\n }\r\n\r\n public addFunction(declarationOrFull: string, implementation?: string): void {\r\n let def = declarationOrFull;\r\n if (undefined !== implementation)\r\n def = SourceBuilder.buildFunctionDefinition(`\\n${declarationOrFull}`, implementation);\r\n\r\n if (undefined === this.findFunction(def))\r\n this._functions.push(def);\r\n }\r\n\r\n public replaceFunction(existing: string, replacement: string): boolean {\r\n const index = this._functions.indexOf(existing);\r\n if (-1 !== index) {\r\n this._functions[index] = replacement;\r\n }\r\n\r\n assert(-1 !== index);\r\n return -1 !== index;\r\n }\r\n\r\n public findFunction(func: string): string | undefined {\r\n return this._functions.find((f: string | undefined) => f === func);\r\n }\r\n\r\n public addExtension(extName: string): void {\r\n if (-1 === this._extensions.indexOf(extName))\r\n this._extensions.push(extName);\r\n }\r\n\r\n public addMacro(macro: string): void {\r\n if (-1 === this._macros.indexOf(macro))\r\n this._macros.push(macro);\r\n }\r\n\r\n public addDefine(name: string, value: string): void {\r\n const defineName = `#define ${name} `;\r\n const macro = defineName + value;\r\n\r\n const index = this._macros.findIndex((x) => x.startsWith(defineName));\r\n if (-1 !== index)\r\n this._macros[index] = macro;\r\n else\r\n this._macros.push(defineName + value);\r\n }\r\n\r\n public clearFragOutput(): void {\r\n while (this._fragOutputs.length > 0)\r\n this._fragOutputs.pop();\r\n }\r\n\r\n public addFragOutput(name: string, value: number): void {\r\n if (-1 === value) {\r\n this._fragOutputs.push(\"out vec4 FragColor;\");\r\n return;\r\n }\r\n this._fragOutputs.push(`layout(location = ${value}) out vec4 ${name};`);\r\n }\r\n\r\n protected buildPreludeCommon(attrMap: Map<string, AttributeDetails> | undefined, isVertexShader: boolean): SourceBuilder {\r\n const src = new SourceBuilder();\r\n\r\n // Version number (must be first thing for GLSL 300)\r\n src.addline(this._version);\r\n\r\n // Header comment\r\n src.newline();\r\n if (\"\" !== this.headerComment) {\r\n src.addline(this.headerComment);\r\n src.newline();\r\n }\r\n\r\n // Macros\r\n for (const macro of this._macros)\r\n src.addline(macro);\r\n\r\n // Extensions\r\n for (const ext of this._extensions)\r\n src.addline(`#extension ${ext} : enable`);\r\n\r\n // Default precisions\r\n src.addline(\"precision highp float;\");\r\n src.addline(\"precision highp int;\");\r\n src.newline();\r\n\r\n // Attribute declarations\r\n if (attrMap !== undefined) {\r\n attrMap.forEach((attr: AttributeDetails, key: string) => {\r\n src.addline(`in ${Convert.typeToString(attr.type)} ${key};`);\r\n });\r\n }\r\n\r\n // Variable declarations\r\n src.add(this.buildDeclarations(isVertexShader));\r\n\r\n // Layouts\r\n for (const layout of this._fragOutputs)\r\n src.addline(layout);\r\n\r\n // Functions\r\n for (const func of this._functions) {\r\n src.add(func);\r\n }\r\n\r\n if (!src.source.endsWith(\"\\n\\n\"))\r\n src.newline();\r\n\r\n return src;\r\n }\r\n\r\n protected copyCommon(src: ShaderBuilder): void {\r\n this._version = src._version;\r\n this.headerComment = src.headerComment;\r\n this._initializers = [...src._initializers];\r\n this._components = [...src._components];\r\n this._functions = [...src._functions];\r\n this._extensions = [...src._extensions];\r\n this._list = [...src._list];\r\n this._macros = [...src._macros];\r\n this._fragOutputs = [...src._fragOutputs];\r\n }\r\n}\r\n\r\n/** Describes the optional and required components which can be assembled into complete\r\n * @internal\r\n */\r\nexport const enum VertexShaderComponent {\r\n // (Optional) Compute the quantized position. By default this simply returns the `a_pos` attribute.\r\n // This runs before any initializers.\r\n // vec3 computeQuantizedPosition()\r\n ComputeQuantizedPosition,\r\n // (Optional) Adjust the result of computeVertexPosition().\r\n // vec4 adjustRawPosition(vec4 rawPosition)\r\n AdjustRawPosition,\r\n // (Optional) Return true to discard this vertex before evaluating feature overrides etc, given the model-space position.\r\n // bool checkForEarlyDiscard(vec4 rawPos)\r\n CheckForEarlyDiscard,\r\n // (Optional) Compute feature overrides like visibility, rgb, transparency, line weight.\r\n // void computeFeatureOverrides()\r\n ComputeFeatureOverrides,\r\n // (Optional) Compute material parameters.\r\n // void computeMaterial()\r\n ComputeMaterial,\r\n // (Optional) Compute the vertex's base color. Requires the program to have a `varying vec4 v_color`.\r\n // vec4 computeBaseColor()\r\n ComputeBaseColor,\r\n // (Optional - does nothing if ComputeBaseColor not specified) Apply material overrides to vertex color\r\n // vec4 applyMaterialColor(vec4 baseColor)\r\n ApplyMaterialColor,\r\n // (Optional - does nothing if ComputeBaseColor not specified) Apply feature overrides to vertex color\r\n // vec4 applyFeatureColor(vec4 baseColor)\r\n ApplyFeatureColor,\r\n // (Optional - does nothing if ComputeBaseColor not specified)) Adjust base color for contrast\r\n // vec4 adjustContrast(vec4 baseColor)\r\n AdjustContrast,\r\n // (Optional - does nothing if ComputeBaseColor not specified) Return true if this vertex should be \"discarded\" (is not visible)\r\n // bool checkForDiscard()\r\n // If this returns true, gl_Position will be set to 0; presumably related vertices will also do so, resulting in a degenerate triangle.\r\n // If this returns true, no further processing will be performed.\r\n CheckForDiscard,\r\n // (Required) Return this vertex's position in clip space.\r\n // vec4 computePosition(vec4 rawPos)\r\n ComputePosition,\r\n // (Optional) Compute all atmospheric scattering values in one pass and assign them to varyings (For Skybox and RealityMesh only)\r\n // void computeAtmosphericScatteringVaryings\r\n ComputeAtmosphericScatteringVaryings,\r\n // (Optional) After all output (varying) values have been computed, return true if this vertex should be discarded.\r\n // bool checkForLateDiscard()\r\n CheckForLateDiscard,\r\n // (Optional) Adjust the final position\r\n // vec4 adjustPosition(vec4 pos)\r\n FinalizePosition,\r\n\r\n COUNT,\r\n}\r\n\r\n/** Assembles the source code for a vertex shader from a set of modular components.\r\n * @internal\r\n */\r\nexport class VertexShaderBuilder extends ShaderBuilder {\r\n private _computedVarying: string[] = new Array<string>();\r\n\r\n private buildPrelude(attrMap?: Map<string, AttributeDetails>): SourceBuilder { return this.buildPreludeCommon(attrMap, true); }\r\n\r\n public constructor(flags: ShaderBuilderFlags = {}) {\r\n super(VertexShaderComponent.COUNT, flags);\r\n\r\n this.addDefine(\"MAT_NORM\", \"g_nmx\");\r\n if (this.usesInstancedGeometry) {\r\n addInstancedModelMatrixRTC(this);\r\n this.addDefine(\"MAT_MV\", \"g_mv\");\r\n this.addDefine(\"MAT_MVP\", \"g_mvp\");\r\n } else {\r\n this.addDefine(\"MAT_MV\", \"u_mv\");\r\n this.addDefine(\"MAT_MVP\", \"u_mvp\");\r\n }\r\n\r\n addPosition(this, this.usesVertexTable);\r\n }\r\n\r\n public get usesVertexTable(): boolean {\r\n return undefined !== this._flags.positionType;\r\n }\r\n\r\n public get positionType(): PositionType {\r\n assert(undefined !== this._flags.positionType);\r\n return this._flags.positionType;\r\n }\r\n\r\n public get(id: VertexShaderComponent): string | undefined { return this.getComponent(id); }\r\n public set(id: VertexShaderComponent, component: string) { this.addComponent(id, component); }\r\n public unset(id: VertexShaderComponent) { this.removeComponent(id); }\r\n\r\n public addComputedVarying(name: string, type: VariableType, computation: string): void {\r\n this.addVarying(name, type);\r\n this._computedVarying.push(computation);\r\n }\r\n\r\n public buildSource(attrMap?: Map<string, AttributeDetails>): string {\r\n const prelude = this.buildPrelude(attrMap);\r\n const main = new SourceBuilder();\r\n main.newline();\r\n\r\n const computePosition = this.get(VertexShaderComponent.ComputePosition);\r\n assert(undefined !== computePosition);\r\n if (undefined !== computePosition) {\r\n prelude.addFunction(\"vec4 computePosition(vec4 rawPos)\", computePosition);\r\n }\r\n\r\n const computeQPos = this.get(VertexShaderComponent.ComputeQuantizedPosition) ?? \"return a_pos;\";\r\n prelude.addFunction(\"vec3 computeQuantizedPosition()\", computeQPos);\r\n main.addline(\" vec3 qpos = computeQuantizedPosition();\");\r\n\r\n // Initialization logic that should occur at start of main() - primarily global variables whose values\r\n // are too complex to compute inline or which depend on uniforms and/or other globals.\r\n for (const init of this._initializers) {\r\n if (\"\\n\" === init.charAt(0))\r\n main.addline(` {${init} }\\n`);\r\n else\r\n main.addline(` { ${init} }\\n`);\r\n }\r\n\r\n main.addline(\" vec4 rawPosition = computeVertexPosition(qpos);\");\r\n const adjustRawPosition = this.get(VertexShaderComponent.AdjustRawPosition);\r\n if (undefined !== adjustRawPosition) {\r\n prelude.addFunction(\"vec4 adjustRawPosition(vec4 rawPos)\", adjustRawPosition);\r\n main.addline(\" rawPosition = adjustRawPosition(rawPosition);\");\r\n }\r\n\r\n const checkForEarlyDiscard = this.get(VertexShaderComponent.CheckForEarlyDiscard);\r\n if (undefined !== checkForEarlyDiscard) {\r\n prelude.addFunction(\"bool checkForEarlyDiscard(vec4 rawPos)\", checkForEarlyDiscard);\r\n main.add(earlyVertexDiscard);\r\n }\r\n\r\n const computeFeatureOverrides = this.get(VertexShaderComponent.ComputeFeatureOverrides);\r\n if (undefined !== computeFeatureOverrides) {\r\n prelude.addFunction(\"void computeFeatureOverrides()\", computeFeatureOverrides);\r\n main.addline(\" computeFeatureOverrides();\");\r\n }\r\n\r\n const computeMaterial = this.get(VertexShaderComponent.ComputeMaterial);\r\n if (undefined !== computeMaterial) {\r\n prelude.addFunction(\"void computeMaterial()\", computeMaterial);\r\n main.addline(\" computeMaterial();\");\r\n }\r\n\r\n const computeBaseColor = this.get(VertexShaderComponent.ComputeBaseColor);\r\n if (undefined !== computeBaseColor) {\r\n assert(undefined !== this.find(\"v_color\"));\r\n prelude.addFunction(\"vec4 computeBaseColor()\", computeBaseColor);\r\n main.addline(\" vec4 baseColor = computeBaseColor();\");\r\n\r\n const applyMaterialColor = this.get(VertexShaderComponent.ApplyMaterialColor);\r\n if (undefined !== applyMaterialColor) {\r\n prelude.addFunction(\"vec4 applyMaterialColor(vec4 baseColor)\", applyMaterialColor);\r\n main.addline(\" baseColor = applyMaterialColor(baseColor);\");\r\n }\r\n\r\n const applyFeatureColor = this.get(VertexShaderComponent.ApplyFeatureColor);\r\n if (undefined !== applyFeatureColor) {\r\n prelude.addFunction(\"vec4 applyFeatureColor(vec4 baseColor)\", applyFeatureColor);\r\n main.addline(\" baseColor = applyFeatureColor(baseColor);\");\r\n }\r\n\r\n const adjustContrast = this.get(VertexShaderComponent.AdjustContrast);\r\n if (adjustContrast) {\r\n prelude.addFunction(\"vec4 adjustContrast(vec4 baseColor)\", adjustContrast);\r\n main.addline(\" baseColor = adjustContrast(baseColor);\");\r\n }\r\n\r\n main.addline(\" v_color = baseColor;\");\r\n }\r\n\r\n const checkForDiscard = this.get(VertexShaderComponent.CheckForDiscard);\r\n if (undefined !== checkForDiscard) {\r\n prelude.addFunction(\"bool checkForDiscard()\", checkForDiscard);\r\n main.add(vertexDiscard);\r\n }\r\n\r\n main.addline(\" gl_Position = computePosition(rawPosition);\");\r\n\r\n const finalizePos = this.get(VertexShaderComponent.FinalizePosition);\r\n if (undefined !== finalizePos) {\r\n prelude.addFunction(\"vec4 finalizePosition(vec4 pos)\", finalizePos);\r\n main.addline(\" gl_Position = finalizePosition(gl_Position);\");\r\n }\r\n\r\n for (const comp of this._computedVarying) {\r\n main.addline(` ${comp}`);\r\n }\r\n\r\n const computeAtmosphericScatteringVaryings = this.get(VertexShaderComponent.ComputeAtmosphericScatteringVaryings);\r\n if (undefined !== computeAtmosphericScatteringVaryings) {\r\n prelude.addFunction(\"void computeAtmosphericScatteringVaryings()\", computeAtmosphericScatteringVaryings);\r\n main.addline(\" computeAtmosphericScatteringVaryings();\");\r\n }\r\n\r\n const checkForLateDiscard = this.get(VertexShaderComponent.CheckForLateDiscard);\r\n if (undefined !== checkForLateDiscard) {\r\n prelude.addFunction(\"bool checkForLateDiscard()\", checkForLateDiscard);\r\n main.addline(lateVertexDiscard);\r\n }\r\n\r\n prelude.addMain(main.source);\r\n return prelude.source;\r\n }\r\n\r\n public copyFrom(src: VertexShaderBuilder): void {\r\n this.copyCommon(src);\r\n this._computedVarying = [...src._computedVarying];\r\n }\r\n}\r\n\r\n/** Describes the optional and required components which can be assembled into complete\r\n * @internal\r\n */\r\nexport const enum FragmentShaderComponent {\r\n // (Optional) Return true to immediately discard this fragment.\r\n // bool checkForEarlyDiscard()\r\n CheckForEarlyDiscard,\r\n // (Required) Compute this fragment's base color\r\n // vec4 computeBaseColor()\r\n ComputeBaseColor,\r\n // (Optional) Apply material overrides to base color\r\n // vec4 applyMaterialOverrides(vec4 baseColor)\r\n ApplyMaterialOverrides,\r\n // (Optional) Adjust base color after material and/or feature overrides have been applied.\r\n // vec4 finalizeBaseColor(vec4 baseColor)\r\n FinalizeBaseColor,\r\n // (Optional) Return true if this fragment should be discarded\r\n // Do not invoke discard directly in your shader components - instead, return true from this function to generate a discard statement.\r\n // bool checkForDiscard(vec4 baseColor)\r\n CheckForDiscard,\r\n // (Optional) Return true if the alpha value is not suitable for the current render pass\r\n // bool discardByAlpha(float alpha)\r\n DiscardByAlpha,\r\n // (Optional) Apply monochrome overrides to base color\r\n // vec4 applyMonochrome(vec4 baseColor)\r\n ApplyMonochrome,\r\n // (Optional) Apply thematic display to base color. This happens before lighting and can alter the fragment color that is lit.\r\n // vec4 applyThematicDisplay(vec4 baseColor)\r\n ApplyThematicDisplay,\r\n // (Optional) Apply lighting to base color\r\n // vec4 applyLighting(vec4 baseColor)\r\n ApplyLighting,\r\n // (Optional) Apply white-on-white reversal to base color\r\n ReverseWhiteOnWhite,\r\n // (Optional) Discard if outside any clipping planes\r\n // void applyClipping()\r\n ApplyClipping,\r\n // (Optional) Apply flash hilite to lit base color\r\n // vec4 applyFlash(vec4 baseColor)\r\n ApplyFlash,\r\n // (Optional) Apply planar classifier.\r\n // vec4 applyPlanarClassification(vec4)\r\n ApplyPlanarClassifier,\r\n // (Optional) Apply solar shadow map.\r\n // vec4 applySolarShadowMap(vec4)\r\n ApplySolarShadowMap,\r\n // (Optional) Apply wiremesh to edges of triangles\r\n // vec4 applyWiremesh(vec4 baseColor)\r\n ApplyWiremesh,\r\n // (Optional) Apply a debug color\r\n // vec4 applyDebugColor(vec4 baseColor)\r\n ApplyDebugColor,\r\n // (Required) Assign the final color to gl_FragColor or gl_FragData\r\n // void assignFragData(vec4 baseColor)\r\n AssignFragData,\r\n // (Optional) Override current featureId\r\n // vec4 overrideFeatureId(vec4 currentId)\r\n OverrideFeatureId,\r\n // (Optional) Override fragment depth\r\n // float finalizeDepth()\r\n FinalizeDepth,\r\n // (Optional) Override fragment color. This is invoked just after alpha is multiplied, and just before FragColor is assigned.\r\n // vec4 overrideColor(vec4 currentColor)\r\n OverrideColor,\r\n // (Optional) Override render order to be output to pick buffers.\r\n // float overrideRenderOrder(float renderOrder)\r\n OverrideRenderOrder,\r\n // (Optional) Apply atmospheric scattering effect. (For Skybox and RealityMesh only)\r\n // vec4 applyAtmosphericScattering()\r\n ApplyAtmosphericScattering,\r\n // (Optional) Override normal\r\n // float finalizeNormal()\r\n FinalizeNormal,\r\n COUNT,\r\n}\r\n\r\n/** Assembles the source code for a fragment shader from a set of modular components.\r\n * @internal\r\n */\r\nexport class FragmentShaderBuilder extends ShaderBuilder {\r\n public requiresEarlyZWorkaround = false;\r\n\r\n public constructor(flags: ShaderBuilderFlags = {}) {\r\n super(FragmentShaderComponent.COUNT, flags);\r\n this.addFragOutput(\"FragColor\", -1);\r\n }\r\n\r\n public get(id: FragmentShaderComponent): string | undefined { return this.getComponent(id); }\r\n public set(id: FragmentShaderComponent, component: string) { this.addComponent(id, component); }\r\n public unset(id: FragmentShaderComponent) { this.removeComponent(id); }\r\n\r\n public addDrawBuffersExtension(n: number): void {\r\n this.clearFragOutput();\r\n for (let i = 0; i < n; i++)\r\n this.addFragOutput(`FragColor${i}`, i);\r\n }\r\n\r\n public buildSource(): string {\r\n const applyLighting = this.get(FragmentShaderComponent.ApplyLighting);\r\n const prelude = this.buildPrelude(undefined);\r\n\r\n const computeBaseColor = this.get(FragmentShaderComponent.ComputeBaseColor);\r\n assert(undefined !== computeBaseColor);\r\n if (undefined !== computeBaseColor) {\r\n prelude.addFunction(\"vec4 computeBaseColor()\", computeBaseColor);\r\n }\r\n\r\n const main = new SourceBuilder();\r\n main.newline();\r\n\r\n // Initialization logic that should occur at start of main() - primarily global variables whose values\r\n // are too complex to compute inline or which depend on uniforms and/or other globals.\r\n for (const init of this._initializers) {\r\n if (\"\\n\" === init.charAt(0))\r\n main.addline(` {${init} }\\n`);\r\n else\r\n main.addline(` { ${init} }\\n`);\r\n }\r\n\r\n const checkForEarlyDiscard = this.get(FragmentShaderComponent.CheckForEarlyDiscard);\r\n if (undefined !== checkForEarlyDiscard) {\r\n prelude.addFunction(\"bool checkForEarlyDiscard()\", checkForEarlyDiscard);\r\n main.addline(\" if (checkForEarlyDiscard()) { discard; return; }\");\r\n }\r\n\r\n const finalizeNormal = this.get(FragmentShaderComponent.FinalizeNormal);\r\n if (undefined !== finalizeNormal) {\r\n prelude.addFunction(\"vec3 finalizeNormal()\", finalizeNormal);\r\n main.addline(\" g_normal = finalizeNormal();\");\r\n }\r\n\r\n main.addline(\" vec4 baseColor = computeBaseColor();\");\r\n\r\n const finalizeDepth = this.get(FragmentShaderComponent.FinalizeDepth);\r\n if (undefined !== finalizeDepth) {\r\n prelude.addFunction(\"float finalizeDepth()\", finalizeDepth);\r\n main.addline(\" float finalDepth = finalizeDepth();\");\r\n main.addline(\" gl_FragDepth = finalDepth;\");\r\n }\r\n\r\n let clipIndent = \"\";\r\n const applyClipping = this.get(FragmentShaderComponent.ApplyClipping);\r\n if (undefined !== applyClipping) {\r\n prelude.addline(\"vec3 g_clipColor;\\n\");\r\n prelude.addFunction(\"bvec2 applyClipping(vec4 baseColor)\", applyClipping);\r\n main.addline(\" g_hasClipColor = applyClipping(baseColor);\");\r\n main.addline(\" if (g_hasClipColor.x) { baseColor.rgb = g_clipColor; } else {\");\r\n clipIndent = \" \";\r\n }\r\n\r\n const applyMaterialOverrides = this.get(FragmentShaderComponent.ApplyMaterialOverrides);\r\n if (undefined !== applyMaterialOverrides) {\r\n prelude.addFunction(\"vec4 applyMaterialOverrides(vec4 baseColor)\", applyMaterialOverrides);\r\n main.addline(`${clipIndent} baseColor = applyMaterialOverrides(baseColor);`);\r\n }\r\n\r\n const applyThematicDisplay = this.get(FragmentShaderComponent.ApplyThematicDisplay);\r\n if (undefined !== applyThematicDisplay) {\r\n prelude.addFunction(\"vec4 applyThematicDisplay(vec4 baseColor)\", applyThematicDisplay);\r\n main.addline(`${clipIndent} if (u_renderPass != kRenderPass_PlanarClassification)`);\r\n main.addline(`${clipIndent} baseColor = applyThematicDisplay(baseColor);`);\r\n }\r\n\r\n const applyPlanarClassifier = this.get(FragmentShaderComponent.ApplyPlanarClassifier);\r\n if (undefined !== applyPlanarClassifier) {\r\n if (undefined === finalizeDepth) {\r\n if (this.findFunction(volClassOpaqueColor))\r\n main.addline(`${clipIndent} float finalDepth = gl_FragCoord.z;`);\r\n else\r\n main.addline(`${clipIndent} float finalDepth = 1.0;`);\r\n }\r\n prelude.addFunction(\"vec4 applyPlanarClassifications(vec4 baseColor, float depth)\", applyPlanarClassifier);\r\n main.addline(`${clipIndent} baseColor = applyPlanarClassifications(baseColor, finalDepth);`);\r\n }\r\n\r\n const applySolarShadowMap = this.get(FragmentShaderComponent.ApplySolarShadowMap);\r\n if (undefined !== applySolarShadowMap) {\r\n prelude.addFunction(\"vec4 applySolarShadowMap(vec4 baseColor)\", applySolarShadowMap);\r\n main.addline(`${clipIndent} baseColor = applySolarShadowMap(baseColor);`);\r\n }\r\n\r\n const finalize = this.get(FragmentShaderComponent.FinalizeBaseColor);\r\n if (undefined !== finalize) {\r\n prelude.addFunction(\"vec4 finalizeBaseColor(vec4 baseColor)\", finalize);\r\n main.addline(`${clipIndent} baseColor = finalizeBaseColor(baseColor);`);\r\n }\r\n\r\n const checkForDiscard = this.get(FragmentShaderComponent.CheckForDiscard);\r\n if (undefined !== checkForDiscard) {\r\n prelude.addFunction(\"bool checkForDiscard(vec4 baseColor)\", checkForDiscard);\r\n main.addline(`${clipIndent} if (checkForDiscard(baseColor)) { discard; return; }`);\r\n }\r\n\r\n const discardByAlpha = this.get(FragmentShaderComponent.DiscardByAlpha);\r\n if (undefined !== discardByAlpha) {\r\n prelude.addFunction(\"bool discardByAlpha(float alpha)\", discardByAlpha);\r\n main.addline(`${clipIndent} if (discardByAlpha(baseColor.a)) { discard; return; }`);\r\n }\r\n\r\n if (undefined !== applyClipping)\r\n main.addline(\" }\");\r\n\r\n const applyMonochrome = this.get(FragmentShaderComponent.ApplyMonochrome);\r\n if (undefined !== applyMonochrome) {\r\n prelude.addFunction(\"vec4 applyMonochrome(vec4 baseColor)\", applyMonochrome);\r\n main.addline(\" baseColor = applyMonochrome(baseColor);\");\r\n }\r\n\r\n if (undefined !== applyLighting) {\r\n prelude.addFunction(\"vec4 applyLighting(vec4 baseColor)\", applyLighting);\r\n main.addline(\" baseColor = applyLighting(baseColor);\");\r\n }\r\n\r\n if (undefined !== applyClipping) {\r\n main.addline(\" if (g_hasClipColor.y) { baseColor.rgba = vec4(g_clipColor, 1.0); } \");\r\n }\r\n\r\n const reverseWoW = this.get(FragmentShaderComponent.ReverseWhiteOnWhite);\r\n if (undefined !== reverseWoW) {\r\n prelude.addFunction(\"vec4 reverseWhiteOnWhite(vec4 baseColor)\", reverseWoW);\r\n main.addline(\" baseColor = reverseWhiteOnWhite(baseColor);\");\r\n }\r\n\r\n const applyFlash = this.get(FragmentShaderComponent.ApplyFlash);\r\n if (undefined !== applyFlash) {\r\n prelude.addFunction(\"vec4 applyFlash(vec4 baseColor)\", applyFlash);\r\n main.addline(\" baseColor = applyFlash(baseColor);\");\r\n }\r\n\r\n const applyWiremesh = this.get(FragmentShaderComponent.ApplyWiremesh);\r\n if (applyWiremesh) {\r\n prelude.addFunction(\"vec4 applyWiremesh(vec4 baseColor)\", applyWiremesh);\r\n main.addline(\" baseColor = applyWiremesh(baseColor);\");\r\n }\r\n\r\n const applyAtmosphericScattering = this.get(FragmentShaderComponent.ApplyAtmosphericScattering);\r\n if (applyAtmosphericScattering) {\r\n prelude.addFunction(\"vec4 applyAtmosphericScattering(vec4 baseColor)\", applyAtmosphericScattering);\r\n main.addline(\" baseColor = applyAtmosphericScattering(baseColor);\");\r\n }\r\n\r\n const applyDebug = this.get(FragmentShaderComponent.ApplyDebugColor);\r\n if (undefined !== applyDebug) {\r\n prelude.addFunction(\"vec4 applyDebugColor(vec4 baseColor)\", applyDebug);\r\n main.addline(\" baseColor = applyDebugColor(baseColor);\");\r\n }\r\n\r\n const assignFragData = this.get(FragmentShaderComponent.AssignFragData);\r\n assert(undefined !== assignFragData);\r\n if (undefined !== assignFragData) {\r\n prelude.addFunction(\"void assignFragData(vec4 baseColor)\", assignFragData);\r\n main.addline(\" assignFragData(baseColor);\");\r\n }\r\n\r\n if (this.requiresEarlyZWorkaround) {\r\n // Add a conditional discard that never executes to force buggy Intel driver to skip early Z despite our fragment shader writing depth.\r\n main.addline(\"if (v_eyeSpace.z == 9999999.0) discard;\");\r\n }\r\n\r\n prelude.addMain(main.source);\r\n return prelude.source;\r\n }\r\n\r\n private buildPrelude(attrMap: Map<string, AttributeDetails> | undefined): SourceBuilder {\r\n return this.buildPreludeCommon(attrMap, false);\r\n }\r\n\r\n public copyFrom(src: FragmentShaderBuilder): void {\r\n this.copyCommon(src);\r\n this.requiresEarlyZWorkaround = src.requiresEarlyZWorkaround;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport const enum ShaderType {\r\n Fragment = 1 << 0,\r\n Vertex = 1 << 1,\r\n Both = Fragment | Vertex,\r\n}\r\n\r\n/**\r\n * Assembles vertex and fragment shaders from a set of modular components to produce a compiled ShaderProgram.\r\n * Be very careful with components which use samplers to ensure that no conflicts exist with texture units used by other components (see TextureUnit enum).\r\n * @internal\r\n */\r\nexport class ProgramBuilder {\r\n public readonly vert: VertexShaderBuilder;\r\n public readonly frag: FragmentShaderBuilder;\r\n private readonly _flags: ShaderBuilderFlags;\r\n private readonly _attrMap?: Map<string, AttributeDetails>;\r\n\r\n public constructor(attrMap?: Map<string, AttributeDetails>, flags: ShaderBuilderFlags = {}) {\r\n this._attrMap = attrMap;\r\n this.vert = new VertexShaderBuilder(flags);\r\n this.frag = new FragmentShaderBuilder(flags);\r\n this._flags = flags; // only needed for clone - though could look up from vert or frag shader.\r\n }\r\n\r\n private addVariable(v: ShaderVariable, which: ShaderType) {\r\n if (which & ShaderType.Fragment) {\r\n this.frag.addVariable(v);\r\n }\r\n\r\n if (which & ShaderType.Vertex) {\r\n this.vert.addVariable(v);\r\n }\r\n }\r\n\r\n public addUniform(name: string, type: VariableType, binding: AddVariableBinding, which: ShaderType = ShaderType.Both) {\r\n this.addVariable(ShaderVariable.create(name, type, VariableScope.Uniform, binding), which);\r\n }\r\n public addUniformArray(name: string, type: VariableType, length: number, binding: AddVariableBinding, which: ShaderType = ShaderType.Both) {\r\n this.addVariable(ShaderVariable.createArray(name, type, length, VariableScope.Uniform, binding), which);\r\n }\r\n public addVarying(name: string, type: VariableType) {\r\n this.addVariable(ShaderVariable.create(name, type, VariableScope.Varying), ShaderType.Both);\r\n }\r\n public addGlobal(name: string, type: VariableType, which: ShaderType = ShaderType.Both, value?: string, isConst: boolean = false) {\r\n this.addVariable(ShaderVariable.createGlobal(name, type, value, isConst), which);\r\n }\r\n\r\n public addInlineComputedVarying(name: string, type: VariableType, inlineComputation: string) {\r\n if (this.frag.addVarying(name, type))\r\n this.vert.addComputedVarying(name, type, inlineComputation);\r\n }\r\n public addFunctionComputedVarying(name: string, type: VariableType, funcName: string, funcBody: string) {\r\n let funcDecl = `\\n${Convert.typeToString(type)} ${funcName}()`;\r\n funcDecl = SourceBuilder.buildFunctionDefinition(funcDecl, funcBody);\r\n\r\n const funcCall = `${funcName}()`;\r\n this.addFunctionComputedVaryingWithArgs(name, type, funcCall, funcDecl);\r\n }\r\n public addFunctionComputedVaryingWithArgs(name: string, type: VariableType, funcCall: string, funcDef: string) {\r\n this.vert.addFunction(funcDef);\r\n const computation = `${name} = ${funcCall};`;\r\n this.addInlineComputedVarying(name, type, computation);\r\n }\r\n\r\n /** Assembles the vertex and fragment shader code and returns a ready-to-compile shader program */\r\n public buildProgram(gl: WebGL2RenderingContext): ShaderProgram {\r\n const vertSource = this.vert.buildSource(this._attrMap);\r\n const fragSource = this.frag.buildSource(); // NB: frag has no need to specify attributes, only vertex does.\r\n\r\n // Debug output\r\n const debugVaryings = false;\r\n if (debugVaryings) {\r\n const dbgLog = (x: string) => console.log(x); // eslint-disable-line no-console\r\n const outSrc = false; // true for source out, false for just varying info\r\n if (this.frag.headerComment) {\r\n let tStr = \"\";\r\n if (!outSrc) {\r\n tStr = `${this.frag.headerComment}\\n`;\r\n }\r\n const tStr2 = this.vert.checkMaxVaryingVectors(fragSource);\r\n if (tStr2) {\r\n if (outSrc) {\r\n dbgLog(\"//===============================================================================================================\");\r\n dbgLog(vertSource);\r\n dbgLog(\"//========= Varying Info =========\");\r\n dbgLog(tStr2);\r\n dbgLog(fragSource);\r\n } else {\r\n dbgLog(tStr + tStr2);\r\n }\r\n }\r\n }\r\n }\r\n\r\n const prog = new ShaderProgram(gl, vertSource, fragSource, this._attrMap, this.vert.headerComment, this.frag.headerComment);\r\n this.vert.addBindings(prog);\r\n this.frag.addBindings(prog, this.vert);\r\n return prog;\r\n }\r\n\r\n public setDebugDescription(description: string): void {\r\n this.vert.headerComment = (`//!V! ${description}`);\r\n this.frag.headerComment = (`//!F! ${description}`);\r\n }\r\n\r\n /** Returns a deep copy of this program builder. */\r\n public clone(): ProgramBuilder {\r\n const clone = new ProgramBuilder(this._attrMap, this._flags);\r\n clone.vert.copyFrom(this.vert);\r\n clone.frag.copyFrom(this.frag);\r\n return clone;\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SurfaceGeometry.d.ts","sourceRoot":"","sources":["../../../../src/render/webgl/SurfaceGeometry.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAA8C,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE3F,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAkC,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,WAAW,EAA+B,MAAM,eAAe,CAAC;AAE/E,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,gBAAgB;AAChB,wBAAgB,aAAa,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAEpD;AAMD,gBAAgB;AAChB,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IAExC,IAAW,UAAU,qBAA4B;WAEnC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,GAAG,eAAe,GAAG,SAAS;IAKzF,IAAW,UAAU,IAAI,OAAO,CAG/B;IAEM,OAAO;IAKP,iBAAiB,CAAC,KAAK,EAAE,YAAY,CAAC,UAAU,GAAG,IAAI;IAI9D,IAAW,KAAK,YAAmG;IACnH,IAAW,cAAc,YAAwG;IACjI,IAAW,UAAU,YAAgE;IACrF,IAAW,YAAY,YAAgF;IACvG,IAAW,OAAO,YAAgC;IAClD,IAAoB,uBAAuB,YAA2B;IACtE,IAAW,aAAa,YAAuE;IAC/F,IAAW,YAAY,YAAgE;IACvF,IAAoB,uBAAuB,YAE1C;IAED,IAAoB,kBAAkB,YAKrC;IAED,IAAoB,SAAS,SAAmB;IAChD,IAAoB,MAAM,cAAwB;IAClD,IAAoB,YAAY,cAAwB;IAExD,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,wBAAwB,CAAC,EAAE,gBAAgB,GAAG,IAAI;IAmBxE,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAK/D,IAAW,WAAW,IAAI,WAAW,CAAgC;IACrE,IAAoB,YAAY,YAAyB;IACzD,IAAoB,gBAAgB,YAAyC;IAC7E,IAAW,WAAW,IAAI,WAAW,CASpC;IAEe,QAAQ,CAAC,MAAM,EAAE,MAAM;IAOvB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAwD7C,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAmBnD,IAAoB,YAAY,IAAI,YAAY,GAAG,SAAS,CAAmC;IAExF,UAAU,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO;IAIhD,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO;IAIlD,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAwDhF,OAAO;IASP,OAAO,CAAC,YAAY;IA2BpB,OAAO,CAAC,cAAc;CAavB"}
1
+ {"version":3,"file":"SurfaceGeometry.d.ts","sourceRoot":"","sources":["../../../../src/render/webgl/SurfaceGeometry.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAgF,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE7H,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAkC,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,WAAW,EAA+B,MAAM,eAAe,CAAC;AAE/E,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,gBAAgB;AAChB,wBAAgB,aAAa,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAEpD;AAMD,gBAAgB;AAChB,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IAExC,IAAW,UAAU,qBAA4B;WAEnC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,GAAG,eAAe,GAAG,SAAS;IAKzF,IAAW,UAAU,IAAI,OAAO,CAG/B;IAEM,OAAO;IAKP,iBAAiB,CAAC,KAAK,EAAE,YAAY,CAAC,UAAU,GAAG,IAAI;IAI9D,IAAW,KAAK,YAAmG;IACnH,IAAW,cAAc,YAAwG;IACjI,IAAW,UAAU,YAAgE;IACrF,IAAW,YAAY,YAAgF;IACvG,IAAW,OAAO,YAAgC;IAClD,IAAoB,uBAAuB,YAA2B;IACtE,IAAW,aAAa,YAAuE;IAC/F,IAAW,YAAY,YAAgE;IACvF,IAAoB,uBAAuB,YAE1C;IAED,IAAoB,kBAAkB,YAKrC;IAED,IAAoB,SAAS,SAAmB;IAChD,IAAoB,MAAM,cAAwB;IAClD,IAAoB,YAAY,cAAwB;IAExD,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,wBAAwB,CAAC,EAAE,gBAAgB,GAAG,IAAI;IAmBxE,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAK/D,IAAW,WAAW,IAAI,WAAW,CAAgC;IACrE,IAAoB,YAAY,YAAyB;IACzD,IAAoB,gBAAgB,YAAyC;IAC7E,IAAW,WAAW,IAAI,WAAW,CASpC;IAEe,QAAQ,CAAC,MAAM,EAAE,MAAM;IAOvB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAoF7C,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAmBnD,IAAoB,YAAY,IAAI,YAAY,GAAG,SAAS,CAAmC;IAExF,UAAU,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO;IAIhD,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO;IAIlD,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAwDhF,OAAO;IASP,OAAO,CAAC,YAAY;IA2BpB,OAAO,CAAC,cAAc;CAavB"}
@@ -6,7 +6,7 @@
6
6
  * @module WebGL
7
7
  */
8
8
  import { assert, dispose } from "@itwin/core-bentley";
9
- import { FillFlags, RenderMode, TextureTransparency } from "@itwin/core-common";
9
+ import { FillFlags, RenderMode, TextureTransparency, ThematicGradientTransparencyMode } from "@itwin/core-common";
10
10
  import { SurfaceType } from "../../common/render/primitives/SurfaceParams";
11
11
  import { AttributeMap } from "./AttributeMap";
12
12
  import { GL } from "./GL";
@@ -104,7 +104,8 @@ export class SurfaceGeometry extends MeshGeometry {
104
104
  return target.isReadPixelsInProgress ? opaquePass : "translucent";
105
105
  const vf = target.currentViewFlags;
106
106
  // When rendering thematic isolines, we need translucency because they have anti-aliasing.
107
- if (target.wantThematicDisplay && this.supportsThematicDisplay && target.uniforms.thematic.wantIsoLines)
107
+ const thematic = target.wantThematicDisplay && this.supportsThematicDisplay ? target.uniforms.thematic.thematicDisplay : undefined;
108
+ if (thematic && target.uniforms.thematic.wantIsoLines)
108
109
  return "translucent";
109
110
  // In wireframe, unless fill is explicitly enabled for planar region, surface does not draw
110
111
  if (RenderMode.Wireframe === vf.renderMode && !this.mesh.isTextureAlwaysDisplayed) {
@@ -116,6 +117,18 @@ export class SurfaceGeometry extends MeshGeometry {
116
117
  // If transparency disabled by render mode or view flag, always draw opaque.
117
118
  if (!vf.transparency || RenderMode.SolidFill === vf.renderMode || RenderMode.HiddenLine === vf.renderMode)
118
119
  return opaquePass;
120
+ // A gradient texture applied by analysis style always fully determines the transparency of the surface.
121
+ if (this.hasScalarAnimation && undefined !== target.analysisTexture) {
122
+ assert(undefined !== target.analysisStyle?.thematic);
123
+ switch (target.analysisStyle.thematic.thematicSettings.textureTransparency) {
124
+ case TextureTransparency.Translucent:
125
+ return "translucent";
126
+ case TextureTransparency.Opaque:
127
+ return opaquePass;
128
+ case TextureTransparency.Mixed:
129
+ return `${opaquePass}-translucent`;
130
+ }
131
+ }
119
132
  // We have 3 sources of alpha: the material, the texture, and the color.
120
133
  // Base alpha comes from the material if it overrides it; otherwise from the color.
121
134
  // The texture's alpha is multiplied by the base alpha.
@@ -126,8 +139,21 @@ export class SurfaceGeometry extends MeshGeometry {
126
139
  hasAlpha = mat.hasTranslucency;
127
140
  else
128
141
  hasAlpha = this.getColor(target).hasTranslucency;
142
+ // Thematic gradient can optionally multiply gradient alpha with surface alpha.
143
+ if (thematic && thematic.gradientSettings.transparencyMode === ThematicGradientTransparencyMode.MultiplySurfaceAndGradient) {
144
+ switch (thematic.gradientSettings.textureTransparency) {
145
+ case TextureTransparency.Opaque:
146
+ // This surface's alpha gets multiplied by 1 - gradient colors are all opaque.
147
+ return hasAlpha ? "translucent" : opaquePass;
148
+ case TextureTransparency.Translucent:
149
+ // This surface's alpha gets multiplied by < 1 - gradient colors are all translucent.
150
+ return "translucent";
151
+ case TextureTransparency.Mixed:
152
+ // The gradient contains a mix of translucent and opaque colors.
153
+ return hasAlpha ? "translucent" : `${opaquePass}-translucent`;
154
+ }
155
+ }
129
156
  if (!hasAlpha) {
130
- // ###TODO handle TextureTransparency.Mixed; remove Texture.hasTranslucency.
131
157
  const tex = this.wantTextures(target, true) ? this.texture : undefined;
132
158
  switch (tex?.transparency) {
133
159
  case TextureTransparency.Translucent:
@@ -1 +1 @@
1
- {"version":3,"file":"SurfaceGeometry.js","sourceRoot":"","sources":["../../../../src/render/webgl/SurfaceGeometry.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 { FillFlags, RenderMode, TextureTransparency, ViewFlags } from \"@itwin/core-common\";\r\nimport { SurfaceType } from \"../../common/render/primitives/SurfaceParams\";\r\nimport { VertexIndices } from \"../../common/render/primitives/VertexIndices\";\r\nimport { RenderMemory } from \"../RenderMemory\";\r\nimport { AttributeMap } from \"./AttributeMap\";\r\nimport { ShaderProgramParams } from \"./DrawCommand\";\r\nimport { GL } from \"./GL\";\r\nimport { BufferHandle, BufferParameters, BuffersContainer } from \"./AttributeBuffers\";\r\nimport { MaterialInfo } from \"./Material\";\r\nimport { Pass, RenderOrder, RenderPass, SurfaceBitIndex } from \"./RenderFlags\";\r\nimport { System } from \"./System\";\r\nimport { Target } from \"./Target\";\r\nimport { TechniqueId } from \"./TechniqueId\";\r\nimport { MeshData } from \"./MeshData\";\r\nimport { MeshGeometry } from \"./MeshGeometry\";\r\n\r\n/** @internal */\r\nexport function wantMaterials(vf: ViewFlags): boolean {\r\n return vf.materials && RenderMode.SmoothShade === vf.renderMode;\r\n}\r\n\r\nfunction wantLighting(vf: ViewFlags) {\r\n return RenderMode.SmoothShade === vf.renderMode && vf.lighting;\r\n}\r\n\r\n/** @internal */\r\nexport class SurfaceGeometry extends MeshGeometry {\r\n private readonly _buffers: BuffersContainer;\r\n private readonly _indices: BufferHandle;\r\n\r\n public get lutBuffers() { return this._buffers; }\r\n\r\n public static create(mesh: MeshData, indices: VertexIndices): SurfaceGeometry | undefined {\r\n const indexBuffer = BufferHandle.createArrayBuffer(indices.data);\r\n return undefined !== indexBuffer ? new SurfaceGeometry(indexBuffer, indices.length, mesh) : undefined;\r\n }\r\n\r\n public get isDisposed(): boolean {\r\n return this._buffers.isDisposed\r\n && this._indices.isDisposed;\r\n }\r\n\r\n public dispose() {\r\n dispose(this._buffers);\r\n dispose(this._indices);\r\n }\r\n\r\n public collectStatistics(stats: RenderMemory.Statistics): void {\r\n stats.addSurface(this._indices.bytesUsed);\r\n }\r\n\r\n public get isLit() { return SurfaceType.Lit === this.surfaceType || SurfaceType.TexturedLit === this.surfaceType; }\r\n public get isTexturedType() { return SurfaceType.Textured === this.surfaceType || SurfaceType.TexturedLit === this.surfaceType; }\r\n public get hasTexture() { return this.isTexturedType && undefined !== this.texture; }\r\n public get hasNormalMap() { return this.isLit && this.isTexturedType && undefined !== this.normalMap; }\r\n public get isGlyph() { return this.mesh.isGlyph; }\r\n public override get alwaysRenderTranslucent() { return this.isGlyph; }\r\n public get isTileSection() { return undefined !== this.texture && this.texture.isTileSection; }\r\n public get isClassifier() { return SurfaceType.VolumeClassifier === this.surfaceType; }\r\n public override get supportsThematicDisplay() {\r\n return !this.isGlyph;\r\n }\r\n\r\n public override get allowColorOverride() {\r\n // Text background color should not be overridden by feature symbology overrides - otherwise it becomes unreadable...\r\n // We don't actually know if we have text.\r\n // We do know that text background color uses blanking fill. So do ImageGraphics, so they're also going to forbid overriding their color.\r\n return FillFlags.Blanking !== (this.fillFlags & FillFlags.Blanking);\r\n }\r\n\r\n public override get asSurface() { return this; }\r\n public override get asEdge() { return undefined; }\r\n public override get asSilhouette() { return undefined; }\r\n\r\n protected _draw(numInstances: number, instanceBuffersContainer?: BuffersContainer): void {\r\n const system = System.instance;\r\n\r\n // If we can't write depth in the fragment shader, use polygonOffset to force blanking regions to draw behind.\r\n const offset = RenderOrder.BlankingRegion === this.renderOrder && !system.supportsLogZBuffer;\r\n if (offset) {\r\n system.context.enable(GL.POLYGON_OFFSET_FILL);\r\n system.context.polygonOffset(1.0, 1.0);\r\n }\r\n\r\n const bufs = instanceBuffersContainer !== undefined ? instanceBuffersContainer : this._buffers;\r\n bufs.bind();\r\n system.drawArrays(GL.PrimitiveType.Triangles, 0, this._numIndices, numInstances);\r\n bufs.unbind();\r\n\r\n if (offset)\r\n system.context.disable(GL.POLYGON_OFFSET_FILL);\r\n }\r\n\r\n public override wantMixMonochromeColor(target: Target): boolean {\r\n // Text relies on white-on-white reversal.\r\n return !this.isGlyph && (this.isLitSurface || this.wantTextures(target, this.hasTexture));\r\n }\r\n\r\n public get techniqueId(): TechniqueId { return TechniqueId.Surface; }\r\n public override get isLitSurface() { return this.isLit; }\r\n public override get hasBakedLighting() { return this.mesh.hasBakedLighting; }\r\n public get renderOrder(): RenderOrder {\r\n if (FillFlags.Behind === (this.fillFlags & FillFlags.Behind))\r\n return RenderOrder.BlankingRegion;\r\n\r\n let order = this.isLit ? RenderOrder.LitSurface : RenderOrder.UnlitSurface;\r\n if (this.isPlanar)\r\n order = order | RenderOrder.PlanarBit;\r\n\r\n return order;\r\n }\r\n\r\n public override getColor(target: Target) {\r\n if (FillFlags.Background === (this.fillFlags & FillFlags.Background))\r\n return target.uniforms.style.backgroundColorInfo;\r\n else\r\n return this.colorInfo;\r\n }\r\n\r\n public override getPass(target: Target): Pass {\r\n // Classifiers have a dedicated pass\r\n if (this.isClassifier)\r\n return \"classification\";\r\n\r\n let opaquePass: Pass = this.isPlanar ? \"opaque-planar\" : \"opaque\";\r\n\r\n // When reading pixels, glyphs are always opaque. Otherwise always transparent (for anti-aliasing).\r\n if (this.isGlyph)\r\n return target.isReadPixelsInProgress ? opaquePass : \"translucent\";\r\n\r\n const vf = target.currentViewFlags;\r\n\r\n // When rendering thematic isolines, we need translucency because they have anti-aliasing.\r\n if (target.wantThematicDisplay && this.supportsThematicDisplay && target.uniforms.thematic.wantIsoLines)\r\n return \"translucent\";\r\n\r\n // In wireframe, unless fill is explicitly enabled for planar region, surface does not draw\r\n if (RenderMode.Wireframe === vf.renderMode && !this.mesh.isTextureAlwaysDisplayed) {\r\n const fillFlags = this.fillFlags;\r\n const showFill = FillFlags.Always === (fillFlags & FillFlags.Always) || (vf.fill && FillFlags.ByView === (fillFlags & FillFlags.ByView));\r\n if (!showFill)\r\n return \"none\";\r\n }\r\n\r\n // If transparency disabled by render mode or view flag, always draw opaque.\r\n if (!vf.transparency || RenderMode.SolidFill === vf.renderMode || RenderMode.HiddenLine === vf.renderMode)\r\n return opaquePass;\r\n\r\n // We have 3 sources of alpha: the material, the texture, and the color.\r\n // Base alpha comes from the material if it overrides it; otherwise from the color.\r\n // The texture's alpha is multiplied by the base alpha.\r\n // So we must draw in the translucent pass if the texture has transparency OR the base alpha is less than 1.\r\n let hasAlpha = false;\r\n const mat = wantMaterials(vf) ? this.mesh.materialInfo : undefined;\r\n if (undefined !== mat && mat.overridesAlpha)\r\n hasAlpha = mat.hasTranslucency;\r\n else\r\n hasAlpha = this.getColor(target).hasTranslucency;\r\n\r\n if (!hasAlpha) {\r\n // ###TODO handle TextureTransparency.Mixed; remove Texture.hasTranslucency.\r\n const tex = this.wantTextures(target, true) ? this.texture : undefined;\r\n switch (tex?.transparency) {\r\n case TextureTransparency.Translucent:\r\n hasAlpha = true;\r\n break;\r\n case TextureTransparency.Mixed:\r\n opaquePass = `${opaquePass}-translucent`;\r\n break;\r\n }\r\n }\r\n\r\n return hasAlpha ? \"translucent\" : opaquePass;\r\n }\r\n\r\n protected _wantWoWReversal(target: Target): boolean {\r\n const fillFlags = this.fillFlags;\r\n if (FillFlags.None !== (fillFlags & FillFlags.Background))\r\n return false; // fill color explicitly from background\r\n\r\n if (FillFlags.None !== (fillFlags & FillFlags.Always))\r\n return true; // fill displayed even in wireframe\r\n\r\n const vf = target.currentViewFlags;\r\n if (RenderMode.Wireframe === vf.renderMode || vf.visibleEdges)\r\n return false; // never invert surfaces when edges are displayed\r\n\r\n if (this.isLit && wantLighting(vf))\r\n return false;\r\n\r\n // Don't invert white pixels of textures...\r\n return !this.wantTextures(target, this.hasTexture);\r\n }\r\n\r\n public override get materialInfo(): MaterialInfo | undefined { return this.mesh.materialInfo; }\r\n\r\n public useTexture(params: ShaderProgramParams): boolean {\r\n return this.wantTextures(params.target, this.hasTexture);\r\n }\r\n\r\n public useNormalMap(params: ShaderProgramParams): boolean {\r\n return this.wantNormalMaps(params.target, this.hasNormalMap);\r\n }\r\n\r\n public computeSurfaceFlags(params: ShaderProgramParams, flags: Int32Array): void {\r\n const target = params.target;\r\n const vf = target.currentViewFlags;\r\n\r\n const useMaterial = wantMaterials(vf);\r\n flags[SurfaceBitIndex.IgnoreMaterial] = useMaterial ? 0 : 1;\r\n flags[SurfaceBitIndex.HasMaterialAtlas] = useMaterial && this.hasMaterialAtlas ? 1 : 0;\r\n\r\n flags[SurfaceBitIndex.ApplyLighting] = 0;\r\n flags[SurfaceBitIndex.HasColorAndNormal] = 0;\r\n if (this.isLit) {\r\n flags[SurfaceBitIndex.HasNormals] = 1;\r\n if (wantLighting(vf))\r\n flags[SurfaceBitIndex.ApplyLighting] = 1;\r\n\r\n // Textured meshes store normal in place of color index.\r\n // Untextured lit meshes store normal where textured meshes would store UV coords.\r\n // Tell shader where to find normal.\r\n if (!this.isTexturedType) {\r\n flags[SurfaceBitIndex.HasColorAndNormal] = 1;\r\n }\r\n } else {\r\n flags[SurfaceBitIndex.HasNormals] = 0;\r\n }\r\n\r\n flags[SurfaceBitIndex.HasTexture] = this.useTexture(params) ? 1 : 0;\r\n flags[SurfaceBitIndex.HasNormalMap] = this.useNormalMap(params) ? 1 : 0;\r\n flags[SurfaceBitIndex.UseConstantLodTextureMapping] = this.mesh.textureUsesConstantLod ? 1 : 0;\r\n flags[SurfaceBitIndex.UseConstantLodNormalMapMapping] = this.mesh.normalMapUsesConstantLod ? 1 : 0;\r\n\r\n // The transparency threshold controls how transparent a surface must be to allow light to pass through; more opaque surfaces cast shadows.\r\n flags[SurfaceBitIndex.TransparencyThreshold] = params.target.isDrawingShadowMap ? 1 : 0;\r\n flags[SurfaceBitIndex.BackgroundFill] = 0;\r\n switch (params.renderPass) {\r\n // NB: We need this for opaque pass due to SolidFill (must compute transparency, discard below threshold, render opaque at or above threshold)\r\n case RenderPass.OpaqueLinear:\r\n case RenderPass.OpaquePlanar:\r\n case RenderPass.OpaqueGeneral:\r\n case RenderPass.Translucent:\r\n case RenderPass.WorldOverlay:\r\n case RenderPass.OpaqueLayers:\r\n case RenderPass.TranslucentLayers:\r\n case RenderPass.OverlayLayers: {\r\n const mode = vf.renderMode;\r\n if (!this.isGlyph && (RenderMode.HiddenLine === mode || RenderMode.SolidFill === mode)) {\r\n flags[SurfaceBitIndex.TransparencyThreshold] = 1;\r\n if (RenderMode.HiddenLine === mode && FillFlags.Always !== (this.fillFlags & FillFlags.Always)) {\r\n // fill flags test for text - doesn't render with bg fill in hidden line mode.\r\n flags[SurfaceBitIndex.BackgroundFill] = 1;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private constructor(indices: BufferHandle, numIndices: number, mesh: MeshData) {\r\n super(mesh, numIndices);\r\n this._buffers = BuffersContainer.create();\r\n const attrPos = AttributeMap.findAttribute(\"a_pos\", TechniqueId.Surface, false);\r\n assert(undefined !== attrPos);\r\n this._buffers.addBuffer(indices, [BufferParameters.create(attrPos.location, 3, GL.DataType.UnsignedByte, false, 0, 0, false)]);\r\n this._indices = indices;\r\n }\r\n\r\n private wantTextures(target: Target, surfaceTextureExists: boolean): boolean {\r\n if (this.hasScalarAnimation && undefined !== target.analysisTexture)\r\n return true;\r\n\r\n if (!surfaceTextureExists)\r\n return false;\r\n\r\n if (this.mesh.isTextureAlwaysDisplayed)\r\n return true;\r\n\r\n if (this.supportsThematicDisplay && target.wantThematicDisplay)\r\n return false;\r\n\r\n const fill = this.fillFlags;\r\n const flags = target.currentViewFlags;\r\n\r\n // ###TODO need to distinguish between gradient fill and actual textures...\r\n switch (flags.renderMode) {\r\n case RenderMode.SmoothShade:\r\n return flags.textures;\r\n case RenderMode.Wireframe:\r\n return FillFlags.Always === (fill & FillFlags.Always) || (flags.fill && FillFlags.ByView === (fill & FillFlags.ByView));\r\n default:\r\n return FillFlags.Always === (fill & FillFlags.Always);\r\n }\r\n }\r\n\r\n private wantNormalMaps(target: Target, normalMapExists: boolean): boolean {\r\n if (!normalMapExists || !target.displayNormalMaps)\r\n return false;\r\n\r\n const flags = target.currentViewFlags;\r\n\r\n switch (flags.renderMode) {\r\n case RenderMode.SmoothShade:\r\n return flags.textures;\r\n default:\r\n return false;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"SurfaceGeometry.js","sourceRoot":"","sources":["../../../../src/render/webgl/SurfaceGeometry.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 { FillFlags, RenderMode, TextureTransparency, ThematicGradientTransparencyMode, ViewFlags } from \"@itwin/core-common\";\r\nimport { SurfaceType } from \"../../common/render/primitives/SurfaceParams\";\r\nimport { VertexIndices } from \"../../common/render/primitives/VertexIndices\";\r\nimport { RenderMemory } from \"../RenderMemory\";\r\nimport { AttributeMap } from \"./AttributeMap\";\r\nimport { ShaderProgramParams } from \"./DrawCommand\";\r\nimport { GL } from \"./GL\";\r\nimport { BufferHandle, BufferParameters, BuffersContainer } from \"./AttributeBuffers\";\r\nimport { MaterialInfo } from \"./Material\";\r\nimport { Pass, RenderOrder, RenderPass, SurfaceBitIndex } from \"./RenderFlags\";\r\nimport { System } from \"./System\";\r\nimport { Target } from \"./Target\";\r\nimport { TechniqueId } from \"./TechniqueId\";\r\nimport { MeshData } from \"./MeshData\";\r\nimport { MeshGeometry } from \"./MeshGeometry\";\r\n\r\n/** @internal */\r\nexport function wantMaterials(vf: ViewFlags): boolean {\r\n return vf.materials && RenderMode.SmoothShade === vf.renderMode;\r\n}\r\n\r\nfunction wantLighting(vf: ViewFlags) {\r\n return RenderMode.SmoothShade === vf.renderMode && vf.lighting;\r\n}\r\n\r\n/** @internal */\r\nexport class SurfaceGeometry extends MeshGeometry {\r\n private readonly _buffers: BuffersContainer;\r\n private readonly _indices: BufferHandle;\r\n\r\n public get lutBuffers() { return this._buffers; }\r\n\r\n public static create(mesh: MeshData, indices: VertexIndices): SurfaceGeometry | undefined {\r\n const indexBuffer = BufferHandle.createArrayBuffer(indices.data);\r\n return undefined !== indexBuffer ? new SurfaceGeometry(indexBuffer, indices.length, mesh) : undefined;\r\n }\r\n\r\n public get isDisposed(): boolean {\r\n return this._buffers.isDisposed\r\n && this._indices.isDisposed;\r\n }\r\n\r\n public dispose() {\r\n dispose(this._buffers);\r\n dispose(this._indices);\r\n }\r\n\r\n public collectStatistics(stats: RenderMemory.Statistics): void {\r\n stats.addSurface(this._indices.bytesUsed);\r\n }\r\n\r\n public get isLit() { return SurfaceType.Lit === this.surfaceType || SurfaceType.TexturedLit === this.surfaceType; }\r\n public get isTexturedType() { return SurfaceType.Textured === this.surfaceType || SurfaceType.TexturedLit === this.surfaceType; }\r\n public get hasTexture() { return this.isTexturedType && undefined !== this.texture; }\r\n public get hasNormalMap() { return this.isLit && this.isTexturedType && undefined !== this.normalMap; }\r\n public get isGlyph() { return this.mesh.isGlyph; }\r\n public override get alwaysRenderTranslucent() { return this.isGlyph; }\r\n public get isTileSection() { return undefined !== this.texture && this.texture.isTileSection; }\r\n public get isClassifier() { return SurfaceType.VolumeClassifier === this.surfaceType; }\r\n public override get supportsThematicDisplay() {\r\n return !this.isGlyph;\r\n }\r\n\r\n public override get allowColorOverride() {\r\n // Text background color should not be overridden by feature symbology overrides - otherwise it becomes unreadable...\r\n // We don't actually know if we have text.\r\n // We do know that text background color uses blanking fill. So do ImageGraphics, so they're also going to forbid overriding their color.\r\n return FillFlags.Blanking !== (this.fillFlags & FillFlags.Blanking);\r\n }\r\n\r\n public override get asSurface() { return this; }\r\n public override get asEdge() { return undefined; }\r\n public override get asSilhouette() { return undefined; }\r\n\r\n protected _draw(numInstances: number, instanceBuffersContainer?: BuffersContainer): void {\r\n const system = System.instance;\r\n\r\n // If we can't write depth in the fragment shader, use polygonOffset to force blanking regions to draw behind.\r\n const offset = RenderOrder.BlankingRegion === this.renderOrder && !system.supportsLogZBuffer;\r\n if (offset) {\r\n system.context.enable(GL.POLYGON_OFFSET_FILL);\r\n system.context.polygonOffset(1.0, 1.0);\r\n }\r\n\r\n const bufs = instanceBuffersContainer !== undefined ? instanceBuffersContainer : this._buffers;\r\n bufs.bind();\r\n system.drawArrays(GL.PrimitiveType.Triangles, 0, this._numIndices, numInstances);\r\n bufs.unbind();\r\n\r\n if (offset)\r\n system.context.disable(GL.POLYGON_OFFSET_FILL);\r\n }\r\n\r\n public override wantMixMonochromeColor(target: Target): boolean {\r\n // Text relies on white-on-white reversal.\r\n return !this.isGlyph && (this.isLitSurface || this.wantTextures(target, this.hasTexture));\r\n }\r\n\r\n public get techniqueId(): TechniqueId { return TechniqueId.Surface; }\r\n public override get isLitSurface() { return this.isLit; }\r\n public override get hasBakedLighting() { return this.mesh.hasBakedLighting; }\r\n public get renderOrder(): RenderOrder {\r\n if (FillFlags.Behind === (this.fillFlags & FillFlags.Behind))\r\n return RenderOrder.BlankingRegion;\r\n\r\n let order = this.isLit ? RenderOrder.LitSurface : RenderOrder.UnlitSurface;\r\n if (this.isPlanar)\r\n order = order | RenderOrder.PlanarBit;\r\n\r\n return order;\r\n }\r\n\r\n public override getColor(target: Target) {\r\n if (FillFlags.Background === (this.fillFlags & FillFlags.Background))\r\n return target.uniforms.style.backgroundColorInfo;\r\n else\r\n return this.colorInfo;\r\n }\r\n\r\n public override getPass(target: Target): Pass {\r\n // Classifiers have a dedicated pass\r\n if (this.isClassifier)\r\n return \"classification\";\r\n\r\n let opaquePass: Pass = this.isPlanar ? \"opaque-planar\" : \"opaque\";\r\n\r\n // When reading pixels, glyphs are always opaque. Otherwise always transparent (for anti-aliasing).\r\n if (this.isGlyph)\r\n return target.isReadPixelsInProgress ? opaquePass : \"translucent\";\r\n\r\n const vf = target.currentViewFlags;\r\n\r\n // When rendering thematic isolines, we need translucency because they have anti-aliasing.\r\n const thematic = target.wantThematicDisplay && this.supportsThematicDisplay ? target.uniforms.thematic.thematicDisplay : undefined;\r\n if (thematic && target.uniforms.thematic.wantIsoLines)\r\n return \"translucent\";\r\n\r\n // In wireframe, unless fill is explicitly enabled for planar region, surface does not draw\r\n if (RenderMode.Wireframe === vf.renderMode && !this.mesh.isTextureAlwaysDisplayed) {\r\n const fillFlags = this.fillFlags;\r\n const showFill = FillFlags.Always === (fillFlags & FillFlags.Always) || (vf.fill && FillFlags.ByView === (fillFlags & FillFlags.ByView));\r\n if (!showFill)\r\n return \"none\";\r\n }\r\n\r\n // If transparency disabled by render mode or view flag, always draw opaque.\r\n if (!vf.transparency || RenderMode.SolidFill === vf.renderMode || RenderMode.HiddenLine === vf.renderMode)\r\n return opaquePass;\r\n\r\n // A gradient texture applied by analysis style always fully determines the transparency of the surface.\r\n if (this.hasScalarAnimation && undefined !== target.analysisTexture) {\r\n assert(undefined !== target.analysisStyle?.thematic);\r\n switch (target.analysisStyle.thematic.thematicSettings.textureTransparency) {\r\n case TextureTransparency.Translucent:\r\n return \"translucent\";\r\n case TextureTransparency.Opaque:\r\n return opaquePass;\r\n case TextureTransparency.Mixed:\r\n return `${opaquePass}-translucent`;\r\n }\r\n }\r\n\r\n // We have 3 sources of alpha: the material, the texture, and the color.\r\n // Base alpha comes from the material if it overrides it; otherwise from the color.\r\n // The texture's alpha is multiplied by the base alpha.\r\n // So we must draw in the translucent pass if the texture has transparency OR the base alpha is less than 1.\r\n let hasAlpha = false;\r\n const mat = wantMaterials(vf) ? this.mesh.materialInfo : undefined;\r\n if (undefined !== mat && mat.overridesAlpha)\r\n hasAlpha = mat.hasTranslucency;\r\n else\r\n hasAlpha = this.getColor(target).hasTranslucency;\r\n\r\n // Thematic gradient can optionally multiply gradient alpha with surface alpha.\r\n if (thematic && thematic.gradientSettings.transparencyMode === ThematicGradientTransparencyMode.MultiplySurfaceAndGradient) {\r\n switch (thematic.gradientSettings.textureTransparency) {\r\n case TextureTransparency.Opaque:\r\n // This surface's alpha gets multiplied by 1 - gradient colors are all opaque.\r\n return hasAlpha ? \"translucent\" : opaquePass;\r\n case TextureTransparency.Translucent:\r\n // This surface's alpha gets multiplied by < 1 - gradient colors are all translucent.\r\n return \"translucent\";\r\n case TextureTransparency.Mixed:\r\n // The gradient contains a mix of translucent and opaque colors.\r\n return hasAlpha ? \"translucent\" : `${opaquePass}-translucent`;\r\n }\r\n }\r\n\r\n if (!hasAlpha) {\r\n const tex = this.wantTextures(target, true) ? this.texture : undefined;\r\n switch (tex?.transparency) {\r\n case TextureTransparency.Translucent:\r\n hasAlpha = true;\r\n break;\r\n case TextureTransparency.Mixed:\r\n opaquePass = `${opaquePass}-translucent`;\r\n break;\r\n }\r\n }\r\n\r\n return hasAlpha ? \"translucent\" : opaquePass;\r\n }\r\n\r\n protected _wantWoWReversal(target: Target): boolean {\r\n const fillFlags = this.fillFlags;\r\n if (FillFlags.None !== (fillFlags & FillFlags.Background))\r\n return false; // fill color explicitly from background\r\n\r\n if (FillFlags.None !== (fillFlags & FillFlags.Always))\r\n return true; // fill displayed even in wireframe\r\n\r\n const vf = target.currentViewFlags;\r\n if (RenderMode.Wireframe === vf.renderMode || vf.visibleEdges)\r\n return false; // never invert surfaces when edges are displayed\r\n\r\n if (this.isLit && wantLighting(vf))\r\n return false;\r\n\r\n // Don't invert white pixels of textures...\r\n return !this.wantTextures(target, this.hasTexture);\r\n }\r\n\r\n public override get materialInfo(): MaterialInfo | undefined { return this.mesh.materialInfo; }\r\n\r\n public useTexture(params: ShaderProgramParams): boolean {\r\n return this.wantTextures(params.target, this.hasTexture);\r\n }\r\n\r\n public useNormalMap(params: ShaderProgramParams): boolean {\r\n return this.wantNormalMaps(params.target, this.hasNormalMap);\r\n }\r\n\r\n public computeSurfaceFlags(params: ShaderProgramParams, flags: Int32Array): void {\r\n const target = params.target;\r\n const vf = target.currentViewFlags;\r\n\r\n const useMaterial = wantMaterials(vf);\r\n flags[SurfaceBitIndex.IgnoreMaterial] = useMaterial ? 0 : 1;\r\n flags[SurfaceBitIndex.HasMaterialAtlas] = useMaterial && this.hasMaterialAtlas ? 1 : 0;\r\n\r\n flags[SurfaceBitIndex.ApplyLighting] = 0;\r\n flags[SurfaceBitIndex.HasColorAndNormal] = 0;\r\n if (this.isLit) {\r\n flags[SurfaceBitIndex.HasNormals] = 1;\r\n if (wantLighting(vf))\r\n flags[SurfaceBitIndex.ApplyLighting] = 1;\r\n\r\n // Textured meshes store normal in place of color index.\r\n // Untextured lit meshes store normal where textured meshes would store UV coords.\r\n // Tell shader where to find normal.\r\n if (!this.isTexturedType) {\r\n flags[SurfaceBitIndex.HasColorAndNormal] = 1;\r\n }\r\n } else {\r\n flags[SurfaceBitIndex.HasNormals] = 0;\r\n }\r\n\r\n flags[SurfaceBitIndex.HasTexture] = this.useTexture(params) ? 1 : 0;\r\n flags[SurfaceBitIndex.HasNormalMap] = this.useNormalMap(params) ? 1 : 0;\r\n flags[SurfaceBitIndex.UseConstantLodTextureMapping] = this.mesh.textureUsesConstantLod ? 1 : 0;\r\n flags[SurfaceBitIndex.UseConstantLodNormalMapMapping] = this.mesh.normalMapUsesConstantLod ? 1 : 0;\r\n\r\n // The transparency threshold controls how transparent a surface must be to allow light to pass through; more opaque surfaces cast shadows.\r\n flags[SurfaceBitIndex.TransparencyThreshold] = params.target.isDrawingShadowMap ? 1 : 0;\r\n flags[SurfaceBitIndex.BackgroundFill] = 0;\r\n switch (params.renderPass) {\r\n // NB: We need this for opaque pass due to SolidFill (must compute transparency, discard below threshold, render opaque at or above threshold)\r\n case RenderPass.OpaqueLinear:\r\n case RenderPass.OpaquePlanar:\r\n case RenderPass.OpaqueGeneral:\r\n case RenderPass.Translucent:\r\n case RenderPass.WorldOverlay:\r\n case RenderPass.OpaqueLayers:\r\n case RenderPass.TranslucentLayers:\r\n case RenderPass.OverlayLayers: {\r\n const mode = vf.renderMode;\r\n if (!this.isGlyph && (RenderMode.HiddenLine === mode || RenderMode.SolidFill === mode)) {\r\n flags[SurfaceBitIndex.TransparencyThreshold] = 1;\r\n if (RenderMode.HiddenLine === mode && FillFlags.Always !== (this.fillFlags & FillFlags.Always)) {\r\n // fill flags test for text - doesn't render with bg fill in hidden line mode.\r\n flags[SurfaceBitIndex.BackgroundFill] = 1;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private constructor(indices: BufferHandle, numIndices: number, mesh: MeshData) {\r\n super(mesh, numIndices);\r\n this._buffers = BuffersContainer.create();\r\n const attrPos = AttributeMap.findAttribute(\"a_pos\", TechniqueId.Surface, false);\r\n assert(undefined !== attrPos);\r\n this._buffers.addBuffer(indices, [BufferParameters.create(attrPos.location, 3, GL.DataType.UnsignedByte, false, 0, 0, false)]);\r\n this._indices = indices;\r\n }\r\n\r\n private wantTextures(target: Target, surfaceTextureExists: boolean): boolean {\r\n if (this.hasScalarAnimation && undefined !== target.analysisTexture)\r\n return true;\r\n\r\n if (!surfaceTextureExists)\r\n return false;\r\n\r\n if (this.mesh.isTextureAlwaysDisplayed)\r\n return true;\r\n\r\n if (this.supportsThematicDisplay && target.wantThematicDisplay)\r\n return false;\r\n\r\n const fill = this.fillFlags;\r\n const flags = target.currentViewFlags;\r\n\r\n // ###TODO need to distinguish between gradient fill and actual textures...\r\n switch (flags.renderMode) {\r\n case RenderMode.SmoothShade:\r\n return flags.textures;\r\n case RenderMode.Wireframe:\r\n return FillFlags.Always === (fill & FillFlags.Always) || (flags.fill && FillFlags.ByView === (fill & FillFlags.ByView));\r\n default:\r\n return FillFlags.Always === (fill & FillFlags.Always);\r\n }\r\n }\r\n\r\n private wantNormalMaps(target: Target, normalMapExists: boolean): boolean {\r\n if (!normalMapExists || !target.displayNormalMaps)\r\n return false;\r\n\r\n const flags = target.currentViewFlags;\r\n\r\n switch (flags.renderMode) {\r\n case RenderMode.SmoothShade:\r\n return flags.textures;\r\n default:\r\n return false;\r\n }\r\n }\r\n}\r\n"]}