/// <summary>
 /// Changes layers of a given intersector
 /// </summary>
 /// <param name="intersector"></param>
 /// <param name="layers"></param>
 public void ChangeLayers( IRay3Intersector intersector, ulong layers )
 {
     int index = Find( intersector );
     if ( index != -1 )
     {
         ( ( IRayLayerIntersector )m_Intersectors[ index ] ).Layers = layers;
     }
 }
 /// <summary>
 /// Adds an object that can be intersected to the raycaster
 /// </summary>
 /// <param name="intersector">Intersectable object</param>
 public IRayLayerIntersector AddIntersector( IRay3Intersector intersector )
 {
     if ( intersector is IRayLayerIntersector )
     {
         m_Intersectors.Add( intersector );
         return ( IRayLayerIntersector )intersector;
     }
     return AddIntersector( ulong.MaxValue, intersector );
 }
 /// <summary>
 /// Initialises this ray intersector
 /// </summary>
 /// <param name="intersector">Base intersector</param>
 /// <param name="layers">Initial layers</param>
 public Ray3LayerIntersector( IRay3Intersector intersector, ulong layers )
 {
     if ( intersector == null )
     {
         throw new ArgumentNullException( "intersector", "Base intersector cannot be null" );
     }
     m_Intersector = intersector;
     m_Layers = layers;
 }
 /// <summary>
 /// Adds an intersectable geometry object to the ray caster
 /// </summary>
 public IRayLayerIntersector AddIntersector( ulong layers, IRay3Intersector intersector )
 {
     if ( intersector is IRayLayerIntersector )
     {
         throw new ArgumentException( "Intersector already supports layers", "intersector" );
     }
     Ray3LayerIntersector layerIntersector = new Ray3LayerIntersector( intersector, layers );
     m_Intersectors.Add( layerIntersector );
     return layerIntersector;
 }
        /// <summary>
        /// Finds the index of a given intersector object
        /// </summary>
        /// <param name="intersector">Intersector to find</param>
        /// <returns>Returns the index of the intersector, or -1 if it can't be found</returns>
        private int Find( IRay3Intersector intersector )
        {
            for ( int index = 0; index < m_Intersectors.Count; ++index )
            {
                if ( m_Intersectors[ index ] == intersector )
                {
                    return index;
                }

                Ray3LayerIntersector layerIntersector = m_Intersectors[ index ] as Ray3LayerIntersector;
                if ( layerIntersector != null && layerIntersector.BaseIntersector == intersector )
                {
                    return index;
                }
            }
            return -1;
        }
 /// <summary>
 /// Removes an intersector
 /// </summary>
 /// <param name="intersector">Intersector to remove</param>
 public void RemoveIntersector( IRay3Intersector intersector )
 {
     int index = Find( intersector );
     if ( index != -1 )
     {
         m_Intersectors.RemoveAt( index );
     }
 }