Browse Source

fix shadow bleed issue

Getty Ritter 1 year ago
parent
commit
fc3e7c2607
1 changed files with 49 additions and 20 deletions
  1. 49 20
      carpet/src/vis.rs

+ 49 - 20
carpet/src/vis.rs

@@ -114,7 +114,7 @@ impl ShadowLine {
                 .get(index - 1)
                 .filter(|sh| sh.end > other.start)
         };
-        let next = if index < self.shadows.len() {
+        let next = if index == self.shadows.len() {
             None
         } else {
             self.shadows.get(index).filter(|sh| sh.start < other.end)
@@ -230,9 +230,9 @@ mod test {
     const V: bool = true;
     const U: bool = false;
 
-    fn assert_same_vis(exp: &Board<bool>, actual: &Board<bool>) {
+    fn assert_same_vis(p: Coord, exp: &Board<bool>, actual: &Board<bool>) {
         if exp != actual {
-            panic!("Expected:\n{}\n========\nActual:\n{}\n", to_vis(exp), to_vis(actual));
+            panic!("Expected:\n{}\n========\nActual:\n{}\n", to_vis(p, exp), to_vis(p, actual));
         }
     }
 
@@ -289,14 +289,37 @@ mod test {
         assert_eq!(line.shadows[1], super::Shadow::new(0.9, 1.0));
     }
 
-    fn to_vis(vis: &super::Board<bool>) -> String {
+    #[test]
+    fn add_shadow_line_several() {
+        let mut line = super::ShadowLine {
+            shadows: Vec::new(),
+        };
+
+        assert_eq!(line.shadows.len(), 0);
+
+        line.add(super::Shadow::new(0.5, 0.8));
+        assert_eq!(line.shadows.len(), 1);
+
+        line.add(super::Shadow::new(0.0, 0.667));
+        assert_eq!(line.shadows.len(), 1);
+
+        line.add(super::Shadow::new(0.6, 1.0));
+        assert_eq!(line.shadows.len(), 1);
+
+    }
+
+    fn to_vis(p: Coord, vis: &super::Board<bool>) -> String {
         let mut buf = String::new();
         for y in 0..vis.height() {
             for x in 0..vis.width() {
-                buf.push(match vis[(x, y)] {
-                    true  => '#',
-                    false => '.',
-                })
+                if p.x == x && p.y == y {
+                    buf.push('@')
+                } else {
+                    buf.push(match vis[(x, y)] {
+                        true  => '#',
+                        false => '.',
+                    })
+                }
             }
             buf.push('\n')
         }
@@ -316,7 +339,8 @@ mod test {
             ]
         ];
         let mut v = Viewshed::create(&b, |n| *n == 1);
-        v.calculate_from(&b, Coord::new(2, 2));
+        let p = Coord::new(2, 2);
+        v.calculate_from(&b, p);
         let exp: Board<bool> = board_from_vec![
             5,5;
             [
@@ -327,7 +351,7 @@ mod test {
                 U, U, U, U, U,
             ]
         ];
-        assert_same_vis(&exp, &v.vis);
+        assert_same_vis(p, &exp, &v.vis);
     }
 
     #[test]
@@ -345,7 +369,8 @@ mod test {
             ]
         ];
         let mut v = Viewshed::create(&b, |n| *n == 1);
-        v.calculate_from(&b, Coord::new(3, 3));
+        let p = Coord::new(3, 3);
+        v.calculate_from(&b, p);
         let exp: Board<bool> = board_from_vec![
             7,7;
             [
@@ -358,7 +383,7 @@ mod test {
                 U, U, U, U, U, U, U,
             ]
         ];
-        assert_same_vis(&exp, &v.vis);
+        assert_same_vis(p, &exp, &v.vis);
     }
 
     #[test]
@@ -376,7 +401,8 @@ mod test {
             ]
         ];
         let mut v = Viewshed::create(&b, |n| *n == 1);
-        v.calculate_from(&b, Coord::new(3, 3));
+        let p = Coord::new(3, 3);
+        v.calculate_from(&b, p);
         let exp: Board<bool> = board_from_vec![
             13,7;
             [
@@ -389,7 +415,7 @@ mod test {
                 U, U, U, U, U, U, U, U, U, U, U, U, U,
             ]
         ];
-        assert_same_vis(&exp, &v.vis);
+        assert_same_vis(p, &exp, &v.vis);
     }
 
     #[test]
@@ -406,7 +432,8 @@ mod test {
         ];
 
         let mut v = Viewshed::create(&b, |n| *n == 1);
-        v.calculate_from(&b, Coord::new(2, 2));
+        let p = Coord::new(2, 2);
+        v.calculate_from(&b, p);
         let exp: Board<bool> = board_from_vec![
             7,5;
             [
@@ -417,9 +444,10 @@ mod test {
                 U, U, U, U, U, U, U,
             ]
         ];
-        assert_same_vis(&exp, &v.vis);
+        assert_same_vis(p, &exp, &v.vis);
 
-        v.calculate_from(&b, Coord::new(4, 2));
+        let p = Coord::new(4, 2);
+        v.calculate_from(&b, p);
         let exp: Board<bool> = board_from_vec![
             7,5;
             [
@@ -430,7 +458,7 @@ mod test {
                 U, U, U, U, U, U, U,
             ]
         ];
-        assert_same_vis(&exp, &v.vis);
+        assert_same_vis(p, &exp, &v.vis);
     }
 
     #[test]
@@ -449,7 +477,8 @@ mod test {
         ];
 
         let mut v = Viewshed::create(&b, |n| *n == 1);
-        v.calculate_from(&b, Coord::new(2, 2));
+        let p = Coord::new(2, 2);
+        v.calculate_from(&b, p);
         let exp: Board<bool> = board_from_vec![
             9,7;
             [
@@ -462,6 +491,6 @@ mod test {
                 U, U, U, U, U, U, U, U, U,
             ]
         ];
-        assert_same_vis(&exp, &v.vis);
+        assert_same_vis(p, &exp, &v.vis);
     }
 }