@lightningjs/renderer 0.6.1 → 0.7.0

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 (189) hide show
  1. package/dist/src/common/CommonTypes.d.ts +8 -0
  2. package/dist/src/core/CoreNode.js +45 -16
  3. package/dist/src/core/CoreNode.js.map +1 -1
  4. package/dist/src/core/CoreTextNode.d.ts +10 -0
  5. package/dist/src/core/CoreTextNode.js +45 -0
  6. package/dist/src/core/CoreTextNode.js.map +1 -1
  7. package/dist/src/core/CoreTextureManager.d.ts +3 -1
  8. package/dist/src/core/CoreTextureManager.js +4 -1
  9. package/dist/src/core/CoreTextureManager.js.map +1 -1
  10. package/dist/src/core/Stage.d.ts +6 -0
  11. package/dist/src/core/Stage.js +12 -3
  12. package/dist/src/core/Stage.js.map +1 -1
  13. package/dist/src/core/lib/ImageWorker.d.ts +16 -0
  14. package/dist/src/core/lib/ImageWorker.js +111 -0
  15. package/dist/src/core/lib/ImageWorker.js.map +1 -0
  16. package/dist/src/core/lib/WebGlContextWrapper.d.ts +4 -0
  17. package/dist/src/core/lib/WebGlContextWrapper.js +7 -2
  18. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  19. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +2 -1
  20. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +2 -2
  21. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +1 -1
  22. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +3 -2
  23. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +23 -21
  24. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  25. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +3 -2
  26. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +9 -13
  27. package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +1 -1
  28. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +4 -1
  29. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +25 -24
  30. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  31. package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +2 -1
  32. package/dist/src/core/renderers/webgl/WebGlCoreShader.js +24 -24
  33. package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
  34. package/dist/src/core/renderers/webgl/internal/RendererUtils.d.ts +8 -5
  35. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +11 -13
  36. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  37. package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +3 -2
  38. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +15 -15
  39. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  40. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +3 -6
  41. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +1 -1
  42. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +3 -3
  43. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -1
  44. package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +1 -0
  45. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +32 -12
  46. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
  47. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +3 -3
  48. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -1
  49. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +3 -3
  50. package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
  51. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +1 -1
  52. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +14 -1
  53. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +15 -5
  54. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +1 -1
  55. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +3 -3
  56. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
  57. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.d.ts +2 -1
  58. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +4 -2
  59. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +1 -1
  60. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +25 -0
  61. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  62. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +1 -1
  63. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +6 -6
  64. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
  65. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +3 -2
  66. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +82 -50
  67. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  68. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.d.ts +8 -0
  69. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.js +29 -0
  70. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.js.map +1 -0
  71. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +4 -3
  72. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +15 -11
  73. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +1 -1
  74. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +3 -2
  75. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +30 -26
  76. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  77. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.d.ts +19 -0
  78. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.js +84 -0
  79. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.js.map +1 -0
  80. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.d.ts +8 -0
  81. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.js +40 -0
  82. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.js.map +1 -0
  83. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.d.ts +2 -0
  84. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.js +41 -0
  85. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.js.map +1 -0
  86. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.d.ts +1 -0
  87. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.js +4 -0
  88. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.js.map +1 -0
  89. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.d.ts +1 -0
  90. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.js +2 -0
  91. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.js.map +1 -0
  92. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.d.ts +9 -0
  93. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.js +32 -0
  94. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.js.map +1 -0
  95. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +26 -0
  96. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js +70 -0
  97. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +1 -0
  98. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.d.ts +16 -0
  99. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js +39 -0
  100. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js.map +1 -0
  101. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +50 -0
  102. package/dist/src/core/text-rendering/renderers/TextRenderer.js +19 -0
  103. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  104. package/dist/src/core/textures/ImageTexture.js +14 -9
  105. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  106. package/dist/src/core/utils.d.ts +1 -6
  107. package/dist/src/core/utils.js +3 -2
  108. package/dist/src/core/utils.js.map +1 -1
  109. package/dist/src/main-api/ICoreDriver.d.ts +2 -1
  110. package/dist/src/main-api/RendererMain.d.ts +25 -0
  111. package/dist/src/main-api/RendererMain.js +14 -5
  112. package/dist/src/main-api/RendererMain.js.map +1 -1
  113. package/dist/src/render-drivers/main/MainCoreDriver.d.ts +2 -1
  114. package/dist/src/render-drivers/main/MainCoreDriver.js +6 -4
  115. package/dist/src/render-drivers/main/MainCoreDriver.js.map +1 -1
  116. package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +10 -0
  117. package/dist/src/render-drivers/main/MainOnlyTextNode.js +45 -0
  118. package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +1 -1
  119. package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +10 -0
  120. package/dist/src/render-drivers/threadx/TextNodeStruct.js +45 -0
  121. package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +1 -1
  122. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +2 -1
  123. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +8 -1
  124. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +1 -1
  125. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +5 -0
  126. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +5 -0
  127. package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +1 -1
  128. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +4 -1
  129. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +1 -1
  130. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +5 -0
  131. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +10 -0
  132. package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +1 -1
  133. package/dist/src/render-drivers/threadx/worker/renderer.js +5 -3
  134. package/dist/src/render-drivers/threadx/worker/renderer.js.map +1 -1
  135. package/dist/src/utils.d.ts +2 -1
  136. package/dist/src/utils.js +22 -3
  137. package/dist/src/utils.js.map +1 -1
  138. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  139. package/package.json +3 -2
  140. package/src/common/CommonTypes.ts +9 -0
  141. package/src/core/CoreNode.ts +67 -34
  142. package/src/core/CoreTextNode.ts +56 -0
  143. package/src/core/CoreTextureManager.ts +4 -2
  144. package/src/core/Stage.ts +32 -3
  145. package/src/core/lib/ContextSpy.ts +41 -0
  146. package/src/core/lib/ImageWorker.ts +124 -0
  147. package/src/core/lib/WebGlContextWrapper.ts +965 -0
  148. package/src/core/renderers/webgl/WebGlCoreCtxSubTexture.ts +3 -2
  149. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +29 -28
  150. package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +10 -14
  151. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +26 -24
  152. package/src/core/renderers/webgl/WebGlCoreShader.ts +34 -25
  153. package/src/core/renderers/webgl/internal/RendererUtils.ts +13 -16
  154. package/src/core/renderers/webgl/internal/ShaderUtils.ts +16 -15
  155. package/src/core/renderers/webgl/shaders/DefaultShader.ts +3 -7
  156. package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +3 -3
  157. package/src/core/renderers/webgl/shaders/DynamicShader.ts +42 -14
  158. package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +3 -3
  159. package/src/core/renderers/webgl/shaders/SdfShader.ts +3 -3
  160. package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +1 -1
  161. package/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.ts +35 -5
  162. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +3 -3
  163. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +9 -3
  164. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +4 -2
  165. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +25 -0
  166. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +7 -7
  167. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +115 -63
  168. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +26 -18
  169. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +40 -28
  170. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +6 -1
  171. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +205 -0
  172. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/{makeRenderWindow.ts → setRenderWindow.ts} +50 -21
  173. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +40 -0
  174. package/src/core/text-rendering/renderers/TextRenderer.ts +73 -0
  175. package/src/core/textures/ImageTexture.ts +17 -9
  176. package/src/core/utils.ts +87 -85
  177. package/src/env.d.ts +7 -0
  178. package/src/main-api/ICoreDriver.ts +2 -1
  179. package/src/main-api/RendererMain.ts +43 -5
  180. package/src/render-drivers/main/MainCoreDriver.ts +8 -5
  181. package/src/render-drivers/main/MainOnlyTextNode.ts +55 -1
  182. package/src/render-drivers/threadx/TextNodeStruct.ts +45 -0
  183. package/src/render-drivers/threadx/ThreadXCoreDriver.ts +10 -2
  184. package/src/render-drivers/threadx/ThreadXMainTextNode.ts +10 -0
  185. package/src/render-drivers/threadx/ThreadXRendererMessage.ts +5 -1
  186. package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +15 -0
  187. package/src/render-drivers/threadx/worker/renderer.ts +6 -4
  188. package/src/utils.ts +25 -4
  189. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.test.ts +0 -136
@@ -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
  }
@@ -24,6 +24,7 @@ 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
26
  import type { Rect } 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,7 +39,7 @@ 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,
@@ -50,9 +51,8 @@ export class WebGlCoreRenderOp extends CoreRenderOp {
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,10 +81,6 @@ 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
85
  if (this.clippingRect) {
90
86
  const { x, y, width, height } = this.clippingRect;
@@ -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
  }
@@ -54,6 +54,8 @@ import {
54
54
  import type { Dimensions } from '../../../common/CommonTypes.js';
55
55
  import { WebGlCoreShader } from './WebGlCoreShader.js';
56
56
  import { RoundedRectangle } from './shaders/RoundedRectangle.js';
57
+ import { ContextSpy } from '../../lib/ContextSpy.js';
58
+ import { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
57
59
 
58
60
  const WORDS_PER_QUAD = 24;
59
61
  const BYTES_PER_QUAD = WORDS_PER_QUAD * 4;
@@ -66,6 +68,7 @@ export interface WebGlCoreRendererOptions {
66
68
  shManager: CoreShaderManager;
67
69
  clearColor: number;
68
70
  bufferMemory: number;
71
+ contextSpy: ContextSpy | null;
69
72
  }
70
73
 
71
74
  interface CoreWebGlSystem {
@@ -75,7 +78,7 @@ interface CoreWebGlSystem {
75
78
 
76
79
  export class WebGlCoreRenderer extends CoreRenderer {
77
80
  //// WebGL Native Context and Data
78
- gl: WebGLRenderingContext;
81
+ glw: WebGlContextWrapper;
79
82
  system: CoreWebGlSystem;
80
83
 
81
84
  //// Core Managers
@@ -113,25 +116,24 @@ export class WebGlCoreRenderer extends CoreRenderer {
113
116
  this.shManager = options.shManager;
114
117
  this.defaultTexture = new ColorTexture(this.txManager);
115
118
 
116
- const gl = createWebGLContext(canvas);
117
- if (!gl) {
118
- throw new Error('Unable to create WebGL context');
119
- }
120
- this.gl = gl;
119
+ const gl = createWebGLContext(canvas, options.contextSpy);
120
+ const glw = (this.glw = new WebGlContextWrapper(gl));
121
121
 
122
122
  const color = getNormalizedRgbaComponents(clearColor);
123
- gl.viewport(0, 0, canvas.width, canvas.height);
124
- gl.clearColor(color[0]!, color[1]!, color[2]!, color[3]!);
123
+ glw.viewport(0, 0, canvas.width, canvas.height);
124
+ glw.clearColor(color[0]!, color[1]!, color[2]!, color[3]!);
125
+ glw.setBlend(true);
126
+ glw.blendFunc(glw.ONE, glw.ONE_MINUS_SRC_ALPHA);
125
127
 
126
- createIndexBuffer(gl, bufferMemory);
128
+ createIndexBuffer(glw, bufferMemory);
127
129
 
128
130
  this.system = {
129
- parameters: getWebGlParameters(gl),
130
- extensions: getWebGlExtensions(gl),
131
+ parameters: getWebGlParameters(this.glw),
132
+ extensions: getWebGlExtensions(this.glw),
131
133
  };
132
134
  this.shManager.renderer = this;
133
135
  this.defaultShader = this.shManager.loadShader('DefaultShader').shader;
134
- const quadBuffer = gl.createBuffer();
136
+ const quadBuffer = glw.createBuffer();
135
137
  assertTruthy(quadBuffer);
136
138
  const stride = 6 * Float32Array.BYTES_PER_ELEMENT;
137
139
  this.quadBufferCollection = new BufferCollection([
@@ -141,7 +143,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
141
143
  a_position: {
142
144
  name: 'a_position',
143
145
  size: 2, // 2 components per iteration
144
- type: gl.FLOAT, // the data is 32bit floats
146
+ type: glw.FLOAT, // the data is 32bit floats
145
147
  normalized: false, // don't normalize the data
146
148
  stride, // 0 = move forward size * sizeof(type) each iteration to get the next position
147
149
  offset: 0, // start at the beginning of the buffer
@@ -149,7 +151,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
149
151
  a_textureCoordinate: {
150
152
  name: 'a_textureCoordinate',
151
153
  size: 2,
152
- type: gl.FLOAT,
154
+ type: glw.FLOAT,
153
155
  normalized: false,
154
156
  stride,
155
157
  offset: 2 * Float32Array.BYTES_PER_ELEMENT,
@@ -157,7 +159,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
157
159
  a_color: {
158
160
  name: 'a_color',
159
161
  size: 4,
160
- type: gl.UNSIGNED_BYTE,
162
+ type: glw.UNSIGNED_BYTE,
161
163
  normalized: true,
162
164
  stride,
163
165
  offset: 4 * Float32Array.BYTES_PER_ELEMENT,
@@ -165,7 +167,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
165
167
  a_textureIndex: {
166
168
  name: 'a_textureIndex',
167
169
  size: 1,
168
- type: gl.FLOAT,
170
+ type: glw.FLOAT,
169
171
  normalized: false,
170
172
  stride,
171
173
  offset: 5 * Float32Array.BYTES_PER_ELEMENT,
@@ -176,11 +178,12 @@ export class WebGlCoreRenderer extends CoreRenderer {
176
178
  }
177
179
 
178
180
  reset() {
181
+ const { glw } = this;
179
182
  this.curBufferIdx = 0;
180
183
  this.curRenderOp = null;
181
184
  this.renderOps.length = 0;
182
- this.gl.disable(this.gl.SCISSOR_TEST);
183
- this.gl.clear(this.gl.COLOR_BUFFER_BIT);
185
+ glw.setScissorTest(false);
186
+ glw.clear();
184
187
  }
185
188
 
186
189
  override getShaderManager(): CoreShaderManager {
@@ -189,9 +192,9 @@ export class WebGlCoreRenderer extends CoreRenderer {
189
192
 
190
193
  override createCtxTexture(textureSource: Texture): CoreContextTexture {
191
194
  if (textureSource instanceof SubTexture) {
192
- return new WebGlCoreCtxSubTexture(this.gl, textureSource);
195
+ return new WebGlCoreCtxSubTexture(this.glw, textureSource);
193
196
  }
194
- return new WebGlCoreCtxTexture(this.gl, textureSource);
197
+ return new WebGlCoreCtxTexture(this.glw, textureSource);
195
198
  }
196
199
 
197
200
  /**
@@ -413,7 +416,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
413
416
  bufferIdx: number,
414
417
  ) {
415
418
  const curRenderOp = new WebGlCoreRenderOp(
416
- this.gl,
419
+ this.glw,
417
420
  this.options,
418
421
  this.quadBufferCollection,
419
422
  shader,
@@ -485,13 +488,12 @@ export class WebGlCoreRenderer extends CoreRenderer {
485
488
  * @param surface
486
489
  */
487
490
  render(surface: 'screen' | CoreContextTexture = 'screen'): void {
488
- const { gl, quadBuffer } = this;
491
+ const { glw, quadBuffer } = this;
489
492
 
490
493
  const arr = new Float32Array(quadBuffer, 0, this.curBufferIdx);
491
494
 
492
495
  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);
496
+ glw.arrayBufferData(buffer, arr, glw.STATIC_DRAW);
495
497
 
496
498
  const doLog = false; // idx++ % 100 === 0;
497
499
  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
 
@@ -17,6 +17,8 @@
17
17
  * limitations under the License.
18
18
  */
19
19
 
20
+ import type { WebGlContextWrapper } from '../../../lib/WebGlContextWrapper.js';
21
+
20
22
  export interface CoreWebGlParameters {
21
23
  MAX_RENDERBUFFER_SIZE: number;
22
24
  MAX_TEXTURE_SIZE: number;
@@ -32,10 +34,10 @@ export interface CoreWebGlParameters {
32
34
 
33
35
  /**
34
36
  * Get device specific webgl parameters
35
- * @param gl
37
+ * @param glw
36
38
  */
37
39
  export function getWebGlParameters(
38
- gl: WebGLRenderingContext | WebGL2RenderingContext,
40
+ glw: WebGlContextWrapper,
39
41
  ): CoreWebGlParameters {
40
42
  const params: CoreWebGlParameters = {
41
43
  MAX_RENDERBUFFER_SIZE: 0,
@@ -55,7 +57,7 @@ export function getWebGlParameters(
55
57
  const keys = Object.keys(params) as Array<keyof CoreWebGlParameters>;
56
58
  keys.forEach((key) => {
57
59
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
58
- params[key] = gl.getParameter(gl[key]);
60
+ params[key] = glw.getParameter(glw[key]);
59
61
  });
60
62
 
61
63
  return params;
@@ -77,10 +79,10 @@ export interface CoreWebGlExtensions {
77
79
 
78
80
  /**
79
81
  * Get device webgl extensions
80
- * @param gl
82
+ * @param glw
81
83
  */
82
84
  export function getWebGlExtensions(
83
- gl: WebGLRenderingContext,
85
+ glw: WebGlContextWrapper,
84
86
  ): CoreWebGlExtensions {
85
87
  const extensions: CoreWebGlExtensions = {
86
88
  ANGLE_instanced_arrays: null,
@@ -98,7 +100,7 @@ export function getWebGlExtensions(
98
100
  const keys = Object.keys(extensions) as Array<keyof CoreWebGlExtensions>;
99
101
  keys.forEach((key) => {
100
102
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
101
- extensions[key] = gl.getExtension(key);
103
+ extensions[key] = glw.getExtension(key);
102
104
  });
103
105
 
104
106
  return extensions;
@@ -107,15 +109,11 @@ export function getWebGlExtensions(
107
109
  /**
108
110
  * Allocate big memory chunk that we
109
111
  * can re-use to draw quads
112
+ *
113
+ * @param glw
110
114
  * @param size
111
115
  */
112
- export function createIndexBuffer(
113
- gl: WebGLRenderingContext | WebGL2RenderingContext,
114
- size: number,
115
- ) {
116
- if (!gl) {
117
- throw new Error('No WebGL context');
118
- }
116
+ export function createIndexBuffer(glw: WebGlContextWrapper, size: number) {
119
117
  const maxQuads = ~~(size / 80);
120
118
  const indices = new Uint16Array(maxQuads * 6);
121
119
 
@@ -128,7 +126,6 @@ export function createIndexBuffer(
128
126
  indices[i + 5] = j + 3;
129
127
  }
130
128
 
131
- const buffer = gl.createBuffer();
132
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffer);
133
- gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);
129
+ const buffer = glw.createBuffer();
130
+ glw.elementArrayBufferData(buffer, indices, glw.STATIC_DRAW);
134
131
  }
@@ -17,6 +17,7 @@
17
17
  * limitations under the License.
18
18
  */
19
19
 
20
+ import type { WebGlContextWrapper } from '../../../lib/WebGlContextWrapper.js';
20
21
  import type { WebGlCoreRenderer } from '../WebGlCoreRenderer.js';
21
22
 
22
23
  //#region Types
@@ -93,43 +94,43 @@ export interface ShaderProgramSources {
93
94
  //#endregion Types
94
95
 
95
96
  export function createShader(
96
- gl: WebGLRenderingContext,
97
+ glw: WebGlContextWrapper,
97
98
  type: number,
98
99
  source: string,
99
100
  ) {
100
- const shader = gl.createShader(type);
101
+ const shader = glw.createShader(type);
101
102
  if (!shader) {
102
103
  throw new Error();
103
104
  }
104
- gl.shaderSource(shader, source);
105
- gl.compileShader(shader);
106
- const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
105
+ glw.shaderSource(shader, source);
106
+ glw.compileShader(shader);
107
+ const success = glw.getShaderParameter(shader, glw.COMPILE_STATUS);
107
108
  if (success) {
108
109
  return shader;
109
110
  }
110
111
 
111
- console.log(gl.getShaderInfoLog(shader));
112
- gl.deleteShader(shader);
112
+ console.log(glw.getShaderInfoLog(shader));
113
+ glw.deleteShader(shader);
113
114
  }
114
115
 
115
116
  export function createProgram(
116
- gl: WebGLRenderingContext,
117
+ glw: WebGlContextWrapper,
117
118
  vertexShader: WebGLShader,
118
119
  fragmentShader: WebGLShader,
119
120
  ) {
120
- const program = gl.createProgram();
121
+ const program = glw.createProgram();
121
122
  if (!program) {
122
123
  throw new Error();
123
124
  }
124
- gl.attachShader(program, vertexShader);
125
- gl.attachShader(program, fragmentShader);
126
- gl.linkProgram(program);
127
- const success = gl.getProgramParameter(program, gl.LINK_STATUS);
125
+ glw.attachShader(program, vertexShader);
126
+ glw.attachShader(program, fragmentShader);
127
+ glw.linkProgram(program);
128
+ const success = glw.getProgramParameter(program, glw.LINK_STATUS);
128
129
  if (success) {
129
130
  return program;
130
131
  }
131
132
 
132
- console.log(gl.getProgramInfoLog(program));
133
- gl.deleteProgram(program);
133
+ console.log(glw.getProgramInfoLog(program));
134
+ glw.deleteProgram(program);
134
135
  return undefined;
135
136
  }