@itwin/core-frontend 3.0.0-dev.184 → 3.0.0-dev.185

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 (47) hide show
  1. package/lib/cjs/ImageUtil.d.ts +3 -3
  2. package/lib/cjs/ImageUtil.js +3 -3
  3. package/lib/cjs/ImageUtil.js.map +1 -1
  4. package/lib/cjs/NoRenderApp.d.ts +0 -1
  5. package/lib/cjs/NoRenderApp.d.ts.map +1 -1
  6. package/lib/cjs/NoRenderApp.js +0 -1
  7. package/lib/cjs/NoRenderApp.js.map +1 -1
  8. package/lib/cjs/SheetViewState.js +2 -2
  9. package/lib/cjs/SheetViewState.js.map +1 -1
  10. package/lib/cjs/Viewport.d.ts +27 -2
  11. package/lib/cjs/Viewport.d.ts.map +1 -1
  12. package/lib/cjs/Viewport.js +12 -2
  13. package/lib/cjs/Viewport.js.map +1 -1
  14. package/lib/cjs/render/RenderTarget.d.ts +3 -2
  15. package/lib/cjs/render/RenderTarget.d.ts.map +1 -1
  16. package/lib/cjs/render/RenderTarget.js +2 -1
  17. package/lib/cjs/render/RenderTarget.js.map +1 -1
  18. package/lib/cjs/render/webgl/Target.d.ts +2 -1
  19. package/lib/cjs/render/webgl/Target.d.ts.map +1 -1
  20. package/lib/cjs/render/webgl/Target.js +63 -1
  21. package/lib/cjs/render/webgl/Target.js.map +1 -1
  22. package/lib/cjs/tools/ViewTool.js +1 -1
  23. package/lib/cjs/tools/ViewTool.js.map +1 -1
  24. package/lib/esm/ImageUtil.d.ts +3 -3
  25. package/lib/esm/ImageUtil.js +3 -3
  26. package/lib/esm/ImageUtil.js.map +1 -1
  27. package/lib/esm/NoRenderApp.d.ts +0 -1
  28. package/lib/esm/NoRenderApp.d.ts.map +1 -1
  29. package/lib/esm/NoRenderApp.js +0 -1
  30. package/lib/esm/NoRenderApp.js.map +1 -1
  31. package/lib/esm/SheetViewState.js +2 -2
  32. package/lib/esm/SheetViewState.js.map +1 -1
  33. package/lib/esm/Viewport.d.ts +27 -2
  34. package/lib/esm/Viewport.d.ts.map +1 -1
  35. package/lib/esm/Viewport.js +12 -2
  36. package/lib/esm/Viewport.js.map +1 -1
  37. package/lib/esm/render/RenderTarget.d.ts +3 -2
  38. package/lib/esm/render/RenderTarget.d.ts.map +1 -1
  39. package/lib/esm/render/RenderTarget.js +2 -1
  40. package/lib/esm/render/RenderTarget.js.map +1 -1
  41. package/lib/esm/render/webgl/Target.d.ts +2 -1
  42. package/lib/esm/render/webgl/Target.d.ts.map +1 -1
  43. package/lib/esm/render/webgl/Target.js +63 -1
  44. package/lib/esm/render/webgl/Target.js.map +1 -1
  45. package/lib/esm/tools/ViewTool.js +1 -1
  46. package/lib/esm/tools/ViewTool.js.map +1 -1
  47. package/package.json +20 -20
@@ -15,7 +15,7 @@ import { ViewRect } from "./ViewRect";
15
15
  export declare function canvasToResizedCanvasWithBars(canvasIn: HTMLCanvasElement, targetSize: Point2d, barSize?: Point2d, barStyle?: string): HTMLCanvasElement;
16
16
  /** Create a canvas element with the same dimensions and contents as an image buffer.
17
17
  * @param buffer the source [[ImageBuffer]] object from which the [HTMLCanvasElement](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement) object will be constructed.
18
- * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImage]]).
18
+ * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImageBuffer]]).
19
19
  * @returns an [HTMLCanvasElement](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement) object containing the contents of the source image buffer, or undefined if the conversion fails.
20
20
  * @public
21
21
  */
@@ -65,7 +65,7 @@ export declare function extractImageSourceDimensions(source: ImageSource): Promi
65
65
  /**
66
66
  * Produces a data url in "image/png" format from the contents of an ImageBuffer.
67
67
  * @param buffer The ImageBuffer, of any format.
68
- * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImage]]).
68
+ * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImageBuffer]]).
69
69
  * @returns a data url as a string suitable for setting as the `src` property of an HTMLImageElement, or undefined if the url could not be created.
70
70
  * @public
71
71
  */
@@ -73,7 +73,7 @@ export declare function imageBufferToPngDataUrl(buffer: ImageBuffer, preserveAlp
73
73
  /**
74
74
  * Converts the contents of an ImageBuffer to PNG format.
75
75
  * @param buffer The ImageBuffer, of any format.
76
- * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImage]]).
76
+ * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImageBuffer]]).
77
77
  * @returns a base64-encoded string representing the image as a PNG, or undefined if the conversion failed.
78
78
  * @public
79
79
  */
@@ -58,7 +58,7 @@ function canvasToResizedCanvasWithBars(canvasIn, targetSize, barSize = new core_
58
58
  exports.canvasToResizedCanvasWithBars = canvasToResizedCanvasWithBars;
59
59
  /** Create a canvas element with the same dimensions and contents as an image buffer.
60
60
  * @param buffer the source [[ImageBuffer]] object from which the [HTMLCanvasElement](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement) object will be constructed.
61
- * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImage]]).
61
+ * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImageBuffer]]).
62
62
  * @returns an [HTMLCanvasElement](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement) object containing the contents of the source image buffer, or undefined if the conversion fails.
63
63
  * @public
64
64
  */
@@ -222,7 +222,7 @@ exports.extractImageSourceDimensions = extractImageSourceDimensions;
222
222
  /**
223
223
  * Produces a data url in "image/png" format from the contents of an ImageBuffer.
224
224
  * @param buffer The ImageBuffer, of any format.
225
- * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImage]]).
225
+ * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImageBuffer]]).
226
226
  * @returns a data url as a string suitable for setting as the `src` property of an HTMLImageElement, or undefined if the url could not be created.
227
227
  * @public
228
228
  */
@@ -235,7 +235,7 @@ exports.imageBufferToPngDataUrl = imageBufferToPngDataUrl;
235
235
  /**
236
236
  * Converts the contents of an ImageBuffer to PNG format.
237
237
  * @param buffer The ImageBuffer, of any format.
238
- * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImage]]).
238
+ * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImageBuffer]]).
239
239
  * @returns a base64-encoded string representing the image as a PNG, or undefined if the conversion failed.
240
240
  * @public
241
241
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ImageUtil.js","sourceRoot":"","sources":["../../src/ImageUtil.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Rendering\r\n */\r\n\r\nimport { ProcessDetector } from \"@itwin/core-bentley\";\r\nimport { Point2d } from \"@itwin/core-geometry\";\r\nimport { ImageBuffer, ImageBufferFormat, ImageSource, ImageSourceFormat } from \"@itwin/core-common\";\r\nimport { ViewRect } from \"./ViewRect\";\r\n\r\ninterface Rgba {\r\n r: number;\r\n g: number;\r\n b: number;\r\n a: number;\r\n}\r\n\r\nconst scratchRgba = { r: 0, g: 0, b: 0, a: 0 };\r\n\r\nfunction rgbaFromAlpha(rgba: Rgba, src: Uint8Array, idx: number): number {\r\n rgba.r = rgba.g = rgba.b = rgba.a = src[idx];\r\n return idx + 1;\r\n}\r\n\r\nfunction rgbaFromRgb(rgba: Rgba, src: Uint8Array, idx: number): number {\r\n rgba.r = src[idx + 0];\r\n rgba.g = src[idx + 1];\r\n rgba.b = src[idx + 2];\r\n rgba.a = 255;\r\n return idx + 3;\r\n}\r\n\r\nfunction rgbaFromRgba(rgba: Rgba, src: Uint8Array, idx: number): number {\r\n rgbaFromRgb(rgba, src, idx);\r\n rgba.a = src[idx + 3];\r\n return idx + 4;\r\n}\r\n\r\n/** Resize a canvas to a desired size. The final size will be targetSize plus barSize. The original canvas is left untouched and a new, resized canvas with potential side bars is returned.\r\n * @param canvasIn the source [HTMLCanvasElement](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement) to resize.\r\n * @param targetSize the desired new size for the canvas image.\r\n * @param barSize total size of side bars to add to the image in width and height; defaults to (0, 0). For example, if you specify (2, 0), a 1 pixel side bar will be added to the left and right sides of the resized image. If an odd dimension is specified, the left or upper side of the image will be one pixel larger than the opposite side. For example, if you specify (1, 0), a 1 pixel side bar will be added to the left side of the image and a 0 pixel side bar will be added to the right side of the image.\r\n * @param barStyle CSS style string to apply to any side bars; defaults to \"#C0C0C0\", which is silver.\r\n * @returns an [HTMLCanvasElement](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement) object containing the resized image and any requested side bars.\r\n * @public\r\n */\r\nexport function canvasToResizedCanvasWithBars(canvasIn: HTMLCanvasElement, targetSize: Point2d, barSize = new Point2d(0, 0), barStyle = \"#C0C0C0\"): HTMLCanvasElement {\r\n const canvasOut = document.createElement(\"canvas\");\r\n canvasOut.width = targetSize.x + barSize.x;\r\n canvasOut.height = targetSize.y + barSize.y;\r\n\r\n let adjustImageX = barSize.x / 2;\r\n let adjustImageY = barSize.y / 2;\r\n\r\n if (1 === barSize.x % 2) {\r\n adjustImageX += 0.5;\r\n }\r\n if (1 === barSize.y % 2) {\r\n adjustImageY += 0.5;\r\n }\r\n\r\n const context = canvasOut.getContext(\"2d\")!;\r\n context.fillStyle = barStyle;\r\n context.fillRect(0, 0, canvasOut.width, canvasOut.height);\r\n context.drawImage(canvasIn, adjustImageX, adjustImageY, targetSize.x, targetSize.y);\r\n return canvasOut;\r\n}\r\n\r\n/** Create a canvas element with the same dimensions and contents as an image buffer.\r\n * @param buffer the source [[ImageBuffer]] object from which the [HTMLCanvasElement](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement) object will be constructed.\r\n * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImage]]).\r\n * @returns an [HTMLCanvasElement](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement) object containing the contents of the source image buffer, or undefined if the conversion fails.\r\n * @public\r\n */\r\nexport function imageBufferToCanvas(buffer: ImageBuffer, preserveAlpha: boolean = true): HTMLCanvasElement | undefined {\r\n const canvas = document.createElement(\"canvas\");\r\n if (null === canvas)\r\n return undefined;\r\n\r\n canvas.width = buffer.width;\r\n canvas.height = buffer.height;\r\n\r\n const context = canvas.getContext(\"2d\");\r\n if (null === context)\r\n return undefined;\r\n\r\n const imageData = context.createImageData(buffer.width, buffer.height);\r\n const extractRgba = ImageBufferFormat.Alpha === buffer.format ? rgbaFromAlpha : (ImageBufferFormat.Rgb === buffer.format ? rgbaFromRgb : rgbaFromRgba);\r\n\r\n const bufferData = buffer.data;\r\n let i = 0;\r\n let j = 0;\r\n const rgba = scratchRgba;\r\n while (i < bufferData.length) {\r\n i = extractRgba(rgba, bufferData, i);\r\n imageData.data[j + 0] = rgba.r;\r\n imageData.data[j + 1] = rgba.g;\r\n imageData.data[j + 2] = rgba.b;\r\n imageData.data[j + 3] = preserveAlpha ? rgba.a : 0xff;\r\n j += 4;\r\n }\r\n\r\n context.putImageData(imageData, 0, 0);\r\n return canvas;\r\n}\r\n\r\n/** Create an ImageBuffer in the specified format with the same dimensions and contents as a canvas.\r\n * @param canvas the source [HTMLCanvasElement](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement) object from which the [[ImageBuffer]] object will be constructed.\r\n * @param format the desired format of the created ImageBuffer; defaults to [[ImageBufferFormat.Rgba]].\r\n * @returns an [[ImageBuffer]] object containing the contents of the source canvas, or undefined if the conversion fails.\r\n * @public\r\n */\r\nexport function canvasToImageBuffer(canvas: HTMLCanvasElement, format = ImageBufferFormat.Rgba): ImageBuffer | undefined {\r\n const context = canvas.getContext(\"2d\");\r\n if (null === context)\r\n return undefined;\r\n\r\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\r\n\r\n let imageBufferData: Uint8Array | undefined;\r\n\r\n if (ImageBufferFormat.Rgba === format) {\r\n imageBufferData = new Uint8Array(imageData.data.length);\r\n } else if (ImageBufferFormat.Rgb === format) {\r\n imageBufferData = new Uint8Array((imageData.data.length / 4) * 3);\r\n } else if (ImageBufferFormat.Alpha === format) {\r\n imageBufferData = new Uint8Array(imageData.data.length / 4);\r\n }\r\n\r\n if (undefined === imageBufferData)\r\n return undefined;\r\n\r\n let i = 0;\r\n let j = 0;\r\n while (i < imageData.data.length) {\r\n if (ImageBufferFormat.Rgba === format) {\r\n imageBufferData[j + 0] = imageData.data[i + 0];\r\n imageBufferData[j + 1] = imageData.data[i + 1];\r\n imageBufferData[j + 2] = imageData.data[i + 2];\r\n imageBufferData[j + 3] = imageData.data[i + 3];\r\n j += 4;\r\n } else if (ImageBufferFormat.Rgb === format) {\r\n imageBufferData[j + 0] = imageData.data[i + 0];\r\n imageBufferData[j + 1] = imageData.data[i + 1];\r\n imageBufferData[j + 2] = imageData.data[i + 2];\r\n j += 3;\r\n } else if (ImageBufferFormat.Alpha === format) {\r\n imageBufferData[j] = imageData.data[i + 3];\r\n j++;\r\n }\r\n i += 4;\r\n }\r\n\r\n return ImageBuffer.create(imageBufferData, format, canvas.width);\r\n}\r\n\r\n/** Get a string describing the mime type associated with an ImageSource format.\r\n * @public\r\n */\r\nexport function getImageSourceMimeType(format: ImageSourceFormat): string {\r\n\r\n switch (format) {\r\n case ImageSourceFormat.Jpeg:\r\n return \"image/jpeg\";\r\n case ImageSourceFormat.Png:\r\n return \"image/png\";\r\n case ImageSourceFormat.Svg:\r\n return \"image/svg+xml;charset=utf-8\";\r\n }\r\n return \"\";\r\n}\r\n\r\n/** Get the ImageSourceFormat corresponding to the mime type string, or undefined if the string does not identify a supported ImageSourceFormat.\r\n * @public\r\n */\r\nexport function getImageSourceFormatForMimeType(mimeType: string): ImageSourceFormat | undefined {\r\n switch (mimeType) {\r\n case \"image/jpeg\": return ImageSourceFormat.Jpeg;\r\n case \"image/png\": return ImageSourceFormat.Png;\r\n case \"image/svg+xml;charset=utf-8\": return ImageSourceFormat.Svg;\r\n default: return undefined;\r\n }\r\n}\r\n\r\n/** Extract an html Image element from a binary jpeg or png.\r\n * @param source The ImageSource containing the binary jpeg or png data.\r\n * @returns a Promise which resolves to an HTMLImageElement containing the uncompressed bitmap image in RGBA format.\r\n * @public\r\n */\r\nexport async function imageElementFromImageSource(source: ImageSource): Promise<HTMLImageElement> {\r\n const blob = new Blob([source.data], { type: getImageSourceMimeType(source.format) });\r\n return imageElementFromUrl(URL.createObjectURL(blob));\r\n}\r\n\r\n/** Create an html Image element from a URL.\r\n * @param url The URL pointing to the image data.\r\n * @returns A Promise resolving to an HTMLImageElement when the image data has been loaded from the URL.\r\n * @see tryImageElementFromUrl.\r\n * @public\r\n */\r\nexport async function imageElementFromUrl(url: string): Promise<HTMLImageElement> {\r\n // We must set crossorigin property so that images loaded from same origin can be used with texImage2d.\r\n // We must do that outside of the promise constructor or it won't work, for reasons.\r\n const image = new Image();\r\n image.crossOrigin = \"anonymous\";\r\n return new Promise((resolve: (image: HTMLImageElement) => void, reject) => {\r\n image.onload = () => resolve(image);\r\n\r\n // The \"error\" produced by Image is not an Error. It looks like an Event, but isn't one.\r\n image.onerror = () => reject(new Error(\"Failed to create image from url\"));\r\n image.src = url;\r\n });\r\n}\r\n\r\n/** Try to create an html Image element from a URL.\r\n * @param url The URL pointing to the image data.\r\n * @returns A Promise resolving to an HTMLImageElement when the image data has been loaded from the URL, or to `undefined` if an exception occurred.\r\n * @see imageElementFromUrl\r\n * @public\r\n */\r\nexport async function tryImageElementFromUrl(url: string): Promise<HTMLImageElement | undefined> {\r\n try {\r\n return await imageElementFromUrl(url);\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n/**\r\n * Extract the dimensions of the jpeg or png data encoded in an ImageSource.\r\n * @param source The ImageSource containing the binary jpeg or png data.\r\n * @returns a Promise resolving to a Point2d of which x corresponds to the integer width of the uncompressed bitmap and y to the height.\r\n * @public\r\n */\r\nexport async function extractImageSourceDimensions(source: ImageSource): Promise<Point2d> {\r\n const image = await imageElementFromImageSource(source);\r\n return new Point2d(image.naturalWidth, image.naturalHeight);\r\n}\r\n\r\n/**\r\n * Produces a data url in \"image/png\" format from the contents of an ImageBuffer.\r\n * @param buffer The ImageBuffer, of any format.\r\n * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImage]]).\r\n * @returns a data url as a string suitable for setting as the `src` property of an HTMLImageElement, or undefined if the url could not be created.\r\n * @public\r\n */\r\nexport function imageBufferToPngDataUrl(buffer: ImageBuffer, preserveAlpha = true): string | undefined {\r\n // The default format (and the only format required to be supported) for toDataUrl() is \"image/png\".\r\n const canvas = imageBufferToCanvas(buffer, preserveAlpha);\r\n return undefined !== canvas ? canvas.toDataURL() : undefined;\r\n}\r\n\r\n/**\r\n * Converts the contents of an ImageBuffer to PNG format.\r\n * @param buffer The ImageBuffer, of any format.\r\n * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImage]]).\r\n * @returns a base64-encoded string representing the image as a PNG, or undefined if the conversion failed.\r\n * @public\r\n */\r\nexport function imageBufferToBase64EncodedPng(buffer: ImageBuffer, preserveAlpha = true): string | undefined {\r\n const urlPrefix = \"data:image/png;base64,\";\r\n const url = imageBufferToPngDataUrl(buffer, preserveAlpha);\r\n if (undefined === url || !url.startsWith(urlPrefix))\r\n return undefined;\r\n\r\n return url.substring(urlPrefix.length);\r\n}\r\n\r\n/** Open an image specified as a data URL in a new window or tab. Works around differences between browsers and Electron.\r\n * @param url The base64-encoded image URL.\r\n * @param title An optional title to apply to the new window.\r\n * @beta\r\n */\r\nexport function openImageDataUrlInNewWindow(url: string, title?: string): void {\r\n if (ProcessDetector.isElectronAppFrontend) {\r\n window.open(url, title);\r\n } else {\r\n const win = window.open();\r\n if (null === win)\r\n return;\r\n\r\n const div = win.document.createElement(\"div\");\r\n div.innerHTML = `<img src='${url}'/>`;\r\n win.document.body.append(div);\r\n if (undefined !== title)\r\n win.document.title = title;\r\n }\r\n}\r\n\r\n/** Determine the maximum [[ViewRect]] that can be fitted and centered in specified ViewRect given a required aspect ratio.\r\n * @param viewRect The rectangle in which the returned rectangle is to be centered and fitted.\r\n * @param aspectRatio Ratio of width to height.\r\n * @returns A ViewRect centered in the input rectangle.\r\n * @public\r\n */\r\nexport function getCenteredViewRect(viewRect: ViewRect, aspectRatio = 1.4): ViewRect {\r\n // Determine scale that ensures ability to return an image with the prescribed aspectRatio\r\n const scale = Math.min(viewRect.width / aspectRatio, viewRect.height);\r\n const finalWidth = scale * aspectRatio;\r\n const finalHeight = scale;\r\n const left = (viewRect.width - finalWidth) / 2.0;\r\n const right = left + finalWidth;\r\n const top = (viewRect.height - finalHeight) / 2.0;\r\n const bottom = top + finalHeight;\r\n return new ViewRect(left, top, right, bottom);\r\n}\r\n\r\n/** Produce a jpeg compressed to no more than specified bytes and of no less than specified quality.\r\n * @param canvas Canvas containing the image to be compressed.\r\n * @param maxBytes Maximum size of output jpeg in bytes.\r\n * @param minCompressionQuality The minimum acceptable image quality as a number between 0 (lowest quality) and 1 (highest quality).\r\n * @returns A [data URL](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs) for the image, or `undefined` if the compression and size constraints could not be met.\r\n * @public\r\n */\r\nexport function getCompressedJpegFromCanvas(canvas: HTMLCanvasElement, maxBytes = 60000, minCompressionQuality = 0.1): string | undefined {\r\n const decrements = 0.1; // Decrements of quality\r\n const bytesPerCharacter = 2; // Assume 16-bit per character\r\n let quality = 1.0; // JPEG Compression quality\r\n\r\n while (quality > minCompressionQuality) {\r\n const data = canvas.toDataURL(\"image/jpeg\", quality);\r\n // If we are less than 60 Kb, we are good\r\n if (data.length * bytesPerCharacter < maxBytes)\r\n return data;\r\n\r\n quality -= decrements;\r\n }\r\n\r\n return undefined;\r\n}\r\n"]}
1
+ {"version":3,"file":"ImageUtil.js","sourceRoot":"","sources":["../../src/ImageUtil.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Rendering\r\n */\r\n\r\nimport { ProcessDetector } from \"@itwin/core-bentley\";\r\nimport { Point2d } from \"@itwin/core-geometry\";\r\nimport { ImageBuffer, ImageBufferFormat, ImageSource, ImageSourceFormat } from \"@itwin/core-common\";\r\nimport { ViewRect } from \"./ViewRect\";\r\n\r\ninterface Rgba {\r\n r: number;\r\n g: number;\r\n b: number;\r\n a: number;\r\n}\r\n\r\nconst scratchRgba = { r: 0, g: 0, b: 0, a: 0 };\r\n\r\nfunction rgbaFromAlpha(rgba: Rgba, src: Uint8Array, idx: number): number {\r\n rgba.r = rgba.g = rgba.b = rgba.a = src[idx];\r\n return idx + 1;\r\n}\r\n\r\nfunction rgbaFromRgb(rgba: Rgba, src: Uint8Array, idx: number): number {\r\n rgba.r = src[idx + 0];\r\n rgba.g = src[idx + 1];\r\n rgba.b = src[idx + 2];\r\n rgba.a = 255;\r\n return idx + 3;\r\n}\r\n\r\nfunction rgbaFromRgba(rgba: Rgba, src: Uint8Array, idx: number): number {\r\n rgbaFromRgb(rgba, src, idx);\r\n rgba.a = src[idx + 3];\r\n return idx + 4;\r\n}\r\n\r\n/** Resize a canvas to a desired size. The final size will be targetSize plus barSize. The original canvas is left untouched and a new, resized canvas with potential side bars is returned.\r\n * @param canvasIn the source [HTMLCanvasElement](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement) to resize.\r\n * @param targetSize the desired new size for the canvas image.\r\n * @param barSize total size of side bars to add to the image in width and height; defaults to (0, 0). For example, if you specify (2, 0), a 1 pixel side bar will be added to the left and right sides of the resized image. If an odd dimension is specified, the left or upper side of the image will be one pixel larger than the opposite side. For example, if you specify (1, 0), a 1 pixel side bar will be added to the left side of the image and a 0 pixel side bar will be added to the right side of the image.\r\n * @param barStyle CSS style string to apply to any side bars; defaults to \"#C0C0C0\", which is silver.\r\n * @returns an [HTMLCanvasElement](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement) object containing the resized image and any requested side bars.\r\n * @public\r\n */\r\nexport function canvasToResizedCanvasWithBars(canvasIn: HTMLCanvasElement, targetSize: Point2d, barSize = new Point2d(0, 0), barStyle = \"#C0C0C0\"): HTMLCanvasElement {\r\n const canvasOut = document.createElement(\"canvas\");\r\n canvasOut.width = targetSize.x + barSize.x;\r\n canvasOut.height = targetSize.y + barSize.y;\r\n\r\n let adjustImageX = barSize.x / 2;\r\n let adjustImageY = barSize.y / 2;\r\n\r\n if (1 === barSize.x % 2) {\r\n adjustImageX += 0.5;\r\n }\r\n if (1 === barSize.y % 2) {\r\n adjustImageY += 0.5;\r\n }\r\n\r\n const context = canvasOut.getContext(\"2d\")!;\r\n context.fillStyle = barStyle;\r\n context.fillRect(0, 0, canvasOut.width, canvasOut.height);\r\n context.drawImage(canvasIn, adjustImageX, adjustImageY, targetSize.x, targetSize.y);\r\n return canvasOut;\r\n}\r\n\r\n/** Create a canvas element with the same dimensions and contents as an image buffer.\r\n * @param buffer the source [[ImageBuffer]] object from which the [HTMLCanvasElement](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement) object will be constructed.\r\n * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImageBuffer]]).\r\n * @returns an [HTMLCanvasElement](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement) object containing the contents of the source image buffer, or undefined if the conversion fails.\r\n * @public\r\n */\r\nexport function imageBufferToCanvas(buffer: ImageBuffer, preserveAlpha: boolean = true): HTMLCanvasElement | undefined {\r\n const canvas = document.createElement(\"canvas\");\r\n if (null === canvas)\r\n return undefined;\r\n\r\n canvas.width = buffer.width;\r\n canvas.height = buffer.height;\r\n\r\n const context = canvas.getContext(\"2d\");\r\n if (null === context)\r\n return undefined;\r\n\r\n const imageData = context.createImageData(buffer.width, buffer.height);\r\n const extractRgba = ImageBufferFormat.Alpha === buffer.format ? rgbaFromAlpha : (ImageBufferFormat.Rgb === buffer.format ? rgbaFromRgb : rgbaFromRgba);\r\n\r\n const bufferData = buffer.data;\r\n let i = 0;\r\n let j = 0;\r\n const rgba = scratchRgba;\r\n while (i < bufferData.length) {\r\n i = extractRgba(rgba, bufferData, i);\r\n imageData.data[j + 0] = rgba.r;\r\n imageData.data[j + 1] = rgba.g;\r\n imageData.data[j + 2] = rgba.b;\r\n imageData.data[j + 3] = preserveAlpha ? rgba.a : 0xff;\r\n j += 4;\r\n }\r\n\r\n context.putImageData(imageData, 0, 0);\r\n return canvas;\r\n}\r\n\r\n/** Create an ImageBuffer in the specified format with the same dimensions and contents as a canvas.\r\n * @param canvas the source [HTMLCanvasElement](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement) object from which the [[ImageBuffer]] object will be constructed.\r\n * @param format the desired format of the created ImageBuffer; defaults to [[ImageBufferFormat.Rgba]].\r\n * @returns an [[ImageBuffer]] object containing the contents of the source canvas, or undefined if the conversion fails.\r\n * @public\r\n */\r\nexport function canvasToImageBuffer(canvas: HTMLCanvasElement, format = ImageBufferFormat.Rgba): ImageBuffer | undefined {\r\n const context = canvas.getContext(\"2d\");\r\n if (null === context)\r\n return undefined;\r\n\r\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\r\n\r\n let imageBufferData: Uint8Array | undefined;\r\n\r\n if (ImageBufferFormat.Rgba === format) {\r\n imageBufferData = new Uint8Array(imageData.data.length);\r\n } else if (ImageBufferFormat.Rgb === format) {\r\n imageBufferData = new Uint8Array((imageData.data.length / 4) * 3);\r\n } else if (ImageBufferFormat.Alpha === format) {\r\n imageBufferData = new Uint8Array(imageData.data.length / 4);\r\n }\r\n\r\n if (undefined === imageBufferData)\r\n return undefined;\r\n\r\n let i = 0;\r\n let j = 0;\r\n while (i < imageData.data.length) {\r\n if (ImageBufferFormat.Rgba === format) {\r\n imageBufferData[j + 0] = imageData.data[i + 0];\r\n imageBufferData[j + 1] = imageData.data[i + 1];\r\n imageBufferData[j + 2] = imageData.data[i + 2];\r\n imageBufferData[j + 3] = imageData.data[i + 3];\r\n j += 4;\r\n } else if (ImageBufferFormat.Rgb === format) {\r\n imageBufferData[j + 0] = imageData.data[i + 0];\r\n imageBufferData[j + 1] = imageData.data[i + 1];\r\n imageBufferData[j + 2] = imageData.data[i + 2];\r\n j += 3;\r\n } else if (ImageBufferFormat.Alpha === format) {\r\n imageBufferData[j] = imageData.data[i + 3];\r\n j++;\r\n }\r\n i += 4;\r\n }\r\n\r\n return ImageBuffer.create(imageBufferData, format, canvas.width);\r\n}\r\n\r\n/** Get a string describing the mime type associated with an ImageSource format.\r\n * @public\r\n */\r\nexport function getImageSourceMimeType(format: ImageSourceFormat): string {\r\n\r\n switch (format) {\r\n case ImageSourceFormat.Jpeg:\r\n return \"image/jpeg\";\r\n case ImageSourceFormat.Png:\r\n return \"image/png\";\r\n case ImageSourceFormat.Svg:\r\n return \"image/svg+xml;charset=utf-8\";\r\n }\r\n return \"\";\r\n}\r\n\r\n/** Get the ImageSourceFormat corresponding to the mime type string, or undefined if the string does not identify a supported ImageSourceFormat.\r\n * @public\r\n */\r\nexport function getImageSourceFormatForMimeType(mimeType: string): ImageSourceFormat | undefined {\r\n switch (mimeType) {\r\n case \"image/jpeg\": return ImageSourceFormat.Jpeg;\r\n case \"image/png\": return ImageSourceFormat.Png;\r\n case \"image/svg+xml;charset=utf-8\": return ImageSourceFormat.Svg;\r\n default: return undefined;\r\n }\r\n}\r\n\r\n/** Extract an html Image element from a binary jpeg or png.\r\n * @param source The ImageSource containing the binary jpeg or png data.\r\n * @returns a Promise which resolves to an HTMLImageElement containing the uncompressed bitmap image in RGBA format.\r\n * @public\r\n */\r\nexport async function imageElementFromImageSource(source: ImageSource): Promise<HTMLImageElement> {\r\n const blob = new Blob([source.data], { type: getImageSourceMimeType(source.format) });\r\n return imageElementFromUrl(URL.createObjectURL(blob));\r\n}\r\n\r\n/** Create an html Image element from a URL.\r\n * @param url The URL pointing to the image data.\r\n * @returns A Promise resolving to an HTMLImageElement when the image data has been loaded from the URL.\r\n * @see tryImageElementFromUrl.\r\n * @public\r\n */\r\nexport async function imageElementFromUrl(url: string): Promise<HTMLImageElement> {\r\n // We must set crossorigin property so that images loaded from same origin can be used with texImage2d.\r\n // We must do that outside of the promise constructor or it won't work, for reasons.\r\n const image = new Image();\r\n image.crossOrigin = \"anonymous\";\r\n return new Promise((resolve: (image: HTMLImageElement) => void, reject) => {\r\n image.onload = () => resolve(image);\r\n\r\n // The \"error\" produced by Image is not an Error. It looks like an Event, but isn't one.\r\n image.onerror = () => reject(new Error(\"Failed to create image from url\"));\r\n image.src = url;\r\n });\r\n}\r\n\r\n/** Try to create an html Image element from a URL.\r\n * @param url The URL pointing to the image data.\r\n * @returns A Promise resolving to an HTMLImageElement when the image data has been loaded from the URL, or to `undefined` if an exception occurred.\r\n * @see imageElementFromUrl\r\n * @public\r\n */\r\nexport async function tryImageElementFromUrl(url: string): Promise<HTMLImageElement | undefined> {\r\n try {\r\n return await imageElementFromUrl(url);\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n/**\r\n * Extract the dimensions of the jpeg or png data encoded in an ImageSource.\r\n * @param source The ImageSource containing the binary jpeg or png data.\r\n * @returns a Promise resolving to a Point2d of which x corresponds to the integer width of the uncompressed bitmap and y to the height.\r\n * @public\r\n */\r\nexport async function extractImageSourceDimensions(source: ImageSource): Promise<Point2d> {\r\n const image = await imageElementFromImageSource(source);\r\n return new Point2d(image.naturalWidth, image.naturalHeight);\r\n}\r\n\r\n/**\r\n * Produces a data url in \"image/png\" format from the contents of an ImageBuffer.\r\n * @param buffer The ImageBuffer, of any format.\r\n * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImageBuffer]]).\r\n * @returns a data url as a string suitable for setting as the `src` property of an HTMLImageElement, or undefined if the url could not be created.\r\n * @public\r\n */\r\nexport function imageBufferToPngDataUrl(buffer: ImageBuffer, preserveAlpha = true): string | undefined {\r\n // The default format (and the only format required to be supported) for toDataUrl() is \"image/png\".\r\n const canvas = imageBufferToCanvas(buffer, preserveAlpha);\r\n return undefined !== canvas ? canvas.toDataURL() : undefined;\r\n}\r\n\r\n/**\r\n * Converts the contents of an ImageBuffer to PNG format.\r\n * @param buffer The ImageBuffer, of any format.\r\n * @param preserveAlpha If false, the alpha channel will be set to 255 (fully opaque). This is recommended when converting an already-blended image (e.g., one obtained from [[Viewport.readImageBuffer]]).\r\n * @returns a base64-encoded string representing the image as a PNG, or undefined if the conversion failed.\r\n * @public\r\n */\r\nexport function imageBufferToBase64EncodedPng(buffer: ImageBuffer, preserveAlpha = true): string | undefined {\r\n const urlPrefix = \"data:image/png;base64,\";\r\n const url = imageBufferToPngDataUrl(buffer, preserveAlpha);\r\n if (undefined === url || !url.startsWith(urlPrefix))\r\n return undefined;\r\n\r\n return url.substring(urlPrefix.length);\r\n}\r\n\r\n/** Open an image specified as a data URL in a new window or tab. Works around differences between browsers and Electron.\r\n * @param url The base64-encoded image URL.\r\n * @param title An optional title to apply to the new window.\r\n * @beta\r\n */\r\nexport function openImageDataUrlInNewWindow(url: string, title?: string): void {\r\n if (ProcessDetector.isElectronAppFrontend) {\r\n window.open(url, title);\r\n } else {\r\n const win = window.open();\r\n if (null === win)\r\n return;\r\n\r\n const div = win.document.createElement(\"div\");\r\n div.innerHTML = `<img src='${url}'/>`;\r\n win.document.body.append(div);\r\n if (undefined !== title)\r\n win.document.title = title;\r\n }\r\n}\r\n\r\n/** Determine the maximum [[ViewRect]] that can be fitted and centered in specified ViewRect given a required aspect ratio.\r\n * @param viewRect The rectangle in which the returned rectangle is to be centered and fitted.\r\n * @param aspectRatio Ratio of width to height.\r\n * @returns A ViewRect centered in the input rectangle.\r\n * @public\r\n */\r\nexport function getCenteredViewRect(viewRect: ViewRect, aspectRatio = 1.4): ViewRect {\r\n // Determine scale that ensures ability to return an image with the prescribed aspectRatio\r\n const scale = Math.min(viewRect.width / aspectRatio, viewRect.height);\r\n const finalWidth = scale * aspectRatio;\r\n const finalHeight = scale;\r\n const left = (viewRect.width - finalWidth) / 2.0;\r\n const right = left + finalWidth;\r\n const top = (viewRect.height - finalHeight) / 2.0;\r\n const bottom = top + finalHeight;\r\n return new ViewRect(left, top, right, bottom);\r\n}\r\n\r\n/** Produce a jpeg compressed to no more than specified bytes and of no less than specified quality.\r\n * @param canvas Canvas containing the image to be compressed.\r\n * @param maxBytes Maximum size of output jpeg in bytes.\r\n * @param minCompressionQuality The minimum acceptable image quality as a number between 0 (lowest quality) and 1 (highest quality).\r\n * @returns A [data URL](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs) for the image, or `undefined` if the compression and size constraints could not be met.\r\n * @public\r\n */\r\nexport function getCompressedJpegFromCanvas(canvas: HTMLCanvasElement, maxBytes = 60000, minCompressionQuality = 0.1): string | undefined {\r\n const decrements = 0.1; // Decrements of quality\r\n const bytesPerCharacter = 2; // Assume 16-bit per character\r\n let quality = 1.0; // JPEG Compression quality\r\n\r\n while (quality > minCompressionQuality) {\r\n const data = canvas.toDataURL(\"image/jpeg\", quality);\r\n // If we are less than 60 Kb, we are good\r\n if (data.length * bytesPerCharacter < maxBytes)\r\n return data;\r\n\r\n quality -= decrements;\r\n }\r\n\r\n return undefined;\r\n}\r\n"]}
@@ -31,7 +31,6 @@ export declare class NullTarget extends RenderTarget {
31
31
  dispose(): void;
32
32
  updateViewRect(): boolean;
33
33
  readPixels(): void;
34
- readImage(): undefined;
35
34
  get screenSpaceEffects(): Iterable<string>;
36
35
  set screenSpaceEffects(_effects: Iterable<string>);
37
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NoRenderApp.d.ts","sourceRoot":"","sources":["../../src/NoRenderApp.ts"],"names":[],"mappings":"AAIA,OAAO,EAAa,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;;;GAIG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,IAAW,gBAAgB,IAAI,MAAM,CAAc;IACnD,IAAW,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAK;IAClD,IAAW,YAAY,QAA+B;IACtD,IAAW,QAAQ,IAAI,QAAQ,CAA2B;IAC1D,IAAW,yBAAyB,IAAI,OAAO,CAAkB;IACjE,IAAoB,iBAAiB,IAAI,qBAAqB,GAAG,SAAS,CAAsB;IAChG,IAAoB,iBAAiB,CAAC,SAAS,EAAE,qBAAqB,GAAG,SAAS,EAAK;IAChF,SAAS,IAAI,IAAI;IACR,KAAK,IAAI,IAAI;IACtB,WAAW,IAAI,IAAI;IACnB,cAAc,IAAI,IAAI;IACtB,iBAAiB,IAAI,IAAI;IACzB,gBAAgB,IAAI,IAAI;IACxB,SAAS,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI;IACpC,wBAAwB,IAAI,IAAI;IAChC,YAAY,IAAI,IAAI;IACpB,UAAU,IAAI,IAAI;IAC3B,WAAW,IAAI,IAAI;IACV,SAAS,IAAI,IAAI;IACjB,OAAO,IAAI,IAAI;IACxB,cAAc,IAAI,OAAO;IACzB,UAAU,IAAI,IAAI;IACT,SAAS;IACzB,IAAW,kBAAkB,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAe;IAChE,IAAW,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAK;CAC9D;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,IAAW,OAAO,IAAI,OAAO,CAAkB;IACxC,UAAU,IAAI,OAAO;IACrB,YAAY;IACZ,qBAAqB;IACrB,aAAa;IACb,iBAAiB;IACjB,mBAAmB;IACnB,WAAW;IACX,OAAO;;IAEE,mBAAmB;CACpC;AAED;;;;GAIG;AACH,qBAAa,WAAW;WACF,OAAO,CAAC,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;CAKpE"}
1
+ {"version":3,"file":"NoRenderApp.d.ts","sourceRoot":"","sources":["../../src/NoRenderApp.ts"],"names":[],"mappings":"AAIA,OAAO,EAAa,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;;;GAIG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,IAAW,gBAAgB,IAAI,MAAM,CAAc;IACnD,IAAW,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAK;IAClD,IAAW,YAAY,QAA+B;IACtD,IAAW,QAAQ,IAAI,QAAQ,CAA2B;IAC1D,IAAW,yBAAyB,IAAI,OAAO,CAAkB;IACjE,IAAoB,iBAAiB,IAAI,qBAAqB,GAAG,SAAS,CAAsB;IAChG,IAAoB,iBAAiB,CAAC,SAAS,EAAE,qBAAqB,GAAG,SAAS,EAAK;IAChF,SAAS,IAAI,IAAI;IACR,KAAK,IAAI,IAAI;IACtB,WAAW,IAAI,IAAI;IACnB,cAAc,IAAI,IAAI;IACtB,iBAAiB,IAAI,IAAI;IACzB,gBAAgB,IAAI,IAAI;IACxB,SAAS,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI;IACpC,wBAAwB,IAAI,IAAI;IAChC,YAAY,IAAI,IAAI;IACpB,UAAU,IAAI,IAAI;IAC3B,WAAW,IAAI,IAAI;IACV,SAAS,IAAI,IAAI;IACjB,OAAO,IAAI,IAAI;IACxB,cAAc,IAAI,OAAO;IACzB,UAAU,IAAI,IAAI;IACzB,IAAW,kBAAkB,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAe;IAChE,IAAW,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAK;CAC9D;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,IAAW,OAAO,IAAI,OAAO,CAAkB;IACxC,UAAU,IAAI,OAAO;IACrB,YAAY;IACZ,qBAAqB;IACrB,aAAa;IACb,iBAAiB;IACjB,mBAAmB;IACnB,WAAW;IACX,OAAO;;IAEE,mBAAmB;CACpC;AAED;;;;GAIG;AACH,qBAAa,WAAW;WACF,OAAO,CAAC,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;CAKpE"}
@@ -37,7 +37,6 @@ class NullTarget extends RenderTarget_1.RenderTarget {
37
37
  dispose() { }
38
38
  updateViewRect() { return false; }
39
39
  readPixels() { }
40
- readImage() { return undefined; }
41
40
  get screenSpaceEffects() { return []; }
42
41
  set screenSpaceEffects(_effects) { }
43
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NoRenderApp.js","sourceRoot":"","sources":["../../src/NoRenderApp.ts"],"names":[],"mappings":";;;AAAA;;;+FAG+F;AAC/F,2CAA0D;AAE1D,wDAAqD;AACrD,wDAAqD;AACrD,yCAAsC;AAEtC;;;;GAIG;AACH,MAAa,UAAW,SAAQ,2BAAY;IAC1C,IAAW,gBAAgB,KAAa,OAAO,CAAC,CAAC,CAAC,CAAC;IACnD,IAAW,gBAAgB,CAAC,SAAiB,IAAI,CAAC;IAClD,IAAW,YAAY,KAAK,OAAO,SAAgB,CAAC,CAAC,CAAC;IACtD,IAAW,QAAQ,KAAe,OAAO,IAAI,mBAAQ,EAAE,CAAC,CAAC,CAAC;IAC1D,IAAW,yBAAyB,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACjE,IAAoB,iBAAiB,KAAwC,OAAO,SAAS,CAAC,CAAC,CAAC;IAChG,IAAoB,iBAAiB,CAAC,SAA4C,IAAI,CAAC;IAChF,SAAS,KAAW,CAAC;IACZ,KAAK,KAAW,CAAC;IAC1B,WAAW,KAAW,CAAC;IACvB,cAAc,KAAW,CAAC;IAC1B,iBAAiB,KAAW,CAAC;IAC7B,gBAAgB,KAAW,CAAC;IAC5B,SAAS,CAAC,mBAA4B,IAAU,CAAC;IACxC,wBAAwB,KAAW,CAAC;IACpC,YAAY,KAAW,CAAC;IACxB,UAAU,KAAW,CAAC;IAC/B,WAAW,KAAW,CAAC;IACd,SAAS,KAAW,CAAC;IACrB,OAAO,KAAW,CAAC;IAC5B,cAAc,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IAC3C,UAAU,KAAW,CAAC;IACb,SAAS,KAAK,OAAO,SAAS,CAAC,CAAC,CAAC;IACjD,IAAW,kBAAkB,KAAuB,OAAO,EAAE,CAAC,CAAC,CAAC;IAChE,IAAW,kBAAkB,CAAC,QAA0B,IAAI,CAAC;CAC9D;AA1BD,gCA0BC;AAED;;;;GAIG;AACH,MAAa,gBAAiB,SAAQ,2BAAY;IAChD,IAAW,OAAO,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACxC,UAAU,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACvC,YAAY,KAAK,OAAO,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC;IAC3C,qBAAqB,KAAK,OAAO,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC;IACpD,aAAa,KAAK,OAAO,SAAgB,CAAC,CAAC,CAAC;IAC5C,iBAAiB,KAAK,OAAO,SAAgB,CAAC,CAAC,CAAC;IAChD,mBAAmB,KAAK,OAAO,SAAgB,CAAC,CAAC,CAAC;IAClD,WAAW,KAAK,OAAO,SAAgB,CAAC,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC;IACpB,gBAAuB,KAAK,EAAE,CAAC,CAAC,CAAC;IACjB,mBAAmB,KAAK,OAAO,SAAS,CAAC,CAAC,CAAC;CAC5D;AAZD,4CAYC;AAED;;;;GAIG;AACH,MAAa,WAAW;IACf,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAuB;QACjD,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACxC,MAAM,qBAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;CACF;AAND,kCAMC","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\nimport { IModelApp, IModelAppOptions } from \"./IModelApp\";\r\nimport { AnimationBranchStates } from \"./render/GraphicBranch\";\r\nimport { RenderSystem } from \"./render/RenderSystem\";\r\nimport { RenderTarget } from \"./render/RenderTarget\";\r\nimport { ViewRect } from \"./ViewRect\";\r\n\r\n/**\r\n * A RenderTarget for applications that must run in environments where WebGL is not present.\r\n * This is typically used in tests.\r\n * @internal\r\n */\r\nexport class NullTarget extends RenderTarget {\r\n public get analysisFraction(): number { return 0; }\r\n public set analysisFraction(_fraction: number) { }\r\n public get renderSystem() { return undefined as any; }\r\n public get viewRect(): ViewRect { return new ViewRect(); }\r\n public get wantInvertBlackBackground(): boolean { return false; }\r\n public override get animationBranches(): AnimationBranchStates | undefined { return undefined; }\r\n public override set animationBranches(_branches: AnimationBranchStates | undefined) { }\r\n public onDestroy(): void { }\r\n public override reset(): void { }\r\n public changeScene(): void { }\r\n public changeDynamics(): void { }\r\n public changeDecorations(): void { }\r\n public changeRenderPlan(): void { }\r\n public drawFrame(_sceneMilSecElapsed?: number): void { }\r\n public override overrideFeatureSymbology(): void { }\r\n public override setHiliteSet(): void { }\r\n public override setFlashed(): void { }\r\n public setViewRect(): void { }\r\n public override onResized(): void { }\r\n public override dispose(): void { }\r\n public updateViewRect(): boolean { return false; }\r\n public readPixels(): void { }\r\n public override readImage() { return undefined; }\r\n public get screenSpaceEffects(): Iterable<string> { return []; }\r\n public set screenSpaceEffects(_effects: Iterable<string>) { }\r\n}\r\n\r\n/**\r\n * A RenderSystem for applications that must run in environments where WebGL is not present.\r\n * This is typically used in tests.\r\n * @internal\r\n */\r\nexport class NullRenderSystem extends RenderSystem {\r\n public get isValid(): boolean { return false; }\r\n public doIdleWork(): boolean { return false; }\r\n public createTarget() { return new NullTarget(); }\r\n public createOffscreenTarget() { return new NullTarget(); }\r\n public createGraphic() { return undefined as any; }\r\n public createGraphicList() { return undefined as any; }\r\n public createGraphicBranch() { return undefined as any; }\r\n public createBatch() { return undefined as any; }\r\n public dispose() { }\r\n public constructor() { super(); }\r\n public override createRenderGraphic() { return undefined; }\r\n}\r\n\r\n/**\r\n * A class for applications that must run in environments where WebGL is not present.\r\n * This is typically used in tests.\r\n * @internal\r\n */\r\nexport class NoRenderApp {\r\n public static async startup(opts?: IModelAppOptions): Promise<void> {\r\n opts = opts ? opts : {};\r\n opts.renderSys = new NullRenderSystem();\r\n await IModelApp.startup(opts);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"NoRenderApp.js","sourceRoot":"","sources":["../../src/NoRenderApp.ts"],"names":[],"mappings":";;;AAAA;;;+FAG+F;AAC/F,2CAA0D;AAE1D,wDAAqD;AACrD,wDAAqD;AACrD,yCAAsC;AAEtC;;;;GAIG;AACH,MAAa,UAAW,SAAQ,2BAAY;IAC1C,IAAW,gBAAgB,KAAa,OAAO,CAAC,CAAC,CAAC,CAAC;IACnD,IAAW,gBAAgB,CAAC,SAAiB,IAAI,CAAC;IAClD,IAAW,YAAY,KAAK,OAAO,SAAgB,CAAC,CAAC,CAAC;IACtD,IAAW,QAAQ,KAAe,OAAO,IAAI,mBAAQ,EAAE,CAAC,CAAC,CAAC;IAC1D,IAAW,yBAAyB,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACjE,IAAoB,iBAAiB,KAAwC,OAAO,SAAS,CAAC,CAAC,CAAC;IAChG,IAAoB,iBAAiB,CAAC,SAA4C,IAAI,CAAC;IAChF,SAAS,KAAW,CAAC;IACZ,KAAK,KAAW,CAAC;IAC1B,WAAW,KAAW,CAAC;IACvB,cAAc,KAAW,CAAC;IAC1B,iBAAiB,KAAW,CAAC;IAC7B,gBAAgB,KAAW,CAAC;IAC5B,SAAS,CAAC,mBAA4B,IAAU,CAAC;IACxC,wBAAwB,KAAW,CAAC;IACpC,YAAY,KAAW,CAAC;IACxB,UAAU,KAAW,CAAC;IAC/B,WAAW,KAAW,CAAC;IACd,SAAS,KAAW,CAAC;IACrB,OAAO,KAAW,CAAC;IAC5B,cAAc,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IAC3C,UAAU,KAAW,CAAC;IAC7B,IAAW,kBAAkB,KAAuB,OAAO,EAAE,CAAC,CAAC,CAAC;IAChE,IAAW,kBAAkB,CAAC,QAA0B,IAAI,CAAC;CAC9D;AAzBD,gCAyBC;AAED;;;;GAIG;AACH,MAAa,gBAAiB,SAAQ,2BAAY;IAChD,IAAW,OAAO,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACxC,UAAU,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IACvC,YAAY,KAAK,OAAO,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC;IAC3C,qBAAqB,KAAK,OAAO,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC;IACpD,aAAa,KAAK,OAAO,SAAgB,CAAC,CAAC,CAAC;IAC5C,iBAAiB,KAAK,OAAO,SAAgB,CAAC,CAAC,CAAC;IAChD,mBAAmB,KAAK,OAAO,SAAgB,CAAC,CAAC,CAAC;IAClD,WAAW,KAAK,OAAO,SAAgB,CAAC,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC;IACpB,gBAAuB,KAAK,EAAE,CAAC,CAAC,CAAC;IACjB,mBAAmB,KAAK,OAAO,SAAS,CAAC,CAAC,CAAC;CAC5D;AAZD,4CAYC;AAED;;;;GAIG;AACH,MAAa,WAAW;IACf,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAuB;QACjD,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACxC,MAAM,qBAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;CACF;AAND,kCAMC","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\nimport { IModelApp, IModelAppOptions } from \"./IModelApp\";\r\nimport { AnimationBranchStates } from \"./render/GraphicBranch\";\r\nimport { RenderSystem } from \"./render/RenderSystem\";\r\nimport { RenderTarget } from \"./render/RenderTarget\";\r\nimport { ViewRect } from \"./ViewRect\";\r\n\r\n/**\r\n * A RenderTarget for applications that must run in environments where WebGL is not present.\r\n * This is typically used in tests.\r\n * @internal\r\n */\r\nexport class NullTarget extends RenderTarget {\r\n public get analysisFraction(): number { return 0; }\r\n public set analysisFraction(_fraction: number) { }\r\n public get renderSystem() { return undefined as any; }\r\n public get viewRect(): ViewRect { return new ViewRect(); }\r\n public get wantInvertBlackBackground(): boolean { return false; }\r\n public override get animationBranches(): AnimationBranchStates | undefined { return undefined; }\r\n public override set animationBranches(_branches: AnimationBranchStates | undefined) { }\r\n public onDestroy(): void { }\r\n public override reset(): void { }\r\n public changeScene(): void { }\r\n public changeDynamics(): void { }\r\n public changeDecorations(): void { }\r\n public changeRenderPlan(): void { }\r\n public drawFrame(_sceneMilSecElapsed?: number): void { }\r\n public override overrideFeatureSymbology(): void { }\r\n public override setHiliteSet(): void { }\r\n public override setFlashed(): void { }\r\n public setViewRect(): void { }\r\n public override onResized(): void { }\r\n public override dispose(): void { }\r\n public updateViewRect(): boolean { return false; }\r\n public readPixels(): void { }\r\n public get screenSpaceEffects(): Iterable<string> { return []; }\r\n public set screenSpaceEffects(_effects: Iterable<string>) { }\r\n}\r\n\r\n/**\r\n * A RenderSystem for applications that must run in environments where WebGL is not present.\r\n * This is typically used in tests.\r\n * @internal\r\n */\r\nexport class NullRenderSystem extends RenderSystem {\r\n public get isValid(): boolean { return false; }\r\n public doIdleWork(): boolean { return false; }\r\n public createTarget() { return new NullTarget(); }\r\n public createOffscreenTarget() { return new NullTarget(); }\r\n public createGraphic() { return undefined as any; }\r\n public createGraphicList() { return undefined as any; }\r\n public createGraphicBranch() { return undefined as any; }\r\n public createBatch() { return undefined as any; }\r\n public dispose() { }\r\n public constructor() { super(); }\r\n public override createRenderGraphic() { return undefined; }\r\n}\r\n\r\n/**\r\n * A class for applications that must run in environments where WebGL is not present.\r\n * This is typically used in tests.\r\n * @internal\r\n */\r\nexport class NoRenderApp {\r\n public static async startup(opts?: IModelAppOptions): Promise<void> {\r\n opts = opts ? opts : {};\r\n opts.renderSys = new NullRenderSystem();\r\n await IModelApp.startup(opts);\r\n }\r\n}\r\n"]}
@@ -658,7 +658,7 @@ class RasterAttachment {
658
658
  const skew = maxSize / height;
659
659
  view.setAspectRatioSkew(skew);
660
660
  if (true !== ((_b = (_a = props.jsonProperties) === null || _a === void 0 ? void 0 : _a.displayOptions) === null || _b === void 0 ? void 0 : _b.preserveBackground)) {
661
- // Make background color 100% transparent so that Viewport.readImage() will discard transparent pixels.
661
+ // Make background color 100% transparent so that Viewport.readImageBuffer() will discard transparent pixels.
662
662
  const bgColor = sheetView.displayStyle.backgroundColor.withAlpha(0);
663
663
  view.displayStyle.backgroundColor = bgColor;
664
664
  }
@@ -720,7 +720,7 @@ class RasterAttachment {
720
720
  createGraphics(vp) {
721
721
  var _a, _b;
722
722
  // Create a texture from the contents of the view.
723
- const image = vp.readImage(vp.viewRect, undefined, false);
723
+ const image = vp.readImageBuffer({ upsideDown: true });
724
724
  if (undefined === image)
725
725
  return undefined;
726
726
  const debugImage = false; // set to true to open a window displaying the captured image.
@@ -1 +1 @@
1
- {"version":3,"file":"SheetViewState.js","sourceRoot":"","sources":["../../src/SheetViewState.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Views\r\n */\r\n\r\nimport { assert, dispose, Id64Array, Id64String } from \"@itwin/core-bentley\";\r\nimport { Angle, ClipShape, ClipVector, Constant, Matrix3d, Point2d, Point3d, PolyfaceBuilder, Range2d, Range3d, StrokeOptions, Transform } from \"@itwin/core-geometry\";\r\nimport {\r\n AxisAlignedBox3d, ColorDef, Feature, FeatureTable, Frustum, Gradient, GraphicParams, HiddenLine, PackedFeatureTable, Placement2d, RenderMaterial, SheetProps,\r\n TextureMapping, TextureTransparency, ViewAttachmentProps, ViewDefinition2dProps, ViewFlagOverrides, ViewStateProps,\r\n} from \"@itwin/core-common\";\r\nimport { CategorySelectorState } from \"./CategorySelectorState\";\r\nimport { DisplayStyle2dState } from \"./DisplayStyleState\";\r\nimport { IModelConnection } from \"./IModelConnection\";\r\nimport { GraphicBuilder, GraphicType } from \"./render/GraphicBuilder\";\r\nimport { RenderGraphic } from \"./render/RenderGraphic\";\r\nimport { GraphicBranch } from \"./render/GraphicBranch\";\r\nimport { Frustum2d } from \"./Frustum2d\";\r\nimport { Scene } from \"./render/Scene\";\r\nimport { Decorations } from \"./render/Decorations\";\r\nimport { MockRender } from \"./render/MockRender\";\r\nimport { RenderClipVolume } from \"./render/RenderClipVolume\";\r\nimport { RenderMemory } from \"./render/RenderMemory\";\r\nimport { FeatureSymbology } from \"./render/FeatureSymbology\";\r\nimport { DecorateContext, SceneContext } from \"./ViewContext\";\r\nimport { ViewRect } from \"./ViewRect\";\r\nimport { IModelApp } from \"./IModelApp\";\r\nimport { CoordSystem } from \"./CoordSystem\";\r\nimport { OffScreenViewport, Viewport } from \"./Viewport\";\r\nimport { AttachToViewportArgs, ViewState, ViewState2d } from \"./ViewState\";\r\nimport { DrawingViewState } from \"./DrawingViewState\";\r\nimport { createDefaultViewFlagOverrides, DisclosedTileTreeSet, TileGraphicType } from \"./tile/internal\";\r\nimport { imageBufferToPngDataUrl, openImageDataUrlInNewWindow } from \"./ImageUtil\";\r\n\r\n// cSpell:ignore ovrs\r\n\r\n/** Describes the geometry and styling of a sheet border decoration.\r\n * The sheet border decoration mimics a sheet of paper with a drop shadow.\r\n */\r\nclass SheetBorder {\r\n private _rect: Point2d[];\r\n private _shadow: Point2d[];\r\n private _gradient: Gradient.Symb;\r\n\r\n private constructor(rect: Point2d[], shadow: Point2d[], gradient: Gradient.Symb) {\r\n this._rect = rect;\r\n this._shadow = shadow;\r\n this._gradient = gradient;\r\n }\r\n\r\n /** Create a new sheet border. If a context is supplied, points are transformed to view coordinates. */\r\n public static create(width: number, height: number, context?: DecorateContext) {\r\n // Rect\r\n const rect: Point3d[] = [\r\n Point3d.create(0, height),\r\n Point3d.create(0, 0),\r\n Point3d.create(width, 0),\r\n Point3d.create(width, height),\r\n Point3d.create(0, height)];\r\n if (context) {\r\n context.viewport.worldToViewArray(rect);\r\n }\r\n\r\n // Shadow\r\n const shadowWidth = .01 * Math.sqrt(width * width + height * height);\r\n const shadow: Point3d[] = [\r\n Point3d.create(shadowWidth, 0),\r\n Point3d.create(shadowWidth, -shadowWidth),\r\n Point3d.create(width + shadowWidth, -shadowWidth),\r\n Point3d.create(width + shadowWidth, height - shadowWidth),\r\n Point3d.create(width, height - shadowWidth),\r\n Point3d.create(width, 0),\r\n Point3d.create(shadowWidth, 0),\r\n ];\r\n if (context) {\r\n context.viewport.worldToViewArray(shadow);\r\n }\r\n\r\n // Gradient\r\n const gradient = new Gradient.Symb();\r\n gradient.mode = Gradient.Mode.Linear;\r\n gradient.angle = Angle.createDegrees(-45);\r\n gradient.keys = [{ value: 0, color: ColorDef.from(25, 25, 25) }, { value: 0.5, color: ColorDef.from(150, 150, 150) }];\r\n\r\n // Copy over points\r\n const rect2d: Point2d[] = [];\r\n for (const point of rect)\r\n rect2d.push(Point2d.createFrom(point));\r\n const shadow2d: Point2d[] = [];\r\n for (const point of shadow)\r\n shadow2d.push(Point2d.createFrom(point));\r\n\r\n return new SheetBorder(rect2d, shadow2d, gradient);\r\n }\r\n\r\n public getRange(): Range2d {\r\n const range = Range2d.createArray(this._rect);\r\n const shadowRange = Range2d.createArray(this._shadow);\r\n range.extendRange(shadowRange);\r\n return range;\r\n }\r\n\r\n /** Add this border to the given GraphicBuilder. */\r\n public addToBuilder(builder: GraphicBuilder) {\r\n const lineColor = ColorDef.black;\r\n const fillColor = ColorDef.black;\r\n\r\n const params = new GraphicParams();\r\n params.fillColor = fillColor;\r\n params.gradient = this._gradient;\r\n\r\n builder.activateGraphicParams(params);\r\n builder.addShape2d(this._shadow, Frustum2d.minimumZDistance);\r\n\r\n builder.setSymbology(lineColor, fillColor, 2);\r\n builder.addLineString2d(this._rect, 0);\r\n }\r\n}\r\n\r\n/** The information required to instantiate an Attachment object. See ViewAttachmentsInfo */\r\ninterface ViewAttachmentInfo extends ViewAttachmentProps {\r\n attachedView: ViewState;\r\n}\r\n\r\n/** The information required to instantiate an ViewAttachments object to draw ViewAttachments into a sheet. The list of view attachment Ids is\r\n * supplied to SheetViewState via the constructor. The corresponding ViewAttachmentProps for each attachment are obtained asynchronously in\r\n * SheetViewState.load(). The Attachments object is created in SheetViewState.attachToViewport and disposed of in SheetViewState.detachFromViewport.\r\n */\r\nclass ViewAttachmentsInfo {\r\n private _attachments: Id64Array | ViewAttachmentInfo[];\r\n\r\n private constructor(attachments: Id64Array | ViewAttachmentInfo[]) {\r\n this._attachments = attachments;\r\n }\r\n\r\n public get isLoaded(): boolean {\r\n return 0 === this._attachments.length || \"string\" !== typeof this._attachments[0];\r\n }\r\n\r\n public get viewAttachmentProps(): Array<Readonly<ViewAttachmentProps>> {\r\n return this.isLoaded ? this._props : [];\r\n }\r\n\r\n private get _props(): ViewAttachmentInfo[] {\r\n assert(this.isLoaded);\r\n return this._attachments as ViewAttachmentInfo[];\r\n }\r\n\r\n private get _ids(): Id64Array {\r\n assert(!this.isLoaded);\r\n return this._attachments as Id64Array;\r\n }\r\n\r\n public static fromJSON(ids: Id64Array = []): ViewAttachmentsInfo {\r\n return new ViewAttachmentsInfo(ids);\r\n }\r\n\r\n public toJSON(): Id64Array {\r\n return this.isLoaded ? this._props.map((x) => x.id!) : [...this._ids];\r\n }\r\n\r\n public clone(): ViewAttachmentsInfo {\r\n // No reason to clone the array.\r\n return new ViewAttachmentsInfo(this._attachments);\r\n }\r\n\r\n public async load(iModel: IModelConnection): Promise<void> {\r\n if (this.isLoaded)\r\n return;\r\n\r\n const attachmentProps = await iModel.elements.getProps(this._ids) as ViewAttachmentInfo[];\r\n const promises = [];\r\n for (const attachment of attachmentProps) {\r\n const loadView = async () => {\r\n try {\r\n const view = await iModel.views.load(attachment.view.id);\r\n return view;\r\n } catch {\r\n return undefined;\r\n }\r\n };\r\n\r\n promises.push(loadView());\r\n }\r\n\r\n const views = await Promise.all(promises);\r\n assert(views.length === attachmentProps.length);\r\n\r\n const attachments = [];\r\n for (let i = 0; i < views.length; i++) {\r\n const view = views[i];\r\n if (view && !(view instanceof SheetViewState)) {\r\n const props = attachmentProps[i];\r\n props.attachedView = view;\r\n attachments.push(props);\r\n }\r\n }\r\n\r\n this._attachments = attachments;\r\n }\r\n\r\n public createAttachments(sheetView: SheetViewState): ViewAttachments | undefined {\r\n return this.isLoaded ? new ViewAttachments(this._props, sheetView) : undefined;\r\n }\r\n}\r\n\r\n/** The set of view attachments to be displayed in a Viewport via a SheetViewState. Allocated when the view becomes attached to a Viewport;\r\n * disposed of when it becomes detached from the viewport.\r\n */\r\nclass ViewAttachments {\r\n private readonly _attachments: Attachment[] = [];\r\n public maxDepth = Frustum2d.minimumZDistance;\r\n\r\n public constructor(infos: ViewAttachmentInfo[], sheetView: SheetViewState) {\r\n for (const info of infos) {\r\n const drawAsRaster = info.jsonProperties?.displayOptions?.drawAsRaster || (info.attachedView.is3d() && info.attachedView.isCameraOn);\r\n const ctor = drawAsRaster ? RasterAttachment : OrthographicAttachment;\r\n const attachment = new ctor(info.attachedView, info, sheetView);\r\n this._attachments.push(attachment);\r\n this.maxDepth = Math.max(this.maxDepth, attachment.zDepth);\r\n }\r\n }\r\n\r\n public dispose(): void {\r\n for (const attachment of this._attachments)\r\n attachment.dispose();\r\n\r\n this._attachments.length = 0;\r\n }\r\n\r\n public [Symbol.iterator](): Iterator<Attachment> {\r\n return this._attachments[Symbol.iterator]();\r\n }\r\n\r\n /** For tests. */\r\n public get attachments(): Object[] {\r\n return this._attachments;\r\n }\r\n\r\n public get isEmpty(): boolean {\r\n return 0 === this._attachments.length;\r\n }\r\n\r\n public get areAllTileTreesLoaded(): boolean {\r\n return this._attachments.every((x) => x.areAllTileTreesLoaded);\r\n }\r\n\r\n public discloseTileTrees(trees: DisclosedTileTreeSet): void {\r\n for (const attachment of this._attachments)\r\n trees.disclose(attachment);\r\n }\r\n\r\n public collectStatistics(stats: RenderMemory.Statistics): void {\r\n for (const attachment of this._attachments)\r\n attachment.collectStatistics(stats);\r\n }\r\n\r\n public addToScene(context: SceneContext): void {\r\n for (const attachment of this._attachments)\r\n attachment.addToScene(context);\r\n }\r\n}\r\n\r\n/** A view of a [SheetModel]($backend).\r\n * @public\r\n */\r\nexport class SheetViewState extends ViewState2d {\r\n /** The width and height of the sheet in world coordinates. */\r\n public readonly sheetSize: Point2d;\r\n private _attachmentsInfo: ViewAttachmentsInfo;\r\n private _attachments?: ViewAttachments;\r\n private readonly _viewedExtents: AxisAlignedBox3d;\r\n\r\n public get attachmentIds(): Id64Array {\r\n return this._attachmentsInfo.toJSON();\r\n }\r\n\r\n /** @internal */\r\n public static override get className() { return \"SheetViewDefinition\"; }\r\n\r\n public static override createFromProps(viewStateData: ViewStateProps, iModel: IModelConnection): SheetViewState {\r\n const cat = new CategorySelectorState(viewStateData.categorySelectorProps, iModel);\r\n const displayStyleState = new DisplayStyle2dState(viewStateData.displayStyleProps, iModel);\r\n\r\n // use \"new this\" so subclasses are correct\r\n return new this(viewStateData.viewDefinitionProps as ViewDefinition2dProps, iModel, cat, displayStyleState, viewStateData.sheetProps!, viewStateData.sheetAttachments!);\r\n }\r\n\r\n public override toProps(): ViewStateProps {\r\n const props = super.toProps();\r\n\r\n props.sheetAttachments = this._attachmentsInfo.toJSON();\r\n\r\n // For sheetProps all that is actually used is the size, so just null out everything else.\r\n const codeProps = { spec: \"\", scope: \"\", value: \"\" };\r\n props.sheetProps = {\r\n model: \"\",\r\n code: codeProps,\r\n classFullName: \"\",\r\n width: this.sheetSize.x,\r\n height: this.sheetSize.y,\r\n scale: 1,\r\n };\r\n\r\n return props;\r\n }\r\n\r\n /** Strictly for testing. @internal */\r\n public get viewAttachmentProps(): Array<Readonly<ViewAttachmentProps>> {\r\n return this._attachmentsInfo.viewAttachmentProps;\r\n }\r\n\r\n /** Strictly for testing. @internal */\r\n public get attachments(): Object[] | undefined {\r\n return this._attachments?.attachments;\r\n }\r\n\r\n /** @internal */\r\n public override isDrawingView(): this is DrawingViewState { return false; }\r\n /** @internal */\r\n public override isSheetView(): this is SheetViewState { return true; }\r\n\r\n public constructor(props: ViewDefinition2dProps, iModel: IModelConnection, categories: CategorySelectorState, displayStyle: DisplayStyle2dState, sheetProps: SheetProps, attachments: Id64Array) {\r\n super(props, iModel, categories, displayStyle);\r\n if (categories instanceof SheetViewState) {\r\n // we are coming from clone...\r\n this.sheetSize = categories.sheetSize.clone();\r\n this._attachmentsInfo = categories._attachmentsInfo.clone();\r\n this._viewedExtents = categories._viewedExtents.clone();\r\n } else {\r\n this.sheetSize = Point2d.create(sheetProps.width, sheetProps.height);\r\n this._attachmentsInfo = ViewAttachmentsInfo.fromJSON(attachments);\r\n\r\n const extents = new Range3d(0, 0, 0, this.sheetSize.x, this.sheetSize.y, 0);\r\n const margin = 1.1;\r\n extents.scaleAboutCenterInPlace(margin);\r\n this._viewedExtents = extents;\r\n }\r\n }\r\n\r\n public override getOrigin() {\r\n const origin = super.getOrigin();\r\n if (this._attachments)\r\n origin.z = -this._attachments.maxDepth;\r\n\r\n return origin;\r\n }\r\n\r\n public override getExtents() {\r\n const extents = super.getExtents();\r\n if (this._attachments)\r\n extents.z = this._attachments.maxDepth + Frustum2d.minimumZDistance;\r\n\r\n return extents;\r\n }\r\n\r\n /** Disclose *all* TileTrees currently in use by this view. This set may include trees not reported by [[forEachTileTreeRef]] - e.g., those used by view attachments, map-draped terrain, etc.\r\n * @internal override\r\n */\r\n public override discloseTileTrees(trees: DisclosedTileTreeSet): void {\r\n super.discloseTileTrees(trees);\r\n if (this._attachments)\r\n trees.disclose(this._attachments);\r\n }\r\n\r\n /** @internal */\r\n public override collectNonTileTreeStatistics(stats: RenderMemory.Statistics): void {\r\n super.collectNonTileTreeStatistics(stats);\r\n if (this._attachments)\r\n this._attachments.collectStatistics(stats);\r\n }\r\n\r\n /** @internal */\r\n public override get defaultExtentLimits() {\r\n return { min: Constant.oneMillimeter, max: this.sheetSize.magnitude() * 10 };\r\n }\r\n\r\n /** @internal */\r\n public override getViewedExtents(): AxisAlignedBox3d {\r\n return this._viewedExtents;\r\n }\r\n\r\n /** Load the size and attachment for this sheet, as well as any other 2d view state characteristics.\r\n * @internal override\r\n */\r\n public override async load(): Promise<void> {\r\n await super.load();\r\n await this._attachmentsInfo.load(this.iModel);\r\n }\r\n\r\n /** @internal */\r\n public override createScene(context: SceneContext): void {\r\n super.createScene(context);\r\n if (this._attachments)\r\n this._attachments.addToScene(context);\r\n }\r\n\r\n /** @internal */\r\n public override get secondaryViewports(): Iterable<Viewport> {\r\n const attachments = this._attachments;\r\n if (!attachments)\r\n return super.secondaryViewports;\r\n\r\n function* iterator() {\r\n for (const attachment of attachments!) {\r\n const vp = attachment.viewport;\r\n if (vp)\r\n yield vp;\r\n }\r\n }\r\n\r\n return {\r\n [Symbol.iterator]: () => iterator(),\r\n };\r\n }\r\n\r\n /** @internal */\r\n private async queryAttachmentIds(): Promise<Id64Array> {\r\n const ecsql = `SELECT ECInstanceId as attachmentId FROM bis.ViewAttachment WHERE model.Id=${this.baseModelId}`;\r\n const ids: string[] = [];\r\n for await (const row of this.iModel.query(ecsql))\r\n ids.push(row[0]);\r\n\r\n return ids;\r\n }\r\n\r\n /** @internal */\r\n public override async changeViewedModel(modelId: Id64String): Promise<void> {\r\n await super.changeViewedModel(modelId);\r\n const attachmentIds = await this.queryAttachmentIds();\r\n this._attachmentsInfo = ViewAttachmentsInfo.fromJSON(attachmentIds);\r\n\r\n assert(undefined === this._attachments);\r\n }\r\n\r\n /** @internal */\r\n public override attachToViewport(args: AttachToViewportArgs): void {\r\n super.attachToViewport(args);\r\n assert(undefined === this._attachments);\r\n this._attachments = this._attachmentsInfo.createAttachments(this);\r\n }\r\n\r\n /** @internal */\r\n public override detachFromViewport(): void {\r\n super.detachFromViewport();\r\n this._attachments = dispose(this._attachments);\r\n }\r\n\r\n /** @internal */\r\n public override get areAllTileTreesLoaded(): boolean {\r\n return super.areAllTileTreesLoaded && (!this._attachments || this._attachments.areAllTileTreesLoaded);\r\n }\r\n\r\n /** Create a sheet border decoration graphic. */\r\n private createBorder(width: number, height: number, context: DecorateContext): RenderGraphic {\r\n const border = SheetBorder.create(width, height, context);\r\n const builder = context.createGraphicBuilder(GraphicType.ViewBackground);\r\n border.addToBuilder(builder);\r\n return builder.finish();\r\n }\r\n\r\n /** @internal */\r\n public override decorate(context: DecorateContext): void {\r\n super.decorate(context);\r\n if (this.sheetSize !== undefined) {\r\n const border = this.createBorder(this.sheetSize.x, this.sheetSize.y, context);\r\n context.setViewBackground(border);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public override computeFitRange(): Range3d {\r\n const size = this.sheetSize;\r\n if (0 >= size.x || 0 >= size.y)\r\n return super.computeFitRange();\r\n return new Range3d(0, 0, -1, size.x, size.y, 1);\r\n }\r\n}\r\n\r\n/** A mostly no-op RenderTarget for an Attachment.\r\n * its Scene and symbology overrides.\r\n */\r\nclass AttachmentTarget extends MockRender.OffScreenTarget {\r\n private readonly _attachment: OrthographicAttachment;\r\n\r\n public constructor(attachment: OrthographicAttachment) {\r\n // The dimensions don't matter - we're not drawing anything.\r\n const rect = new ViewRect(1, 1);\r\n super(IModelApp.renderSystem, rect);\r\n this._attachment = attachment;\r\n }\r\n\r\n public override changeScene(scene: Scene): void {\r\n this._attachment.scene = scene;\r\n }\r\n\r\n public override overrideFeatureSymbology(ovrs: FeatureSymbology.Overrides): void {\r\n this._attachment.symbologyOverrides = ovrs;\r\n }\r\n}\r\n\r\n/** Draws the contents of a view attachment into a sheet view. */\r\ninterface Attachment {\r\n readonly areAllTileTreesLoaded: boolean;\r\n addToScene: (context: SceneContext) => void;\r\n discloseTileTrees: (trees: DisclosedTileTreeSet) => void;\r\n readonly zDepth: number;\r\n collectStatistics: (stats: RenderMemory.Statistics) => void;\r\n viewAttachmentProps: ViewAttachmentProps;\r\n dispose(): void;\r\n readonly viewport?: Viewport;\r\n}\r\n\r\n/** Draws the contents a 2d or orthographic 3d view directly into a sheet view.\r\n * We select tiles for the view in the context of a light-weight offscreen viewport with a no-op RenderTarget, then\r\n * collect the resultant graphics and add them to the sheet view's scene.\r\n */\r\nclass OrthographicAttachment {\r\n private readonly _viewport: OffScreenViewport;\r\n private readonly _props: ViewAttachmentProps;\r\n private readonly _sheetModelId: Id64String;\r\n private readonly _viewFlagOverrides: ViewFlagOverrides;\r\n private readonly _toSheet: Transform;\r\n private readonly _fromSheet: Transform;\r\n private readonly _sizeInMeters: Point2d;\r\n private readonly _range: Range3d;\r\n private readonly _viewRect = new ViewRect(0, 0, 1, 1);\r\n private readonly _originalFrustum = new Frustum();\r\n private readonly _clipVolume?: RenderClipVolume;\r\n private readonly _hiddenLineSettings?: HiddenLine.Settings;\r\n private readonly _scale: { x: number, y: number };\r\n private _debugFeatureTable?: PackedFeatureTable;\r\n public scene?: Scene;\r\n public symbologyOverrides: FeatureSymbology.Overrides;\r\n public readonly zDepth: number;\r\n\r\n public get view(): ViewState {\r\n return this._viewport.view;\r\n }\r\n\r\n public get viewAttachmentProps() {\r\n return this._props;\r\n }\r\n\r\n public get viewport(): Viewport {\r\n return this._viewport;\r\n }\r\n\r\n public constructor(view: ViewState, props: ViewAttachmentProps, sheetView: SheetViewState) {\r\n this.symbologyOverrides = new FeatureSymbology.Overrides(view);\r\n const target = new AttachmentTarget(this);\r\n this._viewport = OffScreenViewport.createViewport(view, target, true);\r\n\r\n this._props = props;\r\n this._sheetModelId = sheetView.baseModelId;\r\n\r\n const applyClip = true; // set to false for debugging\r\n this._viewFlagOverrides = {\r\n ...view.viewFlags,\r\n clipVolume: applyClip,\r\n lighting: false,\r\n shadows: false,\r\n };\r\n\r\n const placement = Placement2d.fromJSON(props.placement);\r\n const range = placement.calculateRange();\r\n this._range = range;\r\n this._sizeInMeters = new Point2d(range.xLength(), range.yLength());\r\n\r\n // Compute transform from attached view's world coordinates to sheet's world coordinates.\r\n // NB: We obtain the extents and origin from the *viewport* not the *view* - they may have been adjusted by the viewport.\r\n const applySkew = true; // set to false for debugging\r\n const skew = applySkew ? view.getAspectRatioSkew() : 1;\r\n const extents = this._viewport.viewingSpace.viewDelta.clone();\r\n const zDepth = Math.abs(extents.z);\r\n const scaleX = this._sizeInMeters.x / Math.abs(extents.x);\r\n const scaleY = skew * this._sizeInMeters.y / Math.abs(extents.y);\r\n this._scale = { x: 1 / scaleX, y: 1 / scaleY };\r\n\r\n const zBias = Frustum2d.depthFromDisplayPriority(props.jsonProperties?.displayPriority ?? 0);\r\n this.zDepth = 1.01 * (zDepth - zBias); // give a little padding so that geometry right up against far plane doesn't get clipped.\r\n\r\n // View origin is at the *back* of the view. Align *front* of view based on display priority.\r\n const viewRot = view.getRotation();\r\n const viewOrg = viewRot.multiplyVector(this._viewport.viewingSpace.viewOrigin);\r\n viewOrg.z += zDepth;\r\n viewRot.multiplyTransposeVectorInPlace(viewOrg);\r\n\r\n const matrix = Matrix3d.createScale(scaleX, scaleY, 1);\r\n matrix.multiplyMatrixMatrix(viewRot, matrix);\r\n const origin = Matrix3d.xyzMinusMatrixTimesXYZ(viewOrg, matrix, viewOrg);\r\n const attachmentOrigin = Point3d.createFrom(placement.origin);\r\n attachmentOrigin.z = zBias;\r\n const viewOrgToAttachment = attachmentOrigin.minus(viewOrg);\r\n origin.addInPlace(viewOrgToAttachment);\r\n this._toSheet = Transform.createRefs(origin, matrix);\r\n this._fromSheet = this._toSheet.inverse()!;\r\n\r\n // ###TODO? If we also apply the attachment's clip to the attached view, we may get additional culling during tile selection.\r\n // However the attached view's frustum is already clipped by intersection with sheet view's frustum, and additional clipping planes\r\n // introduce additional computation, so possibly not worth it.\r\n\r\n // Transform the view's clip (if any) to sheet space\r\n let viewClip = view.viewFlags.clipVolume ? view.getViewClip()?.clone() : undefined;\r\n if (viewClip)\r\n viewClip.transformInPlace(this._toSheet);\r\n else\r\n viewClip = ClipVector.createEmpty();\r\n\r\n let sheetClip;\r\n if (undefined !== props.jsonProperties?.clip)\r\n sheetClip = ClipVector.fromJSON(props.jsonProperties?.clip);\r\n\r\n if (sheetClip && sheetClip.isValid) {\r\n // Clip to view attachment's clip. NB: clip is in sheet coordinate space.\r\n for (const clip of sheetClip.clips)\r\n viewClip.clips.push(clip);\r\n } else {\r\n // Clip to view attachment's bounding box\r\n viewClip.appendShape([\r\n Point3d.create(this._range.low.x, this._range.low.y),\r\n Point3d.create(this._range.high.x, this._range.low.y),\r\n Point3d.create(this._range.high.x, this._range.high.y),\r\n Point3d.create(this._range.low.x, this._range.high.y),\r\n ]);\r\n }\r\n\r\n this._clipVolume = IModelApp.renderSystem.createClipVolume(viewClip);\r\n\r\n // Save off the original frustum (potentially adjusted by viewport).\r\n this._viewport.setupFromView();\r\n this._viewport.viewingSpace.getFrustum(CoordSystem.World, true, this._originalFrustum);\r\n\r\n const applyHiddenLineSettings = true; // for debugging edge display, set to false...\r\n const style = view.displayStyle;\r\n if (style.is3d() && applyHiddenLineSettings)\r\n this._hiddenLineSettings = style.settings.hiddenLineSettings;\r\n }\r\n\r\n public dispose(): void {\r\n this._viewport.dispose();\r\n }\r\n\r\n public discloseTileTrees(trees: DisclosedTileTreeSet): void {\r\n trees.disclose(this._viewport);\r\n }\r\n\r\n public addToScene(context: SceneContext): void {\r\n if (context.viewport.freezeScene)\r\n return;\r\n\r\n if (!context.viewport.view.viewsCategory(this._props.category))\r\n return;\r\n\r\n const wantBounds = context.viewport.wantViewAttachmentBoundaries;\r\n const wantClipShapes = context.viewport.wantViewAttachmentClipShapes;\r\n if (wantBounds || wantClipShapes) {\r\n const builder = context.createSceneGraphicBuilder();\r\n if (wantBounds) {\r\n builder.setSymbology(ColorDef.red, ColorDef.red, 2);\r\n builder.addRangeBox(this._range);\r\n }\r\n\r\n if (wantClipShapes && this._clipVolume) {\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue, 2);\r\n for (const prim of this._clipVolume.clipVector.clips) {\r\n if (!(prim instanceof ClipShape))\r\n continue; // ###TODO handle non-shape primitives, if any such ever encountered\r\n\r\n const pts = [];\r\n const tf = prim.transformFromClip;\r\n for (const pt of prim.polygon) {\r\n const tfPt = tf ? tf.multiplyPoint3d(pt) : pt;\r\n pts.push(new Point2d(tfPt.x, tfPt.y));\r\n }\r\n\r\n builder.addLineString2d(pts, 0);\r\n }\r\n }\r\n\r\n // Put into a Batch so that we can see tooltip with attachment Id on mouseover.\r\n const batch = context.target.renderSystem.createBatch(builder.finish(), this.getDebugFeatureTable(), this._range);\r\n context.outputGraphic(batch);\r\n }\r\n\r\n if (!context.viewport.wantViewAttachments)\r\n return;\r\n\r\n // Pixel size used to compute size of ViewRect so that tiles of appropriate LOD are selected.\r\n const pixelSize = context.viewport.getPixelSizeAtPoint();\r\n if (0 === pixelSize)\r\n return;\r\n\r\n // Adjust attached view frustum based on intersection with sheet view frustum.\r\n const attachFrustum = this._originalFrustum.transformBy(this._toSheet);\r\n const attachFrustumRange = attachFrustum.toRange();\r\n const sheetFrustum = context.viewport.getWorldFrustum();\r\n const sheetFrustumRange = sheetFrustum.toRange();\r\n const intersect = attachFrustumRange.intersect(sheetFrustumRange);\r\n if (intersect.isNull)\r\n return;\r\n\r\n attachFrustum.initFromRange(intersect);\r\n attachFrustum.transformBy(this._fromSheet, attachFrustum);\r\n this._viewport.setupViewFromFrustum(attachFrustum);\r\n\r\n // Adjust view rect based on size of attachment on screen so that tiles of appropriate LOD are selected.\r\n const width = this._sizeInMeters.x * intersect.xLength() / attachFrustumRange.xLength();\r\n const height = this._sizeInMeters.y * intersect.yLength() / attachFrustumRange.yLength();\r\n this._viewRect.width = Math.max(1, Math.round(width / pixelSize));\r\n this._viewRect.height = Math.max(1, Math.round(height / pixelSize));\r\n this._viewport.setRect(this._viewRect);\r\n\r\n // Propagate settings from on-screen viewport.\r\n this._viewport.debugBoundingBoxes = context.viewport.debugBoundingBoxes;\r\n this._viewport.setTileSizeModifier(context.viewport.tileSizeModifier);\r\n\r\n // Create the scene.\r\n this._viewport.renderFrame();\r\n\r\n const scene = this.scene;\r\n if (!scene)\r\n return;\r\n\r\n // Extract scene graphics and insert into on-screen scene context.\r\n const options = {\r\n clipVolume: this._clipVolume,\r\n hline: this._hiddenLineSettings,\r\n frustum: {\r\n is3d: this.view.is3d(),\r\n scale: this._scale,\r\n },\r\n };\r\n\r\n const outputGraphics = (source: RenderGraphic[]) => {\r\n if (0 === source.length)\r\n return;\r\n\r\n const graphics = new GraphicBranch();\r\n graphics.setViewFlagOverrides(this._viewFlagOverrides);\r\n graphics.symbologyOverrides = this.symbologyOverrides;\r\n\r\n for (const graphic of source)\r\n graphics.entries.push(graphic);\r\n\r\n const branch = context.createGraphicBranch(graphics, this._toSheet, options);\r\n context.outputGraphic(branch);\r\n };\r\n\r\n outputGraphics(scene.foreground);\r\n context.withGraphicType(TileGraphicType.BackgroundMap, () => outputGraphics(scene.background));\r\n context.withGraphicType(TileGraphicType.Overlay, () => outputGraphics(scene.overlay));\r\n\r\n // Report tile statistics to sheet view's viewport.\r\n const tileAdmin = IModelApp.tileAdmin;\r\n const selectedAndReady = tileAdmin.getTilesForViewport(this._viewport);\r\n const requested = tileAdmin.getRequestsForViewport(this._viewport);\r\n tileAdmin.addExternalTilesForViewport(context.viewport, {\r\n requested: requested?.size ?? 0,\r\n selected: selectedAndReady?.selected.size ?? 0,\r\n ready: selectedAndReady?.ready.size ?? 0,\r\n });\r\n }\r\n\r\n private getDebugFeatureTable(): PackedFeatureTable {\r\n if (this._debugFeatureTable)\r\n return this._debugFeatureTable;\r\n\r\n const featureTable = new FeatureTable(1, this._sheetModelId);\r\n featureTable.insert(new Feature(this._props.id));\r\n this._debugFeatureTable = PackedFeatureTable.pack(featureTable);\r\n return this._debugFeatureTable;\r\n }\r\n\r\n public get areAllTileTreesLoaded(): boolean {\r\n return this.view.areAllTileTreesLoaded;\r\n }\r\n\r\n public collectStatistics(_stats: RenderMemory.Statistics): void {\r\n // Handled by discloseTileTrees()\r\n }\r\n}\r\n\r\nfunction createRasterAttachmentViewport(_view: ViewState, _rect: ViewRect, _attachment: RasterAttachment): OffScreenViewport {\r\n class RasterAttachmentViewport extends OffScreenViewport {\r\n private _sceneContext?: SceneContext;\r\n private _isSceneReady = false;\r\n private readonly _attachment: RasterAttachment;\r\n\r\n public constructor(view: ViewState, rect: ViewRect, attachment: RasterAttachment) {\r\n super(IModelApp.renderSystem.createOffscreenTarget(rect));\r\n this._attachment = attachment;\r\n this._isAspectRatioLocked = true;\r\n this.changeView(view);\r\n }\r\n\r\n public override createSceneContext(): SceneContext {\r\n assert(!this._isSceneReady);\r\n\r\n this._sceneContext = super.createSceneContext();\r\n return this._sceneContext;\r\n }\r\n\r\n public override renderFrame(): void {\r\n assert(!this._isSceneReady);\r\n\r\n this.clearSceneContext();\r\n super.renderFrame();\r\n\r\n if (undefined !== this._sceneContext) {\r\n this._isSceneReady = !this._sceneContext.hasMissingTiles && this.view.areAllTileTreesLoaded;\r\n if (this._isSceneReady)\r\n this._attachment.produceGraphics(this._sceneContext);\r\n\r\n this._sceneContext = undefined;\r\n }\r\n }\r\n\r\n private clearSceneContext(): void {\r\n this._sceneContext = undefined;\r\n }\r\n\r\n public override addDecorations(_decorations: Decorations): void {\r\n // ###TODO: skybox, ground plane, possibly grid. DecorateContext requires a ScreenViewport...\r\n }\r\n }\r\n\r\n return new RasterAttachmentViewport(_view, _rect, _attachment);\r\n}\r\n\r\n/** Draws a 3d view with camera enabled into a sheet view by producing an image of the view's contents offscreen. */\r\nclass RasterAttachment {\r\n private readonly _props: ViewAttachmentProps;\r\n private readonly _placement: Placement2d;\r\n private readonly _transform: Transform;\r\n public readonly zDepth: number;\r\n private _viewport?: OffScreenViewport;\r\n private _graphics?: RenderGraphic;\r\n\r\n public constructor(view: ViewState, props: ViewAttachmentProps, sheetView: SheetViewState) {\r\n // Render to a 2048x2048 view rect. Scale in Y to preserve aspect ratio.\r\n const maxSize = 2048;\r\n const rect = new ViewRect(0, 0, maxSize, maxSize);\r\n const height = maxSize * view.getAspectRatio() * view.getAspectRatioSkew();\r\n const skew = maxSize / height;\r\n view.setAspectRatioSkew(skew);\r\n\r\n if (true !== props.jsonProperties?.displayOptions?.preserveBackground) {\r\n // Make background color 100% transparent so that Viewport.readImage() will discard transparent pixels.\r\n const bgColor = sheetView.displayStyle.backgroundColor.withAlpha(0);\r\n view.displayStyle.backgroundColor = bgColor;\r\n }\r\n\r\n this._viewport = createRasterAttachmentViewport(view, rect, this);\r\n this._props = props;\r\n this._placement = Placement2d.fromJSON(props.placement);\r\n this._transform = this._placement.transform;\r\n this.zDepth = Frustum2d.depthFromDisplayPriority(props.jsonProperties?.displayPriority ?? 0);\r\n }\r\n\r\n public dispose(): void {\r\n this._viewport?.dispose();\r\n }\r\n\r\n public get viewAttachmentProps() {\r\n return this._props;\r\n }\r\n\r\n public get viewport(): Viewport | undefined {\r\n return this._viewport;\r\n }\r\n\r\n public get areAllTileTreesLoaded() {\r\n return this._viewport?.areAllTileTreesLoaded ?? true;\r\n }\r\n\r\n public addToScene(context: SceneContext): void {\r\n // ###TODO: check viewport.wantViewAttachmentClipShapes\r\n if (!context.viewport.view.viewsCategory(this._props.category))\r\n return;\r\n\r\n if (context.viewport.wantViewAttachmentBoundaries) {\r\n const builder = context.createSceneGraphicBuilder(this._transform);\r\n builder.setSymbology(ColorDef.red, ColorDef.red, 2);\r\n builder.addRangeBox(Range3d.createRange2d(this._placement.bbox));\r\n context.outputGraphic(builder.finish());\r\n }\r\n\r\n if (!context.viewport.wantViewAttachments)\r\n return;\r\n\r\n if (this._graphics) {\r\n context.outputGraphic(this._graphics);\r\n return;\r\n }\r\n\r\n if (undefined === this._viewport)\r\n return;\r\n\r\n this._viewport.debugBoundingBoxes = context.viewport.debugBoundingBoxes;\r\n this._viewport.setTileSizeModifier(context.viewport.tileSizeModifier);\r\n\r\n this._viewport.renderFrame();\r\n if (this._graphics)\r\n context.outputGraphic(this._graphics);\r\n }\r\n\r\n public discloseTileTrees(trees: DisclosedTileTreeSet) {\r\n if (this._viewport)\r\n trees.disclose(this._viewport);\r\n }\r\n\r\n public produceGraphics(context: SceneContext): void {\r\n assert(context.viewport === this._viewport);\r\n this._graphics = this.createGraphics(this._viewport);\r\n this._viewport = dispose(this._viewport);\r\n\r\n if (undefined !== this._graphics)\r\n context.outputGraphic(this._graphics);\r\n }\r\n\r\n private createGraphics(vp: Viewport): RenderGraphic | undefined {\r\n // Create a texture from the contents of the view.\r\n const image = vp.readImage(vp.viewRect, undefined, false);\r\n if (undefined === image)\r\n return undefined;\r\n\r\n const debugImage = false; // set to true to open a window displaying the captured image.\r\n if (debugImage) {\r\n const url = imageBufferToPngDataUrl(image, false);\r\n if (url)\r\n openImageDataUrlInNewWindow(url, \"Attachment\");\r\n }\r\n\r\n const texture = IModelApp.renderSystem.createTexture({\r\n image: { source: image, transparency: TextureTransparency.Opaque },\r\n });\r\n if (!texture)\r\n return undefined;\r\n\r\n // Create a material for the texture\r\n const graphicParams = new GraphicParams();\r\n const materialParams = new RenderMaterial.Params();\r\n materialParams.textureMapping = new TextureMapping(texture, new TextureMapping.Params());\r\n graphicParams.material = IModelApp.renderSystem.createMaterial(materialParams, vp.iModel);\r\n\r\n // Apply the texture to a rectangular polyface.\r\n const depth = this.zDepth;\r\n const east = this._placement.bbox.low.x;\r\n const west = this._placement.bbox.high.x;\r\n const north = this._placement.bbox.low.y;\r\n const south = this._placement.bbox.high.y;\r\n const corners = [\r\n Point3d.create(east, north, depth),\r\n Point3d.create(west, north, depth),\r\n Point3d.create(west, south, depth),\r\n Point3d.create(east, south, depth),\r\n ];\r\n const params = [\r\n Point2d.create(0, 0),\r\n Point2d.create(1, 0),\r\n Point2d.create(1, 1),\r\n Point2d.create(0, 1),\r\n ];\r\n\r\n const strokeOptions = new StrokeOptions();\r\n strokeOptions.needParams = strokeOptions.shouldTriangulate = true;\r\n const polyfaceBuilder = PolyfaceBuilder.create(strokeOptions);\r\n polyfaceBuilder.addQuadFacet(corners, params);\r\n const polyface = polyfaceBuilder.claimPolyface();\r\n\r\n const graphicBuilder = IModelApp.renderSystem.createGraphicBuilder(Transform.createIdentity(), GraphicType.Scene, vp, this._props.id);\r\n graphicBuilder.activateGraphicParams(graphicParams);\r\n graphicBuilder.addPolyface(polyface, false);\r\n const graphic = graphicBuilder.finish();\r\n\r\n // Wrap the polyface in a GraphicBranch.\r\n const branch = new GraphicBranch(true);\r\n const vfOvrs = createDefaultViewFlagOverrides({ clipVolume: true, shadows: false, lighting: false, thematic: false });\r\n\r\n // Disable transparency - background pixels are 100% transparent so they will be discarded anyway. Other pixels are 100% opaque.\r\n vfOvrs.transparency = false;\r\n branch.setViewFlagOverrides(vfOvrs);\r\n branch.symbologyOverrides = new FeatureSymbology.Overrides();\r\n branch.entries.push(graphic);\r\n\r\n // Apply the attachment's clip, if any.\r\n let clipVolume;\r\n if (this._props.jsonProperties?.clip) {\r\n const clipVector = ClipVector.fromJSON(this._props.jsonProperties?.clip);\r\n if (clipVector.isValid)\r\n clipVolume = IModelApp.renderSystem.createClipVolume(clipVector);\r\n }\r\n\r\n return IModelApp.renderSystem.createGraphicBranch(branch, this._transform, { clipVolume });\r\n }\r\n\r\n public collectStatistics(stats: RenderMemory.Statistics): void {\r\n if (this._graphics)\r\n this._graphics.collectStatistics(stats);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"SheetViewState.js","sourceRoot":"","sources":["../../src/SheetViewState.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Views\r\n */\r\n\r\nimport { assert, dispose, Id64Array, Id64String } from \"@itwin/core-bentley\";\r\nimport { Angle, ClipShape, ClipVector, Constant, Matrix3d, Point2d, Point3d, PolyfaceBuilder, Range2d, Range3d, StrokeOptions, Transform } from \"@itwin/core-geometry\";\r\nimport {\r\n AxisAlignedBox3d, ColorDef, Feature, FeatureTable, Frustum, Gradient, GraphicParams, HiddenLine, PackedFeatureTable, Placement2d, RenderMaterial, SheetProps,\r\n TextureMapping, TextureTransparency, ViewAttachmentProps, ViewDefinition2dProps, ViewFlagOverrides, ViewStateProps,\r\n} from \"@itwin/core-common\";\r\nimport { CategorySelectorState } from \"./CategorySelectorState\";\r\nimport { DisplayStyle2dState } from \"./DisplayStyleState\";\r\nimport { IModelConnection } from \"./IModelConnection\";\r\nimport { GraphicBuilder, GraphicType } from \"./render/GraphicBuilder\";\r\nimport { RenderGraphic } from \"./render/RenderGraphic\";\r\nimport { GraphicBranch } from \"./render/GraphicBranch\";\r\nimport { Frustum2d } from \"./Frustum2d\";\r\nimport { Scene } from \"./render/Scene\";\r\nimport { Decorations } from \"./render/Decorations\";\r\nimport { MockRender } from \"./render/MockRender\";\r\nimport { RenderClipVolume } from \"./render/RenderClipVolume\";\r\nimport { RenderMemory } from \"./render/RenderMemory\";\r\nimport { FeatureSymbology } from \"./render/FeatureSymbology\";\r\nimport { DecorateContext, SceneContext } from \"./ViewContext\";\r\nimport { ViewRect } from \"./ViewRect\";\r\nimport { IModelApp } from \"./IModelApp\";\r\nimport { CoordSystem } from \"./CoordSystem\";\r\nimport { OffScreenViewport, Viewport } from \"./Viewport\";\r\nimport { AttachToViewportArgs, ViewState, ViewState2d } from \"./ViewState\";\r\nimport { DrawingViewState } from \"./DrawingViewState\";\r\nimport { createDefaultViewFlagOverrides, DisclosedTileTreeSet, TileGraphicType } from \"./tile/internal\";\r\nimport { imageBufferToPngDataUrl, openImageDataUrlInNewWindow } from \"./ImageUtil\";\r\n\r\n// cSpell:ignore ovrs\r\n\r\n/** Describes the geometry and styling of a sheet border decoration.\r\n * The sheet border decoration mimics a sheet of paper with a drop shadow.\r\n */\r\nclass SheetBorder {\r\n private _rect: Point2d[];\r\n private _shadow: Point2d[];\r\n private _gradient: Gradient.Symb;\r\n\r\n private constructor(rect: Point2d[], shadow: Point2d[], gradient: Gradient.Symb) {\r\n this._rect = rect;\r\n this._shadow = shadow;\r\n this._gradient = gradient;\r\n }\r\n\r\n /** Create a new sheet border. If a context is supplied, points are transformed to view coordinates. */\r\n public static create(width: number, height: number, context?: DecorateContext) {\r\n // Rect\r\n const rect: Point3d[] = [\r\n Point3d.create(0, height),\r\n Point3d.create(0, 0),\r\n Point3d.create(width, 0),\r\n Point3d.create(width, height),\r\n Point3d.create(0, height)];\r\n if (context) {\r\n context.viewport.worldToViewArray(rect);\r\n }\r\n\r\n // Shadow\r\n const shadowWidth = .01 * Math.sqrt(width * width + height * height);\r\n const shadow: Point3d[] = [\r\n Point3d.create(shadowWidth, 0),\r\n Point3d.create(shadowWidth, -shadowWidth),\r\n Point3d.create(width + shadowWidth, -shadowWidth),\r\n Point3d.create(width + shadowWidth, height - shadowWidth),\r\n Point3d.create(width, height - shadowWidth),\r\n Point3d.create(width, 0),\r\n Point3d.create(shadowWidth, 0),\r\n ];\r\n if (context) {\r\n context.viewport.worldToViewArray(shadow);\r\n }\r\n\r\n // Gradient\r\n const gradient = new Gradient.Symb();\r\n gradient.mode = Gradient.Mode.Linear;\r\n gradient.angle = Angle.createDegrees(-45);\r\n gradient.keys = [{ value: 0, color: ColorDef.from(25, 25, 25) }, { value: 0.5, color: ColorDef.from(150, 150, 150) }];\r\n\r\n // Copy over points\r\n const rect2d: Point2d[] = [];\r\n for (const point of rect)\r\n rect2d.push(Point2d.createFrom(point));\r\n const shadow2d: Point2d[] = [];\r\n for (const point of shadow)\r\n shadow2d.push(Point2d.createFrom(point));\r\n\r\n return new SheetBorder(rect2d, shadow2d, gradient);\r\n }\r\n\r\n public getRange(): Range2d {\r\n const range = Range2d.createArray(this._rect);\r\n const shadowRange = Range2d.createArray(this._shadow);\r\n range.extendRange(shadowRange);\r\n return range;\r\n }\r\n\r\n /** Add this border to the given GraphicBuilder. */\r\n public addToBuilder(builder: GraphicBuilder) {\r\n const lineColor = ColorDef.black;\r\n const fillColor = ColorDef.black;\r\n\r\n const params = new GraphicParams();\r\n params.fillColor = fillColor;\r\n params.gradient = this._gradient;\r\n\r\n builder.activateGraphicParams(params);\r\n builder.addShape2d(this._shadow, Frustum2d.minimumZDistance);\r\n\r\n builder.setSymbology(lineColor, fillColor, 2);\r\n builder.addLineString2d(this._rect, 0);\r\n }\r\n}\r\n\r\n/** The information required to instantiate an Attachment object. See ViewAttachmentsInfo */\r\ninterface ViewAttachmentInfo extends ViewAttachmentProps {\r\n attachedView: ViewState;\r\n}\r\n\r\n/** The information required to instantiate an ViewAttachments object to draw ViewAttachments into a sheet. The list of view attachment Ids is\r\n * supplied to SheetViewState via the constructor. The corresponding ViewAttachmentProps for each attachment are obtained asynchronously in\r\n * SheetViewState.load(). The Attachments object is created in SheetViewState.attachToViewport and disposed of in SheetViewState.detachFromViewport.\r\n */\r\nclass ViewAttachmentsInfo {\r\n private _attachments: Id64Array | ViewAttachmentInfo[];\r\n\r\n private constructor(attachments: Id64Array | ViewAttachmentInfo[]) {\r\n this._attachments = attachments;\r\n }\r\n\r\n public get isLoaded(): boolean {\r\n return 0 === this._attachments.length || \"string\" !== typeof this._attachments[0];\r\n }\r\n\r\n public get viewAttachmentProps(): Array<Readonly<ViewAttachmentProps>> {\r\n return this.isLoaded ? this._props : [];\r\n }\r\n\r\n private get _props(): ViewAttachmentInfo[] {\r\n assert(this.isLoaded);\r\n return this._attachments as ViewAttachmentInfo[];\r\n }\r\n\r\n private get _ids(): Id64Array {\r\n assert(!this.isLoaded);\r\n return this._attachments as Id64Array;\r\n }\r\n\r\n public static fromJSON(ids: Id64Array = []): ViewAttachmentsInfo {\r\n return new ViewAttachmentsInfo(ids);\r\n }\r\n\r\n public toJSON(): Id64Array {\r\n return this.isLoaded ? this._props.map((x) => x.id!) : [...this._ids];\r\n }\r\n\r\n public clone(): ViewAttachmentsInfo {\r\n // No reason to clone the array.\r\n return new ViewAttachmentsInfo(this._attachments);\r\n }\r\n\r\n public async load(iModel: IModelConnection): Promise<void> {\r\n if (this.isLoaded)\r\n return;\r\n\r\n const attachmentProps = await iModel.elements.getProps(this._ids) as ViewAttachmentInfo[];\r\n const promises = [];\r\n for (const attachment of attachmentProps) {\r\n const loadView = async () => {\r\n try {\r\n const view = await iModel.views.load(attachment.view.id);\r\n return view;\r\n } catch {\r\n return undefined;\r\n }\r\n };\r\n\r\n promises.push(loadView());\r\n }\r\n\r\n const views = await Promise.all(promises);\r\n assert(views.length === attachmentProps.length);\r\n\r\n const attachments = [];\r\n for (let i = 0; i < views.length; i++) {\r\n const view = views[i];\r\n if (view && !(view instanceof SheetViewState)) {\r\n const props = attachmentProps[i];\r\n props.attachedView = view;\r\n attachments.push(props);\r\n }\r\n }\r\n\r\n this._attachments = attachments;\r\n }\r\n\r\n public createAttachments(sheetView: SheetViewState): ViewAttachments | undefined {\r\n return this.isLoaded ? new ViewAttachments(this._props, sheetView) : undefined;\r\n }\r\n}\r\n\r\n/** The set of view attachments to be displayed in a Viewport via a SheetViewState. Allocated when the view becomes attached to a Viewport;\r\n * disposed of when it becomes detached from the viewport.\r\n */\r\nclass ViewAttachments {\r\n private readonly _attachments: Attachment[] = [];\r\n public maxDepth = Frustum2d.minimumZDistance;\r\n\r\n public constructor(infos: ViewAttachmentInfo[], sheetView: SheetViewState) {\r\n for (const info of infos) {\r\n const drawAsRaster = info.jsonProperties?.displayOptions?.drawAsRaster || (info.attachedView.is3d() && info.attachedView.isCameraOn);\r\n const ctor = drawAsRaster ? RasterAttachment : OrthographicAttachment;\r\n const attachment = new ctor(info.attachedView, info, sheetView);\r\n this._attachments.push(attachment);\r\n this.maxDepth = Math.max(this.maxDepth, attachment.zDepth);\r\n }\r\n }\r\n\r\n public dispose(): void {\r\n for (const attachment of this._attachments)\r\n attachment.dispose();\r\n\r\n this._attachments.length = 0;\r\n }\r\n\r\n public [Symbol.iterator](): Iterator<Attachment> {\r\n return this._attachments[Symbol.iterator]();\r\n }\r\n\r\n /** For tests. */\r\n public get attachments(): Object[] {\r\n return this._attachments;\r\n }\r\n\r\n public get isEmpty(): boolean {\r\n return 0 === this._attachments.length;\r\n }\r\n\r\n public get areAllTileTreesLoaded(): boolean {\r\n return this._attachments.every((x) => x.areAllTileTreesLoaded);\r\n }\r\n\r\n public discloseTileTrees(trees: DisclosedTileTreeSet): void {\r\n for (const attachment of this._attachments)\r\n trees.disclose(attachment);\r\n }\r\n\r\n public collectStatistics(stats: RenderMemory.Statistics): void {\r\n for (const attachment of this._attachments)\r\n attachment.collectStatistics(stats);\r\n }\r\n\r\n public addToScene(context: SceneContext): void {\r\n for (const attachment of this._attachments)\r\n attachment.addToScene(context);\r\n }\r\n}\r\n\r\n/** A view of a [SheetModel]($backend).\r\n * @public\r\n */\r\nexport class SheetViewState extends ViewState2d {\r\n /** The width and height of the sheet in world coordinates. */\r\n public readonly sheetSize: Point2d;\r\n private _attachmentsInfo: ViewAttachmentsInfo;\r\n private _attachments?: ViewAttachments;\r\n private readonly _viewedExtents: AxisAlignedBox3d;\r\n\r\n public get attachmentIds(): Id64Array {\r\n return this._attachmentsInfo.toJSON();\r\n }\r\n\r\n /** @internal */\r\n public static override get className() { return \"SheetViewDefinition\"; }\r\n\r\n public static override createFromProps(viewStateData: ViewStateProps, iModel: IModelConnection): SheetViewState {\r\n const cat = new CategorySelectorState(viewStateData.categorySelectorProps, iModel);\r\n const displayStyleState = new DisplayStyle2dState(viewStateData.displayStyleProps, iModel);\r\n\r\n // use \"new this\" so subclasses are correct\r\n return new this(viewStateData.viewDefinitionProps as ViewDefinition2dProps, iModel, cat, displayStyleState, viewStateData.sheetProps!, viewStateData.sheetAttachments!);\r\n }\r\n\r\n public override toProps(): ViewStateProps {\r\n const props = super.toProps();\r\n\r\n props.sheetAttachments = this._attachmentsInfo.toJSON();\r\n\r\n // For sheetProps all that is actually used is the size, so just null out everything else.\r\n const codeProps = { spec: \"\", scope: \"\", value: \"\" };\r\n props.sheetProps = {\r\n model: \"\",\r\n code: codeProps,\r\n classFullName: \"\",\r\n width: this.sheetSize.x,\r\n height: this.sheetSize.y,\r\n scale: 1,\r\n };\r\n\r\n return props;\r\n }\r\n\r\n /** Strictly for testing. @internal */\r\n public get viewAttachmentProps(): Array<Readonly<ViewAttachmentProps>> {\r\n return this._attachmentsInfo.viewAttachmentProps;\r\n }\r\n\r\n /** Strictly for testing. @internal */\r\n public get attachments(): Object[] | undefined {\r\n return this._attachments?.attachments;\r\n }\r\n\r\n /** @internal */\r\n public override isDrawingView(): this is DrawingViewState { return false; }\r\n /** @internal */\r\n public override isSheetView(): this is SheetViewState { return true; }\r\n\r\n public constructor(props: ViewDefinition2dProps, iModel: IModelConnection, categories: CategorySelectorState, displayStyle: DisplayStyle2dState, sheetProps: SheetProps, attachments: Id64Array) {\r\n super(props, iModel, categories, displayStyle);\r\n if (categories instanceof SheetViewState) {\r\n // we are coming from clone...\r\n this.sheetSize = categories.sheetSize.clone();\r\n this._attachmentsInfo = categories._attachmentsInfo.clone();\r\n this._viewedExtents = categories._viewedExtents.clone();\r\n } else {\r\n this.sheetSize = Point2d.create(sheetProps.width, sheetProps.height);\r\n this._attachmentsInfo = ViewAttachmentsInfo.fromJSON(attachments);\r\n\r\n const extents = new Range3d(0, 0, 0, this.sheetSize.x, this.sheetSize.y, 0);\r\n const margin = 1.1;\r\n extents.scaleAboutCenterInPlace(margin);\r\n this._viewedExtents = extents;\r\n }\r\n }\r\n\r\n public override getOrigin() {\r\n const origin = super.getOrigin();\r\n if (this._attachments)\r\n origin.z = -this._attachments.maxDepth;\r\n\r\n return origin;\r\n }\r\n\r\n public override getExtents() {\r\n const extents = super.getExtents();\r\n if (this._attachments)\r\n extents.z = this._attachments.maxDepth + Frustum2d.minimumZDistance;\r\n\r\n return extents;\r\n }\r\n\r\n /** Disclose *all* TileTrees currently in use by this view. This set may include trees not reported by [[forEachTileTreeRef]] - e.g., those used by view attachments, map-draped terrain, etc.\r\n * @internal override\r\n */\r\n public override discloseTileTrees(trees: DisclosedTileTreeSet): void {\r\n super.discloseTileTrees(trees);\r\n if (this._attachments)\r\n trees.disclose(this._attachments);\r\n }\r\n\r\n /** @internal */\r\n public override collectNonTileTreeStatistics(stats: RenderMemory.Statistics): void {\r\n super.collectNonTileTreeStatistics(stats);\r\n if (this._attachments)\r\n this._attachments.collectStatistics(stats);\r\n }\r\n\r\n /** @internal */\r\n public override get defaultExtentLimits() {\r\n return { min: Constant.oneMillimeter, max: this.sheetSize.magnitude() * 10 };\r\n }\r\n\r\n /** @internal */\r\n public override getViewedExtents(): AxisAlignedBox3d {\r\n return this._viewedExtents;\r\n }\r\n\r\n /** Load the size and attachment for this sheet, as well as any other 2d view state characteristics.\r\n * @internal override\r\n */\r\n public override async load(): Promise<void> {\r\n await super.load();\r\n await this._attachmentsInfo.load(this.iModel);\r\n }\r\n\r\n /** @internal */\r\n public override createScene(context: SceneContext): void {\r\n super.createScene(context);\r\n if (this._attachments)\r\n this._attachments.addToScene(context);\r\n }\r\n\r\n /** @internal */\r\n public override get secondaryViewports(): Iterable<Viewport> {\r\n const attachments = this._attachments;\r\n if (!attachments)\r\n return super.secondaryViewports;\r\n\r\n function* iterator() {\r\n for (const attachment of attachments!) {\r\n const vp = attachment.viewport;\r\n if (vp)\r\n yield vp;\r\n }\r\n }\r\n\r\n return {\r\n [Symbol.iterator]: () => iterator(),\r\n };\r\n }\r\n\r\n /** @internal */\r\n private async queryAttachmentIds(): Promise<Id64Array> {\r\n const ecsql = `SELECT ECInstanceId as attachmentId FROM bis.ViewAttachment WHERE model.Id=${this.baseModelId}`;\r\n const ids: string[] = [];\r\n for await (const row of this.iModel.query(ecsql))\r\n ids.push(row[0]);\r\n\r\n return ids;\r\n }\r\n\r\n /** @internal */\r\n public override async changeViewedModel(modelId: Id64String): Promise<void> {\r\n await super.changeViewedModel(modelId);\r\n const attachmentIds = await this.queryAttachmentIds();\r\n this._attachmentsInfo = ViewAttachmentsInfo.fromJSON(attachmentIds);\r\n\r\n assert(undefined === this._attachments);\r\n }\r\n\r\n /** @internal */\r\n public override attachToViewport(args: AttachToViewportArgs): void {\r\n super.attachToViewport(args);\r\n assert(undefined === this._attachments);\r\n this._attachments = this._attachmentsInfo.createAttachments(this);\r\n }\r\n\r\n /** @internal */\r\n public override detachFromViewport(): void {\r\n super.detachFromViewport();\r\n this._attachments = dispose(this._attachments);\r\n }\r\n\r\n /** @internal */\r\n public override get areAllTileTreesLoaded(): boolean {\r\n return super.areAllTileTreesLoaded && (!this._attachments || this._attachments.areAllTileTreesLoaded);\r\n }\r\n\r\n /** Create a sheet border decoration graphic. */\r\n private createBorder(width: number, height: number, context: DecorateContext): RenderGraphic {\r\n const border = SheetBorder.create(width, height, context);\r\n const builder = context.createGraphicBuilder(GraphicType.ViewBackground);\r\n border.addToBuilder(builder);\r\n return builder.finish();\r\n }\r\n\r\n /** @internal */\r\n public override decorate(context: DecorateContext): void {\r\n super.decorate(context);\r\n if (this.sheetSize !== undefined) {\r\n const border = this.createBorder(this.sheetSize.x, this.sheetSize.y, context);\r\n context.setViewBackground(border);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public override computeFitRange(): Range3d {\r\n const size = this.sheetSize;\r\n if (0 >= size.x || 0 >= size.y)\r\n return super.computeFitRange();\r\n return new Range3d(0, 0, -1, size.x, size.y, 1);\r\n }\r\n}\r\n\r\n/** A mostly no-op RenderTarget for an Attachment.\r\n * its Scene and symbology overrides.\r\n */\r\nclass AttachmentTarget extends MockRender.OffScreenTarget {\r\n private readonly _attachment: OrthographicAttachment;\r\n\r\n public constructor(attachment: OrthographicAttachment) {\r\n // The dimensions don't matter - we're not drawing anything.\r\n const rect = new ViewRect(1, 1);\r\n super(IModelApp.renderSystem, rect);\r\n this._attachment = attachment;\r\n }\r\n\r\n public override changeScene(scene: Scene): void {\r\n this._attachment.scene = scene;\r\n }\r\n\r\n public override overrideFeatureSymbology(ovrs: FeatureSymbology.Overrides): void {\r\n this._attachment.symbologyOverrides = ovrs;\r\n }\r\n}\r\n\r\n/** Draws the contents of a view attachment into a sheet view. */\r\ninterface Attachment {\r\n readonly areAllTileTreesLoaded: boolean;\r\n addToScene: (context: SceneContext) => void;\r\n discloseTileTrees: (trees: DisclosedTileTreeSet) => void;\r\n readonly zDepth: number;\r\n collectStatistics: (stats: RenderMemory.Statistics) => void;\r\n viewAttachmentProps: ViewAttachmentProps;\r\n dispose(): void;\r\n readonly viewport?: Viewport;\r\n}\r\n\r\n/** Draws the contents a 2d or orthographic 3d view directly into a sheet view.\r\n * We select tiles for the view in the context of a light-weight offscreen viewport with a no-op RenderTarget, then\r\n * collect the resultant graphics and add them to the sheet view's scene.\r\n */\r\nclass OrthographicAttachment {\r\n private readonly _viewport: OffScreenViewport;\r\n private readonly _props: ViewAttachmentProps;\r\n private readonly _sheetModelId: Id64String;\r\n private readonly _viewFlagOverrides: ViewFlagOverrides;\r\n private readonly _toSheet: Transform;\r\n private readonly _fromSheet: Transform;\r\n private readonly _sizeInMeters: Point2d;\r\n private readonly _range: Range3d;\r\n private readonly _viewRect = new ViewRect(0, 0, 1, 1);\r\n private readonly _originalFrustum = new Frustum();\r\n private readonly _clipVolume?: RenderClipVolume;\r\n private readonly _hiddenLineSettings?: HiddenLine.Settings;\r\n private readonly _scale: { x: number, y: number };\r\n private _debugFeatureTable?: PackedFeatureTable;\r\n public scene?: Scene;\r\n public symbologyOverrides: FeatureSymbology.Overrides;\r\n public readonly zDepth: number;\r\n\r\n public get view(): ViewState {\r\n return this._viewport.view;\r\n }\r\n\r\n public get viewAttachmentProps() {\r\n return this._props;\r\n }\r\n\r\n public get viewport(): Viewport {\r\n return this._viewport;\r\n }\r\n\r\n public constructor(view: ViewState, props: ViewAttachmentProps, sheetView: SheetViewState) {\r\n this.symbologyOverrides = new FeatureSymbology.Overrides(view);\r\n const target = new AttachmentTarget(this);\r\n this._viewport = OffScreenViewport.createViewport(view, target, true);\r\n\r\n this._props = props;\r\n this._sheetModelId = sheetView.baseModelId;\r\n\r\n const applyClip = true; // set to false for debugging\r\n this._viewFlagOverrides = {\r\n ...view.viewFlags,\r\n clipVolume: applyClip,\r\n lighting: false,\r\n shadows: false,\r\n };\r\n\r\n const placement = Placement2d.fromJSON(props.placement);\r\n const range = placement.calculateRange();\r\n this._range = range;\r\n this._sizeInMeters = new Point2d(range.xLength(), range.yLength());\r\n\r\n // Compute transform from attached view's world coordinates to sheet's world coordinates.\r\n // NB: We obtain the extents and origin from the *viewport* not the *view* - they may have been adjusted by the viewport.\r\n const applySkew = true; // set to false for debugging\r\n const skew = applySkew ? view.getAspectRatioSkew() : 1;\r\n const extents = this._viewport.viewingSpace.viewDelta.clone();\r\n const zDepth = Math.abs(extents.z);\r\n const scaleX = this._sizeInMeters.x / Math.abs(extents.x);\r\n const scaleY = skew * this._sizeInMeters.y / Math.abs(extents.y);\r\n this._scale = { x: 1 / scaleX, y: 1 / scaleY };\r\n\r\n const zBias = Frustum2d.depthFromDisplayPriority(props.jsonProperties?.displayPriority ?? 0);\r\n this.zDepth = 1.01 * (zDepth - zBias); // give a little padding so that geometry right up against far plane doesn't get clipped.\r\n\r\n // View origin is at the *back* of the view. Align *front* of view based on display priority.\r\n const viewRot = view.getRotation();\r\n const viewOrg = viewRot.multiplyVector(this._viewport.viewingSpace.viewOrigin);\r\n viewOrg.z += zDepth;\r\n viewRot.multiplyTransposeVectorInPlace(viewOrg);\r\n\r\n const matrix = Matrix3d.createScale(scaleX, scaleY, 1);\r\n matrix.multiplyMatrixMatrix(viewRot, matrix);\r\n const origin = Matrix3d.xyzMinusMatrixTimesXYZ(viewOrg, matrix, viewOrg);\r\n const attachmentOrigin = Point3d.createFrom(placement.origin);\r\n attachmentOrigin.z = zBias;\r\n const viewOrgToAttachment = attachmentOrigin.minus(viewOrg);\r\n origin.addInPlace(viewOrgToAttachment);\r\n this._toSheet = Transform.createRefs(origin, matrix);\r\n this._fromSheet = this._toSheet.inverse()!;\r\n\r\n // ###TODO? If we also apply the attachment's clip to the attached view, we may get additional culling during tile selection.\r\n // However the attached view's frustum is already clipped by intersection with sheet view's frustum, and additional clipping planes\r\n // introduce additional computation, so possibly not worth it.\r\n\r\n // Transform the view's clip (if any) to sheet space\r\n let viewClip = view.viewFlags.clipVolume ? view.getViewClip()?.clone() : undefined;\r\n if (viewClip)\r\n viewClip.transformInPlace(this._toSheet);\r\n else\r\n viewClip = ClipVector.createEmpty();\r\n\r\n let sheetClip;\r\n if (undefined !== props.jsonProperties?.clip)\r\n sheetClip = ClipVector.fromJSON(props.jsonProperties?.clip);\r\n\r\n if (sheetClip && sheetClip.isValid) {\r\n // Clip to view attachment's clip. NB: clip is in sheet coordinate space.\r\n for (const clip of sheetClip.clips)\r\n viewClip.clips.push(clip);\r\n } else {\r\n // Clip to view attachment's bounding box\r\n viewClip.appendShape([\r\n Point3d.create(this._range.low.x, this._range.low.y),\r\n Point3d.create(this._range.high.x, this._range.low.y),\r\n Point3d.create(this._range.high.x, this._range.high.y),\r\n Point3d.create(this._range.low.x, this._range.high.y),\r\n ]);\r\n }\r\n\r\n this._clipVolume = IModelApp.renderSystem.createClipVolume(viewClip);\r\n\r\n // Save off the original frustum (potentially adjusted by viewport).\r\n this._viewport.setupFromView();\r\n this._viewport.viewingSpace.getFrustum(CoordSystem.World, true, this._originalFrustum);\r\n\r\n const applyHiddenLineSettings = true; // for debugging edge display, set to false...\r\n const style = view.displayStyle;\r\n if (style.is3d() && applyHiddenLineSettings)\r\n this._hiddenLineSettings = style.settings.hiddenLineSettings;\r\n }\r\n\r\n public dispose(): void {\r\n this._viewport.dispose();\r\n }\r\n\r\n public discloseTileTrees(trees: DisclosedTileTreeSet): void {\r\n trees.disclose(this._viewport);\r\n }\r\n\r\n public addToScene(context: SceneContext): void {\r\n if (context.viewport.freezeScene)\r\n return;\r\n\r\n if (!context.viewport.view.viewsCategory(this._props.category))\r\n return;\r\n\r\n const wantBounds = context.viewport.wantViewAttachmentBoundaries;\r\n const wantClipShapes = context.viewport.wantViewAttachmentClipShapes;\r\n if (wantBounds || wantClipShapes) {\r\n const builder = context.createSceneGraphicBuilder();\r\n if (wantBounds) {\r\n builder.setSymbology(ColorDef.red, ColorDef.red, 2);\r\n builder.addRangeBox(this._range);\r\n }\r\n\r\n if (wantClipShapes && this._clipVolume) {\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue, 2);\r\n for (const prim of this._clipVolume.clipVector.clips) {\r\n if (!(prim instanceof ClipShape))\r\n continue; // ###TODO handle non-shape primitives, if any such ever encountered\r\n\r\n const pts = [];\r\n const tf = prim.transformFromClip;\r\n for (const pt of prim.polygon) {\r\n const tfPt = tf ? tf.multiplyPoint3d(pt) : pt;\r\n pts.push(new Point2d(tfPt.x, tfPt.y));\r\n }\r\n\r\n builder.addLineString2d(pts, 0);\r\n }\r\n }\r\n\r\n // Put into a Batch so that we can see tooltip with attachment Id on mouseover.\r\n const batch = context.target.renderSystem.createBatch(builder.finish(), this.getDebugFeatureTable(), this._range);\r\n context.outputGraphic(batch);\r\n }\r\n\r\n if (!context.viewport.wantViewAttachments)\r\n return;\r\n\r\n // Pixel size used to compute size of ViewRect so that tiles of appropriate LOD are selected.\r\n const pixelSize = context.viewport.getPixelSizeAtPoint();\r\n if (0 === pixelSize)\r\n return;\r\n\r\n // Adjust attached view frustum based on intersection with sheet view frustum.\r\n const attachFrustum = this._originalFrustum.transformBy(this._toSheet);\r\n const attachFrustumRange = attachFrustum.toRange();\r\n const sheetFrustum = context.viewport.getWorldFrustum();\r\n const sheetFrustumRange = sheetFrustum.toRange();\r\n const intersect = attachFrustumRange.intersect(sheetFrustumRange);\r\n if (intersect.isNull)\r\n return;\r\n\r\n attachFrustum.initFromRange(intersect);\r\n attachFrustum.transformBy(this._fromSheet, attachFrustum);\r\n this._viewport.setupViewFromFrustum(attachFrustum);\r\n\r\n // Adjust view rect based on size of attachment on screen so that tiles of appropriate LOD are selected.\r\n const width = this._sizeInMeters.x * intersect.xLength() / attachFrustumRange.xLength();\r\n const height = this._sizeInMeters.y * intersect.yLength() / attachFrustumRange.yLength();\r\n this._viewRect.width = Math.max(1, Math.round(width / pixelSize));\r\n this._viewRect.height = Math.max(1, Math.round(height / pixelSize));\r\n this._viewport.setRect(this._viewRect);\r\n\r\n // Propagate settings from on-screen viewport.\r\n this._viewport.debugBoundingBoxes = context.viewport.debugBoundingBoxes;\r\n this._viewport.setTileSizeModifier(context.viewport.tileSizeModifier);\r\n\r\n // Create the scene.\r\n this._viewport.renderFrame();\r\n\r\n const scene = this.scene;\r\n if (!scene)\r\n return;\r\n\r\n // Extract scene graphics and insert into on-screen scene context.\r\n const options = {\r\n clipVolume: this._clipVolume,\r\n hline: this._hiddenLineSettings,\r\n frustum: {\r\n is3d: this.view.is3d(),\r\n scale: this._scale,\r\n },\r\n };\r\n\r\n const outputGraphics = (source: RenderGraphic[]) => {\r\n if (0 === source.length)\r\n return;\r\n\r\n const graphics = new GraphicBranch();\r\n graphics.setViewFlagOverrides(this._viewFlagOverrides);\r\n graphics.symbologyOverrides = this.symbologyOverrides;\r\n\r\n for (const graphic of source)\r\n graphics.entries.push(graphic);\r\n\r\n const branch = context.createGraphicBranch(graphics, this._toSheet, options);\r\n context.outputGraphic(branch);\r\n };\r\n\r\n outputGraphics(scene.foreground);\r\n context.withGraphicType(TileGraphicType.BackgroundMap, () => outputGraphics(scene.background));\r\n context.withGraphicType(TileGraphicType.Overlay, () => outputGraphics(scene.overlay));\r\n\r\n // Report tile statistics to sheet view's viewport.\r\n const tileAdmin = IModelApp.tileAdmin;\r\n const selectedAndReady = tileAdmin.getTilesForViewport(this._viewport);\r\n const requested = tileAdmin.getRequestsForViewport(this._viewport);\r\n tileAdmin.addExternalTilesForViewport(context.viewport, {\r\n requested: requested?.size ?? 0,\r\n selected: selectedAndReady?.selected.size ?? 0,\r\n ready: selectedAndReady?.ready.size ?? 0,\r\n });\r\n }\r\n\r\n private getDebugFeatureTable(): PackedFeatureTable {\r\n if (this._debugFeatureTable)\r\n return this._debugFeatureTable;\r\n\r\n const featureTable = new FeatureTable(1, this._sheetModelId);\r\n featureTable.insert(new Feature(this._props.id));\r\n this._debugFeatureTable = PackedFeatureTable.pack(featureTable);\r\n return this._debugFeatureTable;\r\n }\r\n\r\n public get areAllTileTreesLoaded(): boolean {\r\n return this.view.areAllTileTreesLoaded;\r\n }\r\n\r\n public collectStatistics(_stats: RenderMemory.Statistics): void {\r\n // Handled by discloseTileTrees()\r\n }\r\n}\r\n\r\nfunction createRasterAttachmentViewport(_view: ViewState, _rect: ViewRect, _attachment: RasterAttachment): OffScreenViewport {\r\n class RasterAttachmentViewport extends OffScreenViewport {\r\n private _sceneContext?: SceneContext;\r\n private _isSceneReady = false;\r\n private readonly _attachment: RasterAttachment;\r\n\r\n public constructor(view: ViewState, rect: ViewRect, attachment: RasterAttachment) {\r\n super(IModelApp.renderSystem.createOffscreenTarget(rect));\r\n this._attachment = attachment;\r\n this._isAspectRatioLocked = true;\r\n this.changeView(view);\r\n }\r\n\r\n public override createSceneContext(): SceneContext {\r\n assert(!this._isSceneReady);\r\n\r\n this._sceneContext = super.createSceneContext();\r\n return this._sceneContext;\r\n }\r\n\r\n public override renderFrame(): void {\r\n assert(!this._isSceneReady);\r\n\r\n this.clearSceneContext();\r\n super.renderFrame();\r\n\r\n if (undefined !== this._sceneContext) {\r\n this._isSceneReady = !this._sceneContext.hasMissingTiles && this.view.areAllTileTreesLoaded;\r\n if (this._isSceneReady)\r\n this._attachment.produceGraphics(this._sceneContext);\r\n\r\n this._sceneContext = undefined;\r\n }\r\n }\r\n\r\n private clearSceneContext(): void {\r\n this._sceneContext = undefined;\r\n }\r\n\r\n public override addDecorations(_decorations: Decorations): void {\r\n // ###TODO: skybox, ground plane, possibly grid. DecorateContext requires a ScreenViewport...\r\n }\r\n }\r\n\r\n return new RasterAttachmentViewport(_view, _rect, _attachment);\r\n}\r\n\r\n/** Draws a 3d view with camera enabled into a sheet view by producing an image of the view's contents offscreen. */\r\nclass RasterAttachment {\r\n private readonly _props: ViewAttachmentProps;\r\n private readonly _placement: Placement2d;\r\n private readonly _transform: Transform;\r\n public readonly zDepth: number;\r\n private _viewport?: OffScreenViewport;\r\n private _graphics?: RenderGraphic;\r\n\r\n public constructor(view: ViewState, props: ViewAttachmentProps, sheetView: SheetViewState) {\r\n // Render to a 2048x2048 view rect. Scale in Y to preserve aspect ratio.\r\n const maxSize = 2048;\r\n const rect = new ViewRect(0, 0, maxSize, maxSize);\r\n const height = maxSize * view.getAspectRatio() * view.getAspectRatioSkew();\r\n const skew = maxSize / height;\r\n view.setAspectRatioSkew(skew);\r\n\r\n if (true !== props.jsonProperties?.displayOptions?.preserveBackground) {\r\n // Make background color 100% transparent so that Viewport.readImageBuffer() will discard transparent pixels.\r\n const bgColor = sheetView.displayStyle.backgroundColor.withAlpha(0);\r\n view.displayStyle.backgroundColor = bgColor;\r\n }\r\n\r\n this._viewport = createRasterAttachmentViewport(view, rect, this);\r\n this._props = props;\r\n this._placement = Placement2d.fromJSON(props.placement);\r\n this._transform = this._placement.transform;\r\n this.zDepth = Frustum2d.depthFromDisplayPriority(props.jsonProperties?.displayPriority ?? 0);\r\n }\r\n\r\n public dispose(): void {\r\n this._viewport?.dispose();\r\n }\r\n\r\n public get viewAttachmentProps() {\r\n return this._props;\r\n }\r\n\r\n public get viewport(): Viewport | undefined {\r\n return this._viewport;\r\n }\r\n\r\n public get areAllTileTreesLoaded() {\r\n return this._viewport?.areAllTileTreesLoaded ?? true;\r\n }\r\n\r\n public addToScene(context: SceneContext): void {\r\n // ###TODO: check viewport.wantViewAttachmentClipShapes\r\n if (!context.viewport.view.viewsCategory(this._props.category))\r\n return;\r\n\r\n if (context.viewport.wantViewAttachmentBoundaries) {\r\n const builder = context.createSceneGraphicBuilder(this._transform);\r\n builder.setSymbology(ColorDef.red, ColorDef.red, 2);\r\n builder.addRangeBox(Range3d.createRange2d(this._placement.bbox));\r\n context.outputGraphic(builder.finish());\r\n }\r\n\r\n if (!context.viewport.wantViewAttachments)\r\n return;\r\n\r\n if (this._graphics) {\r\n context.outputGraphic(this._graphics);\r\n return;\r\n }\r\n\r\n if (undefined === this._viewport)\r\n return;\r\n\r\n this._viewport.debugBoundingBoxes = context.viewport.debugBoundingBoxes;\r\n this._viewport.setTileSizeModifier(context.viewport.tileSizeModifier);\r\n\r\n this._viewport.renderFrame();\r\n if (this._graphics)\r\n context.outputGraphic(this._graphics);\r\n }\r\n\r\n public discloseTileTrees(trees: DisclosedTileTreeSet) {\r\n if (this._viewport)\r\n trees.disclose(this._viewport);\r\n }\r\n\r\n public produceGraphics(context: SceneContext): void {\r\n assert(context.viewport === this._viewport);\r\n this._graphics = this.createGraphics(this._viewport);\r\n this._viewport = dispose(this._viewport);\r\n\r\n if (undefined !== this._graphics)\r\n context.outputGraphic(this._graphics);\r\n }\r\n\r\n private createGraphics(vp: Viewport): RenderGraphic | undefined {\r\n // Create a texture from the contents of the view.\r\n const image = vp.readImageBuffer({ upsideDown: true });\r\n if (undefined === image)\r\n return undefined;\r\n\r\n const debugImage = false; // set to true to open a window displaying the captured image.\r\n if (debugImage) {\r\n const url = imageBufferToPngDataUrl(image, false);\r\n if (url)\r\n openImageDataUrlInNewWindow(url, \"Attachment\");\r\n }\r\n\r\n const texture = IModelApp.renderSystem.createTexture({\r\n image: { source: image, transparency: TextureTransparency.Opaque },\r\n });\r\n if (!texture)\r\n return undefined;\r\n\r\n // Create a material for the texture\r\n const graphicParams = new GraphicParams();\r\n const materialParams = new RenderMaterial.Params();\r\n materialParams.textureMapping = new TextureMapping(texture, new TextureMapping.Params());\r\n graphicParams.material = IModelApp.renderSystem.createMaterial(materialParams, vp.iModel);\r\n\r\n // Apply the texture to a rectangular polyface.\r\n const depth = this.zDepth;\r\n const east = this._placement.bbox.low.x;\r\n const west = this._placement.bbox.high.x;\r\n const north = this._placement.bbox.low.y;\r\n const south = this._placement.bbox.high.y;\r\n const corners = [\r\n Point3d.create(east, north, depth),\r\n Point3d.create(west, north, depth),\r\n Point3d.create(west, south, depth),\r\n Point3d.create(east, south, depth),\r\n ];\r\n const params = [\r\n Point2d.create(0, 0),\r\n Point2d.create(1, 0),\r\n Point2d.create(1, 1),\r\n Point2d.create(0, 1),\r\n ];\r\n\r\n const strokeOptions = new StrokeOptions();\r\n strokeOptions.needParams = strokeOptions.shouldTriangulate = true;\r\n const polyfaceBuilder = PolyfaceBuilder.create(strokeOptions);\r\n polyfaceBuilder.addQuadFacet(corners, params);\r\n const polyface = polyfaceBuilder.claimPolyface();\r\n\r\n const graphicBuilder = IModelApp.renderSystem.createGraphicBuilder(Transform.createIdentity(), GraphicType.Scene, vp, this._props.id);\r\n graphicBuilder.activateGraphicParams(graphicParams);\r\n graphicBuilder.addPolyface(polyface, false);\r\n const graphic = graphicBuilder.finish();\r\n\r\n // Wrap the polyface in a GraphicBranch.\r\n const branch = new GraphicBranch(true);\r\n const vfOvrs = createDefaultViewFlagOverrides({ clipVolume: true, shadows: false, lighting: false, thematic: false });\r\n\r\n // Disable transparency - background pixels are 100% transparent so they will be discarded anyway. Other pixels are 100% opaque.\r\n vfOvrs.transparency = false;\r\n branch.setViewFlagOverrides(vfOvrs);\r\n branch.symbologyOverrides = new FeatureSymbology.Overrides();\r\n branch.entries.push(graphic);\r\n\r\n // Apply the attachment's clip, if any.\r\n let clipVolume;\r\n if (this._props.jsonProperties?.clip) {\r\n const clipVector = ClipVector.fromJSON(this._props.jsonProperties?.clip);\r\n if (clipVector.isValid)\r\n clipVolume = IModelApp.renderSystem.createClipVolume(clipVector);\r\n }\r\n\r\n return IModelApp.renderSystem.createGraphicBranch(branch, this._transform, { clipVolume });\r\n }\r\n\r\n public collectStatistics(stats: RenderMemory.Statistics): void {\r\n if (this._graphics)\r\n this._graphics.collectStatistics(stats);\r\n }\r\n}\r\n"]}