aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
blob: 804ddfac4627456a2d980e55db8eb8b0e0b6cda9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
extern crate ncurses;

mod camera;
mod canvas;
use std::{f32::consts::PI, time::Instant};
use cgmath::Vector3;
use ncurses::*;

use crate::camera::{Buffer, Camera, WIDTH, HEIGHT, rotate_z};

fn main() {
    let mut cam = Camera {
        position: Vector3 { x: 0.0, y: -0.7, z: 0.0 },
        direction: Vector3 { x: 1.0, y: 0.0, z: 0.0 },
        angle: PI / 2.0,
        distance: 1.0,
        aspect_ratio: 2.0 * HEIGHT as f32 / WIDTH as f32,
        brightness: 5.0,
        buffer: Buffer([[' '; WIDTH as usize]; HEIGHT as usize]),
        time: 0.0,
    };

    initscr();

    let time = 0;

    while true {
        clear();
        flushinp();

        // Render
        cam.time = (time as f32 / 60.0) * 2.0 * PI;
        let timestamp = Instant::now();
        cam.render();
        addstr(&cam.buffer.to_string());
        addstr(&format!("\nRendered in {:?}\n", timestamp.elapsed()).to_string());
        refresh();

        // Handle input
        let char = getch();

        let cam_speed = 0.5;
        let cam_turn_rate = 30.0;

        if char == 106 || char == 74 {
            cam.position -= cam.direction * cam_speed;
        } else if char == 107 || char == 75 {
            cam.position += cam.direction * cam_speed;
        } else if char == 104 {
            cam.direction = rotate_z(cam.direction, -2.0 * PI / cam_turn_rate);
        } else if char == 108 {
            cam.direction = rotate_z(cam.direction, 2.0 * PI / cam_turn_rate);
        } else if char == 72 {
            cam.position -= rotate_z(cam.direction, PI / 2.0) * cam_speed;
        } else if char == 76 {
            cam.position += rotate_z(cam.direction, PI / 2.0) * cam_speed;
        } else if char == 70 { // F
            cam.direction = -cam.direction;
        }
    }

    endwin();
}