@lightningjs/renderer 0.6.1 → 0.7.1

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 (201) hide show
  1. package/dist/src/common/CommonTypes.d.ts +8 -0
  2. package/dist/src/core/CoreNode.d.ts +4 -7
  3. package/dist/src/core/CoreNode.js +73 -40
  4. package/dist/src/core/CoreNode.js.map +1 -1
  5. package/dist/src/core/CoreTextNode.d.ts +12 -2
  6. package/dist/src/core/CoreTextNode.js +46 -1
  7. package/dist/src/core/CoreTextNode.js.map +1 -1
  8. package/dist/src/core/CoreTextureManager.d.ts +3 -1
  9. package/dist/src/core/CoreTextureManager.js +4 -1
  10. package/dist/src/core/CoreTextureManager.js.map +1 -1
  11. package/dist/src/core/Stage.d.ts +6 -0
  12. package/dist/src/core/Stage.js +13 -4
  13. package/dist/src/core/Stage.js.map +1 -1
  14. package/dist/src/core/animations/CoreAnimation.d.ts +1 -0
  15. package/dist/src/core/animations/CoreAnimation.js +7 -0
  16. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  17. package/dist/src/core/lib/ImageWorker.d.ts +16 -0
  18. package/dist/src/core/lib/ImageWorker.js +111 -0
  19. package/dist/src/core/lib/ImageWorker.js.map +1 -0
  20. package/dist/src/core/lib/WebGlContextWrapper.d.ts +4 -0
  21. package/dist/src/core/lib/WebGlContextWrapper.js +7 -2
  22. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  23. package/dist/src/core/lib/utils.d.ts +9 -0
  24. package/dist/src/core/lib/utils.js +48 -1
  25. package/dist/src/core/lib/utils.js.map +1 -1
  26. package/dist/src/core/renderers/CoreRenderer.d.ts +2 -2
  27. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +2 -1
  28. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +2 -2
  29. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +1 -1
  30. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +3 -2
  31. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +23 -21
  32. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  33. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +5 -4
  34. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +10 -14
  35. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +1 -1
  36. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +4 -1
  37. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +30 -24
  38. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  39. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +2 -1
  40. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +24 -24
  41. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
  42. package/dist/src/core/renderers/webgl/internal/RendererUtils.d.ts +8 -5
  43. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +11 -13
  44. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  45. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +3 -2
  46. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +15 -15
  47. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  48. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +3 -6
  49. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +1 -1
  50. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +3 -3
  51. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -1
  52. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +1 -0
  53. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +32 -12
  54. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
  55. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +3 -3
  56. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -1
  57. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +3 -3
  58. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
  59. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +1 -1
  60. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +14 -1
  61. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +15 -5
  62. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +1 -1
  63. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +3 -3
  64. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  65. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.d.ts +2 -1
  66. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +4 -2
  67. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +1 -1
  68. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +2 -2
  69. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +25 -0
  70. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  71. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +1 -1
  72. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +6 -6
  73. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
  74. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +8 -11
  75. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +140 -81
  76. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  77. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.d.ts +8 -0
  78. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.js +29 -0
  79. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.js.map +1 -0
  80. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +4 -3
  81. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +15 -11
  82. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +1 -1
  83. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +3 -2
  84. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +30 -26
  85. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  86. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.d.ts +19 -0
  87. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.js +84 -0
  88. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.js.map +1 -0
  89. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.d.ts +8 -0
  90. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.js +40 -0
  91. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.js.map +1 -0
  92. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.d.ts +2 -0
  93. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.js +41 -0
  94. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.js.map +1 -0
  95. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.d.ts +1 -0
  96. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.js +4 -0
  97. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.js.map +1 -0
  98. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.d.ts +1 -0
  99. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.js +2 -0
  100. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.js.map +1 -0
  101. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.d.ts +9 -0
  102. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.js +32 -0
  103. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.js.map +1 -0
  104. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +26 -0
  105. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js +70 -0
  106. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +1 -0
  107. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.d.ts +16 -0
  108. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js +39 -0
  109. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js.map +1 -0
  110. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +52 -2
  111. package/dist/src/core/text-rendering/renderers/TextRenderer.js +19 -0
  112. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  113. package/dist/src/core/textures/ImageTexture.js +14 -9
  114. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  115. package/dist/src/core/utils.d.ts +1 -6
  116. package/dist/src/core/utils.js +3 -2
  117. package/dist/src/core/utils.js.map +1 -1
  118. package/dist/src/main-api/ICoreDriver.d.ts +2 -1
  119. package/dist/src/main-api/RendererMain.d.ts +25 -0
  120. package/dist/src/main-api/RendererMain.js +14 -5
  121. package/dist/src/main-api/RendererMain.js.map +1 -1
  122. package/dist/src/render-drivers/main/MainCoreDriver.d.ts +2 -1
  123. package/dist/src/render-drivers/main/MainCoreDriver.js +6 -4
  124. package/dist/src/render-drivers/main/MainCoreDriver.js.map +1 -1
  125. package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +10 -0
  126. package/dist/src/render-drivers/main/MainOnlyTextNode.js +45 -0
  127. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +1 -1
  128. package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +10 -0
  129. package/dist/src/render-drivers/threadx/TextNodeStruct.js +45 -0
  130. package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +1 -1
  131. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +2 -1
  132. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +8 -1
  133. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +1 -1
  134. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +5 -0
  135. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +5 -0
  136. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +1 -1
  137. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +4 -1
  138. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +1 -1
  139. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +5 -0
  140. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +10 -0
  141. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +1 -1
  142. package/dist/src/render-drivers/threadx/worker/renderer.js +5 -3
  143. package/dist/src/render-drivers/threadx/worker/renderer.js.map +1 -1
  144. package/dist/src/utils.d.ts +2 -1
  145. package/dist/src/utils.js +22 -3
  146. package/dist/src/utils.js.map +1 -1
  147. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  148. package/package.json +3 -2
  149. package/src/common/CommonTypes.ts +9 -0
  150. package/src/core/CoreNode.ts +96 -62
  151. package/src/core/CoreTextNode.ts +58 -2
  152. package/src/core/CoreTextureManager.ts +4 -2
  153. package/src/core/Stage.ts +33 -4
  154. package/src/core/animations/CoreAnimation.ts +8 -0
  155. package/src/core/lib/ContextSpy.ts +41 -0
  156. package/src/core/lib/ImageWorker.ts +124 -0
  157. package/src/core/lib/WebGlContextWrapper.ts +965 -0
  158. package/src/core/lib/utils.ts +68 -1
  159. package/src/core/renderers/CoreRenderer.ts +2 -2
  160. package/src/core/renderers/webgl/WebGlCoreCtxSubTexture.ts +3 -2
  161. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +29 -28
  162. package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +13 -17
  163. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +33 -25
  164. package/src/core/renderers/webgl/WebGlCoreShader.ts +34 -25
  165. package/src/core/renderers/webgl/internal/RendererUtils.ts +13 -16
  166. package/src/core/renderers/webgl/internal/ShaderUtils.ts +16 -15
  167. package/src/core/renderers/webgl/shaders/DefaultShader.ts +3 -7
  168. package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +3 -3
  169. package/src/core/renderers/webgl/shaders/DynamicShader.ts +42 -14
  170. package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +3 -3
  171. package/src/core/renderers/webgl/shaders/SdfShader.ts +3 -3
  172. package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +1 -1
  173. package/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.ts +35 -5
  174. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +3 -3
  175. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +9 -3
  176. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +4 -2
  177. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +27 -1
  178. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +7 -7
  179. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +193 -103
  180. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +26 -18
  181. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +40 -28
  182. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +6 -1
  183. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +205 -0
  184. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/{makeRenderWindow.ts → setRenderWindow.ts} +50 -21
  185. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +40 -0
  186. package/src/core/text-rendering/renderers/TextRenderer.ts +75 -2
  187. package/src/core/textures/ImageTexture.ts +17 -9
  188. package/src/core/utils.ts +87 -85
  189. package/src/env.d.ts +7 -0
  190. package/src/main-api/ICoreDriver.ts +2 -1
  191. package/src/main-api/RendererMain.ts +43 -5
  192. package/src/render-drivers/main/MainCoreDriver.ts +8 -5
  193. package/src/render-drivers/main/MainOnlyTextNode.ts +55 -1
  194. package/src/render-drivers/threadx/TextNodeStruct.ts +45 -0
  195. package/src/render-drivers/threadx/ThreadXCoreDriver.ts +10 -2
  196. package/src/render-drivers/threadx/ThreadXMainTextNode.ts +10 -0
  197. package/src/render-drivers/threadx/ThreadXRendererMessage.ts +5 -1
  198. package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +15 -0
  199. package/src/render-drivers/threadx/worker/renderer.ts +6 -4
  200. package/src/utils.ts +25 -4
  201. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.test.ts +0 -136
@@ -81,6 +81,10 @@ export interface Rect {
81
81
  height: number;
82
82
  }
83
83
 
84
+ export interface RectWithValid extends Rect {
85
+ valid: boolean;
86
+ }
87
+
84
88
  export interface Bound {
85
89
  x1: number;
86
90
  y1: number;
@@ -132,12 +136,50 @@ export function intersectBound<T extends Bound = Bound>(
132
136
  return createBound(0, 0, 0, 0, intersection);
133
137
  }
134
138
 
135
- export function intersectRect(a: Rect, b: Rect): Rect {
139
+ export function boundsOverlap(a: Bound, b: Bound): boolean {
140
+ return a.x1 < b.x2 && a.x2 > b.x1 && a.y1 < b.y2 && a.y2 > b.y1;
141
+ }
142
+
143
+ export function convertBoundToRect(bound: Bound): Rect;
144
+ export function convertBoundToRect<T extends Rect = Rect>(
145
+ bound: Bound,
146
+ out: T,
147
+ ): T;
148
+ export function convertBoundToRect(bound: Bound, out?: Rect): Rect {
149
+ if (out) {
150
+ out.x = bound.x1;
151
+ out.y = bound.y1;
152
+ out.width = bound.x2 - bound.x1;
153
+ out.height = bound.y2 - bound.y1;
154
+ return out;
155
+ }
156
+ return {
157
+ x: bound.x1,
158
+ y: bound.y1,
159
+ width: bound.x2 - bound.x1,
160
+ height: bound.y2 - bound.y1,
161
+ };
162
+ }
163
+
164
+ export function intersectRect(a: Rect, b: Rect): Rect;
165
+ export function intersectRect<T extends Rect = Rect>(
166
+ a: Rect,
167
+ b: Rect,
168
+ out: T,
169
+ ): T;
170
+ export function intersectRect(a: Rect, b: Rect, out?: Rect): Rect {
136
171
  const x = Math.max(a.x, b.x);
137
172
  const y = Math.max(a.y, b.y);
138
173
  const width = Math.min(a.x + a.width, b.x + b.width) - x;
139
174
  const height = Math.min(a.y + a.height, b.y + b.height) - y;
140
175
  if (width > 0 && height > 0) {
176
+ if (out) {
177
+ out.x = x;
178
+ out.y = y;
179
+ out.width = width;
180
+ out.height = height;
181
+ return out;
182
+ }
141
183
  return {
142
184
  x,
143
185
  y,
@@ -145,6 +187,13 @@ export function intersectRect(a: Rect, b: Rect): Rect {
145
187
  height,
146
188
  };
147
189
  }
190
+ if (out) {
191
+ out.x = 0;
192
+ out.y = 0;
193
+ out.width = 0;
194
+ out.height = 0;
195
+ return out;
196
+ }
148
197
  return {
149
198
  x: 0,
150
199
  y: 0,
@@ -153,6 +202,24 @@ export function intersectRect(a: Rect, b: Rect): Rect {
153
202
  };
154
203
  }
155
204
 
205
+ export function copyRect(a: Rect): Rect;
206
+ export function copyRect<T extends Rect = Rect>(a: Rect, out: T): T;
207
+ export function copyRect(a: Rect, out?: Rect): Rect {
208
+ if (out) {
209
+ out.x = a.x;
210
+ out.y = a.y;
211
+ out.width = a.width;
212
+ out.height = a.height;
213
+ return out;
214
+ }
215
+ return {
216
+ x: a.x,
217
+ y: a.y,
218
+ width: a.width,
219
+ height: a.height,
220
+ };
221
+ }
222
+
156
223
  export function compareRect(a: Rect | null, b: Rect | null): boolean {
157
224
  if (a === b) {
158
225
  return true;
@@ -20,7 +20,7 @@
20
20
  import type { CoreShaderManager } from '../CoreShaderManager.js';
21
21
  import type { TextureOptions } from '../CoreTextureManager.js';
22
22
  import type { Stage } from '../Stage.js';
23
- import type { Rect } from '../lib/utils.js';
23
+ import type { Rect, RectWithValid } from '../lib/utils.js';
24
24
  import type { Texture } from '../textures/Texture.js';
25
25
  import { CoreContextTexture } from './CoreContextTexture.js';
26
26
  import type { CoreRenderOp } from './CoreRenderOp.js';
@@ -39,7 +39,7 @@ export interface QuadOptions {
39
39
  shader: CoreShader | null;
40
40
  shaderProps: Record<string, unknown> | null;
41
41
  alpha: number;
42
- clippingRect: Rect | null;
42
+ clippingRect: RectWithValid;
43
43
  tx: number;
44
44
  ty: number;
45
45
  ta: number;
@@ -18,12 +18,13 @@
18
18
  */
19
19
 
20
20
  import type { Dimensions } from '../../../common/CommonTypes.js';
21
+ import type { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
21
22
  import type { SubTexture } from '../../textures/SubTexture.js';
22
23
  import { WebGlCoreCtxTexture } from './WebGlCoreCtxTexture.js';
23
24
 
24
25
  export class WebGlCoreCtxSubTexture extends WebGlCoreCtxTexture {
25
- constructor(gl: WebGLRenderingContext, textureSource: SubTexture) {
26
- super(gl, textureSource);
26
+ constructor(glw: WebGlContextWrapper, textureSource: SubTexture) {
27
+ super(glw, textureSource);
27
28
  }
28
29
 
29
30
  override async onLoadRequest(): Promise<Dimensions> {
@@ -19,10 +19,10 @@
19
19
 
20
20
  import type { Dimensions } from '../../../common/CommonTypes.js';
21
21
  import { assertTruthy } from '../../../utils.js';
22
+ import type { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
22
23
  import type { Texture } from '../../textures/Texture.js';
23
24
  import { isPowerOfTwo } from '../../utils.js';
24
25
  import { CoreContextTexture } from '../CoreContextTexture.js';
25
- import { isWebGl2 } from './internal/WebGlUtils.js';
26
26
 
27
27
  const TRANSPARENT_TEXTURE_DATA = new Uint8Array([0, 0, 0, 0]);
28
28
 
@@ -43,7 +43,7 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
43
43
  private _w = 0;
44
44
  private _h = 0;
45
45
 
46
- constructor(protected gl: WebGLRenderingContext, textureSource: Texture) {
46
+ constructor(protected glw: WebGlContextWrapper, textureSource: Texture) {
47
47
  super(textureSource);
48
48
  }
49
49
 
@@ -100,30 +100,29 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
100
100
  */
101
101
  async onLoadRequest(): Promise<Dimensions> {
102
102
  this._nativeCtxTexture = this.createNativeCtxTexture();
103
- const { gl } = this;
103
+ const { glw } = this;
104
104
 
105
105
  // On initial load request, create a 1x1 transparent texture to use until
106
106
  // the texture data is finally loaded.
107
- gl.bindTexture(gl.TEXTURE_2D, this._nativeCtxTexture);
107
+ glw.activeTexture(0);
108
+ glw.bindTexture(this._nativeCtxTexture);
108
109
 
109
110
  // linear texture filtering
110
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
111
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
111
+ glw.texParameteri(glw.TEXTURE_MAG_FILTER, glw.LINEAR);
112
+ glw.texParameteri(glw.TEXTURE_MIN_FILTER, glw.LINEAR);
112
113
 
113
114
  // texture wrapping method
114
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
115
- gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
115
+ glw.texParameteri(glw.TEXTURE_WRAP_S, glw.CLAMP_TO_EDGE);
116
+ glw.texParameteri(glw.TEXTURE_WRAP_T, glw.CLAMP_TO_EDGE);
116
117
 
117
- gl.bindTexture(gl.TEXTURE_2D, this._nativeCtxTexture);
118
- gl.texImage2D(
119
- gl.TEXTURE_2D,
118
+ glw.texImage2D(
120
119
  0,
121
- gl.RGBA,
120
+ glw.RGBA,
122
121
  1,
123
122
  1,
124
123
  0,
125
- gl.RGBA,
126
- gl.UNSIGNED_BYTE,
124
+ glw.RGBA,
125
+ glw.UNSIGNED_BYTE,
127
126
  TRANSPARENT_TEXTURE_DATA,
128
127
  );
129
128
 
@@ -131,6 +130,7 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
131
130
  let width = 0;
132
131
  let height = 0;
133
132
  assertTruthy(this._nativeCtxTexture);
133
+ glw.activeTexture(0);
134
134
  // If textureData is null, the texture is empty (0, 0) and we don't need to
135
135
  // upload any data to the GPU.
136
136
  if (
@@ -140,33 +140,32 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
140
140
  const data = textureData.data;
141
141
  width = data.width;
142
142
  height = data.height;
143
- gl.bindTexture(gl.TEXTURE_2D, this._nativeCtxTexture);
143
+ glw.bindTexture(this._nativeCtxTexture);
144
144
 
145
- gl.pixelStorei(
146
- gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL,
145
+ glw.pixelStorei(
146
+ glw.UNPACK_PREMULTIPLY_ALPHA_WEBGL,
147
147
  !!textureData.premultiplyAlpha,
148
148
  );
149
149
 
150
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, data);
150
+ glw.texImage2D(0, glw.RGBA, glw.RGBA, glw.UNSIGNED_BYTE, data);
151
151
 
152
152
  // generate mipmaps for power-of-2 textures or in WebGL2RenderingContext
153
- if (isWebGl2(gl) || (isPowerOfTwo(width) && isPowerOfTwo(height))) {
154
- gl.generateMipmap(gl.TEXTURE_2D);
153
+ if (glw.isWebGl2() || (isPowerOfTwo(width) && isPowerOfTwo(height))) {
154
+ glw.generateMipmap();
155
155
  }
156
156
  } else if (textureData.data === null) {
157
157
  width = 0;
158
158
  height = 0;
159
159
  // Reset to a 1x1 transparent texture
160
- gl.bindTexture(gl.TEXTURE_2D, this._nativeCtxTexture);
161
- gl.texImage2D(
162
- gl.TEXTURE_2D,
160
+ glw.bindTexture(this._nativeCtxTexture);
161
+ glw.texImage2D(
163
162
  0,
164
- gl.RGBA,
163
+ glw.RGBA,
165
164
  1,
166
165
  1,
167
166
  0,
168
- gl.RGBA,
169
- gl.UNSIGNED_BYTE,
167
+ glw.RGBA,
168
+ glw.UNSIGNED_BYTE,
170
169
  TRANSPARENT_TEXTURE_DATA,
171
170
  );
172
171
  } else {
@@ -196,12 +195,14 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
196
195
  if (!this._nativeCtxTexture) {
197
196
  return;
198
197
  }
199
- this.gl.deleteTexture(this._nativeCtxTexture);
198
+ const { glw } = this;
199
+ glw.deleteTexture(this._nativeCtxTexture);
200
200
  this._nativeCtxTexture = null;
201
201
  }
202
202
 
203
203
  private createNativeCtxTexture() {
204
- const nativeTexture = this.gl.createTexture();
204
+ const { glw } = this;
205
+ const nativeTexture = glw.createTexture();
205
206
  if (!nativeTexture) {
206
207
  throw new Error('Could not create WebGL Texture');
207
208
  }
@@ -23,7 +23,8 @@ import type { WebGlCoreCtxTexture } from './WebGlCoreCtxTexture.js';
23
23
  import type { WebGlCoreRendererOptions } from './WebGlCoreRenderer.js';
24
24
  import type { BufferCollection } from './internal/BufferCollection.js';
25
25
  import type { Dimensions } from '../../../common/CommonTypes.js';
26
- import type { Rect } from '../../lib/utils.js';
26
+ import type { Rect, RectWithValid } from '../../lib/utils.js';
27
+ import type { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
27
28
 
28
29
  const MAX_TEXTURES = 8; // TODO: get from gl
29
30
 
@@ -38,21 +39,20 @@ export class WebGlCoreRenderOp extends CoreRenderOp {
38
39
  readonly maxTextures: number;
39
40
 
40
41
  constructor(
41
- readonly gl: WebGLRenderingContext | WebGL2RenderingContext,
42
+ readonly glw: WebGlContextWrapper,
42
43
  readonly options: WebGlCoreRendererOptions,
43
44
  readonly buffers: BufferCollection,
44
45
  readonly shader: WebGlCoreShader,
45
46
  readonly shaderProps: Record<string, unknown>,
46
47
  readonly alpha: number,
47
- readonly clippingRect: Rect | null,
48
+ readonly clippingRect: RectWithValid,
48
49
  readonly dimensions: Dimensions,
49
50
  readonly bufferIdx: number,
50
51
  readonly zIndex: number,
51
52
  ) {
52
53
  super();
53
- this.gl = gl;
54
54
  this.maxTextures = shader.supportsIndexedTextures
55
- ? (gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS) as number)
55
+ ? (glw.getParameter(glw.MAX_VERTEX_TEXTURE_IMAGE_UNITS) as number)
56
56
  : 1;
57
57
  }
58
58
 
@@ -71,7 +71,7 @@ export class WebGlCoreRenderOp extends CoreRenderOp {
71
71
  }
72
72
 
73
73
  draw() {
74
- const { gl, shader, shaderProps, options } = this;
74
+ const { glw, shader, shaderProps, options } = this;
75
75
  // shaderOp.draw(this);
76
76
 
77
77
  const { shManager } = options;
@@ -81,12 +81,8 @@ export class WebGlCoreRenderOp extends CoreRenderOp {
81
81
  // TODO: Reduce calculations required
82
82
  const quadIdx = (this.bufferIdx / 24) * 6 * 2;
83
83
 
84
- // TODO: Move these somewhere else?
85
- gl.enable(gl.BLEND);
86
- gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
87
-
88
84
  // Clipping
89
- if (this.clippingRect) {
85
+ if (this.clippingRect.valid) {
90
86
  const { x, y, width, height } = this.clippingRect;
91
87
  const pixelRatio = options.pixelRatio;
92
88
  const canvasHeight = options.canvas.height;
@@ -95,16 +91,16 @@ export class WebGlCoreRenderOp extends CoreRenderOp {
95
91
  const clipWidth = Math.round(width * pixelRatio);
96
92
  const clipHeight = Math.round(height * pixelRatio);
97
93
  const clipY = Math.round(canvasHeight - clipHeight - y * pixelRatio);
98
- gl.enable(gl.SCISSOR_TEST);
99
- gl.scissor(clipX, clipY, clipWidth, clipHeight);
94
+ glw.setScissorTest(true);
95
+ glw.scissor(clipX, clipY, clipWidth, clipHeight);
100
96
  } else {
101
- gl.disable(gl.SCISSOR_TEST);
97
+ glw.setScissorTest(false);
102
98
  }
103
99
 
104
- gl.drawElements(
105
- gl.TRIANGLES,
100
+ glw.drawElements(
101
+ glw.TRIANGLES,
106
102
  6 * this.numQuads,
107
- gl.UNSIGNED_SHORT,
103
+ glw.UNSIGNED_SHORT,
108
104
  quadIdx,
109
105
  );
110
106
  }
@@ -50,10 +50,13 @@ import {
50
50
  compareRect,
51
51
  getNormalizedRgbaComponents,
52
52
  type Rect,
53
+ type RectWithValid,
53
54
  } from '../../lib/utils.js';
54
55
  import type { Dimensions } from '../../../common/CommonTypes.js';
55
56
  import { WebGlCoreShader } from './WebGlCoreShader.js';
56
57
  import { RoundedRectangle } from './shaders/RoundedRectangle.js';
58
+ import { ContextSpy } from '../../lib/ContextSpy.js';
59
+ import { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
57
60
 
58
61
  const WORDS_PER_QUAD = 24;
59
62
  const BYTES_PER_QUAD = WORDS_PER_QUAD * 4;
@@ -66,6 +69,7 @@ export interface WebGlCoreRendererOptions {
66
69
  shManager: CoreShaderManager;
67
70
  clearColor: number;
68
71
  bufferMemory: number;
72
+ contextSpy: ContextSpy | null;
69
73
  }
70
74
 
71
75
  interface CoreWebGlSystem {
@@ -75,7 +79,7 @@ interface CoreWebGlSystem {
75
79
 
76
80
  export class WebGlCoreRenderer extends CoreRenderer {
77
81
  //// WebGL Native Context and Data
78
- gl: WebGLRenderingContext;
82
+ glw: WebGlContextWrapper;
79
83
  system: CoreWebGlSystem;
80
84
 
81
85
  //// Core Managers
@@ -112,26 +116,30 @@ export class WebGlCoreRenderer extends CoreRenderer {
112
116
  this.txManager = options.txManager;
113
117
  this.shManager = options.shManager;
114
118
  this.defaultTexture = new ColorTexture(this.txManager);
119
+ // When the default texture is loaded, request a render in case the
120
+ // RAF is paused. Fixes: https://github.com/lightning-js/renderer/issues/123
121
+ this.defaultTexture.once('loaded', () => {
122
+ this.stage.requestRender();
123
+ });
115
124
 
116
- const gl = createWebGLContext(canvas);
117
- if (!gl) {
118
- throw new Error('Unable to create WebGL context');
119
- }
120
- this.gl = gl;
125
+ const gl = createWebGLContext(canvas, options.contextSpy);
126
+ const glw = (this.glw = new WebGlContextWrapper(gl));
121
127
 
122
128
  const color = getNormalizedRgbaComponents(clearColor);
123
- gl.viewport(0, 0, canvas.width, canvas.height);
124
- gl.clearColor(color[0]!, color[1]!, color[2]!, color[3]!);
129
+ glw.viewport(0, 0, canvas.width, canvas.height);
130
+ glw.clearColor(color[0]!, color[1]!, color[2]!, color[3]!);
131
+ glw.setBlend(true);
132
+ glw.blendFunc(glw.ONE, glw.ONE_MINUS_SRC_ALPHA);
125
133
 
126
- createIndexBuffer(gl, bufferMemory);
134
+ createIndexBuffer(glw, bufferMemory);
127
135
 
128
136
  this.system = {
129
- parameters: getWebGlParameters(gl),
130
- extensions: getWebGlExtensions(gl),
137
+ parameters: getWebGlParameters(this.glw),
138
+ extensions: getWebGlExtensions(this.glw),
131
139
  };
132
140
  this.shManager.renderer = this;
133
141
  this.defaultShader = this.shManager.loadShader('DefaultShader').shader;
134
- const quadBuffer = gl.createBuffer();
142
+ const quadBuffer = glw.createBuffer();
135
143
  assertTruthy(quadBuffer);
136
144
  const stride = 6 * Float32Array.BYTES_PER_ELEMENT;
137
145
  this.quadBufferCollection = new BufferCollection([
@@ -141,7 +149,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
141
149
  a_position: {
142
150
  name: 'a_position',
143
151
  size: 2, // 2 components per iteration
144
- type: gl.FLOAT, // the data is 32bit floats
152
+ type: glw.FLOAT, // the data is 32bit floats
145
153
  normalized: false, // don't normalize the data
146
154
  stride, // 0 = move forward size * sizeof(type) each iteration to get the next position
147
155
  offset: 0, // start at the beginning of the buffer
@@ -149,7 +157,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
149
157
  a_textureCoordinate: {
150
158
  name: 'a_textureCoordinate',
151
159
  size: 2,
152
- type: gl.FLOAT,
160
+ type: glw.FLOAT,
153
161
  normalized: false,
154
162
  stride,
155
163
  offset: 2 * Float32Array.BYTES_PER_ELEMENT,
@@ -157,7 +165,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
157
165
  a_color: {
158
166
  name: 'a_color',
159
167
  size: 4,
160
- type: gl.UNSIGNED_BYTE,
168
+ type: glw.UNSIGNED_BYTE,
161
169
  normalized: true,
162
170
  stride,
163
171
  offset: 4 * Float32Array.BYTES_PER_ELEMENT,
@@ -165,7 +173,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
165
173
  a_textureIndex: {
166
174
  name: 'a_textureIndex',
167
175
  size: 1,
168
- type: gl.FLOAT,
176
+ type: glw.FLOAT,
169
177
  normalized: false,
170
178
  stride,
171
179
  offset: 5 * Float32Array.BYTES_PER_ELEMENT,
@@ -176,11 +184,12 @@ export class WebGlCoreRenderer extends CoreRenderer {
176
184
  }
177
185
 
178
186
  reset() {
187
+ const { glw } = this;
179
188
  this.curBufferIdx = 0;
180
189
  this.curRenderOp = null;
181
190
  this.renderOps.length = 0;
182
- this.gl.disable(this.gl.SCISSOR_TEST);
183
- this.gl.clear(this.gl.COLOR_BUFFER_BIT);
191
+ glw.setScissorTest(false);
192
+ glw.clear();
184
193
  }
185
194
 
186
195
  override getShaderManager(): CoreShaderManager {
@@ -189,9 +198,9 @@ export class WebGlCoreRenderer extends CoreRenderer {
189
198
 
190
199
  override createCtxTexture(textureSource: Texture): CoreContextTexture {
191
200
  if (textureSource instanceof SubTexture) {
192
- return new WebGlCoreCtxSubTexture(this.gl, textureSource);
201
+ return new WebGlCoreCtxSubTexture(this.glw, textureSource);
193
202
  }
194
- return new WebGlCoreCtxTexture(this.gl, textureSource);
203
+ return new WebGlCoreCtxTexture(this.glw, textureSource);
195
204
  }
196
205
 
197
206
  /**
@@ -409,11 +418,11 @@ export class WebGlCoreRenderer extends CoreRenderer {
409
418
  shaderProps: Record<string, unknown>,
410
419
  alpha: number,
411
420
  dimensions: Dimensions,
412
- clippingRect: Rect | null,
421
+ clippingRect: RectWithValid,
413
422
  bufferIdx: number,
414
423
  ) {
415
424
  const curRenderOp = new WebGlCoreRenderOp(
416
- this.gl,
425
+ this.glw,
417
426
  this.options,
418
427
  this.quadBufferCollection,
419
428
  shader,
@@ -485,13 +494,12 @@ export class WebGlCoreRenderer extends CoreRenderer {
485
494
  * @param surface
486
495
  */
487
496
  render(surface: 'screen' | CoreContextTexture = 'screen'): void {
488
- const { gl, quadBuffer } = this;
497
+ const { glw, quadBuffer } = this;
489
498
 
490
499
  const arr = new Float32Array(quadBuffer, 0, this.curBufferIdx);
491
500
 
492
501
  const buffer = this.quadBufferCollection.getBuffer('a_position') ?? null;
493
- gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
494
- gl.bufferData(gl.ARRAY_BUFFER, arr, gl.DYNAMIC_DRAW);
502
+ glw.arrayBufferData(buffer, arr, glw.STATIC_DRAW);
495
503
 
496
504
  const doLog = false; // idx++ % 100 === 0;
497
505
  if (doLog) {
@@ -19,6 +19,7 @@
19
19
 
20
20
  import type { Dimensions } from '../../../common/CommonTypes.js';
21
21
  import { assertTruthy, hasOwn } from '../../../utils.js';
22
+ import type { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
22
23
  import { CoreShader } from '../CoreShader.js';
23
24
  import type { WebGlCoreCtxTexture } from './WebGlCoreCtxTexture.js';
24
25
  import type { WebGlCoreRenderOp } from './WebGlCoreRenderOp.js';
@@ -76,7 +77,7 @@ export abstract class WebGlCoreShader extends CoreShader {
76
77
  */
77
78
  protected vao: WebGLVertexArrayObject | undefined;
78
79
  protected renderer: WebGlCoreRenderer;
79
- protected gl: WebGLRenderingContext;
80
+ protected glw: WebGlContextWrapper;
80
81
  protected attributeBuffers: Record<string, WebGLBuffer>;
81
82
  protected attributeLocations: Record<string, number>;
82
83
  protected attributeNames: string[];
@@ -87,18 +88,18 @@ export abstract class WebGlCoreShader extends CoreShader {
87
88
  constructor(options: ShaderOptions) {
88
89
  super();
89
90
  const renderer = (this.renderer = options.renderer);
90
- const gl = (this.gl = this.renderer.gl);
91
+ const glw = (this.glw = this.renderer.glw);
91
92
  this.supportsIndexedTextures = options.supportsIndexedTextures || false;
92
93
 
93
94
  // Check that extensions are supported
94
- const webGl2 = isWebGl2(gl);
95
+ const webGl2 = glw.isWebGl2();
95
96
  const requiredExtensions =
96
97
  (webGl2 && options.webgl2Extensions) ||
97
98
  (!webGl2 && options.webgl1Extensions) ||
98
99
  [];
99
100
  const glVersion = webGl2 ? '2.0' : '1.0';
100
101
  requiredExtensions.forEach((extensionName) => {
101
- if (!gl.getExtension(extensionName)) {
102
+ if (!glw.getExtension(extensionName)) {
102
103
  throw new Error(
103
104
  `Shader "${this.constructor.name}" requires extension "${extensionName}" for WebGL ${glVersion} but wasn't found`,
104
105
  );
@@ -136,26 +137,30 @@ export abstract class WebGlCoreShader extends CoreShader {
136
137
  ? shaderSources.fragment(textureUnits)
137
138
  : shaderSources.fragment;
138
139
 
139
- const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexSource);
140
- const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
140
+ const vertexShader = createShader(glw, glw.VERTEX_SHADER, vertexSource);
141
+ const fragmentShader = createShader(
142
+ glw,
143
+ glw.FRAGMENT_SHADER,
144
+ fragmentSource,
145
+ );
141
146
  if (!vertexShader || !fragmentShader) {
142
147
  throw new Error();
143
148
  }
144
149
 
145
- const program = createProgram(gl, vertexShader, fragmentShader);
150
+ const program = createProgram(glw, vertexShader, fragmentShader);
146
151
  if (!program) {
147
152
  throw new Error();
148
153
  }
149
154
  this.program = program;
150
155
 
151
156
  if (webGl2) {
152
- const vao = gl.createVertexArray();
157
+ const vao = glw.createVertexArray();
153
158
  if (!vao) {
154
159
  throw new Error();
155
160
  }
156
161
  this.vao = vao;
157
162
 
158
- gl.bindVertexArray(this.vao);
163
+ glw.bindVertexArray(this.vao);
159
164
  }
160
165
 
161
166
  this.attributeLocations = {} as Record<string, number>;
@@ -163,13 +168,13 @@ export abstract class WebGlCoreShader extends CoreShader {
163
168
  this.attributeNames = [];
164
169
 
165
170
  [...options.attributes].forEach((attributeName) => {
166
- const location = gl.getAttribLocation(this.program, attributeName);
171
+ const location = glw.getAttribLocation(this.program, attributeName);
167
172
  if (location < 0) {
168
173
  throw new Error(
169
174
  `${this.constructor.name}: Vertex shader must have an attribute "${attributeName}"!`,
170
175
  );
171
176
  }
172
- const buffer = gl.createBuffer();
177
+ const buffer = glw.createBuffer();
173
178
  if (!buffer) {
174
179
  throw new Error(
175
180
  `${this.constructor.name}: Could not create buffer for attribute "${attributeName}"`,
@@ -184,7 +189,7 @@ export abstract class WebGlCoreShader extends CoreShader {
184
189
  this.uniformLocations = {} as Record<string, WebGLRenderingContext>;
185
190
  this.uniformTypes = {} as Record<string, keyof UniformMethodMap>;
186
191
  options.uniforms.forEach((uniform: UniformInfo) => {
187
- const location = gl.getUniformLocation(this.program, uniform.name);
192
+ const location = glw.getUniformLocation(this.program, uniform.name);
188
193
  this.uniformTypes[uniform.name] = uniform.uniform;
189
194
  if (!location) {
190
195
  console.warn(
@@ -201,12 +206,11 @@ export abstract class WebGlCoreShader extends CoreShader {
201
206
  buffer: WebGLBuffer,
202
207
  attribute: AttributeInfo,
203
208
  ) {
204
- const gl = this.gl;
205
- gl.enableVertexAttribArray(location);
206
-
207
- gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
209
+ const { glw } = this;
210
+ glw.enableVertexAttribArray(location);
208
211
 
209
- gl.vertexAttribPointer(
212
+ glw.vertexAttribPointer(
213
+ buffer,
210
214
  location,
211
215
  attribute.size,
212
216
  attribute.type,
@@ -217,7 +221,7 @@ export abstract class WebGlCoreShader extends CoreShader {
217
221
  }
218
222
 
219
223
  disableAttribute(location: number) {
220
- this.gl.disableVertexAttribArray(location);
224
+ this.glw.disableVertexAttribArray(location);
221
225
  }
222
226
 
223
227
  disableAttributes() {
@@ -257,9 +261,9 @@ export abstract class WebGlCoreShader extends CoreShader {
257
261
  if (renderOp.textures.length > 0) {
258
262
  this.bindTextures(renderOp.textures);
259
263
  }
260
- const { gl } = renderOp;
264
+ const { glw } = renderOp;
261
265
  // Bind standard automatic uniforms
262
- this.setUniform('u_resolution', [gl.canvas.width, gl.canvas.height]); // !!!
266
+ this.setUniform('u_resolution', [glw.canvas.width, glw.canvas.height]);
263
267
  this.setUniform('u_pixelRatio', renderOp.options.pixelRatio);
264
268
  if (props) {
265
269
  // Bind optional automatic uniforms
@@ -283,8 +287,12 @@ export abstract class WebGlCoreShader extends CoreShader {
283
287
  }
284
288
 
285
289
  setUniform(name: string, ...value: any[]): void {
286
- // @ts-expect-error Typing of args is too funky apparently for TS
287
- this.gl[this.uniformTypes[name]](this.uniformLocations[name], ...value);
290
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-unsafe-argument
291
+ this.glw.setUniform(
292
+ this.uniformTypes[name]!,
293
+ this.uniformLocations[name]!,
294
+ ...(value as any),
295
+ );
288
296
  }
289
297
 
290
298
  bindBufferCollection(buffer: BufferCollection) {
@@ -314,9 +322,10 @@ export abstract class WebGlCoreShader extends CoreShader {
314
322
  }
315
323
 
316
324
  override attach(): void {
317
- this.gl.useProgram(this.program);
318
- if (isWebGl2(this.gl) && this.vao) {
319
- this.gl.bindVertexArray(this.vao);
325
+ this.glw.useProgram(this.program);
326
+ this.glw.useProgram(this.program);
327
+ if (this.glw.isWebGl2() && this.vao) {
328
+ this.glw.bindVertexArray(this.vao);
320
329
  }
321
330
  }
322
331