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
use glutin;
use {Camera, Scene};
use camera::Projection;
use input::Input;
use render::Renderer;
use factory::Factory;
pub struct Window {
event_loop: glutin::EventsLoop,
window: glutin::Window,
pub input: Input,
pub renderer: Renderer,
pub factory: Factory,
pub scene: Scene,
}
impl Window {
pub fn new(title: &str, shader_path: &str) -> Self {
let builder = glutin::WindowBuilder::new()
.with_title(title)
.with_vsync();
let event_loop = glutin::EventsLoop::new();
let (renderer, window, mut factory) = Renderer::new(builder, &event_loop, shader_path);
let scene = factory.scene();
Window {
event_loop,
window,
input: Input::new(),
renderer,
factory,
scene,
}
}
pub fn update(&mut self) -> bool {
let mut running = true;
let renderer = &mut self.renderer;
let input = &mut self.input;
input.reset();
self.window.swap_buffers().unwrap();
let window = &self.window;
self.event_loop.poll_events(|glutin::Event::WindowEvent {event, ..}| {
use glutin::WindowEvent::*;
match event {
Resized(..) => renderer.resize(window),
Closed => running = false,
KeyboardInput(state, _, Some(key), _) => input.keyboard_input(state, key),
MouseInput(state, button) => input.mouse_input(state, button),
MouseMoved(x, y) => input.mouse_moved(renderer.map_to_ndc(x, y)),
_ => ()
}
});
running
}
pub fn render<P: Projection>(&mut self, camera: &Camera<P>) {
self.renderer.render(&self.scene, camera);
}
}