public void CreateNewOutline(Rect rectOutline) { Rect rect = m_Selected.rect; if (rect.Contains(rectOutline.min) && rect.Contains(rectOutline.max)) { RecordUndo(); SpriteOutline so = new SpriteOutline(); Vector2 outlineOffset = new Vector2(0.5f * rect.width + rect.x, 0.5f * rect.height + rect.y); Rect selectionRect = new Rect(rectOutline); selectionRect.min = SnapPoint(rectOutline.min); selectionRect.max = SnapPoint(rectOutline.max); so.Add(CapPointToRect(new Vector2(selectionRect.xMin, selectionRect.yMin), rect) - outlineOffset); so.Add(CapPointToRect(new Vector2(selectionRect.xMin, selectionRect.yMax), rect) - outlineOffset); so.Add(CapPointToRect(new Vector2(selectionRect.xMax, selectionRect.yMax), rect) - outlineOffset); so.Add(CapPointToRect(new Vector2(selectionRect.xMax, selectionRect.yMin), rect) - outlineOffset); selectedShapeOutline.Add(so); spriteEditorWindow.SetDataModified(); shapeEditorDirty = true; } }
protected static List <SpriteOutline> GenerateSpriteRectOutline(Rect rect, float detail, byte alphaTolerance, ITextureDataProvider textureProvider) { List <SpriteOutline> outline = new List <SpriteOutline>(); var texture = textureProvider.GetReadableTexture2D(); if (texture != null) { Vector2[][] paths; // we might have a texture that is capped because of max size or NPOT. // in that case, we need to convert values from capped space to actual texture space and back. int actualWidth = 0, actualHeight = 0; int cappedWidth, cappedHeight; textureProvider.GetTextureActualWidthAndHeight(out actualWidth, out actualHeight); cappedWidth = texture.width; cappedHeight = texture.height; Vector2 scale = new Vector2(cappedWidth / (float)actualWidth, cappedHeight / (float)actualHeight); Rect spriteRect = rect; spriteRect.xMin *= scale.x; spriteRect.xMax *= scale.x; spriteRect.yMin *= scale.y; spriteRect.yMax *= scale.y; UnityEditor.Sprites.SpriteUtility.GenerateOutline(texture, spriteRect, detail, alphaTolerance, true, out paths); Rect capRect = new Rect(); capRect.size = rect.size; capRect.center = Vector2.zero; for (int j = 0; j < paths.Length; ++j) { SpriteOutline points = new SpriteOutline(); foreach (Vector2 v in paths[j]) { points.Add(CapPointToRect(new Vector2(v.x / scale.x, v.y / scale.y), capRect)); } outline.Add(points); } } return(outline); }