summaryrefslogtreecommitdiff
path: root/src/main.rs
blob: eb89fef43f8100ec5c8fceea42828d0c2ea830a0 (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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
use std::error::Error;

use engine::color::Color;
use engine::object::{Id as ObjectId, Object};
use engine::vector::Vec3;
use engine::vertex::Builder as VertexBuilder;
use engine::{Engine, Key, WindowSize};
use tracing::Level;
use tracing_subscriber::FmtSubscriber;

const WINDOW_SIZE: WindowSize = WindowSize { width: 500, height: 600 };

const BLUE: Color<f32> = Color { red: 0.0, blue: 1.0, green: 0.0 };

fn main() -> Result<(), Box<dyn Error>>
{
    let subscriber = FmtSubscriber::builder()
        .with_max_level(Level::TRACE)
        .finish();

    tracing::subscriber::set_global_default(subscriber)?;

    let mut engine = Engine::new(&WINDOW_SIZE, "Yaaay lmao")?;

    let mut triangle = Object::new(
        ObjectId::new(1),
        &[
            VertexBuilder::new()
                .pos(Vec3 { x: -0.5, y: -0.5, z: 0.0 })
                .color(Color { red: 1.0, green: 0.0, blue: 0.0 })
                .build()
                .unwrap(),
            VertexBuilder::new()
                .pos(Vec3 { x: 0.5, y: -0.5, z: 0.0 })
                .color(Color { red: 0.0, green: 1.0, blue: 0.0 })
                .build()
                .unwrap(),
            VertexBuilder::new()
                .pos(Vec3 { x: 0.0, y: 0.5, z: 0.0 })
                .color(Color { red: 0.0, green: 0.0, blue: 1.0 })
                .build()
                .unwrap(),
        ],
        None,
    )?;

    triangle.translate(Vec3 { x: 0.0, y: 0.4, z: 0.0 });

    engine.add_object(triangle);

    let square = Object::new(
        ObjectId::new(2),
        &[
            VertexBuilder::new()
                .pos(Vec3 { x: 0.5, y: 0.5, z: 0.0 })
                .color(BLUE)
                .build()
                .unwrap(),
            VertexBuilder::new()
                .pos(Vec3 { x: 0.5, y: -0.5, z: 0.0 })
                .color(BLUE)
                .build()
                .unwrap(),
            VertexBuilder::new()
                .pos(Vec3 { x: -0.5, y: -0.5, z: 0.0 })
                .color(BLUE)
                .build()
                .unwrap(),
            VertexBuilder::new()
                .pos(Vec3 { x: -0.5, y: 0.5, z: 0.0 })
                .color(BLUE)
                .build()
                .unwrap(),
        ],
        Some(&[0, 1, 3, 1, 2, 3]),
    )?;

    engine.add_object(square);

    let cam_speed = 3.0;

    engine.start(|engine| {
        let delta_time = *engine.delta_time();

        if engine.is_key_pressed(Key::W).unwrap() {
            let cam_target_direction = engine.camera().target_direction().clone();

            *engine.camera_mut().position_mut() +=
                cam_target_direction * cam_speed * delta_time.as_secs_f32();
        }
        if engine.is_key_pressed(Key::S).unwrap() {
            let rev_cam_target_direction = -engine.camera().target_direction().clone();

            *engine.camera_mut().position_mut() +=
                rev_cam_target_direction * cam_speed * delta_time.as_secs_f32();
        }
        if engine.is_key_pressed(Key::A).unwrap() {
            let cam_left = engine.camera().left().clone();

            // Camera speed adjusted to be same no matter how far the distance is to the
            // camera target
            let cam_speed_dist_adj = cam_speed
                * (engine.camera().position() - engine.camera().target()).length();

            *engine.camera_mut().position_mut() +=
                cam_left * cam_speed_dist_adj * delta_time.as_secs_f32();
        }
        if engine.is_key_pressed(Key::D).unwrap() {
            let cam_right = engine.camera().right().clone();

            // Camera speed adjusted to be same no matter how far the distance is to the
            // camera target
            let cam_speed_dist_adj = cam_speed
                * (engine.camera().position() - engine.camera().target()).length();

            *engine.camera_mut().position_mut() +=
                cam_right * cam_speed_dist_adj * delta_time.as_secs_f32();
        }
    })?;

    Ok(())
}