@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.
- package/dist/src/common/CommonTypes.d.ts +8 -0
- package/dist/src/core/CoreNode.js +45 -16
- package/dist/src/core/CoreNode.js.map +1 -1
- package/dist/src/core/CoreTextNode.d.ts +10 -0
- package/dist/src/core/CoreTextNode.js +45 -0
- package/dist/src/core/CoreTextNode.js.map +1 -1
- package/dist/src/core/CoreTextureManager.d.ts +3 -1
- package/dist/src/core/CoreTextureManager.js +4 -1
- package/dist/src/core/CoreTextureManager.js.map +1 -1
- package/dist/src/core/Stage.d.ts +6 -0
- package/dist/src/core/Stage.js +12 -3
- package/dist/src/core/Stage.js.map +1 -1
- package/dist/src/core/lib/ImageWorker.d.ts +16 -0
- package/dist/src/core/lib/ImageWorker.js +111 -0
- package/dist/src/core/lib/ImageWorker.js.map +1 -0
- package/dist/src/core/lib/WebGlContextWrapper.d.ts +4 -0
- package/dist/src/core/lib/WebGlContextWrapper.js +7 -2
- package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +2 -1
- package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +2 -2
- package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +3 -2
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +23 -21
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +3 -2
- package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +9 -13
- package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +4 -1
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +25 -24
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +2 -1
- package/dist/src/core/renderers/webgl/WebGlCoreShader.js +24 -24
- package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/internal/RendererUtils.d.ts +8 -5
- package/dist/src/core/renderers/webgl/internal/RendererUtils.js +11 -13
- package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
- package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +3 -2
- package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +15 -15
- package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +3 -6
- package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +3 -3
- package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +1 -0
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +32 -12
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +3 -3
- package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/SdfShader.js +3 -3
- package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +14 -1
- package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +15 -5
- package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +1 -1
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +3 -3
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.d.ts +2 -1
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +4 -2
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +25 -0
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +1 -1
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +6 -6
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +3 -2
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +82 -50
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.d.ts +8 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.js +29 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +4 -3
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +15 -11
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +3 -2
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +30 -26
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.d.ts +19 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.js +84 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.d.ts +8 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.js +40 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.d.ts +2 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.js +41 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.d.ts +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.js +4 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.d.ts +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.js +2 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.d.ts +9 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.js +32 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +26 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js +70 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.d.ts +16 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js +39 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +50 -0
- package/dist/src/core/text-rendering/renderers/TextRenderer.js +19 -0
- package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
- package/dist/src/core/textures/ImageTexture.js +14 -9
- package/dist/src/core/textures/ImageTexture.js.map +1 -1
- package/dist/src/core/utils.d.ts +1 -6
- package/dist/src/core/utils.js +3 -2
- package/dist/src/core/utils.js.map +1 -1
- package/dist/src/main-api/ICoreDriver.d.ts +2 -1
- package/dist/src/main-api/RendererMain.d.ts +25 -0
- package/dist/src/main-api/RendererMain.js +14 -5
- package/dist/src/main-api/RendererMain.js.map +1 -1
- package/dist/src/render-drivers/main/MainCoreDriver.d.ts +2 -1
- package/dist/src/render-drivers/main/MainCoreDriver.js +6 -4
- package/dist/src/render-drivers/main/MainCoreDriver.js.map +1 -1
- package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +10 -0
- package/dist/src/render-drivers/main/MainOnlyTextNode.js +45 -0
- package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +1 -1
- package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +10 -0
- package/dist/src/render-drivers/threadx/TextNodeStruct.js +45 -0
- package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +1 -1
- package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +2 -1
- package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +8 -1
- package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +1 -1
- package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +5 -0
- package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +5 -0
- package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +1 -1
- package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +4 -1
- package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +1 -1
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +5 -0
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +10 -0
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +1 -1
- package/dist/src/render-drivers/threadx/worker/renderer.js +5 -3
- package/dist/src/render-drivers/threadx/worker/renderer.js.map +1 -1
- package/dist/src/utils.d.ts +2 -1
- package/dist/src/utils.js +22 -3
- package/dist/src/utils.js.map +1 -1
- package/dist/tsconfig.dist.tsbuildinfo +1 -1
- package/package.json +3 -2
- package/src/common/CommonTypes.ts +9 -0
- package/src/core/CoreNode.ts +67 -34
- package/src/core/CoreTextNode.ts +56 -0
- package/src/core/CoreTextureManager.ts +4 -2
- package/src/core/Stage.ts +32 -3
- package/src/core/lib/ContextSpy.ts +41 -0
- package/src/core/lib/ImageWorker.ts +124 -0
- package/src/core/lib/WebGlContextWrapper.ts +965 -0
- package/src/core/renderers/webgl/WebGlCoreCtxSubTexture.ts +3 -2
- package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +29 -28
- package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +10 -14
- package/src/core/renderers/webgl/WebGlCoreRenderer.ts +26 -24
- package/src/core/renderers/webgl/WebGlCoreShader.ts +34 -25
- package/src/core/renderers/webgl/internal/RendererUtils.ts +13 -16
- package/src/core/renderers/webgl/internal/ShaderUtils.ts +16 -15
- package/src/core/renderers/webgl/shaders/DefaultShader.ts +3 -7
- package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +3 -3
- package/src/core/renderers/webgl/shaders/DynamicShader.ts +42 -14
- package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +3 -3
- package/src/core/renderers/webgl/shaders/SdfShader.ts +3 -3
- package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +1 -1
- package/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.ts +35 -5
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +3 -3
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +9 -3
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +4 -2
- package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +25 -0
- package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +7 -7
- package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +115 -63
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +26 -18
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +40 -28
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +6 -1
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +205 -0
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/{makeRenderWindow.ts → setRenderWindow.ts} +50 -21
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +40 -0
- package/src/core/text-rendering/renderers/TextRenderer.ts +73 -0
- package/src/core/textures/ImageTexture.ts +17 -9
- package/src/core/utils.ts +87 -85
- package/src/env.d.ts +7 -0
- package/src/main-api/ICoreDriver.ts +2 -1
- package/src/main-api/RendererMain.ts +43 -5
- package/src/render-drivers/main/MainCoreDriver.ts +8 -5
- package/src/render-drivers/main/MainOnlyTextNode.ts +55 -1
- package/src/render-drivers/threadx/TextNodeStruct.ts +45 -0
- package/src/render-drivers/threadx/ThreadXCoreDriver.ts +10 -2
- package/src/render-drivers/threadx/ThreadXMainTextNode.ts +10 -0
- package/src/render-drivers/threadx/ThreadXRendererMessage.ts +5 -1
- package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +15 -0
- package/src/render-drivers/threadx/worker/renderer.ts +6 -4
- package/src/utils.ts +25 -4
- 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(
|
|
26
|
-
super(
|
|
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
|
|
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 {
|
|
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
|
-
|
|
107
|
+
glw.activeTexture(0);
|
|
108
|
+
glw.bindTexture(this._nativeCtxTexture);
|
|
108
109
|
|
|
109
110
|
// linear texture filtering
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
115
|
-
|
|
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
|
-
|
|
118
|
-
gl.texImage2D(
|
|
119
|
-
gl.TEXTURE_2D,
|
|
118
|
+
glw.texImage2D(
|
|
120
119
|
0,
|
|
121
|
-
|
|
120
|
+
glw.RGBA,
|
|
122
121
|
1,
|
|
123
122
|
1,
|
|
124
123
|
0,
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
143
|
+
glw.bindTexture(this._nativeCtxTexture);
|
|
144
144
|
|
|
145
|
-
|
|
146
|
-
|
|
145
|
+
glw.pixelStorei(
|
|
146
|
+
glw.UNPACK_PREMULTIPLY_ALPHA_WEBGL,
|
|
147
147
|
!!textureData.premultiplyAlpha,
|
|
148
148
|
);
|
|
149
149
|
|
|
150
|
-
|
|
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(
|
|
154
|
-
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
gl.TEXTURE_2D,
|
|
160
|
+
glw.bindTexture(this._nativeCtxTexture);
|
|
161
|
+
glw.texImage2D(
|
|
163
162
|
0,
|
|
164
|
-
|
|
163
|
+
glw.RGBA,
|
|
165
164
|
1,
|
|
166
165
|
1,
|
|
167
166
|
0,
|
|
168
|
-
|
|
169
|
-
|
|
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
|
|
198
|
+
const { glw } = this;
|
|
199
|
+
glw.deleteTexture(this._nativeCtxTexture);
|
|
200
200
|
this._nativeCtxTexture = null;
|
|
201
201
|
}
|
|
202
202
|
|
|
203
203
|
private createNativeCtxTexture() {
|
|
204
|
-
const
|
|
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
|
|
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
|
-
? (
|
|
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 {
|
|
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
|
-
|
|
99
|
-
|
|
94
|
+
glw.setScissorTest(true);
|
|
95
|
+
glw.scissor(clipX, clipY, clipWidth, clipHeight);
|
|
100
96
|
} else {
|
|
101
|
-
|
|
97
|
+
glw.setScissorTest(false);
|
|
102
98
|
}
|
|
103
99
|
|
|
104
|
-
|
|
105
|
-
|
|
100
|
+
glw.drawElements(
|
|
101
|
+
glw.TRIANGLES,
|
|
106
102
|
6 * this.numQuads,
|
|
107
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
124
|
-
|
|
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(
|
|
128
|
+
createIndexBuffer(glw, bufferMemory);
|
|
127
129
|
|
|
128
130
|
this.system = {
|
|
129
|
-
parameters: getWebGlParameters(
|
|
130
|
-
extensions: getWebGlExtensions(
|
|
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 =
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
183
|
-
|
|
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.
|
|
195
|
+
return new WebGlCoreCtxSubTexture(this.glw, textureSource);
|
|
193
196
|
}
|
|
194
|
-
return new WebGlCoreCtxTexture(this.
|
|
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.
|
|
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 {
|
|
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
|
-
|
|
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
|
|
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
|
|
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(
|
|
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 (!
|
|
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(
|
|
140
|
-
const fragmentShader = createShader(
|
|
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(
|
|
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 =
|
|
157
|
+
const vao = glw.createVertexArray();
|
|
153
158
|
if (!vao) {
|
|
154
159
|
throw new Error();
|
|
155
160
|
}
|
|
156
161
|
this.vao = vao;
|
|
157
162
|
|
|
158
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
209
|
+
const { glw } = this;
|
|
210
|
+
glw.enableVertexAttribArray(location);
|
|
208
211
|
|
|
209
|
-
|
|
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.
|
|
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 {
|
|
264
|
+
const { glw } = renderOp;
|
|
261
265
|
// Bind standard automatic uniforms
|
|
262
|
-
this.setUniform('u_resolution', [
|
|
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
|
-
// @
|
|
287
|
-
this.
|
|
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.
|
|
318
|
-
|
|
319
|
-
|
|
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
|
|
37
|
+
* @param glw
|
|
36
38
|
*/
|
|
37
39
|
export function getWebGlParameters(
|
|
38
|
-
|
|
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] =
|
|
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
|
|
82
|
+
* @param glw
|
|
81
83
|
*/
|
|
82
84
|
export function getWebGlExtensions(
|
|
83
|
-
|
|
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] =
|
|
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 =
|
|
132
|
-
|
|
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
|
-
|
|
97
|
+
glw: WebGlContextWrapper,
|
|
97
98
|
type: number,
|
|
98
99
|
source: string,
|
|
99
100
|
) {
|
|
100
|
-
const shader =
|
|
101
|
+
const shader = glw.createShader(type);
|
|
101
102
|
if (!shader) {
|
|
102
103
|
throw new Error();
|
|
103
104
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
const success =
|
|
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(
|
|
112
|
-
|
|
112
|
+
console.log(glw.getShaderInfoLog(shader));
|
|
113
|
+
glw.deleteShader(shader);
|
|
113
114
|
}
|
|
114
115
|
|
|
115
116
|
export function createProgram(
|
|
116
|
-
|
|
117
|
+
glw: WebGlContextWrapper,
|
|
117
118
|
vertexShader: WebGLShader,
|
|
118
119
|
fragmentShader: WebGLShader,
|
|
119
120
|
) {
|
|
120
|
-
const program =
|
|
121
|
+
const program = glw.createProgram();
|
|
121
122
|
if (!program) {
|
|
122
123
|
throw new Error();
|
|
123
124
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
const success =
|
|
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(
|
|
133
|
-
|
|
133
|
+
console.log(glw.getProgramInfoLog(program));
|
|
134
|
+
glw.deleteProgram(program);
|
|
134
135
|
return undefined;
|
|
135
136
|
}
|