diff --git a/src/simulation/Simulation.cpp b/src/simulation/Simulation.cpp index 0c22c4d55..76796e39b 100644 --- a/src/simulation/Simulation.cpp +++ b/src/simulation/Simulation.cpp @@ -2987,25 +2987,35 @@ int Simulation::is_boundary(int pt, int x, int y) return 1; } -int Simulation::find_next_boundary(int pt, int *x, int *y, int dm, int *em) +int Simulation::find_next_boundary(int pt, int *x, int *y, int dm, int *em, bool reverse) { static int dx[8] = {1,1,0,-1,-1,-1,0,1}; static int dy[8] = {0,1,1,1,0,-1,-1,-1}; static int de[8] = {0x83,0x07,0x0E,0x1C,0x38,0x70,0xE0,0xC1}; - int i, ii, i0; if (*x <= 0 || *x >= XRES-1 || *y <= 0 || *y >= YRES-1) + { return 0; + } - if (*em != -1) { - i0 = *em; - dm &= de[i0]; - } else - i0 = 0; + if (*em != -1) + { + dm &= de[*em]; + } - for (ii=0; ii<8; ii++) { - i = (ii + i0) & 7; - if ((dm & (1 << i)) && is_boundary(pt, *x+dx[i], *y+dy[i])) { + unsigned int mask = 0; + for (int i = 0; i < 8; ++i) + { + if ((dm & (1U << i)) && is_blocking(pt, *x + dx[i], *y + dy[i])) + { + mask |= (1U << i); + } + } + for (int i = 0; i < 8; ++i) + { + int n = (i + (reverse ? 1 : -1)) & 7; + if (((mask & (1U << i))) && !(mask & (1U << n))) + { *x += dx[i]; *y += dy[i]; *em = i; @@ -3039,9 +3049,9 @@ int Simulation::get_normal(int pt, int x, int y, float dx, float dy, float *nx, j = 0; for (i=0; i