Example #1
0
 int compareLen(Grassface a, Grassface b)
 {
     if (a.ulen > b.ulen)
     {
         return(1);
     }
     else if (a.ulen < b.ulen)
     {
         return(-1);
     }
     else
     {
         return(0);
     }
 }
Example #2
0
    void ProcessUV2(ref List <Vector2> uv2s)
    {
        List <Grassface> faces      = new List <Grassface>();
        List <Grassface> outfaces   = new List <Grassface>();
        List <float>     listLenghs = new List <float>();
        float            sum        = 0;

        for (int i = 0; i < uv2s.Count; i += 4)
        {
            float len = uv2s[i + 2].x;
            faces.Add(new Grassface(i / 4, 0f, 0f, len));
            sum += len;
        }
        float avlen = Mathf.Sqrt(sum);

        faces.Sort(compareLen);

        int vIndex = 0;

        while (faces.Count != 0)
        {
            float uSum = 0;
            for (int i = faces.Count - 1; i >= 0; i--)
            {
                Grassface face = faces[i];
                if (uSum + face.ulen < avlen)
                {
                    face.startu = uSum;
                    face.startv = vIndex;
                    uSum       += face.ulen;
                    outfaces.Add(face);
                    faces.RemoveAt(i);
                }
            }

            vIndex++;
        }

        for (int i = 0; i < outfaces.Count; i++)
        {
            Grassface face  = outfaces[i];
            int       index = face.index;
            uv2s[index * 4 + 0] = new Vector2(face.startu, face.startv);
            uv2s[index * 4 + 1] = new Vector2(face.startu, face.startv + 1);
            uv2s[index * 4 + 2] = new Vector2(face.startu + face.ulen, face.startv);
            uv2s[index * 4 + 3] = new Vector2(face.startu + face.ulen, face.startv + 1);
        }
    }