@itwin/core-frontend 4.8.0-dev.3 → 4.8.0-dev.32

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 (296) hide show
  1. package/CHANGELOG.md +57 -1
  2. package/ThirdPartyNotices.md +3 -3
  3. package/lib/cjs/AccuSnap.d.ts.map +1 -1
  4. package/lib/cjs/AccuSnap.js +4 -1
  5. package/lib/cjs/AccuSnap.js.map +1 -1
  6. package/lib/cjs/IModelApp.d.ts +2 -3
  7. package/lib/cjs/IModelApp.d.ts.map +1 -1
  8. package/lib/cjs/IModelApp.js +2 -2
  9. package/lib/cjs/IModelApp.js.map +1 -1
  10. package/lib/cjs/IModelConnection.d.ts +16 -6
  11. package/lib/cjs/IModelConnection.d.ts.map +1 -1
  12. package/lib/cjs/IModelConnection.js +21 -7
  13. package/lib/cjs/IModelConnection.js.map +1 -1
  14. package/lib/cjs/IpcApp.d.ts +5 -1
  15. package/lib/cjs/IpcApp.d.ts.map +1 -1
  16. package/lib/cjs/IpcApp.js +11 -5
  17. package/lib/cjs/IpcApp.js.map +1 -1
  18. package/lib/cjs/LocalhostIpcApp.d.ts.map +1 -1
  19. package/lib/cjs/LocalhostIpcApp.js +2 -1
  20. package/lib/cjs/LocalhostIpcApp.js.map +1 -1
  21. package/lib/cjs/NativeApp.d.ts.map +1 -1
  22. package/lib/cjs/NativeApp.js +2 -1
  23. package/lib/cjs/NativeApp.js.map +1 -1
  24. package/lib/cjs/PlanarClipMaskState.d.ts +8 -3
  25. package/lib/cjs/PlanarClipMaskState.d.ts.map +1 -1
  26. package/lib/cjs/PlanarClipMaskState.js +47 -17
  27. package/lib/cjs/PlanarClipMaskState.js.map +1 -1
  28. package/lib/cjs/RealityDataSourceTilesetUrlImpl.d.ts +3 -0
  29. package/lib/cjs/RealityDataSourceTilesetUrlImpl.d.ts.map +1 -1
  30. package/lib/cjs/RealityDataSourceTilesetUrlImpl.js +15 -4
  31. package/lib/cjs/RealityDataSourceTilesetUrlImpl.js.map +1 -1
  32. package/lib/cjs/SpatialViewState.d.ts +14 -1
  33. package/lib/cjs/SpatialViewState.d.ts.map +1 -1
  34. package/lib/cjs/SpatialViewState.js +17 -0
  35. package/lib/cjs/SpatialViewState.js.map +1 -1
  36. package/lib/cjs/SubCategoriesCache.d.ts +3 -1
  37. package/lib/cjs/SubCategoriesCache.d.ts.map +1 -1
  38. package/lib/cjs/SubCategoriesCache.js +19 -5
  39. package/lib/cjs/SubCategoriesCache.js.map +1 -1
  40. package/lib/cjs/ViewCreator3d.d.ts.map +1 -1
  41. package/lib/cjs/ViewCreator3d.js +1 -0
  42. package/lib/cjs/ViewCreator3d.js.map +1 -1
  43. package/lib/cjs/ViewManager.d.ts +4 -7
  44. package/lib/cjs/ViewManager.d.ts.map +1 -1
  45. package/lib/cjs/ViewManager.js +4 -7
  46. package/lib/cjs/ViewManager.js.map +1 -1
  47. package/lib/cjs/ViewingSpace.d.ts +3 -1
  48. package/lib/cjs/ViewingSpace.d.ts.map +1 -1
  49. package/lib/cjs/ViewingSpace.js +11 -2
  50. package/lib/cjs/ViewingSpace.js.map +1 -1
  51. package/lib/cjs/common/gltf/GltfSchema.d.ts +15 -1
  52. package/lib/cjs/common/gltf/GltfSchema.d.ts.map +1 -1
  53. package/lib/cjs/common/gltf/GltfSchema.js.map +1 -1
  54. package/lib/cjs/core-frontend.d.ts +1 -0
  55. package/lib/cjs/core-frontend.d.ts.map +1 -1
  56. package/lib/cjs/core-frontend.js +1 -0
  57. package/lib/cjs/core-frontend.js.map +1 -1
  58. package/lib/cjs/internal/Symbols.d.ts +7 -0
  59. package/lib/cjs/internal/Symbols.d.ts.map +1 -0
  60. package/lib/cjs/internal/Symbols.js +17 -0
  61. package/lib/cjs/internal/Symbols.js.map +1 -0
  62. package/lib/cjs/internal/cross-package.d.ts +5 -0
  63. package/lib/cjs/internal/cross-package.d.ts.map +1 -0
  64. package/lib/cjs/internal/cross-package.js +13 -0
  65. package/lib/cjs/internal/cross-package.js.map +1 -0
  66. package/lib/cjs/render/FeatureSymbology.js +3 -3
  67. package/lib/cjs/render/FeatureSymbology.js.map +1 -1
  68. package/lib/cjs/render/GraphicBuilder.d.ts +4 -0
  69. package/lib/cjs/render/GraphicBuilder.d.ts.map +1 -1
  70. package/lib/cjs/render/GraphicBuilder.js +49 -0
  71. package/lib/cjs/render/GraphicBuilder.js.map +1 -1
  72. package/lib/cjs/render/RenderTarget.d.ts +1 -0
  73. package/lib/cjs/render/RenderTarget.d.ts.map +1 -1
  74. package/lib/cjs/render/RenderTarget.js.map +1 -1
  75. package/lib/cjs/render/webgl/BackgroundMapDrape.js +1 -1
  76. package/lib/cjs/render/webgl/BackgroundMapDrape.js.map +1 -1
  77. package/lib/cjs/render/webgl/PlanarClassifier.d.ts +2 -0
  78. package/lib/cjs/render/webgl/PlanarClassifier.d.ts.map +1 -1
  79. package/lib/cjs/render/webgl/PlanarClassifier.js +38 -11
  80. package/lib/cjs/render/webgl/PlanarClassifier.js.map +1 -1
  81. package/lib/cjs/render/webgl/PlanarTextureProjection.d.ts +3 -3
  82. package/lib/cjs/render/webgl/PlanarTextureProjection.d.ts.map +1 -1
  83. package/lib/cjs/render/webgl/PlanarTextureProjection.js +53 -19
  84. package/lib/cjs/render/webgl/PlanarTextureProjection.js.map +1 -1
  85. package/lib/cjs/render/webgl/SolarShadowMap.js +2 -2
  86. package/lib/cjs/render/webgl/SolarShadowMap.js.map +1 -1
  87. package/lib/cjs/render/webgl/Target.d.ts +1 -0
  88. package/lib/cjs/render/webgl/Target.d.ts.map +1 -1
  89. package/lib/cjs/render/webgl/Target.js +1 -0
  90. package/lib/cjs/render/webgl/Target.js.map +1 -1
  91. package/lib/cjs/render/webgl/glsl/AmbientOcclusion.js.map +1 -1
  92. package/lib/cjs/tile/B3dmReader.d.ts +0 -1
  93. package/lib/cjs/tile/B3dmReader.d.ts.map +1 -1
  94. package/lib/cjs/tile/B3dmReader.js +1 -2
  95. package/lib/cjs/tile/B3dmReader.js.map +1 -1
  96. package/lib/cjs/tile/GltfReader.d.ts +25 -1
  97. package/lib/cjs/tile/GltfReader.d.ts.map +1 -1
  98. package/lib/cjs/tile/GltfReader.js +239 -3
  99. package/lib/cjs/tile/GltfReader.js.map +1 -1
  100. package/lib/cjs/tile/GraphicsCollector.d.ts.map +1 -1
  101. package/lib/cjs/tile/GraphicsCollector.js +5 -2
  102. package/lib/cjs/tile/GraphicsCollector.js.map +1 -1
  103. package/lib/cjs/tile/I3dmReader.d.ts +0 -1
  104. package/lib/cjs/tile/I3dmReader.d.ts.map +1 -1
  105. package/lib/cjs/tile/I3dmReader.js +1 -2
  106. package/lib/cjs/tile/I3dmReader.js.map +1 -1
  107. package/lib/cjs/tile/PrimaryTileTree.d.ts +6 -2
  108. package/lib/cjs/tile/PrimaryTileTree.d.ts.map +1 -1
  109. package/lib/cjs/tile/PrimaryTileTree.js +25 -0
  110. package/lib/cjs/tile/PrimaryTileTree.js.map +1 -1
  111. package/lib/cjs/tile/RealityModelTileTree.js +1 -1
  112. package/lib/cjs/tile/RealityModelTileTree.js.map +1 -1
  113. package/lib/cjs/tile/RealityTile.d.ts +2 -3
  114. package/lib/cjs/tile/RealityTile.d.ts.map +1 -1
  115. package/lib/cjs/tile/RealityTile.js +0 -1
  116. package/lib/cjs/tile/RealityTile.js.map +1 -1
  117. package/lib/cjs/tile/RealityTileLoader.d.ts.map +1 -1
  118. package/lib/cjs/tile/RealityTileLoader.js +1 -0
  119. package/lib/cjs/tile/RealityTileLoader.js.map +1 -1
  120. package/lib/cjs/tile/TileGeometryCollector.d.ts +4 -4
  121. package/lib/cjs/tile/TileGeometryCollector.js +1 -1
  122. package/lib/cjs/tile/TileGeometryCollector.js.map +1 -1
  123. package/lib/cjs/tile/TileTreeReference.d.ts +0 -4
  124. package/lib/cjs/tile/TileTreeReference.d.ts.map +1 -1
  125. package/lib/cjs/tile/TileTreeReference.js +0 -3
  126. package/lib/cjs/tile/TileTreeReference.js.map +1 -1
  127. package/lib/cjs/tile/map/ArcGisUtilities.d.ts +1 -0
  128. package/lib/cjs/tile/map/ArcGisUtilities.d.ts.map +1 -1
  129. package/lib/cjs/tile/map/ArcGisUtilities.js +5 -3
  130. package/lib/cjs/tile/map/ArcGisUtilities.js.map +1 -1
  131. package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -1
  132. package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.js +7 -2
  133. package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
  134. package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
  135. package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +3 -1
  136. package/lib/cjs/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  137. package/lib/cjs/tile/map/MapTileTree.d.ts.map +1 -1
  138. package/lib/cjs/tile/map/MapTileTree.js +5 -5
  139. package/lib/cjs/tile/map/MapTileTree.js.map +1 -1
  140. package/lib/cjs/tools/ElementSetTool.d.ts +8 -4
  141. package/lib/cjs/tools/ElementSetTool.d.ts.map +1 -1
  142. package/lib/cjs/tools/ElementSetTool.js +5 -3
  143. package/lib/cjs/tools/ElementSetTool.js.map +1 -1
  144. package/lib/cjs/tools/ToolAdmin.d.ts +2 -0
  145. package/lib/cjs/tools/ToolAdmin.d.ts.map +1 -1
  146. package/lib/cjs/tools/ToolAdmin.js +5 -1
  147. package/lib/cjs/tools/ToolAdmin.js.map +1 -1
  148. package/lib/esm/AccuSnap.d.ts.map +1 -1
  149. package/lib/esm/AccuSnap.js +4 -1
  150. package/lib/esm/AccuSnap.js.map +1 -1
  151. package/lib/esm/IModelApp.d.ts +2 -3
  152. package/lib/esm/IModelApp.d.ts.map +1 -1
  153. package/lib/esm/IModelApp.js +2 -2
  154. package/lib/esm/IModelApp.js.map +1 -1
  155. package/lib/esm/IModelConnection.d.ts +16 -6
  156. package/lib/esm/IModelConnection.d.ts.map +1 -1
  157. package/lib/esm/IModelConnection.js +21 -7
  158. package/lib/esm/IModelConnection.js.map +1 -1
  159. package/lib/esm/IpcApp.d.ts +5 -1
  160. package/lib/esm/IpcApp.d.ts.map +1 -1
  161. package/lib/esm/IpcApp.js +11 -5
  162. package/lib/esm/IpcApp.js.map +1 -1
  163. package/lib/esm/LocalhostIpcApp.d.ts.map +1 -1
  164. package/lib/esm/LocalhostIpcApp.js +2 -1
  165. package/lib/esm/LocalhostIpcApp.js.map +1 -1
  166. package/lib/esm/NativeApp.d.ts.map +1 -1
  167. package/lib/esm/NativeApp.js +2 -1
  168. package/lib/esm/NativeApp.js.map +1 -1
  169. package/lib/esm/PlanarClipMaskState.d.ts +8 -3
  170. package/lib/esm/PlanarClipMaskState.d.ts.map +1 -1
  171. package/lib/esm/PlanarClipMaskState.js +48 -18
  172. package/lib/esm/PlanarClipMaskState.js.map +1 -1
  173. package/lib/esm/RealityDataSourceTilesetUrlImpl.d.ts +3 -0
  174. package/lib/esm/RealityDataSourceTilesetUrlImpl.d.ts.map +1 -1
  175. package/lib/esm/RealityDataSourceTilesetUrlImpl.js +15 -4
  176. package/lib/esm/RealityDataSourceTilesetUrlImpl.js.map +1 -1
  177. package/lib/esm/SpatialViewState.d.ts +14 -1
  178. package/lib/esm/SpatialViewState.d.ts.map +1 -1
  179. package/lib/esm/SpatialViewState.js +17 -0
  180. package/lib/esm/SpatialViewState.js.map +1 -1
  181. package/lib/esm/SubCategoriesCache.d.ts +3 -1
  182. package/lib/esm/SubCategoriesCache.d.ts.map +1 -1
  183. package/lib/esm/SubCategoriesCache.js +19 -5
  184. package/lib/esm/SubCategoriesCache.js.map +1 -1
  185. package/lib/esm/ViewCreator3d.d.ts.map +1 -1
  186. package/lib/esm/ViewCreator3d.js +1 -0
  187. package/lib/esm/ViewCreator3d.js.map +1 -1
  188. package/lib/esm/ViewManager.d.ts +4 -7
  189. package/lib/esm/ViewManager.d.ts.map +1 -1
  190. package/lib/esm/ViewManager.js +4 -7
  191. package/lib/esm/ViewManager.js.map +1 -1
  192. package/lib/esm/ViewingSpace.d.ts +3 -1
  193. package/lib/esm/ViewingSpace.d.ts.map +1 -1
  194. package/lib/esm/ViewingSpace.js +11 -2
  195. package/lib/esm/ViewingSpace.js.map +1 -1
  196. package/lib/esm/common/gltf/GltfSchema.d.ts +15 -1
  197. package/lib/esm/common/gltf/GltfSchema.d.ts.map +1 -1
  198. package/lib/esm/common/gltf/GltfSchema.js.map +1 -1
  199. package/lib/esm/core-frontend.d.ts +1 -0
  200. package/lib/esm/core-frontend.d.ts.map +1 -1
  201. package/lib/esm/core-frontend.js +1 -0
  202. package/lib/esm/core-frontend.js.map +1 -1
  203. package/lib/esm/internal/Symbols.d.ts +7 -0
  204. package/lib/esm/internal/Symbols.d.ts.map +1 -0
  205. package/lib/esm/internal/Symbols.js +14 -0
  206. package/lib/esm/internal/Symbols.js.map +1 -0
  207. package/lib/esm/internal/cross-package.d.ts +5 -0
  208. package/lib/esm/internal/cross-package.d.ts.map +1 -0
  209. package/lib/esm/internal/cross-package.js +9 -0
  210. package/lib/esm/internal/cross-package.js.map +1 -0
  211. package/lib/esm/render/FeatureSymbology.js +3 -3
  212. package/lib/esm/render/FeatureSymbology.js.map +1 -1
  213. package/lib/esm/render/GraphicBuilder.d.ts +4 -0
  214. package/lib/esm/render/GraphicBuilder.d.ts.map +1 -1
  215. package/lib/esm/render/GraphicBuilder.js +49 -0
  216. package/lib/esm/render/GraphicBuilder.js.map +1 -1
  217. package/lib/esm/render/RenderTarget.d.ts +1 -0
  218. package/lib/esm/render/RenderTarget.d.ts.map +1 -1
  219. package/lib/esm/render/RenderTarget.js.map +1 -1
  220. package/lib/esm/render/webgl/BackgroundMapDrape.js +2 -2
  221. package/lib/esm/render/webgl/BackgroundMapDrape.js.map +1 -1
  222. package/lib/esm/render/webgl/PlanarClassifier.d.ts +2 -0
  223. package/lib/esm/render/webgl/PlanarClassifier.d.ts.map +1 -1
  224. package/lib/esm/render/webgl/PlanarClassifier.js +40 -13
  225. package/lib/esm/render/webgl/PlanarClassifier.js.map +1 -1
  226. package/lib/esm/render/webgl/PlanarTextureProjection.d.ts +3 -3
  227. package/lib/esm/render/webgl/PlanarTextureProjection.d.ts.map +1 -1
  228. package/lib/esm/render/webgl/PlanarTextureProjection.js +54 -20
  229. package/lib/esm/render/webgl/PlanarTextureProjection.js.map +1 -1
  230. package/lib/esm/render/webgl/SolarShadowMap.js +2 -2
  231. package/lib/esm/render/webgl/SolarShadowMap.js.map +1 -1
  232. package/lib/esm/render/webgl/Target.d.ts +1 -0
  233. package/lib/esm/render/webgl/Target.d.ts.map +1 -1
  234. package/lib/esm/render/webgl/Target.js +1 -0
  235. package/lib/esm/render/webgl/Target.js.map +1 -1
  236. package/lib/esm/render/webgl/glsl/AmbientOcclusion.js.map +1 -1
  237. package/lib/esm/tile/B3dmReader.d.ts +0 -1
  238. package/lib/esm/tile/B3dmReader.d.ts.map +1 -1
  239. package/lib/esm/tile/B3dmReader.js +1 -2
  240. package/lib/esm/tile/B3dmReader.js.map +1 -1
  241. package/lib/esm/tile/GltfReader.d.ts +25 -1
  242. package/lib/esm/tile/GltfReader.d.ts.map +1 -1
  243. package/lib/esm/tile/GltfReader.js +239 -3
  244. package/lib/esm/tile/GltfReader.js.map +1 -1
  245. package/lib/esm/tile/GraphicsCollector.d.ts.map +1 -1
  246. package/lib/esm/tile/GraphicsCollector.js +5 -2
  247. package/lib/esm/tile/GraphicsCollector.js.map +1 -1
  248. package/lib/esm/tile/I3dmReader.d.ts +0 -1
  249. package/lib/esm/tile/I3dmReader.d.ts.map +1 -1
  250. package/lib/esm/tile/I3dmReader.js +1 -2
  251. package/lib/esm/tile/I3dmReader.js.map +1 -1
  252. package/lib/esm/tile/PrimaryTileTree.d.ts +6 -2
  253. package/lib/esm/tile/PrimaryTileTree.d.ts.map +1 -1
  254. package/lib/esm/tile/PrimaryTileTree.js +25 -0
  255. package/lib/esm/tile/PrimaryTileTree.js.map +1 -1
  256. package/lib/esm/tile/RealityModelTileTree.js +1 -1
  257. package/lib/esm/tile/RealityModelTileTree.js.map +1 -1
  258. package/lib/esm/tile/RealityTile.d.ts +2 -3
  259. package/lib/esm/tile/RealityTile.d.ts.map +1 -1
  260. package/lib/esm/tile/RealityTile.js +0 -1
  261. package/lib/esm/tile/RealityTile.js.map +1 -1
  262. package/lib/esm/tile/RealityTileLoader.d.ts.map +1 -1
  263. package/lib/esm/tile/RealityTileLoader.js +1 -0
  264. package/lib/esm/tile/RealityTileLoader.js.map +1 -1
  265. package/lib/esm/tile/TileGeometryCollector.d.ts +4 -4
  266. package/lib/esm/tile/TileGeometryCollector.js +1 -1
  267. package/lib/esm/tile/TileGeometryCollector.js.map +1 -1
  268. package/lib/esm/tile/TileTreeReference.d.ts +0 -4
  269. package/lib/esm/tile/TileTreeReference.d.ts.map +1 -1
  270. package/lib/esm/tile/TileTreeReference.js +0 -3
  271. package/lib/esm/tile/TileTreeReference.js.map +1 -1
  272. package/lib/esm/tile/map/ArcGisUtilities.d.ts +1 -0
  273. package/lib/esm/tile/map/ArcGisUtilities.d.ts.map +1 -1
  274. package/lib/esm/tile/map/ArcGisUtilities.js +5 -3
  275. package/lib/esm/tile/map/ArcGisUtilities.js.map +1 -1
  276. package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -1
  277. package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.js +7 -2
  278. package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
  279. package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
  280. package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +3 -1
  281. package/lib/esm/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  282. package/lib/esm/tile/map/MapTileTree.d.ts.map +1 -1
  283. package/lib/esm/tile/map/MapTileTree.js +5 -5
  284. package/lib/esm/tile/map/MapTileTree.js.map +1 -1
  285. package/lib/esm/tools/ElementSetTool.d.ts +8 -4
  286. package/lib/esm/tools/ElementSetTool.d.ts.map +1 -1
  287. package/lib/esm/tools/ElementSetTool.js +5 -3
  288. package/lib/esm/tools/ElementSetTool.js.map +1 -1
  289. package/lib/esm/tools/ToolAdmin.d.ts +2 -0
  290. package/lib/esm/tools/ToolAdmin.d.ts.map +1 -1
  291. package/lib/esm/tools/ToolAdmin.js +5 -1
  292. package/lib/esm/tools/ToolAdmin.js.map +1 -1
  293. package/lib/public/locales/en/iModelJs.json +5 -0
  294. package/lib/public/scripts/parse-imdl-worker.js +1 -1
  295. package/lib/workers/webpack/parse-imdl-worker.js +1 -1
  296. package/package.json +18 -18
@@ -1 +1 @@
1
- {"version":3,"file":"PlanarClassifier.js","sourceRoot":"","sources":["../../../../src/render/webgl/PlanarClassifier.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\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { dispose } from \"@itwin/core-bentley\";\r\nimport {\r\n ColorDef, Frustum, FrustumPlanes, RenderMode, RenderTexture, SpatialClassifierInsideDisplay, SpatialClassifierOutsideDisplay, TextureTransparency,\r\n} from \"@itwin/core-common\";\r\nimport { Matrix4d, Plane3dByOriginAndUnitNormal, Point3d, Vector3d } from \"@itwin/core-geometry\";\r\nimport { PlanarClipMaskState } from \"../../PlanarClipMaskState\";\r\nimport { GraphicsCollectorDrawArgs, SpatialClassifierTileTreeReference, TileTreeReference } from \"../../tile/internal\";\r\nimport { SceneContext } from \"../../ViewContext\";\r\nimport { ViewState3d } from \"../../ViewState\";\r\nimport { FeatureSymbology } from \"../FeatureSymbology\";\r\nimport { RenderGraphic } from \"../RenderGraphic\";\r\nimport { RenderMemory } from \"../RenderMemory\";\r\nimport { PlanarClassifierTarget, RenderPlanarClassifier } from \"../RenderPlanarClassifier\";\r\nimport { BatchState } from \"./BatchState\";\r\nimport { BranchStack } from \"./BranchStack\";\r\nimport { CachedGeometry, Combine3TexturesGeometry, CombineTexturesGeometry, ViewportQuadGeometry } from \"./CachedGeometry\";\r\nimport { WebGLDisposable } from \"./Disposable\";\r\nimport { DrawCommands } from \"./DrawCommand\";\r\nimport { FrameBuffer } from \"./FrameBuffer\";\r\nimport { GL } from \"./GL\";\r\nimport { Batch, Branch } from \"./Graphic\";\r\nimport { PlanarTextureProjection } from \"./PlanarTextureProjection\";\r\nimport { RenderCommands } from \"./RenderCommands\";\r\nimport { RenderPass } from \"./RenderFlags\";\r\nimport { RenderState } from \"./RenderState\";\r\nimport { getDrawParams } from \"./ScratchDrawParams\";\r\nimport { System } from \"./System\";\r\nimport { Target } from \"./Target\";\r\nimport { TechniqueId } from \"./TechniqueId\";\r\nimport { Texture, TextureHandle } from \"./Texture\";\r\nimport { ActiveSpatialClassifier } from \"../../SpatialClassifiersState\";\r\n\r\nexport enum PlanarClassifierContent { None = 0, MaskOnly = 1, ClassifierOnly = 2, ClassifierAndMask = 3 }\r\n\r\nfunction createTexture(handle: TextureHandle): Texture {\r\n return new Texture({\r\n handle,\r\n ownership: \"external\",\r\n type: RenderTexture.Type.TileSection,\r\n transparency: TextureTransparency.Opaque,\r\n });\r\n}\r\n\r\nfunction createTextureHandle(width: number, height: number, heightMult = 1.0) {\r\n return TextureHandle.createForAttachment(width, height * heightMult, GL.Texture.Format.Rgba, GL.Texture.DataType.UnsignedByte);\r\n}\r\n\r\nclass ClassifierTextures implements WebGLDisposable {\r\n private constructor(public readonly color: Texture,\r\n public readonly feature: Texture,\r\n public readonly hilite: Texture) { }\r\n\r\n public get isDisposed(): boolean {\r\n return this.color.isDisposed\r\n && this.feature.isDisposed\r\n && this.hilite.isDisposed;\r\n }\r\n\r\n public dispose(): void {\r\n dispose(this.color);\r\n dispose(this.feature);\r\n dispose(this.hilite);\r\n }\r\n\r\n public collectStatistics(stats: RenderMemory.Statistics): void {\r\n stats.addPlanarClassifier(this.color.bytesUsed);\r\n stats.addPlanarClassifier(this.feature.bytesUsed);\r\n stats.addPlanarClassifier(this.hilite.bytesUsed);\r\n }\r\n\r\n public static create(width: number, height: number): ClassifierTextures | undefined {\r\n const hColor = createTextureHandle(width, height);\r\n const hFeature = createTextureHandle(width, height);\r\n const hHilite = createTextureHandle(width, height);\r\n if (!hColor || !hFeature || !hHilite)\r\n return undefined;\r\n\r\n const color = createTexture(hColor);\r\n const feature = createTexture(hFeature);\r\n const hilite = createTexture(hHilite);\r\n if (!color || !feature || !hilite)\r\n return undefined;\r\n\r\n return new ClassifierTextures(color, feature, hilite);\r\n }\r\n}\r\n\r\nclass ClassifierFrameBuffers implements WebGLDisposable {\r\n private constructor(\r\n public readonly textures: ClassifierTextures,\r\n private readonly _hilite: FrameBuffer,\r\n private readonly _fbo: FrameBuffer,\r\n private readonly _clearGeom: ViewportQuadGeometry) {\r\n }\r\n\r\n public get isDisposed(): boolean {\r\n return this.textures.isDisposed && this._hilite.isDisposed && this._fbo.isDisposed && this._clearGeom.isDisposed;\r\n }\r\n\r\n public dispose(): void {\r\n dispose(this._fbo);\r\n dispose(this._clearGeom);\r\n dispose(this.textures);\r\n dispose(this._hilite);\r\n }\r\n\r\n public draw(cmds: DrawCommands, target: Target): void {\r\n System.instance.frameBufferStack.execute(this._fbo, true, false, () => {\r\n target.techniques.draw(getDrawParams(target, this._clearGeom));\r\n target.techniques.execute(target, cmds, RenderPass.PlanarClassification);\r\n });\r\n }\r\n\r\n public drawHilite(cmds: DrawCommands, target: Target): void {\r\n const system = System.instance;\r\n const gl = system.context;\r\n system.frameBufferStack.execute(this._hilite, true, false, () => {\r\n gl.clearColor(0, 0, 0, 0);\r\n gl.clear(GL.BufferBit.Color);\r\n target.techniques.execute(target, cmds, RenderPass.Hilite);\r\n });\r\n }\r\n\r\n public static create(width: number, height: number): ClassifierFrameBuffers | undefined {\r\n const textures = ClassifierTextures.create(width, height);\r\n if (undefined === textures)\r\n return undefined;\r\n\r\n const hiliteFbo = FrameBuffer.create([textures.hilite.texture]);\r\n if (undefined === hiliteFbo)\r\n return undefined;\r\n\r\n const fbo = FrameBuffer.create([textures.color.texture, textures.feature.texture]);\r\n if (undefined === fbo)\r\n return undefined;\r\n\r\n const geom = ViewportQuadGeometry.create(TechniqueId.ClearPickAndColor);\r\n return undefined !== geom ? new this(textures, hiliteFbo, fbo, geom) : undefined;\r\n }\r\n}\r\n\r\ninterface TextureAndFbo {\r\n texture: Texture;\r\n fbo: FrameBuffer;\r\n}\r\n\r\nabstract class SingleTextureFrameBuffer implements WebGLDisposable {\r\n public texture: Texture;\r\n protected fbo: FrameBuffer;\r\n public get isDisposed(): boolean { return this.texture.isDisposed && this.fbo.isDisposed; }\r\n public collectStatistics(stats: RenderMemory.Statistics): void { stats.addPlanarClassifier(this.texture.bytesUsed); }\r\n protected constructor(textureAndFbo: TextureAndFbo) {\r\n this.texture = textureAndFbo.texture;\r\n this.fbo = textureAndFbo.fbo;\r\n }\r\n public dispose(): void {\r\n dispose(this.texture);\r\n dispose(this.fbo);\r\n }\r\n public static createTextureAndFrameBuffer(width: number, height: number): TextureAndFbo | undefined {\r\n const hTexture = TextureHandle.createForAttachment(width, height, GL.Texture.Format.Rgba, GL.Texture.DataType.UnsignedByte);\r\n if (!hTexture)\r\n return undefined;\r\n\r\n const texture = new Texture({ type: RenderTexture.Type.TileSection, ownership: \"external\", handle: hTexture, transparency: TextureTransparency.Opaque });\r\n if (!texture)\r\n return undefined;\r\n\r\n const fbo = FrameBuffer.create([texture.texture]);\r\n if (undefined === fbo)\r\n return undefined;\r\n\r\n return { texture, fbo };\r\n }\r\n}\r\nclass MaskFrameBuffer extends SingleTextureFrameBuffer {\r\n public static create(width: number, height: number): MaskFrameBuffer | undefined {\r\n const textureFbo = SingleTextureFrameBuffer.createTextureAndFrameBuffer(width, height);\r\n return undefined === textureFbo ? undefined : new MaskFrameBuffer(textureFbo);\r\n }\r\n public draw(cmds: DrawCommands, target: Target): void {\r\n const system = System.instance;\r\n const gl = system.context;\r\n\r\n system.frameBufferStack.execute(this.fbo, true, false, () => {\r\n gl.clearColor(0, 0, 0, 0);\r\n gl.clear(GL.BufferBit.Color);\r\n target.techniques.execute(target, cmds, RenderPass.PlanarClassification);\r\n });\r\n }\r\n}\r\nabstract class CombineTexturesFrameBuffer extends SingleTextureFrameBuffer {\r\n constructor(textureAndFbo: TextureAndFbo, private _combineGeom: CachedGeometry, private _width: number, private _height: number, private _heightMult: number) { super(textureAndFbo); }\r\n public compose(target: Target): void {\r\n const system = System.instance;\r\n const gl = system.context;\r\n system.context.viewport(0, 0, this._width, this._heightMult * this._height);\r\n system.frameBufferStack.execute(this.fbo, true, false, () => {\r\n gl.clearColor(0, 0, 0, 0);\r\n gl.clear(GL.BufferBit.Color);\r\n target.techniques.draw(getDrawParams(target, this._combineGeom));\r\n });\r\n }\r\n}\r\n\r\nclass ClassifierCombinationBuffer extends CombineTexturesFrameBuffer {\r\n public static create(width: number, height: number, classifierColor: Texture, classifierFeature: Texture): ClassifierAndMaskCombinationBuffer | undefined {\r\n const combineGeom = CombineTexturesGeometry.createGeometry(classifierColor.texture.getHandle()!, classifierFeature.texture.getHandle()!);\r\n if (undefined === combineGeom)\r\n return undefined;\r\n\r\n const textureFbo = SingleTextureFrameBuffer.createTextureAndFrameBuffer(width, 2 * height);\r\n return undefined === textureFbo ? undefined : new ClassifierCombinationBuffer(textureFbo, combineGeom, width, height, 2);\r\n }\r\n}\r\nclass ClassifierAndMaskCombinationBuffer extends CombineTexturesFrameBuffer {\r\n public static create(width: number, height: number, classifierColor: Texture, classifierFeature: Texture, mask: Texture): ClassifierAndMaskCombinationBuffer | undefined {\r\n const combineGeom = Combine3TexturesGeometry.createGeometry(classifierColor.texture.getHandle()!, classifierFeature.texture.getHandle()!, mask.texture.getHandle()!);\r\n if (undefined === combineGeom)\r\n return undefined;\r\n\r\n const textureFbo = SingleTextureFrameBuffer.createTextureAndFrameBuffer(width, 3 * height);\r\n return undefined === textureFbo ? undefined : new ClassifierAndMaskCombinationBuffer(textureFbo, combineGeom, width, height, 3);\r\n }\r\n}\r\n\r\nconst scratchPrevRenderState = new RenderState();\r\n\r\n/** @internal */\r\nexport class PlanarClassifier extends RenderPlanarClassifier implements RenderMemory.Consumer, WebGLDisposable {\r\n private _classifierBuffers?: ClassifierFrameBuffers;\r\n private _maskBuffer?: MaskFrameBuffer;\r\n private _classifierCombinedBuffer?: ClassifierCombinationBuffer;\r\n private _classifierAndMaskCombinedBuffer?: ClassifierAndMaskCombinationBuffer;\r\n private _projectionMatrix = Matrix4d.createIdentity();\r\n private _graphics?: RenderGraphic[];\r\n private readonly _classifierGraphics: RenderGraphic[] = [];\r\n private readonly _maskGraphics: RenderGraphic[] = [];\r\n private _frustum?: Frustum;\r\n private _width = 0;\r\n private _height = 0;\r\n private _baseBatchId = 0;\r\n private _anyHilited = false;\r\n private _anyOpaque = false;\r\n private _anyTranslucent = false;\r\n private _classifier?: ActiveSpatialClassifier;\r\n private readonly _plane = Plane3dByOriginAndUnitNormal.create(new Point3d(0, 0, 0), new Vector3d(0, 0, 1))!; // TBD -- Support other planes - default to X-Y for now.\r\n private readonly _renderState = new RenderState();\r\n private readonly _renderCommands: RenderCommands;\r\n private readonly _branchStack = new BranchStack();\r\n private readonly _batchState: BatchState;\r\n private _planarClipMask?: PlanarClipMaskState;\r\n private _classifierTreeRef?: SpatialClassifierTileTreeReference;\r\n private _planarClipMaskOverrides?: FeatureSymbology.Overrides;\r\n private _contentMode: PlanarClassifierContent = PlanarClassifierContent.None;\r\n\r\n private static _postProjectionMatrix = Matrix4d.createRowValues(\r\n 0, 1, 0, 0,\r\n 0, 0, -1, 0,\r\n 1, 0, 0, 0,\r\n 0, 0, 0, 1);\r\n private _debugFrustum?: Frustum;\r\n private _doDebugFrustum = false;\r\n private _debugFrustumGraphic?: RenderGraphic = undefined;\r\n private _isClassifyingPointCloud?: boolean; // we will detect this the first time we draw\r\n private readonly _bgColor = ColorDef.from(0, 0, 0, 255);\r\n\r\n private constructor(classifier: ActiveSpatialClassifier | undefined, target: Target) {\r\n super();\r\n this._classifier = classifier;\r\n\r\n const flags = this._renderState.flags;\r\n flags.depthMask = flags.blend = flags.depthTest = false;\r\n\r\n this._batchState = new BatchState(this._branchStack);\r\n this._renderCommands = new RenderCommands(target, this._branchStack, this._batchState);\r\n }\r\n public get textureImageCount(): number { return this._contentMode; }\r\n\r\n public getParams(params: Float32Array): void {\r\n params[0] = this.insideDisplay;\r\n params[1] = this.outsideDisplay;\r\n params[2] = this._contentMode;\r\n if (this._planarClipMask?.settings.invert) // If the mask sense is inverted, negate the contentMode to indicate this to the shader.\r\n params[2] = - params[2];\r\n\r\n params[3] = (this._planarClipMask?.settings.transparency === undefined) ? -1 : this._planarClipMask.settings.transparency;\r\n\r\n }\r\n\r\n public get hiliteTexture(): Texture | undefined { return undefined !== this._classifierBuffers ? this._classifierBuffers.textures.hilite : undefined; }\r\n public get projectionMatrix(): Matrix4d { return this._projectionMatrix; }\r\n // public get properties(): SpatialClassifier { return this._classifier; }\r\n public get baseBatchId(): number { return this._baseBatchId; }\r\n public get anyHilited(): boolean { return this._anyHilited; }\r\n public get anyOpaque(): boolean { return this._anyOpaque; }\r\n public get anyTranslucent(): boolean { return this._anyTranslucent; }\r\n public get insideDisplay(): SpatialClassifierInsideDisplay { return this._classifier ? this._classifier.flags.inside : SpatialClassifierInsideDisplay.Off; }\r\n public get outsideDisplay(): SpatialClassifierOutsideDisplay { return this._classifier ? this._classifier.flags.outside : SpatialClassifierOutsideDisplay.On; }\r\n public get isClassifyingPointCloud(): boolean { return true === this._isClassifyingPointCloud; }\r\n\r\n public addGraphic(graphic: RenderGraphic) {\r\n this._graphics!.push(graphic);\r\n }\r\n\r\n public static create(properties: ActiveSpatialClassifier | undefined, target: Target): PlanarClassifier {\r\n return new PlanarClassifier(properties, target);\r\n }\r\n\r\n public collectStatistics(stats: RenderMemory.Statistics): void {\r\n if (undefined !== this._classifierBuffers)\r\n this._classifierBuffers.textures.collectStatistics(stats);\r\n\r\n if (undefined !== this._maskBuffer)\r\n this._maskBuffer.collectStatistics(stats);\r\n\r\n if (undefined !== this._classifierCombinedBuffer)\r\n this._classifierCombinedBuffer.collectStatistics(stats);\r\n\r\n if (undefined !== this._classifierAndMaskCombinedBuffer)\r\n this._classifierAndMaskCombinedBuffer.collectStatistics(stats);\r\n }\r\n\r\n public get isDisposed(): boolean { return undefined === this._classifierBuffers; }\r\n\r\n public dispose() {\r\n this._classifierBuffers = dispose(this._classifierBuffers);\r\n this._maskBuffer = dispose(this._maskBuffer);\r\n this._classifierCombinedBuffer = dispose(this._classifierCombinedBuffer);\r\n this._classifierAndMaskCombinedBuffer = dispose(this._classifierAndMaskCombinedBuffer);\r\n }\r\n\r\n public get texture(): Texture | undefined {\r\n switch (this._contentMode) {\r\n case PlanarClassifierContent.None:\r\n return undefined;\r\n case PlanarClassifierContent.ClassifierOnly:\r\n return this._classifierCombinedBuffer?.texture;\r\n case PlanarClassifierContent.MaskOnly:\r\n return this._maskBuffer?.texture;\r\n case PlanarClassifierContent.ClassifierAndMask:\r\n return this._classifierAndMaskCombinedBuffer?.texture;\r\n }\r\n }\r\n public getOrCreateClassifierTexture(): Texture | undefined {\r\n if (undefined === this._classifierBuffers)\r\n this._classifierBuffers = ClassifierFrameBuffers.create(this._width, this._height);\r\n if (undefined !== this._classifierBuffers && undefined === this._classifierCombinedBuffer)\r\n this._classifierCombinedBuffer = ClassifierCombinationBuffer.create(this._width, this._height, this._classifierBuffers.textures.color, this._classifierBuffers.textures.feature);\r\n\r\n return this._classifierCombinedBuffer?.texture;\r\n }\r\n\r\n private pushBatches(batchState: BatchState, graphics: RenderGraphic[]) {\r\n graphics.forEach((graphic) => {\r\n if (graphic instanceof Batch) {\r\n batchState.push(graphic, true);\r\n batchState.pop();\r\n } else if (graphic instanceof Branch) {\r\n this.pushBatches(batchState, graphic.branch.entries);\r\n }\r\n });\r\n }\r\n public get sourceTransparency() {\r\n return this._classifierTreeRef?.transparency;\r\n }\r\n\r\n public pushBatchState(batchState: BatchState) {\r\n this._baseBatchId = batchState.nextBatchId - 1;\r\n if (undefined !== this._classifierGraphics)\r\n this.pushBatches(batchState, this._classifierGraphics);\r\n }\r\n\r\n public setSource(classifierTreeRef?: SpatialClassifierTileTreeReference, planarClipMask?: PlanarClipMaskState) {\r\n this._classifierTreeRef = classifierTreeRef;\r\n this._classifier = classifierTreeRef?.activeClassifier;\r\n this._planarClipMask = planarClipMask;\r\n }\r\n\r\n public collectGraphics(context: SceneContext, target: PlanarClassifierTarget): void {\r\n this._classifierGraphics.length = this._maskGraphics.length = 0;\r\n if (undefined === context.viewingSpace)\r\n return;\r\n\r\n const viewState = context.viewingSpace.view as ViewState3d;\r\n if (undefined === viewState)\r\n return;\r\n\r\n const requiredHeight = context.target.viewRect.height;\r\n const requiredWidth = context.target.viewRect.width;\r\n\r\n if (requiredWidth !== this._width || requiredHeight !== this._height)\r\n this.dispose();\r\n\r\n this._width = requiredWidth;\r\n this._height = requiredHeight;\r\n const maskTrees = this._planarClipMask?.getTileTrees(viewState, target.modelId);\r\n if (!maskTrees && !this._classifierTreeRef)\r\n return;\r\n\r\n const allTrees = maskTrees ? maskTrees.slice() : new Array<TileTreeReference>();\r\n if (this._classifierTreeRef)\r\n allTrees.push(this._classifierTreeRef);\r\n\r\n const projection = PlanarTextureProjection.computePlanarTextureProjection(this._plane, context, target, allTrees, viewState, this._width, this._height);\r\n if (!projection.textureFrustum || !projection.projectionMatrix || !projection.worldToViewMap)\r\n return;\r\n\r\n this._projectionMatrix = projection.projectionMatrix;\r\n this._frustum = projection.textureFrustum;\r\n this._debugFrustum = projection.debugFrustum;\r\n this._planarClipMaskOverrides = this._planarClipMask?.getPlanarClipMaskSymbologyOverrides();\r\n\r\n const drawTree = (treeRef: TileTreeReference, graphics: RenderGraphic[]) => {\r\n this._graphics = graphics;\r\n const frustumPlanes = this._frustum ? FrustumPlanes.fromFrustum(this._frustum) : FrustumPlanes.createEmpty();\r\n const drawArgs = GraphicsCollectorDrawArgs.create(context, this, treeRef, frustumPlanes, projection.worldToViewMap!);\r\n if (undefined !== drawArgs)\r\n treeRef.draw(drawArgs);\r\n\r\n this._graphics = undefined;\r\n };\r\n if (this._classifierTreeRef)\r\n drawTree(this._classifierTreeRef, this._classifierGraphics);\r\n\r\n if (maskTrees)\r\n maskTrees.forEach((maskTree) => drawTree(maskTree, this._maskGraphics));\r\n\r\n // Shader behaves slightly differently when classifying surfaces vs point clouds.\r\n this._isClassifyingPointCloud = target.isPointCloud;\r\n\r\n if (this._doDebugFrustum) {\r\n this._debugFrustumGraphic = dispose(this._debugFrustumGraphic);\r\n const builder = context.createSceneGraphicBuilder();\r\n\r\n builder.setSymbology(ColorDef.green, ColorDef.green, 1);\r\n builder.addFrustum(context.viewingSpace.getFrustum());\r\n builder.setSymbology(ColorDef.red, ColorDef.red, 1);\r\n builder.addFrustum(this._debugFrustum!);\r\n builder.setSymbology(ColorDef.white, ColorDef.white, 1);\r\n builder.addFrustum(this._frustum);\r\n this._debugFrustumGraphic = builder.finish();\r\n }\r\n }\r\n\r\n public draw(target: Target) {\r\n if (undefined === this._frustum)\r\n return;\r\n\r\n this._contentMode = PlanarClassifierContent.None;\r\n let combinationBuffer: ClassifierCombinationBuffer | undefined;\r\n if (this._classifierGraphics.length === 0) {\r\n if (this._maskGraphics.length === 0) {\r\n return;\r\n } else {\r\n if (undefined === this._maskBuffer) {\r\n this._maskBuffer = MaskFrameBuffer.create(this._width, this._height);\r\n if (undefined === this._maskBuffer)\r\n return;\r\n }\r\n this._contentMode = PlanarClassifierContent.MaskOnly;\r\n }\r\n } else {\r\n if (undefined === this._classifierBuffers) {\r\n this._classifierBuffers = ClassifierFrameBuffers.create(this._width, this._height);\r\n if (undefined === this._classifierBuffers)\r\n return;\r\n }\r\n if (this._maskGraphics.length === 0) {\r\n if (undefined === this._classifierCombinedBuffer) {\r\n combinationBuffer = this._classifierCombinedBuffer = ClassifierCombinationBuffer.create(this._width, this._height, this._classifierBuffers.textures.color, this._classifierBuffers.textures.feature);\r\n if (undefined === this._classifierCombinedBuffer)\r\n return;\r\n }\r\n this._contentMode = PlanarClassifierContent.ClassifierOnly;\r\n combinationBuffer = this._classifierCombinedBuffer;\r\n } else {\r\n if (undefined === this._maskBuffer) {\r\n this._maskBuffer = MaskFrameBuffer.create(this._width, this._height);\r\n if (undefined === this._maskBuffer)\r\n return;\r\n }\r\n if (undefined === this._classifierAndMaskCombinedBuffer) {\r\n combinationBuffer = this._classifierAndMaskCombinedBuffer = ClassifierAndMaskCombinationBuffer.create(this._width, this._height, this._classifierBuffers.textures.color, this._classifierBuffers.textures.feature, this._maskBuffer.texture);\r\n if (undefined === this._classifierAndMaskCombinedBuffer)\r\n return;\r\n }\r\n combinationBuffer = this._classifierAndMaskCombinedBuffer;\r\n this._contentMode = PlanarClassifierContent.ClassifierAndMask;\r\n }\r\n }\r\n\r\n if (undefined !== this._debugFrustumGraphic)\r\n target.graphics.foreground.push(this._debugFrustumGraphic);\r\n\r\n // Temporarily override the Target's state.\r\n const system = System.instance;\r\n const maskViewFlags = {\r\n renderMode: RenderMode.SmoothShade,\r\n wiremesh: false,\r\n transparency: !this.isClassifyingPointCloud, // point clouds don't support transparency.\r\n textures: false,\r\n lighting: false,\r\n shadows: false,\r\n monochrome: false,\r\n materials: false,\r\n ambientOcclusion: false,\r\n visibleEdges: false,\r\n hiddenEdges: false,\r\n };\r\n const prevState = system.currentRenderState.clone(scratchPrevRenderState);\r\n system.context.viewport(0, 0, this._width, this._height);\r\n const vf = target.currentViewFlags.copy(this._classifierTreeRef ? this._classifierTreeRef.viewFlags : maskViewFlags);\r\n\r\n system.applyRenderState(this._renderState);\r\n const prevPlan = target.plan;\r\n const prevOverrides = target.currentFeatureSymbologyOverrides;\r\n\r\n target.uniforms.style.changeBackgroundColor(this._bgColor); // Avoid white on white reversal. Will be reset in changeRenderPlan below.\r\n target.changeFrustum(this._frustum, this._frustum.getFraction(), true);\r\n this._anyTranslucent = false;\r\n\r\n const prevProjMatrix = target.uniforms.frustum.projectionMatrix;\r\n target.uniforms.frustum.changeProjectionMatrix(PlanarClassifier._postProjectionMatrix.multiplyMatrixMatrix(prevProjMatrix));\r\n target.uniforms.branch.changeRenderPlan(vf, target.plan.is3d, target.plan.hline);\r\n\r\n const renderCommands = this._renderCommands;\r\n const getDrawCommands = (graphics: RenderGraphic[]) => {\r\n this._batchState.reset();\r\n renderCommands.reset(target, this._branchStack, this._batchState);\r\n renderCommands.collectGraphicsForPlanarProjection(graphics);\r\n\r\n // Draw the classifiers into our attachments.\r\n // When using Display.ElementColor, the color and transparency come from the classifier geometry. Therefore we may need to draw the classified geometry\r\n // in a different pass - or both passes - depending on the transparency of the classifiers.\r\n // NB: \"Outside\" geometry by definition cannot take color/transparency from element...\r\n const cmds = renderCommands.getCommands(RenderPass.OpaquePlanar);\r\n\r\n // NB: We don't strictly require the classifier geometry to be planar, and sometimes (e.g., \"planar\" polyface/bspsurf) we do not detect planarity.\r\n cmds.push(...renderCommands.getCommands(RenderPass.OpaqueGeneral));\r\n cmds.push(...renderCommands.getCommands(RenderPass.OpaqueLinear));\r\n this._anyOpaque = cmds.length > 0;\r\n const transCmds = renderCommands.getCommands(RenderPass.Translucent);\r\n if (transCmds.length > 0) {\r\n cmds.push(...transCmds);\r\n this._anyTranslucent = true;\r\n }\r\n return cmds;\r\n };\r\n\r\n if (this._classifierGraphics.length > 0 && this._classifierBuffers) {\r\n this._classifierBuffers.draw(getDrawCommands(this._classifierGraphics), target);\r\n\r\n // Draw any hilited classifiers.\r\n const hiliteCommands = renderCommands.getCommands(RenderPass.Hilite);\r\n this._anyHilited = 0 !== hiliteCommands.length;\r\n if (this._anyHilited)\r\n this._classifierBuffers.drawHilite(hiliteCommands, target);\r\n }\r\n if (this._maskGraphics.length > 0 && this._maskBuffer) {\r\n if (this._planarClipMaskOverrides)\r\n target.overrideFeatureSymbology(this._planarClipMaskOverrides);\r\n if (this._planarClipMask && this._planarClipMask.settings.transparency !== undefined && this._planarClipMask.settings.transparency > 0.0)\r\n this._anyTranslucent = true;\r\n\r\n this._maskBuffer.draw(getDrawCommands(this._maskGraphics), target);\r\n\r\n }\r\n if (combinationBuffer)\r\n combinationBuffer.compose(target);\r\n\r\n this._batchState.reset();\r\n target.changeRenderPlan(prevPlan);\r\n target.overrideFeatureSymbology(prevOverrides);\r\n\r\n system.applyRenderState(prevState);\r\n system.context.viewport(0, 0, target.viewRect.width, target.viewRect.height);\r\n }\r\n}\r\n\r\n"]}
1
+ {"version":3,"file":"PlanarClassifier.js","sourceRoot":"","sources":["../../../../src/render/webgl/PlanarClassifier.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\r\n/** @packageDocumentation\r\n * @module WebGL\r\n */\r\n\r\nimport { BeEvent, dispose } from \"@itwin/core-bentley\";\r\nimport {\r\n ColorDef, Frustum, FrustumPlanes, RenderMode, RenderTexture, SpatialClassifierInsideDisplay, SpatialClassifierOutsideDisplay, TextureTransparency,\r\n} from \"@itwin/core-common\";\r\nimport { Matrix4d, Plane3dByOriginAndUnitNormal, Point3d, Range3d, Vector3d } from \"@itwin/core-geometry\";\r\nimport { PlanarClipMaskState } from \"../../PlanarClipMaskState\";\r\nimport { GraphicsCollectorDrawArgs, SpatialClassifierTileTreeReference, TileTreeReference } from \"../../tile/internal\";\r\nimport { SceneContext } from \"../../ViewContext\";\r\nimport { FeatureSymbology } from \"../FeatureSymbology\";\r\nimport { RenderGraphic } from \"../RenderGraphic\";\r\nimport { RenderMemory } from \"../RenderMemory\";\r\nimport { PlanarClassifierTarget, RenderPlanarClassifier } from \"../RenderPlanarClassifier\";\r\nimport { BatchState } from \"./BatchState\";\r\nimport { BranchStack } from \"./BranchStack\";\r\nimport { CachedGeometry, Combine3TexturesGeometry, CombineTexturesGeometry, ViewportQuadGeometry } from \"./CachedGeometry\";\r\nimport { WebGLDisposable } from \"./Disposable\";\r\nimport { DrawCommands } from \"./DrawCommand\";\r\nimport { FrameBuffer } from \"./FrameBuffer\";\r\nimport { GL } from \"./GL\";\r\nimport { Batch, Branch } from \"./Graphic\";\r\nimport { PlanarTextureProjection } from \"./PlanarTextureProjection\";\r\nimport { RenderCommands } from \"./RenderCommands\";\r\nimport { RenderPass } from \"./RenderFlags\";\r\nimport { RenderState } from \"./RenderState\";\r\nimport { getDrawParams } from \"./ScratchDrawParams\";\r\nimport { System } from \"./System\";\r\nimport { Target } from \"./Target\";\r\nimport { TechniqueId } from \"./TechniqueId\";\r\nimport { Texture, TextureHandle } from \"./Texture\";\r\nimport { ActiveSpatialClassifier } from \"../../SpatialClassifiersState\";\r\n\r\nexport enum PlanarClassifierContent { None = 0, MaskOnly = 1, ClassifierOnly = 2, ClassifierAndMask = 3 }\r\n\r\nfunction createTexture(handle: TextureHandle): Texture {\r\n return new Texture({\r\n handle,\r\n ownership: \"external\",\r\n type: RenderTexture.Type.TileSection,\r\n transparency: TextureTransparency.Opaque,\r\n });\r\n}\r\n\r\nfunction createTextureHandle(width: number, height: number, heightMult = 1.0) {\r\n return TextureHandle.createForAttachment(width, height * heightMult, GL.Texture.Format.Rgba, GL.Texture.DataType.UnsignedByte);\r\n}\r\n\r\nclass ClassifierTextures implements WebGLDisposable {\r\n private constructor(public readonly color: Texture,\r\n public readonly feature: Texture,\r\n public readonly hilite: Texture) { }\r\n\r\n public get isDisposed(): boolean {\r\n return this.color.isDisposed\r\n && this.feature.isDisposed\r\n && this.hilite.isDisposed;\r\n }\r\n\r\n public dispose(): void {\r\n dispose(this.color);\r\n dispose(this.feature);\r\n dispose(this.hilite);\r\n }\r\n\r\n public collectStatistics(stats: RenderMemory.Statistics): void {\r\n stats.addPlanarClassifier(this.color.bytesUsed);\r\n stats.addPlanarClassifier(this.feature.bytesUsed);\r\n stats.addPlanarClassifier(this.hilite.bytesUsed);\r\n }\r\n\r\n public static create(width: number, height: number): ClassifierTextures | undefined {\r\n const hColor = createTextureHandle(width, height);\r\n const hFeature = createTextureHandle(width, height);\r\n const hHilite = createTextureHandle(width, height);\r\n if (!hColor || !hFeature || !hHilite)\r\n return undefined;\r\n\r\n const color = createTexture(hColor);\r\n const feature = createTexture(hFeature);\r\n const hilite = createTexture(hHilite);\r\n if (!color || !feature || !hilite)\r\n return undefined;\r\n\r\n return new ClassifierTextures(color, feature, hilite);\r\n }\r\n}\r\n\r\nclass ClassifierFrameBuffers implements WebGLDisposable {\r\n private constructor(\r\n public readonly textures: ClassifierTextures,\r\n private readonly _hilite: FrameBuffer,\r\n private readonly _fbo: FrameBuffer,\r\n private readonly _clearGeom: ViewportQuadGeometry) {\r\n }\r\n\r\n public get isDisposed(): boolean {\r\n return this.textures.isDisposed && this._hilite.isDisposed && this._fbo.isDisposed && this._clearGeom.isDisposed;\r\n }\r\n\r\n public dispose(): void {\r\n dispose(this._fbo);\r\n dispose(this._clearGeom);\r\n dispose(this.textures);\r\n dispose(this._hilite);\r\n }\r\n\r\n public draw(cmds: DrawCommands, target: Target): void {\r\n System.instance.frameBufferStack.execute(this._fbo, true, false, () => {\r\n target.techniques.draw(getDrawParams(target, this._clearGeom));\r\n target.techniques.execute(target, cmds, RenderPass.PlanarClassification);\r\n });\r\n }\r\n\r\n public drawHilite(cmds: DrawCommands, target: Target): void {\r\n const system = System.instance;\r\n const gl = system.context;\r\n system.frameBufferStack.execute(this._hilite, true, false, () => {\r\n gl.clearColor(0, 0, 0, 0);\r\n gl.clear(GL.BufferBit.Color);\r\n target.techniques.execute(target, cmds, RenderPass.Hilite);\r\n });\r\n }\r\n\r\n public static create(width: number, height: number): ClassifierFrameBuffers | undefined {\r\n const textures = ClassifierTextures.create(width, height);\r\n if (undefined === textures)\r\n return undefined;\r\n\r\n const hiliteFbo = FrameBuffer.create([textures.hilite.texture]);\r\n if (undefined === hiliteFbo)\r\n return undefined;\r\n\r\n const fbo = FrameBuffer.create([textures.color.texture, textures.feature.texture]);\r\n if (undefined === fbo)\r\n return undefined;\r\n\r\n const geom = ViewportQuadGeometry.create(TechniqueId.ClearPickAndColor);\r\n return undefined !== geom ? new this(textures, hiliteFbo, fbo, geom) : undefined;\r\n }\r\n}\r\n\r\ninterface TextureAndFbo {\r\n texture: Texture;\r\n fbo: FrameBuffer;\r\n}\r\n\r\nabstract class SingleTextureFrameBuffer implements WebGLDisposable {\r\n public texture: Texture;\r\n protected fbo: FrameBuffer;\r\n public get isDisposed(): boolean { return this.texture.isDisposed && this.fbo.isDisposed; }\r\n public collectStatistics(stats: RenderMemory.Statistics): void { stats.addPlanarClassifier(this.texture.bytesUsed); }\r\n protected constructor(textureAndFbo: TextureAndFbo) {\r\n this.texture = textureAndFbo.texture;\r\n this.fbo = textureAndFbo.fbo;\r\n }\r\n public dispose(): void {\r\n dispose(this.texture);\r\n dispose(this.fbo);\r\n }\r\n public static createTextureAndFrameBuffer(width: number, height: number): TextureAndFbo | undefined {\r\n const hTexture = TextureHandle.createForAttachment(width, height, GL.Texture.Format.Rgba, GL.Texture.DataType.UnsignedByte);\r\n if (!hTexture)\r\n return undefined;\r\n\r\n const texture = new Texture({ type: RenderTexture.Type.TileSection, ownership: \"external\", handle: hTexture, transparency: TextureTransparency.Opaque });\r\n if (!texture)\r\n return undefined;\r\n\r\n const fbo = FrameBuffer.create([texture.texture]);\r\n if (undefined === fbo)\r\n return undefined;\r\n\r\n return { texture, fbo };\r\n }\r\n}\r\nclass MaskFrameBuffer extends SingleTextureFrameBuffer {\r\n public static create(width: number, height: number): MaskFrameBuffer | undefined {\r\n const textureFbo = SingleTextureFrameBuffer.createTextureAndFrameBuffer(width, height);\r\n return undefined === textureFbo ? undefined : new MaskFrameBuffer(textureFbo);\r\n }\r\n public draw(cmds: DrawCommands, target: Target): void {\r\n const system = System.instance;\r\n const gl = system.context;\r\n\r\n system.frameBufferStack.execute(this.fbo, true, false, () => {\r\n gl.clearColor(0, 0, 0, 0);\r\n gl.clear(GL.BufferBit.Color);\r\n target.techniques.execute(target, cmds, RenderPass.PlanarClassification);\r\n });\r\n }\r\n}\r\nabstract class CombineTexturesFrameBuffer extends SingleTextureFrameBuffer {\r\n constructor(textureAndFbo: TextureAndFbo, private _combineGeom: CachedGeometry, private _width: number, private _height: number, private _heightMult: number) { super(textureAndFbo); }\r\n public compose(target: Target): void {\r\n const system = System.instance;\r\n const gl = system.context;\r\n system.context.viewport(0, 0, this._width, this._heightMult * this._height);\r\n system.frameBufferStack.execute(this.fbo, true, false, () => {\r\n gl.clearColor(0, 0, 0, 0);\r\n gl.clear(GL.BufferBit.Color);\r\n target.techniques.draw(getDrawParams(target, this._combineGeom));\r\n });\r\n }\r\n}\r\n\r\nclass ClassifierCombinationBuffer extends CombineTexturesFrameBuffer {\r\n public static create(width: number, height: number, classifierColor: Texture, classifierFeature: Texture): ClassifierAndMaskCombinationBuffer | undefined {\r\n const combineGeom = CombineTexturesGeometry.createGeometry(classifierColor.texture.getHandle()!, classifierFeature.texture.getHandle()!);\r\n if (undefined === combineGeom)\r\n return undefined;\r\n\r\n const textureFbo = SingleTextureFrameBuffer.createTextureAndFrameBuffer(width, 2 * height);\r\n return undefined === textureFbo ? undefined : new ClassifierCombinationBuffer(textureFbo, combineGeom, width, height, 2);\r\n }\r\n}\r\nclass ClassifierAndMaskCombinationBuffer extends CombineTexturesFrameBuffer {\r\n public static create(width: number, height: number, classifierColor: Texture, classifierFeature: Texture, mask: Texture): ClassifierAndMaskCombinationBuffer | undefined {\r\n const combineGeom = Combine3TexturesGeometry.createGeometry(classifierColor.texture.getHandle()!, classifierFeature.texture.getHandle()!, mask.texture.getHandle()!);\r\n if (undefined === combineGeom)\r\n return undefined;\r\n\r\n const textureFbo = SingleTextureFrameBuffer.createTextureAndFrameBuffer(width, 3 * height);\r\n return undefined === textureFbo ? undefined : new ClassifierAndMaskCombinationBuffer(textureFbo, combineGeom, width, height, 3);\r\n }\r\n}\r\n\r\nconst scratchPrevRenderState = new RenderState();\r\n\r\n/** @internal */\r\nexport class PlanarClassifier extends RenderPlanarClassifier implements RenderMemory.Consumer, WebGLDisposable {\r\n private _classifierBuffers?: ClassifierFrameBuffers;\r\n private _maskBuffer?: MaskFrameBuffer;\r\n private _classifierCombinedBuffer?: ClassifierCombinationBuffer;\r\n private _classifierAndMaskCombinedBuffer?: ClassifierAndMaskCombinationBuffer;\r\n private _projectionMatrix = Matrix4d.createIdentity();\r\n private _graphics?: RenderGraphic[];\r\n private readonly _classifierGraphics: RenderGraphic[] = [];\r\n private readonly _maskGraphics: RenderGraphic[] = [];\r\n private _frustum?: Frustum;\r\n private _width = 0;\r\n private _height = 0;\r\n private _baseBatchId = 0;\r\n private _anyHilited = false;\r\n private _anyOpaque = false;\r\n private _anyTranslucent = false;\r\n private _classifier?: ActiveSpatialClassifier;\r\n private readonly _plane = Plane3dByOriginAndUnitNormal.create(new Point3d(0, 0, 0), new Vector3d(0, 0, 1))!; // TBD -- Support other planes - default to X-Y for now.\r\n private readonly _renderState = new RenderState();\r\n private readonly _renderCommands: RenderCommands;\r\n private readonly _branchStack = new BranchStack();\r\n private readonly _batchState: BatchState;\r\n private _planarClipMask?: PlanarClipMaskState;\r\n private _classifierTreeRef?: SpatialClassifierTileTreeReference;\r\n private _planarClipMaskOverrides?: FeatureSymbology.Overrides;\r\n private _contentMode: PlanarClassifierContent = PlanarClassifierContent.None;\r\n private _removeMe?: () => void;\r\n private _featureSymbologySource: FeatureSymbology.Source = {\r\n onSourceDisposed: new BeEvent<() => void>(),\r\n };;\r\n\r\n private static _postProjectionMatrix = Matrix4d.createRowValues(\r\n 0, 1, 0, 0,\r\n 0, 0, -1, 0,\r\n 1, 0, 0, 0,\r\n 0, 0, 0, 1);\r\n private _debugFrustum?: Frustum;\r\n private _doDebugFrustum = false;\r\n private _debugFrustumGraphic?: RenderGraphic = undefined;\r\n private _isClassifyingPointCloud?: boolean; // we will detect this the first time we draw\r\n private readonly _bgColor = ColorDef.from(0, 0, 0, 255);\r\n\r\n private constructor(classifier: ActiveSpatialClassifier | undefined, target: Target) {\r\n super();\r\n this._classifier = classifier;\r\n\r\n const flags = this._renderState.flags;\r\n flags.depthMask = flags.blend = flags.depthTest = false;\r\n\r\n this._batchState = new BatchState(this._branchStack);\r\n this._renderCommands = new RenderCommands(target, this._branchStack, this._batchState);\r\n }\r\n public get textureImageCount(): number { return this._contentMode; }\r\n\r\n public getParams(params: Float32Array): void {\r\n params[0] = this.insideDisplay;\r\n params[1] = this.outsideDisplay;\r\n params[2] = this._contentMode;\r\n if (this._planarClipMask?.settings.invert) // If the mask sense is inverted, negate the contentMode to indicate this to the shader.\r\n params[2] = - params[2];\r\n\r\n params[3] = (this._planarClipMask?.settings.transparency === undefined) ? -1 : this._planarClipMask.settings.transparency;\r\n\r\n }\r\n\r\n public get hiliteTexture(): Texture | undefined { return undefined !== this._classifierBuffers ? this._classifierBuffers.textures.hilite : undefined; }\r\n public get projectionMatrix(): Matrix4d { return this._projectionMatrix; }\r\n // public get properties(): SpatialClassifier { return this._classifier; }\r\n public get baseBatchId(): number { return this._baseBatchId; }\r\n public get anyHilited(): boolean { return this._anyHilited; }\r\n public get anyOpaque(): boolean { return this._anyOpaque; }\r\n public get anyTranslucent(): boolean { return this._anyTranslucent; }\r\n public get insideDisplay(): SpatialClassifierInsideDisplay { return this._classifier ? this._classifier.flags.inside : SpatialClassifierInsideDisplay.Off; }\r\n public get outsideDisplay(): SpatialClassifierOutsideDisplay { return this._classifier ? this._classifier.flags.outside : SpatialClassifierOutsideDisplay.On; }\r\n public get isClassifyingPointCloud(): boolean { return true === this._isClassifyingPointCloud; }\r\n\r\n public addGraphic(graphic: RenderGraphic) {\r\n this._graphics!.push(graphic);\r\n }\r\n\r\n public static create(properties: ActiveSpatialClassifier | undefined, target: Target): PlanarClassifier {\r\n return new PlanarClassifier(properties, target);\r\n }\r\n\r\n public collectStatistics(stats: RenderMemory.Statistics): void {\r\n if (undefined !== this._classifierBuffers)\r\n this._classifierBuffers.textures.collectStatistics(stats);\r\n\r\n if (undefined !== this._maskBuffer)\r\n this._maskBuffer.collectStatistics(stats);\r\n\r\n if (undefined !== this._classifierCombinedBuffer)\r\n this._classifierCombinedBuffer.collectStatistics(stats);\r\n\r\n if (undefined !== this._classifierAndMaskCombinedBuffer)\r\n this._classifierAndMaskCombinedBuffer.collectStatistics(stats);\r\n }\r\n\r\n public get isDisposed(): boolean { return undefined === this._classifierBuffers; }\r\n\r\n public dispose() {\r\n this._classifierBuffers = dispose(this._classifierBuffers);\r\n this._maskBuffer = dispose(this._maskBuffer);\r\n this._classifierCombinedBuffer = dispose(this._classifierCombinedBuffer);\r\n this._classifierAndMaskCombinedBuffer = dispose(this._classifierAndMaskCombinedBuffer);\r\n if (this._removeMe) {\r\n this._removeMe();\r\n this._removeMe = undefined;\r\n }\r\n this._featureSymbologySource.onSourceDisposed.raiseEvent();\r\n }\r\n\r\n public get texture(): Texture | undefined {\r\n switch (this._contentMode) {\r\n case PlanarClassifierContent.None:\r\n return undefined;\r\n case PlanarClassifierContent.ClassifierOnly:\r\n return this._classifierCombinedBuffer?.texture;\r\n case PlanarClassifierContent.MaskOnly:\r\n return this._maskBuffer?.texture;\r\n case PlanarClassifierContent.ClassifierAndMask:\r\n return this._classifierAndMaskCombinedBuffer?.texture;\r\n }\r\n }\r\n public getOrCreateClassifierTexture(): Texture | undefined {\r\n if (undefined === this._classifierBuffers)\r\n this._classifierBuffers = ClassifierFrameBuffers.create(this._width, this._height);\r\n if (undefined !== this._classifierBuffers && undefined === this._classifierCombinedBuffer)\r\n this._classifierCombinedBuffer = ClassifierCombinationBuffer.create(this._width, this._height, this._classifierBuffers.textures.color, this._classifierBuffers.textures.feature);\r\n\r\n return this._classifierCombinedBuffer?.texture;\r\n }\r\n\r\n private pushBatches(batchState: BatchState, graphics: RenderGraphic[]) {\r\n graphics.forEach((graphic) => {\r\n if (graphic instanceof Batch) {\r\n batchState.push(graphic, true);\r\n batchState.pop();\r\n } else if (graphic instanceof Branch) {\r\n this.pushBatches(batchState, graphic.branch.entries);\r\n }\r\n });\r\n }\r\n public get sourceTransparency() {\r\n return this._classifierTreeRef?.transparency;\r\n }\r\n\r\n public pushBatchState(batchState: BatchState) {\r\n this._baseBatchId = batchState.nextBatchId - 1;\r\n if (undefined !== this._classifierGraphics)\r\n this.pushBatches(batchState, this._classifierGraphics);\r\n }\r\n\r\n public setSource(classifierTreeRef?: SpatialClassifierTileTreeReference, planarClipMask?: PlanarClipMaskState) {\r\n this._classifierTreeRef = classifierTreeRef;\r\n this._classifier = classifierTreeRef?.activeClassifier;\r\n this._planarClipMask = planarClipMask;\r\n }\r\n\r\n public collectGraphics(context: SceneContext, target: PlanarClassifierTarget): void {\r\n this._classifierGraphics.length = this._maskGraphics.length = 0;\r\n if (undefined === context.viewingSpace)\r\n return;\r\n\r\n const viewState = context.viewingSpace.view;\r\n if (!viewState.isSpatialView())\r\n return;\r\n\r\n this._doDebugFrustum = context.target.debugControl?.displayMaskFrustum ?? false;\r\n\r\n const maxTextureSize = System.instance.maxTexSizeAllow;\r\n const requiredHeight = maxTextureSize;\r\n const requiredWidth = maxTextureSize;\r\n\r\n if (requiredWidth !== this._width || requiredHeight !== this._height)\r\n this.dispose();\r\n\r\n this._width = requiredWidth;\r\n this._height = requiredHeight;\r\n const maskRange = Range3d.createNull();\r\n const maskTrees = this._planarClipMask?.getTileTrees(viewState, target.modelId, maskRange);\r\n if (!maskTrees && !this._classifierTreeRef)\r\n return;\r\n\r\n const allTrees = maskTrees ? maskTrees.slice() : new Array<TileTreeReference>();\r\n if (this._classifierTreeRef)\r\n allTrees.push(this._classifierTreeRef);\r\n\r\n const projection = PlanarTextureProjection.computePlanarTextureProjection(this._plane, context, target, allTrees, viewState, this._width, this._height, maskRange);\r\n if (!projection.textureFrustum || !projection.projectionMatrix || !projection.worldToViewMap)\r\n return;\r\n\r\n this._projectionMatrix = projection.projectionMatrix;\r\n this._frustum = projection.textureFrustum;\r\n this._debugFrustum = projection.debugFrustum;\r\n this._planarClipMaskOverrides = this._planarClipMask?.getPlanarClipMaskSymbologyOverrides(viewState, context, this._featureSymbologySource);\r\n if (!this._planarClipMask?.usingViewportOverrides && this._removeMe) {\r\n this._removeMe();\r\n this._removeMe = undefined;\r\n } else if (this._planarClipMask?.usingViewportOverrides && !this._removeMe) {\r\n this._removeMe = context.viewport.onFeatureOverridesChanged.addListener(() => {\r\n this._planarClipMaskOverrides = this._planarClipMask?.getPlanarClipMaskSymbologyOverrides(viewState, context, this._featureSymbologySource);\r\n context.viewport.requestRedraw();\r\n });\r\n }\r\n\r\n const drawTree = (treeRef: TileTreeReference, graphics: RenderGraphic[]) => {\r\n this._graphics = graphics;\r\n const frustumPlanes = this._frustum ? FrustumPlanes.fromFrustum(this._frustum) : FrustumPlanes.createEmpty();\r\n const drawArgs = GraphicsCollectorDrawArgs.create(context, this, treeRef, frustumPlanes, projection.worldToViewMap!);\r\n if (undefined !== drawArgs)\r\n treeRef.draw(drawArgs);\r\n\r\n this._graphics = undefined;\r\n };\r\n if (this._classifierTreeRef)\r\n drawTree(this._classifierTreeRef, this._classifierGraphics);\r\n\r\n if (maskTrees)\r\n maskTrees.forEach((maskTree) => drawTree(maskTree, this._maskGraphics));\r\n\r\n // Shader behaves slightly differently when classifying surfaces vs point clouds.\r\n this._isClassifyingPointCloud = target.isPointCloud;\r\n\r\n if (this._doDebugFrustum) {\r\n this._debugFrustumGraphic = dispose(this._debugFrustumGraphic);\r\n const builder = context.createSceneGraphicBuilder();\r\n\r\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\r\n builder.addFrustum(context.viewingSpace.getFrustum());\r\n builder.setSymbology(ColorDef.red, ColorDef.red, 2);\r\n builder.addFrustum(this._debugFrustum!);\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue, 2);\r\n builder.addFrustum(this._frustum);\r\n\r\n builder.setSymbology(ColorDef.from(0,200,0,222), ColorDef.from(0,200,0,222), 2);\r\n builder.addFrustumSides(context.viewingSpace.getFrustum());\r\n builder.setSymbology(ColorDef.from(200,0,0,222), ColorDef.from(200,0,0,222), 2);\r\n builder.addFrustumSides(this._debugFrustum!);\r\n builder.setSymbology(ColorDef.from(0,0,200,222), ColorDef.from(0,0,200,222), 2);\r\n builder.addFrustumSides(this._frustum);\r\n this._debugFrustumGraphic = builder.finish();\r\n context.outputGraphic(this._debugFrustumGraphic);\r\n }\r\n }\r\n\r\n public draw(target: Target) {\r\n if (undefined === this._frustum)\r\n return;\r\n\r\n this._contentMode = PlanarClassifierContent.None;\r\n let combinationBuffer: ClassifierCombinationBuffer | undefined;\r\n if (this._classifierGraphics.length === 0) {\r\n if (this._maskGraphics.length === 0) {\r\n return;\r\n } else {\r\n if (undefined === this._maskBuffer) {\r\n this._maskBuffer = MaskFrameBuffer.create(this._width, this._height);\r\n if (undefined === this._maskBuffer)\r\n return;\r\n }\r\n this._contentMode = PlanarClassifierContent.MaskOnly;\r\n }\r\n } else {\r\n if (undefined === this._classifierBuffers) {\r\n this._classifierBuffers = ClassifierFrameBuffers.create(this._width, this._height);\r\n if (undefined === this._classifierBuffers)\r\n return;\r\n }\r\n if (this._maskGraphics.length === 0) {\r\n if (undefined === this._classifierCombinedBuffer) {\r\n combinationBuffer = this._classifierCombinedBuffer = ClassifierCombinationBuffer.create(this._width, this._height, this._classifierBuffers.textures.color, this._classifierBuffers.textures.feature);\r\n if (undefined === this._classifierCombinedBuffer)\r\n return;\r\n }\r\n this._contentMode = PlanarClassifierContent.ClassifierOnly;\r\n combinationBuffer = this._classifierCombinedBuffer;\r\n } else {\r\n if (undefined === this._maskBuffer) {\r\n this._maskBuffer = MaskFrameBuffer.create(this._width, this._height);\r\n if (undefined === this._maskBuffer)\r\n return;\r\n }\r\n if (undefined === this._classifierAndMaskCombinedBuffer) {\r\n combinationBuffer = this._classifierAndMaskCombinedBuffer = ClassifierAndMaskCombinationBuffer.create(this._width, this._height, this._classifierBuffers.textures.color, this._classifierBuffers.textures.feature, this._maskBuffer.texture);\r\n if (undefined === this._classifierAndMaskCombinedBuffer)\r\n return;\r\n }\r\n combinationBuffer = this._classifierAndMaskCombinedBuffer;\r\n this._contentMode = PlanarClassifierContent.ClassifierAndMask;\r\n }\r\n }\r\n\r\n // Temporarily override the Target's state.\r\n const system = System.instance;\r\n const maskViewFlags = {\r\n renderMode: RenderMode.SmoothShade,\r\n wiremesh: false,\r\n transparency: !this.isClassifyingPointCloud, // point clouds don't support transparency.\r\n textures: false,\r\n lighting: false,\r\n shadows: false,\r\n monochrome: false,\r\n materials: false,\r\n ambientOcclusion: false,\r\n visibleEdges: false,\r\n hiddenEdges: false,\r\n };\r\n const prevState = system.currentRenderState.clone(scratchPrevRenderState);\r\n system.context.viewport(0, 0, this._width, this._height);\r\n const vf = target.currentViewFlags.copy(this._classifierTreeRef ? this._classifierTreeRef.viewFlags : maskViewFlags);\r\n\r\n system.applyRenderState(this._renderState);\r\n const prevPlan = target.plan;\r\n const prevOverrides = target.currentFeatureSymbologyOverrides;\r\n\r\n target.uniforms.style.changeBackgroundColor(this._bgColor); // Avoid white on white reversal. Will be reset in changeRenderPlan below.\r\n target.changeFrustum(this._frustum, this._frustum.getFraction(), true);\r\n this._anyTranslucent = false;\r\n\r\n const prevProjMatrix = target.uniforms.frustum.projectionMatrix;\r\n target.uniforms.frustum.changeProjectionMatrix(PlanarClassifier._postProjectionMatrix.multiplyMatrixMatrix(prevProjMatrix));\r\n target.uniforms.branch.changeRenderPlan(vf, target.plan.is3d, target.plan.hline);\r\n\r\n const renderCommands = this._renderCommands;\r\n const getDrawCommands = (graphics: RenderGraphic[]) => {\r\n this._batchState.reset();\r\n renderCommands.reset(target, this._branchStack, this._batchState);\r\n renderCommands.collectGraphicsForPlanarProjection(graphics);\r\n\r\n // Draw the classifiers into our attachments.\r\n // When using Display.ElementColor, the color and transparency come from the classifier geometry. Therefore we may need to draw the classified geometry\r\n // in a different pass - or both passes - depending on the transparency of the classifiers.\r\n // NB: \"Outside\" geometry by definition cannot take color/transparency from element...\r\n const cmds = renderCommands.getCommands(RenderPass.OpaquePlanar);\r\n\r\n // NB: We don't strictly require the classifier geometry to be planar, and sometimes (e.g., \"planar\" polyface/bspsurf) we do not detect planarity.\r\n cmds.push(...renderCommands.getCommands(RenderPass.OpaqueGeneral));\r\n cmds.push(...renderCommands.getCommands(RenderPass.OpaqueLinear));\r\n this._anyOpaque = cmds.length > 0;\r\n const transCmds = renderCommands.getCommands(RenderPass.Translucent);\r\n if (transCmds.length > 0) {\r\n cmds.push(...transCmds);\r\n this._anyTranslucent = true;\r\n }\r\n return cmds;\r\n };\r\n\r\n if (this._classifierGraphics.length > 0 && this._classifierBuffers) {\r\n this._classifierBuffers.draw(getDrawCommands(this._classifierGraphics), target);\r\n\r\n // Draw any hilited classifiers.\r\n const hiliteCommands = renderCommands.getCommands(RenderPass.Hilite);\r\n this._anyHilited = 0 !== hiliteCommands.length;\r\n if (this._anyHilited)\r\n this._classifierBuffers.drawHilite(hiliteCommands, target);\r\n }\r\n if (this._maskGraphics.length > 0 && this._maskBuffer) {\r\n if (this._planarClipMaskOverrides)\r\n target.overrideFeatureSymbology(this._planarClipMaskOverrides);\r\n if (this._planarClipMask && this._planarClipMask.settings.transparency !== undefined && this._planarClipMask.settings.transparency > 0.0)\r\n this._anyTranslucent = true;\r\n\r\n this._maskBuffer.draw(getDrawCommands(this._maskGraphics), target);\r\n\r\n }\r\n if (combinationBuffer)\r\n combinationBuffer.compose(target);\r\n\r\n this._batchState.reset();\r\n target.changeRenderPlan(prevPlan);\r\n target.overrideFeatureSymbology(prevOverrides);\r\n\r\n system.applyRenderState(prevState);\r\n system.context.viewport(0, 0, target.viewRect.width, target.viewRect.height);\r\n }\r\n}\r\n\r\n"]}
@@ -2,7 +2,7 @@
2
2
  * @module Rendering
3
3
  */
4
4
  import { Frustum } from "@itwin/core-common";
5
- import { Map4d, Matrix4d, Plane3dByOriginAndUnitNormal, Range1d, Transform } from "@itwin/core-geometry";
5
+ import { Map4d, Matrix4d, Plane3dByOriginAndUnitNormal, Range1d, Range3d, Transform } from "@itwin/core-geometry";
6
6
  import { Tile, TileTreeReference } from "../../tile/internal";
7
7
  import { SceneContext } from "../../ViewContext";
8
8
  import { ViewState3d } from "../../ViewState";
@@ -10,15 +10,15 @@ import { RenderState } from "./RenderState";
10
10
  import { Target } from "./Target";
11
11
  export declare class PlanarTextureProjection {
12
12
  private static _postProjectionMatrixNpc;
13
+ private static isTileRangeInBounds;
13
14
  static computePlanarTextureProjection(texturePlane: Plane3dByOriginAndUnitNormal, sceneContext: SceneContext, target: {
14
15
  tiles: Tile[];
15
16
  location: Transform;
16
- }, drapeRefs: TileTreeReference[], viewState: ViewState3d, textureWidth: number, textureHeight: number, _heightRange?: Range1d): {
17
+ }, drapeRefs: TileTreeReference[], viewState: ViewState3d, textureWidth: number, textureHeight: number, maskRange: Range3d, _heightRange?: Range1d): {
17
18
  textureFrustum?: Frustum;
18
19
  worldToViewMap?: Map4d;
19
20
  projectionMatrix?: Matrix4d;
20
21
  debugFrustum?: Frustum;
21
- zValue?: number;
22
22
  };
23
23
  static getTextureDrawingParams(target: Target): {
24
24
  state: RenderState;
@@ -1 +1 @@
1
- {"version":3,"file":"PlanarTextureProjection.d.ts","sourceRoot":"","sources":["../../../../src/render/webgl/PlanarTextureProjection.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAkC,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EACgD,KAAK,EAAY,QAAQ,EAAE,4BAA4B,EAAW,OAAO,EACvH,SAAS,EACjB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAKlC,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAC,wBAAwB,CAA4H;WAErJ,8BAA8B,CAC1C,YAAY,EAAE,4BAA4B,EAC1C,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE;QAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAAC,QAAQ,EAAE,SAAS,CAAA;KAAE,EAC9C,SAAS,EAAE,iBAAiB,EAAE,EAC9B,SAAS,EAAE,WAAW,EACtB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,OAAO,GAAG;QAAE,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,KAAK,CAAC;QAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;WA8IvI,uBAAuB,CAAC,MAAM,EAAE,MAAM;;;;CAsBrD"}
1
+ {"version":3,"file":"PlanarTextureProjection.d.ts","sourceRoot":"","sources":["../../../../src/render/webgl/PlanarTextureProjection.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAkC,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EACgD,KAAK,EAAY,QAAQ,EAAE,4BAA4B,EAAW,OAAO,EAAW,OAAO,EACzI,SAAS,EACjB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAKlC,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAC,wBAAwB,CAA4H;IAEnK,OAAO,CAAC,MAAM,CAAC,mBAAmB;WASpB,8BAA8B,CAC1C,YAAY,EAAE,4BAA4B,EAC1C,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE;QAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAAC,QAAQ,EAAE,SAAS,CAAA;KAAE,EAC9C,SAAS,EAAE,iBAAiB,EAAE,EAC9B,SAAS,EAAE,WAAW,EACtB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,OAAO,EAClB,YAAY,CAAC,EAAE,OAAO,GAAG;QAAE,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,KAAK,CAAC;QAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE;WA0KtH,uBAAuB,CAAC,MAAM,EAAE,MAAM;;;;CAsBrD"}
@@ -16,7 +16,15 @@ const scratchRange = core_geometry_1.Range3d.createNull();
16
16
  const scratchMap4d = core_geometry_1.Map4d.createIdentity();
17
17
  const scratchMatrix4d = core_geometry_1.Matrix4d.createIdentity();
18
18
  class PlanarTextureProjection {
19
- static computePlanarTextureProjection(texturePlane, sceneContext, target, drapeRefs, viewState, textureWidth, textureHeight, _heightRange) {
19
+ static isTileRangeInBounds(tileRange, drapeRange) {
20
+ // return false if tile is outside of drapeRange, ignoring height (x) for this
21
+ if (tileRange.low.y > drapeRange.high.y || tileRange.high.y < drapeRange.low.y)
22
+ return false;
23
+ if (tileRange.low.z > drapeRange.high.z || tileRange.high.z < drapeRange.low.z)
24
+ return false;
25
+ return true;
26
+ }
27
+ static computePlanarTextureProjection(texturePlane, sceneContext, target, drapeRefs, viewState, textureWidth, textureHeight, maskRange, _heightRange) {
20
28
  const textureZ = texturePlane.getNormalRef();
21
29
  const viewingSpace = sceneContext.viewingSpace;
22
30
  const viewX = viewingSpace.rotation.rowX();
@@ -40,14 +48,8 @@ class PlanarTextureProjection {
40
48
  const viewFrustum = viewingSpace.getFrustum().transformBy(textureTransform);
41
49
  const viewPlanes = core_common_1.FrustumPlanes.fromFrustum(viewFrustum);
42
50
  const viewClipPlanes = core_geometry_1.ConvexClipPlaneSet.createPlanes(viewPlanes.planes);
43
- let textureRange = core_geometry_1.Range3d.createNull();
44
- const tileToTexture = textureTransform.multiplyTransformTransform(target.location);
45
- for (const tile of target.tiles) {
46
- textureRange.extendRange(tileToTexture.multiplyRange(tile.range, scratchRange));
47
- }
48
- if (textureRange.isNull)
49
- return {};
50
- textureRange = core_geometry_1.ClipUtilities.rangeOfClipperIntersectionWithRange(viewClipPlanes, textureRange);
51
+ const contentUnBoundedRange = core_geometry_1.Range1d.createNull();
52
+ // calculate drapeRange from drapeRefs (mask references or drape reference).
51
53
  const drapeRange = core_geometry_1.Range3d.createNull();
52
54
  for (const drapeRef of drapeRefs) {
53
55
  const drapeTree = drapeRef.treeOwner.tileTree;
@@ -57,14 +59,37 @@ class PlanarTextureProjection {
57
59
  let heightRange = viewingSpace.getTerrainHeightRange();
58
60
  if (!heightRange)
59
61
  heightRange = ApproximateTerrainHeights_1.ApproximateTerrainHeights.instance.globalHeightRange;
60
- textureRange.low.x = Math.min(textureRange.low.x, heightRange.low);
61
- textureRange.high.x = Math.max(textureRange.high.x, heightRange.high);
62
+ contentUnBoundedRange.low = Math.min(contentUnBoundedRange.low, heightRange.low);
63
+ contentUnBoundedRange.high = Math.max(contentUnBoundedRange.high, heightRange.high);
62
64
  }
63
- else {
64
- const contentRange = textureTransform.multiplyRange(drapeRef.computeWorldContentRange());
65
+ else if (maskRange.isNull) {
66
+ const r = core_geometry_1.Range3d.createNull();
67
+ drapeRef.unionFitRange(r);
68
+ const contentRange = textureTransform.multiplyRange(r);
65
69
  if (!contentRange.isNull)
66
70
  drapeRange.extendRange(contentRange);
67
71
  }
72
+ else {
73
+ const contentRange = textureTransform.multiplyRange(maskRange);
74
+ drapeRange.extendRange(contentRange);
75
+ }
76
+ }
77
+ // get range of only the tiles to be masked or draped onto.
78
+ let textureRange = core_geometry_1.Range3d.createNull();
79
+ const tileToTexture = textureTransform.multiplyTransformTransform(target.location);
80
+ for (const tile of target.tiles) {
81
+ tileToTexture.multiplyRange(tile.range, scratchRange);
82
+ // Skip tile if it is outside of drapeRange because we don't want the extra heights from distant tiles included.
83
+ if (drapeRange.isNull || PlanarTextureProjection.isTileRangeInBounds(scratchRange, drapeRange))
84
+ textureRange.extendRange(scratchRange);
85
+ }
86
+ if (textureRange.isNull)
87
+ return {};
88
+ textureRange = core_geometry_1.ClipUtilities.rangeOfClipperIntersectionWithRange(viewClipPlanes, textureRange);
89
+ if (!contentUnBoundedRange.isNull) {
90
+ // Union of height
91
+ textureRange.low.x = Math.min(textureRange.low.x, contentUnBoundedRange.low);
92
+ textureRange.high.x = Math.max(textureRange.high.x, contentUnBoundedRange.high);
68
93
  }
69
94
  if (!drapeRange.isNull) {
70
95
  // Union of height
@@ -80,11 +105,19 @@ class PlanarTextureProjection {
80
105
  textureRange.low.x -= epsilon;
81
106
  textureRange.high.x += epsilon;
82
107
  const textureFrustum = core_common_1.Frustum.fromRange(textureRange);
83
- const debugFrustum = textureFrustum.clone();
108
+ let debugFrustum;
109
+ if (true) // debugFrustum as textureRange.
110
+ debugFrustum = textureFrustum.clone();
111
+ else // debugFrustum as drapeRange.
112
+ debugFrustum = core_common_1.Frustum.fromRange(drapeRange);
84
113
  textureTransform.multiplyInversePoint3dArray(debugFrustum.points, debugFrustum.points);
85
- if (viewState.isCameraOn) {
86
- const eyeHeight = (textureRange.low.x + textureRange.high.x) / 2.0;
87
- const eyePlane = core_geometry_1.Plane3dByOriginAndUnitNormal.create(core_geometry_1.Point3d.createScale(textureZ, eyeHeight), textureZ); // Centered in range - parallel to texture.
114
+ const viewZVecZ = viewState.getRotation().rowZ().z;
115
+ // This code attempts to use a projection frustum that aligns to the camera frustum in order to get higher mask resolution closer to the eye.
116
+ // Limit its use to views that have an eyepoint above the bottom of the frustum and are looking down at a view angle > 5 degrees, otherwise it causes issues.
117
+ // viewZVecZ is negative when looking up, positive when looking down.
118
+ if (viewState.isCameraOn && viewState.getEyePoint().z > textureRange.low.x && viewZVecZ > 0.09) {
119
+ // NB moved the eyePlane from the center to the bottom of the textureRange to solve problems when the eye was below the eyePlane.
120
+ const eyePlane = core_geometry_1.Plane3dByOriginAndUnitNormal.create(core_geometry_1.Point3d.createScale(textureZ, textureRange.low.x), textureZ); // at bottom of range - parallel to texture.
88
121
  const projectionRay = core_geometry_1.Ray3d.create(viewState.getEyePoint(), viewZ.crossProduct(textureX).normalize());
89
122
  let projectionDistance = projectionRay.intersectionWithPlane(eyePlane);
90
123
  const minNearToFarRatio = .01; // Smaller value allows texture projection to conform tightly to view frustum.
@@ -118,6 +151,7 @@ class PlanarTextureProjection {
118
151
  farRange.high.y = Math.max(farRange.high.y, farY);
119
152
  });
120
153
  });
154
+ // Set NPC from results.
121
155
  textureFrustum.points[core_common_1.Npc._000].set(farRange.low.x, farRange.low.y, eyePoint.z - far);
122
156
  textureFrustum.points[core_common_1.Npc._100].set(farRange.high.x, farRange.low.y, eyePoint.z - far);
123
157
  textureFrustum.points[core_common_1.Npc._010].set(farRange.low.x, farRange.high.y, eyePoint.z - far);
@@ -142,7 +176,7 @@ class PlanarTextureProjection {
142
176
  }
143
177
  const worldToNpcMap = core_geometry_1.Map4d.createRefs(worldToNpc, npcToWorld);
144
178
  const worldToViewMap = npcToView.multiplyMapMap(worldToNpcMap);
145
- return { textureFrustum, projectionMatrix: worldToNpc, worldToViewMap, debugFrustum };
179
+ return { textureFrustum, worldToViewMap, projectionMatrix: worldToNpc, debugFrustum };
146
180
  }
147
181
  static getTextureDrawingParams(target) {
148
182
  const state = new RenderState_1.RenderState();
@@ -166,5 +200,5 @@ class PlanarTextureProjection {
166
200
  }
167
201
  }
168
202
  exports.PlanarTextureProjection = PlanarTextureProjection;
169
- PlanarTextureProjection._postProjectionMatrixNpc = core_geometry_1.Matrix4d.createRowValues(/* Row 1 */ 0, 1, 0, 0, /* Row 1 */ 0, 0, 1, 0, /* Row 3 */ 1, 0, 0, 0, /* Row 4 */ 0, 0, 0, 1);
203
+ PlanarTextureProjection._postProjectionMatrixNpc = core_geometry_1.Matrix4d.createRowValues(/* Row 1 */ 0, 1, 0, 0, /* Row 2 */ 0, 0, 1, 0, /* Row 3 */ 1, 0, 0, 0, /* Row 4 */ 0, 0, 0, 1);
170
204
  //# sourceMappingURL=PlanarTextureProjection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlanarTextureProjection.js","sourceRoot":"","sources":["../../../../src/render/webgl/PlanarTextureProjection.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\r\n/** @packageDocumentation\r\n * @module Rendering\r\n */\r\n\r\nimport { Frustum, FrustumPlanes, Npc, RenderMode } from \"@itwin/core-common\";\r\nimport {\r\n ClipUtilities, ConvexClipPlaneSet, GrowableXYZArray, Map4d, Matrix3d, Matrix4d, Plane3dByOriginAndUnitNormal, Point3d, Range1d, Range2d, Range3d,\r\n Ray3d, Transform,\r\n} from \"@itwin/core-geometry\";\r\nimport { ApproximateTerrainHeights } from \"../../ApproximateTerrainHeights\";\r\nimport { Tile, TileTreeReference } from \"../../tile/internal\";\r\nimport { SceneContext } from \"../../ViewContext\";\r\nimport { ViewState3d } from \"../../ViewState\";\r\nimport { RenderState } from \"./RenderState\";\r\nimport { Target } from \"./Target\";\r\n\r\nconst scratchRange = Range3d.createNull();\r\nconst scratchMap4d = Map4d.createIdentity();\r\nconst scratchMatrix4d = Matrix4d.createIdentity();\r\nexport class PlanarTextureProjection {\r\n private static _postProjectionMatrixNpc = Matrix4d.createRowValues(/* Row 1 */ 0, 1, 0, 0, /* Row 1 */ 0, 0, 1, 0, /* Row 3 */ 1, 0, 0, 0, /* Row 4 */ 0, 0, 0, 1);\r\n\r\n public static computePlanarTextureProjection(\r\n texturePlane: Plane3dByOriginAndUnitNormal,\r\n sceneContext: SceneContext,\r\n target: { tiles: Tile[], location: Transform },\r\n drapeRefs: TileTreeReference[],\r\n viewState: ViewState3d,\r\n textureWidth: number,\r\n textureHeight: number,\r\n _heightRange?: Range1d): { textureFrustum?: Frustum, worldToViewMap?: Map4d, projectionMatrix?: Matrix4d, debugFrustum?: Frustum, zValue?: number } {\r\n const textureZ = texturePlane.getNormalRef();\r\n const viewingSpace = sceneContext.viewingSpace;\r\n const viewX = viewingSpace.rotation.rowX();\r\n const viewZ = viewingSpace.rotation.rowZ();\r\n const minCrossMagnitude = 1.0E-4;\r\n\r\n if (viewZ === undefined)\r\n return {}; // View without depth?....\r\n\r\n let textureX = viewZ.crossProduct(textureZ);\r\n let textureY;\r\n if (textureX.magnitude() < minCrossMagnitude) {\r\n textureY = viewX.crossProduct(textureZ);\r\n textureX = textureY.crossProduct(textureZ).normalize()!;\r\n } else {\r\n textureX.normalizeInPlace();\r\n textureY = textureZ.crossProduct(textureX).normalize()!;\r\n }\r\n\r\n const frustumX = textureZ, frustumY = textureX, frustumZ = textureY;\r\n const textureMatrix = Matrix3d.createRows(frustumX, frustumY, frustumZ);\r\n const textureTransform = Transform.createRefs(Point3d.createZero(), textureMatrix);\r\n const viewFrustum = viewingSpace.getFrustum().transformBy(textureTransform);\r\n const viewPlanes = FrustumPlanes.fromFrustum(viewFrustum);\r\n const viewClipPlanes = ConvexClipPlaneSet.createPlanes(viewPlanes.planes);\r\n\r\n let textureRange = Range3d.createNull();\r\n const tileToTexture = textureTransform.multiplyTransformTransform(target.location);\r\n for (const tile of target.tiles) {\r\n textureRange.extendRange(tileToTexture.multiplyRange(tile.range, scratchRange));\r\n }\r\n\r\n if (textureRange.isNull)\r\n return {};\r\n\r\n textureRange = ClipUtilities.rangeOfClipperIntersectionWithRange(viewClipPlanes, textureRange);\r\n\r\n const drapeRange = Range3d.createNull();\r\n for (const drapeRef of drapeRefs) {\r\n const drapeTree = drapeRef.treeOwner.tileTree;\r\n\r\n if (!drapeTree)\r\n return {};\r\n if (drapeTree.isContentUnbounded) {\r\n let heightRange = viewingSpace.getTerrainHeightRange();\r\n if (!heightRange)\r\n heightRange = ApproximateTerrainHeights.instance.globalHeightRange;\r\n\r\n textureRange.low.x = Math.min(textureRange.low.x, heightRange.low);\r\n textureRange.high.x = Math.max(textureRange.high.x, heightRange.high);\r\n } else {\r\n const contentRange = textureTransform.multiplyRange(drapeRef.computeWorldContentRange());\r\n if (!contentRange.isNull)\r\n drapeRange.extendRange(contentRange);\r\n }\r\n }\r\n if (!drapeRange.isNull) {\r\n // Union of height\r\n textureRange.low.x = Math.min(textureRange.low.x, drapeRange.low.x);\r\n textureRange.high.x = Math.max(textureRange.high.x, drapeRange.high.x);\r\n\r\n // Intersection of texture extents.\r\n textureRange.low.y = Math.max(textureRange.low.y, drapeRange.low.y);\r\n textureRange.high.y = Math.min(textureRange.high.y, drapeRange.high.y);\r\n textureRange.low.z = Math.max(textureRange.low.z, drapeRange.low.z);\r\n textureRange.high.z = Math.min(textureRange.high.z, drapeRange.high.z);\r\n }\r\n\r\n const epsilon = .01;\r\n textureRange.low.x -= epsilon;\r\n textureRange.high.x += epsilon;\r\n\r\n const textureFrustum = Frustum.fromRange(textureRange);\r\n const debugFrustum = textureFrustum.clone();\r\n textureTransform.multiplyInversePoint3dArray(debugFrustum.points, debugFrustum.points);\r\n\r\n if (viewState.isCameraOn) {\r\n const eyeHeight = (textureRange.low.x + textureRange.high.x) / 2.0;\r\n const eyePlane = Plane3dByOriginAndUnitNormal.create(Point3d.createScale(textureZ, eyeHeight), textureZ); // Centered in range - parallel to texture.\r\n const projectionRay = Ray3d.create(viewState.getEyePoint(), viewZ.crossProduct(textureX).normalize()!);\r\n let projectionDistance = projectionRay.intersectionWithPlane(eyePlane!);\r\n const minNearToFarRatio = .01; // Smaller value allows texture projection to conform tightly to view frustum.\r\n if (undefined !== projectionDistance) {\r\n projectionDistance = Math.max(.1, projectionDistance);\r\n const eyePoint = textureTransform.multiplyPoint3d(projectionRay.fractionToPoint(projectionDistance));\r\n let near = eyePoint.z - textureRange.high.z;\r\n let far = eyePoint.z - textureRange.low.z;\r\n\r\n if (near / far < minNearToFarRatio) {\r\n // If the near-far ratio is less than minimum move the camera back.\r\n far = (textureRange.high.z - textureRange.low.z) / (1.0 - minNearToFarRatio);\r\n near = far * minNearToFarRatio;\r\n eyePoint.z = near + textureRange.high.z;\r\n }\r\n const farRange = Range2d.createNull();\r\n const nearRange = Range2d.createNull();\r\n // Create a frustum that includes the entire view frustum and all Z values.\r\n nearRange.low.x = textureRange.low.x;\r\n nearRange.high.x = textureRange.high.x;\r\n farRange.low.x = eyePoint.x + far / near * (textureRange.low.x - eyePoint.x);\r\n farRange.high.x = eyePoint.x + far / near * (textureRange.high.x - eyePoint.x);\r\n ClipUtilities.announceLoopsOfConvexClipPlaneSetIntersectRange(viewClipPlanes, textureRange, (points: GrowableXYZArray) => {\r\n points.getPoint3dArray().forEach((rangePoint) => {\r\n const farScale = far / (eyePoint.z - rangePoint.z);\r\n const nearScale = near / (eyePoint.z - rangePoint.z);\r\n const nearY = eyePoint.y + nearScale * (rangePoint.y - eyePoint.y);\r\n const farY = eyePoint.y + farScale * (rangePoint.y - eyePoint.y);\r\n nearRange.low.y = Math.min(nearRange.low.y, nearY);\r\n nearRange.high.y = Math.max(nearRange.high.y, nearY);\r\n farRange.low.y = Math.min(farRange.low.y, farY);\r\n farRange.high.y = Math.max(farRange.high.y, farY);\r\n });\r\n });\r\n textureFrustum.points[Npc._000].set(farRange.low.x, farRange.low.y, eyePoint.z - far);\r\n textureFrustum.points[Npc._100].set(farRange.high.x, farRange.low.y, eyePoint.z - far);\r\n textureFrustum.points[Npc._010].set(farRange.low.x, farRange.high.y, eyePoint.z - far);\r\n textureFrustum.points[Npc._110].set(farRange.high.x, farRange.high.y, eyePoint.z - far);\r\n textureFrustum.points[Npc._001].set(nearRange.low.x, nearRange.low.y, eyePoint.z - near);\r\n textureFrustum.points[Npc._101].set(nearRange.high.x, nearRange.low.y, eyePoint.z - near);\r\n textureFrustum.points[Npc._011].set(nearRange.low.x, nearRange.high.y, eyePoint.z - near);\r\n textureFrustum.points[Npc._111].set(nearRange.high.x, nearRange.high.y, eyePoint.z - near);\r\n }\r\n }\r\n textureMatrix.transposeInPlace();\r\n textureMatrix.multiplyVectorArrayInPlace(textureFrustum.points);\r\n const frustumMap = textureFrustum.toMap4d();\r\n if (undefined === frustumMap) {\r\n return {};\r\n }\r\n const worldToNpc = PlanarTextureProjection._postProjectionMatrixNpc.multiplyMatrixMatrix(frustumMap.transform0);\r\n const npcToView = Map4d.createBoxMap(Point3d.create(0, 0, 0), Point3d.create(1, 1, 1), Point3d.create(0, 0, 0), Point3d.create(textureWidth, textureHeight, 1), scratchMap4d)!;\r\n const npcToWorld = worldToNpc.createInverse(scratchMatrix4d);\r\n if (undefined === npcToWorld) {\r\n return {};\r\n }\r\n const worldToNpcMap = Map4d.createRefs(worldToNpc, npcToWorld);\r\n const worldToViewMap = npcToView.multiplyMapMap(worldToNpcMap);\r\n\r\n return { textureFrustum, projectionMatrix: worldToNpc, worldToViewMap, debugFrustum };\r\n }\r\n\r\n public static getTextureDrawingParams(target: Target) {\r\n const state = new RenderState();\r\n state.flags.depthMask = false;\r\n state.flags.blend = false;\r\n state.flags.depthTest = false;\r\n\r\n const viewFlags = target.currentViewFlags.copy({\r\n renderMode: RenderMode.SmoothShade,\r\n wiremesh: false,\r\n transparency: false,\r\n textures: false,\r\n lighting: false,\r\n shadows: false,\r\n monochrome: false,\r\n materials: false,\r\n ambientOcclusion: false,\r\n visibleEdges: false,\r\n hiddenEdges: false,\r\n });\r\n\r\n return { state, viewFlags };\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"PlanarTextureProjection.js","sourceRoot":"","sources":["../../../../src/render/webgl/PlanarTextureProjection.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\r\n/** @packageDocumentation\r\n * @module Rendering\r\n */\r\n\r\nimport { Frustum, FrustumPlanes, Npc, RenderMode } from \"@itwin/core-common\";\r\nimport {\r\n ClipUtilities, ConvexClipPlaneSet, GrowableXYZArray, Map4d, Matrix3d, Matrix4d, Plane3dByOriginAndUnitNormal, Point3d, Range1d, Range2d, Range3d,\r\n Ray3d, Transform,\r\n} from \"@itwin/core-geometry\";\r\nimport { ApproximateTerrainHeights } from \"../../ApproximateTerrainHeights\";\r\nimport { Tile, TileTreeReference } from \"../../tile/internal\";\r\nimport { SceneContext } from \"../../ViewContext\";\r\nimport { ViewState3d } from \"../../ViewState\";\r\nimport { RenderState } from \"./RenderState\";\r\nimport { Target } from \"./Target\";\r\n\r\nconst scratchRange = Range3d.createNull();\r\nconst scratchMap4d = Map4d.createIdentity();\r\nconst scratchMatrix4d = Matrix4d.createIdentity();\r\nexport class PlanarTextureProjection {\r\n private static _postProjectionMatrixNpc = Matrix4d.createRowValues(/* Row 1 */ 0, 1, 0, 0, /* Row 2 */ 0, 0, 1, 0, /* Row 3 */ 1, 0, 0, 0, /* Row 4 */ 0, 0, 0, 1);\r\n\r\n private static isTileRangeInBounds(tileRange: Range3d, drapeRange: Range3d): boolean {\r\n // return false if tile is outside of drapeRange, ignoring height (x) for this\r\n if (tileRange.low.y > drapeRange.high.y || tileRange.high.y < drapeRange.low.y)\r\n return false;\r\n if (tileRange.low.z > drapeRange.high.z || tileRange.high.z < drapeRange.low.z)\r\n return false;\r\n return true;\r\n }\r\n\r\n public static computePlanarTextureProjection(\r\n texturePlane: Plane3dByOriginAndUnitNormal,\r\n sceneContext: SceneContext,\r\n target: { tiles: Tile[], location: Transform },\r\n drapeRefs: TileTreeReference[],\r\n viewState: ViewState3d,\r\n textureWidth: number,\r\n textureHeight: number,\r\n maskRange: Range3d,\r\n _heightRange?: Range1d): { textureFrustum?: Frustum, worldToViewMap?: Map4d, projectionMatrix?: Matrix4d, debugFrustum?: Frustum } {\r\n const textureZ = texturePlane.getNormalRef();\r\n const viewingSpace = sceneContext.viewingSpace;\r\n const viewX = viewingSpace.rotation.rowX();\r\n const viewZ = viewingSpace.rotation.rowZ();\r\n const minCrossMagnitude = 1.0E-4;\r\n\r\n if (viewZ === undefined)\r\n return {}; // View without depth?....\r\n\r\n let textureX = viewZ.crossProduct(textureZ);\r\n let textureY;\r\n if (textureX.magnitude() < minCrossMagnitude) {\r\n textureY = viewX.crossProduct(textureZ);\r\n textureX = textureY.crossProduct(textureZ).normalize()!;\r\n } else {\r\n textureX.normalizeInPlace();\r\n textureY = textureZ.crossProduct(textureX).normalize()!;\r\n }\r\n\r\n const frustumX = textureZ, frustumY = textureX, frustumZ = textureY;\r\n const textureMatrix = Matrix3d.createRows(frustumX, frustumY, frustumZ);\r\n const textureTransform = Transform.createRefs(Point3d.createZero(), textureMatrix);\r\n const viewFrustum = viewingSpace.getFrustum().transformBy(textureTransform);\r\n const viewPlanes = FrustumPlanes.fromFrustum(viewFrustum);\r\n const viewClipPlanes = ConvexClipPlaneSet.createPlanes(viewPlanes.planes);\r\n\r\n const contentUnBoundedRange = Range1d.createNull();\r\n\r\n // calculate drapeRange from drapeRefs (mask references or drape reference).\r\n const drapeRange = Range3d.createNull();\r\n for (const drapeRef of drapeRefs) {\r\n const drapeTree = drapeRef.treeOwner.tileTree;\r\n if (!drapeTree)\r\n return {};\r\n if (drapeTree.isContentUnbounded) {\r\n let heightRange = viewingSpace.getTerrainHeightRange();\r\n if (!heightRange)\r\n heightRange = ApproximateTerrainHeights.instance.globalHeightRange;\r\n contentUnBoundedRange.low = Math.min(contentUnBoundedRange.low, heightRange.low);\r\n contentUnBoundedRange.high = Math.max(contentUnBoundedRange.high, heightRange.high);\r\n } else if (maskRange.isNull) {\r\n const r = Range3d.createNull();\r\n drapeRef.unionFitRange(r);\r\n const contentRange = textureTransform.multiplyRange(r);\r\n if (!contentRange.isNull)\r\n drapeRange.extendRange(contentRange);\r\n } else {\r\n const contentRange = textureTransform.multiplyRange(maskRange);\r\n drapeRange.extendRange(contentRange);\r\n }\r\n }\r\n\r\n // get range of only the tiles to be masked or draped onto.\r\n let textureRange = Range3d.createNull();\r\n const tileToTexture = textureTransform.multiplyTransformTransform(target.location);\r\n for (const tile of target.tiles) {\r\n tileToTexture.multiplyRange(tile.range, scratchRange);\r\n // Skip tile if it is outside of drapeRange because we don't want the extra heights from distant tiles included.\r\n if (drapeRange.isNull || PlanarTextureProjection.isTileRangeInBounds(scratchRange, drapeRange))\r\n textureRange.extendRange(scratchRange);\r\n }\r\n\r\n if (textureRange.isNull)\r\n return {};\r\n\r\n textureRange = ClipUtilities.rangeOfClipperIntersectionWithRange(viewClipPlanes, textureRange);\r\n\r\n if (!contentUnBoundedRange.isNull) {\r\n // Union of height\r\n textureRange.low.x = Math.min(textureRange.low.x, contentUnBoundedRange.low);\r\n textureRange.high.x = Math.max(textureRange.high.x, contentUnBoundedRange.high);\r\n }\r\n\r\n if (!drapeRange.isNull) {\r\n // Union of height\r\n textureRange.low.x = Math.min(textureRange.low.x, drapeRange.low.x);\r\n textureRange.high.x = Math.max(textureRange.high.x, drapeRange.high.x);\r\n\r\n // Intersection of texture extents.\r\n textureRange.low.y = Math.max(textureRange.low.y, drapeRange.low.y);\r\n textureRange.high.y = Math.min(textureRange.high.y, drapeRange.high.y);\r\n textureRange.low.z = Math.max(textureRange.low.z, drapeRange.low.z);\r\n textureRange.high.z = Math.min(textureRange.high.z, drapeRange.high.z);\r\n }\r\n\r\n const epsilon = .01;\r\n textureRange.low.x -= epsilon;\r\n textureRange.high.x += epsilon;\r\n\r\n const textureFrustum = Frustum.fromRange(textureRange);\r\n let debugFrustum;\r\n if (true) // debugFrustum as textureRange.\r\n debugFrustum = textureFrustum.clone();\r\n else // debugFrustum as drapeRange.\r\n debugFrustum = Frustum.fromRange(drapeRange);\r\n\r\n textureTransform.multiplyInversePoint3dArray(debugFrustum.points, debugFrustum.points);\r\n\r\n const viewZVecZ = viewState.getRotation().rowZ().z;\r\n\r\n // This code attempts to use a projection frustum that aligns to the camera frustum in order to get higher mask resolution closer to the eye.\r\n // Limit its use to views that have an eyepoint above the bottom of the frustum and are looking down at a view angle > 5 degrees, otherwise it causes issues.\r\n // viewZVecZ is negative when looking up, positive when looking down.\r\n if (viewState.isCameraOn && viewState.getEyePoint().z > textureRange.low.x && viewZVecZ > 0.09) {\r\n // NB moved the eyePlane from the center to the bottom of the textureRange to solve problems when the eye was below the eyePlane.\r\n const eyePlane = Plane3dByOriginAndUnitNormal.create(Point3d.createScale(textureZ, textureRange.low.x), textureZ); // at bottom of range - parallel to texture.\r\n const projectionRay = Ray3d.create(viewState.getEyePoint(), viewZ.crossProduct(textureX).normalize()!);\r\n let projectionDistance = projectionRay.intersectionWithPlane(eyePlane!);\r\n const minNearToFarRatio = .01; // Smaller value allows texture projection to conform tightly to view frustum.\r\n if (undefined !== projectionDistance) {\r\n projectionDistance = Math.max(.1, projectionDistance);\r\n const eyePoint = textureTransform.multiplyPoint3d(projectionRay.fractionToPoint(projectionDistance));\r\n let near = eyePoint.z - textureRange.high.z;\r\n let far = eyePoint.z - textureRange.low.z;\r\n\r\n if (near / far < minNearToFarRatio) {\r\n // If the near-far ratio is less than minimum move the camera back.\r\n far = (textureRange.high.z - textureRange.low.z) / (1.0 - minNearToFarRatio);\r\n near = far * minNearToFarRatio;\r\n eyePoint.z = near + textureRange.high.z;\r\n }\r\n const farRange = Range2d.createNull();\r\n const nearRange = Range2d.createNull();\r\n // Create a frustum that includes the entire view frustum and all Z values.\r\n nearRange.low.x = textureRange.low.x;\r\n nearRange.high.x = textureRange.high.x;\r\n farRange.low.x = eyePoint.x + far / near * (textureRange.low.x - eyePoint.x);\r\n farRange.high.x = eyePoint.x + far / near * (textureRange.high.x - eyePoint.x);\r\n ClipUtilities.announceLoopsOfConvexClipPlaneSetIntersectRange(viewClipPlanes, textureRange, (points: GrowableXYZArray) => {\r\n points.getPoint3dArray().forEach((rangePoint) => {\r\n const farScale = far / (eyePoint.z - rangePoint.z);\r\n const nearScale = near / (eyePoint.z - rangePoint.z);\r\n const nearY = eyePoint.y + nearScale * (rangePoint.y - eyePoint.y);\r\n const farY = eyePoint.y + farScale * (rangePoint.y - eyePoint.y);\r\n nearRange.low.y = Math.min(nearRange.low.y, nearY);\r\n nearRange.high.y = Math.max(nearRange.high.y, nearY);\r\n farRange.low.y = Math.min(farRange.low.y, farY);\r\n farRange.high.y = Math.max(farRange.high.y, farY);\r\n });\r\n });\r\n // Set NPC from results.\r\n textureFrustum.points[Npc._000].set(farRange.low.x, farRange.low.y, eyePoint.z - far);\r\n textureFrustum.points[Npc._100].set(farRange.high.x, farRange.low.y, eyePoint.z - far);\r\n textureFrustum.points[Npc._010].set(farRange.low.x, farRange.high.y, eyePoint.z - far);\r\n textureFrustum.points[Npc._110].set(farRange.high.x, farRange.high.y, eyePoint.z - far);\r\n textureFrustum.points[Npc._001].set(nearRange.low.x, nearRange.low.y, eyePoint.z - near);\r\n textureFrustum.points[Npc._101].set(nearRange.high.x, nearRange.low.y, eyePoint.z - near);\r\n textureFrustum.points[Npc._011].set(nearRange.low.x, nearRange.high.y, eyePoint.z - near);\r\n textureFrustum.points[Npc._111].set(nearRange.high.x, nearRange.high.y, eyePoint.z - near);\r\n }\r\n }\r\n textureMatrix.transposeInPlace();\r\n textureMatrix.multiplyVectorArrayInPlace(textureFrustum.points);\r\n const frustumMap = textureFrustum.toMap4d();\r\n if (undefined === frustumMap) {\r\n return {};\r\n }\r\n const worldToNpc = PlanarTextureProjection._postProjectionMatrixNpc.multiplyMatrixMatrix(frustumMap.transform0);\r\n const npcToView = Map4d.createBoxMap(Point3d.create(0, 0, 0), Point3d.create(1, 1, 1), Point3d.create(0, 0, 0), Point3d.create(textureWidth, textureHeight, 1), scratchMap4d)!;\r\n const npcToWorld = worldToNpc.createInverse(scratchMatrix4d);\r\n if (undefined === npcToWorld) {\r\n return {};\r\n }\r\n const worldToNpcMap = Map4d.createRefs(worldToNpc, npcToWorld);\r\n const worldToViewMap = npcToView.multiplyMapMap(worldToNpcMap);\r\n\r\n return { textureFrustum, worldToViewMap, projectionMatrix: worldToNpc, debugFrustum };\r\n }\r\n\r\n public static getTextureDrawingParams(target: Target) {\r\n const state = new RenderState();\r\n state.flags.depthMask = false;\r\n state.flags.blend = false;\r\n state.flags.depthTest = false;\r\n\r\n const viewFlags = target.currentViewFlags.copy({\r\n renderMode: RenderMode.SmoothShade,\r\n wiremesh: false,\r\n transparency: false,\r\n textures: false,\r\n lighting: false,\r\n shadows: false,\r\n monochrome: false,\r\n materials: false,\r\n ambientOcclusion: false,\r\n visibleEdges: false,\r\n hiddenEdges: false,\r\n });\r\n\r\n return { state, viewFlags };\r\n }\r\n}\r\n"]}
@@ -79,7 +79,7 @@ const shadowMapWidth = 4096; // size of original depth buffer map
79
79
  const shadowMapHeight = shadowMapWidth; // TBD - Adjust for aspect ratio.
80
80
  const evsmWidth = shadowMapWidth / 2; // EVSM buffer is 1/2 size each direction
81
81
  const evsmHeight = shadowMapHeight / 2;
82
- const postProjectionMatrixNpc = core_geometry_1.Matrix4d.createRowValues(/* Row 1 */ 0, 1, 0, 0, /* Row 1 */ 0, 0, 1, 0, /* Row 3 */ 1, 0, 0, 0, /* Row 4 */ 0, 0, 0, 1);
82
+ const postProjectionMatrixNpc = core_geometry_1.Matrix4d.createRowValues(/* Row 1 */ 0, 1, 0, 0, /* Row 2 */ 0, 0, 1, 0, /* Row 3 */ 1, 0, 0, 0, /* Row 4 */ 0, 0, 0, 1);
83
83
  // Bundles up the disposable, create-once-and-reuse members of a SolarShadowMap.
84
84
  class Bundle {
85
85
  constructor(depthTexture, shadowMapTexture, fbo, fboSM, evsmGeom, renderCommands) {
@@ -275,7 +275,7 @@ class SolarShadowMap {
275
275
  viewTileRange.clone(shadowRange);
276
276
  // Expand shadow range to include both the shadowers and shadowed portion of background map.
277
277
  scratchFrustum.initFromRange(shadowRange);
278
- mapToWorld.multiplyPoint3dArrayQuietNormalize(scratchFrustum.points); // This frustum represents the shadwowing geometry. Intersect it with background geometry and expand the range depth to include that intersection.
278
+ mapToWorld.multiplyPoint3dArrayQuietNormalize(scratchFrustum.points); // This frustum represents the shadowing geometry. Intersect it with background geometry and expand the range depth to include that intersection.
279
279
  const backgroundMapGeometry = context.viewport.view.displayStyle.getBackgroundMapGeometry();
280
280
  if (undefined !== backgroundMapGeometry) {
281
281
  const backgroundDepthRange = backgroundMapGeometry.getFrustumIntersectionDepthRange(this._shadowFrustum, iModel.projectExtents);