+ pub fn new(gravity: Point<f64>, grid: Grid<bool>, mut walls: Vec<WallRegion>) -> Self {
+ let size = (2560, 1440); // TODO: get actual size from walls or something
+ let wall_grid = Level::build_wall_grid(&mut walls, &size.into());
+ dbg!(&wall_grid.scale);
+ Level {
+ gravity,
+ grid,
+ walls,
+ wall_grid,
+ }
+ }
+
+ /// Creates a grid of wall edges for fast lookup
+ fn build_wall_grid(walls: &mut Vec<WallRegion>, lvlsize: &Dimension<usize>) -> Grid<Vec<Rc<WallEdge>>> {
+ let size = dimen!(lvlsize.width / 20, lvlsize.height / 20); // TODO: make sure all walls fit within the grid bounds
+ let cs = point!(lvlsize.width / size.width, lvlsize.height / size.height);
+ //let cs = point!(scale.width as f64, scale.height as f64);
+ let mut grid = Grid {
+ cells: vec!(vec!(vec!(); size.height); size.width),
+ size,
+ scale: dimen!(cs.x as f64, cs.y as f64),
+ };
+
+ for wall in walls {
+ for edge in &wall.edges {
+ for c in grid.grid_coordinates_on_line(edge.p1, edge.p2) {
+ grid.cells[c.x][c.y].push(Rc::clone(edge));
+ }
+ }
+ }
+
+ grid
+ }
+
+ pub fn render(&mut self, renderer: &mut Renderer, _sprites: &SpriteManager, debug_mode: bool) {
+ if debug_mode {
+ // original grid
+ renderer.canvas().set_draw_color((64, 64, 64));
+ let size = &self.grid.scale;
+ for x in 0..self.grid.size.width {
+ for y in 0..self.grid.size.height {
+ if self.grid.cells[x][y] {
+ renderer.canvas().fill_rect(sdl2::rect::Rect::new(
+ x as i32 * size.width as i32,
+ y as i32 * size.height as i32,
+ size.width as u32,
+ size.height as u32)).unwrap();
+ }
+ }
+ }
+
+ // wall grid
+ renderer.canvas().set_draw_color((0, 32, 0));
+ let size = &self.wall_grid.scale;
+ for x in 0..self.wall_grid.size.width {
+ for y in 0..self.wall_grid.size.height {
+ if !self.wall_grid.cells[x][y].is_empty() {
+ let num = self.wall_grid.cells[x][y].len();
+ renderer.canvas().set_draw_color((0, 32*num as u8, 0));
+ renderer.canvas().fill_rect(sdl2::rect::Rect::new(
+ x as i32 * size.width as i32,
+ y as i32 * size.height as i32,
+ size.width as u32,
+ size.height as u32)).unwrap();
+ }
+ }
+ }
+
+ // wall normals
+ for wall in &self.walls {
+ for e in &wall.edges {
+ let c = (e.p1 + e.p2) / 2.0;
+ let a = (e.p2 - e.p1).to_angle() + std::f64::consts::FRAC_PI_2.radians();