int compareLen(Grassface a, Grassface b) { if (a.ulen > b.ulen) { return(1); } else if (a.ulen < b.ulen) { return(-1); } else { return(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); } }