textmode.js 0.4.1-beta.1 → 0.6.0-beta.1

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 (105) hide show
  1. package/dist/textmode.esm.js +2866 -2173
  2. package/dist/textmode.esm.min.js +2866 -2173
  3. package/dist/textmode.umd.js +11 -8
  4. package/dist/textmode.umd.min.js +11 -8
  5. package/dist/types/Textmode.d.ts +13 -22
  6. package/dist/types/index.d.ts +8 -6
  7. package/dist/types/rendering/index.d.ts +3 -3
  8. package/dist/types/rendering/webgl/batching/DrawQueue.d.ts +89 -0
  9. package/dist/types/rendering/webgl/{VAOManager.d.ts → batching/GeometryAttributeCache.d.ts} +4 -4
  10. package/dist/types/rendering/webgl/batching/InstanceAttributeBinder.d.ts +87 -0
  11. package/dist/types/rendering/webgl/{InstanceBatch.d.ts → batching/InstanceBatch.d.ts} +25 -34
  12. package/dist/types/rendering/webgl/batching/InstanceBuffer.d.ts +78 -0
  13. package/dist/types/rendering/webgl/{InstanceData.d.ts → batching/InstanceData.d.ts} +11 -18
  14. package/dist/types/rendering/webgl/batching/InstanceWriter.d.ts +70 -0
  15. package/dist/types/rendering/webgl/{Framebuffer.d.ts → core/Framebuffer.d.ts} +37 -39
  16. package/dist/types/rendering/webgl/core/Renderer.d.ts +64 -0
  17. package/dist/types/rendering/webgl/{Shader.d.ts → core/Shader.d.ts} +2 -23
  18. package/dist/types/rendering/webgl/core/interfaces/IFramebuffer.d.ts +103 -0
  19. package/dist/types/rendering/webgl/core/interfaces/IRenderer.d.ts +210 -0
  20. package/dist/types/rendering/webgl/geometries/{Arc.d.ts → 2d/Arc.d.ts} +5 -4
  21. package/dist/types/rendering/webgl/geometries/{BezierCurve.d.ts → 2d/BezierCurve.d.ts} +5 -4
  22. package/dist/types/rendering/webgl/geometries/{Ellipse.d.ts → 2d/Ellipse.d.ts} +6 -5
  23. package/dist/types/rendering/webgl/geometries/{Line.d.ts → 2d/Line.d.ts} +5 -4
  24. package/dist/types/rendering/webgl/geometries/{Rectangle.d.ts → 2d/Rectangle.d.ts} +5 -4
  25. package/dist/types/rendering/webgl/geometries/{Triangle.d.ts → 2d/Triangle.d.ts} +5 -4
  26. package/dist/types/rendering/webgl/geometries/BaseGeometry.d.ts +30 -26
  27. package/dist/types/rendering/webgl/geometries/immediate/ImmediateQuad.d.ts +33 -0
  28. package/dist/types/rendering/webgl/geometries/index.d.ts +6 -6
  29. package/dist/types/rendering/webgl/geometries/utils/GeometryDescriptors.d.ts +31 -0
  30. package/dist/types/rendering/webgl/geometries/utils/GeometryGenerator.d.ts +16 -0
  31. package/dist/types/rendering/webgl/index.d.ts +15 -14
  32. package/dist/types/rendering/webgl/materials/Material.d.ts +26 -0
  33. package/dist/types/rendering/webgl/materials/MaterialManager.d.ts +63 -0
  34. package/dist/types/rendering/webgl/materials/index.d.ts +2 -0
  35. package/dist/types/rendering/webgl/pipeline/MaterialBatchPipeline.d.ts +63 -0
  36. package/dist/types/rendering/webgl/pipeline/index.d.ts +7 -0
  37. package/dist/types/rendering/webgl/state/RenderState.d.ts +143 -0
  38. package/dist/types/rendering/webgl/types/DrawCommand.d.ts +5 -3
  39. package/dist/types/rendering/webgl/types/GeometryTypes.d.ts +10 -10
  40. package/dist/types/rendering/webgl/types/RenderTypes.d.ts +1 -1
  41. package/dist/types/rendering/webgl/utils/GLUtils.d.ts +45 -0
  42. package/dist/types/rendering/webgl/utils/hash.d.ts +118 -0
  43. package/dist/types/textmode/AnimationController.d.ts +11 -21
  44. package/dist/types/textmode/Canvas.d.ts +10 -2
  45. package/dist/types/textmode/Grid.d.ts +2 -0
  46. package/dist/types/textmode/TextmodeColor.d.ts +57 -0
  47. package/dist/types/textmode/Textmodifier.d.ts +37 -213
  48. package/dist/types/textmode/interfaces/ITextmodifier.d.ts +272 -0
  49. package/dist/types/textmode/interfaces/index.d.ts +1 -0
  50. package/dist/types/textmode/loadables/TextmodeImage.d.ts +21 -0
  51. package/dist/types/textmode/loadables/TextmodeSource.d.ts +130 -0
  52. package/dist/types/textmode/loadables/TextmodeVideo.d.ts +237 -0
  53. package/dist/types/textmode/{font → loadables/font}/CharacterColorMapper.d.ts +1 -1
  54. package/dist/types/textmode/{font → loadables/font}/CharacterExtractor.d.ts +0 -10
  55. package/dist/types/textmode/{font → loadables/font}/TextmodeFont.d.ts +6 -3
  56. package/dist/types/textmode/{font → loadables/font}/TextureAtlas.d.ts +4 -11
  57. package/dist/types/textmode/{font → loadables/font}/typr/types.d.ts +0 -6
  58. package/dist/types/textmode/loadables/index.d.ts +5 -0
  59. package/dist/types/textmode/loading/LoadingPhaseTracker.d.ts +20 -0
  60. package/dist/types/textmode/loading/LoadingScreenManager.d.ts +170 -0
  61. package/dist/types/textmode/loading/LoadingScreenState.d.ts +22 -0
  62. package/dist/types/textmode/loading/LoadingScreenTheme.d.ts +26 -0
  63. package/dist/types/textmode/loading/LoadingScreenTransition.d.ts +17 -0
  64. package/dist/types/textmode/loading/index.d.ts +6 -0
  65. package/dist/types/textmode/loading/templates/SpinnerTemplate.d.ts +2 -0
  66. package/dist/types/textmode/loading/templates/index.d.ts +1 -0
  67. package/dist/types/textmode/loading/types.d.ts +251 -0
  68. package/dist/types/textmode/managers/KeyboardManager.d.ts +2 -3
  69. package/dist/types/textmode/managers/MouseManager.d.ts +1 -1
  70. package/dist/types/textmode/{plugins → managers}/PluginManager.d.ts +12 -15
  71. package/dist/types/textmode/managers/TouchManager.d.ts +0 -2
  72. package/dist/types/textmode/mixins/AnimationMixin.d.ts +2 -122
  73. package/dist/types/textmode/mixins/FontMixin.d.ts +2 -77
  74. package/dist/types/textmode/mixins/KeyboardMixin.d.ts +3 -85
  75. package/dist/types/textmode/mixins/MouseMixin.d.ts +3 -130
  76. package/dist/types/textmode/mixins/RenderingMixin.d.ts +2 -749
  77. package/dist/types/textmode/mixins/TextmodifierMixin.d.ts +2 -44
  78. package/dist/types/textmode/mixins/TouchMixin.d.ts +2 -187
  79. package/dist/types/textmode/mixins/index.d.ts +8 -8
  80. package/dist/types/textmode/mixins/interfaces/IAnimationMixin.d.ts +167 -0
  81. package/dist/types/textmode/mixins/interfaces/IFontMixin.d.ts +46 -0
  82. package/dist/types/textmode/mixins/interfaces/IKeyboardMixin.d.ts +235 -0
  83. package/dist/types/textmode/mixins/interfaces/IMouseMixin.d.ts +457 -0
  84. package/dist/types/textmode/mixins/interfaces/IRenderingMixin.d.ts +1085 -0
  85. package/dist/types/textmode/mixins/interfaces/ITouchMixin.d.ts +186 -0
  86. package/dist/types/textmode/types.d.ts +49 -0
  87. package/dist/types/textmode/utils/cssColor.d.ts +8 -0
  88. package/dist/types/utils/array.d.ts +34 -0
  89. package/dist/types/utils/math.d.ts +69 -0
  90. package/package.json +1 -1
  91. package/dist/types/rendering/webgl/DrawQueue.d.ts +0 -30
  92. package/dist/types/rendering/webgl/RenderPipeline.d.ts +0 -30
  93. package/dist/types/rendering/webgl/RenderState.d.ts +0 -73
  94. package/dist/types/rendering/webgl/Renderer.d.ts +0 -158
  95. package/dist/types/rendering/webgl/ShaderManager.d.ts +0 -66
  96. package/dist/types/rendering/webgl/geometries/NoiseGrid.d.ts +0 -1
  97. package/dist/types/textmode/TextmodeImage.d.ts +0 -161
  98. package/dist/types/textmode/mixins/ShaderMixin.d.ts +0 -1
  99. /package/dist/types/rendering/webgl/{StateCache.d.ts → utils/ViewportCache.d.ts} +0 -0
  100. /package/dist/types/textmode/{font → loadables/font}/MetricsCalculator.d.ts +0 -0
  101. /package/dist/types/textmode/{font → loadables/font}/index.d.ts +0 -0
  102. /package/dist/types/textmode/{font → loadables/font}/types.d.ts +0 -0
  103. /package/dist/types/textmode/{font → loadables/font}/typr/Typr.d.ts +0 -0
  104. /package/dist/types/textmode/{font → loadables/font}/utils/FontTableReader.d.ts +0 -0
  105. /package/dist/types/textmode/{font → loadables/font}/utils/index.d.ts +0 -0
@@ -0,0 +1,186 @@
1
+ import type { TouchEventHandler, TouchLongPressHandler, TouchPinchHandler, TouchPosition, TouchRotateHandler, TouchSwipeHandler, TouchTapHandler } from "../../managers/TouchManager";
2
+ /**
3
+ * Capabilities exposed by the TouchMixin for handling touch interaction and gestures.
4
+ */
5
+ export interface ITouchMixin {
6
+ /**
7
+ * Set a callback function that will be called when a touch point begins.
8
+ *
9
+ * The callback receives {@link TouchEventData} containing the touch that triggered the event,
10
+ * all active touches, and the original DOM event. Use this to react when the user places one or
11
+ * more fingers on the canvas.
12
+ *
13
+ * @param callback The function to call when a touch starts.
14
+ *
15
+ * @example
16
+ * ```javascript
17
+ * t.touchStarted((data) => {
18
+ * console.log(`Touch ${data.touch.id} began at ${data.touch.x}, ${data.touch.y}`);
19
+ * });
20
+ * ```
21
+ */
22
+ touchStarted(callback: TouchEventHandler): void;
23
+ /**
24
+ * Set a callback function that will be called when a touch point moves across the canvas.
25
+ *
26
+ * The provided callback is invoked continuously while the browser reports move events. Use the
27
+ * `previousTouch` and `deltaTime` fields to derive velocity or gesture behaviour.
28
+ *
29
+ * @param callback The function to call when a touch moves.
30
+ *
31
+ * @example
32
+ * ```javascript
33
+ * t.touchMoved((data) => {
34
+ * const { touch, previousTouch } = data;
35
+ * if (previousTouch) {
36
+ * console.log(`Touch moved by ${touch.x - previousTouch.x}, ${touch.y - previousTouch.y}`);
37
+ * }
38
+ * });
39
+ * ```
40
+ */
41
+ touchMoved(callback: TouchEventHandler): void;
42
+ /**
43
+ * Set a callback function that will be called when a touch ends normally.
44
+ *
45
+ * This fires after the finger leaves the canvas surface and the browser raises a `touchend`
46
+ * event. Use it to finalise state such as drawing strokes or completing gestures.
47
+ *
48
+ * @param callback The function to call when a touch ends.
49
+ *
50
+ * @example
51
+ * ```javascript
52
+ * t.touchEnded((data) => {
53
+ * console.log(`Touch ${data.touch.id} finished at ${data.touch.x}, ${data.touch.y}`);
54
+ * });
55
+ * ```
56
+ */
57
+ touchEnded(callback: TouchEventHandler): void;
58
+ /**
59
+ * Set a callback function that will be called when a touch is cancelled by the browser.
60
+ *
61
+ * Cancellation can occur when the browser takes ownership for scrolling or if the gesture
62
+ * leaves the window. Treat this as an aborted touch and clean up any in-progress state.
63
+ *
64
+ * @param callback The function to call when a touch is cancelled.
65
+ *
66
+ * @example
67
+ * ```javascript
68
+ * t.touchCancelled((data) => {
69
+ * console.warn(`Touch ${data.touch.id} cancelled by the browser`);
70
+ * });
71
+ * ```
72
+ */
73
+ touchCancelled(callback: TouchEventHandler): void;
74
+ /**
75
+ * Register a callback for tap gestures.
76
+ *
77
+ * A tap is fired when the user quickly touches and releases the canvas without travelling far.
78
+ * Use {@link TouchTapEventData.taps} to determine whether the gesture is a single or multi tap.
79
+ *
80
+ * @param callback The function to call when a tap gesture is detected.
81
+ *
82
+ * @example
83
+ * ```javascript
84
+ * t.tap((data) => {
85
+ * console.log(`Tapped at ${data.touch.x}, ${data.touch.y}`);
86
+ * });
87
+ * ```
88
+ */
89
+ tap(callback: TouchTapHandler): void;
90
+ /**
91
+ * Register a callback for double tap gestures.
92
+ *
93
+ * Double taps reuse the same {@link TouchTapEventData} as taps with `taps` set to `2`. This
94
+ * helper lets you supply a dedicated handler when you want to treat double taps differently.
95
+ *
96
+ * @param callback The function to call when a double tap is detected.
97
+ *
98
+ * @example
99
+ * ```javascript
100
+ * t.doubleTap((data) => {
101
+ * console.log('Double tap detected', data.touch);
102
+ * });
103
+ * ```
104
+ */
105
+ doubleTap(callback: TouchTapHandler): void;
106
+ /**
107
+ * Register a callback for long press gestures.
108
+ *
109
+ * A long press is emitted when the user keeps a finger on the canvas without moving beyond the
110
+ * configured tolerance. The event includes the press duration in milliseconds.
111
+ *
112
+ * @param callback The function to call when a long press gesture is detected.
113
+ *
114
+ * @example
115
+ * ```javascript
116
+ * t.longPress((data) => {
117
+ * console.log(`Long press for ${Math.round(data.duration)}ms`);
118
+ * });
119
+ * ```
120
+ */
121
+ longPress(callback: TouchLongPressHandler): void;
122
+ /**
123
+ * Register a callback for swipe gestures.
124
+ *
125
+ * Swipes provide the dominant direction (`up`, `down`, `left`, `right`), travelled distance, and
126
+ * velocity in CSS pixels per millisecond. Useful for panning, flicks, or quick shortcuts.
127
+ *
128
+ * @param callback The function to call when a swipe gesture is detected.
129
+ *
130
+ * @example
131
+ * ```javascript
132
+ * t.swipe((data) => {
133
+ * console.log(`Swipe ${data.direction} with distance ${data.distance}`);
134
+ * });
135
+ * ```
136
+ */
137
+ swipe(callback: TouchSwipeHandler): void;
138
+ /**
139
+ * Register a callback for pinch gestures, receiving scale deltas.
140
+ *
141
+ * Pinch gestures involve two touch points. The callback receives the current scale relative to
142
+ * the initial distance and the change since the previous update, enabling zoom interactions.
143
+ *
144
+ * @param callback The function to call when a pinch gesture is detected.
145
+ *
146
+ * @example
147
+ * ```javascript
148
+ * t.pinch((data) => {
149
+ * console.log(`Pinch scale: ${data.scale.toFixed(2)}`);
150
+ * });
151
+ * ```
152
+ */
153
+ pinch(callback: TouchPinchHandler): void;
154
+ /**
155
+ * Register a callback for rotate gestures, receiving rotation deltas in degrees.
156
+ *
157
+ * Rotation callbacks provide the cumulative rotation and delta rotation since the last update,
158
+ * along with the gesture centre in grid coordinates. Ideal for dial-like interactions.
159
+ *
160
+ * @param callback The function to call when a rotation gesture is detected.
161
+ *
162
+ * @example
163
+ * ```javascript
164
+ * t.rotateGesture((data) => {
165
+ * console.log(`Rotated ${data.deltaRotation.toFixed(1)}°`);
166
+ * });
167
+ * ```
168
+ */
169
+ rotateGesture(callback: TouchRotateHandler): void;
170
+ /**
171
+ * Get the currently active touches in grid coordinates.
172
+ *
173
+ * Returns a copy of each touch, including grid position, client coordinates, and pressure when
174
+ * available. Use this inside a draw loop to react to active multi-touch scenarios.
175
+ *
176
+ * @example
177
+ * ```javascript
178
+ * t.draw(() => {
179
+ * for (const touch of t.touches) {
180
+ * t.point(touch.x, touch.y);
181
+ * }
182
+ * });
183
+ * ```
184
+ */
185
+ get touches(): TouchPosition[];
186
+ }
@@ -0,0 +1,49 @@
1
+ import type { TextmodePlugin } from "./managers/PluginManager";
2
+ import type { LoadingScreenOptions } from "./loading/";
3
+ /**
4
+ * Options for creating a {@link Textmodifier} instance.
5
+ */
6
+ export type TextmodeOptions = {
7
+ /**
8
+ * An existing [HTMLCanvasElement](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement) to use instead of creating a new one.
9
+ *
10
+ * **Note:**
11
+ * If using `overlay` mode, this should be the target canvas or video element to overlay on.
12
+ * `textmode.js` will create its own canvas applied on top of the target element, always matching its size and position.
13
+ */
14
+ canvas?: HTMLCanvasElement;
15
+ /** The font size to use for text rendering. Defaults to 16. */
16
+ fontSize?: number;
17
+ /** Maximum frames per second for auto rendering. Defaults to 60. */
18
+ frameRate?: number;
19
+ /** The width of the canvas when creating a new canvas. Defaults to 800. */
20
+ width?: number;
21
+ /** The height of the canvas when creating a new canvas. Defaults to 600. */
22
+ height?: number;
23
+ /**
24
+ * URL or path to a custom font file *(.otf/.ttf)*.
25
+ *
26
+ * Required when using minified builds that don't include a default font.
27
+ *
28
+ * Optional for full builds *(will override embedded font if provided)*.
29
+ */
30
+ fontSource?: string;
31
+ /**
32
+ * Use `textmode.js` in overlay mode,
33
+ * which sets up the textmode `<canvas>` on top of an existing HTMLCanvasElement or HTMLVideoElement,
34
+ * automatically resizing and positioning it to match the target element.
35
+ *
36
+ * In this mode `textmode.js` fetches the content of the target element and loads it into an adjustable {@link loadables.TextmodeImage},
37
+ * that can be accessed via {@link Textmodifier.overlay}, and drawn via {@link Textmodifier.image},
38
+ *
39
+ * Useful for applying textmode conversion to p5.js sketches, YouTube videos, and sooo much more.
40
+ *
41
+ * All functionality of `textmode.js` remains available. Resizing the `textmode.js` canvas is not recommended though, since the overlay target defines the size.
42
+ *
43
+ */
44
+ overlay?: boolean;
45
+ /** List of plugins to install when the Textmodifier instance is created. */
46
+ plugins?: TextmodePlugin[];
47
+ /** Configure the built-in loading screen experience. */
48
+ loadingScreen?: LoadingScreenOptions;
49
+ };
@@ -0,0 +1,8 @@
1
+ export type RGBA = [number, number, number, number];
2
+ /**
3
+ * Parses a CSS color string (hex, rgb, rgba) into an RGBA tuple.
4
+ * Returns null if the value cannot be parsed or is fully transparent.
5
+ */
6
+ export declare function parseCssColor(value?: string | null): RGBA | null;
7
+ export declare function luminance(rgba: RGBA | null): number;
8
+ export declare function rgbaToCss(rgba: RGBA): string;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Copy elements from a source array to a target array in-place.
3
+ * This performs zero allocations by mutating the target array directly.
4
+ * Optimized for fixed-size arrays used in real-time rendering.
5
+ *
6
+ * @param source - The source array to copy from
7
+ * @param target - The target array to copy into (mutated in-place)
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * const src = [1, 2, 3];
12
+ * const dst = [0, 0, 0];
13
+ * copyArray(src, dst); // dst is now [1, 2, 3]
14
+ * ```
15
+ */
16
+ export declare function copyArray<T extends number>(source: readonly T[], target: T[]): void;
17
+ /**
18
+ * Normalize 0-255 color values to 0-1 range and set in-place.
19
+ * Zero allocations - mutates target array directly.
20
+ *
21
+ * @param target - Pre-allocated RGBA array to mutate
22
+ * @param r - Red channel (0-255)
23
+ * @param g - Green channel (0-255), defaults to r for grayscale
24
+ * @param b - Blue channel (0-255), defaults to r for grayscale
25
+ * @param a - Alpha channel (0-255), defaults to 255 (opaque)
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * const color = [0, 0, 0, 1];
30
+ * setColor(color, 255, 128, 64, 255); // color is now [1, 0.5, 0.25, 1]
31
+ * setColor(color, 127); // grayscale: [0.498, 0.498, 0.498, 1]
32
+ * ```
33
+ */
34
+ export declare function setColor(target: [number, number, number, number], r: number, g?: number, b?: number, a?: number): void;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Calculate the angle in degrees between two points.
3
+ * @param x1 - X coordinate of the first point
4
+ * @param y1 - Y coordinate of the first point
5
+ * @param x2 - X coordinate of the second point
6
+ * @param y2 - Y coordinate of the second point
7
+ * @returns The angle in degrees
8
+ */
9
+ export declare function angleBetweenPoints(x1: number, y1: number, x2: number, y2: number): number;
10
+ /**
11
+ * Calculate the Euclidean distance between two points.
12
+ * @param x1 - X coordinate of the first point
13
+ * @param y1 - Y coordinate of the first point
14
+ * @param x2 - X coordinate of the second point
15
+ * @param y2 - Y coordinate of the second point
16
+ * @returns The distance between the two points
17
+ */
18
+ export declare function distanceBetweenPoints(x1: number, y1: number, x2: number, y2: number): number;
19
+ /**
20
+ * Clamp a value between a minimum and maximum range.
21
+ * @param value Value to clamp
22
+ * @param min Minimum allowable value
23
+ * @param max Maximum allowable value
24
+ * @returns Clamped value
25
+ */
26
+ export declare function clamp(value: number, min: number, max: number): number;
27
+ /**
28
+ * Encode a rotation angle (in degrees) into a single normalized channel for GPU.
29
+ *
30
+ * This encoding packs a 0-360° rotation into a single 0-1 value by normalizing
31
+ * the angle to the full channel range.
32
+ *
33
+ * **How it works:**
34
+ * 1. Normalize degrees to 0-360° range (handle wrapping)
35
+ * 2. Divide by 360 to get 0-1 range
36
+ *
37
+ * This provides ~256 discrete rotation steps (in an 8-bit channel), which is
38
+ * sufficient for textmode rendering (~1.41° precision per step).
39
+ *
40
+ * @param degrees Rotation angle in degrees (0-360)
41
+ * @returns Normalized value (0-1) representing the rotation
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * encodeRotation(0); // 0
46
+ * encodeRotation(180); // 0.5
47
+ * encodeRotation(360); // 1.0 (wraps to 0)
48
+ * ```
49
+ */
50
+ export declare function encodeRotation(degrees: number): number;
51
+ /**
52
+ * Convert rotation angles from degrees to radians for 3D transformations.
53
+ *
54
+ * @param rotationXDegrees - Rotation around X-axis in degrees
55
+ * @param rotationYDegrees - Rotation around Y-axis in degrees
56
+ * @param rotationZDegrees - Rotation around Z-axis in degrees
57
+ * @returns Object containing rotation values in radians for each axis
58
+ *
59
+ * @example
60
+ * ```ts
61
+ * calculateRotationParams(90, 0, 45);
62
+ * // { radiansX: -1.571, radiansY: 0, radiansZ: -0.785 }
63
+ * ```
64
+ */
65
+ export declare function calculateRotationParams(rotationXDegrees: number, rotationYDegrees: number, rotationZDegrees: number): {
66
+ radiansX: number;
67
+ radiansY: number;
68
+ radiansZ: number;
69
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "textmode.js",
3
- "version": "0.4.1-beta.1",
3
+ "version": "0.6.0-beta.1",
4
4
  "description": "textmode.js is a lightweight creative coding library for creating real-time ASCII art on the web.",
5
5
  "type": "module",
6
6
  "types": "./dist/types/index.d.ts",
@@ -1,30 +0,0 @@
1
- import type { RenderState } from './RenderState';
2
- import type { GLShader } from './Shader';
3
- import type { DrawCommand } from './types/DrawCommand';
4
- /**
5
- * Global draw queue preserving user-issued draw order across geometry types.
6
- */
7
- export declare class DrawQueue implements Iterable<DrawCommand> {
8
- private _commands;
9
- private _nextId;
10
- private _size;
11
- /** Reserve or reuse a pooled slot */
12
- private _acquireSlot;
13
- /** Specialized enqueues (zero-alloc on steady state) */
14
- $enqueueRectangle(x: number, y: number, width: number, height: number, renderState: RenderState): number;
15
- /** Enqueue a custom-shaded rectangle preserving order */
16
- $enqueueCustomRect(x: number, y: number, width: number, height: number, shader: GLShader, uniforms: Record<string, any>, renderState: RenderState): number;
17
- $enqueueLine(x1: number, y1: number, x2: number, y2: number, thickness: number | undefined, renderState: RenderState): number;
18
- $enqueueEllipse(x: number, y: number, width: number, height: number, renderState: RenderState): number;
19
- $enqueueArc(x: number, y: number, width: number, height: number, start: number, stop: number, renderState: RenderState): number;
20
- $enqueueTriangle(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, renderState: RenderState): number;
21
- $enqueueBezierCurve(x1: number, y1: number, cp1x: number, cp1y: number, cp2x: number, cp2y: number, x2: number, y2: number, thickness: number | undefined, renderState: RenderState): number;
22
- /** Number of queued commands */
23
- get length(): number;
24
- /** True if no commands queued */
25
- get isEmpty(): boolean;
26
- /** Clear all queued commands */
27
- $clear(): void;
28
- /** Iterate in the exact order of insertion */
29
- [Symbol.iterator](): Iterator<DrawCommand>;
30
- }
@@ -1,30 +0,0 @@
1
- import type { IGeometry } from './types/GeometryTypes';
2
- import { GeometryType } from './types/GeometryTypes';
3
- import type { RenderContext } from './types/RenderTypes';
4
- import type { DrawCommand } from './types/DrawCommand';
5
- import { GLShader } from './Shader';
6
- interface IShaderProvider {
7
- $getCopyShader(): GLShader;
8
- }
9
- /**
10
- * Execute draw commands exactly in the order they were enqueued while
11
- * still batching consecutive commands of the same geometry type to minimize
12
- * state changes and buffer uploads.
13
- */
14
- export declare class RenderPipeline {
15
- private readonly _vaoMgr;
16
- private readonly _gl;
17
- private readonly _renderer;
18
- private _tempRectFBO;
19
- private _tempRectFBOSize;
20
- constructor(gl: WebGL2RenderingContext, renderer: IShaderProvider);
21
- $execute(context: RenderContext, commands: Iterable<DrawCommand>, geometries: Map<GeometryType, IGeometry>): void;
22
- /** Execute a custom-shaded rectangle using provided shader/uniforms */
23
- private _drawCustomRect;
24
- /** Draw a rectangle with the specified shader, uniforms, and viewport handling */
25
- private _drawRectangleWithShader;
26
- private _getCopyShader;
27
- private _getTempRectFBO;
28
- $dispose(): void;
29
- }
30
- export {};
@@ -1,73 +0,0 @@
1
- /**
2
- * Represents a snapshot of the current rendering state
3
- */
4
- export interface IRenderState {
5
- _lineWeight: number;
6
- _rotationX: number;
7
- _rotationY: number;
8
- _rotationZ: number;
9
- _character: [number, number, number];
10
- _charColor: [number, number, number, number];
11
- _cellColor: [number, number, number, number];
12
- _flipX: boolean;
13
- _flipY: boolean;
14
- _invert: boolean;
15
- _charRotation: [number, number];
16
- }
17
- /**
18
- * Manages rendering state and provides push/pop functionality for state management
19
- */
20
- export declare class RenderState {
21
- private _currentLineWeight;
22
- private _currentRotationX;
23
- private _currentRotationY;
24
- private _currentRotationZ;
25
- private _currentCharacter;
26
- private _currentCharColor;
27
- private _currentCellColor;
28
- private _flipHorizontally;
29
- private _flipVertically;
30
- private _invert;
31
- private _charRotation;
32
- private _canvasBackgroundColor;
33
- private _stateStack;
34
- /**
35
- * Save the current rendering state to the state stack
36
- */
37
- $push(): void;
38
- /**
39
- * Restore the most recently saved rendering state from the state stack
40
- */
41
- $pop(): void;
42
- /**
43
- * Write current state into an existing target object/struct to avoid allocations.
44
- * The target is expected to have the same shape as RenderStateSnapshot, with mutable arrays.
45
- */
46
- $writeSnapshotTo(target: {
47
- _lineWeight: number;
48
- _rotationX: number;
49
- _rotationY: number;
50
- _rotationZ: number;
51
- _character: number[];
52
- _charColor: number[];
53
- _cellColor: number[];
54
- _flipX: boolean;
55
- _flipY: boolean;
56
- _invert: boolean;
57
- _charRotation: number[];
58
- }): void;
59
- get lineWeight(): number;
60
- get canvasBackgroundColor(): [number, number, number, number];
61
- $setLineWeight(weight: number): void;
62
- $setRotationX(degrees: number): void;
63
- $setRotationY(degrees: number): void;
64
- $setRotationZ(degrees: number): void;
65
- $setCharacter(character: [number, number, number]): void;
66
- $setCharColor(r: number, g?: number, b?: number, a?: number): void;
67
- $setCellColor(r: number, g?: number, b?: number, a?: number): void;
68
- $setFlipHorizontally(flip: boolean): void;
69
- $setFlipVertically(flip: boolean): void;
70
- $setInvert(invert: boolean): void;
71
- $setCharRotation(rotation: number): void;
72
- $setCanvasBackground(r: number, g: number, b: number, a: number): void;
73
- }
@@ -1,158 +0,0 @@
1
- import { GLFramebuffer } from "./Framebuffer";
2
- import type { FramebufferOptions } from '../webgl/Framebuffer';
3
- import { GLShader } from "./Shader";
4
- import { RenderState } from "./RenderState";
5
- import type { TextmodeImage } from "../../textmode/TextmodeImage";
6
- /**
7
- * Core WebGL renderer that manages the WebGL context and provides high-level rendering operations
8
- */
9
- export declare class GLRenderer {
10
- private _gl;
11
- private _currentShader;
12
- private _shaderManager;
13
- private _userShader;
14
- private _userUniforms;
15
- private _ndcQuadBuffer;
16
- private readonly _geometries;
17
- private readonly _renderPipeline;
18
- private readonly _drawQueue;
19
- private _renderState;
20
- private _stateStack;
21
- constructor(gl: WebGL2RenderingContext);
22
- /** Get or create a geometry instance */
23
- private _getGeometry;
24
- /**
25
- * Set the current shader
26
- */
27
- $shader(shader: GLShader): void;
28
- $createShader(vertexSource: string, fragmentSource: string): GLShader;
29
- /**
30
- * Get the shared MRT copy shader
31
- */
32
- $getCopyShader(): GLShader;
33
- /**
34
- * Get the main MRT draw shader
35
- */
36
- $getMainDrawShader(): GLShader;
37
- /**
38
- * Get the ASCII conversion shader
39
- */
40
- $getConversionShader(): GLShader;
41
- /** Internal: image to MRT shader */
42
- private $getImageToMRTShader;
43
- /**
44
- * Set a custom user shader for subsequent rendering operations
45
- */
46
- $setUserShader(shader: GLShader | null): void;
47
- /**
48
- * Set a uniform value for the current user shader
49
- */
50
- $setUniform(name: string, value: any): void;
51
- /**
52
- * Set multiple uniform values for the current user shader
53
- */
54
- $setUserUniforms(uniforms: Record<string, any>): void;
55
- /**
56
- * Create a filter shader using the standard instanced vertex shader
57
- */
58
- $createFilterShader(fragmentSource: string): GLShader;
59
- /**
60
- * Enqueue an image blit from a source MRT framebuffer to the current render target.
61
- * This uses the internal copy shader and preserves draw ordering within the pipeline.
62
- */
63
- $imageRect(src: GLFramebuffer, x: number, y: number, width: number, height: number): void;
64
- /**
65
- * Enqueue drawing of an RGBA texture by converting to MRT attachments on the fly.
66
- * The texture is sampled and resized into the target rect, writing brightness to character and grayscale to primary color.
67
- */
68
- /**
69
- * Enqueue drawing of a TextmodeImage by converting its RGBA texture to MRT attachments on the fly.
70
- * The method accepts only TextmodeImage to make the intent explicit and simplify callers.
71
- */
72
- $imageTexture(image: TextmodeImage, x: number, y: number, width: number, height: number): void;
73
- /**
74
- * Draw a quad covering the pixel rectangle (x, y, width, height) on the canvas.
75
- * The quad is converted to NDC and rendered with the current shader using only a_position.
76
- * Origin: top-left (canvas space)
77
- */
78
- $quadPixels(x: number, y: number, width: number, height: number): void;
79
- /**
80
- * Draw a rectangle.
81
- */
82
- $rect(x: number, y: number, width: number, height: number): void;
83
- /**
84
- * Draw a line from (x1, y1) to (x2, y2).
85
- * @param x1 X-coordinate of the line start point
86
- * @param y1 Y-coordinate of the line start point
87
- * @param x2 X-coordinate of the line end point
88
- * @param y2 Y-coordinate of the line end point
89
- */
90
- $line(x1: number, y1: number, x2: number, y2: number): void;
91
- /**
92
- * Draw an ellipse.
93
- * @param x X coordinate (center)
94
- * @param y Y coordinate (center)
95
- * @param width Ellipse width
96
- * @param height Ellipse height
97
- */
98
- $ellipse(x: number, y: number, width: number, height: number): void;
99
- /**
100
- * Draw a triangle.
101
- * @param x1 First vertex X coordinate
102
- * @param y1 First vertex Y coordinate
103
- * @param x2 Second vertex X coordinate
104
- * @param y2 Second vertex Y coordinate
105
- * @param x3 Third vertex X coordinate
106
- * @param y3 Third vertex Y coordinate
107
- */
108
- $triangle(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number): void;
109
- /**
110
- * Draw a bezier curve.
111
- * @param x1 Start point X coordinate
112
- * @param y1 Start point Y coordinate
113
- * @param cp1x Control point 1 X coordinate
114
- * @param cp1y Control point 1 Y coordinate
115
- * @param cp2x Control point 2 X coordinate
116
- * @param cp2y Control point 2 Y coordinate
117
- * @param x2 End point X coordinate
118
- * @param y2 End point Y coordinate
119
- */
120
- $bezierCurve(x1: number, y1: number, cp1x: number, cp1y: number, cp2x: number, cp2y: number, x2: number, y2: number): void;
121
- /**
122
- * Create a new framebuffer
123
- */
124
- $createFramebuffer(width: number, height: number, attachmentCount?: number, options?: FramebufferOptions): GLFramebuffer;
125
- $arc(x: number, y: number, width: number, height: number, start: number, stop: number): void;
126
- /**
127
- * Fill the current framebuffer with a solid color
128
- */
129
- $background(r: number, g?: number, b?: number, a?: number): void;
130
- /**
131
- * Clear the current framebuffer
132
- */
133
- $clear(r?: number, g?: number, b?: number, a?: number): void;
134
- /**
135
- * Ensure viewport matches canvas dimensions
136
- */
137
- $resetViewport(): void;
138
- /**
139
- * Get the WebGL context
140
- */
141
- get context(): WebGLRenderingContext;
142
- get state(): RenderState;
143
- /** Internal: push a specific render state as current (used by user FBO begin) */
144
- $pushState(state: RenderState): void;
145
- /** Internal: pop the render state after user FBO end */
146
- $popState(): void;
147
- /**
148
- * Flush all batched instances for instanced rendering.
149
- * This must be called at the end of each frame to actually render the batched geometry.
150
- * @param shader The instanced shader to use for rendering
151
- */
152
- $flushInstances(shader: GLShader): void;
153
- /**
154
- * Dispose of all WebGL resources managed by this renderer.
155
- * This method is idempotent and safe to call multiple times.
156
- */
157
- $dispose(): void;
158
- }