| 1 | 
                
                  #[macro_use]
                  
                 | 
              
 | 2 | 
                
                  extern crate glium;
                  
                 | 
              
 | 3 | 
                
                  extern crate image;
                  
                 | 
              
 | 4 | 
                
                  
                  
                 | 
              
 | 5 | 
                
                  use glium::{DisplayBuild,Display,IndexBuffer,Program,Surface,VertexBuffer};
                  
                 | 
              
 | 6 | 
                
                  use glium::glutin::{Event,WindowBuilder};
                  
                 | 
              
 | 7 | 
                
                  use glium::index::PrimitiveType;
                  
                 | 
              
 | 8 | 
                
                  use glium::texture::Texture2d;
                  
                 | 
              
 | 9 | 
                
                  
                  
                 | 
              
 | 10 | 
                
                  struct BallState {
                  
                 | 
              
 | 11 | 
                
                      pos: (f32, f32),
                  
                 | 
              
 | 12 | 
                
                      dpos: (f32, f32),
                  
                 | 
              
 | 13 | 
                
                  }
                  
                 | 
              
 | 14 | 
                
                  
                  
                 | 
              
 | 15 | 
                
                  #[derive(Debug,Clone,Copy)]
                  
                 | 
              
 | 16 | 
                
                  struct V2D {
                  
                 | 
              
 | 17 | 
                
                      pos: [f32;2],
                  
                 | 
              
 | 18 | 
                
                      tex: [f32;2],
                  
                 | 
              
 | 19 | 
                
                  }
                  
                 | 
              
 | 20 | 
                
                  
                  
                 | 
              
 | 21 | 
                
                  implement_vertex!(V2D, pos, tex);
                  
                 | 
              
 | 22 | 
                
                  
                  
                 | 
              
 | 23 | 
                
                  fn load_texture(d: &Display) -> Texture2d {
                  
                 | 
              
 | 24 | 
                
                      use std::io::Cursor;
                  
                 | 
              
 | 25 | 
                
                      let img = image::load(
                  
                 | 
              
 | 26 | 
                
                          Cursor::new(&include_bytes!("../assets/texture.png")[..]),
                  
                 | 
              
 | 27 | 
                
                          image::PNG).unwrap().to_rgba();
                  
                 | 
              
 | 28 | 
                
                      let dims = img.dimensions();
                  
                 | 
              
 | 29 | 
                
                      let img = glium::texture::RawImage2d::from_raw_rgba_reversed(
                  
                 | 
              
 | 30 | 
                
                          img.into_raw(), dims);
                  
                 | 
              
 | 31 | 
                
                      Texture2d::new(d, img).unwrap()
                  
                 | 
              
 | 32 | 
                
                  }
                  
                 | 
              
 | 33 | 
                
                  
                  
                 | 
              
 | 34 | 
                
                  fn walls(d: &Display) -> (VertexBuffer<V2D>, IndexBuffer<u16>) {
                  
                 | 
              
 | 35 | 
                
                      let mut vertices = vec![];
                  
                 | 
              
 | 36 | 
                
                      let mut indices = vec![];
                  
                 | 
              
 | 37 | 
                
                      let mut i = 0;
                  
                 | 
              
 | 38 | 
                
                      for x in -9..10i32 {
                  
                 | 
              
 | 39 | 
                
                          for y in -9..10i32 {
                  
                 | 
              
 | 40 | 
                
                              if x.abs() == 9 || y.abs() == 9 {
                  
                 | 
              
 | 41 | 
                
                                  vertices.extend_from_slice(&square_at((x as f32, y as f32), (0.5, 0.0)));
                  
                 | 
              
 | 42 | 
                
                                  indices.extend_from_slice(
                  
                 | 
              
 | 43 | 
                
                                      &[i + 2, i + 1, i, i + 3, i + 2, i]);
                  
                 | 
              
 | 44 | 
                
                                  i += 4;
                  
                 | 
              
 | 45 | 
                
                              }
                  
                 | 
              
 | 46 | 
                
                          }
                  
                 | 
              
 | 47 | 
                
                      }
                  
                 | 
              
 | 48 | 
                
                      let vbuf = VertexBuffer::new(d, vertices.as_slice()).unwrap();
                  
                 | 
              
 | 49 | 
                
                      let ibuf = IndexBuffer::new(d, PrimitiveType::TrianglesList, indices.as_slice()).unwrap();
                  
                 | 
              
 | 50 | 
                
                      (vbuf, ibuf)
                  
                 | 
              
 | 51 | 
                
                  }
                  
                 | 
              
 | 52 | 
                
                  
                  
                 | 
              
 | 53 | 
                
                  fn square_at((x, y): (f32, f32), (bu, bv): (f32, f32)) -> [V2D;4] {
                  
                 | 
              
 | 54 | 
                
                      [ V2D { pos: [ x - 0.5, y - 0.5 ], tex: [bu,bv] },
                  
                 | 
              
 | 55 | 
                
                        V2D { pos: [ x + 0.5, y - 0.5 ], tex: [bu,bv+0.5] },
                  
                 | 
              
 | 56 | 
                
                        V2D { pos: [ x + 0.5, y + 0.5 ], tex: [bu+0.5,bv+0.5] },
                  
                 | 
              
 | 57 | 
                
                        V2D { pos: [ x - 0.5, y + 0.5 ], tex: [bu,bv+0.5] },
                  
                 | 
              
 | 58 | 
                
                      ]
                  
                 | 
              
 | 59 | 
                
                  }
                  
                 | 
              
 | 60 | 
                
                  
                  
                 | 
              
 | 61 | 
                
                  fn ball(d: &Display, pos: (f32, f32)) -> (VertexBuffer<V2D>, IndexBuffer<u16>) {
                  
                 | 
              
 | 62 | 
                
                      let vertices = square_at(pos, (0.0, 0.0));
                  
                 | 
              
 | 63 | 
                
                      let indices = [ 2, 1, 0, 3, 2, 0 ];
                  
                 | 
              
 | 64 | 
                
                      let vbuf = VertexBuffer::new(d, &vertices).unwrap();
                  
                 | 
              
 | 65 | 
                
                      let ibuf = IndexBuffer::new(d, PrimitiveType::TrianglesList, &indices).unwrap();
                  
                 | 
              
 | 66 | 
                
                      (vbuf, ibuf)
                  
                 | 
              
 | 67 | 
                
                  }
                  
                 | 
              
 | 68 | 
                
                  
                  
                 | 
              
 | 69 | 
                
                  fn main() {
                  
                 | 
              
 | 70 | 
                
                      let display = WindowBuilder::new()
                  
                 | 
              
 | 71 | 
                
                          .with_title(format!("bouncy"))
                  
                 | 
              
 | 72 | 
                
                          .build_glium()
                  
                 | 
              
 | 73 | 
                
                          .unwrap();
                  
                 | 
              
 | 74 | 
                
                      let program = Program::from_source(
                  
                 | 
              
 | 75 | 
                
                          &display,
                  
                 | 
              
 | 76 | 
                
                          include_str!("../assets/vertex.glsl"),
                  
                 | 
              
 | 77 | 
                
                          include_str!("../assets/fragment.glsl"),
                  
                 | 
              
 | 78 | 
                
                          None).unwrap();
                  
                 | 
              
 | 79 | 
                
                      let texture = load_texture(&display);
                  
                 | 
              
 | 80 | 
                
                  
                  
                 | 
              
 | 81 | 
                
                      let mut st = BallState {
                  
                 | 
              
 | 82 | 
                
                          pos: (0.0, 0.0),
                  
                 | 
              
 | 83 | 
                
                          dpos: (0.1, 0.1),
                  
                 | 
              
 | 84 | 
                
                      };
                  
                 | 
              
 | 85 | 
                
                  
                  
                 | 
              
 | 86 | 
                
                      let (w_vbuf, w_ibuf) = walls(&display);
                  
                 | 
              
 | 87 | 
                
                  
                  
                 | 
              
 | 88 | 
                
                      loop {
                  
                 | 
              
 | 89 | 
                
                          let mut tgt = display.draw();
                  
                 | 
              
 | 90 | 
                
                  
                  
                 | 
              
 | 91 | 
                
                          let params = Default::default();
                  
                 | 
              
 | 92 | 
                
                          tgt.clear_color(1.0, 1.0, 1.0, 1.0);
                  
                 | 
              
 | 93 | 
                
                  
                  
                 | 
              
 | 94 | 
                
                          let (width, height) = tgt.get_dimensions();
                  
                 | 
              
 | 95 | 
                
                          let aspect_ratio = height as f32 / width as f32;
                  
                 | 
              
 | 96 | 
                
                          let (vbuf, ibuf) = ball(&display, st.pos);
                  
                 | 
              
 | 97 | 
                
                          tgt.draw(&vbuf, &ibuf, &program,
                  
                 | 
              
 | 98 | 
                
                                   &uniform! {
                  
                 | 
              
 | 99 | 
                
                                       texmap: &texture,
                  
                 | 
              
 | 100 | 
                
                                       ratio: aspect_ratio,
                  
                 | 
              
 | 101 | 
                
                                   },
                  
                 | 
              
 | 102 | 
                
                                   ¶ms).unwrap();
                  
                 | 
              
 | 103 | 
                
                          tgt.draw(&w_vbuf, &w_ibuf, &program,
                  
                 | 
              
 | 104 | 
                
                                   &uniform! {
                  
                 | 
              
 | 105 | 
                
                                       texmap: &texture,
                  
                 | 
              
 | 106 | 
                
                                       ratio: aspect_ratio,
                  
                 | 
              
 | 107 | 
                
                                   },
                  
                 | 
              
 | 108 | 
                
                                   ¶ms).unwrap();
                  
                 | 
              
 | 109 | 
                
                  
                  
                 | 
              
 | 110 | 
                
                          tgt.finish().unwrap();
                  
                 | 
              
 | 111 | 
                
                  
                  
                 | 
              
 | 112 | 
                
                          for ev in display.poll_events() {
                  
                 | 
              
 | 113 | 
                
                              match ev {
                  
                 | 
              
 | 114 | 
                
                                  Event::Closed => return,
                  
                 | 
              
 | 115 | 
                
                                  Event::KeyboardInput(_, n, _) =>
                  
                 | 
              
 | 116 | 
                
                                      match n {
                  
                 | 
              
 | 117 | 
                
                                          9 => return,
                  
                 | 
              
 | 118 | 
                
                                          24 => return,
                  
                 | 
              
 | 119 | 
                
                                          _  => {},
                  
                 | 
              
 | 120 | 
                
                                      },
                  
                 | 
              
 | 121 | 
                
                                  _ => {},
                  
                 | 
              
 | 122 | 
                
                              }
                  
                 | 
              
 | 123 | 
                
                          }
                  
                 | 
              
 | 124 | 
                
                          {
                  
                 | 
              
 | 125 | 
                
                              let (x, y) = st.pos;
                  
                 | 
              
 | 126 | 
                
                              let (mut dx, mut dy) = st.dpos;
                  
                 | 
              
 | 127 | 
                
                              if x < -8.0 || x > 8.0 {
                  
                 | 
              
 | 128 | 
                
                                  dx = -dx;
                  
                 | 
              
 | 129 | 
                
                              }
                  
                 | 
              
 | 130 | 
                
                              if y < -8.0 || y > 8.0 {
                  
                 | 
              
 | 131 | 
                
                                  dy = -dy;
                  
                 | 
              
 | 132 | 
                
                              }
                  
                 | 
              
 | 133 | 
                
                              dy -= 0.01;
                  
                 | 
              
 | 134 | 
                
                              st.pos = (x + dx, y + dy);
                  
                 | 
              
 | 135 | 
                
                              st.dpos = (dx, dy);
                  
                 | 
              
 | 136 | 
                
                          }
                  
                 | 
              
 | 137 | 
                
                      }
                  
                 | 
              
 | 138 | 
                
                  }
                  
                 |