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.
- package/dist/textmode.esm.js +2866 -2173
- package/dist/textmode.esm.min.js +2866 -2173
- package/dist/textmode.umd.js +11 -8
- package/dist/textmode.umd.min.js +11 -8
- package/dist/types/Textmode.d.ts +13 -22
- package/dist/types/index.d.ts +8 -6
- package/dist/types/rendering/index.d.ts +3 -3
- package/dist/types/rendering/webgl/batching/DrawQueue.d.ts +89 -0
- package/dist/types/rendering/webgl/{VAOManager.d.ts → batching/GeometryAttributeCache.d.ts} +4 -4
- package/dist/types/rendering/webgl/batching/InstanceAttributeBinder.d.ts +87 -0
- package/dist/types/rendering/webgl/{InstanceBatch.d.ts → batching/InstanceBatch.d.ts} +25 -34
- package/dist/types/rendering/webgl/batching/InstanceBuffer.d.ts +78 -0
- package/dist/types/rendering/webgl/{InstanceData.d.ts → batching/InstanceData.d.ts} +11 -18
- package/dist/types/rendering/webgl/batching/InstanceWriter.d.ts +70 -0
- package/dist/types/rendering/webgl/{Framebuffer.d.ts → core/Framebuffer.d.ts} +37 -39
- package/dist/types/rendering/webgl/core/Renderer.d.ts +64 -0
- package/dist/types/rendering/webgl/{Shader.d.ts → core/Shader.d.ts} +2 -23
- package/dist/types/rendering/webgl/core/interfaces/IFramebuffer.d.ts +103 -0
- package/dist/types/rendering/webgl/core/interfaces/IRenderer.d.ts +210 -0
- package/dist/types/rendering/webgl/geometries/{Arc.d.ts → 2d/Arc.d.ts} +5 -4
- package/dist/types/rendering/webgl/geometries/{BezierCurve.d.ts → 2d/BezierCurve.d.ts} +5 -4
- package/dist/types/rendering/webgl/geometries/{Ellipse.d.ts → 2d/Ellipse.d.ts} +6 -5
- package/dist/types/rendering/webgl/geometries/{Line.d.ts → 2d/Line.d.ts} +5 -4
- package/dist/types/rendering/webgl/geometries/{Rectangle.d.ts → 2d/Rectangle.d.ts} +5 -4
- package/dist/types/rendering/webgl/geometries/{Triangle.d.ts → 2d/Triangle.d.ts} +5 -4
- package/dist/types/rendering/webgl/geometries/BaseGeometry.d.ts +30 -26
- package/dist/types/rendering/webgl/geometries/immediate/ImmediateQuad.d.ts +33 -0
- package/dist/types/rendering/webgl/geometries/index.d.ts +6 -6
- package/dist/types/rendering/webgl/geometries/utils/GeometryDescriptors.d.ts +31 -0
- package/dist/types/rendering/webgl/geometries/utils/GeometryGenerator.d.ts +16 -0
- package/dist/types/rendering/webgl/index.d.ts +15 -14
- package/dist/types/rendering/webgl/materials/Material.d.ts +26 -0
- package/dist/types/rendering/webgl/materials/MaterialManager.d.ts +63 -0
- package/dist/types/rendering/webgl/materials/index.d.ts +2 -0
- package/dist/types/rendering/webgl/pipeline/MaterialBatchPipeline.d.ts +63 -0
- package/dist/types/rendering/webgl/pipeline/index.d.ts +7 -0
- package/dist/types/rendering/webgl/state/RenderState.d.ts +143 -0
- package/dist/types/rendering/webgl/types/DrawCommand.d.ts +5 -3
- package/dist/types/rendering/webgl/types/GeometryTypes.d.ts +10 -10
- package/dist/types/rendering/webgl/types/RenderTypes.d.ts +1 -1
- package/dist/types/rendering/webgl/utils/GLUtils.d.ts +45 -0
- package/dist/types/rendering/webgl/utils/hash.d.ts +118 -0
- package/dist/types/textmode/AnimationController.d.ts +11 -21
- package/dist/types/textmode/Canvas.d.ts +10 -2
- package/dist/types/textmode/Grid.d.ts +2 -0
- package/dist/types/textmode/TextmodeColor.d.ts +57 -0
- package/dist/types/textmode/Textmodifier.d.ts +37 -213
- package/dist/types/textmode/interfaces/ITextmodifier.d.ts +272 -0
- package/dist/types/textmode/interfaces/index.d.ts +1 -0
- package/dist/types/textmode/loadables/TextmodeImage.d.ts +21 -0
- package/dist/types/textmode/loadables/TextmodeSource.d.ts +130 -0
- package/dist/types/textmode/loadables/TextmodeVideo.d.ts +237 -0
- package/dist/types/textmode/{font → loadables/font}/CharacterColorMapper.d.ts +1 -1
- package/dist/types/textmode/{font → loadables/font}/CharacterExtractor.d.ts +0 -10
- package/dist/types/textmode/{font → loadables/font}/TextmodeFont.d.ts +6 -3
- package/dist/types/textmode/{font → loadables/font}/TextureAtlas.d.ts +4 -11
- package/dist/types/textmode/{font → loadables/font}/typr/types.d.ts +0 -6
- package/dist/types/textmode/loadables/index.d.ts +5 -0
- package/dist/types/textmode/loading/LoadingPhaseTracker.d.ts +20 -0
- package/dist/types/textmode/loading/LoadingScreenManager.d.ts +170 -0
- package/dist/types/textmode/loading/LoadingScreenState.d.ts +22 -0
- package/dist/types/textmode/loading/LoadingScreenTheme.d.ts +26 -0
- package/dist/types/textmode/loading/LoadingScreenTransition.d.ts +17 -0
- package/dist/types/textmode/loading/index.d.ts +6 -0
- package/dist/types/textmode/loading/templates/SpinnerTemplate.d.ts +2 -0
- package/dist/types/textmode/loading/templates/index.d.ts +1 -0
- package/dist/types/textmode/loading/types.d.ts +251 -0
- package/dist/types/textmode/managers/KeyboardManager.d.ts +2 -3
- package/dist/types/textmode/managers/MouseManager.d.ts +1 -1
- package/dist/types/textmode/{plugins → managers}/PluginManager.d.ts +12 -15
- package/dist/types/textmode/managers/TouchManager.d.ts +0 -2
- package/dist/types/textmode/mixins/AnimationMixin.d.ts +2 -122
- package/dist/types/textmode/mixins/FontMixin.d.ts +2 -77
- package/dist/types/textmode/mixins/KeyboardMixin.d.ts +3 -85
- package/dist/types/textmode/mixins/MouseMixin.d.ts +3 -130
- package/dist/types/textmode/mixins/RenderingMixin.d.ts +2 -749
- package/dist/types/textmode/mixins/TextmodifierMixin.d.ts +2 -44
- package/dist/types/textmode/mixins/TouchMixin.d.ts +2 -187
- package/dist/types/textmode/mixins/index.d.ts +8 -8
- package/dist/types/textmode/mixins/interfaces/IAnimationMixin.d.ts +167 -0
- package/dist/types/textmode/mixins/interfaces/IFontMixin.d.ts +46 -0
- package/dist/types/textmode/mixins/interfaces/IKeyboardMixin.d.ts +235 -0
- package/dist/types/textmode/mixins/interfaces/IMouseMixin.d.ts +457 -0
- package/dist/types/textmode/mixins/interfaces/IRenderingMixin.d.ts +1085 -0
- package/dist/types/textmode/mixins/interfaces/ITouchMixin.d.ts +186 -0
- package/dist/types/textmode/types.d.ts +49 -0
- package/dist/types/textmode/utils/cssColor.d.ts +8 -0
- package/dist/types/utils/array.d.ts +34 -0
- package/dist/types/utils/math.d.ts +69 -0
- package/package.json +1 -1
- package/dist/types/rendering/webgl/DrawQueue.d.ts +0 -30
- package/dist/types/rendering/webgl/RenderPipeline.d.ts +0 -30
- package/dist/types/rendering/webgl/RenderState.d.ts +0 -73
- package/dist/types/rendering/webgl/Renderer.d.ts +0 -158
- package/dist/types/rendering/webgl/ShaderManager.d.ts +0 -66
- package/dist/types/rendering/webgl/geometries/NoiseGrid.d.ts +0 -1
- package/dist/types/textmode/TextmodeImage.d.ts +0 -161
- package/dist/types/textmode/mixins/ShaderMixin.d.ts +0 -1
- /package/dist/types/rendering/webgl/{StateCache.d.ts → utils/ViewportCache.d.ts} +0 -0
- /package/dist/types/textmode/{font → loadables/font}/MetricsCalculator.d.ts +0 -0
- /package/dist/types/textmode/{font → loadables/font}/index.d.ts +0 -0
- /package/dist/types/textmode/{font → loadables/font}/types.d.ts +0 -0
- /package/dist/types/textmode/{font → loadables/font}/typr/Typr.d.ts +0 -0
- /package/dist/types/textmode/{font → loadables/font}/utils/FontTableReader.d.ts +0 -0
- /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,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
|
-
}
|