model-converter/src/renderer.rs

69 lines
1.6 KiB
Rust
Raw Normal View History

2018-02-26 11:45:53 +01:00
use glium::index::{
NoIndices,
PrimitiveType
};
use glium::{
Program,
Display,
VertexBuffer,
Frame,
};
use model::{Model, Vertex};
pub struct Renderer<'a> {
display: Display,
program: Program,
models: Vec<(&'a Model, Vec<VertexBuffer<Vertex>>)>,
}
impl<'a> Renderer<'a> {
pub fn new(display: Display) -> Renderer<'a> {
let program = Program::from_source(
&display,
include_str!("../assets/shaders/shader.vert"),
include_str!("../assets/shaders/shader.frag"),
None
).unwrap();
Renderer {
display: display,
program: program,
models: vec![],
}
}
pub fn add_model(&mut self, model: &'a Model) {
let mut buffers = vec![];
for part in &model.parts {
let shape = part.build_shape(&model.vertices, &model.texture_coordinates, &model.normals);
buffers.push(VertexBuffer::new(&self.display, &shape).unwrap());
}
self.models.push((model, buffers));
}
pub fn draw(&self) -> Frame {
self.display.draw()
}
pub fn render(&self, target: &mut Frame) {
use glium::Surface;
target.clear_color(0.0, 0.0, 0.0, 1.0);
for &(_, ref buffers) in &self.models {
for buffer in buffers {
target.draw(
buffer,
NoIndices(PrimitiveType::TrianglesList),
&self.program,
&uniform!(),
&Default::default(),
).unwrap();
}
}
}
}