Skip to content

Commit 7290bc1

Browse files
authored
Standardize the loaded event of text and texture (#72)
Standardized event for text and texture loaded. I guess the events for text and texture failed event can be added too.
2 parents a0645f5 + 8b24022 commit 7290bc1

File tree

7 files changed

+115
-28
lines changed

7 files changed

+115
-28
lines changed

examples/index.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {
2222
RendererMain,
2323
ThreadXRenderDriver,
2424
type IRenderDriver,
25-
type Dimensions,
25+
type LoadedPayload,
2626
type RendererMainSettings,
2727
} from '@lightningjs/renderer';
2828
import { assertTruthy } from '@lightningjs/renderer/utils';
@@ -92,13 +92,10 @@ import type { ExampleSettings } from './common/ExampleSettings.js';
9292
parent: renderer.root,
9393
fontSize: 50,
9494
});
95-
overlayText.once(
96-
'textLoaded',
97-
(target: any, { width, height }: Dimensions) => {
98-
overlayText.x = renderer.settings.appWidth - width - 20;
99-
overlayText.y = renderer.settings.appHeight - height - 20;
100-
},
101-
);
95+
overlayText.once('loaded', (target: any, { dimensions }: LoadedPayload) => {
96+
overlayText.x = renderer.settings.appWidth - dimensions.width - 20;
97+
overlayText.y = renderer.settings.appHeight - dimensions.height - 20;
98+
});
10299
}
103100

104101
const exampleSettings: ExampleSettings = {

examples/tests/text.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
type ITextNodeWritableProps,
2222
type TextRendererMap,
2323
type TrFontFaceMap,
24+
type LoadedPayload,
2425
} from '@lightningjs/renderer';
2526
import { getLoremIpsum } from '../common/LoremIpsum.js';
2627
import type { ExampleSettings } from '../common/ExampleSettings.js';
@@ -120,12 +121,9 @@ export default async function ({ testName, renderer }: ExampleSettings) {
120121
parent: renderer.root,
121122
});
122123

123-
statusNode.on(
124-
'textLoaded',
125-
(target: any, dimensions: { width: number; height: number }) => {
126-
statusNode.x = renderer.settings.appWidth - dimensions.width;
127-
},
128-
);
124+
statusNode.on('loaded', (target: any, { dimensions }: LoadedPayload) => {
125+
statusNode.x = renderer.settings.appWidth - dimensions.width;
126+
});
129127

130128
function updateStatus() {
131129
const modeName = modes[curMode];

src/common/CommonTypes.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,45 @@ export type TextLoadedEventHandler = (
6868
* Event handler for when text fails to load
6969
*/
7070
export type TextFailedEventHandler = (target: any, error: Error) => void;
71+
72+
/**
73+
* Payload for when text is loaded
74+
*/
75+
type TextLoadedPayload = {
76+
type: 'text';
77+
dimensions: Dimensions;
78+
};
79+
80+
/**
81+
* Payload for when texture is loaded
82+
*/
83+
type TextureLoadedPayload = {
84+
type: 'texture';
85+
dimensions: Dimensions;
86+
};
87+
88+
/**
89+
* Combined type for all loaded payloads
90+
*/
91+
export type LoadedPayload = TextLoadedPayload | TextureLoadedPayload;
92+
93+
/**
94+
* Payload for when text failed to load
95+
*/
96+
type TextFailedPayload = {
97+
type: 'text';
98+
error: Error;
99+
};
100+
101+
/**
102+
* Payload for when texture failed to load
103+
*/
104+
type TextureFailedPayload = {
105+
type: 'texture';
106+
error: Error;
107+
};
108+
109+
/**
110+
* Combined type for all failed payloads
111+
*/
112+
export type FailedPayload = TextFailedPayload | TextureFailedPayload;

src/render-drivers/main/MainOnlyNode.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ import { EventEmitter } from '../../common/EventEmitter.js';
3838
import type {
3939
TextureFailedEventHandler,
4040
TextureLoadedEventHandler,
41+
LoadedPayload,
42+
FailedPayload,
4143
} from '../../common/CommonTypes.js';
4244

4345
let nextId = 1;
@@ -411,11 +413,20 @@ export class MainOnlyNode extends EventEmitter implements INode {
411413
}
412414

413415
private onTextureLoaded: TextureLoadedEventHandler = (target, dimensions) => {
414-
this.emit('txLoaded', dimensions);
416+
const texturePayload: LoadedPayload = {
417+
type: 'texture',
418+
dimensions,
419+
};
420+
421+
this.emit('loaded', texturePayload);
415422
};
416423

417424
private onTextureFailed: TextureFailedEventHandler = (target, error) => {
418-
this.emit('txFailed', error);
425+
const textureFailedPayload: FailedPayload = {
426+
type: 'texture',
427+
error,
428+
};
429+
this.emit('failed', textureFailedPayload);
419430
};
420431
//#endregion Texture
421432

src/render-drivers/main/MainOnlyTextNode.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ import { CoreTextNode } from '../../core/CoreTextNode.js';
2828
import type {
2929
TextFailedEventHandler,
3030
TextLoadedEventHandler,
31+
LoadedPayload,
32+
FailedPayload,
33+
Dimensions,
3134
} from '../../common/CommonTypes.js';
3235

3336
export class MainOnlyTextNode extends MainOnlyNode implements ITextNode {
@@ -99,12 +102,25 @@ export class MainOnlyTextNode extends MainOnlyNode implements ITextNode {
99102
this.coreNode.on('textFailed', this.onTextFailed);
100103
}
101104

102-
private onTextLoaded: TextLoadedEventHandler = (target, dimensions) => {
103-
this.emit('textLoaded', dimensions);
105+
private onTextLoaded: TextLoadedEventHandler = (
106+
target,
107+
dimensions: Dimensions,
108+
) => {
109+
const textPayload: LoadedPayload = {
110+
type: 'text',
111+
dimensions,
112+
};
113+
114+
this.emit('loaded', textPayload);
104115
};
105116

106117
private onTextFailed: TextFailedEventHandler = (target, error) => {
107-
this.emit('textFailed', error);
118+
const textFailedPayload: FailedPayload = {
119+
type: 'text',
120+
error,
121+
};
122+
123+
this.emit('failed', textFailedPayload);
108124
};
109125

110126
get text(): string {

src/render-drivers/threadx/worker/ThreadXRendererNode.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ import type { Texture } from '../../../core/textures/Texture.js';
3030
import { CoreNode } from '../../../core/CoreNode.js';
3131
import type { ShaderRef, TextureRef } from '../../../main-api/RendererMain.js';
3232
import type { AnimationSettings } from '../../../core/animations/CoreAnimation.js';
33-
import type { Dimensions } from '../../../common/CommonTypes.js';
33+
import type {
34+
Dimensions,
35+
LoadedPayload,
36+
FailedPayload,
37+
} from '../../../common/CommonTypes.js';
3438

3539
export class ThreadXRendererNode extends SharedNode {
3640
protected coreNode: CoreNode;
@@ -129,10 +133,20 @@ export class ThreadXRendererNode extends SharedNode {
129133
});
130134
// Forward on CoreNode events
131135
this.coreNode.on('txLoaded', (target: CoreNode, dimensions: Dimensions) => {
132-
this.emit('txLoaded', dimensions as unknown as Record<string, unknown>);
136+
const texturePayload: LoadedPayload = {
137+
type: 'texture',
138+
dimensions,
139+
};
140+
141+
this.emit('loaded', texturePayload);
133142
});
134143
this.coreNode.on('txFailed', (target: CoreNode, error: Error) => {
135-
this.emit('txFailed', error as unknown as Record<string, unknown>);
144+
const textureFailedPayload: FailedPayload = {
145+
type: 'texture',
146+
error,
147+
};
148+
149+
this.emit('failed', textureFailedPayload);
136150
});
137151
}
138152

src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@
1717
* limitations under the License.
1818
*/
1919

20-
import type { Dimensions } from '../../../common/CommonTypes.js';
20+
import type {
21+
Dimensions,
22+
LoadedPayload,
23+
FailedPayload,
24+
} from '../../../common/CommonTypes.js';
2125
import { CoreTextNode } from '../../../core/CoreTextNode.js';
2226
import type { Stage } from '../../../core/Stage.js';
2327
import type { TrProps } from '../../../core/text-rendering/renderers/TextRenderer.js';
@@ -117,14 +121,19 @@ export class ThreadXRendererTextNode extends ThreadXRendererNode {
117121
this.coreNode.on(
118122
'textLoaded',
119123
(target: CoreTextNode, dimensions: Dimensions) => {
120-
this.emit(
121-
'textLoaded',
122-
dimensions as unknown as Record<string, unknown>,
123-
);
124+
const textPayload: LoadedPayload = {
125+
type: 'text',
126+
dimensions,
127+
};
128+
this.emit('loaded', textPayload);
124129
},
125130
);
126131
this.coreNode.on('textFailed', (target: CoreTextNode, error: Error) => {
127-
this.emit('textFailed', error as unknown as Record<string, unknown>);
132+
const textFailedPayload: FailedPayload = {
133+
type: 'text',
134+
error,
135+
};
136+
this.emit('failed', textFailedPayload);
128137
});
129138
this.on('debug', (target: ThreadXRendererNode, debug: TrProps['debug']) => {
130139
this.coreNode.debug = debug;

0 commit comments

Comments
 (0)