@lightningjs/renderer 3.0.0-beta21 → 3.0.0-beta23

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 (165) hide show
  1. package/README.md +93 -0
  2. package/dist/exports/index.d.ts +1 -0
  3. package/dist/exports/index.js +1 -0
  4. package/dist/exports/index.js.map +1 -1
  5. package/dist/exports/platform.d.ts +7 -0
  6. package/dist/exports/platform.js +27 -0
  7. package/dist/exports/platform.js.map +1 -0
  8. package/dist/src/common/CommonTypes.d.ts +2 -1
  9. package/dist/src/core/AutosizeManager.d.ts +29 -0
  10. package/dist/src/core/AutosizeManager.js +169 -0
  11. package/dist/src/core/AutosizeManager.js.map +1 -0
  12. package/dist/src/core/CoreNode.js +10 -14
  13. package/dist/src/core/CoreNode.js.map +1 -1
  14. package/dist/src/core/CoreTextureManager.d.ts +0 -13
  15. package/dist/src/core/CoreTextureManager.js +4 -78
  16. package/dist/src/core/CoreTextureManager.js.map +1 -1
  17. package/dist/src/core/Stage.js +2 -12
  18. package/dist/src/core/Stage.js.map +1 -1
  19. package/dist/src/core/animations/CoreAnimationController.d.ts +1 -1
  20. package/dist/src/core/animations/CoreAnimationController.js +4 -2
  21. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  22. package/dist/src/core/lib/collectionUtils.js +3 -2
  23. package/dist/src/core/lib/collectionUtils.js.map +1 -1
  24. package/dist/src/core/lib/utils.d.ts +0 -5
  25. package/dist/src/core/lib/utils.js +0 -63
  26. package/dist/src/core/lib/utils.js.map +1 -1
  27. package/dist/src/core/platforms/GlContextWrapper.d.ts +136 -0
  28. package/dist/src/core/platforms/GlContextWrapper.js +32 -0
  29. package/dist/src/core/platforms/GlContextWrapper.js.map +1 -0
  30. package/dist/src/core/platforms/Platform.d.ts +74 -13
  31. package/dist/src/core/platforms/Platform.js +18 -0
  32. package/dist/src/core/platforms/Platform.js.map +1 -1
  33. package/dist/src/core/platforms/web/WebGlContextWrapper.d.ts +776 -0
  34. package/dist/src/core/platforms/web/WebGlContextWrapper.js +1208 -0
  35. package/dist/src/core/platforms/web/WebGlContextWrapper.js.map +1 -0
  36. package/dist/src/core/platforms/web/WebPlatform.d.ts +13 -2
  37. package/dist/src/core/platforms/web/WebPlatform.js +109 -8
  38. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -1
  39. package/dist/src/core/platforms/web/WebPlatformChrome50.d.ts +17 -0
  40. package/dist/src/core/platforms/web/WebPlatformChrome50.js +50 -0
  41. package/dist/src/core/platforms/web/WebPlatformChrome50.js.map +1 -0
  42. package/dist/src/core/platforms/web/WebPlatformLegacy.d.ts +18 -0
  43. package/dist/src/core/platforms/web/WebPlatformLegacy.js +99 -0
  44. package/dist/src/core/platforms/web/WebPlatformLegacy.js.map +1 -0
  45. package/dist/src/core/platforms/web/WebPlatformNext.d.ts +21 -0
  46. package/dist/src/core/platforms/web/WebPlatformNext.js +52 -0
  47. package/dist/src/core/platforms/web/WebPlatformNext.js.map +1 -0
  48. package/dist/src/core/platforms/web/lib/ImageWorker.d.ts +15 -0
  49. package/dist/src/core/platforms/web/lib/ImageWorker.js +189 -0
  50. package/dist/src/core/platforms/web/lib/ImageWorker.js.map +1 -0
  51. package/dist/src/core/platforms/web/lib/createImageBitmap.d.ts +1 -0
  52. package/dist/src/core/platforms/web/lib/createImageBitmap.js +27 -0
  53. package/dist/src/core/platforms/web/lib/createImageBitmap.js.map +1 -0
  54. package/dist/src/core/platforms/web/lib/textureCompression.d.ts +26 -0
  55. package/dist/src/core/platforms/web/lib/textureCompression.js +301 -0
  56. package/dist/src/core/platforms/web/lib/textureCompression.js.map +1 -0
  57. package/dist/src/core/platforms/web/lib/textureSvg.d.ts +7 -0
  58. package/dist/src/core/platforms/web/lib/textureSvg.js +51 -0
  59. package/dist/src/core/platforms/web/lib/textureSvg.js.map +1 -0
  60. package/dist/src/core/platforms/web/lib/utils.d.ts +5 -0
  61. package/dist/src/core/platforms/web/lib/utils.js +86 -0
  62. package/dist/src/core/platforms/web/lib/utils.js.map +1 -0
  63. package/dist/src/core/renderers/CoreRenderer.d.ts +1 -9
  64. package/dist/src/core/renderers/CoreRenderer.js +2 -4
  65. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  66. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +3 -2
  67. package/dist/src/core/renderers/canvas/CanvasRenderer.js +4 -3
  68. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  69. package/dist/src/core/renderers/webgl/SdfRenderOp.js +3 -2
  70. package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -1
  71. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +2 -2
  72. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -1
  73. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +2 -2
  74. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -1
  75. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +3 -3
  76. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +1 -2
  77. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  78. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +3 -2
  79. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +3 -1
  80. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +1 -1
  81. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +5 -5
  82. package/dist/src/core/renderers/webgl/WebGlRenderer.js +7 -8
  83. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  84. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +2 -2
  85. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +2 -2
  86. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  87. package/dist/src/core/renderers/webgl/internal/RendererUtils.d.ts +4 -4
  88. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  89. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +3 -3
  90. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  91. package/dist/src/core/shaders/webgl/Border.js +13 -17
  92. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  93. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +12 -21
  94. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  95. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +10 -12
  96. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  97. package/dist/src/core/text-rendering/CanvasFont.d.ts +14 -0
  98. package/dist/src/core/text-rendering/CanvasFont.js +111 -0
  99. package/dist/src/core/text-rendering/CanvasFont.js.map +1 -0
  100. package/dist/src/core/text-rendering/CoreFont.d.ts +33 -0
  101. package/dist/src/core/text-rendering/CoreFont.js +48 -0
  102. package/dist/src/core/text-rendering/CoreFont.js.map +1 -0
  103. package/dist/src/core/text-rendering/FontManager.d.ts +11 -0
  104. package/dist/src/core/text-rendering/FontManager.js +42 -0
  105. package/dist/src/core/text-rendering/FontManager.js.map +1 -0
  106. package/dist/src/core/text-rendering/SdfFont.d.ts +29 -0
  107. package/dist/src/core/text-rendering/SdfFont.js +142 -0
  108. package/dist/src/core/text-rendering/SdfFont.js.map +1 -0
  109. package/dist/src/core/textures/ImageTexture.d.ts +24 -11
  110. package/dist/src/core/textures/ImageTexture.js +32 -95
  111. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  112. package/dist/src/core/textures/Texture.d.ts +5 -4
  113. package/dist/src/core/textures/Texture.js.map +1 -1
  114. package/dist/src/core/utils.d.ts +1 -1
  115. package/dist/src/main-api/Inspector.d.ts +4 -0
  116. package/dist/src/main-api/Inspector.js +160 -0
  117. package/dist/src/main-api/Inspector.js.map +1 -1
  118. package/dist/src/main-api/Renderer.js +18 -21
  119. package/dist/src/main-api/Renderer.js.map +1 -1
  120. package/dist/src/utils.d.ts +0 -2
  121. package/dist/src/utils.js +0 -36
  122. package/dist/src/utils.js.map +1 -1
  123. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  124. package/exports/index.ts +5 -0
  125. package/exports/platform.ts +31 -0
  126. package/package.json +3 -2
  127. package/src/common/CommonTypes.ts +2 -1
  128. package/src/core/CoreNode.ts +11 -15
  129. package/src/core/CoreTextureManager.ts +10 -103
  130. package/src/core/Stage.ts +1 -14
  131. package/src/core/animations/CoreAnimationController.ts +5 -2
  132. package/src/core/lib/collectionUtils.ts +3 -2
  133. package/src/core/lib/utils.ts +0 -78
  134. package/src/core/platforms/GlContextWrapper.ts +291 -0
  135. package/src/core/platforms/Platform.ts +121 -28
  136. package/src/core/{lib → platforms/web}/WebGlContextWrapper.ts +129 -4
  137. package/src/core/platforms/web/WebPlatform.ts +171 -22
  138. package/src/core/platforms/web/WebPlatformChrome50.ts +57 -0
  139. package/src/core/platforms/web/WebPlatformLegacy.ts +140 -0
  140. package/src/core/platforms/web/WebPlatformNext.ts +57 -0
  141. package/src/core/{lib → platforms/web/lib}/ImageWorker.ts +10 -74
  142. package/src/core/platforms/web/lib/createImageBitmap.ts +40 -0
  143. package/src/core/{lib → platforms/web/lib}/textureCompression.ts +19 -138
  144. package/src/core/{lib → platforms/web/lib}/textureSvg.ts +3 -15
  145. package/src/core/platforms/web/lib/utils.ts +105 -0
  146. package/src/core/renderers/CoreRenderer.ts +2 -11
  147. package/src/core/renderers/canvas/CanvasRenderer.ts +6 -4
  148. package/src/core/renderers/webgl/SdfRenderOp.ts +3 -2
  149. package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +2 -2
  150. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +2 -2
  151. package/src/core/renderers/webgl/WebGlCtxTexture.ts +3 -4
  152. package/src/core/renderers/webgl/WebGlRenderer.ts +12 -19
  153. package/src/core/renderers/webgl/WebGlShaderNode.ts +2 -2
  154. package/src/core/renderers/webgl/WebGlShaderProgram.ts +2 -2
  155. package/src/core/renderers/webgl/internal/RendererUtils.ts +4 -8
  156. package/src/core/renderers/webgl/internal/ShaderUtils.ts +3 -3
  157. package/src/core/shaders/webgl/Border.ts +13 -17
  158. package/src/core/shaders/webgl/RoundedWithBorder.ts +12 -21
  159. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +10 -12
  160. package/src/core/textures/ImageTexture.ts +42 -161
  161. package/src/core/textures/Texture.ts +11 -7
  162. package/src/main-api/Inspector.ts +215 -0
  163. package/src/main-api/Renderer.ts +24 -22
  164. package/src/utils.ts +0 -47
  165. package/src/core/lib/validateImageBitmap.ts +0 -87
@@ -19,9 +19,8 @@
19
19
 
20
20
  import type { Dimensions } from '../../../common/CommonTypes.js';
21
21
  import type { TextureMemoryManager } from '../../TextureMemoryManager.js';
22
- import type { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
22
+ import type { GlContextWrapper } from '../../platforms/GlContextWrapper.js';
23
23
  import type { Texture } from '../../textures/Texture.js';
24
- import { uploadCompressedTexture } from '../../lib/textureCompression.js';
25
24
  import { CoreContextTexture } from '../CoreContextTexture.js';
26
25
  import { isHTMLImageElement } from './internal/RendererUtils.js';
27
26
  import type { Bound } from '../../lib/utils.js';
@@ -53,7 +52,7 @@ export class WebGlCtxTexture extends CoreContextTexture {
53
52
  };
54
53
 
55
54
  constructor(
56
- protected glw: WebGlContextWrapper,
55
+ protected glw: GlContextWrapper,
57
56
  memManager: TextureMemoryManager,
58
57
  textureSource: Texture,
59
58
  ) {
@@ -239,7 +238,7 @@ export class WebGlCtxTexture extends CoreContextTexture {
239
238
  this.setTextureMemUse(TRANSPARENT_TEXTURE_DATA.byteLength);
240
239
  } else if ('mipmaps' in tdata && tdata.mipmaps) {
241
240
  const { mipmaps, type, blockInfo } = tdata;
242
- uploadCompressedTexture[type]!(glw, this._nativeCtxTexture, tdata);
241
+ glw['upload' + type]!(this._nativeCtxTexture, tdata);
243
242
 
244
243
  // Check for errors after compressed texture operations
245
244
  if (this.checkGLError() === true) {
@@ -17,12 +17,7 @@
17
17
  * limitations under the License.
18
18
  */
19
19
 
20
- import { createWebGLContext } from '../../../utils.js';
21
- import {
22
- CoreRenderer,
23
- type BufferInfo,
24
- type CoreRendererOptions,
25
- } from '../CoreRenderer.js';
20
+ import { CoreRenderer, type BufferInfo } from '../CoreRenderer.js';
26
21
  import type { SdfRenderOp } from './SdfRenderOp.js';
27
22
  import type { CoreContextTexture } from '../CoreContextTexture.js';
28
23
  import {
@@ -44,7 +39,6 @@ import { WebGlCtxSubTexture } from './WebGlCtxSubTexture.js';
44
39
  import { BufferCollection } from './internal/BufferCollection.js';
45
40
  import { compareRect, getNormalizedRgbaComponents } from '../../lib/utils.js';
46
41
  import { WebGlShaderProgram } from './WebGlShaderProgram.js';
47
- import { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
48
42
  import { RenderTexture } from '../../textures/RenderTexture.js';
49
43
  import { CoreNodeRenderState, CoreNode } from '../../CoreNode.js';
50
44
  import { WebGlCtxRenderTexture } from './WebGlCtxRenderTexture.js';
@@ -52,8 +46,9 @@ import { Default } from '../../shaders/webgl/Default.js';
52
46
  import type { WebGlShaderType } from './WebGlShaderNode.js';
53
47
  import { WebGlShaderNode } from './WebGlShaderNode.js';
54
48
  import type { Dimensions } from '../../../common/CommonTypes.js';
55
-
56
- export type WebGlRendererOptions = CoreRendererOptions;
49
+ import type { GlContextWrapper } from '../../platforms/GlContextWrapper.js';
50
+ import type { Platform } from '../../platforms/Platform.js';
51
+ import type { Stage } from '../../Stage.js';
57
52
 
58
53
  interface CoreWebGlSystem {
59
54
  parameters: CoreWebGlParameters;
@@ -64,7 +59,7 @@ export type WebGlRenderOp = CoreNode | SdfRenderOp;
64
59
 
65
60
  export class WebGlRenderer extends CoreRenderer {
66
61
  //// WebGL Native Context and Data
67
- glw: WebGlContextWrapper;
62
+ glw: GlContextWrapper;
68
63
  system: CoreWebGlSystem;
69
64
 
70
65
  //// Persistent data
@@ -106,8 +101,8 @@ export class WebGlRenderer extends CoreRenderer {
106
101
  */
107
102
  public renderToTextureActive = false;
108
103
 
109
- constructor(options: WebGlRendererOptions) {
110
- super(options);
104
+ constructor(stage: Stage) {
105
+ super(stage);
111
106
 
112
107
  this.quadBuffer = new ArrayBuffer(this.stage.options.quadBufferSize);
113
108
  this.fQuadBuffer = new Float32Array(this.quadBuffer);
@@ -115,13 +110,11 @@ export class WebGlRenderer extends CoreRenderer {
115
110
 
116
111
  this.mode = 'webgl';
117
112
 
118
- const gl = createWebGLContext(
119
- options.canvas,
120
- options.forceWebGL2,
121
- options.contextSpy,
122
- );
123
- const glw = (this.glw = new WebGlContextWrapper(gl));
124
- glw.viewport(0, 0, options.canvas.width, options.canvas.height);
113
+ const platform = this.stage.platform;
114
+ const canvas = platform.canvas!;
115
+
116
+ const glw = (this.glw = platform.createContext() as GlContextWrapper);
117
+ glw.viewport(0, 0, canvas.width, canvas.height);
125
118
 
126
119
  this.updateClearColor(this.stage.clearColor);
127
120
 
@@ -1,6 +1,6 @@
1
1
  import type { CoreNode } from '../../CoreNode.js';
2
2
  import { getNormalizedRgbaComponents } from '../../lib/utils.js';
3
- import type { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
3
+ import type { GlContextWrapper } from '../../platforms/GlContextWrapper.js';
4
4
  import type { Stage } from '../../Stage.js';
5
5
  import { CoreShaderNode, type CoreShaderType } from '../CoreShaderNode.js';
6
6
  import type {
@@ -40,7 +40,7 @@ export type WebGlShaderType<T extends object = Record<string, unknown>> =
40
40
  *
41
41
  * @warning don't use this in your shader type
42
42
  */
43
- onSdfBind?: (this: WebGlContextWrapper, props: T) => void;
43
+ onSdfBind?: (this: GlContextWrapper, props: T) => void;
44
44
  /**
45
45
  * This function is used to check if the shader can be reused based on quad info
46
46
  * @param props
@@ -16,7 +16,7 @@
16
16
  * See the License for the specific language governing permissions and
17
17
  * limitations under the License.
18
18
  */
19
- import type { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
19
+ import type { GlContextWrapper } from '../../platforms/GlContextWrapper.js';
20
20
  import { Default } from '../../shaders/webgl/Default.js';
21
21
  import type { CoreShaderProgram } from '../CoreShaderProgram.js';
22
22
  import type { WebGlCtxTexture } from './WebGlCtxTexture.js';
@@ -44,7 +44,7 @@ export class WebGlShaderProgram implements CoreShaderProgram {
44
44
  */
45
45
  protected vao: WebGLVertexArrayObject | undefined;
46
46
  protected renderer: WebGlRenderer;
47
- protected glw: WebGlContextWrapper;
47
+ protected glw: GlContextWrapper;
48
48
  protected attributeLocations: string[];
49
49
  protected uniformLocations: Record<string, WebGLUniformLocation> | null;
50
50
  protected lifecycle: Pick<WebGlShaderType, 'update' | 'canBatch'>;
@@ -17,7 +17,7 @@
17
17
  * limitations under the License.
18
18
  */
19
19
 
20
- import type { WebGlContextWrapper } from '../../../lib/WebGlContextWrapper.js';
20
+ import type { GlContextWrapper } from '../../../platforms/GlContextWrapper.js';
21
21
 
22
22
  export interface CoreWebGlParameters {
23
23
  MAX_RENDERBUFFER_SIZE: number;
@@ -36,9 +36,7 @@ export interface CoreWebGlParameters {
36
36
  * Get device specific webgl parameters
37
37
  * @param glw
38
38
  */
39
- export function getWebGlParameters(
40
- glw: WebGlContextWrapper,
41
- ): CoreWebGlParameters {
39
+ export function getWebGlParameters(glw: GlContextWrapper): CoreWebGlParameters {
42
40
  const params: CoreWebGlParameters = {
43
41
  MAX_RENDERBUFFER_SIZE: 0,
44
42
  MAX_TEXTURE_SIZE: 0,
@@ -81,9 +79,7 @@ export interface CoreWebGlExtensions {
81
79
  * Get device webgl extensions
82
80
  * @param glw
83
81
  */
84
- export function getWebGlExtensions(
85
- glw: WebGlContextWrapper,
86
- ): CoreWebGlExtensions {
82
+ export function getWebGlExtensions(glw: GlContextWrapper): CoreWebGlExtensions {
87
83
  const extensions: CoreWebGlExtensions = {
88
84
  ANGLE_instanced_arrays: null,
89
85
  WEBGL_compressed_texture_s3tc: null,
@@ -113,7 +109,7 @@ export function getWebGlExtensions(
113
109
  * @param glw
114
110
  * @param size
115
111
  */
116
- export function createIndexBuffer(glw: WebGlContextWrapper, size: number) {
112
+ export function createIndexBuffer(glw: GlContextWrapper, size: number) {
117
113
  const maxQuads = ~~(size / 80);
118
114
  const indices = new Uint16Array(maxQuads * 6);
119
115
 
@@ -17,7 +17,7 @@
17
17
  * limitations under the License.
18
18
  */
19
19
 
20
- import type { WebGlContextWrapper } from '../../../lib/WebGlContextWrapper.js';
20
+ import type { GlContextWrapper } from '../../../platforms/GlContextWrapper.js';
21
21
 
22
22
  //#region Types
23
23
  export interface AttributeInfo {
@@ -178,7 +178,7 @@ export interface ShaderProgramSources {
178
178
  //#endregion Types
179
179
 
180
180
  export function createShader(
181
- glw: WebGlContextWrapper,
181
+ glw: GlContextWrapper,
182
182
  type: number,
183
183
  source: string,
184
184
  ) {
@@ -204,7 +204,7 @@ export function createShader(
204
204
  }
205
205
 
206
206
  export function createProgram(
207
- glw: WebGlContextWrapper,
207
+ glw: GlContextWrapper,
208
208
  vertexShader: WebGLShader,
209
209
  fragmentShader: WebGLShader,
210
210
  ) {
@@ -66,10 +66,12 @@ export const Border: WebGlShaderType<BorderProps> = {
66
66
  vec2 edge = clamp(a_nodeCoords * 2.0 - vec2(1.0), -1.0, 1.0);
67
67
  v_edgeWidth = 1.0 / u_pixelRatio;
68
68
 
69
- float borderTop = u_borderWidth.x;
70
- float borderRight = u_borderWidth.y;
71
- float borderBottom = u_borderWidth.z;
72
- float borderLeft = u_borderWidth.w;
69
+ vec4 adjustedBorderWidth = u_borderWidth - 1.0 + clamp(u_borderWidth, -1.0, 1.0);
70
+
71
+ float borderTop = adjustedBorderWidth.x;
72
+ float borderRight = adjustedBorderWidth.y;
73
+ float borderBottom = adjustedBorderWidth.z;
74
+ float borderLeft = adjustedBorderWidth.w;
73
75
 
74
76
  v_outerBorderUv = vec2(0.0);
75
77
  v_innerBorderUv = vec2(0.0);
@@ -149,23 +151,17 @@ export const Border: WebGlShaderType<BorderProps> = {
149
151
  vec4 resultColor = vec4(0.0);
150
152
  vec2 boxUv = v_nodeCoords.xy * u_dimensions - v_halfDimensions;
151
153
 
152
- float outerDist = box(boxUv + v_outerBorderUv, v_outerSize - v_edgeWidth);
153
- float innerDist = box(boxUv + v_innerBorderUv, v_innerSize - v_edgeWidth);
154
-
155
- if(u_borderGap == 0.0) {
156
- resultColor = mix(resultColor, u_borderColor, 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, outerDist));
157
- resultColor = mix(resultColor, color, 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, innerDist));
158
- gl_FragColor = resultColor * u_alpha;
159
- return;
160
- }
161
-
162
154
  float nodeDist = box(boxUv, v_halfDimensions - v_edgeWidth);
163
155
  float nodeAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, nodeDist);
156
+ resultColor = mix(resultColor, color, nodeAlpha);
157
+
158
+ float outerDist = box(boxUv + v_outerBorderUv, v_outerSize - v_edgeWidth);
159
+ float innerDist = box(boxUv + v_innerBorderUv, v_innerSize - v_edgeWidth);
164
160
 
165
161
  float borderDist = max(-innerDist, outerDist);
166
- float borderAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, borderDist);
167
- resultColor = mix(resultColor, color, nodeAlpha);
168
- resultColor = mix(resultColor, u_borderColor, borderAlpha * u_borderColor.a);
162
+ float borderAlpha = (1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, borderDist)) * u_borderColor.a;
163
+
164
+ resultColor = mix(resultColor, vec4(u_borderColor.rgb, 1.0), borderAlpha);
169
165
 
170
166
  gl_FragColor = resultColor * u_alpha;
171
167
  }
@@ -83,10 +83,12 @@ export const RoundedWithBorder: WebGlShaderType<RoundedWithBorderProps> = {
83
83
  v_outerSize = vec2(0.0);
84
84
 
85
85
  if(v_borderZero == 0.0) {
86
- float borderTop = u_borderWidth.x;
87
- float borderRight = u_borderWidth.y;
88
- float borderBottom = u_borderWidth.z;
89
- float borderLeft = u_borderWidth.w;
86
+ vec4 adjustedBorderWidth = u_borderWidth - 1.0 + clamp(u_borderWidth, -1.0, 1.0);
87
+
88
+ float borderTop = adjustedBorderWidth.x;
89
+ float borderRight = adjustedBorderWidth.y;
90
+ float borderBottom = adjustedBorderWidth.z;
91
+ float borderLeft = adjustedBorderWidth.w;
90
92
 
91
93
  v_outerBorderUv = vec2(0.0);
92
94
  v_innerBorderUv = vec2(0.0);
@@ -189,33 +191,22 @@ export const RoundedWithBorder: WebGlShaderType<RoundedWithBorderProps> = {
189
191
  vec4 resultColor = vec4(0.0);
190
192
  vec2 boxUv = v_nodeCoords.xy * u_dimensions - v_halfDimensions;
191
193
 
192
- float nodeDist;
193
- float nodeAlpha;
194
+ float nodeDist = roundedBox(boxUv, v_halfDimensions - v_edgeWidth, u_radius);
195
+ float nodeAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, nodeDist);
196
+ resultColor = mix(resultColor, color, nodeAlpha);
194
197
 
195
198
  if(v_borderZero == 1.0) {
196
- nodeDist = roundedBox(boxUv, v_halfDimensions - v_edgeWidth, u_radius);
197
- nodeAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, nodeDist);
198
- gl_FragColor = mix(vec4(0.0), color, nodeAlpha) * u_alpha;
199
+ gl_FragColor = resultColor * u_alpha;
199
200
  return;
200
201
  }
201
202
 
202
203
  float outerDist = roundedBox(boxUv + v_outerBorderUv, v_outerSize - v_edgeWidth, v_outerBorderRadius);
203
204
  float innerDist = roundedBox(boxUv + v_innerBorderUv, v_innerSize - v_edgeWidth, v_innerBorderRadius);
204
205
 
205
- if(u_borderGap == 0.0) {
206
- resultColor = mix(resultColor, u_borderColor, 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, outerDist));
207
- resultColor = mix(resultColor, color, 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, innerDist));
208
- gl_FragColor = resultColor * u_alpha;
209
- return;
210
- }
211
-
212
- nodeDist = roundedBox(boxUv, v_halfDimensions - v_edgeWidth, u_radius);
213
- nodeAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, nodeDist);
214
206
  float borderDist = max(-innerDist, outerDist);
215
- float borderAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, borderDist);
207
+ float borderAlpha = (1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, borderDist)) * u_borderColor.a;
216
208
 
217
- resultColor = mix(vec4(0.0), color, nodeAlpha);
218
- resultColor = mix(resultColor, u_borderColor, borderAlpha * u_borderColor.a);
209
+ resultColor = mix(resultColor, vec4(u_borderColor.rgb, 1.0), borderAlpha);
219
210
  gl_FragColor = resultColor * u_alpha;
220
211
  }
221
212
  `,
@@ -92,10 +92,12 @@ export const RoundedWithBorderAndShadow: WebGlShaderType<RoundedWithBorderAndSha
92
92
  v_outerSize = vec2(0.0);
93
93
 
94
94
  if(v_borderZero == 0.0) {
95
- float borderTop = u_borderWidth.x;
96
- float borderRight = u_borderWidth.y;
97
- float borderBottom = u_borderWidth.z;
98
- float borderLeft = u_borderWidth.w;
95
+ vec4 adjustedBorderWidth = u_borderWidth - 1.0 + clamp(u_borderWidth, -1.0, 1.0);
96
+
97
+ float borderTop = adjustedBorderWidth.x;
98
+ float borderRight = adjustedBorderWidth.y;
99
+ float borderBottom = adjustedBorderWidth.z;
100
+ float borderLeft = adjustedBorderWidth.w;
99
101
 
100
102
  v_outerBorderUv = vec2(0.0);
101
103
  v_innerBorderUv = vec2(0.0);
@@ -205,13 +207,11 @@ export const RoundedWithBorderAndShadow: WebGlShaderType<RoundedWithBorderAndSha
205
207
  vec4 color = texture2D(u_texture, v_textureCoords) * v_color;
206
208
  vec4 resultColor = vec4(0.0);
207
209
  vec2 boxUv = v_nodeCoords.xy * u_dimensions - v_halfDimensions;
208
- float nodeDist;
209
- float nodeAlpha;
210
+ float nodeDist = roundedBox(boxUv, v_halfDimensions - v_edgeWidth, u_radius);
211
+ float nodeAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, nodeDist);
210
212
  float shadowAlpha;
211
213
 
212
214
  if(v_borderZero == 1.0) {
213
- nodeDist = roundedBox(boxUv, v_halfDimensions - v_edgeWidth, u_radius);
214
- nodeAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, nodeDist);
215
215
  shadowAlpha = shadowBox(boxUv - u_shadow.xy, v_halfDimensions + u_shadow.w - v_edgeWidth, u_radius + u_shadow.z);
216
216
  resultColor = mix(resultColor, u_shadowColor, shadowAlpha);
217
217
  gl_FragColor = mix(resultColor, color, nodeAlpha) * u_alpha;
@@ -225,15 +225,13 @@ export const RoundedWithBorderAndShadow: WebGlShaderType<RoundedWithBorderAndSha
225
225
  shadowAlpha = shadowBox(boxUv - u_shadow.xy, v_halfDimensions + u_shadow.w - v_edgeWidth, u_radius + u_shadow.z);
226
226
  }
227
227
 
228
- nodeDist = roundedBox(boxUv, v_halfDimensions - v_edgeWidth, u_radius);
229
- nodeAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, nodeDist);
230
228
  float outerDist = roundedBox(boxUv + v_outerBorderUv, v_outerSize - v_edgeWidth, v_outerBorderRadius);
231
229
  float innerDist = roundedBox(boxUv + v_innerBorderUv, v_innerSize - v_edgeWidth, v_innerBorderRadius);
232
230
  float borderDist = max(-innerDist, outerDist);
233
- float borderAlpha = 1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, borderDist);
231
+ float borderAlpha = (1.0 - smoothstep(-0.5 * v_edgeWidth, 0.5 * v_edgeWidth, borderDist)) * u_borderColor.a;
234
232
  resultColor = mix(resultColor, u_shadowColor, shadowAlpha);
235
233
  resultColor = mix(resultColor, color, nodeAlpha);
236
- resultColor = mix(resultColor, u_borderColor, borderAlpha * u_borderColor.a);
234
+ resultColor = mix(resultColor, vec4(u_borderColor.rgb, 1.0), borderAlpha);
237
235
  gl_FragColor = resultColor * u_alpha;
238
236
  }
239
237
  `,
@@ -19,19 +19,8 @@
19
19
 
20
20
  import type { CoreTextureManager } from '../CoreTextureManager.js';
21
21
  import { Texture, TextureType, type TextureData } from './Texture.js';
22
- import {
23
- isCompressedTextureContainer,
24
- loadCompressedTexture,
25
- } from '../lib/textureCompression.js';
26
- import {
27
- convertUrlToAbsolute,
28
- dataURIToBlob,
29
- isBase64Image,
30
- } from '../lib/utils.js';
31
- import { isSvgImage, loadSvg } from '../lib/textureSvg.js';
32
- import { fetchJson } from '../lib/utils.js';
33
22
  import type { Platform } from '../platforms/Platform.js';
34
- import { isProductionEnvironment } from '../../utils.js';
23
+ import type { CompressedImageData } from '../platforms/web/lib/textureCompression.js';
35
24
 
36
25
  /**
37
26
  * Properties of the {@link ImageTexture}
@@ -117,6 +106,11 @@ export interface ImageTextureProps {
117
106
  maxRetryCount?: number;
118
107
  }
119
108
 
109
+ export interface ImageResponse {
110
+ data: ImageBitmap | ImageData | CompressedImageData | HTMLImageElement | null;
111
+ premultiplyAlpha: boolean | null;
112
+ }
113
+
120
114
  /**
121
115
  * Texture consisting of an image loaded from a URL
122
116
  *
@@ -148,125 +142,6 @@ export class ImageTexture extends Texture {
148
142
  this.maxRetryCount = props.maxRetryCount as number;
149
143
  }
150
144
 
151
- hasAlphaChannel(mimeType: string) {
152
- return mimeType.indexOf('image/png') !== -1;
153
- }
154
-
155
- async loadImageFallback(src: string | Blob, hasAlpha: boolean) {
156
- const img = new Image();
157
-
158
- if (typeof src === 'string' && isBase64Image(src) === false) {
159
- img.crossOrigin = 'anonymous';
160
- }
161
-
162
- return new Promise<{
163
- data: HTMLImageElement | null;
164
- premultiplyAlpha: boolean;
165
- }>((resolve, reject) => {
166
- img.onload = () => {
167
- resolve({ data: img, premultiplyAlpha: hasAlpha });
168
- };
169
-
170
- img.onerror = (err) => {
171
- const errorMessage =
172
- err instanceof Error
173
- ? err.message
174
- : err instanceof Event
175
- ? `Image loading failed for ${img.src}`
176
- : 'Unknown image loading error';
177
- reject(new Error(`Image loading failed: ${errorMessage}`));
178
- };
179
-
180
- if (src instanceof Blob) {
181
- img.src = URL.createObjectURL(src);
182
- } else {
183
- img.src = src;
184
- }
185
- });
186
- }
187
-
188
- async createImageBitmap(
189
- blob: Blob,
190
- premultiplyAlpha: boolean | null,
191
- sx: number | null,
192
- sy: number | null,
193
- sw: number | null,
194
- sh: number | null,
195
- ): Promise<{
196
- data: ImageBitmap | HTMLImageElement;
197
- premultiplyAlpha: boolean;
198
- }> {
199
- const hasAlphaChannel = premultiplyAlpha ?? blob.type.includes('image/png');
200
- const imageBitmapSupported = this.txManager.imageBitmapSupported;
201
-
202
- if (imageBitmapSupported.full === true && sw !== null && sh !== null) {
203
- // createImageBitmap with crop
204
- const bitmap = await this.platform.createImageBitmap(
205
- blob,
206
- sx || 0,
207
- sy || 0,
208
- sw,
209
- sh,
210
- {
211
- premultiplyAlpha: hasAlphaChannel ? 'premultiply' : 'none',
212
- colorSpaceConversion: 'none',
213
- imageOrientation: 'none',
214
- },
215
- );
216
- return { data: bitmap, premultiplyAlpha: hasAlphaChannel };
217
- } else if (imageBitmapSupported.basic === true) {
218
- // basic createImageBitmap without options or crop
219
- // this is supported for Chrome v50 to v52/54 that doesn't support options
220
- return {
221
- data: await this.platform.createImageBitmap(blob),
222
- premultiplyAlpha: hasAlphaChannel,
223
- };
224
- }
225
-
226
- // default createImageBitmap without crop but with options
227
- const bitmap = await this.platform.createImageBitmap(blob, {
228
- premultiplyAlpha: hasAlphaChannel ? 'premultiply' : 'none',
229
- colorSpaceConversion: 'none',
230
- imageOrientation: 'none',
231
- });
232
- return { data: bitmap, premultiplyAlpha: hasAlphaChannel };
233
- }
234
-
235
- async loadImage(src: string) {
236
- const { premultiplyAlpha, sx, sy, sw, sh } = this.props;
237
-
238
- if (this.txManager.hasCreateImageBitmap === true) {
239
- if (
240
- isBase64Image(src) === false &&
241
- this.txManager.hasWorker === true &&
242
- this.txManager.imageWorkerManager !== null
243
- ) {
244
- return this.txManager.imageWorkerManager.getImage(
245
- src,
246
- premultiplyAlpha,
247
- sx,
248
- sy,
249
- sw,
250
- sh,
251
- );
252
- }
253
-
254
- let blob;
255
-
256
- if (isBase64Image(src) === true) {
257
- blob = dataURIToBlob(src);
258
- } else {
259
- blob = await fetchJson(src, 'blob').then(
260
- (response) => response as Blob,
261
- );
262
- }
263
-
264
- return this.createImageBitmap(blob, premultiplyAlpha, sx, sy, sw, sh);
265
- }
266
-
267
- return this.loadImageFallback(src, premultiplyAlpha ?? true);
268
- }
269
-
270
145
  override async getTextureSource(): Promise<TextureData> {
271
146
  let resp: TextureData;
272
147
  try {
@@ -293,7 +168,10 @@ export class ImageTexture extends Texture {
293
168
  }
294
169
 
295
170
  determineImageTypeAndLoadImage() {
296
- const { src, premultiplyAlpha, type } = this.props;
171
+ const { src, premultiplyAlpha, type, w, h, sx, sy, sw, sh } = this.props;
172
+ const platform = this.platform;
173
+ const premultiply = premultiplyAlpha ?? true;
174
+
297
175
  if (src === null) {
298
176
  return {
299
177
  data: null,
@@ -302,13 +180,9 @@ export class ImageTexture extends Texture {
302
180
 
303
181
  if (typeof src !== 'string') {
304
182
  if (src instanceof Blob) {
305
- if (this.txManager.hasCreateImageBitmap === true) {
306
- const { sx, sy, sw, sh } = this.props;
307
- return this.createImageBitmap(src, premultiplyAlpha, sx, sy, sw, sh);
308
- } else {
309
- return this.loadImageFallback(src, premultiplyAlpha ?? true);
310
- }
183
+ return platform.createImage(src, premultiply, sx, sy, sw, sh);
311
184
  }
185
+
312
186
  if (src instanceof ImageData) {
313
187
  return {
314
188
  data: src,
@@ -321,45 +195,28 @@ export class ImageTexture extends Texture {
321
195
  };
322
196
  }
323
197
 
324
- const absoluteSrc = convertUrlToAbsolute(src);
325
198
  if (type === 'regular') {
326
- return this.loadImage(absoluteSrc);
199
+ return platform.loadImage(src, premultiply, sx, sy, sw, sh);
327
200
  }
328
201
 
329
202
  if (type === 'svg') {
330
- return loadSvg(
331
- absoluteSrc,
332
- this.props.w,
333
- this.props.h,
334
- this.props.sx,
335
- this.props.sy,
336
- this.props.sw,
337
- this.props.sh,
338
- );
203
+ return platform.loadSvg(src, w, h, sx, sy, sw, sh);
339
204
  }
340
205
 
341
206
  if (isSvgImage(src) === true) {
342
- return loadSvg(
343
- absoluteSrc,
344
- this.props.w,
345
- this.props.h,
346
- this.props.sx,
347
- this.props.sy,
348
- this.props.sw,
349
- this.props.sh,
350
- );
207
+ return platform.loadSvg(src, w, h, sx, sy, sw, sh);
351
208
  }
352
209
 
353
210
  if (type === 'compressed') {
354
- return loadCompressedTexture(absoluteSrc);
211
+ return platform.loadCompressedTexture(src);
355
212
  }
356
213
 
357
214
  if (isCompressedTextureContainer(src) === true) {
358
- return loadCompressedTexture(absoluteSrc);
215
+ return platform.loadCompressedTexture(src);
359
216
  }
360
217
 
361
218
  // default
362
- return this.loadImage(absoluteSrc);
219
+ return platform.loadImage(src, premultiply, sx, sy, sw, sh);
363
220
  }
364
221
 
365
222
  /**
@@ -409,3 +266,27 @@ export class ImageTexture extends Texture {
409
266
 
410
267
  static z$__type__Props: ImageTextureProps;
411
268
  }
269
+
270
+ /**
271
+ * Tests if the given location is a SVG
272
+ * @param url
273
+ * @remarks
274
+ * This function is used to determine if the given image url is a SVG
275
+ * image
276
+ * @returns
277
+ */
278
+ export function isSvgImage(url: string): boolean {
279
+ return /\.(svg)(\?.*)?$/.test(url);
280
+ }
281
+
282
+ /**
283
+ * Tests if the given location is a compressed texture container
284
+ * @param url
285
+ * @remarks
286
+ * This function is used to determine if the given image url is a compressed
287
+ * and only supports the following extensions: .ktx and .pvr
288
+ * @returns
289
+ */
290
+ export function isCompressedTextureContainer(src: string): boolean {
291
+ return /\.(ktx|pvr)$/.test(src);
292
+ }