Exemplo n.º 1
0
 private void Spawn(
     SpawnPopulation population,
     SpawnDistribution distribution,
     int targetCount,
     int numToFill,
     int numToTry)
 {
     if (targetCount == 0)
     {
         return;
     }
     if (!population.Initialize())
     {
         Debug.LogError((object)("[Spawn] No prefabs to spawn in " + population.ResourceFolder), (Object)population);
     }
     else
     {
         if (Global.developer > 1)
         {
             Debug.Log((object)("[Spawn] Population " + population.ResourceFolder + " needs to spawn " + (object)numToFill));
         }
         float num1 = Mathf.Max((float)population.ClusterSizeMax, distribution.GetGridCellArea() * population.GetMaximumSpawnDensity());
         population.UpdateWeights(distribution, targetCount);
         while (numToFill >= population.ClusterSizeMin && numToTry > 0)
         {
             ByteQuadtree.Element node = distribution.SampleNode();
             int num2 = Random.Range(population.ClusterSizeMin, population.ClusterSizeMax + 1);
             int num3 = Mathx.Min(numToTry, numToFill, num2);
             for (int index = 0; index < num3; ++index)
             {
                 Vector3    spawnPos;
                 Quaternion spawnRot;
                 if (distribution.Sample(out spawnPos, out spawnRot, node, population.AlignToNormal, (float)population.ClusterDithering) && (double)population.Filter.GetFactor(spawnPos) > 0.0 && (double)distribution.GetCount(spawnPos) < (double)num1)
                 {
                     this.Spawn(population, spawnPos, spawnRot);
                     --numToFill;
                 }
                 --numToTry;
             }
         }
     }
 }
    private void Spawn(SpawnPopulation population, SpawnDistribution distribution, int targetCount, int numToFill, int numToTry)
    {
        Vector3    vector3;
        Quaternion quaternion;

        if (targetCount == 0)
        {
            return;
        }
        if (!population.Initialize())
        {
            UnityEngine.Debug.LogError(string.Concat("[Spawn] No prefabs to spawn in ", population.ResourceFolder), population);
            return;
        }
        if (Global.developer > 1)
        {
            UnityEngine.Debug.Log(string.Concat(new object[] { "[Spawn] Population ", population.ResourceFolder, " needs to spawn ", numToFill }));
        }
        float single = Mathf.Max((float)population.ClusterSizeMax, distribution.GetGridCellArea() * population.GetMaximumSpawnDensity());

        population.UpdateWeights(distribution, targetCount);
        while (numToFill >= population.ClusterSizeMin && numToTry > 0)
        {
            ByteQuadtree.Element element = distribution.SampleNode();
            int num = UnityEngine.Random.Range(population.ClusterSizeMin, population.ClusterSizeMax + 1);
            num = Mathx.Min(numToTry, numToFill, num);
            for (int i = 0; i < num; i++)
            {
                if (distribution.Sample(out vector3, out quaternion, element, population.AlignToNormal, (float)population.ClusterDithering) && population.Filter.GetFactor(vector3) > 0f && (float)distribution.GetCount(vector3) < single)
                {
                    this.Spawn(population, vector3, quaternion);
                    numToFill--;
                }
                numToTry--;
            }
        }
    }