public void DriverView(Thinker thinker)
        {
            ArrayList objects = new ArrayList();

            Opponent self = (Opponent)thinker.Self;
            Camera   eyes = self.Eyes;

            // get a local copy of the objects that the camera can see
            objects.Clear();
            foreach (Object3D obj in eyes.VisibleObjects)
            {
                objects.Add(obj);
            }

            float    range_to_nearest   = 10000.0f;
            float    bearing_to_nearest = 0.0f;
            Object3D nearest_object     = null;

            // nearest red post
            foreach (Object3D obj in objects)
            {
                if (obj.Name.Substring(0, 3) == "red")
                {
                    float range = eyes.GetDistance(obj);
                    if (range < range_to_nearest)
                    {
                        range_to_nearest = range;
                        nearest_object   = obj;
                    }
                }
            }
            if (nearest_object != null)
            {
                bearing_to_nearest = GetBearing(self, nearest_object);
                thinker.SetFact("red_post_in_sight", 1.0f);
                thinker.SetFact("red_post_range", range_to_nearest);
                thinker.SetFact("red_post_bearing", bearing_to_nearest);
            }
            else
            {
                thinker.SetFact("red_post_in_sight", 0.0f);
            }

            // nearest blue post
            range_to_nearest = 10000.0f;
            foreach (Object3D obj in objects)
            {
                if (obj.Name.Substring(0, 4) == "blue")
                {
                    float range = eyes.GetDistance(obj);
                    if (range < range_to_nearest)
                    {
                        range_to_nearest = range;
                        nearest_object   = obj;
                    }
                }
            }
            if (nearest_object != null)
            {
                bearing_to_nearest = GetBearing(self, nearest_object);
                thinker.SetFact("blue_post_in_sight", 1.0f);
                thinker.SetFact("blue_post_range", range_to_nearest);
                thinker.SetFact("blue_post_bearing", bearing_to_nearest);
            }
            else
            {
                thinker.SetFact("blue_post_in_sight", 0.0f);
            }

            // nearest obstacle (vehicles and trees)
            range_to_nearest = 10000.0f;
            foreach (Object3D obj in objects)
            {
                if (obj.Name.Substring(0, 4) == "tree" ||
                    obj.Name.Substring(0, 3) == "car")
                {
                    float bearing = GetBearing(self, nearest_object);
                    float range   = eyes.GetDistance(obj);

                    // only accept nearest object within +/- 5 degrees
                    if (Math.Abs(bearing) < 0.087266462599716478846184538424431 && range < range_to_nearest)
                    {
                        range_to_nearest   = range;
                        nearest_object     = obj;
                        bearing_to_nearest = bearing;
                    }
                }
            }
            if (nearest_object != null)
            {
                thinker.SetFact("obstacle_in_sight", 1.0f);
                thinker.SetFact("obstacle_range", range_to_nearest);
                thinker.SetFact("obstacle_bearing", bearing_to_nearest);
            }
            else
            {
                thinker.SetFact("obstacle_in_sight", 0.0f);
            }
        }