onyx 0.2.0

A simple engine for simple minds
Documentation
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,
                },
                &params)
            .unwrap();
    }

    pub fn finish(self) {
        self.inner.finish().unwrap();
    }
}