@flyingrobots/bijou-tui 5.0.0 → 7.1.0

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 (125) hide show
  1. package/README.md +152 -1
  2. package/dist/animate.d.ts +4 -0
  3. package/dist/animate.d.ts.map +1 -1
  4. package/dist/animate.js +47 -20
  5. package/dist/animate.js.map +1 -1
  6. package/dist/app-frame-actions.d.ts.map +1 -1
  7. package/dist/app-frame-actions.js +56 -1
  8. package/dist/app-frame-actions.js.map +1 -1
  9. package/dist/app-frame-i18n.d.ts.map +1 -1
  10. package/dist/app-frame-i18n.js +3 -1
  11. package/dist/app-frame-i18n.js.map +1 -1
  12. package/dist/app-frame-overlays.d.ts +16 -1
  13. package/dist/app-frame-overlays.d.ts.map +1 -1
  14. package/dist/app-frame-overlays.js +63 -1
  15. package/dist/app-frame-overlays.js.map +1 -1
  16. package/dist/app-frame-palette.d.ts.map +1 -1
  17. package/dist/app-frame-palette.js +36 -16
  18. package/dist/app-frame-palette.js.map +1 -1
  19. package/dist/app-frame-render.d.ts.map +1 -1
  20. package/dist/app-frame-render.js +14 -5
  21. package/dist/app-frame-render.js.map +1 -1
  22. package/dist/app-frame-types.d.ts +22 -0
  23. package/dist/app-frame-types.d.ts.map +1 -1
  24. package/dist/app-frame-types.js.map +1 -1
  25. package/dist/app-frame-utils.d.ts +3 -1
  26. package/dist/app-frame-utils.d.ts.map +1 -1
  27. package/dist/app-frame-utils.js +5 -0
  28. package/dist/app-frame-utils.js.map +1 -1
  29. package/dist/app-frame.d.ts +68 -6
  30. package/dist/app-frame.d.ts.map +1 -1
  31. package/dist/app-frame.js +121 -17
  32. package/dist/app-frame.js.map +1 -1
  33. package/dist/canvas.d.ts +11 -3
  34. package/dist/canvas.d.ts.map +1 -1
  35. package/dist/canvas.js +122 -9
  36. package/dist/canvas.js.map +1 -1
  37. package/dist/cell-glyph-fit.d.ts +20 -0
  38. package/dist/cell-glyph-fit.d.ts.map +1 -0
  39. package/dist/cell-glyph-fit.js +82 -0
  40. package/dist/cell-glyph-fit.js.map +1 -0
  41. package/dist/command-palette.d.ts +2 -0
  42. package/dist/command-palette.d.ts.map +1 -1
  43. package/dist/command-palette.js +36 -19
  44. package/dist/command-palette.js.map +1 -1
  45. package/dist/eventbus.d.ts +20 -0
  46. package/dist/eventbus.d.ts.map +1 -1
  47. package/dist/eventbus.js +47 -0
  48. package/dist/eventbus.js.map +1 -1
  49. package/dist/file-picker.d.ts +4 -0
  50. package/dist/file-picker.d.ts.map +1 -1
  51. package/dist/file-picker.js +9 -1
  52. package/dist/file-picker.js.map +1 -1
  53. package/dist/focus-area.d.ts +6 -5
  54. package/dist/focus-area.d.ts.map +1 -1
  55. package/dist/focus-area.js +6 -5
  56. package/dist/focus-area.js.map +1 -1
  57. package/dist/focus-map.d.ts +40 -0
  58. package/dist/focus-map.d.ts.map +1 -0
  59. package/dist/focus-map.js +133 -0
  60. package/dist/focus-map.js.map +1 -0
  61. package/dist/index.d.ts +22 -4
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +14 -2
  64. package/dist/index.js.map +1 -1
  65. package/dist/input-map.d.ts +68 -0
  66. package/dist/input-map.d.ts.map +1 -0
  67. package/dist/input-map.js +162 -0
  68. package/dist/input-map.js.map +1 -0
  69. package/dist/input-routing-inspector.d.ts +24 -0
  70. package/dist/input-routing-inspector.d.ts.map +1 -0
  71. package/dist/input-routing-inspector.js +76 -0
  72. package/dist/input-routing-inspector.js.map +1 -0
  73. package/dist/keybindings.d.ts.map +1 -1
  74. package/dist/keybindings.js +3 -0
  75. package/dist/keybindings.js.map +1 -1
  76. package/dist/layout-inspector.d.ts +31 -0
  77. package/dist/layout-inspector.d.ts.map +1 -0
  78. package/dist/layout-inspector.js +133 -0
  79. package/dist/layout-inspector.js.map +1 -0
  80. package/dist/notification.d.ts.map +1 -1
  81. package/dist/notification.js +38 -5
  82. package/dist/notification.js.map +1 -1
  83. package/dist/pipeline/middleware/motion.d.ts.map +1 -1
  84. package/dist/pipeline/middleware/motion.js +2 -1
  85. package/dist/pipeline/middleware/motion.js.map +1 -1
  86. package/dist/pipeline/middleware/paint.d.ts.map +1 -1
  87. package/dist/pipeline/middleware/paint.js +2 -1
  88. package/dist/pipeline/middleware/paint.js.map +1 -1
  89. package/dist/pipeline/pipeline.d.ts +8 -1
  90. package/dist/pipeline/pipeline.d.ts.map +1 -1
  91. package/dist/pipeline/pipeline.js +43 -7
  92. package/dist/pipeline/pipeline.js.map +1 -1
  93. package/dist/raster-glyph.d.ts +45 -0
  94. package/dist/raster-glyph.d.ts.map +1 -0
  95. package/dist/raster-glyph.js +405 -0
  96. package/dist/raster-glyph.js.map +1 -0
  97. package/dist/raytrace.d.ts +59 -0
  98. package/dist/raytrace.d.ts.map +1 -0
  99. package/dist/raytrace.js +121 -0
  100. package/dist/raytrace.js.map +1 -0
  101. package/dist/runtime-binding.d.ts +59 -0
  102. package/dist/runtime-binding.d.ts.map +1 -0
  103. package/dist/runtime-binding.js +271 -0
  104. package/dist/runtime-binding.js.map +1 -0
  105. package/dist/runtime.d.ts.map +1 -1
  106. package/dist/runtime.js +51 -6
  107. package/dist/runtime.js.map +1 -1
  108. package/dist/shell-quit.js +1 -1
  109. package/dist/shell-quit.js.map +1 -1
  110. package/dist/surface-budget.d.ts +27 -0
  111. package/dist/surface-budget.d.ts.map +1 -0
  112. package/dist/surface-budget.js +61 -0
  113. package/dist/surface-budget.js.map +1 -0
  114. package/dist/surface-diff.d.ts +36 -0
  115. package/dist/surface-diff.d.ts.map +1 -0
  116. package/dist/surface-diff.js +202 -0
  117. package/dist/surface-diff.js.map +1 -0
  118. package/dist/surface-layout.d.ts +11 -0
  119. package/dist/surface-layout.d.ts.map +1 -1
  120. package/dist/surface-layout.js +16 -1
  121. package/dist/surface-layout.js.map +1 -1
  122. package/dist/types.d.ts +8 -0
  123. package/dist/types.d.ts.map +1 -1
  124. package/dist/types.js.map +1 -1
  125. package/package.json +4 -4
@@ -0,0 +1,405 @@
1
+ import { createSurface } from '@flyingrobots/bijou';
2
+ const DEFAULT_RASTER_GLYPH_CHARSET = ' .:-=+*#%@';
3
+ const DEFAULT_RENDERER = {
4
+ kind: 'charset',
5
+ chars: DEFAULT_RASTER_GLYPH_CHARSET,
6
+ order: 'light-to-dark',
7
+ };
8
+ const DEFAULT_THRESHOLD = 0.5;
9
+ const DEFAULT_CELL_ASPECT_RATIO = 1;
10
+ const DEFAULT_CONTRAST = 1;
11
+ const MIN_CONTRAST = 0.1;
12
+ const MAX_CONTRAST = 4;
13
+ const ORDERED_DITHER_STRENGTH = 0.2;
14
+ const BAYER_4X4 = [
15
+ [0, 8, 2, 10],
16
+ [12, 4, 14, 6],
17
+ [3, 11, 1, 9],
18
+ [15, 7, 13, 5],
19
+ ];
20
+ const BRAILLE_DOT_MAP = [
21
+ [0x01, 0x08],
22
+ [0x02, 0x10],
23
+ [0x04, 0x20],
24
+ [0x40, 0x80],
25
+ ];
26
+ const QUAD_CHARS = [
27
+ ' ', '▘', '▝', '▀',
28
+ '▖', '▌', '▞', '▛',
29
+ '▗', '▚', '▐', '▜',
30
+ '▄', '▙', '▟', '█',
31
+ ];
32
+ export const RASTER_GLYPH_CHARSETS = {
33
+ ascii: ' .:-=+*#%@',
34
+ blocks: ' ░▒▓█',
35
+ launch: '/\\MXYZabc!?=-. ',
36
+ };
37
+ export function validateRasterGlyphCharset(chars) {
38
+ const glyphs = Array.from(chars);
39
+ if (glyphs.length === 0) {
40
+ throw new RangeError('Raster glyph charset must contain at least one glyph.');
41
+ }
42
+ for (const glyph of glyphs) {
43
+ if (glyph === '\n' || glyph === '\r') {
44
+ throw new RangeError('Raster glyph charset must be single-line.');
45
+ }
46
+ const codePoint = glyph.codePointAt(0);
47
+ if (codePoint !== undefined && (codePoint < 0x20 || codePoint === 0x7f)) {
48
+ throw new RangeError('Raster glyph charset cannot contain control characters.');
49
+ }
50
+ }
51
+ return glyphs;
52
+ }
53
+ export function rasterToGlyphSurface(frame, options) {
54
+ validateRgbaFrame(frame);
55
+ const columns = sanitizeDimension(options.columns);
56
+ const rows = sanitizeDimension(options.rows);
57
+ const surface = createSurface(columns, rows, { char: ' ', empty: false });
58
+ if (columns === 0 || rows === 0)
59
+ return surface;
60
+ const fit = options.fit ?? 'stretch';
61
+ const cellAspectRatio = sanitizeCellAspectRatio(options.cellAspectRatio);
62
+ const zoom = sanitizeZoom(options.zoom);
63
+ const panX = sanitizePan(options.panX);
64
+ const panY = sanitizePan(options.panY);
65
+ const colorMode = options.colorMode ?? 'none';
66
+ const renderer = options.renderer ?? DEFAULT_RENDERER;
67
+ const adjustments = {
68
+ contrast: sanitizeContrast(options.contrast),
69
+ dither: sanitizeDitherMode(options.dither),
70
+ };
71
+ const transform = createFitTransform(frame, columns, rows, fit, cellAspectRatio, zoom, panX, panY);
72
+ switch (renderer.kind) {
73
+ case 'charset':
74
+ renderCharset(surface, frame, transform, renderer, colorMode, adjustments);
75
+ break;
76
+ case 'braille':
77
+ renderBraille(surface, frame, transform, renderer.threshold, colorMode, adjustments);
78
+ break;
79
+ case 'quad':
80
+ renderQuad(surface, frame, transform, renderer.threshold, colorMode, adjustments);
81
+ break;
82
+ }
83
+ return surface;
84
+ }
85
+ function renderCharset(surface, frame, transform, renderer, colorMode, adjustments) {
86
+ const glyphs = validateRasterGlyphCharset(renderer.chars ?? DEFAULT_RASTER_GLYPH_CHARSET);
87
+ const order = renderer.order ?? 'light-to-dark';
88
+ for (let y = 0; y < surface.height; y++) {
89
+ for (let x = 0; x < surface.width; x++) {
90
+ const sample = sampleTargetRect(frame, transform, x, y, x + 1, y + 1);
91
+ const adjustedSample = adjustSample(sample, x, y, adjustments);
92
+ const char = adjustedSample === undefined
93
+ ? ' '
94
+ : glyphForDarkness(adjustedSample.darkness, glyphs, order);
95
+ surface.set(x, y, cellForSample(char, adjustedSample, colorMode, DEFAULT_THRESHOLD));
96
+ }
97
+ }
98
+ }
99
+ function renderBraille(surface, frame, transform, thresholdValue, colorMode, adjustments) {
100
+ const threshold = sanitizeThreshold(thresholdValue);
101
+ for (let y = 0; y < surface.height; y++) {
102
+ for (let x = 0; x < surface.width; x++) {
103
+ let code = 0;
104
+ const colors = createColorAccumulator();
105
+ const darkColors = createColorAccumulator();
106
+ const lightColors = createColorAccumulator();
107
+ for (let sy = 0; sy < 4; sy++) {
108
+ for (let sx = 0; sx < 2; sx++) {
109
+ const sample = sampleTargetRect(frame, transform, x + (sx / 2), y + (sy / 4), x + ((sx + 1) / 2), y + ((sy + 1) / 4));
110
+ const adjustedSample = adjustSample(sample, (x * 2) + sx, (y * 4) + sy, adjustments);
111
+ accumulateSampleColors(adjustedSample, colors, darkColors, lightColors, threshold);
112
+ if (adjustedSample !== undefined && adjustedSample.darkness >= threshold) {
113
+ code |= BRAILLE_DOT_MAP[sy][sx];
114
+ }
115
+ }
116
+ }
117
+ const char = String.fromCharCode(0x2800 + code);
118
+ surface.set(x, y, cellForAccumulatedColors(char, colorMode, colors, darkColors, lightColors));
119
+ }
120
+ }
121
+ }
122
+ function renderQuad(surface, frame, transform, thresholdValue, colorMode, adjustments) {
123
+ const threshold = sanitizeThreshold(thresholdValue);
124
+ for (let y = 0; y < surface.height; y++) {
125
+ for (let x = 0; x < surface.width; x++) {
126
+ let mask = 0;
127
+ const colors = createColorAccumulator();
128
+ const darkColors = createColorAccumulator();
129
+ const lightColors = createColorAccumulator();
130
+ for (let sy = 0; sy < 2; sy++) {
131
+ for (let sx = 0; sx < 2; sx++) {
132
+ const sample = sampleTargetRect(frame, transform, x + (sx / 2), y + (sy / 2), x + ((sx + 1) / 2), y + ((sy + 1) / 2));
133
+ const adjustedSample = adjustSample(sample, (x * 2) + sx, (y * 2) + sy, adjustments);
134
+ accumulateSampleColors(adjustedSample, colors, darkColors, lightColors, threshold);
135
+ if (adjustedSample !== undefined && adjustedSample.darkness >= threshold) {
136
+ mask |= 1 << (sy * 2 + sx);
137
+ }
138
+ }
139
+ }
140
+ const char = QUAD_CHARS[mask] ?? ' ';
141
+ surface.set(x, y, cellForAccumulatedColors(char, colorMode, colors, darkColors, lightColors));
142
+ }
143
+ }
144
+ }
145
+ function glyphForDarkness(darkness, glyphs, order) {
146
+ if (glyphs.length === 1)
147
+ return glyphs[0] ?? ' ';
148
+ const t = order === 'light-to-dark' ? darkness : 1 - darkness;
149
+ const index = Math.round(clampUnit(t) * (glyphs.length - 1));
150
+ return glyphs[index] ?? glyphs[glyphs.length - 1] ?? ' ';
151
+ }
152
+ function adjustSample(sample, x, y, adjustments) {
153
+ if (sample === undefined)
154
+ return undefined;
155
+ return {
156
+ ...sample,
157
+ darkness: adjustedDarkness(sample.darkness, x, y, adjustments),
158
+ };
159
+ }
160
+ function adjustedDarkness(darkness, x, y, adjustments) {
161
+ let next = ((darkness - 0.5) * adjustments.contrast) + 0.5;
162
+ if (adjustments.dither === 'ordered') {
163
+ next += orderedDitherOffset(x, y);
164
+ }
165
+ return clampUnit(next);
166
+ }
167
+ function orderedDitherOffset(x, y) {
168
+ const row = BAYER_4X4[Math.abs(Math.floor(y)) % BAYER_4X4.length];
169
+ const value = row[Math.abs(Math.floor(x)) % row.length];
170
+ return ((value - 7.5) / 16) * ORDERED_DITHER_STRENGTH;
171
+ }
172
+ function createFitTransform(frame, columns, rows, fit, cellAspectRatio, zoom, panX, panY) {
173
+ if (fit === 'stretch') {
174
+ const drawWidth = columns * zoom;
175
+ const drawHeight = rows * zoom;
176
+ return {
177
+ scaleX: drawWidth / frame.width,
178
+ scaleY: drawHeight / frame.height,
179
+ offsetX: clampDrawOffset(((columns - drawWidth) / 2) + panX, columns, drawWidth),
180
+ offsetY: clampDrawOffset(((rows - drawHeight) / 2) + panY, rows, drawHeight),
181
+ drawWidth,
182
+ drawHeight,
183
+ };
184
+ }
185
+ const visualTargetWidth = columns * cellAspectRatio;
186
+ const scaleX = visualTargetWidth / frame.width;
187
+ const scaleY = rows / frame.height;
188
+ const baseScale = fit === 'contain'
189
+ ? Math.min(scaleX, scaleY)
190
+ : Math.max(scaleX, scaleY);
191
+ const scale = baseScale * zoom;
192
+ const drawWidth = (frame.width * scale) / cellAspectRatio;
193
+ const drawHeight = frame.height * scale;
194
+ return {
195
+ scaleX: scale / cellAspectRatio,
196
+ scaleY: scale,
197
+ offsetX: clampDrawOffset(((columns - drawWidth) / 2) + panX, columns, drawWidth),
198
+ offsetY: clampDrawOffset(((rows - drawHeight) / 2) + panY, rows, drawHeight),
199
+ drawWidth,
200
+ drawHeight,
201
+ };
202
+ }
203
+ function clampDrawOffset(offset, targetSize, drawSize) {
204
+ if (drawSize <= targetSize)
205
+ return (targetSize - drawSize) / 2;
206
+ return clampRange(offset, targetSize - drawSize, 0);
207
+ }
208
+ function sampleTargetRect(frame, transform, tx0, ty0, tx1, ty1) {
209
+ const rect = sourceRectForTargetRect(frame, transform, tx0, ty0, tx1, ty1);
210
+ if (rect === undefined)
211
+ return undefined;
212
+ const colors = createColorAccumulator();
213
+ let totalDarkness = 0;
214
+ let sampleCount = 0;
215
+ const startX = Math.max(0, Math.floor(rect.x0));
216
+ const endX = Math.min(frame.width, Math.ceil(rect.x1));
217
+ const startY = Math.max(0, Math.floor(rect.y0));
218
+ const endY = Math.min(frame.height, Math.ceil(rect.y1));
219
+ for (let py = startY; py < endY; py++) {
220
+ for (let px = startX; px < endX; px++) {
221
+ const centerX = px + 0.5;
222
+ const centerY = py + 0.5;
223
+ if (centerX < rect.x0 || centerX > rect.x1 || centerY < rect.y0 || centerY > rect.y1) {
224
+ continue;
225
+ }
226
+ const pixel = readPixel(frame, px, py);
227
+ totalDarkness += pixel.darkness;
228
+ if (pixel.alpha > 0) {
229
+ accumulateColor(colors, pixel.r, pixel.g, pixel.b);
230
+ }
231
+ sampleCount++;
232
+ }
233
+ }
234
+ if (sampleCount === 0) {
235
+ const px = Math.max(0, Math.min(frame.width - 1, Math.floor((rect.x0 + rect.x1) / 2)));
236
+ const py = Math.max(0, Math.min(frame.height - 1, Math.floor((rect.y0 + rect.y1) / 2)));
237
+ const pixel = readPixel(frame, px, py);
238
+ totalDarkness = pixel.darkness;
239
+ if (pixel.alpha > 0) {
240
+ accumulateColor(colors, pixel.r, pixel.g, pixel.b);
241
+ }
242
+ sampleCount = 1;
243
+ }
244
+ return {
245
+ darkness: totalDarkness / sampleCount,
246
+ color: averagedColor(colors),
247
+ };
248
+ }
249
+ function sourceRectForTargetRect(frame, transform, tx0, ty0, tx1, ty1) {
250
+ const visibleX0 = Math.max(tx0, transform.offsetX);
251
+ const visibleY0 = Math.max(ty0, transform.offsetY);
252
+ const visibleX1 = Math.min(tx1, transform.offsetX + transform.drawWidth);
253
+ const visibleY1 = Math.min(ty1, transform.offsetY + transform.drawHeight);
254
+ if (visibleX0 >= visibleX1 || visibleY0 >= visibleY1) {
255
+ return undefined;
256
+ }
257
+ const x0 = clampRange((visibleX0 - transform.offsetX) / transform.scaleX, 0, frame.width);
258
+ const y0 = clampRange((visibleY0 - transform.offsetY) / transform.scaleY, 0, frame.height);
259
+ const x1 = clampRange((visibleX1 - transform.offsetX) / transform.scaleX, 0, frame.width);
260
+ const y1 = clampRange((visibleY1 - transform.offsetY) / transform.scaleY, 0, frame.height);
261
+ if (x0 >= x1 || y0 >= y1)
262
+ return undefined;
263
+ return { x0, y0, x1, y1 };
264
+ }
265
+ function cellForSample(char, sample, colorMode, threshold) {
266
+ if (sample === undefined)
267
+ return { char: ' ', empty: false };
268
+ if (colorMode === 'none')
269
+ return { char, empty: false };
270
+ if (colorMode === 'fg')
271
+ return colorCell(char, sample.color, undefined);
272
+ return sample.darkness >= threshold
273
+ ? colorCell(char, sample.color, undefined)
274
+ : colorCell(char, undefined, sample.color);
275
+ }
276
+ function cellForAccumulatedColors(char, colorMode, colors, darkColors, lightColors) {
277
+ if (colorMode === 'none')
278
+ return { char, empty: false };
279
+ if (colorMode === 'fg')
280
+ return colorCell(char, averagedColor(colors), undefined);
281
+ return colorCell(char, averagedColor(darkColors), averagedColor(lightColors));
282
+ }
283
+ function colorCell(char, fgRGB, bgRGB) {
284
+ const cell = { char, empty: false };
285
+ if (fgRGB !== undefined)
286
+ cell.fgRGB = fgRGB;
287
+ if (bgRGB !== undefined)
288
+ cell.bgRGB = bgRGB;
289
+ return cell;
290
+ }
291
+ function accumulateSampleColors(sample, colors, darkColors, lightColors, threshold) {
292
+ if (sample?.color === undefined)
293
+ return;
294
+ accumulateColor(colors, sample.color[0], sample.color[1], sample.color[2]);
295
+ if (sample.darkness >= threshold) {
296
+ accumulateColor(darkColors, sample.color[0], sample.color[1], sample.color[2]);
297
+ }
298
+ else {
299
+ accumulateColor(lightColors, sample.color[0], sample.color[1], sample.color[2]);
300
+ }
301
+ }
302
+ function readPixel(frame, x, y) {
303
+ const offset = ((y * frame.width) + x) * 4;
304
+ const r = byteAt(frame.data, offset);
305
+ const g = byteAt(frame.data, offset + 1);
306
+ const b = byteAt(frame.data, offset + 2);
307
+ const alpha = byteAt(frame.data, offset + 3) / 255;
308
+ const luma = ((0.2126 * r) + (0.7152 * g) + (0.0722 * b)) / 255;
309
+ const brightness = ((1 - alpha) * 1) + (alpha * luma);
310
+ return {
311
+ r,
312
+ g,
313
+ b,
314
+ alpha,
315
+ darkness: 1 - brightness,
316
+ };
317
+ }
318
+ function createColorAccumulator() {
319
+ return { r: 0, g: 0, b: 0, count: 0 };
320
+ }
321
+ function accumulateColor(accumulator, r, g, b) {
322
+ accumulator.r += r;
323
+ accumulator.g += g;
324
+ accumulator.b += b;
325
+ accumulator.count++;
326
+ }
327
+ function averagedColor(accumulator) {
328
+ if (accumulator.count === 0)
329
+ return undefined;
330
+ return [
331
+ Math.round(accumulator.r / accumulator.count),
332
+ Math.round(accumulator.g / accumulator.count),
333
+ Math.round(accumulator.b / accumulator.count),
334
+ ];
335
+ }
336
+ function validateRgbaFrame(frame) {
337
+ const width = sanitizeDimension(frame.width);
338
+ const height = sanitizeDimension(frame.height);
339
+ if (width <= 0 || height <= 0) {
340
+ throw new RangeError('RGBA frame width and height must be positive integers.');
341
+ }
342
+ const requiredLength = width * height * 4;
343
+ if (frame.data.length < requiredLength) {
344
+ throw new RangeError(`RGBA frame data must contain at least ${requiredLength} values.`);
345
+ }
346
+ }
347
+ function sanitizeDimension(value) {
348
+ if (!Number.isFinite(value) || value <= 0)
349
+ return 0;
350
+ return Math.floor(value);
351
+ }
352
+ function sanitizeCellAspectRatio(value) {
353
+ if (value === undefined)
354
+ return DEFAULT_CELL_ASPECT_RATIO;
355
+ if (!Number.isFinite(value) || value <= 0)
356
+ return DEFAULT_CELL_ASPECT_RATIO;
357
+ return value;
358
+ }
359
+ function sanitizeZoom(value) {
360
+ if (value === undefined)
361
+ return 1;
362
+ if (!Number.isFinite(value) || value <= 0)
363
+ return 1;
364
+ return value;
365
+ }
366
+ function sanitizePan(value) {
367
+ if (value === undefined || !Number.isFinite(value))
368
+ return 0;
369
+ return value;
370
+ }
371
+ function sanitizeContrast(value) {
372
+ if (value === undefined || !Number.isFinite(value) || value <= 0) {
373
+ return DEFAULT_CONTRAST;
374
+ }
375
+ return clampRange(value, MIN_CONTRAST, MAX_CONTRAST);
376
+ }
377
+ function sanitizeThreshold(value) {
378
+ if (value === undefined || !Number.isFinite(value))
379
+ return DEFAULT_THRESHOLD;
380
+ return clampUnit(value);
381
+ }
382
+ function sanitizeDitherMode(value) {
383
+ return value === 'ordered' ? 'ordered' : 'none';
384
+ }
385
+ function byteAt(data, index) {
386
+ const value = data[index];
387
+ if (typeof value !== 'number' || !Number.isFinite(value))
388
+ return 0;
389
+ return Math.max(0, Math.min(255, Math.round(value)));
390
+ }
391
+ function clampUnit(value) {
392
+ if (value <= 0)
393
+ return 0;
394
+ if (value >= 1)
395
+ return 1;
396
+ return value;
397
+ }
398
+ function clampRange(value, min, max) {
399
+ if (value <= min)
400
+ return min;
401
+ if (value >= max)
402
+ return max;
403
+ return value;
404
+ }
405
+ //# sourceMappingURL=raster-glyph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raster-glyph.js","sourceRoot":"","sources":["../src/raster-glyph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Small raytrace geometry helpers for shader-authored terminal scenes.
3
+ *
4
+ * This module owns camera rays, vector math, and primitive intersections.
5
+ * Apps keep material, lighting, palette, and sampling policy.
6
+ */
7
+ export type RaytraceVector3 = readonly [number, number, number];
8
+ export type RaytraceScreenPoint = readonly [number, number];
9
+ export interface RaytraceRay {
10
+ readonly origin: RaytraceVector3;
11
+ readonly direction: RaytraceVector3;
12
+ }
13
+ export interface RaytraceSphere {
14
+ readonly kind: 'sphere';
15
+ readonly center: RaytraceVector3;
16
+ readonly radius: number;
17
+ }
18
+ export interface RaytracePlane {
19
+ readonly kind: 'plane';
20
+ readonly point: RaytraceVector3;
21
+ readonly normal: RaytraceVector3;
22
+ }
23
+ export type RaytraceShape = RaytraceSphere | RaytracePlane;
24
+ export interface RaytraceHit<Shape extends RaytraceShape = RaytraceShape> {
25
+ readonly shape: Shape;
26
+ readonly distance: number;
27
+ readonly point: RaytraceVector3;
28
+ readonly normal: RaytraceVector3;
29
+ }
30
+ export interface RaytraceLookAtRayOptions {
31
+ readonly origin: RaytraceVector3;
32
+ readonly target: RaytraceVector3;
33
+ readonly screen: RaytraceScreenPoint;
34
+ readonly focalLength?: number;
35
+ readonly up?: RaytraceVector3;
36
+ }
37
+ export interface RaytraceOrbitCameraRayOptions {
38
+ readonly angleRadians: number;
39
+ readonly radius: number;
40
+ readonly height: number;
41
+ readonly target: RaytraceVector3;
42
+ readonly screen: RaytraceScreenPoint;
43
+ readonly focalLength?: number;
44
+ readonly up?: RaytraceVector3;
45
+ }
46
+ export declare function raytraceLookAtRay(options: RaytraceLookAtRayOptions): RaytraceRay;
47
+ export declare function raytraceOrbitCameraRay(options: RaytraceOrbitCameraRayOptions): RaytraceRay;
48
+ export declare function raytraceNearestHit(ray: RaytraceRay, shapes: readonly RaytraceShape[]): RaytraceHit | undefined;
49
+ export declare function raytraceSphereHit(ray: RaytraceRay, sphere: RaytraceSphere): RaytraceHit<RaytraceSphere> | undefined;
50
+ export declare function raytracePlaneHit(ray: RaytraceRay, plane: RaytracePlane): RaytraceHit<RaytracePlane> | undefined;
51
+ export declare function raytraceReflect(ray: RaytraceVector3, normal: RaytraceVector3): RaytraceVector3;
52
+ export declare function raytraceNormalize(vector: RaytraceVector3): RaytraceVector3;
53
+ export declare function raytraceLength(vector: RaytraceVector3): number;
54
+ export declare function raytraceDot(a: RaytraceVector3, b: RaytraceVector3): number;
55
+ export declare function raytraceCross(a: RaytraceVector3, b: RaytraceVector3): RaytraceVector3;
56
+ export declare function raytraceAdd(a: RaytraceVector3, b: RaytraceVector3): RaytraceVector3;
57
+ export declare function raytraceSub(a: RaytraceVector3, b: RaytraceVector3): RaytraceVector3;
58
+ export declare function raytraceScale(vector: RaytraceVector3, scalar: number): RaytraceVector3;
59
+ //# sourceMappingURL=raytrace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raytrace.d.ts","sourceRoot":"","sources":["../src/raytrace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Small raytrace geometry helpers for shader-authored terminal scenes.
3
+ *
4
+ * This module owns camera rays, vector math, and primitive intersections.
5
+ * Apps keep material, lighting, palette, and sampling policy.
6
+ */
7
+ const DEFAULT_FOCAL_LENGTH = 1;
8
+ const MIN_HIT_DISTANCE = 0.000001;
9
+ const WORLD_UP = [0, 1, 0];
10
+ const FALLBACK_RIGHT = [1, 0, 0];
11
+ export function raytraceLookAtRay(options) {
12
+ const focalLength = options.focalLength ?? DEFAULT_FOCAL_LENGTH;
13
+ const up = options.up ?? WORLD_UP;
14
+ const forward = raytraceNormalize(raytraceSub(options.target, options.origin));
15
+ const rightCandidate = raytraceNormalize(raytraceCross(forward, up));
16
+ const right = raytraceLength(rightCandidate) === 0 ? FALLBACK_RIGHT : rightCandidate;
17
+ const cameraUp = raytraceNormalize(raytraceCross(right, forward));
18
+ const direction = raytraceNormalize(raytraceAdd(raytraceAdd(raytraceScale(right, options.screen[0]), raytraceScale(cameraUp, options.screen[1])), raytraceScale(forward, focalLength)));
19
+ return {
20
+ origin: options.origin,
21
+ direction,
22
+ };
23
+ }
24
+ export function raytraceOrbitCameraRay(options) {
25
+ const origin = [
26
+ options.target[0] + (Math.sin(options.angleRadians) * options.radius),
27
+ options.target[1] + options.height,
28
+ options.target[2] + (Math.cos(options.angleRadians) * options.radius),
29
+ ];
30
+ return raytraceLookAtRay({
31
+ origin,
32
+ target: options.target,
33
+ screen: options.screen,
34
+ focalLength: options.focalLength,
35
+ up: options.up,
36
+ });
37
+ }
38
+ export function raytraceNearestHit(ray, shapes) {
39
+ let nearest;
40
+ for (const shape of shapes) {
41
+ const hit = shape.kind === 'sphere'
42
+ ? raytraceSphereHit(ray, shape)
43
+ : raytracePlaneHit(ray, shape);
44
+ if (hit !== undefined && (nearest === undefined || hit.distance < nearest.distance)) {
45
+ nearest = hit;
46
+ }
47
+ }
48
+ return nearest;
49
+ }
50
+ export function raytraceSphereHit(ray, sphere) {
51
+ const offset = raytraceSub(ray.origin, sphere.center);
52
+ const halfB = raytraceDot(offset, ray.direction);
53
+ const c = raytraceDot(offset, offset) - (sphere.radius * sphere.radius);
54
+ const discriminant = (halfB * halfB) - c;
55
+ if (discriminant < 0)
56
+ return undefined;
57
+ const root = Math.sqrt(discriminant);
58
+ const near = -halfB - root;
59
+ const far = -halfB + root;
60
+ const distance = near > MIN_HIT_DISTANCE
61
+ ? near
62
+ : far > MIN_HIT_DISTANCE
63
+ ? far
64
+ : undefined;
65
+ if (distance === undefined)
66
+ return undefined;
67
+ const point = raytraceAdd(ray.origin, raytraceScale(ray.direction, distance));
68
+ return {
69
+ shape: sphere,
70
+ distance,
71
+ point,
72
+ normal: raytraceNormalize(raytraceSub(point, sphere.center)),
73
+ };
74
+ }
75
+ export function raytracePlaneHit(ray, plane) {
76
+ const normal = raytraceNormalize(plane.normal);
77
+ const denominator = raytraceDot(normal, ray.direction);
78
+ if (Math.abs(denominator) <= MIN_HIT_DISTANCE)
79
+ return undefined;
80
+ const distance = raytraceDot(raytraceSub(plane.point, ray.origin), normal) / denominator;
81
+ if (distance <= MIN_HIT_DISTANCE)
82
+ return undefined;
83
+ return {
84
+ shape: plane,
85
+ distance,
86
+ point: raytraceAdd(ray.origin, raytraceScale(ray.direction, distance)),
87
+ normal,
88
+ };
89
+ }
90
+ export function raytraceReflect(ray, normal) {
91
+ return raytraceSub(ray, raytraceScale(normal, 2 * raytraceDot(ray, normal)));
92
+ }
93
+ export function raytraceNormalize(vector) {
94
+ const length = raytraceLength(vector);
95
+ return length === 0
96
+ ? [0, 0, 0]
97
+ : [vector[0] / length, vector[1] / length, vector[2] / length];
98
+ }
99
+ export function raytraceLength(vector) {
100
+ return Math.hypot(vector[0], vector[1], vector[2]);
101
+ }
102
+ export function raytraceDot(a, b) {
103
+ return (a[0] * b[0]) + (a[1] * b[1]) + (a[2] * b[2]);
104
+ }
105
+ export function raytraceCross(a, b) {
106
+ return [
107
+ (a[1] * b[2]) - (a[2] * b[1]),
108
+ (a[2] * b[0]) - (a[0] * b[2]),
109
+ (a[0] * b[1]) - (a[1] * b[0]),
110
+ ];
111
+ }
112
+ export function raytraceAdd(a, b) {
113
+ return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];
114
+ }
115
+ export function raytraceSub(a, b) {
116
+ return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
117
+ }
118
+ export function raytraceScale(vector, scalar) {
119
+ return [vector[0] * scalar, vector[1] * scalar, vector[2] * scalar];
120
+ }
121
+ //# sourceMappingURL=raytrace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raytrace.js","sourceRoot":"","sources":["../src/raytrace.ts"],"names":[],"mappings":"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"}