@lightningjs/renderer 3.0.0-beta21 → 3.0.0-beta22
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/exports/index.d.ts +1 -0
- package/dist/exports/index.js +1 -0
- package/dist/exports/index.js.map +1 -1
- package/dist/src/common/CommonTypes.d.ts +2 -1
- package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +3 -2
- package/dist/src/core/renderers/webgl/WebGlRenderOp.js +3 -1
- package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +8 -24
- package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +8 -25
- package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
- package/dist/src/core/shaders/webgl/Border.js +7 -13
- package/dist/src/core/shaders/webgl/Border.js.map +1 -1
- package/dist/src/core/shaders/webgl/RoundedWithBorder.js +6 -17
- package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
- package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +4 -8
- package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
- package/dist/src/core/text-rendering/CanvasFont.d.ts +14 -0
- package/dist/src/core/text-rendering/CanvasFont.js +115 -0
- package/dist/src/core/text-rendering/CanvasFont.js.map +1 -0
- package/dist/src/core/text-rendering/CoreFont.d.ts +33 -0
- package/dist/src/core/text-rendering/CoreFont.js +48 -0
- package/dist/src/core/text-rendering/CoreFont.js.map +1 -0
- package/dist/src/core/text-rendering/FontManager.d.ts +11 -0
- package/dist/src/core/text-rendering/FontManager.js +41 -0
- package/dist/src/core/text-rendering/FontManager.js.map +1 -0
- package/dist/src/core/text-rendering/SdfFont.d.ts +29 -0
- package/dist/src/core/text-rendering/SdfFont.js +142 -0
- package/dist/src/core/text-rendering/SdfFont.js.map +1 -0
- package/dist/src/core/textures/Texture.d.ts +4 -3
- package/dist/src/core/textures/Texture.js.map +1 -1
- package/dist/src/core/utils.d.ts +1 -1
- package/dist/src/main-api/Inspector.d.ts +4 -0
- package/dist/src/main-api/Inspector.js +160 -0
- package/dist/src/main-api/Inspector.js.map +1 -1
- package/dist/tsconfig.dist.tsbuildinfo +1 -1
- package/exports/index.ts +5 -0
- package/package.json +1 -1
- package/src/common/CommonTypes.ts +2 -1
- package/src/core/shaders/webgl/Border.ts +7 -13
- package/src/core/shaders/webgl/RoundedWithBorder.ts +6 -17
- package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +4 -8
- package/src/core/textures/Texture.ts +10 -6
- package/src/main-api/Inspector.ts +215 -0
- package/dist/src/core/animations/Animation.d.ts +0 -21
- package/dist/src/core/animations/Animation.js +0 -194
- package/dist/src/core/animations/Animation.js.map +0 -1
- package/dist/src/core/animations/Playback.d.ts +0 -64
- package/dist/src/core/animations/Playback.js +0 -169
- package/dist/src/core/animations/Playback.js.map +0 -1
- package/dist/src/core/animations/Transition.d.ts +0 -27
- package/dist/src/core/animations/Transition.js +0 -52
- package/dist/src/core/animations/Transition.js.map +0 -1
- package/dist/src/core/animations/utils.d.ts +0 -2
- package/dist/src/core/animations/utils.js +0 -136
- package/dist/src/core/animations/utils.js.map +0 -1
- package/dist/src/core/shaders/webgl/SdfShadowShader.d.ts +0 -9
- package/dist/src/core/shaders/webgl/SdfShadowShader.js +0 -100
- package/dist/src/core/shaders/webgl/SdfShadowShader.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export class CoreFontManager {
|
|
2
|
+
fonts = Object.create(null);
|
|
3
|
+
renderers = Object.create(null);
|
|
4
|
+
constructor(stage, textRenderers) {
|
|
5
|
+
for (let i = 0; i < textRenderers.length; i++) {
|
|
6
|
+
const renderer = textRenderers[i];
|
|
7
|
+
this.renderers[renderer.type] = renderer;
|
|
8
|
+
renderer.init(stage, this);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
loadFont(type, options) {
|
|
12
|
+
const targetRenderer = this.renderers[type];
|
|
13
|
+
if (targetRenderer === undefined) {
|
|
14
|
+
console.error('renderer type for this font does not exist');
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const font = targetRenderer.createFont(options);
|
|
18
|
+
if (font === undefined) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
font.load();
|
|
22
|
+
this.fonts[options.fontFamily] = font;
|
|
23
|
+
}
|
|
24
|
+
unloadFont(fontFamily) {
|
|
25
|
+
const targetFont = this.fonts[fontFamily];
|
|
26
|
+
if (targetFont === undefined) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
targetFont.destroy();
|
|
30
|
+
delete this.fonts[fontFamily];
|
|
31
|
+
}
|
|
32
|
+
getFont(fontFamily) {
|
|
33
|
+
const font = this.fonts[fontFamily];
|
|
34
|
+
if (font === undefined) {
|
|
35
|
+
console.warn('fontFamily not registered');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
return font;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=FontManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FontManager.js","sourceRoot":"","sources":["../../../../src/core/text-rendering/FontManager.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,eAAe;IAClB,KAAK,GAA6B,MAAM,CAAC,MAAM,CAAC,IAAI,CAG3D,CAAC;IACM,SAAS,GAAiC,MAAM,CAAC,MAAM,CAC7D,IAAI,CAC2B,CAAC;IAElC,YAAY,KAAY,EAAE,aAA6B;QACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAE,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,IAAmB,EAAE,OAAwB;QACpD,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IACxC,CAAC;IAED,UAAU,CAAC,UAAkB;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,UAAU,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,CAAC,UAAkB;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Stage } from '../Stage.js';
|
|
2
|
+
import type { ImageTexture } from '../textures/ImageTexture.js';
|
|
3
|
+
import { CoreFont, type CoreFontProps } from './CoreFont.js';
|
|
4
|
+
import { type SdfFontData } from './SdfFontHandler.js';
|
|
5
|
+
import type { NormalizedFontMetrics, TextRenderer } from './TextRenderer.js';
|
|
6
|
+
export type SdfFontProps = CoreFontProps & {
|
|
7
|
+
atlasUrl: string;
|
|
8
|
+
atlasDataUrl: string;
|
|
9
|
+
};
|
|
10
|
+
export declare class SdfFont extends CoreFont {
|
|
11
|
+
private stage;
|
|
12
|
+
type: string;
|
|
13
|
+
atlasUrl: string;
|
|
14
|
+
atlasDataUrl: string;
|
|
15
|
+
atlasTexture?: ImageTexture;
|
|
16
|
+
private glyphMap?;
|
|
17
|
+
private kerningTable?;
|
|
18
|
+
private data?;
|
|
19
|
+
constructor(textRenderer: TextRenderer, props: SdfFontProps, stage: Stage);
|
|
20
|
+
load(): void;
|
|
21
|
+
private hardFail;
|
|
22
|
+
private processFontData;
|
|
23
|
+
measureText(text: string, letterSpacing: number): number;
|
|
24
|
+
getMetrics(fontSize: number): NormalizedFontMetrics;
|
|
25
|
+
getGlyph(codepoint: number): import("./SdfFontHandler.js").SdfGlyph | null;
|
|
26
|
+
getKerning(firstGlyph: number, secondGlyph: number): number;
|
|
27
|
+
getAtlas(): ImageTexture;
|
|
28
|
+
getData(): SdfFontData;
|
|
29
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
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 2025 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
|
+
import { CoreFont, FontState } from './CoreFont.js';
|
|
20
|
+
import { buildGlyphMap, buildKerningTable, } from './SdfFontHandler.js';
|
|
21
|
+
import { normalizeFontMetrics } from './TextLayoutEngine.js';
|
|
22
|
+
import { hasZeroWidthSpace } from './Utils.js';
|
|
23
|
+
export class SdfFont extends CoreFont {
|
|
24
|
+
stage;
|
|
25
|
+
type = 'sdf';
|
|
26
|
+
atlasUrl;
|
|
27
|
+
atlasDataUrl;
|
|
28
|
+
atlasTexture;
|
|
29
|
+
glyphMap;
|
|
30
|
+
kerningTable;
|
|
31
|
+
data;
|
|
32
|
+
constructor(textRenderer, props, stage) {
|
|
33
|
+
super(textRenderer, props);
|
|
34
|
+
this.stage = stage;
|
|
35
|
+
this.atlasUrl = props.atlasUrl;
|
|
36
|
+
this.atlasDataUrl = props.atlasDataUrl;
|
|
37
|
+
}
|
|
38
|
+
load() {
|
|
39
|
+
new Promise(async () => {
|
|
40
|
+
const atlasData = await fetch(this.atlasDataUrl);
|
|
41
|
+
if (atlasData.ok === false) {
|
|
42
|
+
this.hardFail(`Failed to load font data: ${atlasData.statusText}`);
|
|
43
|
+
}
|
|
44
|
+
const fontData = (await atlasData.json());
|
|
45
|
+
if (fontData.chars === undefined) {
|
|
46
|
+
this.hardFail('Invalid SDF font data format');
|
|
47
|
+
}
|
|
48
|
+
const atlasTexture = this.stage.txManager.createTexture('ImageTexture', {
|
|
49
|
+
src: this.atlasUrl,
|
|
50
|
+
premultiplyAlpha: false,
|
|
51
|
+
});
|
|
52
|
+
atlasTexture.setRenderableOwner(this.family, true);
|
|
53
|
+
atlasTexture.preventCleanup = true;
|
|
54
|
+
atlasTexture.on('loaded', () => {
|
|
55
|
+
this.onLoaded();
|
|
56
|
+
});
|
|
57
|
+
atlasTexture.on('failed', (error) => {
|
|
58
|
+
console.error(`Failed to load SDF font: ${this.family}`, error);
|
|
59
|
+
this.emit('failed');
|
|
60
|
+
});
|
|
61
|
+
this.atlasTexture = atlasTexture;
|
|
62
|
+
this.processFontData(fontData);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
hardFail(message) {
|
|
66
|
+
this.state = FontState.Failed;
|
|
67
|
+
throw new Error(message);
|
|
68
|
+
}
|
|
69
|
+
processFontData(fontData) {
|
|
70
|
+
this.glyphMap = buildGlyphMap(fontData.chars);
|
|
71
|
+
this.kerningTable = buildKerningTable(fontData.kernings);
|
|
72
|
+
this.metrics = this.metrics ||
|
|
73
|
+
fontData.lightningMetrics || {
|
|
74
|
+
ascender: 800,
|
|
75
|
+
descender: -200,
|
|
76
|
+
lineGap: 200,
|
|
77
|
+
unitsPerEm: 1000,
|
|
78
|
+
};
|
|
79
|
+
this.data = fontData;
|
|
80
|
+
}
|
|
81
|
+
measureText(text, letterSpacing) {
|
|
82
|
+
if (text.length === 1) {
|
|
83
|
+
const char = text.charAt(0);
|
|
84
|
+
const codepoint = text.codePointAt(0);
|
|
85
|
+
if (codepoint === undefined)
|
|
86
|
+
return 0;
|
|
87
|
+
if (hasZeroWidthSpace(char) === true)
|
|
88
|
+
return 0;
|
|
89
|
+
const glyph = this.getGlyph(codepoint);
|
|
90
|
+
if (glyph === null)
|
|
91
|
+
return 0;
|
|
92
|
+
return glyph.xadvance + letterSpacing;
|
|
93
|
+
}
|
|
94
|
+
let width = 0;
|
|
95
|
+
let prevCodepoint = 0;
|
|
96
|
+
for (let i = 0; i < text.length; i++) {
|
|
97
|
+
const char = text.charAt(i);
|
|
98
|
+
const codepoint = text.codePointAt(i);
|
|
99
|
+
if (codepoint === undefined)
|
|
100
|
+
continue;
|
|
101
|
+
// Skip zero-width spaces in width calculations
|
|
102
|
+
if (hasZeroWidthSpace(char)) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const glyph = this.getGlyph(codepoint);
|
|
106
|
+
if (glyph === null)
|
|
107
|
+
continue;
|
|
108
|
+
let advance = glyph.xadvance;
|
|
109
|
+
// Add kerning if there's a previous character
|
|
110
|
+
if (prevCodepoint !== 0) {
|
|
111
|
+
const kerning = this.getKerning(prevCodepoint, codepoint);
|
|
112
|
+
advance += kerning;
|
|
113
|
+
}
|
|
114
|
+
width += advance + letterSpacing;
|
|
115
|
+
prevCodepoint = codepoint;
|
|
116
|
+
}
|
|
117
|
+
return width;
|
|
118
|
+
}
|
|
119
|
+
getMetrics(fontSize) {
|
|
120
|
+
let m = this.normalizedMetrics[fontSize];
|
|
121
|
+
if (m !== undefined) {
|
|
122
|
+
return m;
|
|
123
|
+
}
|
|
124
|
+
m = this.normalizedMetrics[fontSize] = normalizeFontMetrics(this.metrics, fontSize);
|
|
125
|
+
return m;
|
|
126
|
+
}
|
|
127
|
+
getGlyph(codepoint) {
|
|
128
|
+
const gm = this.glyphMap;
|
|
129
|
+
return gm[codepoint] || gm[63] || null;
|
|
130
|
+
}
|
|
131
|
+
getKerning(firstGlyph, secondGlyph) {
|
|
132
|
+
const seconds = this.kerningTable[secondGlyph];
|
|
133
|
+
return (seconds !== undefined && seconds[firstGlyph]) || 0;
|
|
134
|
+
}
|
|
135
|
+
getAtlas() {
|
|
136
|
+
return this.atlasTexture;
|
|
137
|
+
}
|
|
138
|
+
getData() {
|
|
139
|
+
return this.data;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=SdfFont.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SdfFont.js","sourceRoot":"","sources":["../../../../src/core/text-rendering/SdfFont.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import type { Dimensions } from '../../common/CommonTypes.js';
|
|
|
4
4
|
import { EventEmitter } from '../../common/EventEmitter.js';
|
|
5
5
|
import type { CoreContextTexture } from '../renderers/CoreContextTexture.js';
|
|
6
6
|
import type { Bound } from '../lib/utils.js';
|
|
7
|
+
import type { TextureError } from '../TextureError.js';
|
|
7
8
|
/**
|
|
8
9
|
* Event handler for when a Texture is freed
|
|
9
10
|
*/
|
|
@@ -54,7 +55,7 @@ export interface CompressedData {
|
|
|
54
55
|
/**
|
|
55
56
|
* Event handler for when a Texture fails to load
|
|
56
57
|
*/
|
|
57
|
-
export type TextureFailedEventHandler = (target: any, error:
|
|
58
|
+
export type TextureFailedEventHandler = (target: any, error: TextureError) => void;
|
|
58
59
|
/**
|
|
59
60
|
* TextureData that is used to populate a CoreContextTexture
|
|
60
61
|
*/
|
|
@@ -135,7 +136,7 @@ export declare abstract class Texture extends EventEmitter {
|
|
|
135
136
|
private static readonly STARTUP_GRACE_PERIOD;
|
|
136
137
|
constructor(txManager: CoreTextureManager);
|
|
137
138
|
get dimensions(): Dimensions | null;
|
|
138
|
-
get error():
|
|
139
|
+
get error(): TextureError | null;
|
|
139
140
|
/**
|
|
140
141
|
* Checks if the texture is within the startup grace period.
|
|
141
142
|
* During this period, textures are protected from cleanup to prevent
|
|
@@ -210,7 +211,7 @@ export declare abstract class Texture extends EventEmitter {
|
|
|
210
211
|
* e.g. ImageData that is downloaded from a URL.
|
|
211
212
|
*/
|
|
212
213
|
freeTextureData(): void;
|
|
213
|
-
setState(state: TextureState, errorOrDimensions?:
|
|
214
|
+
setState(state: TextureState, errorOrDimensions?: TextureError | Dimensions): void;
|
|
214
215
|
/**
|
|
215
216
|
* Get the texture data for this texture.
|
|
216
217
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Texture.js","sourceRoot":"","sources":["../../../../src/core/textures/Texture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"Texture.js","sourceRoot":"","sources":["../../../../src/core/textures/Texture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AA4G5D,MAAM,CAAN,IAAY,WAOX;AAPD,WAAY,WAAW;IACrB,mDAAa,CAAA;IACb,+CAAW,CAAA;IACX,+CAAW,CAAA;IACX,+CAAW,CAAA;IACX,mEAAqB,CAAA;IACrB,yDAAgB,CAAA;AAClB,CAAC,EAPW,WAAW,KAAX,WAAW,QAOtB;AAED;;;;;;;;GAQG;AACH,MAAM,OAAgB,OAAQ,SAAQ,YAAY;IAsD1B;IArDtB;;;;;;OAMG;IACK,WAAW,GAAsB,IAAI,CAAC;IACtC,MAAM,GAAwB,IAAI,CAAC;IAE3C,kBAAkB;IACX,KAAK,GAAiB,SAAS,CAAC;IAE9B,gBAAgB,GAAU,EAAE,CAAC;IAE7B,UAAU,GAAY,KAAK,CAAC;IAE9B,IAAI,GAAgB,WAAW,CAAC,OAAO,CAAC;IAExC,cAAc,GAAG,KAAK,CAAC;IAEvB,UAAU,CAAiC;IAE3C,WAAW,GAAuB,IAAI,CAAC;IAEvC,OAAO,GAAG,CAAC,CAAC;IAEnB;;;;;;OAMG;IACI,UAAU,GAAG,CAAC,CAAC;IACf,aAAa,CAAS;IAE7B;;OAEG;IACK,SAAS,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvC;;OAEG;IACK,kBAAkB,GAAY,KAAK,CAAC;IAE5C;;;OAGG;IACK,MAAM,CAAU,oBAAoB,GAAG,IAAI,CAAC,CAAC,YAAY;IAEjE,YAAsB,SAA6B;QACjD,KAAK,EAAE,CAAC;QADY,cAAS,GAAT,SAAS,CAAoB;QAEjD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;IACpD,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,0BAA0B;QACxB,4DAA4D;QAC5D,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,wCAAwC;QACxC,MAAM,UAAU,GACd,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,oBAAoB,CAAC;QAE9D,IAAI,UAAU,EAAE,CAAC;YACf,oDAAoD;YACpD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,wCAAwC;QACxC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,qDAAqD;QACrD,IAAI,IAAI,CAAC,0BAA0B,EAAE,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,kCAAkC;QAClC,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,qDAAqD;QACrD,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,kBAAkB;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,kBAAkB,CAAC,KAAsB,EAAE,UAAmB;QAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;QAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE3D,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;gBACzB,2BAA2B;gBAC3B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAC7C,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,UAAsB,GAAG,IAAI,CAAC;gBACpC,IAAI,CAAC,oBAAoB,EAAE,CAAC,IAAI,CAAC,CAAC;gBAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;YACjD,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAC7C,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,UAAsB,GAAG,KAAK,CAAC;gBACrC,IAAI,CAAC,oBAAoB,EAAE,CAAC,KAAK,CAAC,CAAC;gBAEnC,uFAAuF;gBACvF,qDAAqD;YACvD,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACzC,mEAAmE;YACnE,OAAO;QACT,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAaD;;;;;OAKG;IACH,cAAc;QACZ,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IACH,IAAI;QACF,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACH,OAAO;QACL,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACH,OAAO;QACL,+DAA+D;QAC/D,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;QAED,+CAA+C;QAC/C,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACH,eAAe;QACb,cAAc,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC3C,CAAC;IAEM,QAAQ,CACb,KAAmB,EACnB,iBAA6C;QAE7C,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,IAAI,OAAO,GAAqC,IAAI,CAAC;QACrD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,IACE,iBAAiB,KAAK,SAAS;gBAC/B,GAAG,IAAI,iBAAiB,KAAK,IAAI;gBACjC,GAAG,IAAI,iBAAiB,KAAK,IAAI;gBACjC,iBAAiB,CAAC,CAAC,KAAK,SAAS;gBACjC,iBAAiB,CAAC,CAAC,KAAK,SAAS,EACjC,CAAC;gBACD,IAAI,CAAC,WAAW,GAAG,iBAAiB,CAAC;YACvC,CAAC;YAED,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;QAC7B,CAAC;aAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,iBAAiC,CAAC;YAChD,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;YAEtB,4CAA4C;YAC5C,wDAAwD;YACxD,8CAA8C;YAC9C,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;YAErB,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;aAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,qBAAqB;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,cAAc;QAClB,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACnD,CAAC;QAED,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACK,mBAAmB,GAAG,GAAS,EAAE;QACvC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC,CAAC;IAEF;;;;;OAKG;IACK,WAAW,GAAG,GAAS,EAAE;QAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC,CAAC;IAWF;;;;;;;;;;;;;OAaG;IACH,6DAA6D;IAC7D,MAAM,CAAC,YAAY,CAAC,KAAc;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,eAAe;IACpB,6DAA6D;IAC7D,KAAc;QAEd,OAAO,EAAE,CAAC;IACZ,CAAC"}
|
package/dist/src/core/utils.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
6
|
export declare const EPSILON = 0.000001;
|
|
7
|
-
export declare let ARRAY_TYPE:
|
|
7
|
+
export declare let ARRAY_TYPE: ArrayConstructor | Float32ArrayConstructor;
|
|
8
8
|
export declare const RANDOM: () => number;
|
|
9
9
|
export declare const ANGLE_ORDER = "zyx";
|
|
10
10
|
export type TimingFunction = (t: number) => number;
|
|
@@ -3,6 +3,7 @@ import { type RendererMainSettings } from './Renderer.js';
|
|
|
3
3
|
import type { AnimationSettings } from '../core/animations/CoreAnimation.js';
|
|
4
4
|
import type { AnimationControllerState } from '../common/IAnimationController.js';
|
|
5
5
|
import { CoreTextNode, type CoreTextNodeProps } from '../core/CoreTextNode.js';
|
|
6
|
+
import type { Texture } from '../core/textures/Texture.js';
|
|
6
7
|
/**
|
|
7
8
|
* Inspector Options
|
|
8
9
|
*
|
|
@@ -55,6 +56,7 @@ export declare class Inspector {
|
|
|
55
56
|
private width;
|
|
56
57
|
private scaleX;
|
|
57
58
|
private scaleY;
|
|
59
|
+
private textureMetrics;
|
|
58
60
|
private static setterCallCount;
|
|
59
61
|
private static activeAnimations;
|
|
60
62
|
private static animationHistory;
|
|
@@ -142,6 +144,8 @@ export declare class Inspector {
|
|
|
142
144
|
createNode(node: CoreNode): CoreNode;
|
|
143
145
|
createTextNode(node: CoreTextNode): CoreTextNode;
|
|
144
146
|
createProxy(node: CoreNode | CoreTextNode, div: HTMLElement): CoreNode | CoreTextNode;
|
|
147
|
+
updateTextNodeDimensions(div: HTMLElement, node: CoreTextNode): void;
|
|
148
|
+
updateTextureAttributes(div: HTMLElement, texture: Texture): void;
|
|
145
149
|
destroy(): void;
|
|
146
150
|
destroyNode(id: number): void;
|
|
147
151
|
updateNodeProperty(div: HTMLElement, property: keyof CoreNodeProps | keyof CoreTextNodeProps, value: any, props: CoreNodeProps | CoreTextNodeProps): void;
|
|
@@ -2,6 +2,7 @@ import { CoreNode, } from '../core/CoreNode.js';
|
|
|
2
2
|
import {} from './Renderer.js';
|
|
3
3
|
import { isProductionEnvironment } from '../utils.js';
|
|
4
4
|
import { CoreTextNode } from '../core/CoreTextNode.js';
|
|
5
|
+
import { TextureType } from '../core/textures/Texture.js';
|
|
5
6
|
const stylePropertyMap = {
|
|
6
7
|
alpha: (v) => {
|
|
7
8
|
if (v === 1) {
|
|
@@ -105,6 +106,14 @@ const gradientColorPropertyMap = [
|
|
|
105
106
|
'colorBl',
|
|
106
107
|
'colorBr',
|
|
107
108
|
];
|
|
109
|
+
const textureTypeNames = {
|
|
110
|
+
[TextureType.generic]: 'generic',
|
|
111
|
+
[TextureType.color]: 'color',
|
|
112
|
+
[TextureType.image]: 'image',
|
|
113
|
+
[TextureType.noise]: 'noise',
|
|
114
|
+
[TextureType.renderToTexture]: 'renderToTexture',
|
|
115
|
+
[TextureType.subTexture]: 'subTexture',
|
|
116
|
+
};
|
|
108
117
|
const knownProperties = new Set([
|
|
109
118
|
...Object.keys(stylePropertyMap),
|
|
110
119
|
...Object.keys(domPropertyMap),
|
|
@@ -123,6 +132,7 @@ export class Inspector {
|
|
|
123
132
|
width = 1920;
|
|
124
133
|
scaleX = 1;
|
|
125
134
|
scaleY = 1;
|
|
135
|
+
textureMetrics = new Map();
|
|
126
136
|
// Performance monitoring for frequent setter calls
|
|
127
137
|
static setterCallCount = new Map();
|
|
128
138
|
// Animation monitoring structures
|
|
@@ -492,6 +502,75 @@ export class Inspector {
|
|
|
492
502
|
return this.createProxy(node, div);
|
|
493
503
|
}
|
|
494
504
|
createProxy(node, div) {
|
|
505
|
+
// Store texture event listeners for cleanup
|
|
506
|
+
const textureListeners = new Map();
|
|
507
|
+
const coreNodeListeners = new Map();
|
|
508
|
+
const setupCoreNodeListeners = (coreNode) => {
|
|
509
|
+
const onLoaded = () => {
|
|
510
|
+
this.updateTextNodeDimensions(div, coreNode);
|
|
511
|
+
};
|
|
512
|
+
coreNode.on('loaded', onLoaded);
|
|
513
|
+
coreNodeListeners.set(coreNode, { onLoaded });
|
|
514
|
+
};
|
|
515
|
+
// Helper function to setup texture event listeners
|
|
516
|
+
const setupTextureListeners = (texture) => {
|
|
517
|
+
// Clean up existing listeners first
|
|
518
|
+
textureListeners.forEach((listeners, oldTexture) => {
|
|
519
|
+
oldTexture.off('loaded', listeners.onLoaded);
|
|
520
|
+
oldTexture.off('failed', listeners.onFailed);
|
|
521
|
+
oldTexture.off('freed', listeners.onFreed);
|
|
522
|
+
});
|
|
523
|
+
textureListeners.clear();
|
|
524
|
+
// Setup new listeners if texture exists
|
|
525
|
+
if (texture) {
|
|
526
|
+
// Initialize metrics if not exists
|
|
527
|
+
if (!this.textureMetrics.has(texture)) {
|
|
528
|
+
this.textureMetrics.set(texture, {
|
|
529
|
+
previousState: texture.state,
|
|
530
|
+
loadedCount: 0,
|
|
531
|
+
failedCount: 0,
|
|
532
|
+
freedCount: 0,
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
const onLoaded = () => {
|
|
536
|
+
const metrics = this.textureMetrics.get(texture);
|
|
537
|
+
if (metrics) {
|
|
538
|
+
metrics.previousState =
|
|
539
|
+
metrics.previousState !== texture.state
|
|
540
|
+
? metrics.previousState
|
|
541
|
+
: 'loading';
|
|
542
|
+
metrics.loadedCount++;
|
|
543
|
+
}
|
|
544
|
+
this.updateTextureAttributes(div, texture);
|
|
545
|
+
};
|
|
546
|
+
const onFailed = () => {
|
|
547
|
+
const metrics = this.textureMetrics.get(texture);
|
|
548
|
+
if (metrics) {
|
|
549
|
+
metrics.previousState =
|
|
550
|
+
metrics.previousState !== texture.state
|
|
551
|
+
? metrics.previousState
|
|
552
|
+
: 'loading';
|
|
553
|
+
metrics.failedCount++;
|
|
554
|
+
}
|
|
555
|
+
this.updateTextureAttributes(div, texture);
|
|
556
|
+
};
|
|
557
|
+
const onFreed = () => {
|
|
558
|
+
const metrics = this.textureMetrics.get(texture);
|
|
559
|
+
if (metrics) {
|
|
560
|
+
metrics.previousState =
|
|
561
|
+
metrics.previousState !== texture.state
|
|
562
|
+
? metrics.previousState
|
|
563
|
+
: texture.state;
|
|
564
|
+
metrics.freedCount++;
|
|
565
|
+
}
|
|
566
|
+
this.updateTextureAttributes(div, texture);
|
|
567
|
+
};
|
|
568
|
+
texture.on('loaded', onLoaded);
|
|
569
|
+
texture.on('failed', onFailed);
|
|
570
|
+
texture.on('freed', onFreed);
|
|
571
|
+
textureListeners.set(texture, { onLoaded, onFailed, onFreed });
|
|
572
|
+
}
|
|
573
|
+
};
|
|
495
574
|
// Define traps for each property in knownProperties
|
|
496
575
|
knownProperties.forEach((property) => {
|
|
497
576
|
let originalProp = Object.getOwnPropertyDescriptor(node, property);
|
|
@@ -503,6 +582,9 @@ export class Inspector {
|
|
|
503
582
|
if (originalProp === undefined) {
|
|
504
583
|
return;
|
|
505
584
|
}
|
|
585
|
+
if (property === 'text') {
|
|
586
|
+
setupCoreNodeListeners(node);
|
|
587
|
+
}
|
|
506
588
|
Object.defineProperty(node, property, {
|
|
507
589
|
get() {
|
|
508
590
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
@@ -513,6 +595,13 @@ export class Inspector {
|
|
|
513
595
|
this.trackSetterCall(node.id, property);
|
|
514
596
|
originalProp?.set?.call(node, value);
|
|
515
597
|
this.updateNodeProperty(div, property, value, node.props);
|
|
598
|
+
// Setup texture event listeners if this is a texture property
|
|
599
|
+
if (property === 'texture') {
|
|
600
|
+
const textureValue = value && typeof value === 'object' && 'state' in value
|
|
601
|
+
? value
|
|
602
|
+
: null;
|
|
603
|
+
setupTextureListeners(textureValue);
|
|
604
|
+
}
|
|
516
605
|
},
|
|
517
606
|
configurable: true,
|
|
518
607
|
enumerable: true,
|
|
@@ -521,6 +610,19 @@ export class Inspector {
|
|
|
521
610
|
const originalDestroy = node.destroy;
|
|
522
611
|
Object.defineProperty(node, 'destroy', {
|
|
523
612
|
value: () => {
|
|
613
|
+
// Clean up texture event listeners and metrics
|
|
614
|
+
textureListeners.forEach((listeners, texture) => {
|
|
615
|
+
texture.off('loaded', listeners.onLoaded);
|
|
616
|
+
texture.off('failed', listeners.onFailed);
|
|
617
|
+
texture.off('freed', listeners.onFreed);
|
|
618
|
+
// Clean up metrics for this texture
|
|
619
|
+
this.textureMetrics.delete(texture);
|
|
620
|
+
});
|
|
621
|
+
textureListeners.clear();
|
|
622
|
+
coreNodeListeners.forEach((listeners, coreNode) => {
|
|
623
|
+
coreNode.off('loaded', listeners.onLoaded);
|
|
624
|
+
});
|
|
625
|
+
coreNodeListeners.clear();
|
|
524
626
|
this.destroyNode(node.id);
|
|
525
627
|
originalDestroy.call(node);
|
|
526
628
|
},
|
|
@@ -537,6 +639,64 @@ export class Inspector {
|
|
|
537
639
|
});
|
|
538
640
|
return node;
|
|
539
641
|
}
|
|
642
|
+
updateTextNodeDimensions(div, node) {
|
|
643
|
+
const textMetrics = node.renderInfo;
|
|
644
|
+
if (textMetrics) {
|
|
645
|
+
div.style.width = `${textMetrics.width}px`;
|
|
646
|
+
div.style.height = `${textMetrics.height}px`;
|
|
647
|
+
}
|
|
648
|
+
else {
|
|
649
|
+
div.style.removeProperty('width');
|
|
650
|
+
div.style.removeProperty('height');
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
updateTextureAttributes(div, texture) {
|
|
654
|
+
// Update texture state
|
|
655
|
+
div.setAttribute('data-texture-state', texture.state);
|
|
656
|
+
// Update texture type
|
|
657
|
+
div.setAttribute('data-texture-type', textureTypeNames[texture.type] || 'unknown');
|
|
658
|
+
// Update texture dimensions if available
|
|
659
|
+
if (texture.dimensions) {
|
|
660
|
+
div.setAttribute('data-texture-width', String(texture.dimensions.w));
|
|
661
|
+
div.setAttribute('data-texture-height', String(texture.dimensions.h));
|
|
662
|
+
}
|
|
663
|
+
else {
|
|
664
|
+
div.removeAttribute('data-texture-width');
|
|
665
|
+
div.removeAttribute('data-texture-height');
|
|
666
|
+
}
|
|
667
|
+
// Update renderable owners count
|
|
668
|
+
div.setAttribute('data-texture-owners', String(texture.renderableOwners.length));
|
|
669
|
+
// Update retry count
|
|
670
|
+
div.setAttribute('data-texture-retry-count', String(texture.retryCount));
|
|
671
|
+
// Update max retry count if available
|
|
672
|
+
if (texture.maxRetryCount !== null) {
|
|
673
|
+
div.setAttribute('data-texture-max-retry-count', String(texture.maxRetryCount));
|
|
674
|
+
}
|
|
675
|
+
else {
|
|
676
|
+
div.removeAttribute('data-texture-max-retry-count');
|
|
677
|
+
}
|
|
678
|
+
// Update metrics if available
|
|
679
|
+
const metrics = this.textureMetrics.get(texture);
|
|
680
|
+
if (metrics) {
|
|
681
|
+
div.setAttribute('data-texture-previous-state', metrics.previousState);
|
|
682
|
+
div.setAttribute('data-texture-loaded-count', String(metrics.loadedCount));
|
|
683
|
+
div.setAttribute('data-texture-failed-count', String(metrics.failedCount));
|
|
684
|
+
div.setAttribute('data-texture-freed-count', String(metrics.freedCount));
|
|
685
|
+
}
|
|
686
|
+
else {
|
|
687
|
+
div.removeAttribute('data-texture-previous-state');
|
|
688
|
+
div.removeAttribute('data-texture-loaded-count');
|
|
689
|
+
div.removeAttribute('data-texture-failed-count');
|
|
690
|
+
div.removeAttribute('data-texture-freed-count');
|
|
691
|
+
}
|
|
692
|
+
// Update error information if present
|
|
693
|
+
if (texture.error) {
|
|
694
|
+
div.setAttribute('data-texture-error', texture.error.code || texture.error.message);
|
|
695
|
+
}
|
|
696
|
+
else {
|
|
697
|
+
div.removeAttribute('data-texture-error');
|
|
698
|
+
}
|
|
699
|
+
}
|
|
540
700
|
destroy() {
|
|
541
701
|
// Stop animation stats timer
|
|
542
702
|
this.stopAnimationStatsTimer();
|