// 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 .
extern crate glium;
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 {
events_loop: glutin::EventsLoop,
display: glium::Display,
}
impl GLRenderer {
/// Instantiate a new instance of the renderer.
pub fn new(bitmaps: &BitmapManager) -> Result> {
let _font = bitmaps.get_font("textfont").unwrap();
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(&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);
},
_ => (),
}
});
}
}