@lightningjs/renderer 0.6.0 → 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/README.md +1 -1
- package/dist/src/common/CommonTypes.d.ts +8 -0
- package/dist/src/core/CoreNode.d.ts +63 -15
- package/dist/src/core/CoreNode.js +266 -117
- package/dist/src/core/CoreNode.js.map +1 -1
- package/dist/src/core/CoreTextNode.d.ts +11 -0
- package/dist/src/core/CoreTextNode.js +58 -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 +12 -2
- package/dist/src/core/Stage.js +36 -24
- package/dist/src/core/Stage.js.map +1 -1
- package/dist/src/core/animations/CoreAnimation.js +11 -2
- package/dist/src/core/animations/CoreAnimation.js.map +1 -1
- package/dist/src/core/lib/ContextSpy.d.ts +12 -0
- package/dist/src/core/lib/ContextSpy.js +38 -0
- package/dist/src/core/lib/ContextSpy.js.map +1 -0
- 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/WebGlContext.d.ts +414 -0
- package/dist/src/core/lib/WebGlContext.js +640 -0
- package/dist/src/core/lib/WebGlContext.js.map +1 -0
- package/dist/src/core/lib/WebGlContextWrapper.d.ts +500 -0
- package/dist/src/core/lib/WebGlContextWrapper.js +784 -0
- package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -0
- package/dist/src/core/platform.js +4 -0
- package/dist/src/core/platform.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 +33 -31
- 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 +7 -8
- 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 +40 -13
- 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 +325 -148
- package/src/core/CoreTextNode.ts +72 -0
- package/src/core/CoreTextureManager.ts +4 -2
- package/src/core/Stage.ts +60 -34
- package/src/core/animations/CoreAnimation.ts +11 -2
- 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/platform.ts +5 -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 +34 -63
- 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 +7 -8
- 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 +44 -15
- 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/scene/Scene.ts +0 -120
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.test.ts +0 -136
package/src/core/platform.ts
CHANGED
|
@@ -26,6 +26,11 @@ export const startLoop = (stage: Stage) => {
|
|
|
26
26
|
const runLoop = () => {
|
|
27
27
|
stage.updateAnimations();
|
|
28
28
|
|
|
29
|
+
if (!stage.hasSceneUpdates()) {
|
|
30
|
+
setTimeout(runLoop, 16.666666666666668);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
29
34
|
stage.drawFrame();
|
|
30
35
|
requestAnimationFrame(runLoop);
|
|
31
36
|
};
|
|
@@ -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,10 +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
|
-
|
|
185
|
+
glw.setScissorTest(false);
|
|
186
|
+
glw.clear();
|
|
183
187
|
}
|
|
184
188
|
|
|
185
189
|
override getShaderManager(): CoreShaderManager {
|
|
@@ -188,9 +192,9 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
188
192
|
|
|
189
193
|
override createCtxTexture(textureSource: Texture): CoreContextTexture {
|
|
190
194
|
if (textureSource instanceof SubTexture) {
|
|
191
|
-
return new WebGlCoreCtxSubTexture(this.
|
|
195
|
+
return new WebGlCoreCtxSubTexture(this.glw, textureSource);
|
|
192
196
|
}
|
|
193
|
-
return new WebGlCoreCtxTexture(this.
|
|
197
|
+
return new WebGlCoreCtxTexture(this.glw, textureSource);
|
|
194
198
|
}
|
|
195
199
|
|
|
196
200
|
/**
|
|
@@ -325,11 +329,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
325
329
|
fQuadBuffer[bufferIdx++] = ty; // vertexY
|
|
326
330
|
fQuadBuffer[bufferIdx++] = texCoordX1; // texCoordX
|
|
327
331
|
fQuadBuffer[bufferIdx++] = texCoordY1; // texCoordY
|
|
328
|
-
uiQuadBuffer[bufferIdx++] =
|
|
329
|
-
colorTl,
|
|
330
|
-
alpha,
|
|
331
|
-
true,
|
|
332
|
-
); // color
|
|
332
|
+
uiQuadBuffer[bufferIdx++] = colorTl; // color
|
|
333
333
|
fQuadBuffer[bufferIdx++] = textureIdx; // texIndex
|
|
334
334
|
|
|
335
335
|
// Upper-Right
|
|
@@ -337,11 +337,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
337
337
|
fQuadBuffer[bufferIdx++] = ty + width * tc;
|
|
338
338
|
fQuadBuffer[bufferIdx++] = texCoordX2;
|
|
339
339
|
fQuadBuffer[bufferIdx++] = texCoordY1;
|
|
340
|
-
uiQuadBuffer[bufferIdx++] =
|
|
341
|
-
colorTr,
|
|
342
|
-
alpha,
|
|
343
|
-
true,
|
|
344
|
-
);
|
|
340
|
+
uiQuadBuffer[bufferIdx++] = colorTr;
|
|
345
341
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
346
342
|
|
|
347
343
|
// Lower-Left
|
|
@@ -349,11 +345,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
349
345
|
fQuadBuffer[bufferIdx++] = ty + height * td;
|
|
350
346
|
fQuadBuffer[bufferIdx++] = texCoordX1;
|
|
351
347
|
fQuadBuffer[bufferIdx++] = texCoordY2;
|
|
352
|
-
uiQuadBuffer[bufferIdx++] =
|
|
353
|
-
colorBl,
|
|
354
|
-
alpha,
|
|
355
|
-
true,
|
|
356
|
-
);
|
|
348
|
+
uiQuadBuffer[bufferIdx++] = colorBl;
|
|
357
349
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
358
350
|
|
|
359
351
|
// Lower-Right
|
|
@@ -361,11 +353,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
361
353
|
fQuadBuffer[bufferIdx++] = ty + width * tc + height * td;
|
|
362
354
|
fQuadBuffer[bufferIdx++] = texCoordX2;
|
|
363
355
|
fQuadBuffer[bufferIdx++] = texCoordY2;
|
|
364
|
-
uiQuadBuffer[bufferIdx++] =
|
|
365
|
-
colorBr,
|
|
366
|
-
alpha,
|
|
367
|
-
true,
|
|
368
|
-
);
|
|
356
|
+
uiQuadBuffer[bufferIdx++] = colorBr;
|
|
369
357
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
370
358
|
} else {
|
|
371
359
|
// Calculate the right corner of the quad
|
|
@@ -378,11 +366,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
378
366
|
fQuadBuffer[bufferIdx++] = ty; // vertexY
|
|
379
367
|
fQuadBuffer[bufferIdx++] = texCoordX1; // texCoordX
|
|
380
368
|
fQuadBuffer[bufferIdx++] = texCoordY1; // texCoordY
|
|
381
|
-
uiQuadBuffer[bufferIdx++] =
|
|
382
|
-
colorTl,
|
|
383
|
-
alpha,
|
|
384
|
-
true,
|
|
385
|
-
); // color
|
|
369
|
+
uiQuadBuffer[bufferIdx++] = colorTl; // color
|
|
386
370
|
fQuadBuffer[bufferIdx++] = textureIdx; // texIndex
|
|
387
371
|
|
|
388
372
|
// Upper-Right
|
|
@@ -390,11 +374,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
390
374
|
fQuadBuffer[bufferIdx++] = ty;
|
|
391
375
|
fQuadBuffer[bufferIdx++] = texCoordX2;
|
|
392
376
|
fQuadBuffer[bufferIdx++] = texCoordY1;
|
|
393
|
-
uiQuadBuffer[bufferIdx++] =
|
|
394
|
-
colorTr,
|
|
395
|
-
alpha,
|
|
396
|
-
true,
|
|
397
|
-
);
|
|
377
|
+
uiQuadBuffer[bufferIdx++] = colorTr;
|
|
398
378
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
399
379
|
|
|
400
380
|
// Lower-Left
|
|
@@ -402,11 +382,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
402
382
|
fQuadBuffer[bufferIdx++] = rightCornerY;
|
|
403
383
|
fQuadBuffer[bufferIdx++] = texCoordX1;
|
|
404
384
|
fQuadBuffer[bufferIdx++] = texCoordY2;
|
|
405
|
-
uiQuadBuffer[bufferIdx++] =
|
|
406
|
-
colorBl,
|
|
407
|
-
alpha,
|
|
408
|
-
true,
|
|
409
|
-
);
|
|
385
|
+
uiQuadBuffer[bufferIdx++] = colorBl;
|
|
410
386
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
411
387
|
|
|
412
388
|
// Lower-Right
|
|
@@ -414,11 +390,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
414
390
|
fQuadBuffer[bufferIdx++] = rightCornerY;
|
|
415
391
|
fQuadBuffer[bufferIdx++] = texCoordX2;
|
|
416
392
|
fQuadBuffer[bufferIdx++] = texCoordY2;
|
|
417
|
-
uiQuadBuffer[bufferIdx++] =
|
|
418
|
-
colorBr,
|
|
419
|
-
alpha,
|
|
420
|
-
true,
|
|
421
|
-
);
|
|
393
|
+
uiQuadBuffer[bufferIdx++] = colorBr;
|
|
422
394
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
423
395
|
}
|
|
424
396
|
|
|
@@ -444,7 +416,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
444
416
|
bufferIdx: number,
|
|
445
417
|
) {
|
|
446
418
|
const curRenderOp = new WebGlCoreRenderOp(
|
|
447
|
-
this.
|
|
419
|
+
this.glw,
|
|
448
420
|
this.options,
|
|
449
421
|
this.quadBufferCollection,
|
|
450
422
|
shader,
|
|
@@ -516,13 +488,12 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
516
488
|
* @param surface
|
|
517
489
|
*/
|
|
518
490
|
render(surface: 'screen' | CoreContextTexture = 'screen'): void {
|
|
519
|
-
const {
|
|
491
|
+
const { glw, quadBuffer } = this;
|
|
520
492
|
|
|
521
493
|
const arr = new Float32Array(quadBuffer, 0, this.curBufferIdx);
|
|
522
494
|
|
|
523
495
|
const buffer = this.quadBufferCollection.getBuffer('a_position') ?? null;
|
|
524
|
-
|
|
525
|
-
gl.bufferData(gl.ARRAY_BUFFER, arr, gl.DYNAMIC_DRAW);
|
|
496
|
+
glw.arrayBufferData(buffer, arr, glw.STATIC_DRAW);
|
|
526
497
|
|
|
527
498
|
const doLog = false; // idx++ % 100 === 0;
|
|
528
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
|
|