# GLerminal, an OpenGL terminal [![Build Status](https://travis-ci.org/Teascade/glerminal.svg?branch=0.3.0-fix)](https://travis-ci.org/Teascade/glerminal) [![Docs](https://docs.rs/glerminal/badge.svg)](https://docs.rs/glerminal) [![Crates.io](https://img.shields.io/crates/v/glerminal.svg)](https://crates.io/crates/glerminal) Read our [Code of Conduct](CODE_OF_CONDUCT.md) and join our [Discord server](https://discord.gg/Wg6D2Rk) if you want to chat! A lightweight terminal made with OpenGL from the ground-up. With this terminal, you're able to make the terminal applications or games you've always wanted, but with a terminal that looks the same for everyone, because it's made with OpenGL and doesn't use the computer's native terminal! Currently supported features include: - Moving the cursor within the Terminal - Changing foreground and background colors to whatever you want! - Shaking text - A text-parser that will make it easy to write whatever you want and make it look cool! - Parseable text example: `"Hello, [fg=red]this is red[/fg] and [shake=1.0]this is shaking[/shake]."` - Drawing of multiple text buffers (grids of text) on top of eachother - A menu system that allows for easy creation and usage of menus for selecting and pressing stuff! (See docs for more) - Requires the `menu_systems` optional feature to be enabled - Write any characters up to 16-bits that your font supports ***Note: Requires OpenGL 3.3+ support*** ### Table of Contents - [How to use](#how-to-use) - [Custom font?](#custom-font) - [Contributing & Code of Conduct](#contributing-&-code-of-conduct) - [License](#license) ### How to use Extensive documentation can be found at: [docs.rs][docs]. Just add the following line to your `Cargo.toml`: ```toml [dependencies] glerminal = "0.3" ``` And then using this crate is quite simple: ```rust extern crate glerminal; // Not required if running 2018 edition use glerminal::terminal::TerminalBuilder; use glerminal::text_buffer::TextBuffer; fn main() { let terminal = TerminalBuilder::new() .with_title("Hello GLerminal!") .with_dimensions((1280, 720)) .build(); let mut text_buffer; match TextBuffer::create(&terminal, (80, 24)) { Ok(buffer) => text_buffer = buffer, Err(error) => panic!(format!("Failed to initialize text buffer: {}", error)), } text_buffer.write("Hello, GLerminal!"); terminal.flush(&mut text_buffer); while terminal.refresh() { terminal.draw(&text_buffer); } } ``` ![What the example looks like](images/example_screenshot.png) ### Custom font? The default font that comes with GLerminal is a render of [Source Code Pro][scp_font] and only includes a few more popular unicode blocks, to save space on the end product (the default font is compiled into the library). The following blocks are included in the default font: - [`Basic latin`][basic_latin] - [`Latin-1 supplement`][latin_1_supplement] - [`Latin Extended-A`][latin_extended_a] - [`Currency Symbols`][currency_symbols] - [`Box Drawing`][box_drawing] - [`Block Elements`][block_elements] To make a custom font, you have to use either the [`BMFont standard / .fnt`][bmfont_standard], or `.sfl`, and software that can produce such files are [BMFont][bmfont] (can produce only `.fnt`), or [Fontbuilder][fontbuilder] (can produce both). The font image **needs** to be RGBA PNG. It is advised to use [Fontbuilder][fontbuilder], as (at least after some testing) the png font images generated by [BMFont][bmfont] (and their antialiasing) are sub-par compared to [Fontbuilder][fontbuilder], though Fontbuilder might be difficult to build on windows devices (It is possible with MinGW though). **Note** If using Fontbuilder, it is highly recommended to use [this fork][teascade_fontbuilder] as it contains a critical fix for .sfl font exporting. After that it is advisable to look at glerminal [font documentation][font_docs] on how a custom font is then loaded to use. ### Contributing & Code of Conduct You are welcome to contribute to this project, but before do review the [Contributing guidelines](CONTRIBUTING.md). A Code of Conduct can also be found in the repository as [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md), please review it before interacting with the community. ### License This crate is distributed under the terms of [the MIT License][license]. This crate also uses a font as a default font, called [Source Code Pro][scp_font], which is distributed under the terms of [SIL OFL Version 1.1][scp_license]. [docs]: https://docs.rs/glerminal [license]: LICENSE.md [scp_font]: https://github.com/adobe-fonts/source-code-pro [scp_license]: LICENSE_SOURCE_CODE_PRO.md [bmfont]: http://www.angelcode.com/products/bmfont/ [bmfont_standard]: http://www.angelcode.com/products/bmfont/doc/render_text.html [fontbuilder]: https://github.com/andryblack/fontbuilder [teascade_fontbuilder]: https://github.com/Teascade/fontbuilder [font_docs]: https://docs.rs/glerminal/0.3.0/glerminal/struct.Font.html [basic_latin]: https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block) [latin_1_supplement]: https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block) [latin_extended_a]: https://en.wikipedia.org/wiki/Latin_Extended-A [currency_symbols]: https://en.wikipedia.org/wiki/Currency_Symbols_(Unicode_block) [box_drawing]: https://en.wikipedia.org/wiki/Box_Drawing [block_elements]: https://en.wikipedia.org/wiki/Block_Elements