diff options
| -rw-r--r-- | src/gl_renderer.rs | 46 | ||||
| -rw-r--r-- | src/input.rs | 20 | ||||
| -rw-r--r-- | src/main.rs | 12 |
3 files changed, 75 insertions, 3 deletions
diff --git a/src/gl_renderer.rs b/src/gl_renderer.rs index 64f9151..9f71074 100644 --- a/src/gl_renderer.rs +++ b/src/gl_renderer.rs @@ -19,16 +19,58 @@ extern crate simple_error; use std::error::Error; +use self::glium::glutin; + use bitmap::BitmapManager; +use input::Event; /// Renderer using the OpenGL library. -pub struct GLRenderer; +pub struct GLRenderer { + events_loop: glutin::EventsLoop, + display: glium::Display, +} impl GLRenderer { /// Instantiate a new instance of the renderer. pub fn new(bitmaps: &BitmapManager) -> Result<GLRenderer, Box<Error>> { let _font = bitmaps.get_font("textfont").unwrap(); - Ok(GLRenderer { }) + let events_loop = glutin::EventsLoop::new(); + let window = glutin::WindowBuilder::new(); + let context = glutin::ContextBuilder::new(); + let display = glium::Display::new(window, context, &events_loop)?; + + Ok(GLRenderer { events_loop, display }) + } + + // TODO: Document this. + fn convert_event(ev: glutin::DeviceEvent) -> Event { + match ev { + // glutin::DeviceEvent::Button { button, state } => { + // if state == glutin::ElementState::Pressed { + // Event::KeyDown(button as u8) + // } else { + // Event::KeyUp(button as u8) + // } + // }, + glutin::DeviceEvent::Key(press) => { + Event::KeyDown(press.scancode as u8) + } + _ => Event::None, + } + } + + // TODO: Document this. + pub fn handle_input<F>(&mut self, mut on_event: F) + where F: FnMut(Event) { + self.events_loop.poll_events(|ev| { + match ev { + glutin::Event::DeviceEvent { device_id: _, event } => { + let equivalent = GLRenderer::convert_event(event); + on_event(equivalent); + }, + _ => (), + } + }); } } diff --git a/src/input.rs b/src/input.rs new file mode 100644 index 0000000..8303cf0 --- /dev/null +++ b/src/input.rs @@ -0,0 +1,20 @@ +// Copyright (C) 2018 Jakob L. Kreuze, All Rights Reserved. +// +// This file is part of rebuild. +// +// rebuild is free software: you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the Free Software +// Foundation, either version 3 of the License, or (at your option) any later +// version. +// +// rebuild is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +// A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with +// rebuild. If not, see <http://www.gnu.org/licenses/>. + +pub enum Event { + KeyDown(u8), + None, +} diff --git a/src/main.rs b/src/main.rs index 3b7660b..462ac17 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,6 +22,7 @@ use std::process; mod bitmap; mod gl_renderer; mod grp; +mod input; mod path; mod world; @@ -42,5 +43,14 @@ fn main() { let bitmaps = bitmap::BitmapManager::new(&groups).unwrap(); let _tile = bitmaps.get_tile(0); - let _renderer = gl_renderer::GLRenderer::new(&bitmaps); + let mut renderer = gl_renderer::GLRenderer::new(&bitmaps).unwrap(); + + loop { + renderer.handle_input(|ev| { + match ev { + input::Event::KeyDown(key) => println!("{}", key), + _ => (), + } + }); + } } |