@lightningjs/renderer 3.0.4 → 3.0.5
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/EventEmitter.d.ts +7 -4
- package/dist/src/common/EventEmitter.js +1 -1
- package/dist/src/common/EventEmitter.js.map +1 -1
- package/dist/src/core/AutosizeManager.d.ts +29 -0
- package/dist/src/core/AutosizeManager.js +169 -0
- package/dist/src/core/AutosizeManager.js.map +1 -0
- package/dist/src/core/CoreTextNodeCanvas.d.ts +215 -0
- package/dist/src/core/CoreTextNodeCanvas.js +236 -0
- package/dist/src/core/CoreTextNodeCanvas.js.map +1 -0
- package/dist/src/core/Stage.js +10 -0
- package/dist/src/core/Stage.js.map +1 -1
- package/dist/src/core/TextureMemoryManager.js +4 -3
- package/dist/src/core/TextureMemoryManager.js.map +1 -1
- package/dist/src/core/animations/Animation.d.ts +21 -0
- package/dist/src/core/animations/Animation.js +194 -0
- package/dist/src/core/animations/Animation.js.map +1 -0
- package/dist/src/core/animations/AnimationManager.d.ts +1 -1
- package/dist/src/core/animations/AnimationManager.js +5 -5
- package/dist/src/core/animations/AnimationManager.js.map +1 -1
- package/dist/src/core/animations/CoreAnimation.d.ts +11 -2
- package/dist/src/core/animations/CoreAnimation.js +44 -38
- package/dist/src/core/animations/CoreAnimation.js.map +1 -1
- package/dist/src/core/animations/CoreAnimationController.d.ts +6 -0
- package/dist/src/core/animations/CoreAnimationController.js +16 -3
- package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
- package/dist/src/core/animations/Playback.d.ts +64 -0
- package/dist/src/core/animations/Playback.js +169 -0
- package/dist/src/core/animations/Playback.js.map +1 -0
- package/dist/src/core/animations/Ticker.d.ts +71 -0
- package/dist/src/core/animations/Ticker.js +89 -0
- package/dist/src/core/animations/Ticker.js.map +1 -0
- package/dist/src/core/animations/Transition.d.ts +38 -0
- package/dist/src/core/animations/Transition.js +35 -0
- package/dist/src/core/animations/Transition.js.map +1 -0
- package/dist/src/core/animations/TransitionsController.d.ts +10 -0
- package/dist/src/core/animations/TransitionsController.js +39 -0
- package/dist/src/core/animations/TransitionsController.js.map +1 -0
- package/dist/src/core/animations/utils.d.ts +2 -0
- package/dist/src/core/animations/utils.js +136 -0
- package/dist/src/core/animations/utils.js.map +1 -0
- package/dist/src/core/lib/ImageWorker.d.ts +2 -2
- package/dist/src/core/lib/ImageWorker.js +11 -30
- package/dist/src/core/lib/ImageWorker.js.map +1 -1
- package/dist/src/core/lib/WebGlContextWrapper.d.ts +5 -16
- package/dist/src/core/lib/WebGlContextWrapper.js +1 -35
- package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
- package/dist/src/core/lib/textureCompression.d.ts +2 -14
- package/dist/src/core/lib/textureCompression.js +67 -320
- package/dist/src/core/lib/textureCompression.js.map +1 -1
- package/dist/src/core/platform.js +9 -38
- package/dist/src/core/platform.js.map +1 -1
- package/dist/src/core/renderers/canvas/CanvasCoreRenderer.d.ts +0 -1
- package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js +3 -11
- package/dist/src/core/renderers/canvas/CanvasCoreRenderer.js.map +1 -1
- package/dist/src/core/renderers/canvas/CanvasCoreTexture.d.ts +1 -2
- package/dist/src/core/renderers/canvas/CanvasCoreTexture.js +11 -16
- package/dist/src/core/renderers/canvas/CanvasCoreTexture.js.map +1 -1
- package/dist/src/core/renderers/canvas/CanvasRenderer.js +14 -1
- package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
- package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +1 -1
- package/dist/src/core/renderers/canvas/CanvasTexture.js +16 -6
- package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
- package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +0 -13
- package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +192 -113
- package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +1 -1
- package/dist/src/core/renderers/canvas/internal/ColorUtils.d.ts +2 -0
- package/dist/src/core/renderers/canvas/internal/ColorUtils.js +14 -0
- package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.d.ts +1 -2
- package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js +5 -12
- package/dist/src/core/renderers/webgl/WebGlCoreCtxRenderTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +6 -18
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +60 -102
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +1 -3
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +31 -74
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +7 -2
- package/dist/src/core/renderers/webgl/WebGlCoreShader.js +50 -21
- package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +2 -3
- package/dist/src/core/renderers/webgl/WebGlRenderOp.js +1 -3
- package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +1 -0
- package/dist/src/core/renderers/webgl/WebGlShaderNode.js +23 -0
- package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +2 -2
- package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
- package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +1 -0
- package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +6 -3
- package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +11 -0
- package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +10 -5
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +10 -5
- package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/SdfShader.js +12 -0
- package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/EffectUtils.js +2 -2
- package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +5 -5
- package/dist/src/core/renderers/webgl/shaders/effects/HolePunchEffect.js +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.d.ts +1 -0
- package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +30 -14
- package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +0 -1
- package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +3 -13
- package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +5 -5
- package/dist/src/core/shaders/webgl/SdfShadowShader.d.ts +9 -0
- package/dist/src/core/shaders/webgl/SdfShadowShader.js +100 -0
- package/dist/src/core/shaders/webgl/SdfShadowShader.js.map +1 -0
- package/dist/src/core/text-rendering/CanvasFont.d.ts +1 -1
- package/dist/src/core/text-rendering/CanvasFont.js +7 -16
- package/dist/src/core/text-rendering/CanvasFont.js.map +1 -1
- package/dist/src/core/text-rendering/CoreFont.d.ts +1 -1
- package/dist/src/core/text-rendering/CoreFont.js +1 -1
- package/dist/src/core/text-rendering/CoreFont.js.map +1 -1
- package/dist/src/core/text-rendering/FontManager.js +2 -1
- package/dist/src/core/text-rendering/FontManager.js.map +1 -1
- package/dist/src/core/text-rendering/canvas/Settings.d.ts +64 -0
- package/dist/src/core/text-rendering/canvas/Settings.js +20 -0
- package/dist/src/core/text-rendering/canvas/Settings.js.map +1 -0
- package/dist/src/core/text-rendering/canvas/Utils.d.ts +20 -0
- package/dist/src/core/text-rendering/canvas/Utils.js +144 -0
- package/dist/src/core/text-rendering/canvas/Utils.js.map +1 -0
- package/dist/src/core/text-rendering/canvas/calculateRenderInfo.d.ts +60 -0
- package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js +183 -0
- package/dist/src/core/text-rendering/canvas/calculateRenderInfo.js.map +1 -0
- package/dist/src/core/text-rendering/canvas/draw.d.ts +5 -0
- package/dist/src/core/text-rendering/canvas/draw.js +132 -0
- package/dist/src/core/text-rendering/canvas/draw.js.map +1 -0
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +2 -2
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +3 -4
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +46 -98
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +2 -2
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +66 -8
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +1 -1
- package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +1 -1
- package/dist/src/core/text-rendering/renderers/canvas/CanvasTextRenderer.d.ts +26 -0
- package/dist/src/core/text-rendering/renderers/canvas/CanvasTextRenderer.js +158 -0
- package/dist/src/core/text-rendering/renderers/canvas/CanvasTextRenderer.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/canvas/internal/draw.d.ts +5 -0
- package/dist/src/core/text-rendering/renderers/canvas/internal/draw.js +127 -0
- package/dist/src/core/text-rendering/renderers/canvas/internal/draw.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/canvas/internal/mergeDefaults.d.ts +2 -0
- package/dist/src/core/text-rendering/renderers/canvas/internal/mergeDefaults.js +50 -0
- package/dist/src/core/text-rendering/renderers/canvas/internal/mergeDefaults.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/canvas/internal/renderInfo.d.ts +33 -0
- package/dist/src/core/text-rendering/renderers/canvas/internal/renderInfo.js +192 -0
- package/dist/src/core/text-rendering/renderers/canvas/internal/renderInfo.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/canvas/internal/types.d.ts +66 -0
- package/dist/src/core/text-rendering/renderers/canvas/internal/types.js +2 -0
- package/dist/src/core/text-rendering/renderers/canvas/internal/types.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/canvas/internal/utils.d.ts +91 -0
- package/dist/src/core/text-rendering/renderers/canvas/internal/utils.js +282 -0
- package/dist/src/core/text-rendering/renderers/canvas/internal/utils.js.map +1 -0
- package/dist/src/core/text-rendering/sdf/PeekableGenerator.d.ts +12 -0
- package/dist/src/core/text-rendering/sdf/PeekableGenerator.js +61 -0
- package/dist/src/core/text-rendering/sdf/PeekableGenerator.js.map +1 -0
- package/dist/src/core/text-rendering/sdf/SimpleFontShaper.d.ts +45 -0
- package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js +69 -0
- package/dist/src/core/text-rendering/sdf/SimpleFontShaper.js.map +1 -0
- package/dist/src/core/text-rendering/sdf/Utils.d.ts +26 -0
- package/dist/src/core/text-rendering/sdf/Utils.js +301 -0
- package/dist/src/core/text-rendering/sdf/Utils.js.map +1 -0
- package/dist/src/core/text-rendering/sdf/index.d.ts +1 -0
- package/dist/src/core/text-rendering/sdf/index.js +20 -0
- package/dist/src/core/text-rendering/sdf/index.js.map +1 -0
- package/dist/src/core/textures/ImageTexture.js +11 -0
- package/dist/src/core/textures/ImageTexture.js.map +1 -1
- package/dist/src/core/textures/Texture.js +5 -0
- package/dist/src/core/textures/Texture.js.map +1 -1
- package/dist/tsconfig.dist.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +1 -1
- package/src/common/EventEmitter.ts +6 -8
- package/src/core/Stage.ts +11 -0
- package/src/core/TextureMemoryManager.ts +4 -3
- package/src/core/animations/AnimationManager.ts +5 -5
- package/src/core/animations/CoreAnimation.ts +61 -45
- package/src/core/animations/CoreAnimationController.ts +16 -7
- package/src/core/renderers/canvas/CanvasRenderer.ts +19 -1
- package/src/core/renderers/canvas/CanvasTexture.ts +23 -8
- package/src/core/renderers/webgl/WebGlShaderNode.ts +24 -0
- package/src/core/renderers/webgl/WebGlShaderProgram.ts +3 -3
- package/src/core/renderers/webgl/internal/ShaderUtils.ts +1 -0
- package/src/core/textures/ImageTexture.ts +18 -0
- package/src/core/textures/Texture.ts +6 -0
- package/dist/src/core/lib/fps.d.ts +0 -15
- package/dist/src/core/lib/fps.js +0 -62
- package/dist/src/core/lib/fps.js.map +0 -1
- package/dist/src/core/text-rendering/TextGenerator.d.ts +0 -10
- package/dist/src/core/text-rendering/TextGenerator.js +0 -36
- package/dist/src/core/text-rendering/TextGenerator.js.map +0 -1
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* limitations under the License.
|
|
18
18
|
*/
|
|
19
19
|
import { assertTruthy } from '../../../utils.js';
|
|
20
|
-
import {
|
|
20
|
+
import { isPowerOfTwo } from '../../utils.js';
|
|
21
21
|
import { CoreContextTexture } from '../CoreContextTexture.js';
|
|
22
22
|
import { isHTMLImageElement } from './internal/RendererUtils.js';
|
|
23
23
|
const TRANSPARENT_TEXTURE_DATA = new Uint8Array([0, 0, 0, 0]);
|
|
@@ -37,31 +37,10 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
|
|
|
37
37
|
_nativeCtxTexture = null;
|
|
38
38
|
_w = 0;
|
|
39
39
|
_h = 0;
|
|
40
|
-
txCoordX1 = 0;
|
|
41
|
-
txCoordY1 = 0;
|
|
42
|
-
txCoordX2 = 1;
|
|
43
|
-
txCoordY2 = 1;
|
|
44
40
|
constructor(glw, memManager, textureSource) {
|
|
45
41
|
super(memManager, textureSource);
|
|
46
42
|
this.glw = glw;
|
|
47
43
|
}
|
|
48
|
-
/**
|
|
49
|
-
* GL error check with direct state marking
|
|
50
|
-
* Uses cached error result to minimize function calls
|
|
51
|
-
*/
|
|
52
|
-
checkGLError() {
|
|
53
|
-
// Skip if already failed to prevent double-processing
|
|
54
|
-
if (this.state === 'failed') {
|
|
55
|
-
return true;
|
|
56
|
-
}
|
|
57
|
-
const error = this.glw.getError();
|
|
58
|
-
if (error !== 0) {
|
|
59
|
-
this.state = 'failed';
|
|
60
|
-
this.textureSource.setState('failed', new Error(`WebGL Error: ${error}`));
|
|
61
|
-
return true;
|
|
62
|
-
}
|
|
63
|
-
return false;
|
|
64
|
-
}
|
|
65
44
|
get ctxTexture() {
|
|
66
45
|
if (this.state === 'freed') {
|
|
67
46
|
this.load();
|
|
@@ -85,24 +64,23 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
|
|
|
85
64
|
* to force the texture to be pre-loaded prior to accessing the ctxTexture
|
|
86
65
|
* property.
|
|
87
66
|
*/
|
|
88
|
-
|
|
89
|
-
// If the texture is already loading or loaded,
|
|
67
|
+
load() {
|
|
68
|
+
// If the texture is already loading or loaded, don't load it again.
|
|
90
69
|
if (this.state === 'loading' || this.state === 'loaded') {
|
|
91
|
-
return
|
|
70
|
+
return;
|
|
92
71
|
}
|
|
93
72
|
this.state = 'loading';
|
|
94
|
-
this.textureSource.
|
|
95
|
-
// Await the native texture creation to ensure GPU buffer is fully allocated
|
|
73
|
+
this.textureSource.setCoreCtxState('loading');
|
|
96
74
|
this._nativeCtxTexture = this.createNativeCtxTexture();
|
|
97
75
|
if (this._nativeCtxTexture === null) {
|
|
98
76
|
this.state = 'failed';
|
|
99
|
-
this.textureSource.
|
|
77
|
+
this.textureSource.setCoreCtxState('failed', new Error('Could not create WebGL Texture'));
|
|
78
|
+
console.error('Could not create WebGL Texture');
|
|
100
79
|
return;
|
|
101
80
|
}
|
|
102
|
-
|
|
103
|
-
|
|
81
|
+
this.onLoadRequest()
|
|
82
|
+
.then(({ width, height }) => {
|
|
104
83
|
// If the texture has been freed while loading, return early.
|
|
105
|
-
// Type assertion needed because state could change during async operations
|
|
106
84
|
if (this.state === 'freed') {
|
|
107
85
|
return;
|
|
108
86
|
}
|
|
@@ -111,19 +89,17 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
|
|
|
111
89
|
this._h = height;
|
|
112
90
|
// Update the texture source's width and height so that it can be used
|
|
113
91
|
// for rendering.
|
|
114
|
-
this.textureSource.
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
catch (err) {
|
|
92
|
+
this.textureSource.setCoreCtxState('loaded', { width, height });
|
|
93
|
+
})
|
|
94
|
+
.catch((err) => {
|
|
118
95
|
// If the texture has been freed while loading, return early.
|
|
119
|
-
// Type assertion needed because state could change during async operations
|
|
120
96
|
if (this.state === 'freed') {
|
|
121
97
|
return;
|
|
122
98
|
}
|
|
123
|
-
// Ensure texture is marked as failed
|
|
124
99
|
this.state = 'failed';
|
|
125
|
-
this.textureSource.
|
|
126
|
-
|
|
100
|
+
this.textureSource.setCoreCtxState('failed', err);
|
|
101
|
+
console.error(err);
|
|
102
|
+
});
|
|
127
103
|
}
|
|
128
104
|
/**
|
|
129
105
|
* Called when the texture data needs to be loaded and uploaded to a texture
|
|
@@ -131,29 +107,21 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
|
|
|
131
107
|
async onLoadRequest() {
|
|
132
108
|
const { glw } = this;
|
|
133
109
|
const textureData = this.textureSource.textureData;
|
|
134
|
-
|
|
135
|
-
if (this.state === 'failed') {
|
|
136
|
-
return { width: 0, height: 0 };
|
|
137
|
-
}
|
|
138
|
-
if (textureData === null || this._nativeCtxTexture === null) {
|
|
139
|
-
this.state = 'failed';
|
|
140
|
-
this.textureSource.setState('failed', new Error('No texture data available'));
|
|
141
|
-
return { width: 0, height: 0 };
|
|
142
|
-
}
|
|
110
|
+
assertTruthy(textureData, 'Texture data is null');
|
|
143
111
|
// Set to a 1x1 transparent texture
|
|
144
112
|
glw.texImage2D(0, glw.RGBA, 1, 1, 0, glw.RGBA, glw.UNSIGNED_BYTE, null);
|
|
145
113
|
this.setTextureMemUse(TRANSPARENT_TEXTURE_DATA.byteLength);
|
|
114
|
+
// If the texture has been freed while loading, return early.
|
|
115
|
+
if (!this._nativeCtxTexture) {
|
|
116
|
+
assertTruthy(this.state === 'freed');
|
|
117
|
+
return { width: 0, height: 0 };
|
|
118
|
+
}
|
|
146
119
|
let width = 0;
|
|
147
120
|
let height = 0;
|
|
148
121
|
glw.activeTexture(0);
|
|
149
|
-
// High-performance error check - single call, direct state marking
|
|
150
|
-
if (this.checkGLError() === true) {
|
|
151
|
-
return { width: 0, height: 0 };
|
|
152
|
-
}
|
|
153
122
|
const tdata = textureData.data;
|
|
154
|
-
const format = glw.RGBA;
|
|
155
|
-
const formatBytes = 4;
|
|
156
|
-
const memoryPadding = 1.1; // Add padding to account for GPU Padding
|
|
123
|
+
const format = textureData.premultiplyAlpha ? glw.RGBA : glw.RGB;
|
|
124
|
+
const formatBytes = format === glw.RGBA ? 4 : 3;
|
|
157
125
|
// If textureData is null, the texture is empty (0, 0) and we don't need to
|
|
158
126
|
// upload any data to the GPU.
|
|
159
127
|
if ((typeof ImageBitmap !== 'undefined' && tdata instanceof ImageBitmap) ||
|
|
@@ -165,26 +133,32 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
|
|
|
165
133
|
glw.bindTexture(this._nativeCtxTexture);
|
|
166
134
|
glw.pixelStorei(glw.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !!textureData.premultiplyAlpha);
|
|
167
135
|
glw.texImage2D(0, format, format, glw.UNSIGNED_BYTE, tdata);
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
136
|
+
this.setTextureMemUse(width * height * formatBytes);
|
|
137
|
+
// generate mipmaps for power-of-2 textures or in WebGL2RenderingContext
|
|
138
|
+
if (glw.isWebGl2() || (isPowerOfTwo(width) && isPowerOfTwo(height))) {
|
|
139
|
+
glw.generateMipmap();
|
|
171
140
|
}
|
|
172
|
-
this.setTextureMemUse(height * width * formatBytes * memoryPadding);
|
|
173
141
|
}
|
|
174
|
-
else if (tdata
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
//
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
this.
|
|
142
|
+
else if (tdata === null) {
|
|
143
|
+
width = 0;
|
|
144
|
+
height = 0;
|
|
145
|
+
// Reset to a 1x1 transparent texture
|
|
146
|
+
glw.bindTexture(this._nativeCtxTexture);
|
|
147
|
+
glw.texImage2D(0, format, 1, 1, 0, format, glw.UNSIGNED_BYTE, TRANSPARENT_TEXTURE_DATA);
|
|
148
|
+
this.setTextureMemUse(TRANSPARENT_TEXTURE_DATA.byteLength);
|
|
149
|
+
}
|
|
150
|
+
else if ('mipmaps' in tdata && tdata.mipmaps) {
|
|
151
|
+
const { mipmaps, width = 0, height = 0, type, glInternalFormat } = tdata;
|
|
152
|
+
const view = type === 'ktx'
|
|
153
|
+
? new DataView(mipmaps[0] ?? new ArrayBuffer(0))
|
|
154
|
+
: mipmaps[0];
|
|
155
|
+
glw.bindTexture(this._nativeCtxTexture);
|
|
156
|
+
glw.compressedTexImage2D(0, glInternalFormat, width, height, 0, view);
|
|
157
|
+
glw.texParameteri(glw.TEXTURE_WRAP_S, glw.CLAMP_TO_EDGE);
|
|
158
|
+
glw.texParameteri(glw.TEXTURE_WRAP_T, glw.CLAMP_TO_EDGE);
|
|
159
|
+
glw.texParameteri(glw.TEXTURE_MAG_FILTER, glw.LINEAR);
|
|
160
|
+
glw.texParameteri(glw.TEXTURE_MIN_FILTER, glw.LINEAR);
|
|
161
|
+
this.setTextureMemUse(view.byteLength);
|
|
188
162
|
}
|
|
189
163
|
else if (tdata && tdata instanceof Uint8Array) {
|
|
190
164
|
// Color Texture
|
|
@@ -193,17 +167,10 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
|
|
|
193
167
|
glw.bindTexture(this._nativeCtxTexture);
|
|
194
168
|
glw.pixelStorei(glw.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !!textureData.premultiplyAlpha);
|
|
195
169
|
glw.texImage2D(0, format, width, height, 0, format, glw.UNSIGNED_BYTE, tdata);
|
|
196
|
-
// Check for errors after color texture operations
|
|
197
|
-
if (this.checkGLError() === true) {
|
|
198
|
-
return { width: 0, height: 0 };
|
|
199
|
-
}
|
|
200
170
|
this.setTextureMemUse(width * height * formatBytes);
|
|
201
171
|
}
|
|
202
172
|
else {
|
|
203
|
-
|
|
204
|
-
this.state = 'failed';
|
|
205
|
-
this.textureSource.setState('failed', new Error('Unexpected texture data'));
|
|
206
|
-
return { width: 0, height: 0 };
|
|
173
|
+
console.error(`WebGlCoreCtxTexture.onLoadRequest: Unexpected textureData returned`, textureData);
|
|
207
174
|
}
|
|
208
175
|
return {
|
|
209
176
|
width,
|
|
@@ -220,31 +187,26 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
|
|
|
220
187
|
return;
|
|
221
188
|
}
|
|
222
189
|
this.state = 'freed';
|
|
223
|
-
this.textureSource.
|
|
224
|
-
this.release();
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Release the WebGLTexture from the GPU without changing state
|
|
228
|
-
*/
|
|
229
|
-
release() {
|
|
190
|
+
this.textureSource.setCoreCtxState('freed');
|
|
230
191
|
this._w = 0;
|
|
231
192
|
this._h = 0;
|
|
232
|
-
if (this._nativeCtxTexture
|
|
233
|
-
|
|
234
|
-
this.setTextureMemUse(0);
|
|
235
|
-
this._nativeCtxTexture = null;
|
|
193
|
+
if (!this._nativeCtxTexture) {
|
|
194
|
+
return;
|
|
236
195
|
}
|
|
237
|
-
|
|
238
|
-
this.
|
|
196
|
+
const { glw } = this;
|
|
197
|
+
glw.deleteTexture(this._nativeCtxTexture);
|
|
198
|
+
this.setTextureMemUse(0);
|
|
199
|
+
this._nativeCtxTexture = null;
|
|
239
200
|
}
|
|
240
201
|
/**
|
|
241
|
-
* Create native context texture
|
|
202
|
+
* Create native context texture
|
|
242
203
|
*
|
|
243
204
|
* @remarks
|
|
244
|
-
* When this method
|
|
245
|
-
* and fully ready for use. This ensures proper GPU resource allocation timing.
|
|
205
|
+
* When this method returns the returned texture will be bound to the GL context state.
|
|
246
206
|
*
|
|
247
|
-
* @
|
|
207
|
+
* @param width
|
|
208
|
+
* @param height
|
|
209
|
+
* @returns
|
|
248
210
|
*/
|
|
249
211
|
createNativeCtxTexture() {
|
|
250
212
|
const { glw } = this;
|
|
@@ -262,10 +224,6 @@ export class WebGlCoreCtxTexture extends CoreContextTexture {
|
|
|
262
224
|
// texture wrapping method
|
|
263
225
|
glw.texParameteri(glw.TEXTURE_WRAP_S, glw.CLAMP_TO_EDGE);
|
|
264
226
|
glw.texParameteri(glw.TEXTURE_WRAP_T, glw.CLAMP_TO_EDGE);
|
|
265
|
-
const error = glw.getError();
|
|
266
|
-
if (error !== 0) {
|
|
267
|
-
return null;
|
|
268
|
-
}
|
|
269
227
|
return nativeTexture;
|
|
270
228
|
}
|
|
271
229
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebGlCoreCtxTexture.js","sourceRoot":"","sources":["../../../../../src/core/renderers/webgl/WebGlCoreCtxTexture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"WebGlCoreCtxTexture.js","sourceRoot":"","sources":["../../../../../src/core/renderers/webgl/WebGlCoreCtxTexture.ts"],"names":[],"mappings":"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"}
|
|
@@ -85,7 +85,7 @@ export class WebGlCoreRenderOp extends CoreRenderOp {
|
|
|
85
85
|
shManager.useShader(shader);
|
|
86
86
|
shader.bindRenderOp(this, shaderProps);
|
|
87
87
|
// TODO: Reduce calculations required
|
|
88
|
-
const quadIdx = (this.bufferIdx /
|
|
88
|
+
const quadIdx = (this.bufferIdx / 24) * 6 * 2;
|
|
89
89
|
// Clipping
|
|
90
90
|
if (this.clippingRect.valid) {
|
|
91
91
|
const { x, y, width, height } = this.clippingRect;
|
|
@@ -7,7 +7,7 @@ import { CoreShaderManager } from '../../CoreShaderManager.js';
|
|
|
7
7
|
import { BufferCollection } from './internal/BufferCollection.js';
|
|
8
8
|
import { WebGlCoreShader } from './WebGlCoreShader.js';
|
|
9
9
|
import { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
|
|
10
|
-
import {
|
|
10
|
+
import type { CoreNode } from '../../CoreNode.js';
|
|
11
11
|
import type { BaseShaderController } from '../../../main-api/ShaderController.js';
|
|
12
12
|
export type WebGlCoreRendererOptions = CoreRendererOptions;
|
|
13
13
|
interface CoreWebGlSystem {
|
|
@@ -33,7 +33,6 @@ export declare class WebGlCoreRenderer extends CoreRenderer {
|
|
|
33
33
|
* White pixel texture used by default when no texture is specified.
|
|
34
34
|
*/
|
|
35
35
|
quadBufferUsage: number;
|
|
36
|
-
numQuadsRendered: number;
|
|
37
36
|
/**
|
|
38
37
|
* Whether the renderer is currently rendering to a texture.
|
|
39
38
|
*/
|
|
@@ -94,7 +93,6 @@ export declare class WebGlCoreRenderer extends CoreRenderer {
|
|
|
94
93
|
* @param surface
|
|
95
94
|
*/
|
|
96
95
|
render(surface?: 'screen' | CoreContextTexture): void;
|
|
97
|
-
getQuadCount(): number;
|
|
98
96
|
renderToTexture(node: CoreNode): void;
|
|
99
97
|
/**
|
|
100
98
|
* Inserts an RTT node into `this.rttNodes` while maintaining the correct rendering order based on hierarchy.
|
|
@@ -30,7 +30,6 @@ import { compareRect, getNormalizedRgbaComponents, } from '../../lib/utils.js';
|
|
|
30
30
|
import { WebGlCoreShader } from './WebGlCoreShader.js';
|
|
31
31
|
import { WebGlContextWrapper } from '../../lib/WebGlContextWrapper.js';
|
|
32
32
|
import { RenderTexture } from '../../textures/RenderTexture.js';
|
|
33
|
-
import { CoreNodeRenderState } from '../../CoreNode.js';
|
|
34
33
|
import { WebGlCoreCtxRenderTexture } from './WebGlCoreCtxRenderTexture.js';
|
|
35
34
|
const WORDS_PER_QUAD = 24;
|
|
36
35
|
export class WebGlCoreRenderer extends CoreRenderer {
|
|
@@ -59,7 +58,6 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
59
58
|
* White pixel texture used by default when no texture is specified.
|
|
60
59
|
*/
|
|
61
60
|
quadBufferUsage = 0;
|
|
62
|
-
numQuadsRendered = 0;
|
|
63
61
|
/**
|
|
64
62
|
* Whether the renderer is currently rendering to a texture.
|
|
65
63
|
*/
|
|
@@ -87,7 +85,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
87
85
|
this.defaultShader = this.defShaderCtrl.shader;
|
|
88
86
|
const quadBuffer = glw.createBuffer();
|
|
89
87
|
assertTruthy(quadBuffer);
|
|
90
|
-
const stride =
|
|
88
|
+
const stride = 6 * Float32Array.BYTES_PER_ELEMENT;
|
|
91
89
|
this.quadBufferCollection = new BufferCollection([
|
|
92
90
|
{
|
|
93
91
|
buffer: quadBuffer,
|
|
@@ -124,14 +122,6 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
124
122
|
stride,
|
|
125
123
|
offset: 5 * Float32Array.BYTES_PER_ELEMENT,
|
|
126
124
|
},
|
|
127
|
-
a_nodeCoordinate: {
|
|
128
|
-
name: 'a_nodeCoordinate',
|
|
129
|
-
size: 2,
|
|
130
|
-
type: glw.FLOAT,
|
|
131
|
-
normalized: false,
|
|
132
|
-
stride,
|
|
133
|
-
offset: 6 * Float32Array.BYTES_PER_ELEMENT,
|
|
134
|
-
},
|
|
135
125
|
},
|
|
136
126
|
},
|
|
137
127
|
]);
|
|
@@ -176,7 +166,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
176
166
|
* If the shader props contain any automatic properties, update it with the
|
|
177
167
|
* current dimensions and or alpha that will be used to render the quad.
|
|
178
168
|
*/
|
|
179
|
-
if (params.
|
|
169
|
+
if (params.shaderProps !== null) {
|
|
180
170
|
if (hasOwn(params.shaderProps, '$dimensions') == true) {
|
|
181
171
|
const dimensions = params.shaderProps.$dimensions;
|
|
182
172
|
dimensions.width = params.width;
|
|
@@ -187,13 +177,16 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
187
177
|
}
|
|
188
178
|
}
|
|
189
179
|
let { curBufferIdx: bufferIdx, curRenderOp } = this;
|
|
190
|
-
const targetDims = { width:
|
|
180
|
+
const targetDims = { width: -1, height: -1 };
|
|
181
|
+
targetDims.width = params.width;
|
|
182
|
+
targetDims.height = params.height;
|
|
183
|
+
const targetShader = params.shader || this.defaultShader;
|
|
184
|
+
assertTruthy(targetShader.getUniformLocation !== undefined, 'Invalid WebGL shader');
|
|
191
185
|
if (this.reuseRenderOp(params) === false) {
|
|
192
|
-
this.newRenderOp(
|
|
186
|
+
this.newRenderOp(targetShader, params.shaderProps, params.alpha, targetDims, params.clippingRect, bufferIdx, params.rtt, params.parentHasRenderTexture, params.framebufferDimensions);
|
|
193
187
|
curRenderOp = this.curRenderOp;
|
|
194
188
|
assertTruthy(curRenderOp);
|
|
195
189
|
}
|
|
196
|
-
let ctxTexture = undefined;
|
|
197
190
|
let texCoordX1 = 0;
|
|
198
191
|
let texCoordY1 = 0;
|
|
199
192
|
let texCoordX2 = 1;
|
|
@@ -206,18 +199,6 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
206
199
|
texCoordY1 = ty / parentH;
|
|
207
200
|
texCoordY2 = texCoordY1 + th / parentH;
|
|
208
201
|
texture = texture.parentTexture;
|
|
209
|
-
ctxTexture = texture.ctxTexture;
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
ctxTexture = texture.ctxTexture;
|
|
213
|
-
if (ctxTexture === undefined) {
|
|
214
|
-
ctxTexture = this.stage.defaultTexture?.ctxTexture;
|
|
215
|
-
console.warn('WebGL Renderer: Texture does not have a ctxTexture, using default texture instead');
|
|
216
|
-
}
|
|
217
|
-
texCoordX1 = ctxTexture.txCoordX1;
|
|
218
|
-
texCoordY1 = ctxTexture.txCoordY1;
|
|
219
|
-
texCoordX2 = ctxTexture.txCoordX2;
|
|
220
|
-
texCoordY2 = ctxTexture.txCoordY2;
|
|
221
202
|
}
|
|
222
203
|
if (texture.type === TextureType.image &&
|
|
223
204
|
params.textureOptions !== null &&
|
|
@@ -257,6 +238,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
257
238
|
if (flipY ^ +(texture.type === TextureType.renderToTexture)) {
|
|
258
239
|
[texCoordY1, texCoordY2] = [texCoordY2, texCoordY1];
|
|
259
240
|
}
|
|
241
|
+
const ctxTexture = texture.ctxTexture;
|
|
242
|
+
assertTruthy(ctxTexture instanceof WebGlCoreCtxTexture);
|
|
260
243
|
const textureIdx = this.addTexture(ctxTexture, bufferIdx);
|
|
261
244
|
assertTruthy(this.curRenderOp !== null);
|
|
262
245
|
if (params.renderCoords) {
|
|
@@ -267,8 +250,6 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
267
250
|
fQuadBuffer[bufferIdx++] = texCoordY1; // texCoordY
|
|
268
251
|
uiQuadBuffer[bufferIdx++] = params.colorTl; // color
|
|
269
252
|
fQuadBuffer[bufferIdx++] = textureIdx; // texIndex
|
|
270
|
-
fQuadBuffer[bufferIdx++] = 0;
|
|
271
|
-
fQuadBuffer[bufferIdx++] = 0;
|
|
272
253
|
// Upper-Right
|
|
273
254
|
fQuadBuffer[bufferIdx++] = params.renderCoords.x2;
|
|
274
255
|
fQuadBuffer[bufferIdx++] = params.renderCoords.y2;
|
|
@@ -276,8 +257,6 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
276
257
|
fQuadBuffer[bufferIdx++] = texCoordY1;
|
|
277
258
|
uiQuadBuffer[bufferIdx++] = params.colorTr;
|
|
278
259
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
279
|
-
fQuadBuffer[bufferIdx++] = 1;
|
|
280
|
-
fQuadBuffer[bufferIdx++] = 0;
|
|
281
260
|
// Lower-Left
|
|
282
261
|
fQuadBuffer[bufferIdx++] = params.renderCoords.x4;
|
|
283
262
|
fQuadBuffer[bufferIdx++] = params.renderCoords.y4;
|
|
@@ -285,8 +264,6 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
285
264
|
fQuadBuffer[bufferIdx++] = texCoordY2;
|
|
286
265
|
uiQuadBuffer[bufferIdx++] = params.colorBl;
|
|
287
266
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
288
|
-
fQuadBuffer[bufferIdx++] = 0;
|
|
289
|
-
fQuadBuffer[bufferIdx++] = 1;
|
|
290
267
|
// Lower-Right
|
|
291
268
|
fQuadBuffer[bufferIdx++] = params.renderCoords.x3;
|
|
292
269
|
fQuadBuffer[bufferIdx++] = params.renderCoords.y3;
|
|
@@ -294,8 +271,6 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
294
271
|
fQuadBuffer[bufferIdx++] = texCoordY2;
|
|
295
272
|
uiQuadBuffer[bufferIdx++] = params.colorBr;
|
|
296
273
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
297
|
-
fQuadBuffer[bufferIdx++] = 1;
|
|
298
|
-
fQuadBuffer[bufferIdx++] = 1;
|
|
299
274
|
}
|
|
300
275
|
else if (params.tb !== 0 || params.tc !== 0) {
|
|
301
276
|
// Upper-Left
|
|
@@ -305,8 +280,6 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
305
280
|
fQuadBuffer[bufferIdx++] = texCoordY1; // texCoordY
|
|
306
281
|
uiQuadBuffer[bufferIdx++] = params.colorTl; // color
|
|
307
282
|
fQuadBuffer[bufferIdx++] = textureIdx; // texIndex
|
|
308
|
-
fQuadBuffer[bufferIdx++] = 0;
|
|
309
|
-
fQuadBuffer[bufferIdx++] = 0;
|
|
310
283
|
// Upper-Right
|
|
311
284
|
fQuadBuffer[bufferIdx++] = params.tx + params.width * params.ta;
|
|
312
285
|
fQuadBuffer[bufferIdx++] = params.ty + params.width * params.tc;
|
|
@@ -314,8 +287,6 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
314
287
|
fQuadBuffer[bufferIdx++] = texCoordY1;
|
|
315
288
|
uiQuadBuffer[bufferIdx++] = params.colorTr;
|
|
316
289
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
317
|
-
fQuadBuffer[bufferIdx++] = 1;
|
|
318
|
-
fQuadBuffer[bufferIdx++] = 0;
|
|
319
290
|
// Lower-Left
|
|
320
291
|
fQuadBuffer[bufferIdx++] = params.tx + params.height * params.tb;
|
|
321
292
|
fQuadBuffer[bufferIdx++] = params.ty + params.height * params.td;
|
|
@@ -323,8 +294,6 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
323
294
|
fQuadBuffer[bufferIdx++] = texCoordY2;
|
|
324
295
|
uiQuadBuffer[bufferIdx++] = params.colorBl;
|
|
325
296
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
326
|
-
fQuadBuffer[bufferIdx++] = 0;
|
|
327
|
-
fQuadBuffer[bufferIdx++] = 1;
|
|
328
297
|
// Lower-Right
|
|
329
298
|
fQuadBuffer[bufferIdx++] =
|
|
330
299
|
params.tx + params.width * params.ta + params.height * params.tb;
|
|
@@ -334,8 +303,6 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
334
303
|
fQuadBuffer[bufferIdx++] = texCoordY2;
|
|
335
304
|
uiQuadBuffer[bufferIdx++] = params.colorBr;
|
|
336
305
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
337
|
-
fQuadBuffer[bufferIdx++] = 1;
|
|
338
|
-
fQuadBuffer[bufferIdx++] = 1;
|
|
339
306
|
}
|
|
340
307
|
else {
|
|
341
308
|
// Calculate the right corner of the quad
|
|
@@ -349,8 +316,6 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
349
316
|
fQuadBuffer[bufferIdx++] = texCoordY1; // texCoordY
|
|
350
317
|
uiQuadBuffer[bufferIdx++] = params.colorTl; // color
|
|
351
318
|
fQuadBuffer[bufferIdx++] = textureIdx; // texIndex
|
|
352
|
-
fQuadBuffer[bufferIdx++] = 0;
|
|
353
|
-
fQuadBuffer[bufferIdx++] = 0;
|
|
354
319
|
// Upper-Right
|
|
355
320
|
fQuadBuffer[bufferIdx++] = rightCornerX;
|
|
356
321
|
fQuadBuffer[bufferIdx++] = params.ty;
|
|
@@ -358,8 +323,6 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
358
323
|
fQuadBuffer[bufferIdx++] = texCoordY1;
|
|
359
324
|
uiQuadBuffer[bufferIdx++] = params.colorTr;
|
|
360
325
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
361
|
-
fQuadBuffer[bufferIdx++] = 1;
|
|
362
|
-
fQuadBuffer[bufferIdx++] = 0;
|
|
363
326
|
// Lower-Left
|
|
364
327
|
fQuadBuffer[bufferIdx++] = params.tx;
|
|
365
328
|
fQuadBuffer[bufferIdx++] = rightCornerY;
|
|
@@ -367,8 +330,6 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
367
330
|
fQuadBuffer[bufferIdx++] = texCoordY2;
|
|
368
331
|
uiQuadBuffer[bufferIdx++] = params.colorBl;
|
|
369
332
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
370
|
-
fQuadBuffer[bufferIdx++] = 0;
|
|
371
|
-
fQuadBuffer[bufferIdx++] = 1;
|
|
372
333
|
// Lower-Right
|
|
373
334
|
fQuadBuffer[bufferIdx++] = rightCornerX;
|
|
374
335
|
fQuadBuffer[bufferIdx++] = rightCornerY;
|
|
@@ -376,10 +337,9 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
376
337
|
fQuadBuffer[bufferIdx++] = texCoordY2;
|
|
377
338
|
uiQuadBuffer[bufferIdx++] = params.colorBr;
|
|
378
339
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
379
|
-
fQuadBuffer[bufferIdx++] = 1;
|
|
380
|
-
fQuadBuffer[bufferIdx++] = 1;
|
|
381
340
|
}
|
|
382
341
|
// Update the length of the current render op
|
|
342
|
+
this.curRenderOp.length += WORDS_PER_QUAD;
|
|
383
343
|
this.curRenderOp.numQuads++;
|
|
384
344
|
this.curBufferIdx = bufferIdx;
|
|
385
345
|
}
|
|
@@ -429,23 +389,25 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
429
389
|
*/
|
|
430
390
|
reuseRenderOp(params) {
|
|
431
391
|
const { shader, shaderProps, parentHasRenderTexture, rtt, clippingRect } = params;
|
|
392
|
+
const targetShader = shader || this.defaultShader;
|
|
432
393
|
// Switching shader program will require a new render operation
|
|
433
|
-
if (this.curRenderOp?.shader !==
|
|
394
|
+
if (this.curRenderOp?.shader !== targetShader) {
|
|
434
395
|
return false;
|
|
435
396
|
}
|
|
436
397
|
// Switching clipping rect will require a new render operation
|
|
437
|
-
if (compareRect(this.curRenderOp.clippingRect, clippingRect)
|
|
398
|
+
if (!compareRect(this.curRenderOp.clippingRect, clippingRect)) {
|
|
438
399
|
return false;
|
|
439
400
|
}
|
|
440
401
|
// Force new render operation if rendering to texture
|
|
441
402
|
// @todo: This needs to be improved, render operations could also be reused
|
|
442
403
|
// for rendering to texture
|
|
443
|
-
if (parentHasRenderTexture
|
|
404
|
+
if (parentHasRenderTexture || rtt) {
|
|
444
405
|
return false;
|
|
445
406
|
}
|
|
446
407
|
// Check if the shader can batch the shader properties
|
|
447
408
|
if (this.curRenderOp.shader !== this.defaultShader &&
|
|
448
|
-
|
|
409
|
+
(!shaderProps ||
|
|
410
|
+
!this.curRenderOp.shader.canBatchShaderProps(this.curRenderOp.shaderProps, shaderProps))) {
|
|
449
411
|
return false;
|
|
450
412
|
}
|
|
451
413
|
// Render operation can be reused
|
|
@@ -468,19 +430,20 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
468
430
|
render(surface = 'screen') {
|
|
469
431
|
const { glw, quadBuffer } = this;
|
|
470
432
|
const arr = new Float32Array(quadBuffer, 0, this.curBufferIdx);
|
|
471
|
-
const buffer = this.quadBufferCollection.getBuffer('a_position')
|
|
433
|
+
const buffer = this.quadBufferCollection.getBuffer('a_position') ?? null;
|
|
472
434
|
glw.arrayBufferData(buffer, arr, glw.STATIC_DRAW);
|
|
435
|
+
const doLog = false; // idx++ % 100 === 0;
|
|
436
|
+
if (doLog) {
|
|
437
|
+
console.log('renderOps', this.renderOps.length);
|
|
438
|
+
}
|
|
473
439
|
for (let i = 0, length = this.renderOps.length; i < length; i++) {
|
|
474
|
-
|
|
475
|
-
|
|
440
|
+
const renderOp = this.renderOps[i];
|
|
441
|
+
if (doLog) {
|
|
442
|
+
console.log('Quads per operation', renderOp.numQuads);
|
|
443
|
+
}
|
|
444
|
+
renderOp.draw();
|
|
476
445
|
}
|
|
477
446
|
this.quadBufferUsage = this.curBufferIdx * arr.BYTES_PER_ELEMENT;
|
|
478
|
-
// Calculate the size of each quad in bytes (4 vertices per quad) times the size of each vertex in bytes
|
|
479
|
-
const QUAD_SIZE_IN_BYTES = 4 * (8 * arr.BYTES_PER_ELEMENT); // 8 attributes per vertex
|
|
480
|
-
this.numQuadsRendered = this.quadBufferUsage / QUAD_SIZE_IN_BYTES;
|
|
481
|
-
}
|
|
482
|
-
getQuadCount() {
|
|
483
|
-
return this.numQuadsRendered;
|
|
484
447
|
}
|
|
485
448
|
renderToTexture(node) {
|
|
486
449
|
for (let i = 0; i < this.rttNodes.length; i++) {
|
|
@@ -561,17 +524,11 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
561
524
|
for (let i = 0; i < this.rttNodes.length; i++) {
|
|
562
525
|
const node = this.rttNodes[i];
|
|
563
526
|
// Skip nodes that don't have RTT updates
|
|
564
|
-
if (node
|
|
565
|
-
continue;
|
|
566
|
-
}
|
|
567
|
-
// Skip nodes that are not visible
|
|
568
|
-
if (node.worldAlpha === 0 ||
|
|
569
|
-
(node.strictBounds === true &&
|
|
570
|
-
node.renderState === CoreNodeRenderState.OutOfBounds)) {
|
|
527
|
+
if (!node || !node.hasRTTupdates) {
|
|
571
528
|
continue;
|
|
572
529
|
}
|
|
573
|
-
|
|
574
|
-
|
|
530
|
+
if (!node.texture || !node.texture.ctxTexture) {
|
|
531
|
+
console.warn('Texture not loaded for RTT node', node);
|
|
575
532
|
continue;
|
|
576
533
|
}
|
|
577
534
|
// Set the active RTT node to the current node
|
|
@@ -590,7 +547,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
590
547
|
// Render all associated quads to the texture
|
|
591
548
|
for (let i = 0; i < node.children.length; i++) {
|
|
592
549
|
const child = node.children[i];
|
|
593
|
-
if (child
|
|
550
|
+
if (!child) {
|
|
594
551
|
continue;
|
|
595
552
|
}
|
|
596
553
|
this.stage.addQuads(child);
|