MCPcopy Create free account
hub / github.com/assaultcube/AC / extrudeshadowtiles

Function extrudeshadowtiles

source/src/shadow.cpp:19–135  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

17float shadowx1 = 1, shadowy1 = 1, shadowx2 = -1, shadowy2 = -1;
18
19static 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;

Callers 1

addshadowboxFunction · 0.85

Calls 3

swapFunction · 0.85
minFunction · 0.85
maxFunction · 0.85

Tested by

no test coverage detected