Release notes for the Scylla TextMode module, grouped by version.
This changelog tracks the Scylla TextMode module. It follows a per-module semver scheme independent of the other modules, and groups each release into Added, Removed, Changed, and Fixed.
1.1.0
This release rounds out the terminal emulator, rebuilds the terminal demo as a complete shell session, and adds a CRT display simulation for TextMode views, with camera effect packages for URP and HDRP.
Added
- Cursor shapes through DECSCUSR: blinking or steady block, underline and bar, plus a reset to the host’s own cursor.
TextModeTerminalshows the shape a full-screen program picks and restores its own when the program is done. - DEC Special Graphics character set, selected with
ESC ( 0andESC ) 0and switched with SO and SI, so programs that draw frames from ASCII letters render proper lines and corners. - Device status reports:
CSI 5 nanswers that the terminal is ready, andCSI 6 nand its DEC formCSI ? 6 nreport the cursor position, throughOnTerminalOutput. - A sixth color theme, Lightman: monochrome pale blue on near-black, with a deeper blue accent.
- A seventh color theme, WordPerfect: light gray on blue in the DOS text mode colors, with bright white for emphasis and blue on gray for selections. ANSI blue is a lighter blue than the background, so blue text stays readable.
- An eighth color theme, Amiga: white on blue with an orange cursor and accent in the four Workbench 1.3 colors, with vivid Amiga colors for the other ANSI slots. ANSI blue is lighter than the background, so blue text stays readable.
ED 3, which erases the saved lines rather than the screen, andTerminalEmulator.ClearScrollback.- Paste in the terminal command line with Ctrl+V, Cmd+V or Shift+Insert, or from the host’s own input through
TextModeTerminal.PasteIntoCommandLine. Line breaks and tabs become spaces, since the command line holds one line.TextModeTerminalSettings.UseBuiltInClipboardShortcutsturns the built-in copy and paste keys off for a host that maps them itself, as the debug console does. - Ctrl+click opens a hyperlink in a full-screen terminal, also while scrolled back. A link opens on release, and not when the click selected text. Only
http,httpsandmailtolinks open.TextModeTerminal.OnHyperlinkClickedreports every Ctrl+clicked link,TextModeTerminalSettings.OpenHyperlinksOnCtrlClickturns the built-in opening off, andTerminalEmulator.GetHyperlinkURIlooks up the link of any cell, including cells from the scrollback. - Select all in log mode selects the whole log. The highlight covers every log row in view while the log scrolls, and copying takes every line in the scrollback.
- Scrollback in full-screen mode.
TextModeTerminal.ScrollFullScreenByandScrollFullScreenToBottomshow the lines a program scrolled off the top,PinnedBottomRowskeeps a status line in place while the view scrolls, and output that arrives meanwhile leaves the view on the same lines. TerminalEmulator.Resize, which resizes both screens and resets the scroll region, andSetGlyphCache, which restamps everything the emulator holds after a font change.PrimaryGridandAlternateGridexpose both screens.- Cell border:
TextModeCellBorder,UITextModeView.CellBorderandTextModeTerminalSettings.CellBorderframe the content with whole empty cells on each side. The frame is part of the grid, so a CRT covers it, while the content, a terminal’s wrapping and its cursor stay inside. The border shows the grid’s background color;UITextModeView.BorderFollowsThememakes it transparent when turned off, andTextModeTerminalSettings.FillPaddingdecides whether the padding outside a terminal’s grid is filled with the same color. A border that does not fit the view is shrunk. UITextModeView.GridResizing, raised just before the view resizes its grid, so the grid’s owner can resize it first.TextModeThemes.SetInvertedandTextModeThemes.Invertedshow every color TextMode draws inverted, on every view at once and through the CRT. The theme and the stored colors stay as they are, so switching back is exact, andTextModeThemes.DisplayColorgives the displayed color for anything drawn outside a view. The inversion stays on across theme changes, andTextModeThemeChangedEventreports it inInverted.TextModeGridCapture, which renders any TextMode view into a render texture at exact cell pixels, andITextModeRenderSource, which both views implement for it.DrawSelfon both views, which stops the view from drawing while it keeps its grid, input and selection.PointerMapperon both views andITextModePointerMapper, which let a component that shows the grid somewhere else, or distorted, decide which cell the pointer is over.TextModeCRTDriver, in the newScyllaTextMode.CRTassembly, shows aUITextModeViewthrough a simulated cathode ray tube. It renders the grid at screen resolution, averages it down to scanlines at a set pitch, and draws them with a brightness-dependent Gaussian beam. It also includes aperture grille, slot and shadow masks, two-term phosphor afterglow driven by real elapsed time, glow and halation in linear light, and optional screen curvature and rounded corners. It works in URP, HDRP and the Built-in pipeline, and selection, mouse reporting and hyperlink clicks follow the curved picture.- Seventeen CRT presets, with Standard Terminal as the default,
TextModeCRTPresetassets with a list order, andTextModeCRTPresetRegistryto find them, plus a CRT section inScyllaTextModeConfigurationfor the default preset, quality tier, readability clamp and afterglow time step. - A
StrokeSnapsetting on CRT presets, which snaps each scanline to the strokes it covers so the tops and bottoms of letters stay crisp instead of leaving faint smudged lines. It is off (0) in every preset. - Texture masks for the CRT: from a mask period of 6 pixels up,
TextureMask(on by default) draws the aperture grille, shadow mask or slot mask from a mipmapped texture tile with the phosphor shapes at their exact period, instead of a procedural pattern limited to 6.MaskPeriodOverridegoes up to 24. - A video signal for the CRT:
TextModeCRTSettings.SignalTypefeeds the tube through S-Video, composite or RF instead of RGB, withSignalStandard(NTSC or PAL), luma and chroma bandwidth, an NTSC comb filter, sharpness, and the subcarrier’s period and phase steps per line and field. Each scanline is encoded and decoded as a real signal, which gives color bleed, dot crawl, rainbow fringes and artifact colors. It runs in the Medium and High tiers. - Signal disturbances and convergence for the CRT:
Noise(snow),Jitter,HumBarandHumBarSpeed, andVerticalRollfor a signal other than RGB, andConvergencefor every tube. The readability clamp limits them, and Reduce Motion freezes them. Six presets use the signal: Television, Composite TV, Antenna TV, Poor Reception, Artifact Color Monitor and CCTV Monitor. - A bezel for the CRT:
BezelWidthframes the picture on every side andBezelReflectionlets its inner edge reflect a soft copy of the picture, in the view and in the camera effect.BezelColorsets its color. - Tube events for the CRT:
TextModeCRTTubeswitches the tube off (the picture collapses into a line and then a dot) and on (a warm-up), degausses it and clears its burn-in, withPoweredOn,PoweredOffandDegaussedevents. Every driver has one inTube, and the camera effect takes one inShow. New settingsWarmUpTime,BurnInandBurnInTime; burn-in is off in every preset. - HDR mask mode:
TextModeCRTSettings.HDRMaskshows the phosphor mask at full strength on an HDR display and recovers its brightness from the display’s headroom, withHDRMask,HDRMaskBrightnessandHDRHeadroomin the TextMode configuration as a per-display calibration. - A beam simulator for displays at 120 Hz and above, based on the Blur Busters and Timothy Lottes CRT beam simulator (MIT): each refresh lights only the part of the tube the beam is drawing, which brings back a CRT’s motion clarity on views and camera effects.
TextModeCRTBeamswitches it and reports its state,CRTBeamandCRTBeamClockhold the math and the refresh counting, and the TextMode configuration gainsBeamSimulation,BeamCRTRate,BeamRefreshRate,BeamGain,BeamScanDirectionandBeamAntiRetention. It is off by default and Reduce Motion keeps it off. - Calibration patterns for the CRT:
TextModeCRTCalibrationshows a grille, a gray ramp or a convergence grid (CRTCalibrationPattern) through every CRT at once in place of the picture, with all settings applied, for adjusting the tube to a display. TextModeCRTMonitorshows a world-spaceTextModeViewon a monitor screen in a 3D scene. Its CRT Monitor material lays the phosphor mask out on the glass and fades it with distance, andOutputTexturegives the picture to any material. AUITextModeViewwith a CRT on a world-space canvas keeps its mask steady on the glass as well.TextModeCRTImageRenderer, which runs the CRT over any image from a command buffer, andCRTImageRegion, which letsTextModeCRTImageRenderer.Recordread and draw only the part of a texture that holds the picture.ITextModeCRTCameraEffectandTextModeCRTCameraEffects, which let code show a camera through the CRT without referencing a render pipeline package.TextModeCRTCameraEffects.UnregisterandTextModeCRTHDR.Unregisterremove a registered provider without affecting one that replaced it.- A separate package, Scylla TextMode for URP (
com.scylla.textmode.urp), included as a.unitypackagein the TextMode package’sExtrasfolder, shows any URP camera through the CRT with a renderer feature and a Volume effect. It works under HDR output, the menu item Add CRT to URP Renderers adds the feature to the project’s renderers, and a demo scene shows a 3D scene through the CRT. - A separate package, Scylla TextMode for HDRP (
com.scylla.textmode.hdrp), included in the sameExtrasfolder, shows any HDRP camera through the CRT as a custom post process after post-processing.TextModeCRTHDRPVolumeholds the same settings as the URP Volume effect plus a Scene view switch. The effect works under HDR output, the menu item Add CRT to HDRP Global Settings lists it in HDRP’s settings, and a demo script builds its own scene in any HDRP project. Both packages register their camera effect only while their render pipeline is active, so a project with both installed uses the right one. - The TextMode Wizard, at Tools > Scylla > TextMode > TextMode Wizard…, builds a complete setup in the open scene in one Undo step. It adds the bootstrap and the module when they are missing, writes the color theme to the TextMode configuration, and creates a camera, a screen or world space display, an optional terminal and an optional CRT on the display or the camera. It starts from one of five typical setups: Grid-based Game, Text Adventure, In-World Monitor, Terminal / Shell and Custom. Running it again reuses the existing configuration.
TextModeTerminalHostplaces aTextModeTerminalin a scene from the Inspector. It builds the terminal when the scene starts, updates it every frame and destroys it with the component. In Log mode it reads the keyboard into the command line and reports each submitted command throughCommandSubmittedand an Inspector event.ColorThemetakes the colors from the project theme, from a theme of the terminal’s own, or from the settings without a theme, and the host fills the padding around the terminal with its background color.TextModeThemeBackground, which colors a UI graphic with a theme’s background and keeps it in step with theme changes and the display inversion. The TextMode Wizard adds one to the background it creates behind a view.ITextModeViewHost, for components that create their view at runtime. ATextModeCRTDriveron the same GameObject as aTextModeTerminalHostshows the terminal’s view as soon as it exists.TextModeLayoutUtil.ComputeGridArea, which returns the size a view needs for an exact number of columns and rows.ScyllaTextMode.IsWorkAllowed, which is true without a module, before the module has started, and while it is enabled.TextModeCRTCameraSetupandITextModeCRTCameraSetupProviderlet editor code check whether the render pipeline is ready for the CRT camera effect, fix it, and add a CRT Volume to a scene. The URP and HDRP packages each register a provider.- A rebuilt terminal demo: a shell with pipes, redirection, chained commands, variables, wildcards, aliases, scripts, history and tab completion, more than sixty commands with full help for each through
helpfollowed by the command name, a pager, a text editor, a process monitor, tic-tac-toe, color theme switching, afontcommand that switches to any TextMeshPro font asset in the project and changes the font size, aresizecommand that measures the screen with a device status report, amousemonitor that shows the reports of every tracking mode and encoding, aneffectsshowcase of the text effects, and agtwglobal thermonuclear war game with an animated missile map, all running through the emulator’s real input and output path. - A
crtcommand in the terminal demo, which switches the CRT on and off, lists and picks presets, sets the quality, changes every single setting withcrt set, and runs the same settings through a camera effect withcrt mode camera. It also covers the tube (crt power,crt degauss,crt clear-burnin), the beam simulator (crt beam) and the calibration patterns (crt calibrate). - More terminal demo commands:
borderfor the cell border,theme inversefor the display inversion,cursor ratefor the blink rate,dungeonfor maps from the procedural map generator of Scylla Core, andblackjack, a full-screen game against the dealer with the cards drawn as ASCII art and buttons that respond to the mouse. adventurein the terminal demo: ONE MORE PAGE, a horror text adventure in the style of an Infocom game on the Amiga. It has an inverse status line with the location, score and move count, a parser that understands full sentences, about thirty locations, a 350-point score, seven endings, and UNDO, SAVE and RESTORE.- A new demo scene, TextMode Monitor Demo, shows a terminal on a monitor on a desk.
- RogueLike and Shmup demos run through a CRT, starting with the CGA Monitor and Arcade Monitor 2 presets, and F2 cycles through every preset and off. The Shmup demo adds an optional screen shake on F3, off by default.
Removed
- Separate mouse reporting demo scene. The terminal demo’s
mousecommand covers the same ground through the emulator’s real input and output path. ScyllaTextModeMenuItems.CreateTextModeModuleContextandValidateCreateTextModeModuleContext. TheGameObject/Scyllaentry now runsCreateTextModeModuledirectly.
Changed
- Requires Scylla Core 1.2.0 or newer.
- The TextMode Wizard creates the Scylla Bootstrap through the shared Core helper. A Bootstrap it creates now gets the Core configuration assets from
Resources/Configassigned to its configuration slots. - Only lines leaving the top row of the primary screen are saved to the scrollback, as in xterm. A scrolling region further down no longer fills the history with fragments.
- A terminal whose default background is its theme’s background now follows theme changes. A transparent or otherwise custom background is still left alone.
- DECSC and DECRC also save and restore the character sets.
- Selected text is drawn in the theme’s
SelectionForegroundon itsSelectionBackground, in place of the cell’s own colors, instead of an inverted tint that left most selections washed out. Every built-in theme sets the pair to its own background on its foreground, so a selection reads as inverse text.TextModeView,UITextModeViewandTextModeTerminalSettingsgainSelectionTextColorfor the text half of the pair. - A
TextModeVieworUITextModeViewsaved in a scene or prefab before 1.1.0 keeps its old selection color and picks up black for the new selection text color. Set both again on views that do not take their colors from a theme. - A selection in a full-screen terminal stays on the same text while the view scrolls through the scrollback, through the new
TextModeSelectionManager.ShiftSelection.TextModeSelectionManager.PinnedBottomRowskeeps a moved selection off a pinned status line. UITextModeViewcenters its grid in its RectTransform instead of pinning it to the top-left corner, so the space whole cells cannot fill is split evenly around it.- Cell shading of
Scylla/TextMode/CellandScylla/TextMode/UICellmoved into a shared include. The output is unchanged. - Demo scenes live in
Demos/TextMode/Scenesand demo scripts inDemos/TextMode/Scripts, with the terminal, RogueLike and Shmup demos in their own subfolders. Scene names no longer start with Scylla. - RogueLike demo renders at font size 24 inside a cell border of 4, its kill bursts grow with the monster’s rank, its title screen particles fade in to vivid colors, and nearby features are announced once when they come into range.
- Shmup demo drops a bomb with B instead of Shift, which is the modifier of every cheat.
- The terminal font size range is 6 to 256 instead of 8 to 32.
- The terminal command line draws on the terminal’s background color instead of a transparent one.
- The module applies the configured color theme in
Awakeas well as when it starts, and the CRT andTextModeTerminalHostwork before the module has started. A display no longer shows the Classic theme without its CRT for the first second, until the bootstrap starts the modules. - TextMode menu items, including Add CRT to URP Renderers and Add CRT to HDRP Global Settings from the render pipeline packages, and the
Assets/Create/Scylla/TextModeentries are placed by the Scylla Core menu registry. Their paths are unchanged. - Scylla TextMode declares itself a tier 1 module.
Fixed
TextModeViewdrew its grid one row above its transform, so its render bounds and pointer mapping were off by a row.- Disabling a
TextModeViewdiscarded its grid and glyph cache, so it came back empty while consoles and terminals kept writing to the old grid. Disable now releases only the GPU renderer and keeps the content. - When a terminal lost rows, for example after a larger font, the bottom rows were cut off and the line being typed could end up under a status line. The terminal now scrolls the screen up first, so the cursor’s line stays visible and the lines leaving the top go into the scrollback.
- Text disappeared from a view when the project refreshed its assets during Play mode, for example after a script was saved. The cells and the cursor stayed, but every glyph was gone until the view was rebuilt.
- A full-screen program that switched to the alternate screen drew into a grid the view was not showing, so it stayed invisible.
- Resizing a full-screen terminal left the emulator’s other screen and its scroll region at the old size.
- A theme change recolored only the emulator’s visible screen, so leaving a full-screen program brought back the old colors.
- A theme change left the lines in a full-screen terminal’s scrollback in the old colors, so scrolling up showed them in the previous theme.
- A program that saved its cursor on the alternate screen overwrote the saved cursor of the primary screen, so leaving it put the cursor in the wrong place. Each screen now has its own saved state.
- An ESC sequence with an intermediate byte was read as the plain sequence with the same final byte, so
ESC ( 8moved the cursor like DECRC. - Text written as a line and its newline in separate feeds left a stray cursor block at the end of the line whenever the newline scrolled the screen.
- A
CSI ?sequence with a final byte other thanhorl, such asCSI ? 6 n, was read as a mode reset, so asking for the cursor position turned origin mode off. - Scrolling a full-screen terminal back while text was selected left a highlight on the live screen that no click could clear.
- In log mode, which the debug console uses, a selection stayed where it was while the text scrolled under it. It now moves with the text, and stays off the command line.
- A shortcut such as Ctrl+C or Cmd+V typed its letter into the command line on platforms that report it as text input. Characters typed with Cmd, or with Ctrl but not Alt, are now ignored, so AltGr still types.
- Changing a terminal’s font while its emulator held content rendered every character as the replacement glyph, because the emulator kept the discarded glyph cache.
- After a theme change, text in the old theme’s default color took the new theme’s ANSI white whenever the old theme used one color for both.
TextModeThemeRemapper.BuildMapnow resolves Foreground and BrightForeground first. - After a theme change, cells in the old theme’s background took the new theme’s ANSI black instead of its background whenever the old theme used one color for both. Cell backgrounds now follow
TextModeThemeChangedEvent.BackgroundColorMap, built byTextModeThemeRemapper.BuildBackgroundMap, where the background wins. - RogueLike demo: Dragon and Lesser Dragon had their names and stats swapped, the help legend showed glyphs that no longer matched the map, scrolls showed the replacement character, holding the wait key used stairs and shrines repeatedly, the lightning scroll logged only a count, four dungeon names were never picked, and the screen was drawn up to three times per frame.
1.0.0
This is the first release of the TextMode module: a GPU-rendered character grid with SDF text, a VT/ANSI terminal emulator, a text effects library, and a color theme system.
Added
- A
CellGridof up to 512 by 512 cells, capped at 131,072 total, built on a 32-byteCellstruct that maps directly onto the GPU buffer and carries a codepoint, packed colors, style attributes, and the glyph’s atlas coordinates. - SDF (Signed Distance Field) rendering from a TextMeshPro font atlas, drawn as a single instanced indirect pass with dirty-range partial uploads, so writing one character costs one small buffer update.
- Two view components:
UITextModeViewas a Canvas graphic with mask, clipping andCanvasGroupalpha support, andTextModeViewfor world-space displays, both over an identical API. - Automatic grid layout from font metrics and available space, with line-height and character-spacing multipliers, plus vertical neighbor rendering so compressed line heights do not clip descenders.
TextModeConsole, a drawing API with positioned and aligned printing, word and character wrapping with a separate measure call, single character writes, region fills and clears, five box-drawing styles, horizontal and vertical rules, and grid-to-grid blitting with independent foreground and background alpha.- Full ANSI color: the standard sixteen by name and index, the 256-color extended palette as a 6 by 6 by 6 cube plus a 24-step grayscale ramp, and 24-bit truecolor, with eight background blend modes.
- Nine cell attributes implemented in the shader: bold, italic, underline, strikethrough, inverse, dim, blink, hidden and double-width, with blink animated from a shader timer at no per-frame cost.
- A VT/ANSI parser implementing Paul Williams’ DEC-compatible state machine over thirteen states, fed byte at a time with UTF-8 assembly, so split sequences and split codepoints survive across reads.
- A terminal emulator covering cursor movement and save/restore, the full SGR set including the extended 256-color and truecolor forms, erase and edit operations, scrolling regions, the alternate screen buffer, tab stops, device status reports, bracketed paste, and OSC title and hyperlink handling.
TextModeTerminal, a drop-in terminal frontend that builds its own view and offers log and full-screen modes, scrollback with drag and momentum, text selection with clipboard copy, and an optional command line with pluggable history and tab completion. It reads the keyboard directly, so it carries no dependency on the Input module.- A text effects library: typewriter and decode reveals, fades and slides, mask-ordered transitions covering wipes, dissolves, irises, box wipes, clock sweeps, blinds and checkerboards in crisp and cross-faded forms, digital rain and static tune-in set pieces, and pulse, color cycle, flicker, wave, glitch and twinkle ambients.
- Thirteen cell mask patterns with direction, inversion, band count and a custom evaluator, so one mask-driven effect covers the whole ordered-transition family.
- A text effect sequencer for chaining effects with waits, callbacks and looping, plus a preset asset for every effect so looks are authorable in the Inspector.
- A color theme system where a theme is a named Core
ColorPalette, resolved through the shared color asset registry. Switching repaints every following view, rewrites the ANSI table, and retints content already on the grid. Five themes ship: Classic, Green Phosphor, Amber Phosphor, Midnight and Paper. - Text selection with drag, programmatic ranges, row and select-all, text extraction and clipboard copy, alongside terminal mouse reporting in normal, button-event and any-event tracking with default and SGR encodings.
- A
ScyllaTextMode.ConsoleDisplaybridge assembly that renders the Scylla Console module through a TextMode view, including anIConsoleScreencontract letting a command push a full-screen interactive screen. - A
ScyllaTextModeConfigurationasset covering grid, SDF, terminal, effects, theme and debug settings, mirrored to a JSON config file with the framework’s four-tier fallback, plus static resolvers so components can read the active settings without a module reference. - Demo scenes covering a complete roguelike, a terminal, the text effects, text selection, mouse reporting, and a shoot-em-up built on the grid.