Add a sea shaded cubes, just because. No big deal (yet).
[mandelwow.git] / shaded_cube.rs
diff --git a/shaded_cube.rs b/shaded_cube.rs
new file mode 100644 (file)
index 0000000..fb4fb1d
--- /dev/null
@@ -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<Vertex>,
+    program: &'a Program,
+    indices: IndexBuffer<u16>,
+}
+
+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<U>(&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, &params).unwrap();
+    }
+}
+
+/*
+pub fn draw<U>(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, &params).unwrap();
+}
+
+*/