private void setTargeted(IWorldSelectableProvider provider, Selectable selectable)
 {
     if (lastTargetedProvider != null)
     {
         lastTargetedProvider.SetTargeted(null);
     }
     if (provider != null)
     {
         provider.SetTargeted(selectable);
     }
     lastTargetedProvider = provider;
     lastSelectable       = selectable;
 }
        public void UpdateTarget(Ray ray)
        {
            var closest   = new RaycastResult();
            var newResult = new RaycastResult();

            IWorldSelectableProvider closestProvider = null;
            Selectable closestSelectable             = null;

            foreach (var p in providers)
            {
                foreach (var s in p.GetSelectables())
                {
                    newResult = s.Intersects(ray);
                    if (newResult.IsCloser(closest))
                    {
                        newResult.CopyTo(closest);
                        closestProvider   = p;
                        closestSelectable = s;
                    }
                }
            }
            setTargeted(closestProvider, closestSelectable);
        }