#![allow(dead_code)]
extern crate genmesh;
extern crate clock_ticks;
extern crate obj;
use std::thread;
use std::time::Duration;
use glium::{self, Display};
use glium::vertex::VertexBufferAny;
pub mod camera;
pub enum Action {
Stop,
Continue,
}
pub fn start_loop<F>(mut callback: F) where F: FnMut() -> Action {
let mut accumulator = 0;
let mut previous_clock = clock_ticks::precise_time_ns();
loop {
match callback() {
Action::Stop => break,
Action::Continue => ()
};
let now = clock_ticks::precise_time_ns();
accumulator += now - previous_clock;
previous_clock = now;
const FIXED_TIME_STAMP: u64 = 16666667;
while accumulator >= FIXED_TIME_STAMP {
accumulator -= FIXED_TIME_STAMP;
}
thread::sleep(Duration::from_millis(((FIXED_TIME_STAMP - accumulator) / 1000000) as u64));
}
}
pub fn load_wavefront(display: &Display, data: &[u8]) -> VertexBufferAny {
#[derive(Copy, Clone)]
struct Vertex {
position: [f32; 3],
normal: [f32; 3],
texture: [f32; 2],
}
implement_vertex!(Vertex, position, normal, texture);
let mut data = ::std::io::BufReader::new(data);
let data = obj::Obj::load(&mut data);
let mut vertex_data = Vec::new();
for object in data.object_iter() {
for shape in object.group_iter().flat_map(|g| g.indices().iter()) {
match shape {
&genmesh::Polygon::PolyTri(genmesh::Triangle { x: v1, y: v2, z: v3 }) => {
for v in [v1, v2, v3].iter() {
let position = data.position()[v.0];
let texture = v.1.map(|index| data.texture()[index]);
let normal = v.2.map(|index| data.normal()[index]);
let texture = texture.unwrap_or([0.0, 0.0]);
let normal = normal.unwrap_or([0.0, 0.0, 0.0]);
vertex_data.push(Vertex {
position: position,
normal: normal,
texture: texture,
})
}
},
_ => unimplemented!()
}
}
}
glium::vertex::VertexBuffer::new(display, &vertex_data).unwrap().into_vertex_buffer_any()
}