Ticket #3541: t3451_optimize_TestRayAASquare_v4.patch

File t3451_optimize_TestRayAASquare_v4.patch, 2.5 KB (added by elexis, 9 years ago)
  • source/simulation2/helpers/Geometry.cpp

    bool Geometry::TestRaySquare(CFixedVecto  
    234234        return true; // ray cuts through the square
    235235
    236236    return false;
    237237}
    238238
     239/**
     240 * This function does the same as Geometry::TestRaySquare except it ignores rotation. This saves some computation time
     241 * for units which have a round obstruction.
     242 * @return true if the path should blocked by the obstruction.
     243 */
    239244bool Geometry::TestRayAASquare(CFixedVector2D a, CFixedVector2D b, CFixedVector2D halfSize)
    240245{
    241     // Exactly like TestRaySquare with u=(1,0), v=(0,1)
    242 
    243     // Assume the compiler is clever enough to inline and simplify all this
    244     // (TODO: stop assuming that)
    245     CFixedVector2D u (fixed::FromInt(1), fixed::Zero());
    246     CFixedVector2D v (fixed::Zero(), fixed::FromInt(1));
    247 
    248246    fixed hw = halfSize.X;
    249247    fixed hh = halfSize.Y;
    250248
    251     fixed au = a.Dot(u);
    252     fixed av = a.Dot(v);
    253 
    254     if (-hw <= au && au <= hw && -hh <= av && av <= hh)
     249    if (-hw <= a.X && a.X <= hw && -hh <= a.Y && a.Y <= hh)
    255250        return false; // a is inside
    256251
    257     fixed bu = b.Dot(u);
    258     fixed bv = b.Dot(v);
    259 
    260     if (-hw <= bu && bu <= hw && -hh <= bv && bv <= hh) // TODO: isn't this subsumed by the next checks?
     252    if (-hw <= b.X && b.X <= hw && -hh <= b.Y && b.Y <= hh) // TODO: isn't this subsumed by the next checks?
    261253        return true; // a is outside, b is inside
    262254
    263     if ((au < -hw && bu < -hw) || (au > hw && bu > hw) || (av < -hh && bv < -hh) || (av > hh && bv > hh))
     255    if ((a.X < -hw && b.X < -hw) || (a.X > hw && b.X > hw) || (a.Y < -hh && b.Y < -hh) || (a.Y > hh && b.Y > hh))
    264256        return false; // ab is entirely above/below/side the square
    265257
    266258    CFixedVector2D abp = (b - a).Perpendicular();
    267     fixed s0 = abp.Dot((u.Multiply(hw) + v.Multiply(hh)) - a);
    268     fixed s1 = abp.Dot((u.Multiply(hw) - v.Multiply(hh)) - a);
    269     fixed s2 = abp.Dot((-u.Multiply(hw) - v.Multiply(hh)) - a);
    270     fixed s3 = abp.Dot((-u.Multiply(hw) + v.Multiply(hh)) - a);
     259    fixed s0 = abp.Dot(CFixedVector2D(hw, hh) - a);
     260    fixed s1 = abp.Dot(CFixedVector2D(hw, -hh) - a);
     261    fixed s2 = abp.Dot(CFixedVector2D(-hw, -hh) - a);
     262    fixed s3 = abp.Dot(CFixedVector2D(-hw, hh) - a);
    271263    if (s0.IsZero() || s1.IsZero() || s2.IsZero() || s3.IsZero())
    272264        return true; // ray intersects the corner
    273265
    274266    bool sign = (s0 < fixed::Zero());
    275267    if ((s1 < fixed::Zero()) != sign || (s2 < fixed::Zero()) != sign || (s3 < fixed::Zero()) != sign)