示例#1
0
    public void Sort(GrassDataChunkDataPerLM d)
    {
        if (d.count == 0)
        {
            Debug.LogError("No need to sort");
            return;
        }
        SortAlgorithm(d);
//		for (int i = 0; i < d.count; i++) {
//			d.mas [i] = Matrix4x4.TRS (d.pos[i], Quaternion.identity, Vector3.one*0.05f*i);
//		}
    }
示例#2
0
    protected override void SortAlgorithm(GrassDataChunkDataPerLM d)
    {
        int count = d.count;

        float[] dis = new float[count];
        for (int i = 0; i < count; i++)
        {
            dis[i] = Vector3.Distance(d.pos [i], GrassRenderer.playerPos);
        }
        for (int i = 0; i < dis.Length; i++)
        {
            float min   = float.MaxValue;
            int   minID = -1;
            for (int j = i; j < dis.Length; j++)
            {
                if (dis [j] < min)
                {
                    min   = dis [j];
                    minID = j;
                }
            }

            dis [minID] = dis [i];
            dis [i]     = min;

            var posMin = d.pos [minID];
            d.pos [minID] = d.pos [i];
            d.pos [i]     = posMin;

            var uvMin = d.uv [minID];
            d.uv [minID] = d.uv [i];
            d.uv [i]     = uvMin;

            var masMin = d.mas [minID];
            d.mas [minID] = d.mas [i];
            d.mas [i]     = masMin;

            d.mas [i] = Matrix4x4.TRS(d.pos[i], Quaternion.identity, Vector3.one * 0.05f * i);
        }
    }
示例#3
0
    protected override void SortAlgorithm(GrassDataChunkDataPerLM d)
    {
        int           count   = d.count;
        List <float>  dis     = new List <float> (count);
        MaxHeap <int> minHeap = new MaxHeap <int>(count);

        for (int i = 0; i < count; i++)
        {
            dis.Add(Vector3.Distance(d.pos [i], GrassRenderer.playerPos));
            minHeap.PushObj(i, Vector3.Distance(d.pos [i], GrassRenderer.playerPos));
        }
        List <int> rs = new List <int> ();

        minHeap.FlushResult(rs);

        for (int i = 0; i < rs.Count; i++)
        {
            int indexInB = rs [i];
            d.posB [i] = d.pos [indexInB];
            d.masB [i] = d.mas [indexInB];
            d.uvB [i]  = d.uv [indexInB];
        }
        d.Swap();
    }
示例#4
0
    protected override void SortAlgorithm(GrassDataChunkDataPerLM d)
    {
        int count = d.count;

        for (int i = 0; i < count; i++)
        {
            //d.dis[i] = (int)Vector3.Distance (d.pos [i], GrassRenderer.playerPos)*10;

            var x = d.pos [i];
            var y = GrassRenderer.playerPos;

            var xx = (x.x - y.x);
            var yy = (x.y - y.y);
            var zz = (x.z - y.z);

            d.dis[i] = (int)(xx * xx + yy * yy + zz * zz * 10);
        }
        var a = d.dis;


        //1 min max
        int max = int.MinValue;
        int min = int.MaxValue;

        for (int i = 0; i < a.Length; i++)
        {
            if (a [i] > max)
            {
                max = a [i];
            }
            if (a [i] < min)
            {
                min = a [i];
            }
        }

        //2 count
        int[] c = new int[max - min + 1];
        for (int i = 0; i < a.Length; i++)
        {
            int index = a [i] - min;
            c [index]++;
        }
        int cLength = c.Length;

        //3 accum
        for (int i = 1; i < cLength; i++)
        {
            c [i] += c [i - 1];
        }


        for (int i = 0; i < a.Length; i++)
        {
            int indexInB = (c [a [i] - min]--) - 1;
            d.posB [indexInB] = d.pos [i];
            d.masB [indexInB] = d.mas [i];
            d.uvB [indexInB]  = d.uv [i];
        }
        d.Swap();
    }
示例#5
0
 protected virtual void SortAlgorithm(GrassDataChunkDataPerLM d)
 {
 }