/// <summary>
        /// Redraws the cities. This is automatically called by Redraw(). Used internally by the Map Editor. You should not need to call this method directly.
        /// </summary>
        public void DrawCities()
        {
            if (!_showCities || !gameObject.activeInHierarchy || cities == null)
            {
                return;
            }

            // Create cities layer
            Transform t = transform.Find("Cities");

            if (t != null)
            {
                DestroyImmediate(t.gameObject);
            }
            citiesLayer = new GameObject("Cities");
            citiesLayer.transform.SetParent(transform, false);
            if (_earthInvertedMode)
            {
                citiesLayer.transform.localScale *= 0.99f;
            }

            // Create cityclass parents
            GameObject countryCapitals = new GameObject("Country Capitals");

            countryCapitals.hideFlags = HideFlags.DontSave;
            countryCapitals.transform.SetParent(citiesLayer.transform, false);
            GameObject regionCapitals = new GameObject("Region Capitals");

            regionCapitals.hideFlags = HideFlags.DontSave;
            regionCapitals.transform.SetParent(citiesLayer.transform, false);
            GameObject normalCities = new GameObject("Normal Cities");

            normalCities.hideFlags = HideFlags.DontSave;
            normalCities.transform.SetParent(citiesLayer.transform, false);
            bool    combineMeshesActive = _combineCityMeshes && Application.isPlaying;
            float   scale     = CityScaler.GetScale(this);
            Vector3 cityScale = new Vector3(scale, scale, 1f);

            // Draw city marks
            _numCitiesDrawn = 0;
            int minPopulation = _minPopulation * 1000;
            int visibleCount  = 0;

            // flip localscale.x to prevent transform issues
            if (_earthInvertedMode)
            {
                transform.localScale = new Vector3(-transform.localScale.x, transform.localScale.y, transform.localScale.z);
            }

            int cityCount = cities.Count;

            for (int k = 0; k < cityCount; k++)
            {
                City    city    = cities [k];
                Country country = countries [city.countryIndex];
                city.isShown = !country.hidden && ((((int)city.cityClass & _cityClassAlwaysShow) != 0) || (minPopulation == 0 || city.population >= minPopulation));
                if (city.isShown)
                {
                    GameObject cityObj, cityParent;
                    switch (city.cityClass)
                    {
                    case CITY_CLASS.COUNTRY_CAPITAL:
                        cityObj = Instantiate(citySpotCapitalCountry);
                        if (!combineMeshesActive)
                        {
                            cityObj.GetComponent <Renderer> ().sharedMaterial = citiesCountryCapitalMat;
                        }
                        cityParent = countryCapitals;
                        break;

                    case CITY_CLASS.REGION_CAPITAL:
                        cityObj = Instantiate(citySpotCapitalRegion);
                        if (!combineMeshesActive)
                        {
                            cityObj.GetComponent <Renderer> ().sharedMaterial = citiesRegionCapitalMat;
                        }
                        cityParent = regionCapitals;
                        break;

                    default:
                        cityObj = Instantiate(citySpot);
                        if (!combineMeshesActive)
                        {
                            cityObj.GetComponent <Renderer> ().sharedMaterial = citiesNormalMat;
                        }
                        cityParent = normalCities;
                        break;
                    }
                    cityObj.hideFlags = HideFlags.DontSave | HideFlags.HideInHierarchy;
                    cityObj.transform.SetParent(cityParent.transform, false);
                    cityObj.transform.localPosition = city.unitySphereLocation;
                    cityObj.transform.localScale    = cityScale;
                    if (_earthInvertedMode)
                    {
                        cityObj.transform.LookAt(transform.TransformPoint(city.unitySphereLocation * 2f));
                    }
                    else
                    {
                        cityObj.transform.LookAt(transform.position);
                    }
                    city.gameObject = cityObj;
                    _numCitiesDrawn++;
                    visibleCount++;
                }
                else
                {
                    city.gameObject = null;
                }
            }

            if (_earthInvertedMode)
            {
                transform.localScale = new Vector3(-transform.localScale.x, transform.localScale.y, transform.localScale.z);
            }

            // Cache visible cities (this is faster than iterate through the entire collection)
            if (visibleCities == null || visibleCities.Length != visibleCount)
            {
                visibleCities = new City[visibleCount];
            }

            for (int k = 0; k < cityCount; k++)
            {
                City city = cities [k];
                if (city.isShown)
                {
                    visibleCities [--visibleCount] = city;
                }
            }

            // Toggle cities layer visibility according to settings
            citiesLayer.SetActive(_showCities);

            CityScaler cityScaler = citiesLayer.GetComponent <CityScaler> () ?? citiesLayer.AddComponent <CityScaler> ();

            cityScaler.map = this;
            cityScaler.ScaleCities();

            if (combineMeshesActive)
            {
                DestroyImmediate(cityScaler);
                CombineMeshes(normalCities, citiesNormalMat);
                CombineMeshes(regionCapitals, citiesRegionCapitalMat);
                CombineMeshes(countryCapitals, citiesCountryCapitalMat);
            }
        }