///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



    IEnumerator Optimization()
    {
        //--------------

        int counter0 = 0;

        while (counter0 < 10)
        {
            yield return(delay0);

            counter0++;
            if (Physics.CheckSphere(thisTransform.position + (thisTransform.up * 3), 1.5f, 1 << 19 | 1 << 20 | 1 << 21) == true)
            {
                TreesPool.TakeTree(gameObject);
            }
        }

        //--------------

        while (true)
        {
            yield return(delay0);

            if (Physics.CheckSphere(thisTransform.position, 1, 1 << 19 | 1 << 20 | 1 << 21) == false)
            {
                amountDamage = 10;
                Particles();
            }
        }

        //--------------
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


    void Particles()
    {
        //--------------

        amountDamage += currentDamage;

        if (amountDamage >= 1.8f)
        {
            if (visible == true)
            {
                Class_Forest.ParticlesDestroyed(thisTransform);
            }
            Class_Mineral.RandomMinerals(thisTransform);
            TreesPool.TakeTree(gameObject);
        }

        //--------------
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



    public static IEnumerator Generation(Transform thisTransform, Material treesMaterial)
    {
        //--------------

        yield return(delay0);

        float seedGen = Mathf.Abs(Class_AdditionalTools.PositionSeed(thisTransform, 0.9f));

        Material localTreeMaterial = new Material(treesMaterial);

        localTreeMaterial.SetTextureOffset("_MainTex", new Vector2(seedGen, 0));

        Vector3 treeScale       = Vector3.one / thisTransform.lossyScale.x;
        float   scaleProportion = 1 / thisTransform.lossyScale.x;

        int numberTreeOutOfPool = Mathf.FloorToInt(seedGen * 30) + 50;
        int treePackType        = Mathf.FloorToInt(seedGen * 8) + 1;

        int        treeOutOfPoolSeedPosition = 1;
        float      cycleOffset = 1;
        GameObject treeObject  = null;

        //--------------

        for (int i = 0; i < numberTreeOutOfPool; i++)
        {
            yield return(null);

            cycleOffset += i * 1.37f;

            float localVar0 = Mathf.Cos((numberTreeOutOfPool + cycleOffset) * (seedGen * 4.7f));
            int   treeType  = Mathf.RoundToInt(Mathf.PerlinNoise(localVar0, localVar0) * 5.7f);

            if (treePackType == 1)
            {
                if (treeType <= 2)
                {
                    treeObject = TreesPool.GiveTree(6);
                }
                else
                {
                    treeObject = TreesPool.GiveTree(5);
                }
            }
            else if (treePackType == 2)
            {
                if (treeType == 1)
                {
                    treeObject = TreesPool.GiveTree(0);
                }
                else if (treeType == 2)
                {
                    treeObject = TreesPool.GiveTree(6);
                }
                else if (treeType == 3)
                {
                    treeObject = TreesPool.GiveTree(4);
                }
            }
            else if (treePackType == 3)
            {
                if (treeType == 1)
                {
                    treeObject = TreesPool.GiveTree(1);
                }
                else if (treeType == 2)
                {
                    treeObject = TreesPool.GiveTree(5);
                }
                else if (treeType == 3)
                {
                    treeObject = TreesPool.GiveTree(7);
                }
            }
            else if (treePackType == 4)
            {
                if (treeType == 1)
                {
                    treeObject = TreesPool.GiveTree(0);
                }
                else if (treeType == 2)
                {
                    treeObject = TreesPool.GiveTree(5);
                }
                else if (treeType == 3)
                {
                    treeObject = TreesPool.GiveTree(7);
                }
            }
            else if (treePackType == 5)
            {
                if (treeType <= 2)
                {
                    treeObject = TreesPool.GiveTree(3);
                }
                else
                {
                    treeObject = TreesPool.GiveTree(2);
                }
            }
            else if (treePackType == 6)
            {
                if (treeType == 1)
                {
                    treeObject = TreesPool.GiveTree(0);
                }
                else if (treeType == 2)
                {
                    treeObject = TreesPool.GiveTree(6);
                }
                else if (treeType == 3)
                {
                    treeObject = TreesPool.GiveTree(5);
                }
            }
            else if (treePackType == 7)
            {
                if (treeType == 1)
                {
                    treeObject = TreesPool.GiveTree(7);
                }
                else if (treeType == 2)
                {
                    treeObject = TreesPool.GiveTree(6);
                }
                else if (treeType == 3)
                {
                    treeObject = TreesPool.GiveTree(4);
                }
            }
            else if (treePackType == 8)
            {
                if (treeType == 1)
                {
                    treeObject = TreesPool.GiveTree(1);
                }
                else if (treeType == 2)
                {
                    treeObject = TreesPool.GiveTree(3);
                }
                else if (treeType == 3)
                {
                    treeObject = TreesPool.GiveTree(2);
                }
            }

            if (treeObject != null)
            {
                Transform treeTransform = treeObject.transform;
                treeTransform.parent = thisTransform;
                float treeOutOfPoolScale = 0.5f + (Mathf.Abs(Mathf.Cos(seedGen * cycleOffset)) * 1.25f);
                treeTransform.localScale  = treeScale * treeOutOfPoolScale;
                treeOutOfPoolSeedPosition = Mathf.FloorToInt(Mathf.Abs(Mathf.Cos(((13.61f * treeOutOfPoolScale) + seedGen) * cycleOffset + treeOutOfPoolSeedPosition)) * 6) + 1;

                float localVar1 = Mathf.Cos((treeOutOfPoolSeedPosition + cycleOffset + Class_StarSystem.seed) * (treeOutOfPoolScale + seedGen)) * 0.425f;
                float localVar2 = localVar1 - (localVar1 * scaleProportion);
                float localVar3 = Mathf.Cos((treeOutOfPoolSeedPosition + cycleOffset + Class_StarSystem.seed) * (treeOutOfPoolScale + seedGen + 0.561f)) * 0.425f;
                float localVar4 = localVar3 - (localVar3 * scaleProportion);

                float treeOutOfPoolRotation = Mathf.Cos(cycleOffset * seedGen) * 125;

                if (treeOutOfPoolSeedPosition == 1)
                {
                    treeTransform.localPosition = new Vector3(localVar2, 0.5f, localVar4);
                    treeTransform.eulerAngles   = new Vector3(0, treeOutOfPoolRotation, 0);
                }

                if (treeOutOfPoolSeedPosition == 2)
                {
                    treeTransform.localPosition = new Vector3(localVar2, -0.5f, localVar4);
                    treeTransform.eulerAngles   = new Vector3(0, treeOutOfPoolRotation, 180);
                }

                if (treeOutOfPoolSeedPosition == 3)
                {
                    treeTransform.localPosition = new Vector3(0.5f, localVar2, localVar4);
                    treeTransform.eulerAngles   = new Vector3(treeOutOfPoolRotation, 0, -90);
                }

                if (treeOutOfPoolSeedPosition == 4)
                {
                    treeTransform.localPosition = new Vector3(-0.5f, localVar2, localVar4);
                    treeTransform.eulerAngles   = new Vector3(treeOutOfPoolRotation, 0, 90);
                }

                if (treeOutOfPoolSeedPosition == 5)
                {
                    treeTransform.localPosition = new Vector3(localVar4, localVar2, 0.5f);
                    treeTransform.eulerAngles   = new Vector3(90, treeOutOfPoolRotation, treeOutOfPoolRotation);
                }

                if (treeOutOfPoolSeedPosition == 6)
                {
                    treeTransform.localPosition = new Vector3(localVar4, localVar2, -0.5f);
                    treeTransform.eulerAngles   = new Vector3(-90, treeOutOfPoolRotation, -treeOutOfPoolRotation);
                }

                foreach (Transform child in treeTransform)
                {
                    child.GetComponent <Renderer>().material = localTreeMaterial;
                }

                treeObject.SetActive(true);
            }
        }

        //--------------
    }