#[macro_use] extern crate glium; mod support; use glium::index::PrimitiveType; use glium::{Display, Surface}; use glutin::surface::WindowSurface; use support::{ApplicationContext, State}; #[derive(Copy, Clone)] struct Vertex { position: [f32; 2], color: [f32; 3], } implement_vertex!(Vertex, position, color); struct Application { pub vertex_buffer: glium::VertexBuffer, pub index_buffer: glium::IndexBuffer, pub program: glium::Program, } impl ApplicationContext for Application { const WINDOW_TITLE:&'static str = "Glium triangle example"; fn new(display: &Display) -> Self { let vertex_buffer = { glium::VertexBuffer::new( display, &[ Vertex { position: [-0.5, -0.5], color: [0.0, 1.0, 0.0], }, Vertex { position: [0.0, 0.5], color: [0.0, 0.0, 1.0], }, Vertex { position: [0.5, -0.5], color: [1.0, 0.0, 0.0], }, ], ) .unwrap() }; // building the index buffer let index_buffer = glium::IndexBuffer::new(display, PrimitiveType::TrianglesList, &[0u16, 1, 2]).unwrap(); // compiling shaders and linking them together let program = program!(display, 100 => { vertex: " #version 100 uniform lowp mat4 matrix; attribute lowp vec2 position; attribute lowp vec3 color; varying lowp vec3 vColor; void main() { gl_Position = vec4(position, 0.0, 1.0) * matrix; vColor = color; } ", fragment: " #version 100 varying lowp vec3 vColor; void main() { gl_FragColor = vec4(vColor, 1.0); } ", }, ) .unwrap(); Self { vertex_buffer, index_buffer, program, } } fn draw_frame(&mut self, display: &Display) { let mut frame = display.draw(); // For this example a simple identity matrix suffices let uniforms = uniform! { matrix: [ [1.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 1.0f32] ] }; // Now we can draw the triangle frame.clear_color(0.0, 0.0, 0.0, 0.0); frame .draw( &self.vertex_buffer, &self.index_buffer, &self.program, &uniforms, &Default::default(), ) .unwrap(); frame.finish().unwrap(); } } fn main() { State::::run_loop(); }