@itwin/core-frontend 3.0.0-dev.174 → 3.0.0-dev.178

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 (239) hide show
  1. package/lib/cjs/IModelApp.d.ts +1 -1
  2. package/lib/cjs/IModelApp.d.ts.map +1 -1
  3. package/lib/cjs/IModelApp.js.map +1 -1
  4. package/lib/cjs/SheetViewState.d.ts.map +1 -1
  5. package/lib/cjs/SheetViewState.js +1 -2
  6. package/lib/cjs/SheetViewState.js.map +1 -1
  7. package/lib/cjs/Viewport.d.ts +1 -0
  8. package/lib/cjs/Viewport.d.ts.map +1 -1
  9. package/lib/cjs/Viewport.js +10 -2
  10. package/lib/cjs/Viewport.js.map +1 -1
  11. package/lib/cjs/render/RenderSystem.d.ts.map +1 -1
  12. package/lib/cjs/render/RenderSystem.js +5 -6
  13. package/lib/cjs/render/RenderSystem.js.map +1 -1
  14. package/lib/cjs/render/RenderTexture.d.ts +2 -17
  15. package/lib/cjs/render/RenderTexture.d.ts.map +1 -1
  16. package/lib/cjs/render/RenderTexture.js +0 -17
  17. package/lib/cjs/render/RenderTexture.js.map +1 -1
  18. package/lib/cjs/render/webgl/BackgroundMapDrape.js +1 -1
  19. package/lib/cjs/render/webgl/BackgroundMapDrape.js.map +1 -1
  20. package/lib/cjs/render/webgl/CachedGeometry.d.ts +7 -6
  21. package/lib/cjs/render/webgl/CachedGeometry.d.ts.map +1 -1
  22. package/lib/cjs/render/webgl/CachedGeometry.js +7 -6
  23. package/lib/cjs/render/webgl/CachedGeometry.js.map +1 -1
  24. package/lib/cjs/render/webgl/DrawCommand.d.ts +2 -2
  25. package/lib/cjs/render/webgl/DrawCommand.d.ts.map +1 -1
  26. package/lib/cjs/render/webgl/DrawCommand.js +2 -2
  27. package/lib/cjs/render/webgl/DrawCommand.js.map +1 -1
  28. package/lib/cjs/render/webgl/EdgeGeometry.d.ts +3 -3
  29. package/lib/cjs/render/webgl/EdgeGeometry.d.ts.map +1 -1
  30. package/lib/cjs/render/webgl/EdgeGeometry.js +2 -2
  31. package/lib/cjs/render/webgl/EdgeGeometry.js.map +1 -1
  32. package/lib/cjs/render/webgl/IndexedEdgeGeometry.d.ts +1 -1
  33. package/lib/cjs/render/webgl/IndexedEdgeGeometry.d.ts.map +1 -1
  34. package/lib/cjs/render/webgl/IndexedEdgeGeometry.js +1 -1
  35. package/lib/cjs/render/webgl/IndexedEdgeGeometry.js.map +1 -1
  36. package/lib/cjs/render/webgl/InstancedGeometry.d.ts +1 -1
  37. package/lib/cjs/render/webgl/InstancedGeometry.d.ts.map +1 -1
  38. package/lib/cjs/render/webgl/InstancedGeometry.js +1 -1
  39. package/lib/cjs/render/webgl/InstancedGeometry.js.map +1 -1
  40. package/lib/cjs/render/webgl/MeshGeometry.d.ts +2 -2
  41. package/lib/cjs/render/webgl/MeshGeometry.d.ts.map +1 -1
  42. package/lib/cjs/render/webgl/MeshGeometry.js +4 -5
  43. package/lib/cjs/render/webgl/MeshGeometry.js.map +1 -1
  44. package/lib/cjs/render/webgl/PlanarClassifier.d.ts.map +1 -1
  45. package/lib/cjs/render/webgl/PlanarClassifier.js +2 -1
  46. package/lib/cjs/render/webgl/PlanarClassifier.js.map +1 -1
  47. package/lib/cjs/render/webgl/PlanarGrid.d.ts +2 -3
  48. package/lib/cjs/render/webgl/PlanarGrid.d.ts.map +1 -1
  49. package/lib/cjs/render/webgl/PlanarGrid.js +1 -1
  50. package/lib/cjs/render/webgl/PlanarGrid.js.map +1 -1
  51. package/lib/cjs/render/webgl/PointCloud.d.ts +2 -2
  52. package/lib/cjs/render/webgl/PointCloud.d.ts.map +1 -1
  53. package/lib/cjs/render/webgl/PointCloud.js +2 -2
  54. package/lib/cjs/render/webgl/PointCloud.js.map +1 -1
  55. package/lib/cjs/render/webgl/PointString.d.ts +2 -2
  56. package/lib/cjs/render/webgl/PointString.d.ts.map +1 -1
  57. package/lib/cjs/render/webgl/PointString.js +1 -1
  58. package/lib/cjs/render/webgl/PointString.js.map +1 -1
  59. package/lib/cjs/render/webgl/Polyline.d.ts +2 -2
  60. package/lib/cjs/render/webgl/Polyline.d.ts.map +1 -1
  61. package/lib/cjs/render/webgl/Polyline.js +6 -6
  62. package/lib/cjs/render/webgl/Polyline.js.map +1 -1
  63. package/lib/cjs/render/webgl/Primitive.d.ts +2 -2
  64. package/lib/cjs/render/webgl/Primitive.d.ts.map +1 -1
  65. package/lib/cjs/render/webgl/Primitive.js +5 -5
  66. package/lib/cjs/render/webgl/Primitive.js.map +1 -1
  67. package/lib/cjs/render/webgl/RealityMesh.d.ts +2 -2
  68. package/lib/cjs/render/webgl/RealityMesh.d.ts.map +1 -1
  69. package/lib/cjs/render/webgl/RealityMesh.js +4 -4
  70. package/lib/cjs/render/webgl/RealityMesh.js.map +1 -1
  71. package/lib/cjs/render/webgl/RenderCommands.d.ts +2 -2
  72. package/lib/cjs/render/webgl/RenderCommands.d.ts.map +1 -1
  73. package/lib/cjs/render/webgl/RenderCommands.js +49 -42
  74. package/lib/cjs/render/webgl/RenderCommands.js.map +1 -1
  75. package/lib/cjs/render/webgl/RenderFlags.d.ts +43 -0
  76. package/lib/cjs/render/webgl/RenderFlags.d.ts.map +1 -1
  77. package/lib/cjs/render/webgl/RenderFlags.js +58 -1
  78. package/lib/cjs/render/webgl/RenderFlags.js.map +1 -1
  79. package/lib/cjs/render/webgl/SceneCompositor.js +3 -3
  80. package/lib/cjs/render/webgl/SceneCompositor.js.map +1 -1
  81. package/lib/cjs/render/webgl/ShaderProgram.d.ts +1 -1
  82. package/lib/cjs/render/webgl/ShaderProgram.d.ts.map +1 -1
  83. package/lib/cjs/render/webgl/ShaderProgram.js +4 -4
  84. package/lib/cjs/render/webgl/ShaderProgram.js.map +1 -1
  85. package/lib/cjs/render/webgl/SolarShadowMap.d.ts.map +1 -1
  86. package/lib/cjs/render/webgl/SolarShadowMap.js +2 -2
  87. package/lib/cjs/render/webgl/SolarShadowMap.js.map +1 -1
  88. package/lib/cjs/render/webgl/SurfaceGeometry.d.ts +2 -2
  89. package/lib/cjs/render/webgl/SurfaceGeometry.d.ts.map +1 -1
  90. package/lib/cjs/render/webgl/SurfaceGeometry.js +16 -8
  91. package/lib/cjs/render/webgl/SurfaceGeometry.js.map +1 -1
  92. package/lib/cjs/render/webgl/System.d.ts.map +1 -1
  93. package/lib/cjs/render/webgl/System.js +15 -11
  94. package/lib/cjs/render/webgl/System.js.map +1 -1
  95. package/lib/cjs/render/webgl/Technique.d.ts.map +1 -1
  96. package/lib/cjs/render/webgl/Technique.js +1 -68
  97. package/lib/cjs/render/webgl/Technique.js.map +1 -1
  98. package/lib/cjs/render/webgl/Texture.d.ts +15 -12
  99. package/lib/cjs/render/webgl/Texture.d.ts.map +1 -1
  100. package/lib/cjs/render/webgl/Texture.js +26 -23
  101. package/lib/cjs/render/webgl/Texture.js.map +1 -1
  102. package/lib/cjs/render/webgl/glsl/AmbientOcclusion.d.ts.map +1 -1
  103. package/lib/cjs/render/webgl/glsl/AmbientOcclusion.js +82 -17
  104. package/lib/cjs/render/webgl/glsl/AmbientOcclusion.js.map +1 -1
  105. package/lib/cjs/render/webgl/glsl/FeatureSymbology.d.ts.map +1 -1
  106. package/lib/cjs/render/webgl/glsl/FeatureSymbology.js +9 -5
  107. package/lib/cjs/render/webgl/glsl/FeatureSymbology.js.map +1 -1
  108. package/lib/cjs/render/webgl/glsl/Surface.d.ts.map +1 -1
  109. package/lib/cjs/render/webgl/glsl/Surface.js +29 -7
  110. package/lib/cjs/render/webgl/glsl/Surface.js.map +1 -1
  111. package/lib/cjs/render/webgl/glsl/Vertex.js +1 -1
  112. package/lib/cjs/render/webgl/glsl/Vertex.js.map +1 -1
  113. package/lib/cjs/tile/GltfReader.d.ts.map +1 -1
  114. package/lib/cjs/tile/GltfReader.js +1 -2
  115. package/lib/cjs/tile/GltfReader.js.map +1 -1
  116. package/lib/cjs/tile/ImdlReader.d.ts +3 -1
  117. package/lib/cjs/tile/ImdlReader.d.ts.map +1 -1
  118. package/lib/cjs/tile/ImdlReader.js +1 -1
  119. package/lib/cjs/tile/ImdlReader.js.map +1 -1
  120. package/lib/esm/IModelApp.d.ts +1 -1
  121. package/lib/esm/IModelApp.d.ts.map +1 -1
  122. package/lib/esm/IModelApp.js.map +1 -1
  123. package/lib/esm/SheetViewState.d.ts.map +1 -1
  124. package/lib/esm/SheetViewState.js +1 -2
  125. package/lib/esm/SheetViewState.js.map +1 -1
  126. package/lib/esm/Viewport.d.ts +1 -0
  127. package/lib/esm/Viewport.d.ts.map +1 -1
  128. package/lib/esm/Viewport.js +10 -2
  129. package/lib/esm/Viewport.js.map +1 -1
  130. package/lib/esm/render/RenderSystem.d.ts.map +1 -1
  131. package/lib/esm/render/RenderSystem.js +6 -7
  132. package/lib/esm/render/RenderSystem.js.map +1 -1
  133. package/lib/esm/render/RenderTexture.d.ts +2 -17
  134. package/lib/esm/render/RenderTexture.d.ts.map +1 -1
  135. package/lib/esm/render/RenderTexture.js +1 -16
  136. package/lib/esm/render/RenderTexture.js.map +1 -1
  137. package/lib/esm/render/webgl/BackgroundMapDrape.js +2 -2
  138. package/lib/esm/render/webgl/BackgroundMapDrape.js.map +1 -1
  139. package/lib/esm/render/webgl/CachedGeometry.d.ts +7 -6
  140. package/lib/esm/render/webgl/CachedGeometry.d.ts.map +1 -1
  141. package/lib/esm/render/webgl/CachedGeometry.js +7 -6
  142. package/lib/esm/render/webgl/CachedGeometry.js.map +1 -1
  143. package/lib/esm/render/webgl/DrawCommand.d.ts +2 -2
  144. package/lib/esm/render/webgl/DrawCommand.d.ts.map +1 -1
  145. package/lib/esm/render/webgl/DrawCommand.js +2 -2
  146. package/lib/esm/render/webgl/DrawCommand.js.map +1 -1
  147. package/lib/esm/render/webgl/EdgeGeometry.d.ts +3 -3
  148. package/lib/esm/render/webgl/EdgeGeometry.d.ts.map +1 -1
  149. package/lib/esm/render/webgl/EdgeGeometry.js +2 -2
  150. package/lib/esm/render/webgl/EdgeGeometry.js.map +1 -1
  151. package/lib/esm/render/webgl/IndexedEdgeGeometry.d.ts +1 -1
  152. package/lib/esm/render/webgl/IndexedEdgeGeometry.d.ts.map +1 -1
  153. package/lib/esm/render/webgl/IndexedEdgeGeometry.js +1 -1
  154. package/lib/esm/render/webgl/IndexedEdgeGeometry.js.map +1 -1
  155. package/lib/esm/render/webgl/InstancedGeometry.d.ts +1 -1
  156. package/lib/esm/render/webgl/InstancedGeometry.d.ts.map +1 -1
  157. package/lib/esm/render/webgl/InstancedGeometry.js +1 -1
  158. package/lib/esm/render/webgl/InstancedGeometry.js.map +1 -1
  159. package/lib/esm/render/webgl/MeshGeometry.d.ts +2 -2
  160. package/lib/esm/render/webgl/MeshGeometry.d.ts.map +1 -1
  161. package/lib/esm/render/webgl/MeshGeometry.js +4 -5
  162. package/lib/esm/render/webgl/MeshGeometry.js.map +1 -1
  163. package/lib/esm/render/webgl/PlanarClassifier.d.ts.map +1 -1
  164. package/lib/esm/render/webgl/PlanarClassifier.js +3 -2
  165. package/lib/esm/render/webgl/PlanarClassifier.js.map +1 -1
  166. package/lib/esm/render/webgl/PlanarGrid.d.ts +2 -3
  167. package/lib/esm/render/webgl/PlanarGrid.d.ts.map +1 -1
  168. package/lib/esm/render/webgl/PlanarGrid.js +1 -1
  169. package/lib/esm/render/webgl/PlanarGrid.js.map +1 -1
  170. package/lib/esm/render/webgl/PointCloud.d.ts +2 -2
  171. package/lib/esm/render/webgl/PointCloud.d.ts.map +1 -1
  172. package/lib/esm/render/webgl/PointCloud.js +2 -2
  173. package/lib/esm/render/webgl/PointCloud.js.map +1 -1
  174. package/lib/esm/render/webgl/PointString.d.ts +2 -2
  175. package/lib/esm/render/webgl/PointString.d.ts.map +1 -1
  176. package/lib/esm/render/webgl/PointString.js +1 -1
  177. package/lib/esm/render/webgl/PointString.js.map +1 -1
  178. package/lib/esm/render/webgl/Polyline.d.ts +2 -2
  179. package/lib/esm/render/webgl/Polyline.d.ts.map +1 -1
  180. package/lib/esm/render/webgl/Polyline.js +6 -6
  181. package/lib/esm/render/webgl/Polyline.js.map +1 -1
  182. package/lib/esm/render/webgl/Primitive.d.ts +2 -2
  183. package/lib/esm/render/webgl/Primitive.d.ts.map +1 -1
  184. package/lib/esm/render/webgl/Primitive.js +5 -5
  185. package/lib/esm/render/webgl/Primitive.js.map +1 -1
  186. package/lib/esm/render/webgl/RealityMesh.d.ts +2 -2
  187. package/lib/esm/render/webgl/RealityMesh.d.ts.map +1 -1
  188. package/lib/esm/render/webgl/RealityMesh.js +4 -4
  189. package/lib/esm/render/webgl/RealityMesh.js.map +1 -1
  190. package/lib/esm/render/webgl/RenderCommands.d.ts +2 -2
  191. package/lib/esm/render/webgl/RenderCommands.d.ts.map +1 -1
  192. package/lib/esm/render/webgl/RenderCommands.js +49 -42
  193. package/lib/esm/render/webgl/RenderCommands.js.map +1 -1
  194. package/lib/esm/render/webgl/RenderFlags.d.ts +43 -0
  195. package/lib/esm/render/webgl/RenderFlags.d.ts.map +1 -1
  196. package/lib/esm/render/webgl/RenderFlags.js +57 -0
  197. package/lib/esm/render/webgl/RenderFlags.js.map +1 -1
  198. package/lib/esm/render/webgl/SceneCompositor.js +3 -3
  199. package/lib/esm/render/webgl/SceneCompositor.js.map +1 -1
  200. package/lib/esm/render/webgl/ShaderProgram.d.ts +1 -1
  201. package/lib/esm/render/webgl/ShaderProgram.d.ts.map +1 -1
  202. package/lib/esm/render/webgl/ShaderProgram.js +4 -4
  203. package/lib/esm/render/webgl/ShaderProgram.js.map +1 -1
  204. package/lib/esm/render/webgl/SolarShadowMap.d.ts.map +1 -1
  205. package/lib/esm/render/webgl/SolarShadowMap.js +3 -3
  206. package/lib/esm/render/webgl/SolarShadowMap.js.map +1 -1
  207. package/lib/esm/render/webgl/SurfaceGeometry.d.ts +2 -2
  208. package/lib/esm/render/webgl/SurfaceGeometry.d.ts.map +1 -1
  209. package/lib/esm/render/webgl/SurfaceGeometry.js +17 -9
  210. package/lib/esm/render/webgl/SurfaceGeometry.js.map +1 -1
  211. package/lib/esm/render/webgl/System.d.ts.map +1 -1
  212. package/lib/esm/render/webgl/System.js +16 -12
  213. package/lib/esm/render/webgl/System.js.map +1 -1
  214. package/lib/esm/render/webgl/Technique.d.ts.map +1 -1
  215. package/lib/esm/render/webgl/Technique.js +1 -68
  216. package/lib/esm/render/webgl/Technique.js.map +1 -1
  217. package/lib/esm/render/webgl/Texture.d.ts +15 -12
  218. package/lib/esm/render/webgl/Texture.d.ts.map +1 -1
  219. package/lib/esm/render/webgl/Texture.js +27 -24
  220. package/lib/esm/render/webgl/Texture.js.map +1 -1
  221. package/lib/esm/render/webgl/glsl/AmbientOcclusion.d.ts.map +1 -1
  222. package/lib/esm/render/webgl/glsl/AmbientOcclusion.js +83 -18
  223. package/lib/esm/render/webgl/glsl/AmbientOcclusion.js.map +1 -1
  224. package/lib/esm/render/webgl/glsl/FeatureSymbology.d.ts.map +1 -1
  225. package/lib/esm/render/webgl/glsl/FeatureSymbology.js +10 -6
  226. package/lib/esm/render/webgl/glsl/FeatureSymbology.js.map +1 -1
  227. package/lib/esm/render/webgl/glsl/Surface.d.ts.map +1 -1
  228. package/lib/esm/render/webgl/glsl/Surface.js +31 -9
  229. package/lib/esm/render/webgl/glsl/Surface.js.map +1 -1
  230. package/lib/esm/render/webgl/glsl/Vertex.js +2 -2
  231. package/lib/esm/render/webgl/glsl/Vertex.js.map +1 -1
  232. package/lib/esm/tile/GltfReader.d.ts.map +1 -1
  233. package/lib/esm/tile/GltfReader.js +2 -3
  234. package/lib/esm/tile/GltfReader.js.map +1 -1
  235. package/lib/esm/tile/ImdlReader.d.ts +3 -1
  236. package/lib/esm/tile/ImdlReader.d.ts.map +1 -1
  237. package/lib/esm/tile/ImdlReader.js +1 -1
  238. package/lib/esm/tile/ImdlReader.js.map +1 -1
  239. package/package.json +24 -23
@@ -104,6 +104,7 @@ class Texture extends core_common_1.RenderTexture {
104
104
  super(params.type);
105
105
  this.ownership = params.ownership;
106
106
  this.texture = params.handle;
107
+ this.transparency = params.handle.format === GL_1.GL.Texture.Format.Rgba ? params.transparency : core_common_1.TextureTransparency.Opaque;
107
108
  }
108
109
  get bytesUsed() { return this.texture.bytesUsed; }
109
110
  get hasOwner() { return undefined !== this.ownership; }
@@ -116,7 +117,6 @@ class Texture extends core_common_1.RenderTexture {
116
117
  dispose() {
117
118
  (0, core_bentley_1.dispose)(this.texture);
118
119
  }
119
- get hasTranslucency() { return GL_1.GL.Texture.Format.Rgba === this.texture.format; }
120
120
  }
121
121
  exports.Texture = Texture;
122
122
  function getDataType(data) {
@@ -141,14 +141,16 @@ class Texture2DCreateParams {
141
141
  return new Texture2DCreateParams(width, height, format, getDataType(data), wrapMode, (tex, params) => loadTextureFromBytes(tex, params, data), undefined, undefined, undefined, bytes);
142
142
  }
143
143
  static createForImageBuffer(image, type) {
144
- const props = this.getImageProperties(core_common_1.ImageBufferFormat.Rgba === image.format, type);
144
+ const props = this.getImageProperties(type);
145
+ if (core_common_1.ImageBufferFormat.Rgb === image.format)
146
+ props.format = GL_1.GL.Texture.Format.Rgb;
145
147
  return new Texture2DCreateParams(image.width, image.height, props.format, GL_1.GL.Texture.DataType.UnsignedByte, props.wrapMode, (tex, params) => loadTextureFromBytes(tex, params, image.data), props.useMipMaps, props.interpolate);
146
148
  }
147
149
  static createForAttachment(width, height, format, dataType) {
148
150
  return new Texture2DCreateParams(width, height, format, dataType, GL_1.GL.Texture.WrapMode.ClampToEdge, (tex, params) => loadTextureFromBytes(tex, params), undefined, undefined);
149
151
  }
150
- static createForImage(image, hasAlpha, type) {
151
- const props = this.getImageProperties(hasAlpha, type);
152
+ static createForImage(image, type) {
153
+ const props = this.getImageProperties(type);
152
154
  let targetWidth = image.naturalWidth;
153
155
  let targetHeight = image.naturalHeight;
154
156
  const caps = System_1.System.instance.capabilities;
@@ -184,8 +186,8 @@ class Texture2DCreateParams {
184
186
  }
185
187
  return new Texture2DCreateParams(targetWidth, targetHeight, props.format, GL_1.GL.Texture.DataType.UnsignedByte, props.wrapMode, (tex, params) => loadTexture2DImageData(tex, params, undefined, element), props.useMipMaps, props.interpolate, props.anisotropicFilter);
186
188
  }
187
- static createForImageBitmap(image, hasAlpha, type) {
188
- const props = this.getImageProperties(hasAlpha, type);
189
+ static createForImageBitmap(image, type) {
190
+ const props = this.getImageProperties(type);
189
191
  let targetWidth = image.width;
190
192
  let targetHeight = image.height;
191
193
  const caps = System_1.System.instance.capabilities;
@@ -213,7 +215,7 @@ class Texture2DCreateParams {
213
215
  context.drawImage(image, 0, 0, canvas.width, canvas.height);
214
216
  return new Texture2DCreateParams(targetWidth, targetHeight, props.format, GL_1.GL.Texture.DataType.UnsignedByte, props.wrapMode, (tex, params) => loadTexture2DImageData(tex, params, undefined, canvas), props.useMipMaps, props.interpolate, props.anisotropicFilter);
215
217
  }
216
- static getImageProperties(isTranslucent, type) {
218
+ static getImageProperties(type) {
217
219
  const isSky = core_common_1.RenderTexture.Type.SkyBox === type;
218
220
  const isTile = core_common_1.RenderTexture.Type.TileSection === type;
219
221
  const isThematic = core_common_1.RenderTexture.Type.ThematicGradient === type;
@@ -222,8 +224,9 @@ class Texture2DCreateParams {
222
224
  const wrapMode = core_common_1.RenderTexture.Type.Normal === type ? GL_1.GL.Texture.WrapMode.Repeat : GL_1.GL.Texture.WrapMode.ClampToEdge;
223
225
  const useMipMaps = (!isSky && !isTile && !isFilteredTile && !isThematic) ? true : undefined;
224
226
  const interpolate = isThematic ? undefined : true;
225
- const format = isTranslucent ? GL_1.GL.Texture.Format.Rgba : GL_1.GL.Texture.Format.Rgb;
226
227
  const anisotropicFilter = isFilteredTile ? maxAnisotropicFilterLevel : undefined;
228
+ // Always use RGBA. RGB is much slower and almost certainly does not actually save any GPU memory.
229
+ const format = GL_1.GL.Texture.Format.Rgba;
227
230
  return { format, wrapMode, useMipMaps, interpolate, anisotropicFilter };
228
231
  }
229
232
  }
@@ -284,19 +287,19 @@ class TextureHandle {
284
287
  return Texture2DHandle.createForImageBuffer(image, type);
285
288
  }
286
289
  /** Create a 2D texture from an HTMLImageElement. */
287
- static createForImage(image, hasAlpha, type) {
288
- return Texture2DHandle.createForImage(image, hasAlpha, type);
290
+ static createForImage(image, type) {
291
+ return Texture2DHandle.createForImage(image, type);
289
292
  }
290
293
  /** Create a 2D texture from an ImageBitmap. */
291
- static createForImageBitmap(image, hasAlpha, type) {
292
- return Texture2DHandle.createForImageBitmap(image, hasAlpha, type);
294
+ static createForImageBitmap(image, type) {
295
+ return Texture2DHandle.createForImageBitmap(image, type);
293
296
  }
294
297
  /** Create a cube map texture from six HTMLImageElement objects. */
295
298
  static createForCubeImages(posX, negX, posY, negY, posZ, negZ) {
296
299
  return TextureCubeHandle.createForCubeImages(posX, negX, posY, negY, posZ, negZ);
297
300
  }
298
- static createForElement(id, imodel, type, format) {
299
- return Texture2DHandle.createForElement(id, imodel, type, format);
301
+ static createForElement(id, imodel, type, format, onLoaded) {
302
+ return Texture2DHandle.createForElement(id, imodel, type, format, onLoaded);
300
303
  }
301
304
  /** For debugging purposes, open a new window containing this texture as an image. */
302
305
  showDebugImage() {
@@ -400,20 +403,20 @@ class Texture2DHandle extends TextureHandle {
400
403
  return this.create(Texture2DCreateParams.createForImageBuffer(image, type));
401
404
  }
402
405
  /** Create a 2D texture from an HTMLImageElement. */
403
- static createForImage(image, hasAlpha, type) {
404
- return this.create(Texture2DCreateParams.createForImage(image, hasAlpha, type));
406
+ static createForImage(image, type) {
407
+ return this.create(Texture2DCreateParams.createForImage(image, type));
405
408
  }
406
409
  /** Create a 2D texture from an ImageBitmap. */
407
- static createForImageBitmap(image, hasAlpha, type) {
408
- return this.create(Texture2DCreateParams.createForImageBitmap(image, hasAlpha, type));
410
+ static createForImageBitmap(image, type) {
411
+ return this.create(Texture2DCreateParams.createForImageBitmap(image, type));
409
412
  }
410
- static createForElement(id, imodel, type, format) {
413
+ static createForElement(id, imodel, type, format, onLoaded) {
411
414
  // set a placeholder texture while we wait for the external texture to load
412
415
  const handle = this.createForData(1, 1, this._placeHolderTextureData, undefined, undefined, GL_1.GL.Texture.Format.Rgb);
413
416
  if (undefined === handle)
414
417
  return undefined;
415
418
  // kick off loading the texture from the backend
416
- ExternalTextureLoader.instance.loadTexture(handle, id, imodel, type, format);
419
+ ExternalTextureLoader.instance.loadTexture(handle, id, imodel, type, format, onLoaded);
417
420
  return handle;
418
421
  }
419
422
  reload(params) {
@@ -469,7 +472,7 @@ class ExternalTextureLoader {
469
472
  if (!req.imodel.isClosed) {
470
473
  IModelApp_1.IModelApp.tileAdmin.invalidateAllScenes();
471
474
  if (undefined !== req.onLoaded)
472
- req.onLoaded(req);
475
+ req.onLoaded(req, texData);
473
476
  }
474
477
  }
475
478
  }
@@ -487,13 +490,13 @@ class ExternalTextureLoader {
487
490
  const blob = new Blob([imageSource.data], { type: (0, ImageUtil_1.getImageSourceMimeType)(imageSource.format) });
488
491
  const image = await createImageBitmap(blob, 0, 0, cnvReq.texData.width, cnvReq.texData.height);
489
492
  if (!cnvReq.req.imodel.isClosed) {
490
- cnvReq.req.handle.reload(Texture2DCreateParams.createForImageBitmap(image, core_common_1.ImageSourceFormat.Png === cnvReq.req.format, cnvReq.req.type));
493
+ cnvReq.req.handle.reload(Texture2DCreateParams.createForImageBitmap(image, cnvReq.req.type));
491
494
  }
492
495
  }
493
496
  else {
494
497
  const image = await (0, ImageUtil_1.imageElementFromImageSource)(imageSource);
495
498
  if (!cnvReq.req.imodel.isClosed) {
496
- cnvReq.req.handle.reload(Texture2DCreateParams.createForImage(image, core_common_1.ImageSourceFormat.Png === cnvReq.req.format, cnvReq.req.type));
499
+ cnvReq.req.handle.reload(Texture2DCreateParams.createForImage(image, cnvReq.req.type));
497
500
  }
498
501
  }
499
502
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Texture.js","sourceRoot":"","sources":["../../../../src/render/webgl/Texture.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, BeEvent, dispose, Id64String } from \"@itwin/core-bentley\";\r\nimport { ImageBuffer, ImageBufferFormat, ImageSource, ImageSourceFormat, isPowerOfTwo, nextHighestPowerOfTwo, RenderTexture, TextureData } from \"@itwin/core-common\";\r\nimport { getImageSourceMimeType, imageBufferToPngDataUrl, imageElementFromImageSource, openImageDataUrlInNewWindow } from \"../../ImageUtil\";\r\nimport { IModelConnection } from \"../../IModelConnection\";\r\nimport { IModelApp } from \"../../IModelApp\";\r\nimport { WebGLDisposable } from \"./Disposable\";\r\nimport { GL } from \"./GL\";\r\nimport { UniformHandle } from \"./UniformHandle\";\r\nimport { OvrFlags, TextureUnit } from \"./RenderFlags\";\r\nimport { System } from \"./System\";\r\nimport { TextureOwnership } from \"../RenderTexture\";\r\n\r\ntype CanvasOrImage = HTMLCanvasElement | HTMLImageElement;\r\n\r\n/** @internal */\r\nexport type Texture2DData = Uint8Array | Float32Array;\r\n\r\nfunction computeBytesUsed(width: number, height: number, format: GL.Texture.Format, dataType: GL.Texture.DataType): number {\r\n const bytesPerComponent = GL.Texture.DataType.UnsignedByte === dataType ? 1 : 4;\r\n let componentsPerPixel = 1;\r\n switch (format) {\r\n case GL.Texture.Format.Rgb:\r\n componentsPerPixel = 3;\r\n break;\r\n case GL.Texture.Format.Rgba:\r\n componentsPerPixel = 4;\r\n break;\r\n }\r\n\r\n return width * height * componentsPerPixel * bytesPerComponent;\r\n}\r\n\r\n/** Associate texture data with a WebGLTexture from a canvas, image, OR a bitmap. */\r\nfunction loadTexture2DImageData(handle: TextureHandle, params: Texture2DCreateParams, bytes?: Texture2DData, element?: CanvasOrImage): void {\r\n handle.bytesUsed = undefined !== bytes ? bytes.byteLength : computeBytesUsed(params.width, params.height, params.format, params.dataType);\r\n\r\n const tex = handle.getHandle()!;\r\n const gl = System.instance.context;\r\n\r\n // Use tightly packed data\r\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\r\n\r\n // Bind the texture object; make sure we do not interfere with other active textures\r\n System.instance.activateTexture2d(TextureUnit.Zero, tex);\r\n\r\n // Figure out the internal format. For all but WebGL2 float/half-float datatypes it is just same as format.\r\n // TODO: probably need to just support internal format types in Texture2DCreateParams.\r\n let internalFormat = params.format;\r\n if (System.instance.capabilities.isWebGL2) {\r\n const context2 = System.instance.context as WebGL2RenderingContext;\r\n if (GL.Texture.Format.Rgba === params.format) {\r\n if (GL.Texture.DataType.Float === params.dataType)\r\n internalFormat = context2.RGBA32F;\r\n else if (context2.HALF_FLOAT === params.dataType)\r\n internalFormat = context2.RGBA16F;\r\n } else if (GL.Texture.Format.DepthStencil === params.format)\r\n internalFormat = context2.DEPTH24_STENCIL8;\r\n }\r\n\r\n // send the texture data\r\n if (undefined !== element) {\r\n gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, params.format, params.dataType, element);\r\n } else {\r\n const pixelData = undefined !== bytes ? bytes : null;\r\n gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, params.width, params.height, 0, params.format, params.dataType, pixelData);\r\n }\r\n\r\n if (params.useMipMaps) {\r\n gl.generateMipmap(gl.TEXTURE_2D);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\r\n } else {\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, params.interpolate ? gl.LINEAR : gl.NEAREST);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, params.interpolate ? gl.LINEAR : gl.NEAREST);\r\n }\r\n if (params.anisotropicFilter) {\r\n System.instance.setMaxAnisotropy(params.anisotropicFilter);\r\n }\r\n\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, params.wrapMode);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, params.wrapMode);\r\n\r\n System.instance.bindTexture2d(TextureUnit.Zero, undefined);\r\n}\r\n\r\nfunction loadTextureFromBytes(handle: TextureHandle, params: Texture2DCreateParams, bytes?: Texture2DData): void { loadTexture2DImageData(handle, params, bytes); }\r\n\r\n/** Associate cube texture data with a WebGLTexture from an image. */\r\nfunction loadTextureCubeImageData(handle: TextureHandle, params: TextureCubeCreateParams, images: CanvasOrImage[]): void {\r\n handle.bytesUsed = computeBytesUsed(params.dim * 6, params.dim, params.format, params.dataType);\r\n\r\n const tex = handle.getHandle()!;\r\n const gl = System.instance.context;\r\n\r\n // Use tightly packed data\r\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\r\n\r\n // Bind the texture object; make sure we do not interfere with other active textures\r\n System.instance.activateTextureCubeMap(TextureUnit.Zero, tex);\r\n\r\n const cubeTargets: number[] = [GL.Texture.Target.CubeMapPositiveX, GL.Texture.Target.CubeMapNegativeX, GL.Texture.Target.CubeMapPositiveY, GL.Texture.Target.CubeMapNegativeY, GL.Texture.Target.CubeMapPositiveZ, GL.Texture.Target.CubeMapNegativeZ];\r\n\r\n for (let i = 0; i < 6; i++) {\r\n gl.texImage2D(cubeTargets[i], 0, params.format, params.format, params.dataType, images[i]);\r\n }\r\n\r\n gl.texParameteri(GL.Texture.Target.CubeMap, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\r\n gl.texParameteri(GL.Texture.Target.CubeMap, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\r\n gl.texParameteri(GL.Texture.Target.CubeMap, gl.TEXTURE_WRAP_S, params.wrapMode);\r\n gl.texParameteri(GL.Texture.Target.CubeMap, gl.TEXTURE_WRAP_T, params.wrapMode);\r\n // gl.texParameteri(GL.Texture.Target.CubeMap, gl.TEXTURE_WRAP_R, params.wrapMode); // Unavailable in GLES2\r\n\r\n System.instance.bindTextureCubeMap(TextureUnit.Zero, undefined);\r\n}\r\n\r\ntype TextureFlag = true | undefined;\r\ntype TextureAnisotropicFilter = number | undefined;\r\ntype Load2DImageData = (handle: TextureHandle, params: Texture2DCreateParams) => void;\r\ntype LoadCubeImageData = (handle: TextureHandle, params: TextureCubeCreateParams) => void;\r\n\r\ninterface TextureImageProperties {\r\n wrapMode: GL.Texture.WrapMode;\r\n useMipMaps: TextureFlag;\r\n interpolate: TextureFlag;\r\n format: GL.Texture.Format;\r\n anisotropicFilter: TextureAnisotropicFilter;\r\n}\r\n\r\n/** @internal */\r\nexport interface TextureParams {\r\n type: RenderTexture.Type;\r\n ownership?: TextureOwnership;\r\n // ###TODO transparency: TextureTransparency;\r\n handle: TextureHandle;\r\n}\r\n\r\n/** Wrapper class for a WebGL texture handle and parameters specific to an individual texture.\r\n * @internal\r\n */\r\nexport class Texture extends RenderTexture implements WebGLDisposable {\r\n public readonly texture: TextureHandle;\r\n public readonly ownership?: TextureOwnership;\r\n\r\n public get bytesUsed(): number { return this.texture.bytesUsed; }\r\n public get hasOwner(): boolean { return undefined !== this.ownership; }\r\n public get key(): string | undefined {\r\n return typeof this.ownership !== \"string\" && typeof this.ownership?.key === \"string\" ? this.ownership.key : undefined;\r\n }\r\n\r\n public constructor(params: TextureParams) {\r\n super(params.type);\r\n this.ownership = params.ownership;\r\n this.texture = params.handle;\r\n }\r\n\r\n public get isDisposed(): boolean { return this.texture.isDisposed; }\r\n\r\n /** Free this object in the WebGL wrapper. */\r\n public dispose() {\r\n dispose(this.texture);\r\n }\r\n\r\n public get hasTranslucency(): boolean { return GL.Texture.Format.Rgba === this.texture.format; }\r\n}\r\n\r\nfunction getDataType(data: Texture2DData): GL.Texture.DataType {\r\n return data instanceof Float32Array ? GL.Texture.DataType.Float : GL.Texture.DataType.UnsignedByte;\r\n}\r\n\r\n/** Parameters used internally to define how to create a texture for use with WebGL. */\r\nclass Texture2DCreateParams {\r\n private constructor(\r\n public width: number,\r\n public height: number,\r\n public format: GL.Texture.Format,\r\n public dataType: GL.Texture.DataType,\r\n public wrapMode: GL.Texture.WrapMode,\r\n public loadImageData: Load2DImageData,\r\n public useMipMaps?: TextureFlag,\r\n public interpolate?: TextureFlag,\r\n public anisotropicFilter?: TextureAnisotropicFilter,\r\n public dataBytes?: Uint8Array) { }\r\n\r\n public static createForData(width: number, height: number, data: Texture2DData, preserveData = false, wrapMode = GL.Texture.WrapMode.ClampToEdge, format = GL.Texture.Format.Rgba) {\r\n const bytes = (preserveData && data instanceof Uint8Array) ? data : undefined;\r\n return new Texture2DCreateParams(width, height, format, getDataType(data), wrapMode,\r\n (tex: TextureHandle, params: Texture2DCreateParams) => loadTextureFromBytes(tex, params, data), undefined, undefined, undefined, bytes);\r\n }\r\n\r\n public static createForImageBuffer(image: ImageBuffer, type: RenderTexture.Type) {\r\n const props = this.getImageProperties(ImageBufferFormat.Rgba === image.format, type);\r\n\r\n return new Texture2DCreateParams(image.width, image.height, props.format, GL.Texture.DataType.UnsignedByte, props.wrapMode,\r\n (tex: TextureHandle, params: Texture2DCreateParams) => loadTextureFromBytes(tex, params, image.data), props.useMipMaps, props.interpolate);\r\n }\r\n\r\n public static createForAttachment(width: number, height: number, format: GL.Texture.Format, dataType: GL.Texture.DataType) {\r\n return new Texture2DCreateParams(width, height, format, dataType, GL.Texture.WrapMode.ClampToEdge,\r\n (tex: TextureHandle, params: Texture2DCreateParams) => loadTextureFromBytes(tex, params), undefined, undefined);\r\n }\r\n\r\n public static createForImage(image: HTMLImageElement, hasAlpha: boolean, type: RenderTexture.Type) {\r\n const props = this.getImageProperties(hasAlpha, type);\r\n\r\n let targetWidth = image.naturalWidth;\r\n let targetHeight = image.naturalHeight;\r\n\r\n const caps = System.instance.capabilities;\r\n if (RenderTexture.Type.Glyph === type) {\r\n targetWidth = nextHighestPowerOfTwo(targetWidth);\r\n targetHeight = nextHighestPowerOfTwo(targetHeight);\r\n } else if (!caps.supportsNonPowerOf2Textures && (!isPowerOfTwo(targetWidth) || !isPowerOfTwo(targetHeight))) {\r\n if (GL.Texture.WrapMode.ClampToEdge === props.wrapMode) {\r\n // NPOT are supported but not mipmaps\r\n // Probably on poor hardware so I choose to disable mipmaps for lower memory usage over quality. If quality is required we need to resize the image to a pow of 2.\r\n // Above comment is not necessarily true - WebGL doesn't support NPOT mipmapping, only supporting base NPOT caps\r\n props.useMipMaps = undefined;\r\n } else if (GL.Texture.WrapMode.Repeat === props.wrapMode) {\r\n targetWidth = nextHighestPowerOfTwo(targetWidth);\r\n targetHeight = nextHighestPowerOfTwo(targetHeight);\r\n }\r\n }\r\n\r\n // Cap texture dimensions to system WebGL capabilities\r\n const maxTexSize = System.instance.capabilities.maxTextureSize;\r\n targetWidth = Math.min(targetWidth, maxTexSize);\r\n targetHeight = Math.min(targetHeight, maxTexSize);\r\n\r\n let element: CanvasOrImage = image;\r\n if (targetWidth !== image.naturalWidth || targetHeight !== image.naturalHeight) {\r\n // Resize so dimensions are powers-of-two\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = targetWidth;\r\n canvas.height = targetHeight;\r\n\r\n const context = canvas.getContext(\"2d\")!;\r\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\r\n\r\n element = canvas;\r\n }\r\n\r\n return new Texture2DCreateParams(targetWidth, targetHeight, props.format, GL.Texture.DataType.UnsignedByte, props.wrapMode,\r\n (tex: TextureHandle, params: Texture2DCreateParams) => loadTexture2DImageData(tex, params, undefined, element), props.useMipMaps, props.interpolate, props.anisotropicFilter);\r\n }\r\n\r\n public static createForImageBitmap(image: ImageBitmap, hasAlpha: boolean, type: RenderTexture.Type) {\r\n const props = this.getImageProperties(hasAlpha, type);\r\n\r\n let targetWidth = image.width;\r\n let targetHeight = image.height;\r\n\r\n const caps = System.instance.capabilities;\r\n if (RenderTexture.Type.Glyph === type) {\r\n targetWidth = nextHighestPowerOfTwo(targetWidth);\r\n targetHeight = nextHighestPowerOfTwo(targetHeight);\r\n } else if (!caps.supportsNonPowerOf2Textures && (!isPowerOfTwo(targetWidth) || !isPowerOfTwo(targetHeight))) {\r\n if (GL.Texture.WrapMode.ClampToEdge === props.wrapMode) {\r\n // NPOT are supported but not mipmaps\r\n // Probably on poor hardware so I choose to disable mipmaps for lower memory usage over quality. If quality is required we need to resize the image to a pow of 2.\r\n // Above comment is not necessarily true - WebGL doesn't support NPOT mipmapping, only supporting base NPOT caps\r\n props.useMipMaps = undefined;\r\n } else if (GL.Texture.WrapMode.Repeat === props.wrapMode) {\r\n targetWidth = nextHighestPowerOfTwo(targetWidth);\r\n targetHeight = nextHighestPowerOfTwo(targetHeight);\r\n }\r\n }\r\n\r\n // Always draw to canvas for ImageBitmap\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = targetWidth;\r\n canvas.height = targetHeight;\r\n const context = canvas.getContext(\"2d\")!;\r\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\r\n\r\n return new Texture2DCreateParams(targetWidth, targetHeight, props.format, GL.Texture.DataType.UnsignedByte, props.wrapMode,\r\n (tex: TextureHandle, params: Texture2DCreateParams) => loadTexture2DImageData(tex, params, undefined, canvas), props.useMipMaps, props.interpolate, props.anisotropicFilter);\r\n }\r\n\r\n private static getImageProperties(isTranslucent: boolean, type: RenderTexture.Type): TextureImageProperties {\r\n const isSky = RenderTexture.Type.SkyBox === type;\r\n const isTile = RenderTexture.Type.TileSection === type;\r\n const isThematic = RenderTexture.Type.ThematicGradient === type;\r\n const isFilteredTile = RenderTexture.Type.FilteredTileSection === type;\r\n const maxAnisotropicFilterLevel = 16;\r\n\r\n const wrapMode = RenderTexture.Type.Normal === type ? GL.Texture.WrapMode.Repeat : GL.Texture.WrapMode.ClampToEdge;\r\n const useMipMaps: TextureFlag = (!isSky && !isTile && !isFilteredTile && !isThematic) ? true : undefined;\r\n const interpolate: TextureFlag = isThematic ? undefined : true;\r\n const format = isTranslucent ? GL.Texture.Format.Rgba : GL.Texture.Format.Rgb;\r\n const anisotropicFilter = isFilteredTile ? maxAnisotropicFilterLevel : undefined;\r\n\r\n return { format, wrapMode, useMipMaps, interpolate, anisotropicFilter };\r\n }\r\n\r\n public static readonly placeholderParams = new Texture2DCreateParams(1, 1, GL.Texture.Format.Rgba, GL.Texture.DataType.UnsignedByte, GL.Texture.WrapMode.ClampToEdge,\r\n (_tex: TextureHandle, _params: Texture2DCreateParams) => undefined);\r\n}\r\n\r\nclass TextureCubeCreateParams {\r\n private constructor(\r\n public dim: number,\r\n public format: GL.Texture.Format,\r\n public dataType: GL.Texture.DataType,\r\n public wrapMode: GL.Texture.WrapMode,\r\n public loadImageData: LoadCubeImageData) { }\r\n\r\n public static createForCubeImages(posX: HTMLImageElement, negX: HTMLImageElement, posY: HTMLImageElement, negY: HTMLImageElement, posZ: HTMLImageElement, negZ: HTMLImageElement): TextureCubeCreateParams | undefined {\r\n const targetDim = posX.naturalWidth;\r\n\r\n if (posX.naturalHeight !== targetDim) // Cube texture dimensions must match (width must equal height)\r\n return undefined;\r\n\r\n const images: HTMLImageElement[] = [posX, negX, posY, negY, posZ, negZ];\r\n\r\n for (let i = 1; i < images.length; i++) { // Dimensions of all six sides must match each other\r\n if (images[i].naturalWidth !== targetDim || images[i].naturalHeight !== targetDim)\r\n return undefined;\r\n }\r\n\r\n return new TextureCubeCreateParams(targetDim, GL.Texture.Format.Rgba, GL.Texture.DataType.UnsignedByte, GL.Texture.WrapMode.ClampToEdge,\r\n (tex: TextureHandle, params: TextureCubeCreateParams) => loadTextureCubeImageData(tex, params, images));\r\n }\r\n}\r\n\r\n/** Wraps a WebGLTextureHandle\r\n * @internal\r\n */\r\nexport abstract class TextureHandle implements WebGLDisposable {\r\n protected _glTexture?: WebGLTexture;\r\n protected _bytesUsed = 0;\r\n\r\n public abstract get width(): number;\r\n public abstract get height(): number;\r\n public abstract get format(): GL.Texture.Format;\r\n public abstract get dataType(): GL.Texture.DataType;\r\n public abstract get dataBytes(): Uint8Array | undefined;\r\n public get bytesUsed(): number { return this._bytesUsed; }\r\n public set bytesUsed(bytesUsed: number) {\r\n // assert(0 === this.bytesUsed);\r\n this._bytesUsed = bytesUsed;\r\n }\r\n\r\n /** Get the WebGLTexture for this TextureHandle. */\r\n public getHandle(): WebGLTexture | undefined { return this._glTexture; }\r\n\r\n /** Bind texture handle (if available) associated with an instantiation of this class to specified texture unit. */\r\n public abstract bind(_texUnit: TextureUnit): boolean;\r\n\r\n /** Bind this texture to a uniform sampler. */\r\n public abstract bindSampler(_uniform: UniformHandle, _unit: TextureUnit): void;\r\n\r\n public get isDisposed(): boolean { return this._glTexture === undefined; }\r\n\r\n public dispose() {\r\n if (!this.isDisposed) {\r\n System.instance.disposeTexture(this._glTexture!);\r\n this._glTexture = undefined;\r\n this.bytesUsed = 0;\r\n }\r\n }\r\n\r\n /** Create a 2D texture for use as a color attachment for rendering */\r\n public static createForAttachment(width: number, height: number, format: GL.Texture.Format, dataType: GL.Texture.DataType) {\r\n return Texture2DHandle.createForAttachment(width, height, format, dataType);\r\n }\r\n\r\n /** Create a 2D texture to hold non-image data */\r\n public static createForData(width: number, height: number, data: Texture2DData, wantPreserveData = false, wrapMode = GL.Texture.WrapMode.ClampToEdge, format = GL.Texture.Format.Rgba) {\r\n return Texture2DHandle.createForData(width, height, data, wantPreserveData, wrapMode, format);\r\n }\r\n\r\n /** Create a 2D texture from a bitmap */\r\n public static createForImageBuffer(image: ImageBuffer, type: RenderTexture.Type) {\r\n return Texture2DHandle.createForImageBuffer(image, type);\r\n }\r\n\r\n /** Create a 2D texture from an HTMLImageElement. */\r\n public static createForImage(image: HTMLImageElement, hasAlpha: boolean, type: RenderTexture.Type) {\r\n return Texture2DHandle.createForImage(image, hasAlpha, type);\r\n }\r\n\r\n /** Create a 2D texture from an ImageBitmap. */\r\n public static createForImageBitmap(image: ImageBitmap, hasAlpha: boolean, type: RenderTexture.Type) {\r\n return Texture2DHandle.createForImageBitmap(image, hasAlpha, type);\r\n }\r\n\r\n /** Create a cube map texture from six HTMLImageElement objects. */\r\n public static createForCubeImages(posX: HTMLImageElement, negX: HTMLImageElement, posY: HTMLImageElement, negY: HTMLImageElement, posZ: HTMLImageElement, negZ: HTMLImageElement) {\r\n return TextureCubeHandle.createForCubeImages(posX, negX, posY, negY, posZ, negZ);\r\n }\r\n\r\n public static createForElement(id: Id64String, imodel: IModelConnection, type: RenderTexture.Type, format: ImageSourceFormat) {\r\n return Texture2DHandle.createForElement(id, imodel, type, format);\r\n }\r\n\r\n protected constructor(glTexture: WebGLTexture) {\r\n this._glTexture = glTexture;\r\n }\r\n\r\n /** For debugging purposes, open a new window containing this texture as an image. */\r\n public showDebugImage(): void {\r\n const gl = System.instance.context;\r\n const fbo = gl.createFramebuffer();\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.getHandle()!, 0);\r\n if (gl.FRAMEBUFFER_COMPLETE === gl.checkFramebufferStatus(gl.FRAMEBUFFER)) {\r\n const w = this.width;\r\n const h = this.height;\r\n const pixels = new Uint8Array(w * h * 4);\r\n gl.readPixels(0, 0, w, h, gl.RGBA, gl.UNSIGNED_BYTE, pixels);\r\n\r\n const buffer = ImageBuffer.create(pixels, ImageBufferFormat.Rgba, w)!;\r\n const url = imageBufferToPngDataUrl(buffer, false);\r\n openImageDataUrlInNewWindow(url!, \"Classifiers\");\r\n }\r\n\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\r\n gl.deleteFramebuffer(fbo);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class Texture2DHandle extends TextureHandle {\r\n private _width: number;\r\n private _height: number;\r\n private _format: GL.Texture.Format;\r\n private _dataType: GL.Texture.DataType;\r\n private _dataBytes?: Uint8Array;\r\n\r\n public get width(): number { return this._width; }\r\n public get height(): number { return this._height; }\r\n public get format(): GL.Texture.Format { return this._format; }\r\n public get dataType(): GL.Texture.DataType { return this._dataType; }\r\n public get dataBytes(): Uint8Array | undefined { return this._dataBytes; }\r\n\r\n /** Bind specified texture handle to specified texture unit. */\r\n public static bindTexture(texUnit: TextureUnit, glTex: WebGLTexture | undefined) {\r\n assert(!(glTex instanceof TextureHandle));\r\n System.instance.bindTexture2d(texUnit, glTex);\r\n }\r\n\r\n /** Bind the specified texture to a uniform sampler2D */\r\n public static bindSampler(uniform: UniformHandle, tex: WebGLTexture, unit: TextureUnit): void {\r\n assert(!(tex instanceof TextureHandle));\r\n this.bindTexture(unit, tex);\r\n uniform.setUniform1i(unit - TextureUnit.Zero);\r\n }\r\n\r\n /** Bind texture handle (if available) associated with an instantiation of this class to specified texture unit. */\r\n public bind(texUnit: TextureUnit): boolean {\r\n if (undefined === this._glTexture)\r\n return false;\r\n Texture2DHandle.bindTexture(texUnit, this._glTexture);\r\n return true;\r\n }\r\n\r\n /** Bind this texture to a uniform sampler2D */\r\n public bindSampler(uniform: UniformHandle, unit: TextureUnit): void {\r\n if (undefined !== this._glTexture)\r\n Texture2DHandle.bindSampler(uniform, this._glTexture, unit);\r\n }\r\n\r\n /** Update the 2D texture contents. */\r\n public update(updater: Texture2DDataUpdater): boolean {\r\n if (0 === this.width || 0 === this.height || undefined === this._dataBytes || 0 === this._dataBytes.length) {\r\n assert(false);\r\n return false;\r\n }\r\n\r\n if (!updater.modified)\r\n return false;\r\n\r\n return this.replaceTextureData(this._dataBytes);\r\n }\r\n\r\n /** Replace the 2D texture contents. */\r\n public replaceTextureData(data: Texture2DData): boolean {\r\n assert((GL.Texture.DataType.Float === this._dataType) === (data instanceof Float32Array));\r\n\r\n const tex = this.getHandle()!;\r\n if (undefined === tex)\r\n return false;\r\n\r\n const gl = System.instance.context;\r\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\r\n\r\n // Go through System to ensure we don't interfere with currently-bound textures!\r\n System.instance.activateTexture2d(TextureUnit.Zero, tex);\r\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, this._format, this._dataType, data);\r\n System.instance.bindTexture2d(TextureUnit.Zero, undefined);\r\n\r\n return true;\r\n }\r\n\r\n private static create(params: Texture2DCreateParams): Texture2DHandle | undefined {\r\n const glTex = System.instance.context.createTexture();\r\n return null !== glTex ? new Texture2DHandle(glTex, params) : undefined;\r\n }\r\n\r\n /** Create a texture for use as a color attachment for rendering */\r\n public static override createForAttachment(width: number, height: number, format: GL.Texture.Format, dataType: GL.Texture.DataType) {\r\n return this.create(Texture2DCreateParams.createForAttachment(width, height, format, dataType));\r\n }\r\n\r\n /** Create a texture to hold non-image data */\r\n public static override createForData(width: number, height: number, data: Texture2DData, wantPreserveData = false, wrapMode = GL.Texture.WrapMode.ClampToEdge, format = GL.Texture.Format.Rgba) {\r\n return this.create(Texture2DCreateParams.createForData(width, height, data, wantPreserveData, wrapMode, format));\r\n }\r\n\r\n /** Create a texture from a bitmap */\r\n public static override createForImageBuffer(image: ImageBuffer, type: RenderTexture.Type) {\r\n if (RenderTexture.Type.TileSection !== type && RenderTexture.Type.ThematicGradient !== type)\r\n assert(isPowerOfTwo(image.width) && isPowerOfTwo(image.height), \"###TODO: Resize image dimensions to powers-of-two if necessary\");\r\n\r\n return this.create(Texture2DCreateParams.createForImageBuffer(image, type));\r\n }\r\n\r\n /** Create a 2D texture from an HTMLImageElement. */\r\n public static override createForImage(image: HTMLImageElement, hasAlpha: boolean, type: RenderTexture.Type) {\r\n return this.create(Texture2DCreateParams.createForImage(image, hasAlpha, type));\r\n }\r\n\r\n /** Create a 2D texture from an ImageBitmap. */\r\n public static override createForImageBitmap(image: ImageBitmap, hasAlpha: boolean, type: RenderTexture.Type) {\r\n return this.create(Texture2DCreateParams.createForImageBitmap(image, hasAlpha, type));\r\n }\r\n\r\n private static _placeHolderTextureData = new Uint8Array([128, 128, 128]);\r\n\r\n public static override createForElement(id: Id64String, imodel: IModelConnection, type: RenderTexture.Type, format: ImageSourceFormat) {\r\n // set a placeholder texture while we wait for the external texture to load\r\n const handle = this.createForData(1, 1, this._placeHolderTextureData, undefined, undefined, GL.Texture.Format.Rgb);\r\n\r\n if (undefined === handle)\r\n return undefined;\r\n\r\n // kick off loading the texture from the backend\r\n ExternalTextureLoader.instance.loadTexture(handle, id, imodel, type, format);\r\n\r\n return handle;\r\n }\r\n\r\n public reload(params: Texture2DCreateParams) {\r\n this._width = params.width;\r\n this._height = params.height;\r\n this._format = params.format;\r\n this._dataType = params.dataType;\r\n this._dataBytes = params.dataBytes;\r\n\r\n params.loadImageData(this, params);\r\n }\r\n\r\n private constructor(glTexture: WebGLTexture, params: Texture2DCreateParams) {\r\n super(glTexture);\r\n this._width = params.width;\r\n this._height = params.height;\r\n this._format = params.format;\r\n this._dataType = params.dataType;\r\n this._dataBytes = params.dataBytes;\r\n\r\n params.loadImageData(this, params);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport interface ExternalTextureRequest {\r\n handle: Texture2DHandle;\r\n name: Id64String;\r\n imodel: IModelConnection;\r\n type: RenderTexture.Type;\r\n format: ImageSourceFormat;\r\n onLoaded?: (req: ExternalTextureRequest) => void;\r\n}\r\n\r\n/** @internal */\r\ninterface TextureConvertRequest {\r\n req: ExternalTextureRequest;\r\n texData: TextureData;\r\n}\r\n\r\n/** @internal */\r\nexport class ExternalTextureLoader { /* currently exported for tests only */\r\n public static readonly instance = new ExternalTextureLoader(2);\r\n public readonly onTexturesLoaded = new BeEvent<() => void>();\r\n private readonly _maxActiveRequests: number;\r\n private _activeRequests: Array<ExternalTextureRequest> = [];\r\n private _pendingRequests: Array<ExternalTextureRequest> = [];\r\n private _convertRequests: Array<TextureConvertRequest> = [];\r\n private _convertPending = false;\r\n\r\n public get numActiveRequests() { return this._activeRequests.length; }\r\n public get numPendingRequests() { return this._pendingRequests.length; }\r\n public get maxActiveRequests() { return this._maxActiveRequests; }\r\n\r\n private constructor(maxActiveRequests: number) {\r\n this._maxActiveRequests = maxActiveRequests;\r\n }\r\n\r\n private async _nextRequest(prevReq: ExternalTextureRequest) {\r\n this._activeRequests.splice(this._activeRequests.indexOf(prevReq), 1);\r\n if (this._activeRequests.length < this._maxActiveRequests && this._pendingRequests.length > 0) {\r\n const req = this._pendingRequests.shift()!;\r\n await this._activateRequest(req);\r\n }\r\n if (this._activeRequests.length < 1 && this._pendingRequests.length < 1)\r\n this.onTexturesLoaded.raiseEvent();\r\n }\r\n\r\n private async _activateRequest(req: ExternalTextureRequest) {\r\n if (req.imodel.isClosed)\r\n return;\r\n\r\n this._activeRequests.push(req);\r\n\r\n try {\r\n if (!req.imodel.isClosed) {\r\n const maxTextureSize = System.instance.capabilities.maxTexSizeAllow;\r\n const texData = await req.imodel.queryTextureData({ name: req.name, maxTextureSize });\r\n if (undefined !== texData) {\r\n const cnvReq = { req, texData };\r\n this._convertRequests.push(cnvReq);\r\n // _convertPending is used to prevent overlapping calls to _convertTexture (from overlapping calls to _activateRequest)\r\n // it has been put on the list, so if it doesn't get converted here it will get converted by the loop that is converting the current one\r\n do {\r\n if (!this._convertPending)\r\n await this._convertTexture();\r\n } while (!this._convertPending && this._convertRequests.length > 0);\r\n if (!req.imodel.isClosed) {\r\n IModelApp.tileAdmin.invalidateAllScenes();\r\n if (undefined !== req.onLoaded)\r\n req.onLoaded(req);\r\n }\r\n }\r\n }\r\n } catch (_e) { }\r\n\r\n return this._nextRequest(req);\r\n }\r\n\r\n private async _convertTexture(): Promise<void> {\r\n this._convertPending = true;\r\n try {\r\n const cnvReq = this._convertRequests.shift();\r\n if (undefined !== cnvReq) {\r\n const imageSource = new ImageSource(cnvReq.texData.bytes, cnvReq.texData.format);\r\n if (System.instance.capabilities.supportsCreateImageBitmap) {\r\n const blob = new Blob([imageSource.data], { type: getImageSourceMimeType(imageSource.format) });\r\n const image = await createImageBitmap(blob, 0, 0, cnvReq.texData.width, cnvReq.texData.height);\r\n if (!cnvReq.req.imodel.isClosed) {\r\n cnvReq.req.handle.reload(Texture2DCreateParams.createForImageBitmap(image, ImageSourceFormat.Png === cnvReq.req.format, cnvReq.req.type));\r\n }\r\n } else {\r\n const image = await imageElementFromImageSource(imageSource);\r\n if (!cnvReq.req.imodel.isClosed) {\r\n cnvReq.req.handle.reload(Texture2DCreateParams.createForImage(image, ImageSourceFormat.Png === cnvReq.req.format, cnvReq.req.type));\r\n }\r\n }\r\n }\r\n } catch (_e) { }\r\n this._convertPending = false;\r\n }\r\n\r\n private _requestExists(reqToCheck: ExternalTextureRequest) {\r\n for (const r of this._activeRequests)\r\n if (reqToCheck.name === r.name && reqToCheck.imodel === r.imodel)\r\n return true;\r\n\r\n for (const r of this._pendingRequests)\r\n if (reqToCheck.name === r.name && reqToCheck.imodel === r.imodel)\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n public loadTexture(handle: Texture2DHandle, name: Id64String, imodel: IModelConnection, type: RenderTexture.Type, format: ImageSourceFormat, onLoaded?: (req: ExternalTextureRequest) => void) {\r\n const req = { handle, name, imodel, type, format, onLoaded };\r\n if (this._requestExists(req))\r\n return;\r\n\r\n if (this._activeRequests.length + 1 > this._maxActiveRequests) {\r\n this._pendingRequests.push(req);\r\n } else\r\n this._activateRequest(req); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class TextureCubeHandle extends TextureHandle {\r\n private _dim: number; // Cubemap texture height and width must match. This must be the same for each of the six faces.\r\n private _format: GL.Texture.Format; // Format must be the same for each of the six faces.\r\n private _dataType: GL.Texture.DataType; // Type must be the same for each of the six faces.\r\n\r\n public get width(): number { return this._dim; }\r\n public get height(): number { return this._dim; }\r\n public get format(): GL.Texture.Format { return this._format; }\r\n public get dataType(): GL.Texture.DataType { return this._dataType; }\r\n public get dataBytes(): Uint8Array | undefined { return undefined; }\r\n\r\n /** Bind specified cubemap texture handle to specified texture unit. */\r\n public static bindTexture(texUnit: TextureUnit, glTex: WebGLTexture | undefined) {\r\n assert(!(glTex instanceof TextureHandle));\r\n System.instance.bindTextureCubeMap(texUnit, glTex);\r\n }\r\n\r\n /** Bind the specified texture to a uniform sampler2D */\r\n public static bindSampler(uniform: UniformHandle, tex: WebGLTexture, unit: TextureUnit): void {\r\n assert(!(tex instanceof TextureHandle));\r\n this.bindTexture(unit, tex);\r\n uniform.setUniform1i(unit - TextureUnit.Zero);\r\n }\r\n\r\n /** Bind texture handle (if available) associated with an instantiation of this class to specified texture unit. */\r\n public bind(texUnit: TextureUnit): boolean {\r\n if (undefined === this._glTexture)\r\n return false;\r\n TextureCubeHandle.bindTexture(texUnit, this._glTexture);\r\n return true;\r\n }\r\n\r\n /** Bind this texture to a uniform sampler2D */\r\n public bindSampler(uniform: UniformHandle, unit: TextureUnit): void {\r\n if (undefined !== this._glTexture)\r\n TextureCubeHandle.bindSampler(uniform, this._glTexture, unit);\r\n }\r\n\r\n private static create(params: TextureCubeCreateParams): TextureHandle | undefined {\r\n const glTex = System.instance.context.createTexture();\r\n return null !== glTex ? new TextureCubeHandle(glTex, params) : undefined;\r\n }\r\n\r\n /** Create a cube map texture from six HTMLImageElement objects. */\r\n public static override createForCubeImages(posX: HTMLImageElement, negX: HTMLImageElement, posY: HTMLImageElement, negY: HTMLImageElement, posZ: HTMLImageElement, negZ: HTMLImageElement) {\r\n const params = TextureCubeCreateParams.createForCubeImages(posX, negX, posY, negY, posZ, negZ);\r\n return params !== undefined ? this.create(params) : undefined;\r\n }\r\n\r\n private constructor(glTexture: WebGLTexture, params: TextureCubeCreateParams) {\r\n super(glTexture);\r\n this._dim = params.dim;\r\n this._format = params.format;\r\n this._dataType = params.dataType;\r\n\r\n params.loadImageData(this, params);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class Texture2DDataUpdater {\r\n public data: Uint8Array;\r\n public modified: boolean = false;\r\n\r\n public constructor(data: Uint8Array) { this.data = data; }\r\n\r\n public setByteAtIndex(index: number, byte: number) {\r\n assert(index < this.data.length);\r\n if (byte !== this.data[index]) {\r\n this.data[index] = byte;\r\n this.modified = true;\r\n }\r\n }\r\n\r\n public setOvrFlagsAtIndex(index: number, value: OvrFlags) {\r\n assert(index < this.data.length - 1);\r\n assert(value < 0xffff);\r\n this.setByteAtIndex(index, value & 0xff);\r\n this.setByteAtIndex(index + 1, (value & 0xff00) >> 8);\r\n }\r\n\r\n public getByteAtIndex(index: number): number { assert(index < this.data.length); return this.data[index]; }\r\n public getOvrFlagsAtIndex(index: number): OvrFlags {\r\n const lo = this.getByteAtIndex(index);\r\n const hi = this.getByteAtIndex(index + 1);\r\n return lo | (hi << 8);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"Texture.js","sourceRoot":"","sources":["../../../../src/render/webgl/Texture.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, BeEvent, dispose, Id64String } from \"@itwin/core-bentley\";\r\nimport {\r\n ImageBuffer, ImageBufferFormat, ImageSource, ImageSourceFormat, isPowerOfTwo, nextHighestPowerOfTwo, RenderTexture, TextureData, TextureTransparency,\r\n} from \"@itwin/core-common\";\r\nimport { getImageSourceMimeType, imageBufferToPngDataUrl, imageElementFromImageSource, openImageDataUrlInNewWindow } from \"../../ImageUtil\";\r\nimport { IModelConnection } from \"../../IModelConnection\";\r\nimport { IModelApp } from \"../../IModelApp\";\r\nimport { WebGLDisposable } from \"./Disposable\";\r\nimport { GL } from \"./GL\";\r\nimport { UniformHandle } from \"./UniformHandle\";\r\nimport { OvrFlags, TextureUnit } from \"./RenderFlags\";\r\nimport { System } from \"./System\";\r\nimport { TextureOwnership } from \"../RenderTexture\";\r\n\r\ntype CanvasOrImage = HTMLCanvasElement | HTMLImageElement;\r\n\r\n/** @internal */\r\nexport type Texture2DData = Uint8Array | Float32Array;\r\n\r\nfunction computeBytesUsed(width: number, height: number, format: GL.Texture.Format, dataType: GL.Texture.DataType): number {\r\n const bytesPerComponent = GL.Texture.DataType.UnsignedByte === dataType ? 1 : 4;\r\n let componentsPerPixel = 1;\r\n switch (format) {\r\n case GL.Texture.Format.Rgb:\r\n componentsPerPixel = 3;\r\n break;\r\n case GL.Texture.Format.Rgba:\r\n componentsPerPixel = 4;\r\n break;\r\n }\r\n\r\n return width * height * componentsPerPixel * bytesPerComponent;\r\n}\r\n\r\n/** Associate texture data with a WebGLTexture from a canvas, image, OR a bitmap. */\r\nfunction loadTexture2DImageData(handle: TextureHandle, params: Texture2DCreateParams, bytes?: Texture2DData, element?: CanvasOrImage): void {\r\n handle.bytesUsed = undefined !== bytes ? bytes.byteLength : computeBytesUsed(params.width, params.height, params.format, params.dataType);\r\n\r\n const tex = handle.getHandle()!;\r\n const gl = System.instance.context;\r\n\r\n // Use tightly packed data\r\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\r\n\r\n // Bind the texture object; make sure we do not interfere with other active textures\r\n System.instance.activateTexture2d(TextureUnit.Zero, tex);\r\n\r\n // Figure out the internal format. For all but WebGL2 float/half-float datatypes it is just same as format.\r\n // TODO: probably need to just support internal format types in Texture2DCreateParams.\r\n let internalFormat = params.format;\r\n if (System.instance.capabilities.isWebGL2) {\r\n const context2 = System.instance.context as WebGL2RenderingContext;\r\n if (GL.Texture.Format.Rgba === params.format) {\r\n if (GL.Texture.DataType.Float === params.dataType)\r\n internalFormat = context2.RGBA32F;\r\n else if (context2.HALF_FLOAT === params.dataType)\r\n internalFormat = context2.RGBA16F;\r\n } else if (GL.Texture.Format.DepthStencil === params.format)\r\n internalFormat = context2.DEPTH24_STENCIL8;\r\n }\r\n\r\n // send the texture data\r\n if (undefined !== element) {\r\n gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, params.format, params.dataType, element);\r\n } else {\r\n const pixelData = undefined !== bytes ? bytes : null;\r\n gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, params.width, params.height, 0, params.format, params.dataType, pixelData);\r\n }\r\n\r\n if (params.useMipMaps) {\r\n gl.generateMipmap(gl.TEXTURE_2D);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\r\n } else {\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, params.interpolate ? gl.LINEAR : gl.NEAREST);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, params.interpolate ? gl.LINEAR : gl.NEAREST);\r\n }\r\n if (params.anisotropicFilter) {\r\n System.instance.setMaxAnisotropy(params.anisotropicFilter);\r\n }\r\n\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, params.wrapMode);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, params.wrapMode);\r\n\r\n System.instance.bindTexture2d(TextureUnit.Zero, undefined);\r\n}\r\n\r\nfunction loadTextureFromBytes(handle: TextureHandle, params: Texture2DCreateParams, bytes?: Texture2DData): void { loadTexture2DImageData(handle, params, bytes); }\r\n\r\n/** Associate cube texture data with a WebGLTexture from an image. */\r\nfunction loadTextureCubeImageData(handle: TextureHandle, params: TextureCubeCreateParams, images: CanvasOrImage[]): void {\r\n handle.bytesUsed = computeBytesUsed(params.dim * 6, params.dim, params.format, params.dataType);\r\n\r\n const tex = handle.getHandle()!;\r\n const gl = System.instance.context;\r\n\r\n // Use tightly packed data\r\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\r\n\r\n // Bind the texture object; make sure we do not interfere with other active textures\r\n System.instance.activateTextureCubeMap(TextureUnit.Zero, tex);\r\n\r\n const cubeTargets: number[] = [GL.Texture.Target.CubeMapPositiveX, GL.Texture.Target.CubeMapNegativeX, GL.Texture.Target.CubeMapPositiveY, GL.Texture.Target.CubeMapNegativeY, GL.Texture.Target.CubeMapPositiveZ, GL.Texture.Target.CubeMapNegativeZ];\r\n\r\n for (let i = 0; i < 6; i++) {\r\n gl.texImage2D(cubeTargets[i], 0, params.format, params.format, params.dataType, images[i]);\r\n }\r\n\r\n gl.texParameteri(GL.Texture.Target.CubeMap, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\r\n gl.texParameteri(GL.Texture.Target.CubeMap, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\r\n gl.texParameteri(GL.Texture.Target.CubeMap, gl.TEXTURE_WRAP_S, params.wrapMode);\r\n gl.texParameteri(GL.Texture.Target.CubeMap, gl.TEXTURE_WRAP_T, params.wrapMode);\r\n // gl.texParameteri(GL.Texture.Target.CubeMap, gl.TEXTURE_WRAP_R, params.wrapMode); // Unavailable in GLES2\r\n\r\n System.instance.bindTextureCubeMap(TextureUnit.Zero, undefined);\r\n}\r\n\r\ntype TextureFlag = true | undefined;\r\ntype TextureAnisotropicFilter = number | undefined;\r\ntype Load2DImageData = (handle: TextureHandle, params: Texture2DCreateParams) => void;\r\ntype LoadCubeImageData = (handle: TextureHandle, params: TextureCubeCreateParams) => void;\r\n\r\ninterface TextureImageProperties {\r\n wrapMode: GL.Texture.WrapMode;\r\n useMipMaps: TextureFlag;\r\n interpolate: TextureFlag;\r\n format: GL.Texture.Format;\r\n anisotropicFilter: TextureAnisotropicFilter;\r\n}\r\n\r\n/** @internal */\r\nexport interface TextureParams {\r\n type: RenderTexture.Type;\r\n ownership?: TextureOwnership;\r\n transparency: TextureTransparency;\r\n handle: TextureHandle;\r\n}\r\n\r\n/** Wrapper class for a WebGL texture handle and parameters specific to an individual texture.\r\n * @internal\r\n */\r\nexport class Texture extends RenderTexture implements WebGLDisposable {\r\n public readonly texture: TextureHandle;\r\n public readonly ownership?: TextureOwnership;\r\n public transparency: TextureTransparency;\r\n\r\n public get bytesUsed(): number { return this.texture.bytesUsed; }\r\n public get hasOwner(): boolean { return undefined !== this.ownership; }\r\n public get key(): string | undefined {\r\n return typeof this.ownership !== \"string\" && typeof this.ownership?.key === \"string\" ? this.ownership.key : undefined;\r\n }\r\n\r\n public constructor(params: TextureParams) {\r\n super(params.type);\r\n this.ownership = params.ownership;\r\n this.texture = params.handle;\r\n this.transparency = params.handle.format === GL.Texture.Format.Rgba ? params.transparency : TextureTransparency.Opaque;\r\n }\r\n\r\n public get isDisposed(): boolean { return this.texture.isDisposed; }\r\n\r\n /** Free this object in the WebGL wrapper. */\r\n public dispose() {\r\n dispose(this.texture);\r\n }\r\n}\r\n\r\nfunction getDataType(data: Texture2DData): GL.Texture.DataType {\r\n return data instanceof Float32Array ? GL.Texture.DataType.Float : GL.Texture.DataType.UnsignedByte;\r\n}\r\n\r\n/** Parameters used internally to define how to create a texture for use with WebGL. */\r\nclass Texture2DCreateParams {\r\n private constructor(\r\n public width: number,\r\n public height: number,\r\n public format: GL.Texture.Format,\r\n public dataType: GL.Texture.DataType,\r\n public wrapMode: GL.Texture.WrapMode,\r\n public loadImageData: Load2DImageData,\r\n public useMipMaps?: TextureFlag,\r\n public interpolate?: TextureFlag,\r\n public anisotropicFilter?: TextureAnisotropicFilter,\r\n public dataBytes?: Uint8Array) { }\r\n\r\n public static createForData(width: number, height: number, data: Texture2DData, preserveData = false, wrapMode = GL.Texture.WrapMode.ClampToEdge, format = GL.Texture.Format.Rgba) {\r\n const bytes = (preserveData && data instanceof Uint8Array) ? data : undefined;\r\n return new Texture2DCreateParams(width, height, format, getDataType(data), wrapMode,\r\n (tex: TextureHandle, params: Texture2DCreateParams) => loadTextureFromBytes(tex, params, data), undefined, undefined, undefined, bytes);\r\n }\r\n\r\n public static createForImageBuffer(image: ImageBuffer, type: RenderTexture.Type) {\r\n const props = this.getImageProperties(type);\r\n if (ImageBufferFormat.Rgb === image.format)\r\n props.format = GL.Texture.Format.Rgb;\r\n\r\n return new Texture2DCreateParams(image.width, image.height, props.format, GL.Texture.DataType.UnsignedByte, props.wrapMode,\r\n (tex: TextureHandle, params: Texture2DCreateParams) => loadTextureFromBytes(tex, params, image.data), props.useMipMaps, props.interpolate);\r\n }\r\n\r\n public static createForAttachment(width: number, height: number, format: GL.Texture.Format, dataType: GL.Texture.DataType) {\r\n return new Texture2DCreateParams(width, height, format, dataType, GL.Texture.WrapMode.ClampToEdge,\r\n (tex: TextureHandle, params: Texture2DCreateParams) => loadTextureFromBytes(tex, params), undefined, undefined);\r\n }\r\n\r\n public static createForImage(image: HTMLImageElement, type: RenderTexture.Type) {\r\n const props = this.getImageProperties(type);\r\n\r\n let targetWidth = image.naturalWidth;\r\n let targetHeight = image.naturalHeight;\r\n\r\n const caps = System.instance.capabilities;\r\n if (RenderTexture.Type.Glyph === type) {\r\n targetWidth = nextHighestPowerOfTwo(targetWidth);\r\n targetHeight = nextHighestPowerOfTwo(targetHeight);\r\n } else if (!caps.supportsNonPowerOf2Textures && (!isPowerOfTwo(targetWidth) || !isPowerOfTwo(targetHeight))) {\r\n if (GL.Texture.WrapMode.ClampToEdge === props.wrapMode) {\r\n // NPOT are supported but not mipmaps\r\n // Probably on poor hardware so I choose to disable mipmaps for lower memory usage over quality. If quality is required we need to resize the image to a pow of 2.\r\n // Above comment is not necessarily true - WebGL doesn't support NPOT mipmapping, only supporting base NPOT caps\r\n props.useMipMaps = undefined;\r\n } else if (GL.Texture.WrapMode.Repeat === props.wrapMode) {\r\n targetWidth = nextHighestPowerOfTwo(targetWidth);\r\n targetHeight = nextHighestPowerOfTwo(targetHeight);\r\n }\r\n }\r\n\r\n // Cap texture dimensions to system WebGL capabilities\r\n const maxTexSize = System.instance.capabilities.maxTextureSize;\r\n targetWidth = Math.min(targetWidth, maxTexSize);\r\n targetHeight = Math.min(targetHeight, maxTexSize);\r\n\r\n let element: CanvasOrImage = image;\r\n if (targetWidth !== image.naturalWidth || targetHeight !== image.naturalHeight) {\r\n // Resize so dimensions are powers-of-two\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = targetWidth;\r\n canvas.height = targetHeight;\r\n\r\n const context = canvas.getContext(\"2d\")!;\r\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\r\n\r\n element = canvas;\r\n }\r\n\r\n return new Texture2DCreateParams(targetWidth, targetHeight, props.format, GL.Texture.DataType.UnsignedByte, props.wrapMode,\r\n (tex: TextureHandle, params: Texture2DCreateParams) => loadTexture2DImageData(tex, params, undefined, element), props.useMipMaps, props.interpolate, props.anisotropicFilter);\r\n }\r\n\r\n public static createForImageBitmap(image: ImageBitmap, type: RenderTexture.Type) {\r\n const props = this.getImageProperties(type);\r\n\r\n let targetWidth = image.width;\r\n let targetHeight = image.height;\r\n\r\n const caps = System.instance.capabilities;\r\n if (RenderTexture.Type.Glyph === type) {\r\n targetWidth = nextHighestPowerOfTwo(targetWidth);\r\n targetHeight = nextHighestPowerOfTwo(targetHeight);\r\n } else if (!caps.supportsNonPowerOf2Textures && (!isPowerOfTwo(targetWidth) || !isPowerOfTwo(targetHeight))) {\r\n if (GL.Texture.WrapMode.ClampToEdge === props.wrapMode) {\r\n // NPOT are supported but not mipmaps\r\n // Probably on poor hardware so I choose to disable mipmaps for lower memory usage over quality. If quality is required we need to resize the image to a pow of 2.\r\n // Above comment is not necessarily true - WebGL doesn't support NPOT mipmapping, only supporting base NPOT caps\r\n props.useMipMaps = undefined;\r\n } else if (GL.Texture.WrapMode.Repeat === props.wrapMode) {\r\n targetWidth = nextHighestPowerOfTwo(targetWidth);\r\n targetHeight = nextHighestPowerOfTwo(targetHeight);\r\n }\r\n }\r\n\r\n // Always draw to canvas for ImageBitmap\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = targetWidth;\r\n canvas.height = targetHeight;\r\n const context = canvas.getContext(\"2d\")!;\r\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\r\n\r\n return new Texture2DCreateParams(targetWidth, targetHeight, props.format, GL.Texture.DataType.UnsignedByte, props.wrapMode,\r\n (tex: TextureHandle, params: Texture2DCreateParams) => loadTexture2DImageData(tex, params, undefined, canvas), props.useMipMaps, props.interpolate, props.anisotropicFilter);\r\n }\r\n\r\n private static getImageProperties(type: RenderTexture.Type): TextureImageProperties {\r\n const isSky = RenderTexture.Type.SkyBox === type;\r\n const isTile = RenderTexture.Type.TileSection === type;\r\n const isThematic = RenderTexture.Type.ThematicGradient === type;\r\n const isFilteredTile = RenderTexture.Type.FilteredTileSection === type;\r\n const maxAnisotropicFilterLevel = 16;\r\n\r\n const wrapMode = RenderTexture.Type.Normal === type ? GL.Texture.WrapMode.Repeat : GL.Texture.WrapMode.ClampToEdge;\r\n const useMipMaps: TextureFlag = (!isSky && !isTile && !isFilteredTile && !isThematic) ? true : undefined;\r\n const interpolate: TextureFlag = isThematic ? undefined : true;\r\n const anisotropicFilter = isFilteredTile ? maxAnisotropicFilterLevel : undefined;\r\n\r\n // Always use RGBA. RGB is much slower and almost certainly does not actually save any GPU memory.\r\n const format = GL.Texture.Format.Rgba;\r\n\r\n return { format, wrapMode, useMipMaps, interpolate, anisotropicFilter };\r\n }\r\n\r\n public static readonly placeholderParams = new Texture2DCreateParams(1, 1, GL.Texture.Format.Rgba, GL.Texture.DataType.UnsignedByte, GL.Texture.WrapMode.ClampToEdge,\r\n (_tex: TextureHandle, _params: Texture2DCreateParams) => undefined);\r\n}\r\n\r\nclass TextureCubeCreateParams {\r\n private constructor(\r\n public dim: number,\r\n public format: GL.Texture.Format,\r\n public dataType: GL.Texture.DataType,\r\n public wrapMode: GL.Texture.WrapMode,\r\n public loadImageData: LoadCubeImageData) { }\r\n\r\n public static createForCubeImages(posX: HTMLImageElement, negX: HTMLImageElement, posY: HTMLImageElement, negY: HTMLImageElement, posZ: HTMLImageElement, negZ: HTMLImageElement): TextureCubeCreateParams | undefined {\r\n const targetDim = posX.naturalWidth;\r\n\r\n if (posX.naturalHeight !== targetDim) // Cube texture dimensions must match (width must equal height)\r\n return undefined;\r\n\r\n const images: HTMLImageElement[] = [posX, negX, posY, negY, posZ, negZ];\r\n\r\n for (let i = 1; i < images.length; i++) { // Dimensions of all six sides must match each other\r\n if (images[i].naturalWidth !== targetDim || images[i].naturalHeight !== targetDim)\r\n return undefined;\r\n }\r\n\r\n return new TextureCubeCreateParams(targetDim, GL.Texture.Format.Rgba, GL.Texture.DataType.UnsignedByte, GL.Texture.WrapMode.ClampToEdge,\r\n (tex: TextureHandle, params: TextureCubeCreateParams) => loadTextureCubeImageData(tex, params, images));\r\n }\r\n}\r\n\r\n/** Wraps a WebGLTextureHandle\r\n * @internal\r\n */\r\nexport abstract class TextureHandle implements WebGLDisposable {\r\n protected _glTexture?: WebGLTexture;\r\n protected _bytesUsed = 0;\r\n\r\n public abstract get width(): number;\r\n public abstract get height(): number;\r\n public abstract get format(): GL.Texture.Format;\r\n public abstract get dataType(): GL.Texture.DataType;\r\n public abstract get dataBytes(): Uint8Array | undefined;\r\n public get bytesUsed(): number { return this._bytesUsed; }\r\n public set bytesUsed(bytesUsed: number) {\r\n // assert(0 === this.bytesUsed);\r\n this._bytesUsed = bytesUsed;\r\n }\r\n\r\n /** Get the WebGLTexture for this TextureHandle. */\r\n public getHandle(): WebGLTexture | undefined { return this._glTexture; }\r\n\r\n /** Bind texture handle (if available) associated with an instantiation of this class to specified texture unit. */\r\n public abstract bind(_texUnit: TextureUnit): boolean;\r\n\r\n /** Bind this texture to a uniform sampler. */\r\n public abstract bindSampler(_uniform: UniformHandle, _unit: TextureUnit): void;\r\n\r\n public get isDisposed(): boolean { return this._glTexture === undefined; }\r\n\r\n public dispose() {\r\n if (!this.isDisposed) {\r\n System.instance.disposeTexture(this._glTexture!);\r\n this._glTexture = undefined;\r\n this.bytesUsed = 0;\r\n }\r\n }\r\n\r\n /** Create a 2D texture for use as a color attachment for rendering */\r\n public static createForAttachment(width: number, height: number, format: GL.Texture.Format, dataType: GL.Texture.DataType) {\r\n return Texture2DHandle.createForAttachment(width, height, format, dataType);\r\n }\r\n\r\n /** Create a 2D texture to hold non-image data */\r\n public static createForData(width: number, height: number, data: Texture2DData, wantPreserveData = false, wrapMode = GL.Texture.WrapMode.ClampToEdge, format = GL.Texture.Format.Rgba) {\r\n return Texture2DHandle.createForData(width, height, data, wantPreserveData, wrapMode, format);\r\n }\r\n\r\n /** Create a 2D texture from a bitmap */\r\n public static createForImageBuffer(image: ImageBuffer, type: RenderTexture.Type) {\r\n return Texture2DHandle.createForImageBuffer(image, type);\r\n }\r\n\r\n /** Create a 2D texture from an HTMLImageElement. */\r\n public static createForImage(image: HTMLImageElement, type: RenderTexture.Type) {\r\n return Texture2DHandle.createForImage(image, type);\r\n }\r\n\r\n /** Create a 2D texture from an ImageBitmap. */\r\n public static createForImageBitmap(image: ImageBitmap, type: RenderTexture.Type) {\r\n return Texture2DHandle.createForImageBitmap(image, type);\r\n }\r\n\r\n /** Create a cube map texture from six HTMLImageElement objects. */\r\n public static createForCubeImages(posX: HTMLImageElement, negX: HTMLImageElement, posY: HTMLImageElement, negY: HTMLImageElement, posZ: HTMLImageElement, negZ: HTMLImageElement) {\r\n return TextureCubeHandle.createForCubeImages(posX, negX, posY, negY, posZ, negZ);\r\n }\r\n\r\n public static createForElement(id: Id64String, imodel: IModelConnection, type: RenderTexture.Type, format: ImageSourceFormat, onLoaded: ExternalTextureLoadCallback) {\r\n return Texture2DHandle.createForElement(id, imodel, type, format, onLoaded);\r\n }\r\n\r\n protected constructor(glTexture: WebGLTexture) {\r\n this._glTexture = glTexture;\r\n }\r\n\r\n /** For debugging purposes, open a new window containing this texture as an image. */\r\n public showDebugImage(): void {\r\n const gl = System.instance.context;\r\n const fbo = gl.createFramebuffer();\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.getHandle()!, 0);\r\n if (gl.FRAMEBUFFER_COMPLETE === gl.checkFramebufferStatus(gl.FRAMEBUFFER)) {\r\n const w = this.width;\r\n const h = this.height;\r\n const pixels = new Uint8Array(w * h * 4);\r\n gl.readPixels(0, 0, w, h, gl.RGBA, gl.UNSIGNED_BYTE, pixels);\r\n\r\n const buffer = ImageBuffer.create(pixels, ImageBufferFormat.Rgba, w)!;\r\n const url = imageBufferToPngDataUrl(buffer, false);\r\n openImageDataUrlInNewWindow(url!, \"Classifiers\");\r\n }\r\n\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\r\n gl.deleteFramebuffer(fbo);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class Texture2DHandle extends TextureHandle {\r\n private _width: number;\r\n private _height: number;\r\n private _format: GL.Texture.Format;\r\n private _dataType: GL.Texture.DataType;\r\n private _dataBytes?: Uint8Array;\r\n\r\n public get width(): number { return this._width; }\r\n public get height(): number { return this._height; }\r\n public get format(): GL.Texture.Format { return this._format; }\r\n public get dataType(): GL.Texture.DataType { return this._dataType; }\r\n public get dataBytes(): Uint8Array | undefined { return this._dataBytes; }\r\n\r\n /** Bind specified texture handle to specified texture unit. */\r\n public static bindTexture(texUnit: TextureUnit, glTex: WebGLTexture | undefined) {\r\n assert(!(glTex instanceof TextureHandle));\r\n System.instance.bindTexture2d(texUnit, glTex);\r\n }\r\n\r\n /** Bind the specified texture to a uniform sampler2D */\r\n public static bindSampler(uniform: UniformHandle, tex: WebGLTexture, unit: TextureUnit): void {\r\n assert(!(tex instanceof TextureHandle));\r\n this.bindTexture(unit, tex);\r\n uniform.setUniform1i(unit - TextureUnit.Zero);\r\n }\r\n\r\n /** Bind texture handle (if available) associated with an instantiation of this class to specified texture unit. */\r\n public bind(texUnit: TextureUnit): boolean {\r\n if (undefined === this._glTexture)\r\n return false;\r\n Texture2DHandle.bindTexture(texUnit, this._glTexture);\r\n return true;\r\n }\r\n\r\n /** Bind this texture to a uniform sampler2D */\r\n public bindSampler(uniform: UniformHandle, unit: TextureUnit): void {\r\n if (undefined !== this._glTexture)\r\n Texture2DHandle.bindSampler(uniform, this._glTexture, unit);\r\n }\r\n\r\n /** Update the 2D texture contents. */\r\n public update(updater: Texture2DDataUpdater): boolean {\r\n if (0 === this.width || 0 === this.height || undefined === this._dataBytes || 0 === this._dataBytes.length) {\r\n assert(false);\r\n return false;\r\n }\r\n\r\n if (!updater.modified)\r\n return false;\r\n\r\n return this.replaceTextureData(this._dataBytes);\r\n }\r\n\r\n /** Replace the 2D texture contents. */\r\n public replaceTextureData(data: Texture2DData): boolean {\r\n assert((GL.Texture.DataType.Float === this._dataType) === (data instanceof Float32Array));\r\n\r\n const tex = this.getHandle()!;\r\n if (undefined === tex)\r\n return false;\r\n\r\n const gl = System.instance.context;\r\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\r\n\r\n // Go through System to ensure we don't interfere with currently-bound textures!\r\n System.instance.activateTexture2d(TextureUnit.Zero, tex);\r\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, this._format, this._dataType, data);\r\n System.instance.bindTexture2d(TextureUnit.Zero, undefined);\r\n\r\n return true;\r\n }\r\n\r\n private static create(params: Texture2DCreateParams): Texture2DHandle | undefined {\r\n const glTex = System.instance.context.createTexture();\r\n return null !== glTex ? new Texture2DHandle(glTex, params) : undefined;\r\n }\r\n\r\n /** Create a texture for use as a color attachment for rendering */\r\n public static override createForAttachment(width: number, height: number, format: GL.Texture.Format, dataType: GL.Texture.DataType) {\r\n return this.create(Texture2DCreateParams.createForAttachment(width, height, format, dataType));\r\n }\r\n\r\n /** Create a texture to hold non-image data */\r\n public static override createForData(width: number, height: number, data: Texture2DData, wantPreserveData = false, wrapMode = GL.Texture.WrapMode.ClampToEdge, format = GL.Texture.Format.Rgba) {\r\n return this.create(Texture2DCreateParams.createForData(width, height, data, wantPreserveData, wrapMode, format));\r\n }\r\n\r\n /** Create a texture from a bitmap */\r\n public static override createForImageBuffer(image: ImageBuffer, type: RenderTexture.Type) {\r\n if (RenderTexture.Type.TileSection !== type && RenderTexture.Type.ThematicGradient !== type)\r\n assert(isPowerOfTwo(image.width) && isPowerOfTwo(image.height), \"###TODO: Resize image dimensions to powers-of-two if necessary\");\r\n\r\n return this.create(Texture2DCreateParams.createForImageBuffer(image, type));\r\n }\r\n\r\n /** Create a 2D texture from an HTMLImageElement. */\r\n public static override createForImage(image: HTMLImageElement, type: RenderTexture.Type) {\r\n return this.create(Texture2DCreateParams.createForImage(image, type));\r\n }\r\n\r\n /** Create a 2D texture from an ImageBitmap. */\r\n public static override createForImageBitmap(image: ImageBitmap, type: RenderTexture.Type) {\r\n return this.create(Texture2DCreateParams.createForImageBitmap(image, type));\r\n }\r\n\r\n private static _placeHolderTextureData = new Uint8Array([128, 128, 128]);\r\n\r\n public static override createForElement(id: Id64String, imodel: IModelConnection, type: RenderTexture.Type, format: ImageSourceFormat, onLoaded: ExternalTextureLoadCallback) {\r\n // set a placeholder texture while we wait for the external texture to load\r\n const handle = this.createForData(1, 1, this._placeHolderTextureData, undefined, undefined, GL.Texture.Format.Rgb);\r\n\r\n if (undefined === handle)\r\n return undefined;\r\n\r\n // kick off loading the texture from the backend\r\n ExternalTextureLoader.instance.loadTexture(handle, id, imodel, type, format, onLoaded);\r\n\r\n return handle;\r\n }\r\n\r\n public reload(params: Texture2DCreateParams) {\r\n this._width = params.width;\r\n this._height = params.height;\r\n this._format = params.format;\r\n this._dataType = params.dataType;\r\n this._dataBytes = params.dataBytes;\r\n\r\n params.loadImageData(this, params);\r\n }\r\n\r\n private constructor(glTexture: WebGLTexture, params: Texture2DCreateParams) {\r\n super(glTexture);\r\n this._width = params.width;\r\n this._height = params.height;\r\n this._format = params.format;\r\n this._dataType = params.dataType;\r\n this._dataBytes = params.dataBytes;\r\n\r\n params.loadImageData(this, params);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport type ExternalTextureLoadCallback = (req: ExternalTextureRequest, data: TextureData) => void;\r\n\r\n/** @internal */\r\nexport interface ExternalTextureRequest {\r\n handle: Texture2DHandle;\r\n name: Id64String;\r\n imodel: IModelConnection;\r\n type: RenderTexture.Type;\r\n format: ImageSourceFormat;\r\n onLoaded?: ExternalTextureLoadCallback;\r\n}\r\n\r\n/** @internal */\r\ninterface TextureConvertRequest {\r\n req: ExternalTextureRequest;\r\n texData: TextureData;\r\n}\r\n\r\n/** @internal */\r\nexport class ExternalTextureLoader { /* currently exported for tests only */\r\n public static readonly instance = new ExternalTextureLoader(2);\r\n public readonly onTexturesLoaded = new BeEvent<() => void>();\r\n private readonly _maxActiveRequests: number;\r\n private _activeRequests: Array<ExternalTextureRequest> = [];\r\n private _pendingRequests: Array<ExternalTextureRequest> = [];\r\n private _convertRequests: Array<TextureConvertRequest> = [];\r\n private _convertPending = false;\r\n\r\n public get numActiveRequests() { return this._activeRequests.length; }\r\n public get numPendingRequests() { return this._pendingRequests.length; }\r\n public get maxActiveRequests() { return this._maxActiveRequests; }\r\n\r\n private constructor(maxActiveRequests: number) {\r\n this._maxActiveRequests = maxActiveRequests;\r\n }\r\n\r\n private async _nextRequest(prevReq: ExternalTextureRequest) {\r\n this._activeRequests.splice(this._activeRequests.indexOf(prevReq), 1);\r\n if (this._activeRequests.length < this._maxActiveRequests && this._pendingRequests.length > 0) {\r\n const req = this._pendingRequests.shift()!;\r\n await this._activateRequest(req);\r\n }\r\n if (this._activeRequests.length < 1 && this._pendingRequests.length < 1)\r\n this.onTexturesLoaded.raiseEvent();\r\n }\r\n\r\n private async _activateRequest(req: ExternalTextureRequest) {\r\n if (req.imodel.isClosed)\r\n return;\r\n\r\n this._activeRequests.push(req);\r\n\r\n try {\r\n if (!req.imodel.isClosed) {\r\n const maxTextureSize = System.instance.capabilities.maxTexSizeAllow;\r\n const texData = await req.imodel.queryTextureData({ name: req.name, maxTextureSize });\r\n if (undefined !== texData) {\r\n const cnvReq = { req, texData };\r\n this._convertRequests.push(cnvReq);\r\n // _convertPending is used to prevent overlapping calls to _convertTexture (from overlapping calls to _activateRequest)\r\n // it has been put on the list, so if it doesn't get converted here it will get converted by the loop that is converting the current one\r\n do {\r\n if (!this._convertPending)\r\n await this._convertTexture();\r\n } while (!this._convertPending && this._convertRequests.length > 0);\r\n if (!req.imodel.isClosed) {\r\n IModelApp.tileAdmin.invalidateAllScenes();\r\n if (undefined !== req.onLoaded)\r\n req.onLoaded(req, texData);\r\n }\r\n }\r\n }\r\n } catch (_e) { }\r\n\r\n return this._nextRequest(req);\r\n }\r\n\r\n private async _convertTexture(): Promise<void> {\r\n this._convertPending = true;\r\n try {\r\n const cnvReq = this._convertRequests.shift();\r\n if (undefined !== cnvReq) {\r\n const imageSource = new ImageSource(cnvReq.texData.bytes, cnvReq.texData.format);\r\n if (System.instance.capabilities.supportsCreateImageBitmap) {\r\n const blob = new Blob([imageSource.data], { type: getImageSourceMimeType(imageSource.format) });\r\n const image = await createImageBitmap(blob, 0, 0, cnvReq.texData.width, cnvReq.texData.height);\r\n if (!cnvReq.req.imodel.isClosed) {\r\n cnvReq.req.handle.reload(Texture2DCreateParams.createForImageBitmap(image, cnvReq.req.type));\r\n }\r\n } else {\r\n const image = await imageElementFromImageSource(imageSource);\r\n if (!cnvReq.req.imodel.isClosed) {\r\n cnvReq.req.handle.reload(Texture2DCreateParams.createForImage(image, cnvReq.req.type));\r\n }\r\n }\r\n }\r\n } catch (_e) { }\r\n this._convertPending = false;\r\n }\r\n\r\n private _requestExists(reqToCheck: ExternalTextureRequest) {\r\n for (const r of this._activeRequests)\r\n if (reqToCheck.name === r.name && reqToCheck.imodel === r.imodel)\r\n return true;\r\n\r\n for (const r of this._pendingRequests)\r\n if (reqToCheck.name === r.name && reqToCheck.imodel === r.imodel)\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n public loadTexture(handle: Texture2DHandle, name: Id64String, imodel: IModelConnection, type: RenderTexture.Type, format: ImageSourceFormat, onLoaded?: ExternalTextureLoadCallback) {\r\n const req = { handle, name, imodel, type, format, onLoaded };\r\n if (this._requestExists(req))\r\n return;\r\n\r\n if (this._activeRequests.length + 1 > this._maxActiveRequests) {\r\n this._pendingRequests.push(req);\r\n } else\r\n this._activateRequest(req); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class TextureCubeHandle extends TextureHandle {\r\n private _dim: number; // Cubemap texture height and width must match. This must be the same for each of the six faces.\r\n private _format: GL.Texture.Format; // Format must be the same for each of the six faces.\r\n private _dataType: GL.Texture.DataType; // Type must be the same for each of the six faces.\r\n\r\n public get width(): number { return this._dim; }\r\n public get height(): number { return this._dim; }\r\n public get format(): GL.Texture.Format { return this._format; }\r\n public get dataType(): GL.Texture.DataType { return this._dataType; }\r\n public get dataBytes(): Uint8Array | undefined { return undefined; }\r\n\r\n /** Bind specified cubemap texture handle to specified texture unit. */\r\n public static bindTexture(texUnit: TextureUnit, glTex: WebGLTexture | undefined) {\r\n assert(!(glTex instanceof TextureHandle));\r\n System.instance.bindTextureCubeMap(texUnit, glTex);\r\n }\r\n\r\n /** Bind the specified texture to a uniform sampler2D */\r\n public static bindSampler(uniform: UniformHandle, tex: WebGLTexture, unit: TextureUnit): void {\r\n assert(!(tex instanceof TextureHandle));\r\n this.bindTexture(unit, tex);\r\n uniform.setUniform1i(unit - TextureUnit.Zero);\r\n }\r\n\r\n /** Bind texture handle (if available) associated with an instantiation of this class to specified texture unit. */\r\n public bind(texUnit: TextureUnit): boolean {\r\n if (undefined === this._glTexture)\r\n return false;\r\n TextureCubeHandle.bindTexture(texUnit, this._glTexture);\r\n return true;\r\n }\r\n\r\n /** Bind this texture to a uniform sampler2D */\r\n public bindSampler(uniform: UniformHandle, unit: TextureUnit): void {\r\n if (undefined !== this._glTexture)\r\n TextureCubeHandle.bindSampler(uniform, this._glTexture, unit);\r\n }\r\n\r\n private static create(params: TextureCubeCreateParams): TextureHandle | undefined {\r\n const glTex = System.instance.context.createTexture();\r\n return null !== glTex ? new TextureCubeHandle(glTex, params) : undefined;\r\n }\r\n\r\n /** Create a cube map texture from six HTMLImageElement objects. */\r\n public static override createForCubeImages(posX: HTMLImageElement, negX: HTMLImageElement, posY: HTMLImageElement, negY: HTMLImageElement, posZ: HTMLImageElement, negZ: HTMLImageElement) {\r\n const params = TextureCubeCreateParams.createForCubeImages(posX, negX, posY, negY, posZ, negZ);\r\n return params !== undefined ? this.create(params) : undefined;\r\n }\r\n\r\n private constructor(glTexture: WebGLTexture, params: TextureCubeCreateParams) {\r\n super(glTexture);\r\n this._dim = params.dim;\r\n this._format = params.format;\r\n this._dataType = params.dataType;\r\n\r\n params.loadImageData(this, params);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class Texture2DDataUpdater {\r\n public data: Uint8Array;\r\n public modified: boolean = false;\r\n\r\n public constructor(data: Uint8Array) { this.data = data; }\r\n\r\n public setByteAtIndex(index: number, byte: number) {\r\n assert(index < this.data.length);\r\n if (byte !== this.data[index]) {\r\n this.data[index] = byte;\r\n this.modified = true;\r\n }\r\n }\r\n\r\n public setOvrFlagsAtIndex(index: number, value: OvrFlags) {\r\n assert(index < this.data.length - 1);\r\n assert(value < 0xffff);\r\n this.setByteAtIndex(index, value & 0xff);\r\n this.setByteAtIndex(index + 1, (value & 0xff00) >> 8);\r\n }\r\n\r\n public getByteAtIndex(index: number): number { assert(index < this.data.length); return this.data[index]; }\r\n public getOvrFlagsAtIndex(index: number): OvrFlags {\r\n const lo = this.getByteAtIndex(index);\r\n const hi = this.getByteAtIndex(index + 1);\r\n return lo | (hi << 8);\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"AmbientOcclusion.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/AmbientOcclusion.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAI1D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA4IjD,gBAAgB;AAChB,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CAoElF"}
1
+ {"version":3,"file":"AmbientOcclusion.d.ts","sourceRoot":"","sources":["../../../../../src/render/webgl/glsl/AmbientOcclusion.ts"],"names":[],"mappings":"AAIA;;GAEG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAI1D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA0LjD,gBAAgB;AAChB,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CA+FlF"}
@@ -9,6 +9,7 @@
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.createAmbientOcclusionProgram = void 0;
11
11
  const RenderFlags_1 = require("../RenderFlags");
12
+ const System_1 = require("../System");
12
13
  const Texture_1 = require("../Texture");
13
14
  const Common_1 = require("./Common");
14
15
  const Decode_1 = require("./Decode");
@@ -16,11 +17,23 @@ const FeatureSymbology_1 = require("./FeatureSymbology");
16
17
  const Fragment_1 = require("./Fragment");
17
18
  const Viewport_1 = require("./Viewport");
18
19
  const ViewportQuad_1 = require("./ViewportQuad");
20
+ // 'PB' indicates a shader variation when only the pickbuffer is available
21
+ // 'DB' indicates a shader variation when the real floating point depth buffer is available.
22
+ const computeAmbientOcclusionPrefixPB = `
23
+ vec2 tc = windowCoordsToTexCoords(gl_FragCoord.xy);
24
+ vec2 depthAndOrder = readDepthAndOrder(tc);
25
+ float db = depthAndOrder.y;
26
+ `;
27
+ const computeAmbientOcclusionPrefixDB = `
28
+ vec2 tc = windowCoordsToTexCoords(gl_FragCoord.xy);
29
+ vec2 depthAndOrder = readDepthAndOrder(tc);
30
+ float db = readDepth(tc);
31
+ `;
19
32
  // This outputs 1 for unlit surfaces, and for polylines and point strings.
20
33
  // Otherwise it computes ambient occlusion based on normal reconstructed from pick depth.
34
+ // NB: This shader code actually begins with a `computeAmbientOcclusionPrefix` variation as shown above.
21
35
  const computeAmbientOcclusion = `
22
- vec2 tc = windowCoordsToTexCoords(gl_FragCoord.xy);
23
- vec2 depthAndOrder = readDepthAndOrder(tc);
36
+ depthAndOrder.y = unfinalizeLinearDepth(db);
24
37
  float order = depthAndOrder.x;
25
38
  if (order >= kRenderOrder_PlanarBit)
26
39
  order = order - kRenderOrder_PlanarBit;
@@ -28,8 +41,10 @@ const computeAmbientOcclusion = `
28
41
  if (order < kRenderOrder_LitSurface || order == kRenderOrder_Linear)
29
42
  return vec4(1.0);
30
43
 
44
+ // NB: linearDepth: 1 == near, 0 == far
45
+
31
46
  float linearDepth = depthAndOrder.y;
32
- float nonLinearDepth = computeNonLinearDepth(linearDepth);
47
+ float nonLinearDepth = computeNonLinearDepth(db);
33
48
  if (nonLinearDepth > u_maxDistance)
34
49
  return vec4(1.0);
35
50
 
@@ -74,8 +89,9 @@ const computeAmbientOcclusion = `
74
89
  break;
75
90
  }
76
91
 
77
- float curLinearDepth = readDepthAndOrder(newCoords).y;
78
- float curNonLinearDepth = computeNonLinearDepth(curLinearDepth);
92
+ db = readDepth(newCoords);
93
+ float curLinearDepth = unfinalizeLinearDepth(db);
94
+ float curNonLinearDepth = computeNonLinearDepth(db);
79
95
  vec3 curViewPos = computePositionFromDepth(newCoords, curNonLinearDepth).xyz;
80
96
  vec3 diffVec = curViewPos.xyz - viewPos.xyz;
81
97
  float zLength = abs(curLinearDepth - linearDepth);
@@ -99,11 +115,6 @@ const computeAmbientOcclusion = `
99
115
 
100
116
  return vec4(tOcclusion, tOcclusion, tOcclusion, 1.0);
101
117
  `;
102
- const computeNonLinearDepth = `
103
- float computeNonLinearDepth(float linearDepth) {
104
- return mix(u_frustum.y, u_frustum.x, linearDepth);
105
- }
106
- `;
107
118
  const computePositionFromDepth = `
108
119
  vec4 computePositionFromDepth(vec2 tc, float nonLinearDepth) {
109
120
  if (kFrustumType_Perspective == u_frustum.z) {
@@ -122,10 +133,10 @@ vec4 computePositionFromDepth(vec2 tc, float nonLinearDepth) {
122
133
  `;
123
134
  const computeNormalFromDepth = `
124
135
  vec3 computeNormalFromDepth(vec3 viewPos, vec2 tc, vec2 pixelSize) {
125
- float nonLinearDepthU = computeNonLinearDepth(readDepthAndOrder(tc - vec2(0.0, pixelSize.y)).y);
126
- float nonLinearDepthD = computeNonLinearDepth(readDepthAndOrder(tc + vec2(0.0, pixelSize.y)).y);
127
- float nonLinearDepthL = computeNonLinearDepth(readDepthAndOrder(tc - vec2(pixelSize.x, 0.0)).y);
128
- float nonLinearDepthR = computeNonLinearDepth(readDepthAndOrder(tc + vec2(pixelSize.x, 0.0)).y);
136
+ float nonLinearDepthU = computeNonLinearDepth(readDepth(tc - vec2(0.0, pixelSize.y)));
137
+ float nonLinearDepthD = computeNonLinearDepth(readDepth(tc + vec2(0.0, pixelSize.y)));
138
+ float nonLinearDepthL = computeNonLinearDepth(readDepth(tc - vec2(pixelSize.x, 0.0)));
139
+ float nonLinearDepthR = computeNonLinearDepth(readDepth(tc + vec2(pixelSize.x, 0.0)));
129
140
 
130
141
  vec3 viewPosUp = computePositionFromDepth(tc - vec2(0.0, pixelSize.y), nonLinearDepthU).xyz;
131
142
  vec3 viewPosDown = computePositionFromDepth(tc + vec2(0.0, pixelSize.y), nonLinearDepthD).xyz;
@@ -143,19 +154,66 @@ vec3 computeNormalFromDepth(vec3 viewPos, vec2 tc, vec2 pixelSize) {
143
154
  return normalize(cross(dy, dx));
144
155
  }
145
156
  `;
157
+ const computeNonLinearDepthPB = `
158
+ float computeNonLinearDepth(float linearDepth) {
159
+ return mix(u_frustum.y, u_frustum.x, linearDepth);
160
+ }
161
+ `;
162
+ const computeNonLinearDepthDB = `
163
+ float computeNonLinearDepth(float depth) {
164
+ return 0.0 == u_logZ.x ? depth * u_logZ.y : exp(depth * u_logZ.y) / u_logZ.x;
165
+ }
166
+ `;
167
+ const readDepthPB = `
168
+ float readDepth(vec2 tc) {
169
+ return readDepthAndOrder(tc).y;
170
+ }
171
+ `;
172
+ const readDepthDB = `
173
+ float readDepth(vec2 tc) {
174
+ return TEXTURE(u_depthBuffer, tc).r;
175
+ }
176
+ `;
177
+ const unfinalizeLinearDepthDB = `
178
+ float unfinalizeLinearDepth(float depth) {
179
+ float eyeZ = 0.0 == u_logZ.x ? depth * u_logZ.y : exp(depth * u_logZ.y) / u_logZ.x;
180
+ float near = u_frustum.x, far = u_frustum.y;
181
+ float depthRange = far - near;
182
+ float linearDepth = (eyeZ - near) / depthRange;
183
+ return 1.0 - linearDepth;
184
+ }
185
+ `;
186
+ function _shouldUseDB() { return System_1.System.instance.supportsLogZBuffer && System_1.System.instance.capabilities.supportsTextureFloat; }
146
187
  /** @internal */
147
188
  function createAmbientOcclusionProgram(context) {
148
189
  const builder = (0, ViewportQuad_1.createViewportQuadBuilder)(true);
149
190
  const frag = builder.frag;
191
+ const shouldUseDB = _shouldUseDB();
150
192
  (0, Fragment_1.addWindowToTexCoords)(frag);
151
193
  frag.addFunction(Decode_1.decodeDepthRgb);
152
194
  frag.addFunction(FeatureSymbology_1.readDepthAndOrder);
153
- frag.addFunction(computeNonLinearDepth);
195
+ if (shouldUseDB) {
196
+ frag.addFunction(unfinalizeLinearDepthDB);
197
+ frag.addFunction(computeNonLinearDepthDB);
198
+ frag.addFunction(readDepthDB);
199
+ }
200
+ else {
201
+ frag.addDefine("unfinalizeLinearDepth", "");
202
+ frag.addFunction(computeNonLinearDepthPB);
203
+ frag.addFunction(readDepthPB);
204
+ }
154
205
  frag.addFunction(computePositionFromDepth);
155
206
  frag.addFunction(computeNormalFromDepth);
156
- frag.addFunction(Fragment_1.computeLinearDepth);
157
207
  (0, FeatureSymbology_1.addRenderOrderConstants)(frag);
158
- frag.set(1 /* ComputeBaseColor */, computeAmbientOcclusion);
208
+ if (shouldUseDB)
209
+ frag.addUniform("u_logZ", 3 /* Vec2 */, (prog) => {
210
+ prog.addProgramUniform("u_logZ", (uniform, params) => {
211
+ uniform.setUniform2fv(params.target.uniforms.frustum.logZ);
212
+ });
213
+ });
214
+ frag.set(1 /* ComputeBaseColor */, shouldUseDB ?
215
+ computeAmbientOcclusionPrefixDB + computeAmbientOcclusion :
216
+ computeAmbientOcclusionPrefixPB + computeAmbientOcclusion);
159
217
  frag.set(16 /* AssignFragData */, Fragment_1.assignFragColor);
160
218
  frag.addUniform("u_pickDepthAndOrder", 8 /* Sampler2D */, (prog) => {
161
219
  prog.addGraphicUniform("u_pickDepthAndOrder", (uniform, params) => {
@@ -163,6 +221,13 @@ function createAmbientOcclusionProgram(context) {
163
221
  Texture_1.Texture2DHandle.bindSampler(uniform, geom.depthAndOrder, RenderFlags_1.TextureUnit.Zero);
164
222
  });
165
223
  });
224
+ if (shouldUseDB)
225
+ frag.addUniform("u_depthBuffer", 8 /* Sampler2D */, (prog) => {
226
+ prog.addGraphicUniform("u_depthBuffer", (uniform, params) => {
227
+ const geom = params.geometry;
228
+ Texture_1.Texture2DHandle.bindSampler(uniform, geom.depth, RenderFlags_1.TextureUnit.Two);
229
+ });
230
+ });
166
231
  frag.addUniform("u_noise", 8 /* Sampler2D */, (prog) => {
167
232
  prog.addGraphicUniform("u_noise", (uniform, params) => {
168
233
  const geom = params.geometry;