@lightningjs/renderer 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/common/CommonTypes.d.ts +8 -0
- package/dist/src/core/CoreNode.js +45 -16
- package/dist/src/core/CoreNode.js.map +1 -1
- package/dist/src/core/CoreTextNode.d.ts +10 -0
- package/dist/src/core/CoreTextNode.js +45 -0
- package/dist/src/core/CoreTextNode.js.map +1 -1
- package/dist/src/core/CoreTextureManager.d.ts +3 -1
- package/dist/src/core/CoreTextureManager.js +4 -1
- package/dist/src/core/CoreTextureManager.js.map +1 -1
- package/dist/src/core/Stage.d.ts +6 -0
- package/dist/src/core/Stage.js +12 -3
- package/dist/src/core/Stage.js.map +1 -1
- package/dist/src/core/lib/ImageWorker.d.ts +16 -0
- package/dist/src/core/lib/ImageWorker.js +111 -0
- package/dist/src/core/lib/ImageWorker.js.map +1 -0
- package/dist/src/core/lib/WebGlContextWrapper.d.ts +4 -0
- package/dist/src/core/lib/WebGlContextWrapper.js +7 -2
- package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +2 -1
- package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +2 -2
- package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +3 -2
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +23 -21
- package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.d.ts +3 -2
- package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js +9 -13
- package/dist/src/core/renderers/webgl/WebGlCoreRenderOp.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +4 -1
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +25 -24
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +2 -1
- package/dist/src/core/renderers/webgl/WebGlCoreShader.js +24 -24
- package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/internal/RendererUtils.d.ts +8 -5
- package/dist/src/core/renderers/webgl/internal/RendererUtils.js +11 -13
- package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
- package/dist/src/core/renderers/webgl/internal/ShaderUtils.d.ts +3 -2
- package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +15 -15
- package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +3 -6
- package/dist/src/core/renderers/webgl/shaders/DefaultShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +3 -3
- package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.d.ts +1 -0
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +32 -12
- package/dist/src/core/renderers/webgl/shaders/DynamicShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +3 -3
- package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/SdfShader.js +3 -3
- package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.d.ts +14 -1
- package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +15 -5
- package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js.map +1 -1
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +3 -3
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +1 -1
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.d.ts +2 -1
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +4 -2
- package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +25 -0
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +1 -1
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +6 -6
- package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +3 -2
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +82 -50
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.d.ts +8 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.js +29 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +4 -3
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +15 -11
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +3 -2
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +30 -26
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.d.ts +19 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.js +84 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.d.ts +8 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.js +40 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.d.ts +2 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.js +41 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.d.ts +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.js +4 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.d.ts +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.js +2 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.d.ts +9 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.js +32 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +26 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js +70 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.d.ts +16 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js +39 -0
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js.map +1 -0
- package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +50 -0
- package/dist/src/core/text-rendering/renderers/TextRenderer.js +19 -0
- package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
- package/dist/src/core/textures/ImageTexture.js +14 -9
- package/dist/src/core/textures/ImageTexture.js.map +1 -1
- package/dist/src/core/utils.d.ts +1 -6
- package/dist/src/core/utils.js +3 -2
- package/dist/src/core/utils.js.map +1 -1
- package/dist/src/main-api/ICoreDriver.d.ts +2 -1
- package/dist/src/main-api/RendererMain.d.ts +25 -0
- package/dist/src/main-api/RendererMain.js +14 -5
- package/dist/src/main-api/RendererMain.js.map +1 -1
- package/dist/src/render-drivers/main/MainCoreDriver.d.ts +2 -1
- package/dist/src/render-drivers/main/MainCoreDriver.js +6 -4
- package/dist/src/render-drivers/main/MainCoreDriver.js.map +1 -1
- package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +10 -0
- package/dist/src/render-drivers/main/MainOnlyTextNode.js +45 -0
- package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +1 -1
- package/dist/src/render-drivers/threadx/TextNodeStruct.d.ts +10 -0
- package/dist/src/render-drivers/threadx/TextNodeStruct.js +45 -0
- package/dist/src/render-drivers/threadx/TextNodeStruct.js.map +1 -1
- package/dist/src/render-drivers/threadx/ThreadXCoreDriver.d.ts +2 -1
- package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +8 -1
- package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +1 -1
- package/dist/src/render-drivers/threadx/ThreadXMainTextNode.d.ts +5 -0
- package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js +5 -0
- package/dist/src/render-drivers/threadx/ThreadXMainTextNode.js.map +1 -1
- package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +4 -1
- package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +1 -1
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.d.ts +5 -0
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +10 -0
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +1 -1
- package/dist/src/render-drivers/threadx/worker/renderer.js +5 -3
- package/dist/src/render-drivers/threadx/worker/renderer.js.map +1 -1
- package/dist/src/utils.d.ts +2 -1
- package/dist/src/utils.js +22 -3
- package/dist/src/utils.js.map +1 -1
- package/dist/tsconfig.dist.tsbuildinfo +1 -1
- package/package.json +3 -2
- package/src/common/CommonTypes.ts +9 -0
- package/src/core/CoreNode.ts +67 -34
- package/src/core/CoreTextNode.ts +56 -0
- package/src/core/CoreTextureManager.ts +4 -2
- package/src/core/Stage.ts +32 -3
- package/src/core/lib/ContextSpy.ts +41 -0
- package/src/core/lib/ImageWorker.ts +124 -0
- package/src/core/lib/WebGlContextWrapper.ts +965 -0
- package/src/core/renderers/webgl/WebGlCoreCtxSubTexture.ts +3 -2
- package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +29 -28
- package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +10 -14
- package/src/core/renderers/webgl/WebGlCoreRenderer.ts +26 -24
- package/src/core/renderers/webgl/WebGlCoreShader.ts +34 -25
- package/src/core/renderers/webgl/internal/RendererUtils.ts +13 -16
- package/src/core/renderers/webgl/internal/ShaderUtils.ts +16 -15
- package/src/core/renderers/webgl/shaders/DefaultShader.ts +3 -7
- package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +3 -3
- package/src/core/renderers/webgl/shaders/DynamicShader.ts +42 -14
- package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +3 -3
- package/src/core/renderers/webgl/shaders/SdfShader.ts +3 -3
- package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +1 -1
- package/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.ts +35 -5
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +3 -3
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +9 -3
- package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +4 -2
- package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +25 -0
- package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +7 -7
- package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +115 -63
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +26 -18
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +40 -28
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +6 -1
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +205 -0
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/{makeRenderWindow.ts → setRenderWindow.ts} +50 -21
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +40 -0
- package/src/core/text-rendering/renderers/TextRenderer.ts +73 -0
- package/src/core/textures/ImageTexture.ts +17 -9
- package/src/core/utils.ts +87 -85
- package/src/env.d.ts +7 -0
- package/src/main-api/ICoreDriver.ts +2 -1
- package/src/main-api/RendererMain.ts +43 -5
- package/src/render-drivers/main/MainCoreDriver.ts +8 -5
- package/src/render-drivers/main/MainOnlyTextNode.ts +55 -1
- package/src/render-drivers/threadx/TextNodeStruct.ts +45 -0
- package/src/render-drivers/threadx/ThreadXCoreDriver.ts +10 -2
- package/src/render-drivers/threadx/ThreadXMainTextNode.ts +10 -0
- package/src/render-drivers/threadx/ThreadXRendererMessage.ts +5 -1
- package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +15 -0
- package/src/render-drivers/threadx/worker/renderer.ts +6 -4
- package/src/utils.ts +25 -4
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.test.ts +0 -136
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* If not stated otherwise in this file or this component's LICENSE file the
|
|
3
|
+
* following copyright and licenses apply:
|
|
4
|
+
*
|
|
5
|
+
* Copyright 2023 Comcast Cable Communications Management, LLC.
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the License);
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
* See the License for the specific language governing permissions and
|
|
17
|
+
* limitations under the License.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { expect, describe, it } from 'vitest';
|
|
21
|
+
import { setRenderWindow, type SdfRenderWindow } from './setRenderWindow.js';
|
|
22
|
+
|
|
23
|
+
function makeRenderWindow(): SdfRenderWindow {
|
|
24
|
+
return {
|
|
25
|
+
screen: { x1: 0, y1: 0, x2: 0, y2: 0 },
|
|
26
|
+
sdf: { x1: 0, y1: 0, x2: 0, y2: 0 },
|
|
27
|
+
firstLineIdx: 0,
|
|
28
|
+
numLines: 0,
|
|
29
|
+
valid: false,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
describe('setRenderWindow', () => {
|
|
34
|
+
it('should return a empty window when visibleWindow is empty', () => {
|
|
35
|
+
const rw = makeRenderWindow();
|
|
36
|
+
setRenderWindow(rw, 0, 0, 0, 10, 0, { x1: 0, y1: 0, x2: 0, y2: 0 }, 1);
|
|
37
|
+
expect(rw).toEqual({
|
|
38
|
+
screen: { x1: 0, y1: 0, x2: 0, y2: 0 },
|
|
39
|
+
sdf: { x1: 0, y1: 0, x2: 0, y2: 0 },
|
|
40
|
+
firstLineIdx: 0,
|
|
41
|
+
numLines: 0,
|
|
42
|
+
valid: true,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
setRenderWindow(
|
|
46
|
+
rw,
|
|
47
|
+
0,
|
|
48
|
+
0,
|
|
49
|
+
0,
|
|
50
|
+
20,
|
|
51
|
+
0,
|
|
52
|
+
{ x1: 100, y1: 100, x2: 100, y2: 100 },
|
|
53
|
+
2,
|
|
54
|
+
);
|
|
55
|
+
expect(rw).toEqual({
|
|
56
|
+
screen: { x1: 0, y1: 0, x2: 0, y2: 0 },
|
|
57
|
+
sdf: { x1: 0, y1: 0, x2: 0, y2: 0 },
|
|
58
|
+
firstLineIdx: 0,
|
|
59
|
+
numLines: 0,
|
|
60
|
+
valid: true,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
setRenderWindow(
|
|
64
|
+
rw,
|
|
65
|
+
100,
|
|
66
|
+
200,
|
|
67
|
+
300,
|
|
68
|
+
10,
|
|
69
|
+
30,
|
|
70
|
+
{ x1: 0, y1: 0, x2: 0, y2: 0 },
|
|
71
|
+
1,
|
|
72
|
+
);
|
|
73
|
+
expect(rw).toEqual({
|
|
74
|
+
screen: { x1: 0, y1: 0, x2: 0, y2: 0 },
|
|
75
|
+
sdf: { x1: 0, y1: 0, x2: 0, y2: 0 },
|
|
76
|
+
firstLineIdx: 0,
|
|
77
|
+
numLines: 0,
|
|
78
|
+
valid: true,
|
|
79
|
+
});
|
|
80
|
+
setRenderWindow(
|
|
81
|
+
rw,
|
|
82
|
+
400,
|
|
83
|
+
500,
|
|
84
|
+
100,
|
|
85
|
+
20,
|
|
86
|
+
40,
|
|
87
|
+
{
|
|
88
|
+
x1: 100,
|
|
89
|
+
y1: 100,
|
|
90
|
+
x2: 100,
|
|
91
|
+
y2: 100,
|
|
92
|
+
},
|
|
93
|
+
1,
|
|
94
|
+
),
|
|
95
|
+
expect(rw).toEqual({
|
|
96
|
+
screen: { x1: 0, y1: 0, x2: 0, y2: 0 },
|
|
97
|
+
sdf: { x1: 0, y1: 0, x2: 0, y2: 0 },
|
|
98
|
+
firstLineIdx: 0,
|
|
99
|
+
numLines: 0,
|
|
100
|
+
valid: true,
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('should return a window with no margin around the visible area if lineHeight and/or bufferMargin set are zero', () => {
|
|
105
|
+
const rw = makeRenderWindow();
|
|
106
|
+
|
|
107
|
+
setRenderWindow(rw, 0, 0, 0, 10, 0, { x1: 0, y1: 0, x2: 100, y2: 100 }, 1),
|
|
108
|
+
expect(rw).toEqual({
|
|
109
|
+
screen: { x1: 0, y1: 0, x2: 100, y2: 100 },
|
|
110
|
+
sdf: { x1: 0, y1: 0, x2: 100, y2: 100 },
|
|
111
|
+
firstLineIdx: 0,
|
|
112
|
+
numLines: 10,
|
|
113
|
+
valid: true,
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
setRenderWindow(rw, 0, 0, 0, 10, 0, { x1: 0, y1: 0, x2: 200, y2: 205 }, 2);
|
|
117
|
+
expect(rw).toEqual({
|
|
118
|
+
screen: { x1: 0, y1: 0, x2: 200, y2: 210 },
|
|
119
|
+
sdf: { x1: 0, y1: 0, x2: 100, y2: 105 },
|
|
120
|
+
firstLineIdx: 0,
|
|
121
|
+
numLines: 21,
|
|
122
|
+
valid: true,
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('should return a window with a margin around the visible area (if boundsMargin set)', () => {
|
|
127
|
+
const rw = makeRenderWindow();
|
|
128
|
+
|
|
129
|
+
setRenderWindow(
|
|
130
|
+
rw,
|
|
131
|
+
0,
|
|
132
|
+
0,
|
|
133
|
+
0,
|
|
134
|
+
10,
|
|
135
|
+
100,
|
|
136
|
+
{ x1: 0, y1: 0, x2: 100, y2: 100 },
|
|
137
|
+
1,
|
|
138
|
+
),
|
|
139
|
+
expect(rw).toEqual({
|
|
140
|
+
screen: { x1: 0, y1: -100, x2: 100, y2: 200 },
|
|
141
|
+
sdf: { x1: 0, y1: -100, x2: 100, y2: 200 },
|
|
142
|
+
firstLineIdx: -10,
|
|
143
|
+
numLines: 30,
|
|
144
|
+
valid: true,
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
setRenderWindow(
|
|
148
|
+
rw,
|
|
149
|
+
0,
|
|
150
|
+
0,
|
|
151
|
+
0,
|
|
152
|
+
10,
|
|
153
|
+
200,
|
|
154
|
+
{ x1: 0, y1: 0, x2: 200, y2: 200 },
|
|
155
|
+
1,
|
|
156
|
+
);
|
|
157
|
+
expect(rw).toEqual({
|
|
158
|
+
screen: { x1: 0, y1: -200, x2: 200, y2: 400 },
|
|
159
|
+
sdf: { x1: 0, y1: -200, x2: 200, y2: 400 },
|
|
160
|
+
firstLineIdx: -20,
|
|
161
|
+
numLines: 60,
|
|
162
|
+
valid: true,
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('should return a window scrolled to scrollY when set', () => {
|
|
167
|
+
const rw = makeRenderWindow();
|
|
168
|
+
|
|
169
|
+
setRenderWindow(
|
|
170
|
+
rw,
|
|
171
|
+
0,
|
|
172
|
+
0,
|
|
173
|
+
100,
|
|
174
|
+
10,
|
|
175
|
+
100,
|
|
176
|
+
{ x1: 0, y1: 0, x2: 100, y2: 100 },
|
|
177
|
+
1,
|
|
178
|
+
),
|
|
179
|
+
expect(rw).toEqual({
|
|
180
|
+
screen: { x1: 0, y1: 0, x2: 100, y2: 300 },
|
|
181
|
+
sdf: { x1: 0, y1: 0, x2: 100, y2: 300 },
|
|
182
|
+
firstLineIdx: 0,
|
|
183
|
+
numLines: 30,
|
|
184
|
+
valid: true,
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
setRenderWindow(
|
|
188
|
+
rw,
|
|
189
|
+
0,
|
|
190
|
+
0,
|
|
191
|
+
105,
|
|
192
|
+
10,
|
|
193
|
+
100,
|
|
194
|
+
{ x1: 0, y1: 0, x2: 100, y2: 100 },
|
|
195
|
+
1,
|
|
196
|
+
),
|
|
197
|
+
expect(rw).toEqual({
|
|
198
|
+
screen: { x1: 0, y1: 0, x2: 100, y2: 310 },
|
|
199
|
+
sdf: { x1: 0, y1: 0, x2: 100, y2: 310 },
|
|
200
|
+
firstLineIdx: 0,
|
|
201
|
+
numLines: 31,
|
|
202
|
+
valid: true,
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
});
|
|
@@ -19,6 +19,15 @@
|
|
|
19
19
|
|
|
20
20
|
import { isBoundPositive, type Bound } from '../../../../lib/utils.js';
|
|
21
21
|
import type { TrProps } from '../../TextRenderer.js';
|
|
22
|
+
import { roundDownToMultiple, roundUpToMultiple } from './util.js';
|
|
23
|
+
|
|
24
|
+
export interface SdfRenderWindow {
|
|
25
|
+
screen: Bound;
|
|
26
|
+
sdf: Bound;
|
|
27
|
+
firstLineIdx: number;
|
|
28
|
+
numLines: number;
|
|
29
|
+
valid: boolean;
|
|
30
|
+
}
|
|
22
31
|
|
|
23
32
|
/**
|
|
24
33
|
* Create a render window from the given parameters.
|
|
@@ -32,33 +41,53 @@ import type { TrProps } from '../../TextRenderer.js';
|
|
|
32
41
|
* @param x The x coordinate of the text element's top left corner relative to the screen.
|
|
33
42
|
* @param y The y coordinate of the text element's top left corner relative to the screen.
|
|
34
43
|
* @param scrollY The amount of pixels to scroll the text vertically.
|
|
35
|
-
* @param lineHeight The
|
|
36
|
-
* @param numExtraLines The number of extra lines to render above and below the visible window.
|
|
44
|
+
* @param lineHeight The number of extra lines to render above and below the visible window.
|
|
37
45
|
* @param visibleWindow The visible window of the text element relative to the screen
|
|
38
46
|
* @returns
|
|
39
47
|
*/
|
|
40
|
-
export function
|
|
48
|
+
export function setRenderWindow(
|
|
49
|
+
outRenderWindow: SdfRenderWindow,
|
|
41
50
|
x: TrProps['x'],
|
|
42
51
|
y: TrProps['y'],
|
|
43
52
|
scrollY: TrProps['scrollY'],
|
|
44
53
|
lineHeight: number,
|
|
45
|
-
|
|
54
|
+
bufferMargin: number,
|
|
46
55
|
visibleWindow: Bound,
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
56
|
+
fontSizeRatio: number,
|
|
57
|
+
): void {
|
|
58
|
+
const { screen, sdf } = outRenderWindow;
|
|
59
|
+
if (!isBoundPositive(visibleWindow)) {
|
|
60
|
+
screen.x1 = 0;
|
|
61
|
+
screen.y1 = 0;
|
|
62
|
+
screen.x2 = 0;
|
|
63
|
+
screen.y2 = 0;
|
|
64
|
+
sdf.x1 = 0;
|
|
65
|
+
sdf.y1 = 0;
|
|
66
|
+
sdf.x2 = 0;
|
|
67
|
+
sdf.y2 = 0;
|
|
68
|
+
outRenderWindow.numLines = 0;
|
|
69
|
+
outRenderWindow.firstLineIdx = 0;
|
|
70
|
+
} else {
|
|
71
|
+
const x1 = visibleWindow.x1 - x;
|
|
72
|
+
const x2 = x1 + (visibleWindow.x2 - visibleWindow.x1);
|
|
73
|
+
const y1Base = visibleWindow.y1 - y + scrollY;
|
|
74
|
+
const y1 = roundDownToMultiple(y1Base - bufferMargin, lineHeight || 1);
|
|
75
|
+
const y2 = roundUpToMultiple(
|
|
76
|
+
y1Base + (visibleWindow.y2 - visibleWindow.y1) + bufferMargin,
|
|
77
|
+
lineHeight || 1,
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
screen.x1 = x1;
|
|
81
|
+
screen.y1 = y1;
|
|
82
|
+
screen.x2 = x2;
|
|
83
|
+
screen.y2 = y2;
|
|
84
|
+
sdf.x1 = x1 / fontSizeRatio;
|
|
85
|
+
sdf.y1 = y1 / fontSizeRatio;
|
|
86
|
+
sdf.x2 = x2 / fontSizeRatio;
|
|
87
|
+
sdf.y2 = y2 / fontSizeRatio;
|
|
88
|
+
|
|
89
|
+
outRenderWindow.numLines = Math.ceil((y2 - y1) / lineHeight);
|
|
90
|
+
outRenderWindow.firstLineIdx = Math.floor(y1 / lineHeight);
|
|
91
|
+
}
|
|
92
|
+
outRenderWindow.valid = true;
|
|
64
93
|
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* If not stated otherwise in this file or this component's LICENSE file the
|
|
3
|
+
* following copyright and licenses apply:
|
|
4
|
+
*
|
|
5
|
+
* Copyright 2023 Comcast Cable Communications Management, LLC.
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the License);
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
* See the License for the specific language governing permissions and
|
|
17
|
+
* limitations under the License.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Round up to the nearest multiple of the given number.
|
|
22
|
+
*
|
|
23
|
+
* @param value
|
|
24
|
+
* @param multiple
|
|
25
|
+
* @returns
|
|
26
|
+
*/
|
|
27
|
+
export function roundUpToMultiple(value: number, multiple: number) {
|
|
28
|
+
return Math.ceil(value / multiple) * multiple;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Round down to the nearest multiple of the given number.
|
|
33
|
+
*
|
|
34
|
+
* @param value
|
|
35
|
+
* @param multiple
|
|
36
|
+
* @returns
|
|
37
|
+
*/
|
|
38
|
+
export function roundDownToMultiple(value: number, multiple: number) {
|
|
39
|
+
return Math.floor(value / multiple) * multiple;
|
|
40
|
+
}
|
|
@@ -25,6 +25,10 @@ import type {
|
|
|
25
25
|
TrFontFace,
|
|
26
26
|
TrFontFaceDescriptors,
|
|
27
27
|
} from '../font-face-types/TrFontFace.js';
|
|
28
|
+
import type {
|
|
29
|
+
TextBaseline,
|
|
30
|
+
TextVerticalAlign,
|
|
31
|
+
} from './LightningTextTextureRenderer.js';
|
|
28
32
|
|
|
29
33
|
/**
|
|
30
34
|
* Augmentable map of text renderer type IDs to text renderer types.
|
|
@@ -244,6 +248,56 @@ export interface TrProps extends TrFontProps {
|
|
|
244
248
|
* @default 0
|
|
245
249
|
*/
|
|
246
250
|
letterSpacing: number;
|
|
251
|
+
/**
|
|
252
|
+
* Line height for text (in pixels)
|
|
253
|
+
*
|
|
254
|
+
* @remarks
|
|
255
|
+
* This property sets the height of each line.
|
|
256
|
+
*
|
|
257
|
+
* @default 0
|
|
258
|
+
*/
|
|
259
|
+
lineHeight: number;
|
|
260
|
+
/**
|
|
261
|
+
* Max lines for text
|
|
262
|
+
*
|
|
263
|
+
* @remarks
|
|
264
|
+
* This property sets max number of lines of a text paragraph.
|
|
265
|
+
* Not yet implemented in the SDF renderer.
|
|
266
|
+
*
|
|
267
|
+
* @default 0
|
|
268
|
+
*/
|
|
269
|
+
maxLines: number;
|
|
270
|
+
/**
|
|
271
|
+
* Baseline for text
|
|
272
|
+
*
|
|
273
|
+
* @remarks
|
|
274
|
+
* This property sets the text baseline used when drawing text.
|
|
275
|
+
* Not yet implemented in the SDF renderer.
|
|
276
|
+
*
|
|
277
|
+
* @default alphabetic
|
|
278
|
+
*/
|
|
279
|
+
textBaseline: TextBaseline;
|
|
280
|
+
/**
|
|
281
|
+
* Vertical Align for text when lineHeight > fontSize
|
|
282
|
+
*
|
|
283
|
+
* @remarks
|
|
284
|
+
* This property sets the vertical align of the text.
|
|
285
|
+
* Not yet implemented in the SDF renderer.
|
|
286
|
+
*
|
|
287
|
+
* @default middle
|
|
288
|
+
*/
|
|
289
|
+
verticalAlign: TextVerticalAlign;
|
|
290
|
+
/**
|
|
291
|
+
* Overflow Suffix for text
|
|
292
|
+
*
|
|
293
|
+
* @remarks
|
|
294
|
+
* The suffix to be added when text is cropped due to overflow.
|
|
295
|
+
* Not yet implemented in the SDF renderer.
|
|
296
|
+
*
|
|
297
|
+
* @default "..."
|
|
298
|
+
*/
|
|
299
|
+
overflowSuffix: string;
|
|
300
|
+
|
|
247
301
|
zIndex: number;
|
|
248
302
|
debug: Partial<TextRendererDebugProps>;
|
|
249
303
|
}
|
|
@@ -307,6 +361,21 @@ const trPropSetterDefaults: TrPropSetters = {
|
|
|
307
361
|
letterSpacing: (state, value) => {
|
|
308
362
|
state.props.letterSpacing = value;
|
|
309
363
|
},
|
|
364
|
+
lineHeight: (state, value) => {
|
|
365
|
+
state.props.lineHeight = value;
|
|
366
|
+
},
|
|
367
|
+
maxLines: (state, value) => {
|
|
368
|
+
state.props.maxLines = value;
|
|
369
|
+
},
|
|
370
|
+
textBaseline: (state, value) => {
|
|
371
|
+
state.props.textBaseline = value;
|
|
372
|
+
},
|
|
373
|
+
verticalAlign: (state, value) => {
|
|
374
|
+
state.props.verticalAlign = value;
|
|
375
|
+
},
|
|
376
|
+
overflowSuffix: (state, value) => {
|
|
377
|
+
state.props.overflowSuffix = value;
|
|
378
|
+
},
|
|
310
379
|
debug: (state, value) => {
|
|
311
380
|
state.props.debug = value;
|
|
312
381
|
},
|
|
@@ -348,6 +417,10 @@ export abstract class TextRenderer<
|
|
|
348
417
|
(state: StateT, value: TrProps[keyof TrProps]) => {
|
|
349
418
|
if (state.props[key as keyof TrProps] !== value) {
|
|
350
419
|
setter(state, value as never);
|
|
420
|
+
// Assume any prop change will require a render
|
|
421
|
+
// This is required because otherwise a paused RAF will result
|
|
422
|
+
// in renders when text props are changed.
|
|
423
|
+
this.stage.requestRender();
|
|
351
424
|
}
|
|
352
425
|
},
|
|
353
426
|
];
|
|
@@ -83,15 +83,23 @@ export class ImageTexture extends Texture {
|
|
|
83
83
|
premultiplyAlpha,
|
|
84
84
|
};
|
|
85
85
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
premultiplyAlpha
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
86
|
+
|
|
87
|
+
if (this.txManager.imageWorkerManager.imageWorkersEnabled) {
|
|
88
|
+
return await this.txManager.imageWorkerManager.getImage(
|
|
89
|
+
src,
|
|
90
|
+
premultiplyAlpha,
|
|
91
|
+
);
|
|
92
|
+
} else {
|
|
93
|
+
const response = await fetch(src);
|
|
94
|
+
const blob = await response.blob();
|
|
95
|
+
return {
|
|
96
|
+
data: await createImageBitmap(blob, {
|
|
97
|
+
premultiplyAlpha: premultiplyAlpha ? 'premultiply' : 'none',
|
|
98
|
+
colorSpaceConversion: 'none',
|
|
99
|
+
imageOrientation: 'none',
|
|
100
|
+
}),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
95
103
|
}
|
|
96
104
|
|
|
97
105
|
static override makeCacheKey(props: ImageTextureProps): string | false {
|
package/src/core/utils.ts
CHANGED
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
* @module
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
|
+
import memo from 'memize';
|
|
27
|
+
|
|
26
28
|
export const EPSILON = 0.000001;
|
|
27
29
|
export let ARRAY_TYPE =
|
|
28
30
|
typeof Float32Array !== 'undefined' ? Float32Array : Array;
|
|
@@ -119,97 +121,97 @@ const getTimingBezier = (
|
|
|
119
121
|
};
|
|
120
122
|
};
|
|
121
123
|
|
|
122
|
-
export const getTimingFunction = (
|
|
123
|
-
str: string
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
.
|
|
183
|
-
|
|
124
|
+
export const getTimingFunction = memo(
|
|
125
|
+
(str: string): ((time: number) => number | undefined) => {
|
|
126
|
+
switch (str) {
|
|
127
|
+
case 'linear':
|
|
128
|
+
return function (time: number) {
|
|
129
|
+
return time;
|
|
130
|
+
};
|
|
131
|
+
case 'ease':
|
|
132
|
+
return getTimingBezier(0.25, 0.1, 0.25, 1.0);
|
|
133
|
+
|
|
134
|
+
case 'ease-in':
|
|
135
|
+
return getTimingBezier(0.42, 0, 1.0, 1.0);
|
|
136
|
+
case 'ease-out':
|
|
137
|
+
return getTimingBezier(0, 0, 0.58, 1.0);
|
|
138
|
+
case 'ease-in-out':
|
|
139
|
+
return getTimingBezier(0.42, 0, 0.58, 1.0);
|
|
140
|
+
|
|
141
|
+
case 'ease-in-sine':
|
|
142
|
+
return getTimingBezier(0.12, 0, 0.39, 0);
|
|
143
|
+
case 'ease-out-sine':
|
|
144
|
+
return getTimingBezier(0.12, 0, 0.39, 0);
|
|
145
|
+
case 'ease-in-out-sine':
|
|
146
|
+
return getTimingBezier(0.37, 0, 0.63, 1);
|
|
147
|
+
|
|
148
|
+
case 'ease-in-cubic':
|
|
149
|
+
return getTimingBezier(0.32, 0, 0.67, 0);
|
|
150
|
+
case 'ease-out-cubic':
|
|
151
|
+
return getTimingBezier(0.33, 1, 0.68, 1);
|
|
152
|
+
case 'ease-in-out-cubic':
|
|
153
|
+
return getTimingBezier(0.65, 0, 0.35, 1);
|
|
154
|
+
|
|
155
|
+
case 'ease-in-circ':
|
|
156
|
+
return getTimingBezier(0.55, 0, 1, 0.45);
|
|
157
|
+
case 'ease-out-circ':
|
|
158
|
+
return getTimingBezier(0, 0.55, 0.45, 1);
|
|
159
|
+
case 'ease-in-out-circ':
|
|
160
|
+
return getTimingBezier(0.85, 0, 0.15, 1);
|
|
161
|
+
|
|
162
|
+
case 'ease-in-back':
|
|
163
|
+
return getTimingBezier(0.36, 0, 0.66, -0.56);
|
|
164
|
+
case 'ease-out-back':
|
|
165
|
+
return getTimingBezier(0.34, 1.56, 0.64, 1);
|
|
166
|
+
case 'ease-in-out-back':
|
|
167
|
+
return getTimingBezier(0.68, -0.6, 0.32, 1.6);
|
|
168
|
+
|
|
169
|
+
case 'step-start':
|
|
170
|
+
return function () {
|
|
171
|
+
return 1;
|
|
172
|
+
};
|
|
173
|
+
case 'step-end':
|
|
174
|
+
return function (time: number) {
|
|
175
|
+
return time === 1 ? 1 : 0;
|
|
176
|
+
};
|
|
177
|
+
default:
|
|
178
|
+
// eslint-disable-next-line no-case-declarations
|
|
179
|
+
const s = 'cubic-bezier(';
|
|
180
|
+
if (str && str.indexOf(s) === 0) {
|
|
181
|
+
const parts = str
|
|
182
|
+
.substr(s.length, str.length - s.length - 1)
|
|
183
|
+
.split(',');
|
|
184
|
+
if (parts.length !== 4) {
|
|
185
|
+
console.warn('Unknown timing function: ' + str);
|
|
186
|
+
// Fallback: use linear.
|
|
187
|
+
return function (time) {
|
|
188
|
+
return time;
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
const a = parseFloat(parts[0] || '0.42');
|
|
192
|
+
const b = parseFloat(parts[1] || '0');
|
|
193
|
+
const c = parseFloat(parts[2] || '1');
|
|
194
|
+
const d = parseFloat(parts[3] || '1');
|
|
195
|
+
|
|
196
|
+
if (isNaN(a) || isNaN(b) || isNaN(c) || isNaN(d)) {
|
|
197
|
+
console.warn(' Unknown timing function: ' + str);
|
|
198
|
+
// Fallback: use linear.
|
|
199
|
+
return function (time) {
|
|
200
|
+
return time;
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return getTimingBezier(a, b, c, d);
|
|
205
|
+
} else {
|
|
184
206
|
console.warn('Unknown timing function: ' + str);
|
|
185
207
|
// Fallback: use linear.
|
|
186
208
|
return function (time) {
|
|
187
209
|
return time;
|
|
188
210
|
};
|
|
189
211
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
const d = parseFloat(parts[3] || '1');
|
|
194
|
-
|
|
195
|
-
if (isNaN(a) || isNaN(b) || isNaN(c) || isNaN(d)) {
|
|
196
|
-
console.warn(' Unknown timing function: ' + str);
|
|
197
|
-
// Fallback: use linear.
|
|
198
|
-
return function (time) {
|
|
199
|
-
return time;
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
return getTimingBezier(a, b, c, d);
|
|
204
|
-
} else {
|
|
205
|
-
console.warn('Unknown timing function: ' + str);
|
|
206
|
-
// Fallback: use linear.
|
|
207
|
-
return function (time) {
|
|
208
|
-
return time;
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
};
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
);
|
|
213
215
|
|
|
214
216
|
if (!Math.hypot)
|
|
215
217
|
Math.hypot = (...args: number[]) => {
|
package/src/env.d.ts
ADDED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* limitations under the License.
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
+
import type { FpsUpdatePayload } from '../common/CommonTypes.js';
|
|
20
21
|
import type {
|
|
21
22
|
INode,
|
|
22
23
|
INodeWritableProps,
|
|
@@ -56,5 +57,5 @@ export interface ICoreDriver {
|
|
|
56
57
|
|
|
57
58
|
onBeforeDestroyNode(node: INode): void;
|
|
58
59
|
|
|
59
|
-
onFpsUpdate(
|
|
60
|
+
onFpsUpdate(fpsData: FpsUpdatePayload): void;
|
|
60
61
|
}
|