protected override void OnPopulateMesh(VertexHelper vh) { if (!gameObject.activeInHierarchy) { if (Debug.isDebugBuild && Application.isEditor) { Debug.LogError("On populate mesh is called for disabled UI element"); } return; } var rt = rectTransform; var piv = rt.pivot; var rectSize = rt.rect.size; vh.Clear(); var vertex = UIVertex.simpleVert; var rctS = rectSize; float rectDiff = rctS.x - rctS.y; rctS = new Vector2(Mathf.Max(0, rectDiff / rctS.x), Mathf.Max(0, (-rectDiff) / rctS.y)); var scaleToSided = rctS.x - rctS.y; // If x>0 - positive, else - negative if (feedPositionData) { var pos = Vector2.zero; switch (_positionDataType) { case PositionDataType.AtlasPosition: var sp = sprite; if (sp) { var tex = sp.texture; if (tex) { var texturePixelSize = new Vector2(tex.width, tex.height); var atlased = SpriteRect; pos = atlased.center / texturePixelSize; vertex.uv3 = atlased.size / texturePixelSize; } } break; case PositionDataType.ScreenPosition: pos = RectTransformUtility.WorldToScreenPoint( IsOverlay ? null : (canvas ? canvas.worldCamera : null), rt.position); pos.Scale(new Vector2(1f / Screen.width, 1f / Screen.height)); break; case PositionDataType.FadeOutPosition: pos = faeOutUvPosition.min; vertex.uv3 = faeOutUvPosition.max; break; } vertex.uv2 = pos; } var corner1 = (Vector2.zero - piv) * rectSize; var corner2 = (Vector2.one - piv) * rectSize; vertex.color = color; vertex.uv0 = new Vector2(0, 0); vertex.uv1 = new Vector2(scaleToSided, GetCorner(0)); vertex.position = new Vector2(corner1.x, corner1.y); vh.AddFull(vertex); vertex.uv0 = new Vector2(0, 1); vertex.uv1.y = GetCorner(1); vertex.position = new Vector2(corner1.x, corner2.y); vh.AddFull(vertex); vertex.uv0 = new Vector2(1, 1); vertex.uv1.y = GetCorner(2); vertex.position = new Vector2(corner2.x, corner2.y); vh.AddFull(vertex); vertex.uv0 = new Vector2(1, 0); vertex.uv1.y = GetCorner(3); vertex.position = new Vector2(corner2.x, corner1.y); vh.AddFull(vertex); if (LinkedCorners) { //1 2 //0 3 vh.AddTriangle(0, 1, 2); vh.AddTriangle(2, 3, 0); } else { //1 6,9 2 //7 13 14 8 //4 12 15 11 //0 5,10 3 // TODO: Implement atlasing for Unlinked var cornMid = (corner1 + corner2) * 0.5f; vertex.uv1.y = GetCorner(0); vh.AddFull(vertex.Set(0, 0.5f, corner1, cornMid)); //4 vh.AddFull(vertex.Set(0.5f, 0, cornMid, corner1)); //5 vertex.uv1.y = GetCorner(1); vh.AddFull(vertex.Set(0.5f, 1, cornMid, corner2)); //6 vh.AddFull(vertex.Set(0, 0.5f, corner1, cornMid)); //7 vertex.uv1.y = GetCorner(2); vh.AddFull(vertex.Set(1, 0.5f, corner2, cornMid)); //8 vh.AddFull(vertex.Set(0.5f, 1, cornMid, corner2)); //9 vertex.uv1.y = GetCorner(3); vh.AddFull(vertex.Set(0.5f, 0, cornMid, corner1)); //10 vh.AddFull(vertex.Set(1, 0.5f, corner2, cornMid)); //11 vertex.uv1.y = GetCorner(0); vh.AddFull(vertex.Set(0.5f, 0.5f, cornMid, cornMid)); //12 vertex.uv1.y = GetCorner(1); vh.AddFull(vertex.Set(0.5f, 0.5f, cornMid, cornMid)); //13 vertex.uv1.y = GetCorner(2); vh.AddFull(vertex.Set(0.5f, 0.5f, cornMid, cornMid)); //14 vertex.uv1.y = GetCorner(3); vh.AddFull(vertex.Set(0.5f, 0.5f, cornMid, cornMid)); //15 vh.AddTriangle(0, 4, 5); vh.AddTriangle(1, 6, 7); vh.AddTriangle(2, 8, 9); vh.AddTriangle(3, 10, 11); vh.AddTriangle(12, 5, 4); vh.AddTriangle(13, 7, 6); vh.AddTriangle(14, 9, 8); vh.AddTriangle(15, 11, 10); } }