textmode.js 0.7.1 → 0.8.0-beta.2

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.
Files changed (54) hide show
  1. package/dist/textmode.esm.js +2042 -2108
  2. package/dist/textmode.umd.js +16 -16
  3. package/dist/types/Textmode.d.ts +11 -11
  4. package/dist/types/errors/index.d.ts +1 -1
  5. package/dist/types/index.d.ts +11 -3
  6. package/dist/types/rendering/webgl/core/Framebuffer.d.ts +0 -6
  7. package/dist/types/rendering/webgl/core/Renderer.d.ts +7 -6
  8. package/dist/types/rendering/webgl/core/interfaces/IFramebuffer.d.ts +6 -6
  9. package/dist/types/rendering/webgl/core/interfaces/IRenderer.d.ts +3 -3
  10. package/dist/types/rendering/webgl/index.d.ts +2 -2
  11. package/dist/types/rendering/webgl/pipeline/MaterialBatchPipeline.d.ts +1 -1
  12. package/dist/types/textmode/Canvas.d.ts +2 -2
  13. package/dist/types/textmode/Grid.d.ts +32 -3
  14. package/dist/types/textmode/Textmodifier.d.ts +14 -72
  15. package/dist/types/textmode/conversion/ConversionManager.d.ts +73 -0
  16. package/dist/types/textmode/conversion/ConversionRegistry.d.ts +61 -18
  17. package/dist/types/textmode/conversion/index.d.ts +3 -1
  18. package/dist/types/textmode/filters/FilterManager.d.ts +0 -4
  19. package/dist/types/textmode/filters/index.d.ts +1 -1
  20. package/dist/types/textmode/interfaces/ITextmodifier.d.ts +165 -50
  21. package/dist/types/textmode/layers/Layer2DCompositor.d.ts +13 -20
  22. package/dist/types/textmode/layers/LayerManager.d.ts +31 -20
  23. package/dist/types/textmode/layers/TextmodeLayer.d.ts +58 -20
  24. package/dist/types/textmode/layers/interfaces/ILayerManager.d.ts +7 -0
  25. package/dist/types/textmode/layers/interfaces/ITextmodeLayer.d.ts +49 -28
  26. package/dist/types/textmode/layers/types.d.ts +16 -21
  27. package/dist/types/textmode/loadables/ITextmodeSource.d.ts +123 -0
  28. package/dist/types/textmode/loadables/TextmodeImage.d.ts +2 -2
  29. package/dist/types/textmode/loadables/TextmodeSource.d.ts +10 -118
  30. package/dist/types/textmode/loadables/font/CharacterExtractor.d.ts +1 -1
  31. package/dist/types/textmode/loadables/font/TextmodeFont.d.ts +3 -0
  32. package/dist/types/textmode/loadables/font/index.d.ts +2 -2
  33. package/dist/types/textmode/loadables/index.d.ts +0 -2
  34. package/dist/types/textmode/loadables/video/ITextmodeVideo.d.ts +75 -0
  35. package/dist/types/textmode/loadables/video/TextmodeVideo.d.ts +23 -126
  36. package/dist/types/textmode/loading/LoadingPhase.d.ts +26 -0
  37. package/dist/types/textmode/loading/LoadingScreenManager.d.ts +91 -93
  38. package/dist/types/textmode/loading/index.d.ts +3 -2
  39. package/dist/types/textmode/loading/types.d.ts +57 -57
  40. package/dist/types/textmode/managers/MouseManager.d.ts +24 -14
  41. package/dist/types/textmode/managers/TouchManager.d.ts +25 -13
  42. package/dist/types/textmode/mixins/index.d.ts +1 -2
  43. package/dist/types/textmode/mixins/interfaces/IAnimationMixin.d.ts +87 -87
  44. package/dist/types/textmode/mixins/interfaces/IKeyboardMixin.d.ts +128 -128
  45. package/dist/types/textmode/mixins/interfaces/IMouseMixin.d.ts +96 -105
  46. package/dist/types/textmode/mixins/interfaces/IRenderingMixin.d.ts +271 -370
  47. package/dist/types/textmode/mixins/interfaces/ITouchMixin.d.ts +1 -1
  48. package/dist/types/textmode/types.d.ts +2 -6
  49. package/package.json +5 -2
  50. package/dist/types/textmode/layers/filters/index.d.ts +0 -6
  51. package/dist/types/textmode/loadables/video/TextmodeVideoPreloader.d.ts +0 -29
  52. package/dist/types/textmode/loadables/video/types.d.ts +0 -43
  53. package/dist/types/textmode/mixins/FontMixin.d.ts +0 -8
  54. package/dist/types/textmode/mixins/interfaces/IFontMixin.d.ts +0 -46
@@ -1,22 +1,22 @@
1
1
  import type { TextmodeGrid } from '../Grid';
2
2
  import type { TextmodeFont } from '../loadables/font';
3
3
  import type { TextmodeImage } from '../loadables/TextmodeImage';
4
- import type { TextmodeSource } from '../loadables/TextmodeSource';
5
4
  import type { TextmodeCanvas } from '../Canvas';
6
5
  import type { AnimationController } from '../AnimationController';
7
- import type { GLFramebuffer, GLShader } from '../../rendering';
6
+ import type { GLShader } from '../../rendering';
8
7
  import type { GLRenderer } from '../../rendering/webgl/core/Renderer';
9
8
  import type { MouseManager } from '../managers/MouseManager';
10
9
  import type { KeyboardManager } from '../managers/KeyboardManager';
11
10
  import type { TouchManager } from '../managers/TouchManager';
12
11
  import type { IRenderingMixin } from '../mixins/interfaces/IRenderingMixin';
13
- import type { IFontMixin } from '../mixins/interfaces/IFontMixin';
14
12
  import type { IKeyboardMixin } from '../mixins/interfaces/IKeyboardMixin';
15
13
  import type { ITouchMixin } from '../mixins/interfaces/ITouchMixin';
16
14
  import type { IMouseMixin } from '../mixins/interfaces/IMouseMixin';
17
15
  import type { IAnimationMixin } from '../mixins/interfaces/IAnimationMixin';
18
16
  import type { LoadingScreenManager } from '../loading/LoadingScreenManager';
19
17
  import type { TextmodeLayerManager } from '../layers';
18
+ import type { BuiltInFilterName, BuiltInFilterParams, TextmodeFilterManager, FilterName } from '../filters';
19
+ import type { TextmodeConversionManager } from '../conversion';
20
20
  /**
21
21
  * Manages textmode rendering on a [`HTMLCanvasElement`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement) and provides methods for drawing,
22
22
  * exporting, font management, event handling, and animation control.
@@ -25,15 +25,11 @@ import type { TextmodeLayerManager } from '../layers';
25
25
  * it creates a new `HTMLCanvasElement` to draw on using the `textmode.js` drawing API.
26
26
  * If a canvas is provided, it will use that canvas instead.
27
27
  */
28
- export interface ITextmodifier extends IRenderingMixin, IFontMixin, IAnimationMixin, IMouseMixin, ITouchMixin, IKeyboardMixin {
28
+ export interface ITextmodifier extends IRenderingMixin, IAnimationMixin, IMouseMixin, ITouchMixin, IKeyboardMixin {
29
29
  /** Core WebGL renderer @ignore */
30
30
  readonly _renderer: GLRenderer;
31
- /** Font management @ignore */
32
- readonly _font: TextmodeFont;
33
31
  /** Canvas management @ignore */
34
32
  readonly _canvas: TextmodeCanvas;
35
- /** Grid management @ignore */
36
- readonly _grid: TextmodeGrid;
37
33
  /** Animation controller for managing rendering loop @ignore */
38
34
  readonly _animationController: AnimationController;
39
35
  /** Mouse interaction manager @ignore */
@@ -42,24 +38,72 @@ export interface ITextmodifier extends IRenderingMixin, IFontMixin, IAnimationMi
42
38
  readonly _touchManager: TouchManager;
43
39
  /** Keyboard interaction manager @ignore */
44
40
  readonly _keyboardManager: KeyboardManager;
45
- /** Framebuffer used for offscreen rendering @ignore */
46
- readonly _textmodeDrawFramebuffer: GLFramebuffer;
47
41
  /** Shader used for converting pixels to textmode grid format @ignore */
48
42
  readonly _textmodeConversionShader: GLShader;
49
- /** Framebuffer used for textmode conversion @ignore */
50
- readonly _textmodeFramebuffer: GLFramebuffer;
51
43
  /** Shader used for final presentation to the screen @ignore */
52
44
  readonly _presentShader: GLShader;
53
45
  /** Loading screen manager for boot-time UX @ignore */
54
46
  readonly _loading: LoadingScreenManager;
55
- /** Sources registered for rendering @ignore */
56
- readonly _sources: Set<TextmodeSource>;
47
+ /** Conversion manager for image-to-ASCII conversion @ignore */
48
+ readonly _conversionManager: TextmodeConversionManager;
49
+ /** Filter manager for applying post-processing effects @ignore */
50
+ readonly _filterManager: TextmodeFilterManager;
57
51
  /** Layer manager for handling multiple layers @ignore */
58
52
  readonly _layerManager: TextmodeLayerManager;
59
- /** @ignore */
60
- $registerSource(source: TextmodeSource): void;
53
+ /** Active font based on layer, or loading screen font override @ignore */
54
+ _activeFont?: TextmodeFont;
55
+ /** Active grid based on layer currently being rendered @ignore */
56
+ _activeGrid?: TextmodeGrid;
61
57
  /** Main render method @ignore */
62
58
  $render(): void;
59
+ /**
60
+ * Load a font for the base layer and return it.
61
+ *
62
+ * The returned font can be reused on other layers via {@link TextmodeLayer.loadFont}.
63
+ *
64
+ * @param fontSource The URL of the font to load.
65
+ * @returns The loaded TextmodeFont instance (base layer font).
66
+ *
67
+ * @example
68
+ * ```javascript
69
+ * const t = textmode.create();
70
+ *
71
+ * t.setup(async () => {
72
+ * // Load font for the base layer
73
+ * const font = await t.loadFont('./fonts/myfont.ttf');
74
+ *
75
+ * // Use the same font on another layer
76
+ * const layer = t.layers.add();
77
+ * await layer.loadFont(font);
78
+ *
79
+ * // Or load a different font for a layer
80
+ * await layer.loadFont('./fonts/otherfont.ttf');
81
+ * });
82
+ * ```
83
+ */
84
+ loadFont(fontSource: string): Promise<TextmodeFont>;
85
+ /**
86
+ * Set the font size used for rendering.
87
+ * @param size The font size to set.
88
+ *
89
+ * @example
90
+ * ```javascript
91
+ * // Create a Textmodifier instance
92
+ * const t = textmode.create();
93
+ *
94
+ * t.setup(() => {
95
+ * // Set the font size to 32
96
+ * t.fontSize(32);
97
+ * });
98
+ *
99
+ * t.draw(() => {
100
+ * t.background(0);
101
+ * t.char('A');
102
+ * t.rect(5, 5);
103
+ * });
104
+ * ```
105
+ */
106
+ fontSize(size: number): void;
63
107
  /**
64
108
  * Set a setup callback function that will be executed once when initialization is complete.
65
109
  *
@@ -207,9 +251,40 @@ export interface ITextmodifier extends IRenderingMixin, IFontMixin, IAnimationMi
207
251
  * ```
208
252
  */
209
253
  destroy(): void;
210
- /** Get the current grid object used for rendering. */
211
- readonly grid: TextmodeGrid;
212
- /** Get the current font object used for rendering. */
254
+ /**
255
+ * Apply a filter to the final composited output.
256
+ *
257
+ * Filters are applied after all layers are composited but before
258
+ * the result is presented to the canvas. Multiple filters can be
259
+ * queued per frame and will be applied in order.
260
+ *
261
+ * @param name The name of the filter to apply (built-in or custom)
262
+ * @param params Optional parameters for the filter
263
+ *
264
+ * @example
265
+ * ```typescript
266
+ * t.draw(() => {
267
+ * t.background(0);
268
+ * t.charColor(255);
269
+ * t.char('A');
270
+ * t.rect(10, 10);
271
+ *
272
+ * // Apply built-in filters
273
+ * t.filter('grayscale', 0.5);
274
+ * t.filter('invert');
275
+ *
276
+ * // Chain multiple filters
277
+ * t.filter('sepia', { amount: 0.3 });
278
+ * t.filter('threshold', 0.5);
279
+ * });
280
+ * ```
281
+ */
282
+ filter<T extends BuiltInFilterName>(name: T, params?: BuiltInFilterParams[T]): void;
283
+ filter(name: FilterName, params?: unknown): void;
284
+ filter(name: FilterName, params?: unknown): void;
285
+ /** Get the grid object used for rendering the base layer. */
286
+ readonly grid: TextmodeGrid | undefined;
287
+ /** Get the current font object used for rendering the base layer. */
213
288
  readonly font: TextmodeFont;
214
289
  /** Get the width of the canvas in pixels. */
215
290
  readonly width: number;
@@ -217,10 +292,50 @@ export interface ITextmodifier extends IRenderingMixin, IFontMixin, IAnimationMi
217
292
  readonly height: number;
218
293
  /** Get the textmodifier canvas containing the rendered output. */
219
294
  readonly canvas: HTMLCanvasElement;
220
- /** Get the WebGL framebuffer used for drawing operations in {@link Textmodifier.draw}. */
221
- readonly drawFramebuffer: GLFramebuffer;
222
295
  /** Check if the instance has been disposed/destroyed. */
223
296
  readonly isDisposed: boolean;
297
+ /**
298
+ * Access the filter manager for this Textmodifier instance.
299
+ *
300
+ * Use this to register custom filters that can be applied both globally
301
+ * (via {@link filter}) and on individual layers (via {@link TextmodeLayer.filter}).
302
+ * Filters only need to be registered once and are available everywhere.
303
+ *
304
+ * @example
305
+ * ```typescript
306
+ * // Register a custom filter once
307
+ * await t.filters.register('vignette', vignetteShader, {
308
+ * u_intensity: ['intensity', 0.5]
309
+ * });
310
+ *
311
+ * t.draw(() => {
312
+ * t.background(0);
313
+ * t.char('A');
314
+ * t.rect(10, 10);
315
+ *
316
+ * // Apply filter globally to final output
317
+ * t.filter('vignette', { intensity: 0.8 });
318
+ *
319
+ * // Or apply to a specific layer
320
+ * t.layers.base.filter('vignette', 0.5);
321
+ * });
322
+ * ```
323
+ */
324
+ readonly filters: TextmodeFilterManager;
325
+ /**
326
+ * Access the layer manager for this Textmodifier instance.
327
+ *
328
+ * Use this to create and manage multiple layers within the textmode rendering context.
329
+ * Each layer can have its own grid, font, draw callback, and filters.
330
+ */
331
+ readonly layers: TextmodeLayerManager;
332
+ /**
333
+ * Access the conversion manager for this Textmodifier instance.
334
+ *
335
+ * Use this to register custom conversion strategies that can be used
336
+ * when converting images/videos/canvases into textmode representations.
337
+ */
338
+ readonly conversions: TextmodeConversionManager;
224
339
  /**
225
340
  * If in overlay mode, returns the {@link TextmodeImage} instance capturing the target canvas/video content,
226
341
  * allowing further configuration of the conversion parameters.
@@ -252,35 +367,35 @@ export interface ITextmodifier extends IRenderingMixin, IFontMixin, IAnimationMi
252
367
  * Provides access to the loading screen manager to control boot-time loading UX.
253
368
  *
254
369
  * @example
255
- * ```javascript
256
- * const t = textmode.create({ width: 800, height: 600, loadingScreen: { message: 'loading...' } });
257
- *
258
- * t.setup(async () => {
259
- * // Initialize two loading phases
260
- * const phase1 = t.loading.addPhase('Loading assets');
261
- * const phase2 = t.loading.addPhase('Initializing game');
262
- *
263
- * // Start the first phase and simulate asset loading
264
- * await phase1.track(async () => {
265
- * for (let i = 0; i <= 5; i++) {
266
- * phase1.report(i / 5);
267
- * // Small delay — increases visibility of the loading animation
268
- * await new Promise((r) => setTimeout(r, 200));
269
- * }
270
- * });
271
- *
272
- * // Start the second phase and simulate initialization
273
- * await phase2.track(async () => {
274
- * for (let i = 0; i <= 5; i++) {
275
- * phase2.report(i / 5);
276
- * await new Promise((r) => setTimeout(r, 150));
277
- * }
278
- * });
279
- *
280
- * // Optionally set a final message before the screen transitions away
281
- * t.loading.message('Ready - enjoy!');
282
- * });
283
- * ```
370
+ * ```javascript
371
+ * const t = textmode.create({ width: 800, height: 600, loadingScreen: { message: 'loading...' } });
372
+ *
373
+ * t.setup(async () => {
374
+ * // Initialize two loading phases
375
+ * const phase1 = t.loading.addPhase('Loading assets');
376
+ * const phase2 = t.loading.addPhase('Initializing game');
377
+ *
378
+ * // Start the first phase and simulate asset loading
379
+ * await phase1.track(async () => {
380
+ * for (let i = 0; i <= 5; i++) {
381
+ * phase1.report(i / 5);
382
+ * // Small delay — increases visibility of the loading animation
383
+ * await new Promise((r) => setTimeout(r, 200));
384
+ * }
385
+ * });
386
+ *
387
+ * // Start the second phase and simulate initialization
388
+ * await phase2.track(async () => {
389
+ * for (let i = 0; i <= 5; i++) {
390
+ * phase2.report(i / 5);
391
+ * await new Promise((r) => setTimeout(r, 150));
392
+ * }
393
+ * });
394
+ *
395
+ * // Optionally set a final message before the screen transitions away
396
+ * t.loading.message('Ready - enjoy!');
397
+ * });
398
+ * ```
284
399
  */
285
400
  readonly loading: LoadingScreenManager;
286
401
  }
@@ -4,28 +4,26 @@ import type { TextmodeLayer } from './TextmodeLayer';
4
4
  * Parameters for the composite operation.
5
5
  */
6
6
  export interface CompositeParams {
7
- /** The base texture to composite onto. */
8
- baseTexture: WebGLTexture;
7
+ /** The base layer placement (texture + size + offset). */
8
+ base: CompositeLayerPlacement;
9
+ /** The array of user layer placements to composite on top of the base. */
10
+ layers: readonly CompositeLayerPlacement[];
9
11
  /** The target framebuffer to render the final result into. */
10
12
  targetFramebuffer: GLFramebuffer;
11
13
  /** The background color as RGBA values (0-1 range). */
12
14
  backgroundColor: [number, number, number, number];
13
- /** The base layer configuration (visibility, opacity, offset). */
14
- baseLayer: TextmodeLayer;
15
- /** The array of user layers to composite on top of the base. */
16
- layers: readonly TextmodeLayer[];
17
15
  /** Canvas width in pixels. */
18
16
  canvasWidth: number;
19
17
  /** Canvas height in pixels. */
20
18
  canvasHeight: number;
21
- /** Grid width in pixels (layer size). */
22
- gridWidth: number;
23
- /** Grid height in pixels (layer size). */
24
- gridHeight: number;
25
- /** X offset to center the grid within the canvas. */
26
- baseOffsetX: number;
27
- /** Y offset to center the grid within the canvas. */
28
- baseOffsetY: number;
19
+ }
20
+ export interface CompositeLayerPlacement {
21
+ layer: TextmodeLayer;
22
+ texture: WebGLTexture;
23
+ width: number;
24
+ height: number;
25
+ offsetX: number;
26
+ offsetY: number;
29
27
  }
30
28
  /**
31
29
  * Handles the compositing of multiple layers using shader-based blending.
@@ -49,15 +47,10 @@ export declare class Layer2DCompositor {
49
47
  /**
50
48
  * Create a new LayerCompositor.
51
49
  * @param renderer The WebGL renderer instance.
52
- */
53
- constructor(renderer: GLRenderer);
54
- /**
55
- * Initialize the compositor's framebuffers.
56
50
  * @param canvasWidth The canvas width in pixels.
57
51
  * @param canvasHeight The canvas height in pixels.
58
- * @ignore
59
52
  */
60
- $initialize(canvasWidth: number, canvasHeight: number): void;
53
+ constructor(renderer: GLRenderer, canvasWidth: number, canvasHeight: number);
61
54
  /**
62
55
  * Composite all layers onto the target framebuffer.
63
56
  * @param params The composite parameters.
@@ -3,9 +3,11 @@ import type { Textmodifier } from '../Textmodifier';
3
3
  import { TextmodeLayer } from './TextmodeLayer';
4
4
  import type { TextmodeLayerOptions } from './types';
5
5
  import type { ILayerManager } from './interfaces/ILayerManager';
6
+ import type { TextmodeOptions } from '../types';
7
+ import type { TextmodeGrid } from '../Grid';
6
8
  /**
7
- * Manages all user-defined layers within a Textmodifier instance.
8
- *
9
+ * Manages all user-defined layers within a Textmodifier in *
10
+ * Th *
9
11
  * This manager is responsible for:
10
12
  * - Managing the collection of user layers (add, remove, move, swap)
11
13
  * - Coordinating layer rendering and compositing
@@ -19,36 +21,34 @@ export declare class LayerManager implements ILayerManager {
19
21
  private readonly _renderer;
20
22
  private readonly _conversionShader;
21
23
  private readonly _compositor2D;
22
- private readonly _pendingLayers;
23
- private readonly _layers;
24
+ private _pendingLayers;
25
+ private _layers;
24
26
  private readonly _baseLayer;
25
- private _baseFramebuffer;
26
- private _baseRawFramebuffer;
27
- private _layerPingPongBuffers;
28
27
  private _isReady;
28
+ private readonly _gridDimensionChangeCallbacks;
29
29
  /**
30
30
  * Create a new LayerManager.
31
31
  * @param textmodifier The Textmodifier instance this manager belongs to.
32
32
  * @ignore
33
33
  */
34
- constructor(textmodifier: Textmodifier);
34
+ constructor(textmodifier: Textmodifier, opts: TextmodeOptions);
35
+ /**
36
+ * Initialize all pending layers and the compositor.
37
+ * @ignore
38
+ */
39
+ $initialize(): Promise<void>;
35
40
  add(options?: TextmodeLayerOptions): TextmodeLayer;
36
41
  remove(layer: TextmodeLayer): void;
37
42
  move(layer: TextmodeLayer, newIndex: number): void;
38
43
  swap(layerA: TextmodeLayer, layerB: TextmodeLayer): void;
39
44
  clear(): void;
40
- /**
41
- * Initialize all pending layers and the compositor.
42
- * @ignore
43
- */
44
- $initialize(): void;
45
45
  /**
46
46
  * Render all layers (base and user) and composite them to the target framebuffer.
47
47
  * @param targetFramebuffer The framebuffer to render the final composited result to.
48
48
  * @param backgroundColor The background color as RGBA values (0-1 range).
49
49
  * @ignore
50
50
  */
51
- $renderAndComposite(targetFramebuffer: GLFramebuffer, backgroundColor: [number, number, number, number]): void;
51
+ $renderAndComposite(targetFramebuffer: GLFramebuffer, fallbackBaseDraw: () => void): void;
52
52
  /**
53
53
  * Render all user layers to their respective framebuffers.
54
54
  */
@@ -70,15 +70,26 @@ export declare class LayerManager implements ILayerManager {
70
70
  get all(): readonly TextmodeLayer[];
71
71
  get base(): TextmodeLayer;
72
72
  /**
73
- * Initialize a single layer with required dependencies.
73
+ * Get the grid of the topmost visible layer.
74
+ * Returns the topmost user layer's grid if any are visible, otherwise returns the base layer's grid.
75
+ * This is useful for input managers that need to map coordinates to the layer the user sees on top.
74
76
  */
75
- private _initializeLayer;
77
+ getTopmostGrid(): TextmodeGrid | undefined;
78
+ /**
79
+ * Register a callback to be invoked whenever ANY layer's grid dimensions change.
80
+ * This includes the base layer and all user layers.
81
+ * @param callback The callback to invoke on dimension changes.
82
+ * @ignore
83
+ */
84
+ $onAnyGridDimensionChange(callback: () => void): void;
76
85
  /**
77
- * Initialize the base layer with external (shared) framebuffers.
78
- * The base layer shares the main textmode draw framebuffer and uses
79
- * the manager's base framebuffer for ASCII output.
86
+ * Notify all registered callbacks that a grid's dimensions have changed.
80
87
  */
81
- private _initializeBaseLayer;
88
+ private _notifyGridDimensionChange;
89
+ /**
90
+ * Initialize a single layer with required dependencies.
91
+ */
92
+ private _initializeLayer;
82
93
  /**
83
94
  * Remove a layer from a collection and dispose it.
84
95
  */
@@ -1,8 +1,9 @@
1
- import type { GLFramebuffer, GLShader } from '../../rendering';
2
- import type { TextmodeGrid } from '../Grid';
3
- import type { Textmodifier } from '../Textmodifier';
1
+ import type { GLFramebuffer, GLRenderer, GLShader } from '../../rendering';
2
+ import { TextmodeGrid } from '../Grid';
3
+ import { TextmodeFont } from '../loadables/font';
4
+ import { Textmodifier } from '../Textmodifier';
4
5
  import type { TextmodeLayerBlendMode, TextmodeLayerOptions, LayerDependencies } from './types';
5
- import type { FilterName, BuiltInFilterName, BuiltInFilterParams, QueuedFilter } from '../filters';
6
+ import type { FilterName, BuiltInFilterName, BuiltInFilterParams } from '../filters';
6
7
  import type { ITextmodeLayer } from './interfaces/ITextmodeLayer';
7
8
  /**
8
9
  * A single layer within a multi-layered textmode rendering context.
@@ -27,31 +28,37 @@ export declare class TextmodeLayer implements ITextmodeLayer {
27
28
  $offsetY: number;
28
29
  /** @ignore */
29
30
  $rotation: number;
31
+ /** @ignore */
32
+ $fontSize: number | undefined;
33
+ /** @ignore */
34
+ $fontSource: string | TextmodeFont | URL | undefined;
30
35
  private _deps?;
31
- private _drawFramebuffer?;
32
- private _asciiFramebuffer?;
36
+ private _grid?;
37
+ private _font;
38
+ private _drawFramebuffer;
39
+ private _asciiFramebuffer;
33
40
  private _rawAsciiFramebuffer?;
41
+ private _pingPongBuffers?;
34
42
  private _drawCallback;
35
43
  private _hasRenderableContent;
36
- private _ownsFramebuffers;
37
44
  private _filterQueue;
38
45
  /**
39
46
  * Create a new TextmodeLayer with the given options.
40
47
  * @param options Layer configuration options.
41
48
  * @ignore
42
49
  */
43
- constructor(options?: TextmodeLayerOptions);
50
+ constructor(renderer: GLRenderer, options?: TextmodeLayerOptions);
44
51
  /**
45
- * Return true when this layer has a user-provided draw callback.
52
+ * Attach necessary dependencies for this layer to function.
53
+ * @param deps Dependencies required by the layer.
46
54
  * @ignore
47
55
  */
48
- $hasDraw(): boolean;
56
+ $attachDependencies(deps: LayerDependencies): Promise<void>;
49
57
  /**
50
- * Get and clear the filter queue. Used by LayerManager for base layer filter processing.
51
- * @returns The current filter queue, which is then cleared.
58
+ * Return true when this layer has a user-provided draw callback.
52
59
  * @ignore
53
60
  */
54
- $consumeFilterQueue(): QueuedFilter[];
61
+ $hasDraw(): boolean;
55
62
  /**
56
63
  * Run the layer's draw callback in the calling context. This does NOT
57
64
  * manage framebuffer binding; the caller must ensure the correct
@@ -71,31 +78,55 @@ export declare class TextmodeLayer implements ITextmodeLayer {
71
78
  rotateZ(z?: number): number | void;
72
79
  filter<T extends BuiltInFilterName>(name: T, params?: BuiltInFilterParams[T]): void;
73
80
  filter(name: FilterName, params?: unknown): void;
81
+ /** Get or set the font size for this layer's font. */
82
+ fontSize(size?: number): number | void;
74
83
  /**
75
- * Attach necessary dependencies for this layer to function.
76
- * @param deps Dependencies required by the layer.
77
- * @ignore
84
+ * Load a font into this layer from a URL/path or reuse an existing {@link TextmodeFont} instance.
85
+ * Creates a new font instance for this layer and loads the font data when a string source is provided.
86
+ *
87
+ * @param fontSource The URL or path to the font file.
88
+ * @returns The loaded TextmodeFont instance.
89
+ *
90
+ * @example
91
+ * ```javascript
92
+ * const layer = t.layers.add();
93
+ *
94
+ * t.setup(async () => {
95
+ * // Load a custom font for this layer
96
+ * await layer.loadFont('./fonts/custom.ttf');
97
+ * });
98
+ * ```
78
99
  */
79
- $attachDependencies(deps: LayerDependencies): void;
100
+ loadFont(fontSource: string | TextmodeFont): Promise<TextmodeFont>;
80
101
  /**
81
102
  * Render the layer's content into its ASCII framebuffer.
82
103
  * @param textmodifier The Textmodifier instance.
83
104
  * @param conversionShader The shader used for conversion.
84
105
  * @ignore
85
106
  */
86
- $render(textmodifier: Textmodifier, conversionShader: GLShader): void;
107
+ $render(textmodifier: Textmodifier, conversionShader: GLShader, options?: {
108
+ fallbackDraw?: () => void;
109
+ }): void;
87
110
  /**
88
111
  * Resize the layer's framebuffers to match the given grid dimensions.
89
112
  * @param grid The TextmodeGrid instance.
90
113
  * @ignore
91
114
  */
92
- $resize(grid: TextmodeGrid): void;
115
+ $resize(): void;
93
116
  /**
94
117
  * Dispose of the layer's resources.
95
118
  * @ignore
96
119
  */
97
120
  $dispose(): void;
121
+ /**
122
+ * Get the texture containing the rendered textmode output for this layer.
123
+ */
98
124
  get texture(): WebGLTexture | undefined;
125
+ /**
126
+ * Get the grid associated with this layer.
127
+ */
128
+ get grid(): TextmodeGrid | undefined;
129
+ get font(): TextmodeFont;
99
130
  get width(): number;
100
131
  get height(): number;
101
132
  /**
@@ -103,6 +134,13 @@ export declare class TextmodeLayer implements ITextmodeLayer {
103
134
  * @ignore
104
135
  */
105
136
  get $hasRenderableContent(): boolean;
137
+ /**
138
+ * Get the framebuffer used for drawing operations on this layer.
139
+ */
106
140
  get drawFramebuffer(): GLFramebuffer | undefined;
107
- private _initializeFramebuffers;
141
+ /**
142
+ * Get the framebuffer containing the rendered textmode output for this layer.
143
+ */
144
+ get asciiFramebuffer(): GLFramebuffer | undefined;
145
+ private _syncGridToFont;
108
146
  }
@@ -1,5 +1,6 @@
1
1
  import type { TextmodeLayer } from '../TextmodeLayer';
2
2
  import type { TextmodeLayerOptions } from '../types';
3
+ import type { TextmodeGrid } from '../../Grid';
3
4
  export interface ILayerManager {
4
5
  /**
5
6
  * Get all user layers as a readonly array.
@@ -40,4 +41,10 @@ export interface ILayerManager {
40
41
  * and layers need to be recreated from scratch.
41
42
  */
42
43
  clear(): void;
44
+ /**
45
+ * Get the grid of the topmost visible layer.
46
+ * Returns the topmost user layer's grid if any are visible, otherwise returns the base layer's grid.
47
+ * This is useful for input managers that need to map coordinates to the layer the user sees on top.
48
+ */
49
+ getTopmostGrid(): TextmodeGrid | undefined;
43
50
  }