use cube::Cube; use glium; use glium::{Display, Program, Surface}; use glium::index::{IndexBuffer, PrimitiveType}; pub fn shaded_program(display: &Display) -> Program { let vertex_shader_src = include_str!("shaded.vert"); let fragment_shader_src = include_str!("shaded.frag"); return Program::from_source(display, vertex_shader_src, fragment_shader_src, None).unwrap(); } #[derive(Copy, Clone)] struct Vertex { position: [f32; 3], normal: [f32; 3], } implement_vertex!(Vertex, position, normal); pub struct ShadedCube<'a> { vertexes: glium::VertexBuffer, program: &'a Program, indices: IndexBuffer, } impl<'a> ShadedCube<'a> { pub fn new(display: &Display, c: &Cube, program: &'a Program) -> ShadedCube<'a> { // x---> // 4 ──────┐ 5 // ╱┆ ╱│ // 0 ┌─────┐1 │ // y │ 7+┄┄│┄┄+ 6 // | │╱ │ ╱ / // v └─────┘ z // 3 2 let vertex_data = [ // Front face Vertex { position: [c.xmin, c.ymin, c.zmin], normal: [ 0., 0., 1.] }, // 0 Vertex { position: [c.xmax, c.ymin, c.zmin], normal: [ 0., 0., 1.] }, // 1 Vertex { position: [c.xmax, c.ymax, c.zmin], normal: [ 0., 0., 1.] }, // 2 Vertex { position: [c.xmin, c.ymax, c.zmin], normal: [ 0., 0., 1.] }, // 3 // Back face Vertex { position: [c.xmin, c.ymax, c.zmax], normal: [ 0., 0., -1.] }, // 7 Vertex { position: [c.xmax, c.ymax, c.zmax], normal: [ 0., 0., -1.] }, // 6 Vertex { position: [c.xmax, c.ymin, c.zmax], normal: [ 0., 0., -1.] }, // 5 Vertex { position: [c.xmin, c.ymin, c.zmax], normal: [ 0., 0., -1.] }, // 4 // Right face Vertex { position: [c.xmax, c.ymin, c.zmin], normal: [ -1., 0., 0.] }, // 1 Vertex { position: [c.xmax, c.ymin, c.zmax], normal: [ -1., 0., 0.] }, // 5 Vertex { position: [c.xmax, c.ymax, c.zmax], normal: [ -1., 0., 0.] }, // 6 Vertex { position: [c.xmax, c.ymax, c.zmin], normal: [ -1., 0., 0.] }, // 2 // Left face Vertex { position: [c.xmin, c.ymin, c.zmin], normal: [ 1., 0., 0.] }, // 0 Vertex { position: [c.xmin, c.ymax, c.zmin], normal: [ 1., 0., 0.] }, // 3 Vertex { position: [c.xmin, c.ymax, c.zmax], normal: [ 1., 0., 0.] }, // 7 Vertex { position: [c.xmin, c.ymin, c.zmax], normal: [ 1., 0., 0.] }, // 4 // Top face Vertex { position: [c.xmin, c.ymin, c.zmin], normal: [ 0., 1., 0.] }, // 0 Vertex { position: [c.xmin, c.ymin, c.zmax], normal: [ 0., 1., 0.] }, // 4 Vertex { position: [c.xmax, c.ymin, c.zmax], normal: [ 0., 1., 0.] }, // 5 Vertex { position: [c.xmax, c.ymin, c.zmin], normal: [ 0., 1., 0.] }, // 1 // Bottom face Vertex { position: [c.xmax, c.ymax, c.zmin], normal: [ 0., -1., 0.] }, // 2 Vertex { position: [c.xmax, c.ymax, c.zmax], normal: [ 0., -1., 0.] }, // 6 Vertex { position: [c.xmin, c.ymax, c.zmax], normal: [ 0., -1., 0.] }, // 7 Vertex { position: [c.xmin, c.ymax, c.zmin], normal: [ 0., -1., 0.] }, // 3 ]; const INDICES: &[u16] = &[ 0, 1, 2, 0, 2, 3, // Front 4, 5, 6, 4, 6, 7, // Back 8, 9, 10, 8, 10, 11, // Right 12, 13, 14, 12, 14, 15, // Left 16, 17, 18, 16, 18, 19, // Top 20, 21, 22, 20, 22, 23u16 // Bottom ]; ShadedCube { vertexes: glium::VertexBuffer::new(display, &vertex_data).unwrap(), program: program, indices: IndexBuffer::new(display, PrimitiveType::TrianglesList, INDICES).unwrap(), } } pub fn draw(&self, frame: &mut glium::Frame, uniforms: &U) where U: glium::uniforms::Uniforms { let params = glium::DrawParameters { depth: glium::Depth { test: glium::draw_parameters::DepthTest::IfLess, write: true, ..Default::default() }, blend: glium::Blend::alpha_blending(), ..Default::default() }; frame.draw(&self.vertexes, &self.indices, &self.program, uniforms, ¶ms).unwrap(); } } /* pub fn draw(display: &Display, frame: &mut glium::Frame, program: &Program, uniforms: &U, cube: &Cube) where U: glium::uniforms::Uniforms { implement_vertex!(Vertex, position, normal); #[derive(Copy, Clone)] struct Normal { normal: [f32; 3] } implement_vertex!(Normal, normal); // x---> // 4 ──────┐ 5 // ╱┆ ╱│ // 0 ┌─────┐1 │ // y │ 7+┄┄│┄┄+ 6 // | │╱ │ ╱ / // v └─────┘ z // 3 2 let cube = [ // Front face Vertex { position: [cube.xmin, cube.ymin, cube.zmin], normal: [ 0., 0., 1.] }, // 0 Vertex { position: [cube.xmax, cube.ymin, cube.zmin], normal: [ 0., 0., 1.] }, // 1 Vertex { position: [cube.xmax, cube.ymax, cube.zmin], normal: [ 0., 0., 1.] }, // 2 Vertex { position: [cube.xmin, cube.ymax, cube.zmin], normal: [ 0., 0., 1.] }, // 3 // Back face Vertex { position: [cube.xmin, cube.ymax, cube.zmax], normal: [ 0., 0., -1.] }, // 7 Vertex { position: [cube.xmax, cube.ymax, cube.zmax], normal: [ 0., 0., -1.] }, // 6 Vertex { position: [cube.xmax, cube.ymin, cube.zmax], normal: [ 0., 0., -1.] }, // 5 Vertex { position: [cube.xmin, cube.ymin, cube.zmax], normal: [ 0., 0., -1.] }, // 4 // Right face Vertex { position: [cube.xmax, cube.ymin, cube.zmin], normal: [ -1., 0., 0.] }, // 1 Vertex { position: [cube.xmax, cube.ymin, cube.zmax], normal: [ -1., 0., 0.] }, // 5 Vertex { position: [cube.xmax, cube.ymax, cube.zmax], normal: [ -1., 0., 0.] }, // 6 Vertex { position: [cube.xmax, cube.ymax, cube.zmin], normal: [ -1., 0., 0.] }, // 2 // Left face Vertex { position: [cube.xmin, cube.ymin, cube.zmin], normal: [ 1., 0., 0.] }, // 0 Vertex { position: [cube.xmin, cube.ymax, cube.zmin], normal: [ 1., 0., 0.] }, // 3 Vertex { position: [cube.xmin, cube.ymax, cube.zmax], normal: [ 1., 0., 0.] }, // 7 Vertex { position: [cube.xmin, cube.ymin, cube.zmax], normal: [ 1., 0., 0.] }, // 4 // Top face Vertex { position: [cube.xmin, cube.ymin, cube.zmin], normal: [ 0., 1., 0.] }, // 0 Vertex { position: [cube.xmin, cube.ymin, cube.zmax], normal: [ 0., 1., 0.] }, // 4 Vertex { position: [cube.xmax, cube.ymin, cube.zmax], normal: [ 0., 1., 0.] }, // 5 Vertex { position: [cube.xmax, cube.ymin, cube.zmin], normal: [ 0., 1., 0.] }, // 1 // Bottom face Vertex { position: [cube.xmax, cube.ymax, cube.zmin], normal: [ 0., -1., 0.] }, // 2 Vertex { position: [cube.xmax, cube.ymax, cube.zmax], normal: [ 0., -1., 0.] }, // 6 Vertex { position: [cube.xmin, cube.ymax, cube.zmax], normal: [ 0., -1., 0.] }, // 7 Vertex { position: [cube.xmin, cube.ymax, cube.zmin], normal: [ 0., -1., 0.] }, // 3 ]; let vb = glium::VertexBuffer::new(display, &cube).unwrap(); let params = glium::DrawParameters { depth: glium::Depth { test: glium::draw_parameters::DepthTest::IfLess, write: true, ..Default::default() }, blend: glium::Blend::alpha_blending(), ..Default::default() }; let front_indices = IndexBuffer::new(display, PrimitiveType::TrianglesList, &[ 0, 1, 2, 0, 2, 3, // Front 4, 5, 6, 4, 6, 7, // Back 8, 9, 10, 8, 10, 11, // Right 12, 13, 14, 12, 14, 15, // Left 16, 17, 18, 16, 18, 19, // Top 20, 21, 22, 20, 22, 23u16, // Bottom ]).unwrap(); frame.draw(&vb, &front_indices, program, uniforms, ¶ms).unwrap(); } */