| 17 | float shadowx1 = 1, shadowy1 = 1, shadowx2 = -1, shadowy2 = -1; |
| 18 | |
| 19 | static void extrudeshadowtiles(int x1, int y1, int x2, int y2, int x3, int y3) |
| 20 | { |
| 21 | if(y1 > y2) { swap(x1, x2); swap(y1, y2); } |
| 22 | if(y2 > y3) { swap(x2, x3); swap(y2, y3); } |
| 23 | if(y1 > y2) { swap(x1, x2); swap(y1, y2); } |
| 24 | |
| 25 | if(y3 < 0 || y1 >= SHADOWROWS) return; |
| 26 | |
| 27 | int lx = x1, rx = x1, |
| 28 | fracl = 0, fracr = 0, |
| 29 | dlx, dly, drx, dry; |
| 30 | if(x2 <= x3) { dlx = x2; dly = y2; drx = x3; dry = y3; } |
| 31 | else { dlx = x3; dly = y3; drx = x2; dry = y2; } |
| 32 | dlx -= x1; dly -= y1; |
| 33 | drx -= x1; dry -= y1; |
| 34 | int ldir = 1, rdir = 1; |
| 35 | if(dlx < 0) |
| 36 | { |
| 37 | ldir = -1; |
| 38 | dlx = -dlx; |
| 39 | } |
| 40 | if(drx < 0) |
| 41 | { |
| 42 | rdir = -1; |
| 43 | drx = -drx; |
| 44 | } |
| 45 | |
| 46 | int cy = y1; |
| 47 | y2 = min(y2, SHADOWROWS); |
| 48 | if(cy < 0 && y2 > cy) |
| 49 | { |
| 50 | int dy = min(y2, 0) - cy; |
| 51 | cy += dy; |
| 52 | fracl += dy*dlx; |
| 53 | lx += ldir*(fracl/dly); |
| 54 | fracl %= dly; |
| 55 | fracr += dy*drx; |
| 56 | rx += rdir*(fracr/dry); |
| 57 | fracr %= dry; |
| 58 | } |
| 59 | |
| 60 | for(; cy < y2; cy++) |
| 61 | { |
| 62 | int cx1 = lx, cx2 = rx; |
| 63 | fracl += dlx; |
| 64 | while(fracl >= dly) { lx += ldir; if(ldir < 0) cx1 = lx; fracl -= dly; } |
| 65 | fracr += drx; |
| 66 | while(fracr >= dry) { rx += rdir; if(rdir > 0) cx2 = rx; fracr -= dry; } |
| 67 | if(cx1 < SHADOWCOLUMNS && cx2 >= 0) shadowtiles[cy] |= (SHADOWCOLUMNMASK>>(SHADOWCOLUMNS - (min(cx2, SHADOWCOLUMNS-1)+1))) & (SHADOWCOLUMNMASK<<max(cx1, 0)); |
| 68 | } |
| 69 | |
| 70 | if(cy >= SHADOWROWS) return; |
| 71 | |
| 72 | if(x2 < x3 || y1 == cy) |
| 73 | { |
| 74 | if(x2 < lx) lx = x2; |
| 75 | dlx = x3 - lx; dly = y3 - cy; |
| 76 | ldir = 1; |
no test coverage detected