Exemplo n.º 1
0
        /// <summary>
        /// Creates a sophisticated Gizmos drawer for the current state of the surface.
        /// </summary>
        /// <param name="settings">The navigation settings of the system.</param>
        /// <returns>A sophisticated Gizmos drawer for the current state of the surface.</returns>
        public ISurfaceDrawer CreateAdvancedDrawer(NavigationSettings settings)
        {
            var centers = new List <Vector3> [NavigationSettings.AreasCount];
            var edges   = new HashSet <Edge> [NavigationSettings.AreasCount];

            for (int i = 0; i < NavigationSettings.AreasCount; i++)
            {
                centers[i] = new List <Vector3>();
                edges[i]   = new HashSet <Edge>();
            }

            foreach (var face in faces.Values)
            {
                int areaIndex = AreaMaskToIndex(face.AreaMask);
                edges[areaIndex].Add(face.ab);
                edges[areaIndex].Add(face.bc);
                edges[areaIndex].Add(face.ca);
                centers[areaIndex].Add(face.CalculateCenter());
            }

            var subDrawers = new List <GizmosSurfaceDrawer>();

            for (int i = 0; i < NavigationSettings.AreasCount; i++)
            {
                if (centers[i].Count > 0)
                {
                    var color     = settings.GetAreaSettings(i).Color;
                    var subDrawer = new GizmosSurfaceDrawer(color,
                                                            edges[i].ToArray(), centers[i].ToArray());
                    subDrawers.Add(subDrawer);
                }
            }

            return(new CompositeSurfaceDrawer(subDrawers.ToArray()));
        }