public IEnumerator SpawnPrefabsInMesh(GOFeature feature, GameObject parent, GOEnvironmentKind kind)
        {
            if (feature.preloadedMeshData == null)
            {
                yield break;
            }

            float area = Area(feature.convertedGeometry);
            float rate = kind.density / 1000.0f;
            int   k    = Mathf.FloorToInt(area * rate / 100);

            //Debug.Log (area + " " + rate + " " + k);

            for (int i = 0; i < k; i++)
            {
                try {
//					int spawn = UnityEngine.Random.Range (0, rate);
//					if (spawn != 0)
//						continue;

                    int     n   = UnityEngine.Random.Range(0, kind.prefabs.Length);
                    Vector3 pos = randomPointInShape(feature.convertedGeometry);

                    if (GOMap.IsPointAboveWater(pos))
                    {
                        continue;
                    }

                    pos.y += kind.prefabs [n].transform.position.y;


                    var rotation       = kind.prefabs [n].transform.eulerAngles;
                    var randomRotation = new Vector3(0, UnityEngine.Random.Range(0, 360), 0);

                    GameObject obj = (GameObject)GameObject.Instantiate(kind.prefabs[n], pos, Quaternion.Euler(rotation + randomRotation));
                    obj.transform.parent = parent.transform;
                } catch {
                }

                if (Application.isPlaying)
                {
                    yield return(null);
                }
            }

            yield return(null);
        }
        public IEnumerator SpawnPrefabsInMesh(GOFeature feature, GameObject parent, GOEnvironmentKind kind)
        {
            if (feature.preloadedMeshData == null)
            {
                yield break;
            }

            int rate = 100 / kind.density;

            foreach (Vector3 vertex in feature.preloadedMeshData.vertices)
            {
                try {
                    int spawn = UnityEngine.Random.Range(0, rate);
                    if (spawn != 0)
                    {
                        continue;
                    }

                    int     n   = UnityEngine.Random.Range(0, kind.prefabs.Length);
                    Vector3 pos = vertex;

                    if (GOMap.IsPointAboveWater(pos))
                    {
                        continue;
                    }

                    pos.y += kind.prefabs [n].transform.position.y;


                    var rotation       = kind.prefabs [n].transform.eulerAngles;
                    var randomRotation = new Vector3(0, UnityEngine.Random.Range(0, 360), 0);

                    GameObject obj = (GameObject)GameObject.Instantiate(kind.prefabs[n], pos, Quaternion.Euler(rotation + randomRotation));
                    obj.transform.parent = parent.transform;
                } catch {
                }

                if (Application.isPlaying)
                {
                    yield return(null);
                }
            }

            yield return(null);
        }
        public IEnumerator SpawnBuildings(GOFeature feature, GameObject parent, GOEnvironmentKind kind)
        {
            if (feature.preloadedMeshData == null)
            {
                yield break;
            }


            int rate = 100 / (kind.density + 1);

//			foreach (Vector3 vertex in feature.preloadedMeshData.vertices) {
//
//				try {
            int spawn = UnityEngine.Random.Range(0, rate);

            if (spawn != 0)
            {
                yield break;
            }

            int n = UnityEngine.Random.Range(0, kind.prefabs.Length);

            Vector3 pos = feature.featureCenter;

            pos.y += kind.prefabs [n].transform.position.y;

            var rotation       = kind.prefabs [n].transform.eulerAngles;
            var randomRotation = new Vector3(0, UnityEngine.Random.Range(0, 360), 0);

            GameObject obj = (GameObject)GameObject.Instantiate(kind.prefabs[n], pos, Quaternion.Euler(rotation + randomRotation));

            obj.transform.parent = parent.transform;

//				} catch {
//				}

            if (Application.isPlaying)
            {
                yield return(null);
            }
//			}

            yield return(null);
        }
        public IEnumerator SpawnPrefabsInTile(GOTile tile, GameObject parent, GOEnvironmentKind kind)
        {
            if (tile == null)
            {
                yield break;
            }

            float rate = Mathf.FloorToInt(tile.goTile.diagonalLenght * (kind.density / 100));


            for (int i = 0; i <= rate; i++)
            {
                float randomX = UnityEngine.Random.Range(tile.goTile.getXRange().x, tile.goTile.getXRange().y);
                float randomZ = UnityEngine.Random.Range(tile.goTile.getZRange().x, tile.goTile.getZRange().y);
                float randomY = UnityEngine.Random.Range(200, 320);

                int     n   = UnityEngine.Random.Range(0, kind.prefabs.Length);
                Vector3 pos = new Vector3(randomX, randomY, randomZ);

                pos.y += kind.prefabs [n].transform.position.y;

                pos.y += GOMap.AltitudeForPoint(pos);

                var rotation       = kind.prefabs [n].transform.eulerAngles;
                var randomRotation = new Vector3(0, UnityEngine.Random.Range(0, 360), 0);

                GameObject obj = (GameObject)GameObject.Instantiate(kind.prefabs[n], pos, Quaternion.Euler(rotation + randomRotation));
                obj.transform.parent   = parent.transform;
                obj.transform.position = pos;
                if (Application.isPlaying)
                {
                    yield return(null);
                }
            }

            yield return(null);
        }