# HG changeset patch # User unC0Rr # Date 1669901028 -3600 # Node ID 7f3d7f015aa571e097123683bf4721d2f98f5b7a # Parent d2dafe1b25f584d9dfe89fab3679591184650152 Improve performance of CheckGearNear diff -r d2dafe1b25f5 -r 7f3d7f015aa5 hedgewars/uGearsUtils.pas --- a/hedgewars/uGearsUtils.pas Wed Nov 30 16:07:32 2022 +0100 +++ b/hedgewars/uGearsUtils.pas Thu Dec 01 14:23:48 2022 +0100 @@ -1080,11 +1080,11 @@ function CheckGearNearImpl(Kind: TGearType; X, Y: hwFloat; rX, rY: LongInt; exclude: PGear): PGear; var t: PGear; - width, bound, dX, dY: hwFloat; + width, dX, dY: hwFloat; isHit: Boolean; - i, j: LongWord; + i, j, bound: LongWord; begin - bound:= _1_5 * int2hwFloat(max(rX, rY)); + bound:= max(rX, rY) * 3 div 2; rX:= sqr(rX); rY:= sqr(rY); width:= int2hwFloat(RightX - LeftX); @@ -1100,15 +1100,15 @@ // code duplication - could throw into an inline function I guess dX := X - Gear^.X; dY := Y - Gear^.Y; - isHit := (hwAbs(dX) + hwAbs(dY) < bound) + isHit := (dX.Round + dY.Round < bound) and (not ((hwSqr(dX) / rX + hwSqr(dY) / rY) > _1)); if (not isHit) and (WorldEdge = weWrap) then begin - if (hwAbs(dX - width) + hwAbs(dY) < bound) + if ((dX - width).Round + dY.Round < bound) and (not ((hwSqr(dX - width) / rX + hwSqr(dY) / rY) > _1)) then isHit := true - else if (hwAbs(dX + width) + hwAbs(dY) < bound) + else if ((dX + width).Round + dY.Round < bound) and (not ((hwSqr(dX + width) / rX + hwSqr(dY) / rY) > _1)) then isHit := true end; @@ -1130,15 +1130,15 @@ begin dX := X - t^.X; dY := Y - t^.Y; - isHit := (hwAbs(dX) + hwAbs(dY) < bound) + isHit := (dX.Round + dY.Round < bound) and (not ((hwSqr(dX) / rX + hwSqr(dY) / rY) > _1)); if (not isHit) and (WorldEdge = weWrap) then begin - if (hwAbs(dX - width) + hwAbs(dY) < bound) + if ((dX - width).Round + dY.Round < bound) and (not ((hwSqr(dX - width) / rX + hwSqr(dY) / rY) > _1)) then isHit := true - else if (hwAbs(dX + width) + hwAbs(dY) < bound) + else if ((dX + width).Round + dY.Round < bound) and (not ((hwSqr(dX + width) / rX + hwSqr(dY) / rY) > _1)) then isHit := true end;