@lightningjs/renderer 0.6.1 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/common/CommonTypes.d.ts +8 -0
- package/dist/src/core/CoreNode.d.ts +4 -7
- package/dist/src/core/CoreNode.js +73 -40
- package/dist/src/core/CoreNode.js.map +1 -1
- package/dist/src/core/CoreTextNode.d.ts +12 -2
- package/dist/src/core/CoreTextNode.js +46 -1
- 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 +13 -4
- package/dist/src/core/Stage.js.map +1 -1
- package/dist/src/core/animations/CoreAnimation.d.ts +1 -0
- package/dist/src/core/animations/CoreAnimation.js +7 -0
- package/dist/src/core/animations/CoreAnimation.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/lib/utils.d.ts +9 -0
- package/dist/src/core/lib/utils.js +48 -1
- package/dist/src/core/lib/utils.js.map +1 -1
- package/dist/src/core/renderers/CoreRenderer.d.ts +2 -2
- 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 +5 -4
- package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +10 -14
- 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 +30 -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.d.ts +2 -2
- 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 +8 -11
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +140 -81
- 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 +52 -2
- 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 +96 -62
- package/src/core/CoreTextNode.ts +58 -2
- package/src/core/CoreTextureManager.ts +4 -2
- package/src/core/Stage.ts +33 -4
- package/src/core/animations/CoreAnimation.ts +8 -0
- 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/lib/utils.ts +68 -1
- package/src/core/renderers/CoreRenderer.ts +2 -2
- 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 +13 -17
- package/src/core/renderers/webgl/WebGlCoreRenderer.ts +33 -25
- 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 +27 -1
- package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +7 -7
- package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +193 -103
- 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 +75 -2
- 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
package/src/core/lib/utils.ts
CHANGED
|
@@ -81,6 +81,10 @@ export interface Rect {
|
|
|
81
81
|
height: number;
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
+
export interface RectWithValid extends Rect {
|
|
85
|
+
valid: boolean;
|
|
86
|
+
}
|
|
87
|
+
|
|
84
88
|
export interface Bound {
|
|
85
89
|
x1: number;
|
|
86
90
|
y1: number;
|
|
@@ -132,12 +136,50 @@ export function intersectBound<T extends Bound = Bound>(
|
|
|
132
136
|
return createBound(0, 0, 0, 0, intersection);
|
|
133
137
|
}
|
|
134
138
|
|
|
135
|
-
export function
|
|
139
|
+
export function boundsOverlap(a: Bound, b: Bound): boolean {
|
|
140
|
+
return a.x1 < b.x2 && a.x2 > b.x1 && a.y1 < b.y2 && a.y2 > b.y1;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export function convertBoundToRect(bound: Bound): Rect;
|
|
144
|
+
export function convertBoundToRect<T extends Rect = Rect>(
|
|
145
|
+
bound: Bound,
|
|
146
|
+
out: T,
|
|
147
|
+
): T;
|
|
148
|
+
export function convertBoundToRect(bound: Bound, out?: Rect): Rect {
|
|
149
|
+
if (out) {
|
|
150
|
+
out.x = bound.x1;
|
|
151
|
+
out.y = bound.y1;
|
|
152
|
+
out.width = bound.x2 - bound.x1;
|
|
153
|
+
out.height = bound.y2 - bound.y1;
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
x: bound.x1,
|
|
158
|
+
y: bound.y1,
|
|
159
|
+
width: bound.x2 - bound.x1,
|
|
160
|
+
height: bound.y2 - bound.y1,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export function intersectRect(a: Rect, b: Rect): Rect;
|
|
165
|
+
export function intersectRect<T extends Rect = Rect>(
|
|
166
|
+
a: Rect,
|
|
167
|
+
b: Rect,
|
|
168
|
+
out: T,
|
|
169
|
+
): T;
|
|
170
|
+
export function intersectRect(a: Rect, b: Rect, out?: Rect): Rect {
|
|
136
171
|
const x = Math.max(a.x, b.x);
|
|
137
172
|
const y = Math.max(a.y, b.y);
|
|
138
173
|
const width = Math.min(a.x + a.width, b.x + b.width) - x;
|
|
139
174
|
const height = Math.min(a.y + a.height, b.y + b.height) - y;
|
|
140
175
|
if (width > 0 && height > 0) {
|
|
176
|
+
if (out) {
|
|
177
|
+
out.x = x;
|
|
178
|
+
out.y = y;
|
|
179
|
+
out.width = width;
|
|
180
|
+
out.height = height;
|
|
181
|
+
return out;
|
|
182
|
+
}
|
|
141
183
|
return {
|
|
142
184
|
x,
|
|
143
185
|
y,
|
|
@@ -145,6 +187,13 @@ export function intersectRect(a: Rect, b: Rect): Rect {
|
|
|
145
187
|
height,
|
|
146
188
|
};
|
|
147
189
|
}
|
|
190
|
+
if (out) {
|
|
191
|
+
out.x = 0;
|
|
192
|
+
out.y = 0;
|
|
193
|
+
out.width = 0;
|
|
194
|
+
out.height = 0;
|
|
195
|
+
return out;
|
|
196
|
+
}
|
|
148
197
|
return {
|
|
149
198
|
x: 0,
|
|
150
199
|
y: 0,
|
|
@@ -153,6 +202,24 @@ export function intersectRect(a: Rect, b: Rect): Rect {
|
|
|
153
202
|
};
|
|
154
203
|
}
|
|
155
204
|
|
|
205
|
+
export function copyRect(a: Rect): Rect;
|
|
206
|
+
export function copyRect<T extends Rect = Rect>(a: Rect, out: T): T;
|
|
207
|
+
export function copyRect(a: Rect, out?: Rect): Rect {
|
|
208
|
+
if (out) {
|
|
209
|
+
out.x = a.x;
|
|
210
|
+
out.y = a.y;
|
|
211
|
+
out.width = a.width;
|
|
212
|
+
out.height = a.height;
|
|
213
|
+
return out;
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
x: a.x,
|
|
217
|
+
y: a.y,
|
|
218
|
+
width: a.width,
|
|
219
|
+
height: a.height,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
|
|
156
223
|
export function compareRect(a: Rect | null, b: Rect | null): boolean {
|
|
157
224
|
if (a === b) {
|
|
158
225
|
return true;
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
import type { CoreShaderManager } from '../CoreShaderManager.js';
|
|
21
21
|
import type { TextureOptions } from '../CoreTextureManager.js';
|
|
22
22
|
import type { Stage } from '../Stage.js';
|
|
23
|
-
import type { Rect } from '../lib/utils.js';
|
|
23
|
+
import type { Rect, RectWithValid } from '../lib/utils.js';
|
|
24
24
|
import type { Texture } from '../textures/Texture.js';
|
|
25
25
|
import { CoreContextTexture } from './CoreContextTexture.js';
|
|
26
26
|
import type { CoreRenderOp } from './CoreRenderOp.js';
|
|
@@ -39,7 +39,7 @@ export interface QuadOptions {
|
|
|
39
39
|
shader: CoreShader | null;
|
|
40
40
|
shaderProps: Record<string, unknown> | null;
|
|
41
41
|
alpha: number;
|
|
42
|
-
clippingRect:
|
|
42
|
+
clippingRect: RectWithValid;
|
|
43
43
|
tx: number;
|
|
44
44
|
ty: number;
|
|
45
45
|
ta: number;
|
|
@@ -18,12 +18,13 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
import type { Dimensions } from '../../../common/CommonTypes.js';
|
|
21
|
+
import type { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
|
|
21
22
|
import type { SubTexture } from '../../textures/SubTexture.js';
|
|
22
23
|
import { WebGlCoreCtxTexture } from './WebGlCoreCtxTexture.js';
|
|
23
24
|
|
|
24
25
|
export class WebGlCoreCtxSubTexture extends WebGlCoreCtxTexture {
|
|
25
|
-
constructor(
|
|
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
|
}
|
|
@@ -23,7 +23,8 @@ import type { WebGlCoreCtxTexture } from './WebGlCoreCtxTexture.js';
|
|
|
23
23
|
import type { WebGlCoreRendererOptions } from './WebGlCoreRenderer.js';
|
|
24
24
|
import type { BufferCollection } from './internal/BufferCollection.js';
|
|
25
25
|
import type { Dimensions } from '../../../common/CommonTypes.js';
|
|
26
|
-
import type { Rect } from '../../lib/utils.js';
|
|
26
|
+
import type { Rect, RectWithValid } from '../../lib/utils.js';
|
|
27
|
+
import type { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
|
|
27
28
|
|
|
28
29
|
const MAX_TEXTURES = 8; // TODO: get from gl
|
|
29
30
|
|
|
@@ -38,21 +39,20 @@ export class WebGlCoreRenderOp extends CoreRenderOp {
|
|
|
38
39
|
readonly maxTextures: number;
|
|
39
40
|
|
|
40
41
|
constructor(
|
|
41
|
-
readonly
|
|
42
|
+
readonly glw: WebGlContextWrapper,
|
|
42
43
|
readonly options: WebGlCoreRendererOptions,
|
|
43
44
|
readonly buffers: BufferCollection,
|
|
44
45
|
readonly shader: WebGlCoreShader,
|
|
45
46
|
readonly shaderProps: Record<string, unknown>,
|
|
46
47
|
readonly alpha: number,
|
|
47
|
-
readonly clippingRect:
|
|
48
|
+
readonly clippingRect: RectWithValid,
|
|
48
49
|
readonly dimensions: Dimensions,
|
|
49
50
|
readonly bufferIdx: number,
|
|
50
51
|
readonly zIndex: number,
|
|
51
52
|
) {
|
|
52
53
|
super();
|
|
53
|
-
this.gl = gl;
|
|
54
54
|
this.maxTextures = shader.supportsIndexedTextures
|
|
55
|
-
? (
|
|
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,12 +81,8 @@ export class WebGlCoreRenderOp extends CoreRenderOp {
|
|
|
81
81
|
// TODO: Reduce calculations required
|
|
82
82
|
const quadIdx = (this.bufferIdx / 24) * 6 * 2;
|
|
83
83
|
|
|
84
|
-
// TODO: Move these somewhere else?
|
|
85
|
-
gl.enable(gl.BLEND);
|
|
86
|
-
gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
|
|
87
|
-
|
|
88
84
|
// Clipping
|
|
89
|
-
if (this.clippingRect) {
|
|
85
|
+
if (this.clippingRect.valid) {
|
|
90
86
|
const { x, y, width, height } = this.clippingRect;
|
|
91
87
|
const pixelRatio = options.pixelRatio;
|
|
92
88
|
const canvasHeight = options.canvas.height;
|
|
@@ -95,16 +91,16 @@ export class WebGlCoreRenderOp extends CoreRenderOp {
|
|
|
95
91
|
const clipWidth = Math.round(width * pixelRatio);
|
|
96
92
|
const clipHeight = Math.round(height * pixelRatio);
|
|
97
93
|
const clipY = Math.round(canvasHeight - clipHeight - y * pixelRatio);
|
|
98
|
-
|
|
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
|
}
|
|
@@ -50,10 +50,13 @@ import {
|
|
|
50
50
|
compareRect,
|
|
51
51
|
getNormalizedRgbaComponents,
|
|
52
52
|
type Rect,
|
|
53
|
+
type RectWithValid,
|
|
53
54
|
} from '../../lib/utils.js';
|
|
54
55
|
import type { Dimensions } from '../../../common/CommonTypes.js';
|
|
55
56
|
import { WebGlCoreShader } from './WebGlCoreShader.js';
|
|
56
57
|
import { RoundedRectangle } from './shaders/RoundedRectangle.js';
|
|
58
|
+
import { ContextSpy } from '../../lib/ContextSpy.js';
|
|
59
|
+
import { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
|
|
57
60
|
|
|
58
61
|
const WORDS_PER_QUAD = 24;
|
|
59
62
|
const BYTES_PER_QUAD = WORDS_PER_QUAD * 4;
|
|
@@ -66,6 +69,7 @@ export interface WebGlCoreRendererOptions {
|
|
|
66
69
|
shManager: CoreShaderManager;
|
|
67
70
|
clearColor: number;
|
|
68
71
|
bufferMemory: number;
|
|
72
|
+
contextSpy: ContextSpy | null;
|
|
69
73
|
}
|
|
70
74
|
|
|
71
75
|
interface CoreWebGlSystem {
|
|
@@ -75,7 +79,7 @@ interface CoreWebGlSystem {
|
|
|
75
79
|
|
|
76
80
|
export class WebGlCoreRenderer extends CoreRenderer {
|
|
77
81
|
//// WebGL Native Context and Data
|
|
78
|
-
|
|
82
|
+
glw: WebGlContextWrapper;
|
|
79
83
|
system: CoreWebGlSystem;
|
|
80
84
|
|
|
81
85
|
//// Core Managers
|
|
@@ -112,26 +116,30 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
112
116
|
this.txManager = options.txManager;
|
|
113
117
|
this.shManager = options.shManager;
|
|
114
118
|
this.defaultTexture = new ColorTexture(this.txManager);
|
|
119
|
+
// When the default texture is loaded, request a render in case the
|
|
120
|
+
// RAF is paused. Fixes: https://github.com/lightning-js/renderer/issues/123
|
|
121
|
+
this.defaultTexture.once('loaded', () => {
|
|
122
|
+
this.stage.requestRender();
|
|
123
|
+
});
|
|
115
124
|
|
|
116
|
-
const gl = createWebGLContext(canvas);
|
|
117
|
-
|
|
118
|
-
throw new Error('Unable to create WebGL context');
|
|
119
|
-
}
|
|
120
|
-
this.gl = gl;
|
|
125
|
+
const gl = createWebGLContext(canvas, options.contextSpy);
|
|
126
|
+
const glw = (this.glw = new WebGlContextWrapper(gl));
|
|
121
127
|
|
|
122
128
|
const color = getNormalizedRgbaComponents(clearColor);
|
|
123
|
-
|
|
124
|
-
|
|
129
|
+
glw.viewport(0, 0, canvas.width, canvas.height);
|
|
130
|
+
glw.clearColor(color[0]!, color[1]!, color[2]!, color[3]!);
|
|
131
|
+
glw.setBlend(true);
|
|
132
|
+
glw.blendFunc(glw.ONE, glw.ONE_MINUS_SRC_ALPHA);
|
|
125
133
|
|
|
126
|
-
createIndexBuffer(
|
|
134
|
+
createIndexBuffer(glw, bufferMemory);
|
|
127
135
|
|
|
128
136
|
this.system = {
|
|
129
|
-
parameters: getWebGlParameters(
|
|
130
|
-
extensions: getWebGlExtensions(
|
|
137
|
+
parameters: getWebGlParameters(this.glw),
|
|
138
|
+
extensions: getWebGlExtensions(this.glw),
|
|
131
139
|
};
|
|
132
140
|
this.shManager.renderer = this;
|
|
133
141
|
this.defaultShader = this.shManager.loadShader('DefaultShader').shader;
|
|
134
|
-
const quadBuffer =
|
|
142
|
+
const quadBuffer = glw.createBuffer();
|
|
135
143
|
assertTruthy(quadBuffer);
|
|
136
144
|
const stride = 6 * Float32Array.BYTES_PER_ELEMENT;
|
|
137
145
|
this.quadBufferCollection = new BufferCollection([
|
|
@@ -141,7 +149,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
141
149
|
a_position: {
|
|
142
150
|
name: 'a_position',
|
|
143
151
|
size: 2, // 2 components per iteration
|
|
144
|
-
type:
|
|
152
|
+
type: glw.FLOAT, // the data is 32bit floats
|
|
145
153
|
normalized: false, // don't normalize the data
|
|
146
154
|
stride, // 0 = move forward size * sizeof(type) each iteration to get the next position
|
|
147
155
|
offset: 0, // start at the beginning of the buffer
|
|
@@ -149,7 +157,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
149
157
|
a_textureCoordinate: {
|
|
150
158
|
name: 'a_textureCoordinate',
|
|
151
159
|
size: 2,
|
|
152
|
-
type:
|
|
160
|
+
type: glw.FLOAT,
|
|
153
161
|
normalized: false,
|
|
154
162
|
stride,
|
|
155
163
|
offset: 2 * Float32Array.BYTES_PER_ELEMENT,
|
|
@@ -157,7 +165,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
157
165
|
a_color: {
|
|
158
166
|
name: 'a_color',
|
|
159
167
|
size: 4,
|
|
160
|
-
type:
|
|
168
|
+
type: glw.UNSIGNED_BYTE,
|
|
161
169
|
normalized: true,
|
|
162
170
|
stride,
|
|
163
171
|
offset: 4 * Float32Array.BYTES_PER_ELEMENT,
|
|
@@ -165,7 +173,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
165
173
|
a_textureIndex: {
|
|
166
174
|
name: 'a_textureIndex',
|
|
167
175
|
size: 1,
|
|
168
|
-
type:
|
|
176
|
+
type: glw.FLOAT,
|
|
169
177
|
normalized: false,
|
|
170
178
|
stride,
|
|
171
179
|
offset: 5 * Float32Array.BYTES_PER_ELEMENT,
|
|
@@ -176,11 +184,12 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
176
184
|
}
|
|
177
185
|
|
|
178
186
|
reset() {
|
|
187
|
+
const { glw } = this;
|
|
179
188
|
this.curBufferIdx = 0;
|
|
180
189
|
this.curRenderOp = null;
|
|
181
190
|
this.renderOps.length = 0;
|
|
182
|
-
|
|
183
|
-
|
|
191
|
+
glw.setScissorTest(false);
|
|
192
|
+
glw.clear();
|
|
184
193
|
}
|
|
185
194
|
|
|
186
195
|
override getShaderManager(): CoreShaderManager {
|
|
@@ -189,9 +198,9 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
189
198
|
|
|
190
199
|
override createCtxTexture(textureSource: Texture): CoreContextTexture {
|
|
191
200
|
if (textureSource instanceof SubTexture) {
|
|
192
|
-
return new WebGlCoreCtxSubTexture(this.
|
|
201
|
+
return new WebGlCoreCtxSubTexture(this.glw, textureSource);
|
|
193
202
|
}
|
|
194
|
-
return new WebGlCoreCtxTexture(this.
|
|
203
|
+
return new WebGlCoreCtxTexture(this.glw, textureSource);
|
|
195
204
|
}
|
|
196
205
|
|
|
197
206
|
/**
|
|
@@ -409,11 +418,11 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
409
418
|
shaderProps: Record<string, unknown>,
|
|
410
419
|
alpha: number,
|
|
411
420
|
dimensions: Dimensions,
|
|
412
|
-
clippingRect:
|
|
421
|
+
clippingRect: RectWithValid,
|
|
413
422
|
bufferIdx: number,
|
|
414
423
|
) {
|
|
415
424
|
const curRenderOp = new WebGlCoreRenderOp(
|
|
416
|
-
this.
|
|
425
|
+
this.glw,
|
|
417
426
|
this.options,
|
|
418
427
|
this.quadBufferCollection,
|
|
419
428
|
shader,
|
|
@@ -485,13 +494,12 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
485
494
|
* @param surface
|
|
486
495
|
*/
|
|
487
496
|
render(surface: 'screen' | CoreContextTexture = 'screen'): void {
|
|
488
|
-
const {
|
|
497
|
+
const { glw, quadBuffer } = this;
|
|
489
498
|
|
|
490
499
|
const arr = new Float32Array(quadBuffer, 0, this.curBufferIdx);
|
|
491
500
|
|
|
492
501
|
const buffer = this.quadBufferCollection.getBuffer('a_position') ?? null;
|
|
493
|
-
|
|
494
|
-
gl.bufferData(gl.ARRAY_BUFFER, arr, gl.DYNAMIC_DRAW);
|
|
502
|
+
glw.arrayBufferData(buffer, arr, glw.STATIC_DRAW);
|
|
495
503
|
|
|
496
504
|
const doLog = false; // idx++ % 100 === 0;
|
|
497
505
|
if (doLog) {
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
import type { Dimensions } from '../../../common/CommonTypes.js';
|
|
21
21
|
import { assertTruthy, hasOwn } from '../../../utils.js';
|
|
22
|
+
import type { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
|
|
22
23
|
import { CoreShader } from '../CoreShader.js';
|
|
23
24
|
import type { WebGlCoreCtxTexture } from './WebGlCoreCtxTexture.js';
|
|
24
25
|
import type { WebGlCoreRenderOp } from './WebGlCoreRenderOp.js';
|
|
@@ -76,7 +77,7 @@ export abstract class WebGlCoreShader extends CoreShader {
|
|
|
76
77
|
*/
|
|
77
78
|
protected vao: WebGLVertexArrayObject | undefined;
|
|
78
79
|
protected renderer: WebGlCoreRenderer;
|
|
79
|
-
protected
|
|
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
|
|