public void Update(IEnumerable <GameObject> gameObjs) { var curVision = new Tuple <GameObject, float> [EyeCount]; foreach (var curObj in gameObjs) { var dist = Vector2.Distance(Owner.CenterPosition, curObj.CenterPosition) - Owner.Radius - curObj.Radius; if (dist < VisionDistance) { var curObjRelAngle = GeomHelper.Angle(Owner.CenterPosition, curObj.CenterPosition); var closestEyeAngleIndex = -1; var closestEyeAngleDif = float.MaxValue; for (int ei = 0; ei < EyeCount; ei++) { var relEyeAngle = EyeAngles[ei] + Owner.Rotation; var anglDif = Math.Abs(GeomHelper.RadRange_TwoPi(curObjRelAngle) - GeomHelper.RadRange_TwoPi(relEyeAngle)); if (anglDif < closestEyeAngleDif && anglDif < EyeSeparationAngle / 2) { closestEyeAngleIndex = ei; closestEyeAngleDif = anglDif; } } if (closestEyeAngleIndex != -1) { curVision[closestEyeAngleIndex] = Tuple.Create(curObj, dist); } } } for (int ei = 0; ei < EyeCount; ei++) { var curVis = curVision[ei]; if (curVis != null) { var col = GetColor(curVis.Item1); var closeness = 1 - (curVis.Item2 / VisionDistance); Visible[ei] = new Vector3(col.X, col.Y, closeness); } else { Visible[ei] = Vector3.Zero; } } }