UTBYB5NBZ67NHS4K3FGUKMKZKTKXVEXRW46BXH5CUBFVAEFUKK6AC
ZFJTELN4KZJH36IW3RP5INLIAXBJCL3GQKRRKEVJM4L6DXYPY6DAC
XKHJTY5AQ4HTOI33GIBK6LYJE22PACJR3XQ6TCZXJLOG3YBVSNPQC
DTLSPUE47XI4YC3QWKTBWJOWBU52GXPGXFEEBG374I4JAYVM7KZAC
2EBEWIV4YHXXAFR4GG2GMZJ2K77NK762HNQ77CZLHI3LDVGX7RJAC
TZNURHCLTLE3A55EPNU66BU6NX7LOBA7EFG4NAJJBUKZLOAEFU4AC
ACZYEIX7WMPIIODKCATBCUE626AJ4ZGGBOMVC6BGXM27EQU2RECAC
6KANK4BOEJYMBUWOZURH57BZJ52YJRGBXN4TMKO27B3JFIP6MHSQC
3ORZZ66JXYWJUO4W5YP2JRKKZ6ZNMHU7QWAF2QMKH4LFWNNMPM7QC
MRKWHW7QPSB7BBOLKP5OZTYKAARQGLSQCOEFKGS64JK5BAODT5OQC
PEWNWU7TD3LETUMWCCI365KH7PVV2XCUOIFTPBH2LK2ZPGS4URZAC
KMF52RF3NIY2ABMHEZABT3GOG3KCHEJD55NBJ3IPAOHBKF2WPKQAC
QNDI5MFPHZZXZOJFF2IELF2LIHWVY2HGFRCJWYEFN4WL4ICYZUYQC
// Coordinate transformation so we can find_ray quadrant-by-quadrant.
// TODO: Unify with los_params.
struct trans
{
coord_def source;
int signx, signy;
coord_def transform(coord_def l)
{
return coord_def(source.x + signx*l.x, source.y + signy*l.y);
}
};
}
else
{
bool blocked = true;
for (unsigned int i = start; blocked && (i < start + min.size()); i++)
{
index = i % min.size();
c = min[index];
blocked = false;
// Check all inner points.
for (unsigned int j = 0; j < c.end && !blocked; j++)
{
coord_def cur = t.transform(c[j]);
blocked = grid_is_solid(grd(cur));
}
}
if (blocked)
return (false);
blocked = OPC_CLEAR;
// Check all inner points.
for (unsigned int j = 0; j < c.end && blocked < OPC_OPAQUE; j++)
blocked += opc(c[j]);
// Coordinate transformation so we can find_ray quadrant-by-quadrant.
struct opacity_trans : opacity_func
{
const coord_def& source;
int signx, signy;
const opacity_func& orig;
opacity_trans(const opacity_func& opc, const coord_def& s, int sx, int sy)
: source(s), signx(sx), signy(sy), orig(opc)
{
}
trans t;
t.source = source;
t.signx = signx;
t.signy = signy;
ray.accx -= source.x;
ray.accy -= source.y;
if (signx < 0)
ray.accx = 1.0 - ray.accx;
if (signy < 0)
ray.accy = 1.0 - ray.accy;
opacity_trans opc_trans = opacity_trans(opc, source, signx, signy);
ray.quadx = 1;
ray.quady = 1;
if (!_find_ray_se(abs, ray, cycle, ignore_solid, t))
return false;
if (!_find_ray_se(abs, ray, cycle, opc_trans, bds))
return (false);