use std::rc::Rc;
use glium::{self, Surface};
use context::{self, Texture};
use mesh::Mesh;
use color::Color;
use math::{Vec3, Mat4, Rect};
pub struct Frame {
context: Rc<context::Context>,
inner: glium::Frame,
}
impl Frame {
pub fn new(context: Rc<context::Context>) -> Self {
let inner = context.display.draw();
let mut frame = Self { context, inner };
frame.inner.clear_color_and_depth(frame.context.background_color.get(), 1.0);
frame
}
pub fn draw_rect(&mut self, rect: Rect) {
let context = self.context.clone();
self.draw_mesh(&context.quad,
Mat4::model(Vec3::from(rect.position), Vec3::from(rect.size)),
&context.default_shader,
&context.white)
}
pub fn draw_text(&mut self, text: &context::Texture, rect: Rect) {
let context = self.context.clone();
self.draw_mesh(&context.quad,
Mat4::model(Vec3::from(rect.position), Vec3::from(rect.size)),
&context.default_shader,
&text)
}
pub fn set_color(&mut self, color: Color) {
self.context.color.set(color);
}
pub fn draw_mesh(&mut self, mesh: &Mesh, model: Mat4, shader: &glium::Program, texture: &Texture) {
let (w, h) = self.inner.get_dimensions();
let params = glium::DrawParameters {
depth: glium::Depth {
test: glium::draw_parameters::DepthTest::IfLessOrEqual,
write: true,
..Default::default()
},
blend: glium::Blend::alpha_blending(),
backface_culling: glium::draw_parameters::BackfaceCullingMode::CullingDisabled,
..Default::default()
};
self.inner
.draw(&mesh.vertices,
&mesh.indices,
&shader,
&uniform! {
u_model: model.elements(),
u_projection: Mat4::ortho(0.0, w as f32, 0.0, h as f32, -1.0, 1.0).elements(),
u_color: self.context.color.get(),
u_texture: texture,
},
¶ms)
.unwrap();
}
pub fn finish(self) {
self.inner.finish().unwrap();
}
}