private void ShellSort(ParticleSort[] inputArray, int length)
 {
     for (int num = length / 2; num > 0; num = ((num / 2 == 0) ? ((num != 1) ? 1 : 0) : (num / 2)))
     {
         for (int i = 0; i < length; i++)
         {
             int          num2         = i;
             ParticleSort particleSort = inputArray[i];
             while (num2 >= num && inputArray[num2 - num].distance > particleSort.distance)
             {
                 inputArray[num2] = inputArray[num2 - num];
                 num2            -= num;
             }
             inputArray[num2] = particleSort;
         }
     }
 }
    private void BuildMesh(int start, int end, ThreadParams tp)
    {
        Vector3[]       verts = tp.verts;
        Color32[]       cols  = tp.cols;
        List <CloudBox> list  = new List <CloudBox>();

        lock (CloudBox.cloudLock)
        {
            for (int i = 0; i < CloudBox.all.Count; i++)
            {
                list.Add(CloudBox.all[i]);
            }
        }
        int num = Mathf.Clamp(tp.vpCount - maxMeshParticles, 0, tp.vpCount);

        for (int j = start; j < end; j++)
        {
            if (j >= tp.vpCount)
            {
                verts[j * 4] = (verts[j * 4 + 1] = (verts[j * 4 + 2] = (verts[j * 4 + 3] = Vector3.zero)));
                continue;
            }
            ParticleSort particleSort = tp.psort[j + num];
            int          index        = particleSort.index;
            CloudSystem.CloudParticleData cloudParticleData = CloudSystem.instance.particlesData[index];
            float   size     = cloudParticleData.size;
            float   angle    = cloudParticleData.angle;
            Color   color    = cloudParticleData.color;
            Vector3 worldPos = particleSort.worldPos;
            float   distance = 0f - particleSort.distance;
            FastSinCos(angle, out float sin, out float cos);
            float   num2    = (sin + cos) * size;
            float   num3    = (cos - sin) * size;
            Vector3 vector  = new Vector3(tp.camX.x * num3 + tp.camY.x * num2, tp.camX.y * num3 + tp.camY.y * num2, tp.camX.z * num3 + tp.camY.z * num2);
            Vector3 vector2 = new Vector3(tp.camX.x * num2 - tp.camY.x * num3, tp.camX.y * num2 - tp.camY.y * num3, tp.camX.z * num2 - tp.camY.z * num3);
            float   a       = color.a;
            a = CloudSystem.instance.DistanceClipAlpha(a, distance);
            int num4 = 0;
            while (a > 0.01f && num4 < list.Count)
            {
                a *= list[num4].GetAlpha(worldPos);
                num4++;
            }
            color.a = a;
            if (a > 0.01f)
            {
                verts[j * 4]     = new Vector3(worldPos.x - vector.x, worldPos.y - vector.y, worldPos.z - vector.z);
                verts[j * 4 + 1] = new Vector3(worldPos.x - vector2.x, worldPos.y - vector2.y, worldPos.z - vector2.z);
                verts[j * 4 + 2] = new Vector3(worldPos.x + vector.x, worldPos.y + vector.y, worldPos.z + vector.z);
                verts[j * 4 + 3] = new Vector3(worldPos.x + vector2.x, worldPos.y + vector2.y, worldPos.z + vector2.z);
            }
            else
            {
                verts[j * 4]     = worldPos;
                verts[j * 4 + 1] = worldPos;
                verts[j * 4 + 2] = worldPos;
                verts[j * 4 + 3] = worldPos;
            }
            cols[j * 4] = (cols[j * 4 + 1] = (cols[j * 4 + 2] = (cols[j * 4 + 3] = color)));
        }
    }