@luma.gl/core 9.0.0-alpha.3 → 9.0.0-alpha.30

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 (246) hide show
  1. package/LICENSE +2 -1
  2. package/README.md +4 -4
  3. package/dist/adapter/canvas-context.d.ts +109 -0
  4. package/dist/adapter/canvas-context.d.ts.map +1 -0
  5. package/dist/adapter/canvas-context.js +255 -0
  6. package/dist/adapter/canvas-context.js.map +1 -0
  7. package/dist/adapter/device.d.ts +155 -0
  8. package/dist/adapter/device.d.ts.map +1 -0
  9. package/dist/adapter/device.js +76 -0
  10. package/dist/adapter/device.js.map +1 -0
  11. package/dist/adapter/resources/buffer.d.ts +39 -0
  12. package/dist/adapter/resources/buffer.d.ts.map +1 -0
  13. package/dist/adapter/resources/buffer.js +52 -0
  14. package/dist/adapter/resources/buffer.js.map +1 -0
  15. package/dist/adapter/resources/command-buffer.d.ts +10 -0
  16. package/dist/adapter/resources/command-buffer.d.ts.map +1 -0
  17. package/dist/adapter/resources/command-buffer.js +13 -0
  18. package/dist/adapter/resources/command-buffer.js.map +1 -0
  19. package/dist/adapter/resources/command-encoder.d.ts +111 -0
  20. package/dist/adapter/resources/command-encoder.d.ts.map +1 -0
  21. package/dist/adapter/resources/command-encoder.js +16 -0
  22. package/dist/adapter/resources/command-encoder.js.map +1 -0
  23. package/dist/adapter/resources/compute-pass.d.ts +30 -0
  24. package/dist/adapter/resources/compute-pass.d.ts.map +1 -0
  25. package/dist/adapter/resources/compute-pass.js +10 -0
  26. package/dist/adapter/resources/compute-pass.js.map +1 -0
  27. package/dist/adapter/resources/compute-pipeline.d.ts +19 -0
  28. package/dist/adapter/resources/compute-pipeline.d.ts.map +1 -0
  29. package/dist/adapter/resources/compute-pipeline.js +19 -0
  30. package/dist/adapter/resources/compute-pipeline.js.map +1 -0
  31. package/dist/adapter/resources/external-texture.d.ts +11 -0
  32. package/dist/adapter/resources/external-texture.d.ts.map +1 -0
  33. package/dist/adapter/resources/external-texture.js +15 -0
  34. package/dist/adapter/resources/external-texture.js.map +1 -0
  35. package/dist/adapter/resources/framebuffer.d.ts +49 -0
  36. package/dist/adapter/resources/framebuffer.d.ts.map +1 -0
  37. package/dist/adapter/resources/framebuffer.js +103 -0
  38. package/dist/adapter/resources/framebuffer.js.map +1 -0
  39. package/dist/adapter/resources/render-pass.d.ts +51 -0
  40. package/dist/adapter/resources/render-pass.d.ts.map +1 -0
  41. package/dist/adapter/resources/render-pass.js +24 -0
  42. package/dist/adapter/resources/render-pass.js.map +1 -0
  43. package/dist/adapter/resources/render-pipeline.d.ts +82 -0
  44. package/dist/adapter/resources/render-pipeline.d.ts.map +1 -0
  45. package/dist/adapter/resources/render-pipeline.js +36 -0
  46. package/dist/adapter/resources/render-pipeline.js.map +1 -0
  47. package/dist/adapter/resources/resource.d.ts +78 -0
  48. package/dist/adapter/resources/resource.d.ts.map +1 -0
  49. package/dist/adapter/resources/resource.js +103 -0
  50. package/dist/adapter/resources/resource.js.map +1 -0
  51. package/dist/adapter/resources/sampler.d.ts +28 -0
  52. package/dist/adapter/resources/sampler.d.ts.map +1 -0
  53. package/dist/adapter/resources/sampler.js +24 -0
  54. package/dist/adapter/resources/sampler.js.map +1 -0
  55. package/dist/adapter/resources/shader.d.ts +32 -0
  56. package/dist/adapter/resources/shader.d.ts.map +1 -0
  57. package/dist/adapter/resources/shader.js +25 -0
  58. package/dist/adapter/resources/shader.js.map +1 -0
  59. package/dist/adapter/resources/texture.d.ts +85 -0
  60. package/dist/adapter/resources/texture.d.ts.map +1 -0
  61. package/dist/adapter/resources/texture.js +46 -0
  62. package/dist/adapter/resources/texture.js.map +1 -0
  63. package/dist/adapter/types/accessor.d.ts +23 -0
  64. package/dist/adapter/types/accessor.d.ts.map +1 -0
  65. package/dist/adapter/types/accessor.js +2 -0
  66. package/dist/adapter/types/accessor.js.map +1 -0
  67. package/dist/adapter/types/parameters.d.ts +97 -0
  68. package/dist/adapter/types/parameters.d.ts.map +1 -0
  69. package/dist/adapter/types/parameters.js +28 -0
  70. package/dist/adapter/types/parameters.js.map +1 -0
  71. package/dist/adapter/types/shader-layout.d.ts +201 -0
  72. package/dist/adapter/types/shader-layout.d.ts.map +1 -0
  73. package/dist/adapter/types/shader-layout.js +2 -0
  74. package/dist/adapter/types/shader-layout.js.map +1 -0
  75. package/dist/adapter/types/texture-formats.d.ts +12 -0
  76. package/dist/adapter/types/texture-formats.d.ts.map +1 -0
  77. package/dist/adapter/types/texture-formats.js +2 -0
  78. package/dist/adapter/types/texture-formats.js.map +1 -0
  79. package/dist/adapter/types/types.d.ts +79 -0
  80. package/dist/adapter/types/types.d.ts.map +1 -0
  81. package/dist/adapter/types/types.js +2 -0
  82. package/dist/adapter/types/types.js.map +1 -0
  83. package/dist/adapter/types/uniform-formats.d.ts +3 -0
  84. package/dist/adapter/types/uniform-formats.d.ts.map +1 -0
  85. package/dist/adapter/types/uniform-formats.js +2 -0
  86. package/dist/adapter/types/uniform-formats.js.map +1 -0
  87. package/dist/adapter/types/vertex-formats.d.ts +8 -0
  88. package/dist/adapter/types/vertex-formats.d.ts.map +1 -0
  89. package/dist/adapter/types/vertex-formats.js +2 -0
  90. package/dist/adapter/types/vertex-formats.js.map +1 -0
  91. package/dist/adapter/utils/decode-data-type.d.ts +16 -0
  92. package/dist/adapter/utils/decode-data-type.d.ts.map +1 -0
  93. package/dist/adapter/utils/decode-data-type.js +43 -0
  94. package/dist/adapter/utils/decode-data-type.js.map +1 -0
  95. package/dist/adapter/utils/decode-texture-format.d.ts +19 -0
  96. package/dist/adapter/utils/decode-texture-format.d.ts.map +1 -0
  97. package/dist/adapter/utils/decode-texture-format.js +100 -0
  98. package/dist/adapter/utils/decode-texture-format.js.map +1 -0
  99. package/dist/adapter/utils/decode-uniform-format.d.ts +9 -0
  100. package/dist/adapter/utils/decode-uniform-format.d.ts.map +1 -0
  101. package/dist/adapter/utils/decode-uniform-format.js +103 -0
  102. package/dist/adapter/utils/decode-uniform-format.js.map +1 -0
  103. package/dist/adapter/utils/decode-vertex-format.d.ts +22 -0
  104. package/dist/adapter/utils/decode-vertex-format.d.ts.map +1 -0
  105. package/dist/adapter/utils/decode-vertex-format.js +25 -0
  106. package/dist/adapter/utils/decode-vertex-format.js.map +1 -0
  107. package/dist/dist.dev.js +2671 -0
  108. package/dist/index.cjs +1753 -0
  109. package/dist/index.d.ts +66 -128
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +36 -18
  112. package/dist/index.js.map +1 -1
  113. package/dist/init.d.ts +5 -0
  114. package/dist/init.d.ts.map +1 -0
  115. package/dist/init.js +24 -0
  116. package/dist/init.js.map +1 -0
  117. package/dist/lib/compiler-log/compiler-message.d.ts +8 -0
  118. package/dist/lib/compiler-log/compiler-message.d.ts.map +1 -0
  119. package/dist/lib/compiler-log/compiler-message.js +2 -0
  120. package/dist/lib/compiler-log/compiler-message.js.map +1 -0
  121. package/dist/lib/compiler-log/format-compiler-log.d.ts +6 -0
  122. package/dist/lib/compiler-log/format-compiler-log.d.ts.map +1 -0
  123. package/dist/lib/compiler-log/format-compiler-log.js +34 -0
  124. package/dist/lib/compiler-log/format-compiler-log.js.map +1 -0
  125. package/dist/lib/luma.d.ts +21 -0
  126. package/dist/lib/luma.d.ts.map +1 -0
  127. package/dist/lib/luma.js +60 -0
  128. package/dist/lib/luma.js.map +1 -0
  129. package/dist/lib/request-animation-frame.d.ts +3 -0
  130. package/dist/lib/request-animation-frame.d.ts.map +1 -0
  131. package/dist/lib/request-animation-frame.js +7 -0
  132. package/dist/lib/request-animation-frame.js.map +1 -0
  133. package/dist/lib/uniform-block.d.ts +21 -0
  134. package/dist/lib/uniform-block.d.ts.map +1 -0
  135. package/dist/lib/uniform-block.js +50 -0
  136. package/dist/lib/uniform-block.js.map +1 -0
  137. package/dist/lib/uniform-buffer-layout.d.ts +23 -0
  138. package/dist/lib/uniform-buffer-layout.d.ts.map +1 -0
  139. package/dist/lib/uniform-buffer-layout.js +35 -0
  140. package/dist/lib/uniform-buffer-layout.js.map +1 -0
  141. package/dist/lib/utils/array-utils-flat.d.ts +10 -0
  142. package/dist/lib/utils/array-utils-flat.d.ts.map +1 -0
  143. package/dist/lib/utils/array-utils-flat.js +36 -0
  144. package/dist/lib/utils/array-utils-flat.js.map +1 -0
  145. package/dist/lib/utils/assert.d.ts +2 -0
  146. package/dist/lib/utils/assert.d.ts.map +1 -0
  147. package/dist/lib/utils/assert.js +6 -0
  148. package/dist/lib/utils/assert.js.map +1 -0
  149. package/dist/lib/utils/cast.d.ts +3 -0
  150. package/dist/lib/utils/cast.d.ts.map +1 -0
  151. package/dist/lib/utils/cast.js +4 -0
  152. package/dist/lib/utils/cast.js.map +1 -0
  153. package/dist/lib/utils/check-props.d.ts +7 -0
  154. package/dist/lib/utils/check-props.d.ts.map +1 -0
  155. package/dist/lib/utils/check-props.js +32 -0
  156. package/dist/lib/utils/check-props.js.map +1 -0
  157. package/dist/lib/utils/deep-equal.d.ts +9 -0
  158. package/dist/lib/utils/deep-equal.d.ts.map +1 -0
  159. package/dist/lib/utils/deep-equal.js +40 -0
  160. package/dist/lib/utils/deep-equal.js.map +1 -0
  161. package/dist/lib/utils/format-value.d.ts +7 -0
  162. package/dist/lib/utils/format-value.d.ts.map +1 -0
  163. package/dist/lib/utils/format-value.js +42 -0
  164. package/dist/lib/utils/format-value.js.map +1 -0
  165. package/dist/lib/utils/load-file.d.ts +35 -0
  166. package/dist/lib/utils/load-file.d.ts.map +1 -0
  167. package/dist/lib/utils/load-file.js +48 -0
  168. package/dist/lib/utils/load-file.js.map +1 -0
  169. package/dist/lib/utils/log.d.ts +4 -0
  170. package/dist/lib/utils/log.d.ts.map +1 -0
  171. package/dist/lib/utils/log.js +5 -0
  172. package/dist/lib/utils/log.js.map +1 -0
  173. package/dist/lib/utils/random.d.ts +5 -0
  174. package/dist/lib/utils/random.d.ts.map +1 -0
  175. package/dist/lib/utils/random.js +14 -0
  176. package/dist/lib/utils/random.js.map +1 -0
  177. package/dist/lib/utils/stats-manager.d.ts +12 -0
  178. package/dist/lib/utils/stats-manager.d.ts.map +1 -0
  179. package/dist/lib/utils/stats-manager.js +20 -0
  180. package/dist/lib/utils/stats-manager.js.map +1 -0
  181. package/dist/lib/utils/stub-methods.d.ts +2 -0
  182. package/dist/lib/utils/stub-methods.d.ts.map +1 -0
  183. package/dist/lib/utils/stub-methods.js +15 -0
  184. package/dist/lib/utils/stub-methods.js.map +1 -0
  185. package/dist/lib/utils/utils.d.ts +15 -0
  186. package/dist/lib/utils/utils.d.ts.map +1 -0
  187. package/dist/lib/utils/utils.js +19 -0
  188. package/dist/lib/utils/utils.js.map +1 -0
  189. package/dist/types.d.ts +22 -0
  190. package/dist/types.d.ts.map +1 -0
  191. package/dist/types.js +2 -0
  192. package/dist/types.js.map +1 -0
  193. package/dist.min.js +24 -0
  194. package/package.json +17 -12
  195. package/src/adapter/canvas-context.ts +433 -0
  196. package/src/adapter/device.ts +340 -0
  197. package/src/adapter/resources/buffer.ts +123 -0
  198. package/src/adapter/resources/command-buffer.ts +38 -0
  199. package/src/adapter/resources/command-encoder.ts +171 -0
  200. package/src/adapter/resources/compute-pass.ts +48 -0
  201. package/src/adapter/resources/compute-pipeline.ts +36 -0
  202. package/src/adapter/resources/external-texture.ts +21 -0
  203. package/src/adapter/resources/framebuffer.ts +229 -0
  204. package/src/adapter/resources/render-pass.ts +117 -0
  205. package/src/adapter/resources/render-pipeline.ts +129 -0
  206. package/src/adapter/resources/resource.ts +182 -0
  207. package/src/adapter/resources/sampler.ts +53 -0
  208. package/src/adapter/resources/shader.ts +56 -0
  209. package/src/adapter/resources/texture.ts +143 -0
  210. package/src/adapter/types/accessor.ts +34 -0
  211. package/src/adapter/types/parameters.ts +250 -0
  212. package/src/adapter/types/shader-layout.ts +255 -0
  213. package/src/adapter/types/texture-formats.ts +167 -0
  214. package/src/adapter/types/types.ts +96 -0
  215. package/src/adapter/types/uniform-formats.ts +31 -0
  216. package/src/adapter/types/vertex-formats.ts +69 -0
  217. package/src/adapter/utils/decode-data-type.ts +62 -0
  218. package/src/adapter/utils/decode-texture-format.ts +190 -0
  219. package/src/adapter/utils/decode-uniform-format.ts +43 -0
  220. package/src/adapter/utils/decode-vertex-format.ts +49 -0
  221. package/src/index.ts +144 -104
  222. package/src/init.ts +47 -0
  223. package/src/lib/compiler-log/compiler-message.ts +9 -0
  224. package/src/lib/compiler-log/format-compiler-log.ts +67 -0
  225. package/src/lib/luma.ts +82 -0
  226. package/src/lib/request-animation-frame.ts +15 -0
  227. package/src/lib/uniform-block.ts +75 -0
  228. package/src/lib/uniform-buffer-layout.ts +45 -0
  229. package/src/lib/utils/array-utils-flat.ts +42 -0
  230. package/src/lib/utils/assert.ts +7 -0
  231. package/src/lib/utils/cast.ts +4 -0
  232. package/src/lib/utils/check-props.ts +74 -0
  233. package/src/lib/utils/deep-equal.ts +47 -0
  234. package/src/lib/utils/format-value.ts +40 -0
  235. package/src/lib/utils/load-file.ts +88 -0
  236. package/src/lib/utils/log.ts +4 -0
  237. package/src/lib/utils/random.ts +17 -0
  238. package/src/lib/utils/stats-manager.ts +23 -0
  239. package/src/lib/utils/stub-methods.ts +20 -0
  240. package/src/lib/utils/utils.ts +35 -0
  241. package/src/types.ts +45 -0
  242. package/dist/bundle.d.ts +0 -2
  243. package/dist/bundle.d.ts.map +0 -1
  244. package/dist/bundle.js +0 -5
  245. package/dist/bundle.js.map +0 -1
  246. package/src/bundle.ts +0 -4
package/LICENSE CHANGED
@@ -1,4 +1,5 @@
1
- Copyright (c) 2020 Urban Computing Foundation
1
+ Copyright (c) 2020 OpenJS Foundation
2
+ Copyright (c) 2020 vis.gl contributors
2
3
 
3
4
  This software includes parts initially developed by Uber and open sourced under MIT license.
4
5
  Copyright (c) 2015 Uber Technologies, Inc.
package/README.md CHANGED
@@ -1,14 +1,14 @@
1
- # luma.gl
1
+ # @luma.gl/api
2
2
 
3
3
  <h1 align="center">luma.gl | <a href="https://luma.gl">Docs</a></h1>
4
4
 
5
- <h5 align="center">luma.gl: WebGL2 Components for Visualization</h5>
5
+ <h5 align="center">luma.gl: WebGPU and WebGL2 Components for GPU Visualization and Compute</h5>
6
6
 
7
7
  ## Overview
8
8
 
9
- luma.gl is a set of WebGL2 components for high-performance GPU-based rendering and computation in the browser.
9
+ luma.gl is a set of WebGPU and WebGL2 components for high-performance GPU-based rendering and computation in the browser.
10
10
 
11
- It is the engine that powers applications and frameworks like
11
+ luma.gl is the GPU engine that powers applications and frameworks like
12
12
 
13
13
  - [kepler.gl](https://github.com/keplergl/kepler.gl) WebGL based visualization overlays
14
14
  - [deck.gl](https://github.com/visgl/deck.gl) WebGL based visualization overlays
@@ -0,0 +1,109 @@
1
+ import type { Device } from './device';
2
+ import type { Framebuffer } from './resources/framebuffer';
3
+ /** Properties for a CanvasContext */
4
+ export type CanvasContextProps = {
5
+ /** If canvas not supplied, will be created and added to the DOM. If string, will be looked up in the DOM */
6
+ canvas?: HTMLCanvasElement | OffscreenCanvas | string | null;
7
+ /** If new canvas is created, it will be created in the specified container, otherwise appended to body */
8
+ container?: HTMLElement | string | null;
9
+ /** Width in pixels of the canvas */
10
+ width?: number;
11
+ /** Height in pixels of the canvas */
12
+ height?: number;
13
+ /** Whether to apply a device pixels scale factor (`true` uses browser DPI) */
14
+ useDevicePixels?: boolean | number;
15
+ /** Whether to track resizes (if not ) */
16
+ autoResize?: boolean;
17
+ /** Visibility (only used if new canvas is created). */
18
+ visible?: boolean;
19
+ /** WebGPU only https://www.w3.org/TR/webgpu/#canvas-configuration */
20
+ colorSpace?: 'srgb';
21
+ /** WebGPU only https://www.w3.org/TR/webgpu/#canvas-configuration */
22
+ alphaMode?: 'opaque' | 'premultiplied';
23
+ };
24
+ /**
25
+ * Manages a canvas. Supports both HTML or offscreen canvas
26
+ * - Creates a new canvas or looks up a canvas from the DOM
27
+ * - Provides check for DOM loaded
28
+ * @todo commit(): https://github.com/w3ctag/design-reviews/issues/288
29
+ * @todo transferControlToOffscreen: https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/transferControlToOffscreen
30
+ */
31
+ export declare abstract class CanvasContext {
32
+ abstract readonly device: Device;
33
+ readonly id: string;
34
+ readonly props: Required<CanvasContextProps>;
35
+ readonly canvas: HTMLCanvasElement | OffscreenCanvas;
36
+ readonly htmlCanvas?: HTMLCanvasElement;
37
+ readonly offscreenCanvas?: OffscreenCanvas;
38
+ readonly type: 'html-canvas' | 'offscreen-canvas' | 'node';
39
+ width: number;
40
+ height: number;
41
+ readonly resizeObserver: ResizeObserver | undefined;
42
+ /** State used by luma.gl classes: TODO - move to canvasContext*/
43
+ readonly _canvasSizeInfo: {
44
+ clientWidth: number;
45
+ clientHeight: number;
46
+ devicePixelRatio: number;
47
+ };
48
+ /** Check if the DOM is loaded */
49
+ static get isPageLoaded(): boolean;
50
+ /**
51
+ * Get a 'lazy' promise that resolves when the DOM is loaded.
52
+ * @note Since there may be limitations on number of `load` event listeners,
53
+ * it is recommended avoid calling this function until actually needed.
54
+ * I.e. don't call it until you know that you will be looking up a string in the DOM.
55
+ */
56
+ static pageLoaded: Promise<void>;
57
+ constructor(props?: CanvasContextProps);
58
+ /** Returns a framebuffer with properly resized current 'swap chain' textures */
59
+ abstract getCurrentFramebuffer(): Framebuffer;
60
+ /**
61
+ * Returns the current DPR, if props.useDevicePixels is true
62
+ * Device refers to physical
63
+ */
64
+ getDevicePixelRatio(useDevicePixels?: boolean | number): number;
65
+ /**
66
+ * Returns the size of drawing buffer in device pixels.
67
+ * @note This can be different from the 'CSS' size of a canvas, and also from the
68
+ * canvas' internal drawing buffer size (.width, .height).
69
+ * This is the size required to cover the canvas, adjusted for DPR
70
+ */
71
+ getPixelSize(): [number, number];
72
+ getAspect(): number;
73
+ /**
74
+ * Returns multiplier need to convert CSS size to Device size
75
+ */
76
+ cssToDeviceRatio(): number;
77
+ /**
78
+ * Maps CSS pixel position to device pixel position
79
+ */
80
+ cssToDevicePixels(cssPixel: number[], yInvert?: boolean): {
81
+ x: number;
82
+ y: number;
83
+ width: number;
84
+ height: number;
85
+ };
86
+ /**
87
+ * Use devicePixelRatio to set canvas width and height
88
+ * @note this is a raw port of luma.gl v8 code. Might be worth a review
89
+ */
90
+ setDevicePixelRatio(devicePixelRatio: number, options?: {
91
+ width?: number;
92
+ height?: number;
93
+ }): void;
94
+ /** @todo Major hack done to port the CSS methods above, base canvas context should not depend on WebGL */
95
+ getDrawingBufferSize(): [number, number];
96
+ abstract resize(options?: {
97
+ width?: number;
98
+ height?: number;
99
+ useDevicePixels?: boolean | number;
100
+ }): void;
101
+ /** Perform platform specific updates (WebGPU vs WebGL) */
102
+ protected abstract update(): void;
103
+ /**
104
+ * Allows subclass constructor to override the canvas id for auto created canvases.
105
+ * This can really help when debugging DOM in apps that create multiple devices
106
+ */
107
+ protected _setAutoCreatedCanvasId(id: string): void;
108
+ }
109
+ //# sourceMappingURL=canvas-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-context.d.ts","sourceRoot":"","sources":["../../src/adapter/canvas-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,yBAAyB,CAAC;AAMzD,qCAAqC;AACrC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,4GAA4G;IAC5G,MAAM,CAAC,EAAE,iBAAiB,GAAG,eAAe,GAAG,MAAM,GAAG,IAAI,CAAC;IAC7D,0GAA0G;IAC1G,SAAS,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAAC;IACxC,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACnC,yCAAyC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uDAAuD;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,SAAS,CAAC,EAAE,QAAQ,GAAG,eAAe,CAAC;CACxC,CAAC;AAcF;;;;;;GAMG;AACH,8BAAsB,aAAa;IACjC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,CAAC;IACrD,QAAQ,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,kBAAkB,GAAG,MAAM,CAAC;IAE3D,KAAK,EAAE,MAAM,CAAK;IAClB,MAAM,EAAE,MAAM,CAAK;IAEnB,QAAQ,CAAC,cAAc,EAAE,cAAc,GAAG,SAAS,CAAC;IAEpD,iEAAiE;IACjE,QAAQ,CAAC,eAAe;;;;MAA0D;IAElF,iCAAiC;IACjC,MAAM,KAAK,YAAY,IAAI,OAAO,CAEjC;IAED;;;;;OAKG;IACH,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAwB;gBAE5C,KAAK,CAAC,EAAE,kBAAkB;IAqDtC,gFAAgF;IAChF,QAAQ,CAAC,qBAAqB,IAAI,WAAW;IAE7C;;;OAGG;IACH,mBAAmB,CAAC,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM;IAoB/D;;;;;OAKG;IACH,YAAY,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;IAkBhC,SAAS,IAAI,MAAM;IAKnB;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAY1B;;OAEG;IACH,iBAAiB,CACf,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,GAAE,OAAc,GACtB;QACD,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB;IAMD;;;OAGG;IACH,mBAAmB,CACjB,gBAAgB,EAAE,MAAM,EACxB,OAAO,GAAE;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAM,GAC9C,IAAI;IAwDP,0GAA0G;IAC1G,oBAAoB,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;IAUxC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;KACpC,GAAG,IAAI;IAER,0DAA0D;IAC1D,SAAS,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI;IAEjC;;;OAGG;IACH,SAAS,CAAC,uBAAuB,CAAC,EAAE,EAAE,MAAM;CAK7C"}
@@ -0,0 +1,255 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import { isBrowser } from '@probe.gl/env';
3
+ import { log } from "../lib/utils/log.js";
4
+ const isPage = isBrowser() && typeof document !== 'undefined';
5
+ const isPageLoaded = () => isPage && document.readyState === 'complete';
6
+ const DEFAULT_CANVAS_CONTEXT_PROPS = {
7
+ canvas: null,
8
+ width: 800,
9
+ height: 600,
10
+ useDevicePixels: true,
11
+ autoResize: true,
12
+ container: null,
13
+ visible: true,
14
+ colorSpace: 'srgb',
15
+ alphaMode: 'opaque'
16
+ };
17
+ export class CanvasContext {
18
+ static get isPageLoaded() {
19
+ return isPageLoaded();
20
+ }
21
+ constructor(props) {
22
+ _defineProperty(this, "device", void 0);
23
+ _defineProperty(this, "id", void 0);
24
+ _defineProperty(this, "props", void 0);
25
+ _defineProperty(this, "canvas", void 0);
26
+ _defineProperty(this, "htmlCanvas", void 0);
27
+ _defineProperty(this, "offscreenCanvas", void 0);
28
+ _defineProperty(this, "type", void 0);
29
+ _defineProperty(this, "width", 1);
30
+ _defineProperty(this, "height", 1);
31
+ _defineProperty(this, "resizeObserver", void 0);
32
+ _defineProperty(this, "_canvasSizeInfo", {
33
+ clientWidth: 0,
34
+ clientHeight: 0,
35
+ devicePixelRatio: 1
36
+ });
37
+ this.props = {
38
+ ...DEFAULT_CANVAS_CONTEXT_PROPS,
39
+ ...props
40
+ };
41
+ props = this.props;
42
+ if (!isBrowser()) {
43
+ this.id = 'node-canvas-context';
44
+ this.type = 'node';
45
+ this.width = this.props.width;
46
+ this.height = this.props.height;
47
+ this.canvas = null;
48
+ return;
49
+ }
50
+ if (!props.canvas) {
51
+ var _props, _props2;
52
+ const canvas = createCanvas(props);
53
+ const container = getContainer(((_props = props) === null || _props === void 0 ? void 0 : _props.container) || null);
54
+ container.insertBefore(canvas, container.firstChild);
55
+ this.canvas = canvas;
56
+ if (!((_props2 = props) !== null && _props2 !== void 0 && _props2.visible)) {
57
+ this.canvas.style.visibility = 'hidden';
58
+ }
59
+ } else if (typeof props.canvas === 'string') {
60
+ this.canvas = getCanvasFromDOM(props.canvas);
61
+ } else {
62
+ this.canvas = props.canvas;
63
+ }
64
+ if (this.canvas instanceof HTMLCanvasElement) {
65
+ this.id = this.canvas.id;
66
+ this.type = 'html-canvas';
67
+ this.htmlCanvas = this.canvas;
68
+ } else {
69
+ this.id = 'offscreen-canvas';
70
+ this.type = 'offscreen-canvas';
71
+ this.offscreenCanvas = this.canvas;
72
+ }
73
+ if (this.canvas instanceof HTMLCanvasElement && props.autoResize) {
74
+ this.resizeObserver = new ResizeObserver(entries => {
75
+ for (const entry of entries) {
76
+ if (entry.target === this.canvas) {
77
+ this.update();
78
+ }
79
+ }
80
+ });
81
+ this.resizeObserver.observe(this.canvas);
82
+ }
83
+ }
84
+ getDevicePixelRatio(useDevicePixels) {
85
+ if (typeof OffscreenCanvas !== 'undefined' && this.canvas instanceof OffscreenCanvas) {
86
+ return 1;
87
+ }
88
+ useDevicePixels = useDevicePixels === undefined ? this.props.useDevicePixels : useDevicePixels;
89
+ if (!useDevicePixels || useDevicePixels <= 0) {
90
+ return 1;
91
+ }
92
+ if (useDevicePixels === true) {
93
+ const dpr = typeof window !== 'undefined' && window.devicePixelRatio;
94
+ return dpr || 1;
95
+ }
96
+ return useDevicePixels;
97
+ }
98
+ getPixelSize() {
99
+ switch (this.type) {
100
+ case 'node':
101
+ return [this.width, this.height];
102
+ case 'offscreen-canvas':
103
+ return [this.canvas.width, this.canvas.height];
104
+ case 'html-canvas':
105
+ const dpr = this.getDevicePixelRatio();
106
+ const canvas = this.canvas;
107
+ return canvas.parentElement ? [canvas.clientWidth * dpr, canvas.clientHeight * dpr] : [this.canvas.width, this.canvas.height];
108
+ default:
109
+ throw new Error(this.type);
110
+ }
111
+ }
112
+ getAspect() {
113
+ const [width, height] = this.getPixelSize();
114
+ return width / height;
115
+ }
116
+ cssToDeviceRatio() {
117
+ try {
118
+ const [drawingBufferWidth] = this.getDrawingBufferSize();
119
+ const {
120
+ clientWidth
121
+ } = this._canvasSizeInfo;
122
+ return clientWidth ? drawingBufferWidth / clientWidth : 1;
123
+ } catch {
124
+ return 1;
125
+ }
126
+ }
127
+ cssToDevicePixels(cssPixel) {
128
+ let yInvert = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
129
+ const ratio = this.cssToDeviceRatio();
130
+ const [width, height] = this.getDrawingBufferSize();
131
+ return scalePixels(cssPixel, ratio, width, height, yInvert);
132
+ }
133
+ setDevicePixelRatio(devicePixelRatio) {
134
+ let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
135
+ if (!this.htmlCanvas) {
136
+ return;
137
+ }
138
+ let clientWidth = 'width' in options ? options.width : this.htmlCanvas.clientWidth;
139
+ let clientHeight = 'height' in options ? options.height : this.htmlCanvas.clientHeight;
140
+ if (!clientWidth || !clientHeight) {
141
+ log.log(1, 'Canvas clientWidth/clientHeight is 0')();
142
+ devicePixelRatio = 1;
143
+ clientWidth = this.htmlCanvas.width || 1;
144
+ clientHeight = this.htmlCanvas.height || 1;
145
+ }
146
+ const cachedSize = this._canvasSizeInfo;
147
+ if (cachedSize.clientWidth !== clientWidth || cachedSize.clientHeight !== clientHeight || cachedSize.devicePixelRatio !== devicePixelRatio) {
148
+ let clampedPixelRatio = devicePixelRatio;
149
+ const canvasWidth = Math.floor(clientWidth * clampedPixelRatio);
150
+ const canvasHeight = Math.floor(clientHeight * clampedPixelRatio);
151
+ this.htmlCanvas.width = canvasWidth;
152
+ this.htmlCanvas.height = canvasHeight;
153
+ const [drawingBufferWidth, drawingBufferHeight] = this.getDrawingBufferSize();
154
+ if (drawingBufferWidth !== canvasWidth || drawingBufferHeight !== canvasHeight) {
155
+ clampedPixelRatio = Math.min(drawingBufferWidth / clientWidth, drawingBufferHeight / clientHeight);
156
+ this.htmlCanvas.width = Math.floor(clientWidth * clampedPixelRatio);
157
+ this.htmlCanvas.height = Math.floor(clientHeight * clampedPixelRatio);
158
+ log.warn('Device pixel ratio clamped')();
159
+ }
160
+ this._canvasSizeInfo.clientWidth = clientWidth;
161
+ this._canvasSizeInfo.clientHeight = clientHeight;
162
+ this._canvasSizeInfo.devicePixelRatio = devicePixelRatio;
163
+ }
164
+ }
165
+ getDrawingBufferSize() {
166
+ const gl = this.device.gl;
167
+ if (!gl) {
168
+ throw new Error('canvas size');
169
+ }
170
+ return [gl.drawingBufferWidth, gl.drawingBufferHeight];
171
+ }
172
+ _setAutoCreatedCanvasId(id) {
173
+ var _this$htmlCanvas;
174
+ if (((_this$htmlCanvas = this.htmlCanvas) === null || _this$htmlCanvas === void 0 ? void 0 : _this$htmlCanvas.id) === 'lumagl-auto-created-canvas') {
175
+ this.htmlCanvas.id = id;
176
+ }
177
+ }
178
+ }
179
+ _defineProperty(CanvasContext, "pageLoaded", getPageLoadPromise());
180
+ function getPageLoadPromise() {
181
+ if (isPageLoaded() || typeof window === 'undefined') {
182
+ return Promise.resolve();
183
+ }
184
+ return new Promise(resolve => {
185
+ window.addEventListener('load', () => resolve());
186
+ });
187
+ }
188
+ function getContainer(container) {
189
+ if (typeof container === 'string') {
190
+ const element = document.getElementById(container);
191
+ if (!element && !isPageLoaded()) {
192
+ throw new Error("Accessing '".concat(container, "' before page was loaded"));
193
+ }
194
+ if (!element) {
195
+ throw new Error("".concat(container, " is not an HTML element"));
196
+ }
197
+ return element;
198
+ } else if (container) {
199
+ return container;
200
+ }
201
+ return document.body;
202
+ }
203
+ function getCanvasFromDOM(canvasId) {
204
+ const canvas = document.getElementById(canvasId);
205
+ if (!canvas && !isPageLoaded()) {
206
+ throw new Error("Accessing '".concat(canvasId, "' before page was loaded"));
207
+ }
208
+ if (!(canvas instanceof HTMLCanvasElement)) {
209
+ throw new Error("'".concat(canvas, "' is not a canvas element"));
210
+ }
211
+ return canvas;
212
+ }
213
+ function createCanvas(props) {
214
+ const {
215
+ width,
216
+ height
217
+ } = props;
218
+ const targetCanvas = document.createElement('canvas');
219
+ targetCanvas.id = 'lumagl-auto-created-canvas';
220
+ targetCanvas.width = width || 1;
221
+ targetCanvas.height = height || 1;
222
+ targetCanvas.style.width = Number.isFinite(width) ? "".concat(width, "px") : '100%';
223
+ targetCanvas.style.height = Number.isFinite(height) ? "".concat(height, "px") : '100%';
224
+ return targetCanvas;
225
+ }
226
+ function scalePixels(pixel, ratio, width, height, yInvert) {
227
+ const point = pixel;
228
+ const x = scaleX(point[0], ratio, width);
229
+ let y = scaleY(point[1], ratio, height, yInvert);
230
+ let t = scaleX(point[0] + 1, ratio, width);
231
+ const xHigh = t === width - 1 ? t : t - 1;
232
+ t = scaleY(point[1] + 1, ratio, height, yInvert);
233
+ let yHigh;
234
+ if (yInvert) {
235
+ t = t === 0 ? t : t + 1;
236
+ yHigh = y;
237
+ y = t;
238
+ } else {
239
+ yHigh = t === height - 1 ? t : t - 1;
240
+ }
241
+ return {
242
+ x,
243
+ y,
244
+ width: Math.max(xHigh - x + 1, 1),
245
+ height: Math.max(yHigh - y + 1, 1)
246
+ };
247
+ }
248
+ function scaleX(x, ratio, width) {
249
+ const r = Math.min(Math.round(x * ratio), width - 1);
250
+ return r;
251
+ }
252
+ function scaleY(y, ratio, height, yInvert) {
253
+ return yInvert ? Math.max(0, height - 1 - Math.round(y * ratio)) : Math.min(Math.round(y * ratio), height - 1);
254
+ }
255
+ //# sourceMappingURL=canvas-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-context.js","names":["isBrowser","log","isPage","document","isPageLoaded","readyState","DEFAULT_CANVAS_CONTEXT_PROPS","canvas","width","height","useDevicePixels","autoResize","container","visible","colorSpace","alphaMode","CanvasContext","constructor","props","_defineProperty","clientWidth","clientHeight","devicePixelRatio","id","type","_props","_props2","createCanvas","getContainer","insertBefore","firstChild","style","visibility","getCanvasFromDOM","HTMLCanvasElement","htmlCanvas","offscreenCanvas","resizeObserver","ResizeObserver","entries","entry","target","update","observe","getDevicePixelRatio","OffscreenCanvas","undefined","dpr","window","getPixelSize","parentElement","Error","getAspect","cssToDeviceRatio","drawingBufferWidth","getDrawingBufferSize","_canvasSizeInfo","cssToDevicePixels","cssPixel","yInvert","arguments","length","ratio","scalePixels","setDevicePixelRatio","options","cachedSize","clampedPixelRatio","canvasWidth","Math","floor","canvasHeight","drawingBufferHeight","min","warn","gl","device","_setAutoCreatedCanvasId","_this$htmlCanvas","getPageLoadPromise","Promise","resolve","addEventListener","element","getElementById","concat","body","canvasId","targetCanvas","createElement","Number","isFinite","pixel","point","x","scaleX","y","scaleY","t","xHigh","yHigh","max","r","round"],"sources":["../../src/adapter/canvas-context.ts"],"sourcesContent":["// luma.gl, MIT license\nimport {isBrowser} from '@probe.gl/env';\nimport type {Device} from './device';\nimport type {Framebuffer} from './resources/framebuffer';\nimport {log} from '../lib/utils/log';\n\nconst isPage: boolean = isBrowser() && typeof document !== 'undefined';\nconst isPageLoaded: () => boolean = () => isPage && document.readyState === 'complete';\n\n/** Properties for a CanvasContext */\nexport type CanvasContextProps = {\n /** If canvas not supplied, will be created and added to the DOM. If string, will be looked up in the DOM */\n canvas?: HTMLCanvasElement | OffscreenCanvas | string | null;\n /** If new canvas is created, it will be created in the specified container, otherwise appended to body */\n container?: HTMLElement | string | null;\n /** Width in pixels of the canvas */\n width?: number;\n /** Height in pixels of the canvas */\n height?: number;\n /** Whether to apply a device pixels scale factor (`true` uses browser DPI) */\n useDevicePixels?: boolean | number;\n /** Whether to track resizes (if not ) */\n autoResize?: boolean;\n /** Visibility (only used if new canvas is created). */\n visible?: boolean;\n /** WebGPU only https://www.w3.org/TR/webgpu/#canvas-configuration */\n colorSpace?: 'srgb'; // GPUPredefinedColorSpace\n /** WebGPU only https://www.w3.org/TR/webgpu/#canvas-configuration */\n alphaMode?: 'opaque' | 'premultiplied';\n};\n\nconst DEFAULT_CANVAS_CONTEXT_PROPS: Required<CanvasContextProps> = {\n canvas: null,\n width: 800, // width are height are only used by headless gl\n height: 600,\n useDevicePixels: true,\n autoResize: true,\n container: null,\n visible: true,\n colorSpace: 'srgb',\n alphaMode: 'opaque'\n};\n\n/**\n * Manages a canvas. Supports both HTML or offscreen canvas\n * - Creates a new canvas or looks up a canvas from the DOM\n * - Provides check for DOM loaded\n * @todo commit(): https://github.com/w3ctag/design-reviews/issues/288\n * @todo transferControlToOffscreen: https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/transferControlToOffscreen\n */\nexport abstract class CanvasContext {\n abstract readonly device: Device;\n readonly id: string;\n readonly props: Required<CanvasContextProps>;\n readonly canvas: HTMLCanvasElement | OffscreenCanvas;\n readonly htmlCanvas?: HTMLCanvasElement;\n readonly offscreenCanvas?: OffscreenCanvas;\n readonly type: 'html-canvas' | 'offscreen-canvas' | 'node';\n\n width: number = 1;\n height: number = 1;\n\n readonly resizeObserver: ResizeObserver | undefined;\n\n /** State used by luma.gl classes: TODO - move to canvasContext*/\n readonly _canvasSizeInfo = {clientWidth: 0, clientHeight: 0, devicePixelRatio: 1};\n\n /** Check if the DOM is loaded */\n static get isPageLoaded(): boolean {\n return isPageLoaded();\n }\n\n /**\n * Get a 'lazy' promise that resolves when the DOM is loaded.\n * @note Since there may be limitations on number of `load` event listeners,\n * it is recommended avoid calling this function until actually needed.\n * I.e. don't call it until you know that you will be looking up a string in the DOM.\n */\n static pageLoaded: Promise<void> = getPageLoadPromise();\n\n constructor(props?: CanvasContextProps) {\n this.props = {...DEFAULT_CANVAS_CONTEXT_PROPS, ...props};\n props = this.props;\n\n if (!isBrowser()) {\n this.id = 'node-canvas-context';\n this.type = 'node';\n this.width = this.props.width;\n this.height = this.props.height;\n // TODO - does this prevent app from using jsdom style polyfills?\n this.canvas = null!;\n return;\n }\n\n if (!props.canvas) {\n const canvas = createCanvas(props);\n const container = getContainer(props?.container || null);\n container.insertBefore(canvas, container.firstChild);\n\n this.canvas = canvas;\n\n if (!props?.visible) {\n this.canvas.style.visibility = 'hidden';\n }\n } else if (typeof props.canvas === 'string') {\n this.canvas = getCanvasFromDOM(props.canvas);\n } else {\n this.canvas = props.canvas;\n }\n\n if (this.canvas instanceof HTMLCanvasElement) {\n this.id = this.canvas.id;\n this.type = 'html-canvas';\n this.htmlCanvas = this.canvas;\n } else {\n this.id = 'offscreen-canvas';\n this.type = 'offscreen-canvas';\n this.offscreenCanvas = this.canvas;\n }\n\n // React to size changes\n if (this.canvas instanceof HTMLCanvasElement && props.autoResize) {\n this.resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.target === this.canvas) {\n this.update();\n }\n }\n });\n this.resizeObserver.observe(this.canvas);\n }\n }\n\n /** Returns a framebuffer with properly resized current 'swap chain' textures */\n abstract getCurrentFramebuffer(): Framebuffer;\n\n /**\n * Returns the current DPR, if props.useDevicePixels is true\n * Device refers to physical\n */\n getDevicePixelRatio(useDevicePixels?: boolean | number): number {\n if (typeof OffscreenCanvas !== 'undefined' && this.canvas instanceof OffscreenCanvas) {\n return 1;\n }\n\n useDevicePixels = useDevicePixels === undefined ? this.props.useDevicePixels : useDevicePixels;\n\n if (!useDevicePixels || useDevicePixels as number <= 0) {\n return 1;\n }\n\n // The param was mainly provide to support the test cases, could be removed\n if (useDevicePixels === true) {\n const dpr = typeof window !== 'undefined' && window.devicePixelRatio;\n return dpr || 1;\n }\n\n return useDevicePixels;\n }\n\n /**\n * Returns the size of drawing buffer in device pixels.\n * @note This can be different from the 'CSS' size of a canvas, and also from the\n * canvas' internal drawing buffer size (.width, .height).\n * This is the size required to cover the canvas, adjusted for DPR\n */\n getPixelSize(): [number, number] {\n switch (this.type) {\n case 'node':\n return [this.width, this.height];\n case 'offscreen-canvas':\n return [this.canvas.width, this.canvas.height];\n case 'html-canvas':\n const dpr = this.getDevicePixelRatio();\n const canvas = this.canvas as HTMLCanvasElement;\n // If not attached to DOM client size can be 0\n return canvas.parentElement\n ? [canvas.clientWidth * dpr, canvas.clientHeight * dpr]\n : [this.canvas.width, this.canvas.height];\n default:\n throw new Error(this.type);\n }\n }\n\n getAspect(): number {\n const [width, height] = this.getPixelSize();\n return width / height;\n }\n\n /**\n * Returns multiplier need to convert CSS size to Device size\n */\n cssToDeviceRatio(): number {\n try {\n // For headless gl we might have used custom width and height\n // hence use cached clientWidth\n const [drawingBufferWidth] = this.getDrawingBufferSize();\n const {clientWidth} = this._canvasSizeInfo;\n return clientWidth ? drawingBufferWidth / clientWidth : 1;\n } catch {\n return 1;\n }\n }\n\n /**\n * Maps CSS pixel position to device pixel position\n */\n cssToDevicePixels(\n cssPixel: number[],\n yInvert: boolean = true\n ): {\n x: number;\n y: number;\n width: number;\n height: number;\n } {\n const ratio = this.cssToDeviceRatio();\n const [width, height] = this.getDrawingBufferSize();\n return scalePixels(cssPixel, ratio, width, height, yInvert);\n }\n\n /**\n * Use devicePixelRatio to set canvas width and height\n * @note this is a raw port of luma.gl v8 code. Might be worth a review\n */\n setDevicePixelRatio(\n devicePixelRatio: number,\n options: {width?: number; height?: number} = {}\n ): void {\n if (!this.htmlCanvas) {\n return;\n }\n\n // NOTE: if options.width and options.height not used remove in v8\n let clientWidth = 'width' in options ? options.width : this.htmlCanvas.clientWidth;\n let clientHeight = 'height' in options ? options.height : this.htmlCanvas.clientHeight;\n\n if (!clientWidth || !clientHeight) {\n log.log(1, 'Canvas clientWidth/clientHeight is 0')();\n // by forcing devicePixel ratio to 1, we do not scale canvas.width and height in each frame.\n devicePixelRatio = 1;\n clientWidth = this.htmlCanvas.width || 1;\n clientHeight = this.htmlCanvas.height || 1;\n }\n\n const cachedSize = this._canvasSizeInfo;\n // Check if canvas needs to be resized\n if (\n cachedSize.clientWidth !== clientWidth ||\n cachedSize.clientHeight !== clientHeight ||\n cachedSize.devicePixelRatio !== devicePixelRatio\n ) {\n let clampedPixelRatio = devicePixelRatio;\n\n const canvasWidth = Math.floor(clientWidth * clampedPixelRatio);\n const canvasHeight = Math.floor(clientHeight * clampedPixelRatio);\n this.htmlCanvas.width = canvasWidth;\n this.htmlCanvas.height = canvasHeight;\n\n // Note: when devicePixelRatio is too high, it is possible we might hit system limit for\n // drawing buffer width and hight, in those cases they get clamped and resulting aspect ration may not be maintained\n // for those cases, reduce devicePixelRatio.\n const [drawingBufferWidth, drawingBufferHeight] = this.getDrawingBufferSize();\n\n if (drawingBufferWidth !== canvasWidth || drawingBufferHeight !== canvasHeight) {\n clampedPixelRatio = Math.min(\n drawingBufferWidth / clientWidth,\n drawingBufferHeight / clientHeight\n );\n\n this.htmlCanvas.width = Math.floor(clientWidth * clampedPixelRatio);\n this.htmlCanvas.height = Math.floor(clientHeight * clampedPixelRatio);\n\n log.warn('Device pixel ratio clamped')();\n }\n\n this._canvasSizeInfo.clientWidth = clientWidth;\n this._canvasSizeInfo.clientHeight = clientHeight;\n this._canvasSizeInfo.devicePixelRatio = devicePixelRatio;\n }\n }\n\n // PRIVATE\n\n /** @todo Major hack done to port the CSS methods above, base canvas context should not depend on WebGL */\n getDrawingBufferSize(): [number, number] {\n // @ts-expect-error This only works for WebGL\n const gl = this.device.gl;\n if (!gl) {\n // use default device pixel ratio\n throw new Error('canvas size');\n }\n return [gl.drawingBufferWidth, gl.drawingBufferHeight];\n }\n\n abstract resize(options?: {\n width?: number;\n height?: number;\n useDevicePixels?: boolean | number;\n }): void;\n\n /** Perform platform specific updates (WebGPU vs WebGL) */\n protected abstract update(): void;\n\n /**\n * Allows subclass constructor to override the canvas id for auto created canvases.\n * This can really help when debugging DOM in apps that create multiple devices\n */\n protected _setAutoCreatedCanvasId(id: string) {\n if (this.htmlCanvas?.id === 'lumagl-auto-created-canvas') {\n this.htmlCanvas.id = id;\n }\n }\n}\n\n// HELPER FUNCTIONS\n\n/** Returns a promise that resolves when the page is loaded */\nfunction getPageLoadPromise(): Promise<void> {\n if (isPageLoaded() || typeof window === 'undefined') {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n window.addEventListener('load', () => resolve());\n });\n}\n\nfunction getContainer(container: HTMLElement | string | null): HTMLElement {\n if (typeof container === 'string') {\n const element = document.getElementById(container);\n if (!element && !isPageLoaded()) {\n throw new Error(`Accessing '${container}' before page was loaded`);\n }\n if (!element) {\n throw new Error(`${container} is not an HTML element`);\n }\n return element;\n } else if (container) {\n return container;\n }\n return document.body;\n}\n\n/** Get a Canvas element from DOM id */\nfunction getCanvasFromDOM(canvasId: string): HTMLCanvasElement {\n const canvas = document.getElementById(canvasId);\n if (!canvas && !isPageLoaded()) {\n throw new Error(`Accessing '${canvasId}' before page was loaded`);\n }\n if (!(canvas instanceof HTMLCanvasElement)) {\n throw new Error(`'${canvas}' is not a canvas element`);\n }\n return canvas;\n}\n\n/** Create a new canvas */\nfunction createCanvas(props: CanvasContextProps) {\n const {width, height} = props;\n const targetCanvas = document.createElement('canvas');\n targetCanvas.id = 'lumagl-auto-created-canvas';\n targetCanvas.width = width || 1;\n targetCanvas.height = height || 1;\n targetCanvas.style.width = Number.isFinite(width) ? `${width}px` : '100%';\n targetCanvas.style.height = Number.isFinite(height) ? `${height}px` : '100%';\n return targetCanvas;\n}\n\n/**\n *\n * @param pixel\n * @param ratio\n * @param width\n * @param height\n * @param yInvert\n * @returns\n */\nfunction scalePixels(\n pixel: number[],\n ratio: number,\n width: number,\n height: number,\n yInvert: boolean\n): {\n x: number;\n y: number;\n width: number;\n height: number;\n} {\n const point = pixel as [number, number];\n \n const x = scaleX(point[0], ratio, width);\n let y = scaleY(point[1], ratio, height, yInvert);\n\n // Find boundaries of next pixel to provide valid range of device pixel locations\n\n let t = scaleX(point[0] + 1, ratio, width);\n // If next pixel's position is clamped to boundary, use it as is, otherwise subtract 1 for current pixel boundary\n const xHigh = t === width - 1 ? t : t - 1;\n\n t = scaleY(point[1] + 1, ratio, height, yInvert);\n let yHigh;\n if (yInvert) {\n // If next pixel's position is clamped to boundary, use it as is, otherwise clamp it to valid range\n t = t === 0 ? t : t + 1;\n // swap y and yHigh\n yHigh = y;\n y = t;\n } else {\n // If next pixel's position is clamped to boundary, use it as is, otherwise clamp it to valid range\n yHigh = t === height - 1 ? t : t - 1;\n // y remains same\n }\n return {\n x,\n y,\n // when ratio < 1, current css pixel and next css pixel may point to same device pixel, set width/height to 1 in those cases.\n width: Math.max(xHigh - x + 1, 1),\n height: Math.max(yHigh - y + 1, 1)\n };\n}\n\nfunction scaleX(x: number, ratio: number, width: number): number {\n // since we are rounding to nearest, when ratio > 1, edge pixels may point to out of bounds value, clamp to the limit\n const r = Math.min(Math.round(x * ratio), width - 1);\n return r;\n}\n\nfunction scaleY(y: number, ratio: number, height: number, yInvert: boolean): number {\n // since we are rounding to nearest, when ratio > 1, edge pixels may point to out of bounds value, clamp to the limit\n return yInvert\n ? Math.max(0, height - 1 - Math.round(y * ratio))\n : Math.min(Math.round(y * ratio), height - 1);\n}\n"],"mappings":"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"}
@@ -0,0 +1,155 @@
1
+ import { StatsManager } from '../lib/utils/stats-manager';
2
+ import type { TextureFormat } from './types/texture-formats';
3
+ import type { CanvasContext, CanvasContextProps } from './canvas-context';
4
+ import type { BufferProps } from './resources/buffer';
5
+ import { Buffer } from './resources/buffer';
6
+ import type { RenderPipeline, RenderPipelineProps } from './resources/render-pipeline';
7
+ import type { ComputePipeline, ComputePipelineProps } from './resources/compute-pipeline';
8
+ import type { Sampler, SamplerProps } from './resources/sampler';
9
+ import type { Shader, ShaderProps } from './resources/shader';
10
+ import type { Texture, TextureProps, TextureData } from './resources/texture';
11
+ import type { ExternalTexture, ExternalTextureProps } from './resources/external-texture';
12
+ import type { Framebuffer, FramebufferProps } from './resources/framebuffer';
13
+ import type { RenderPass, RenderPassProps } from './resources/render-pass';
14
+ import type { ComputePass, ComputePassProps } from './resources/compute-pass';
15
+ import type { CommandEncoder, CommandEncoderProps } from './resources/command-encoder';
16
+ /** Device properties */
17
+ export type DeviceProps = {
18
+ id?: string;
19
+ type?: 'webgl' | 'webgl1' | 'webgl2' | 'webgpu' | 'best-available';
20
+ canvas?: HTMLCanvasElement | OffscreenCanvas | string | null;
21
+ container?: HTMLElement | string | null;
22
+ width?: number /** width is only used when creating a new canvas */;
23
+ height?: number /** height is only used when creating a new canvas */;
24
+ webgl2?: boolean;
25
+ webgl1?: boolean;
26
+ debug?: boolean;
27
+ manageState?: boolean;
28
+ break?: string[];
29
+ gl?: WebGLRenderingContext | WebGL2RenderingContext | null;
30
+ };
31
+ export declare const DEFAULT_DEVICE_PROPS: Required<DeviceProps>;
32
+ export type ShadingLanguage = 'glsl' | 'wgsl';
33
+ /**
34
+ * Identifies the GPU vendor and driver.
35
+ * @see https://www.khronos.org/registry/webgl/extensions/WEBGL_debug_renderer_info/
36
+ * @note Current WebGPU support is very limited
37
+ */
38
+ export type DeviceInfo = {
39
+ type: 'webgl' | 'webgl2' | 'webgpu';
40
+ vendor: string;
41
+ renderer: string;
42
+ version: string;
43
+ gpu: 'nvidia' | 'amd' | 'intel' | 'apple' | 'software' | 'unknown';
44
+ shadingLanguages: ShadingLanguage[];
45
+ shadingLanguageVersions: Record<string, string>;
46
+ vendorMasked?: string;
47
+ rendererMasked?: string;
48
+ };
49
+ /** Limits for a device */
50
+ export type DeviceLimits = {
51
+ readonly maxTextureDimension1D?: number;
52
+ readonly maxTextureDimension2D?: number;
53
+ readonly maxTextureDimension3D?: number;
54
+ readonly maxTextureArrayLayers?: number;
55
+ readonly maxBindGroups: number;
56
+ readonly maxDynamicUniformBuffersPerPipelineLayout: number;
57
+ readonly maxDynamicStorageBuffersPerPipelineLayout: number;
58
+ readonly maxSampledTexturesPerShaderStage: number;
59
+ readonly maxSamplersPerShaderStage: number;
60
+ readonly maxStorageBuffersPerShaderStage: number;
61
+ readonly maxStorageTexturesPerShaderStage: number;
62
+ readonly maxUniformBuffersPerShaderStage: number;
63
+ readonly maxUniformBufferBindingSize: number;
64
+ readonly maxStorageBufferBindingSize?: number;
65
+ readonly minUniformBufferOffsetAlignment?: number;
66
+ readonly minStorageBufferOffsetAlignment?: number;
67
+ readonly maxVertexBuffers?: number;
68
+ readonly maxVertexAttributes?: number;
69
+ readonly maxVertexBufferArrayStride?: number;
70
+ readonly maxInterStageShaderComponents?: number;
71
+ readonly maxComputeWorkgroupStorageSize?: number;
72
+ readonly maxComputeInvocationsPerWorkgroup?: number;
73
+ readonly maxComputeWorkgroupSizeX?: number;
74
+ readonly maxComputeWorkgroupSizeY?: number;
75
+ readonly maxComputeWorkgroupSizeZ?: number;
76
+ readonly maxComputeWorkgroupsPerDimension?: number;
77
+ };
78
+ export type WebGPUDeviceFeature = 'depth-clip-control' | 'depth24unorm-stencil8' | 'depth32float-stencil8' | 'timestamp-query' | 'indirect-first-instance' | 'texture-compression-bc' | 'texture-compression-etc2' | 'texture-compression-astc';
79
+ export type WebGLDeviceFeature = 'webgpu' | 'webgl2' | 'webgl' | 'timer-query-webgl' | 'uniform-buffers-webgl' | 'uniforms-webgl' | 'texture-filter-linear-float32-webgl' | 'texture-filter-linear-float16-webgl' | 'texture-filter-anisotropic-webgl' | 'texture-renderable-float32-webgl' | 'texture-renderable-float16-webgl' | 'texture-renderable-rgba32float-webgl' | 'texture-blend-float-webgl1' | 'texture-formats-norm16-webgl' | 'texture-formats-srgb-webgl1' | 'texture-formats-depth-webgl1' | 'texture-formats-float32-webgl1' | 'texture-formats-float16-webgl1' | 'vertex-array-object-webgl1' | 'instanced-rendering-webgl1' | 'multiple-render-targets-webgl1' | 'index-uint32-webgl1' | 'blend-minmax-webgl1' | 'glsl-frag-data' | 'glsl-frag-depth' | 'glsl-derivatives' | 'glsl-texture-lod';
80
+ type WebGLCompressedTextureFeatures = 'texture-compression-bc5-webgl' | 'texture-compression-etc1-webgl' | 'texture-compression-pvrtc-webgl' | 'texture-compression-atc-webgl';
81
+ /** Valid feature strings */
82
+ export type DeviceFeature = WebGPUDeviceFeature | WebGLDeviceFeature | WebGLCompressedTextureFeatures;
83
+ /**
84
+ * WebGPU Device/WebGL context abstraction
85
+ */
86
+ export declare abstract class Device {
87
+ get [Symbol.toStringTag](): string;
88
+ static VERSION: string;
89
+ constructor(props: DeviceProps);
90
+ readonly id: string;
91
+ readonly statsManager: StatsManager;
92
+ readonly props: Required<DeviceProps>;
93
+ userData: {
94
+ [key: string]: any;
95
+ };
96
+ /** Information about the device (vendor, versions etc) */
97
+ abstract info: DeviceInfo;
98
+ /** Optional capability discovery */
99
+ abstract get features(): Set<DeviceFeature>;
100
+ /** WebGPU style device limits */
101
+ abstract get limits(): DeviceLimits;
102
+ /** Check if device supports a specific texture format (creation and `nearest` sampling) */
103
+ abstract isTextureFormatSupported(format: TextureFormat): boolean;
104
+ /** Check if linear filtering (sampler interpolation) is supported for a specific texture format */
105
+ abstract isTextureFormatFilterable(format: TextureFormat): boolean;
106
+ /** Check if device supports rendering to a specific texture format */
107
+ abstract isTextureFormatRenderable(format: TextureFormat): boolean;
108
+ /** `true` if device is already lost */
109
+ abstract get isLost(): boolean;
110
+ /** Promise that resolves when device is lost */
111
+ abstract readonly lost: Promise<{
112
+ reason: 'destroyed';
113
+ message: string;
114
+ }>;
115
+ /**
116
+ * Trigger device loss.
117
+ * @returns `true` if context loss could actually be triggered.
118
+ * @note primarily intended for testing how application reacts to device loss
119
+ */
120
+ loseDevice(): boolean;
121
+ /** Default / primary canvas context. Can be null as WebGPU devices can be created without a CanvasContext */
122
+ abstract canvasContext: CanvasContext | null;
123
+ /** Creates a new CanvasContext (WebGPU only) */
124
+ abstract createCanvasContext(props?: CanvasContextProps): CanvasContext;
125
+ /** Call after rendering a frame (necessary e.g. on WebGL OffscreenCanvas) */
126
+ abstract submit(): void;
127
+ /** Create a buffer */
128
+ abstract createBuffer(props: BufferProps | ArrayBuffer | ArrayBufferView): Buffer;
129
+ /** Create a texture */
130
+ abstract _createTexture(props: TextureProps): Texture;
131
+ createTexture(props: TextureProps): Texture;
132
+ createTexture(data: Promise<TextureData>): Texture;
133
+ createTexture(url: string): Texture;
134
+ /** Create a temporary texture view of a video source */
135
+ abstract createExternalTexture(props: ExternalTextureProps): ExternalTexture;
136
+ /** Create a sampler */
137
+ abstract createSampler(props: SamplerProps): Sampler;
138
+ abstract createFramebuffer(props: FramebufferProps): Framebuffer;
139
+ /** Create a shader */
140
+ abstract createShader(props: ShaderProps): Shader;
141
+ /** Create a render pipeline (aka program) */
142
+ abstract createRenderPipeline(props: RenderPipelineProps): RenderPipeline;
143
+ /** Create a compute pipeline (aka program) */
144
+ abstract createComputePipeline(props: ComputePipelineProps): ComputePipeline;
145
+ createCommandEncoder(props?: CommandEncoderProps): CommandEncoder;
146
+ /** Create a RenderPass */
147
+ abstract beginRenderPass(props?: RenderPassProps): RenderPass;
148
+ /** Create a ComputePass */
149
+ abstract beginComputePass(props?: ComputePassProps): ComputePass;
150
+ /** Get a renderpass that is set up to render to the primary CanvasContext */
151
+ abstract getDefaultRenderPass(): RenderPass;
152
+ protected _getBufferProps(props: BufferProps | ArrayBuffer | ArrayBufferView): BufferProps;
153
+ }
154
+ export {};
155
+ //# sourceMappingURL=device.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../src/adapter/device.ts"],"names":[],"mappings":"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"}