extern crate termios;
extern crate image;
extern crate palette;
#[macro_use]
pub mod math;
pub mod img;
pub mod rds;
pub mod input;
mod buffer2d;
mod screen_buffer;
#[cfg(test)]
mod tests {
use crate::rds::Renderer;
use crate::math::{*};
use crate::img::*;
use crate::input::{Input, InputEvent, KeyEvent, MouseEvent};
use std::f32::consts::TAU;
use std::sync::{Arc, Mutex};
use std::time::{Duration, Instant};
use std::thread::sleep;
#[test]
fn renderer() {
let img = Arc::new(Mutex::new(Image::load("icon.png").unwrap()));
let rdr = Renderer::get();
rdr.begin_draw();
rdr.draw_line((2, 7), (28, 6), Color::WHITE);
rdr.draw_rect((40, 15), (15, -10), Color::RED);
rdr.draw_rect_boundary((40, 15), (15, -10), Color::CHOCOLATE);
rdr.draw_ellipse_boundary((45, 25), (25, 8), Color::AQUAMARINE);
rdr.draw_ellipse_boundary((60, 30), (4, 4), Color::DEEP_PINK);
rdr.draw_rect((80, 5), (16, 8), Color::CORAL);
rdr.draw_whole_image_alpha(img.clone(), (80, 5), Color::BLACK);
rdr.ring_bell();
rdr.end_draw();
Input::get().get_event_blocking();
Renderer::exit();
}
#[test]
fn input() {
let rdr = Renderer::get();
let inp = Input::get();
Input::enable_mouse();
let mut pos = Renderer::get_size() / 2;
loop {
let size = Renderer::get_size();
match inp.get_event() {
Some(event) => {
match event {
InputEvent::Key(event) => match event {
KeyEvent::Ctrl('c') => Renderer::exit(),
KeyEvent::Up => if pos.y > 1 {pos.y -= 1},
KeyEvent::Down => if pos.y <= size.y - 2 {pos.y += 1},
KeyEvent::Left => if pos.x > 1 {pos.x -= 1},
KeyEvent::Right => if pos.x <= size.x - 2 {pos.x += 1},
_ => ()
}
InputEvent::Mouse(event) => match event {
MouseEvent::ButtonPressed(_, mpos) | MouseEvent::Hold(_, mpos)
=> pos = mpos,
_ => ()
}
_ => ()
}
}
None => ()
};
rdr.begin_draw();
rdr.clear_color(Color::BLACK);
rdr.draw_rect_boundary(Vec2::ZERO, size - vec2!(1, 1), Color::BROWN);
rdr.draw_point(pos, Color::WHITE);
rdr.end_draw();
}
}
#[test]
fn text() {
let rdr = Renderer::get();
let inp = Input::get();
let dynamic_text = String::from("Some dynamic text !!!");
let dyn_text_char_count = dynamic_text.chars().count();
let mut dyn_text_pos: Vec2f = Vec2f::ZERO;
let mut dyn_text_speed: Vec2f = Vec2f::new(TAU * 10.0, 17.0);
let mut instant = Instant::now();
let max_frame_rate: f32 = 60.0;
let max_frame_time: f32 = 1.0 / max_frame_rate;
loop {
let delta: f32 = instant.elapsed().as_secs_f32();
if delta < max_frame_time {
sleep(Duration::from_secs_f32(max_frame_time - delta));
}
let delta: f32 = instant.elapsed().as_secs_f32();
instant = Instant::now();
match inp.get_event() {
Some(event) => {
match event {
InputEvent::Key(event) => match event {
KeyEvent::Ctrl('c') => Renderer::exit(),
_ => ()
}
_ => ()
}
}
None => ()
};
let size = Vec2f::from(Renderer::get_size());
dyn_text_pos += dyn_text_speed * delta;
if dyn_text_pos.x <= 1.0 {
dyn_text_speed.x = dyn_text_speed.x.abs();
}
if dyn_text_pos.x >= size.x - dyn_text_char_count as f32 - 1.0 {
dyn_text_speed.x = -dyn_text_speed.x.abs();
}
if dyn_text_pos.y <= 1.0 {
dyn_text_speed.y = dyn_text_speed.y.abs();
}
if dyn_text_pos.y >= size.y - 1.0 {
dyn_text_speed.y = -dyn_text_speed.y.abs();
}
rdr.begin_draw();
rdr.clear(Color::BLACK);
rdr.print_blended_text_raw(&format!("Time delta: {}", delta), (1, 15));
rdr.print_colored_text_raw(
&String::from("This text goes a bit off the window"),
(-2, 0),
Color::WHITE,
Color::BLACK
);
rdr.draw_rect((3, 5), (2, 6), Color::LIGHT_BLUE);
rdr.draw_rect((7, 3), (2, 6), Color::LIGHT_BLUE);
rdr.draw_rect((10, 3), (2, 6), Color::WHITE);
rdr.draw_rect((12, 3), (2, 6), Color::RED);
rdr.draw_rect((14, 3), (2, 6), Color::GREEN);
rdr.draw_rect((16, 3), (2, 6), Color::BLUE);
rdr.draw_rect((18, 3), (2, 6), Color::GRAY);
rdr.draw_rect((20, 3), (2, 6), Color::DARK_KHAKI);
rdr.draw_rect((22, 3), (2, 6), Color::CADET_BLUE);
rdr.draw_rect((24, 3), (2, 6), Color::PINK);
rdr.draw_rect((26, 3), (2, 6), Color::PURPLE);
rdr.draw_rect((28, 3), (2, 6), Color::GAINSBORO);
rdr.print_blended_text_raw(&String::from("I can draw text that will automagically change color to be readable"), (0, 4));
rdr.draw_rect((20, 20), (49, 7), Color::DARK_RED);
rdr.print_blended_text_raw(&dynamic_text, Vec2::from(dyn_text_pos));
rdr.end_draw();
}
}
}