X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=shaded_cube.rs;fp=shaded_cube.rs;h=fb4fb1dafa105261c0823b4def54e7f8f0da7f2b;hb=c298ca511683f329dfedd18bf9490520586cf8cf;hp=0000000000000000000000000000000000000000;hpb=d703c3a22e749eb1f87daed8674b0420dc837ebe;p=mandelwow.git diff --git a/shaded_cube.rs b/shaded_cube.rs new file mode 100644 index 0000000..fb4fb1d --- /dev/null +++ b/shaded_cube.rs @@ -0,0 +1,184 @@ +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(); +} + +*/