Пример #1
0
        public override void OnModuleActivate()
        {
            if (m_StyleSelectionStrings == null)
            {
                m_StyleSelectionStrings = kMLStyle.Select(x => x.name).ToArray();
            }

            if (m_Material == null)
            {
                m_Material = new Material(Shader.Find("Sprites/Default"));
            }
            m_AssetImporter       = spriteEditor.GetDataProvider <ISpriteEditorDataProvider>() as AssetImporter;
            m_TextureDataProvider = spriteEditor.GetDataProvider <ITextureDataProvider>();

            if (!int.TryParse(m_AssetImporter.userData, out m_CurrentStyleSelection))
            {
                m_CurrentStyleSelection = 0;
            }

            // var tex = m_TextureDataProvider.GetReadableTexture2D();
            // if (kMLStyle[m_CurrentStyleSelection].processFunc != null)
            // {
            //     m_ProcessedTexture = new Texture2D(tex.width, tex.height, TextureFormat.ARGB32, false);
            //     m_ProcessedTexture.SetPixels32(kMLStyle[m_CurrentStyleSelection].processFunc(tex));
            //     m_ProcessedTexture.Apply();
            // }
        }
Пример #2
0
        static void GenerateOutline(SpriteCache sprite, ITextureDataProvider textureDataProvider,
                                    out List <Vertex2D> vertices, out List <int> indices, out List <Edge> edges)
        {
            if (textureDataProvider == null ||
                textureDataProvider.texture == null)
            {
                vertices = new List <Vertex2D>();
                indices  = new List <int>();
                edges    = new List <Edge>();
                return;
            }

            const float detail         = 0.05f;
            const byte  alphaTolerance = 200;

            var smd = new SpriteMeshData
            {
                spriteID = new GUID(sprite.id),
                frame    = sprite.textureRect,
                pivot    = sprite.pivotNormalized
            };

            var meshDataController = new SpriteMeshDataController
            {
                spriteMeshData = smd
            };

            meshDataController.OutlineFromAlpha(new OutlineGenerator(), textureDataProvider, detail, alphaTolerance);
            meshDataController.Triangulate(new Triangulator());

            vertices = smd.vertices;
            indices  = smd.indices;
            edges    = smd.edges;
        }
 public override void OnModuleActivate()
 {
     m_TextureDataProvider = spriteEditorWindow.GetDataProvider <ITextureDataProvider>();
     LoadOutline();
     GenerateOutlineIfNotExist();
     undoSystem.RegisterUndoCallback(UndoRedoPerformed);
     shapeEditorDirty = true;
     SetupShapeEditor();
     spriteEditorWindow.enableMouseMoveEvent = true;
 }
Пример #4
0
 public override void OnModuleActivate()
 {
     this.m_TextureDataProvider = this.spriteEditorWindow.GetDataProvider <ITextureDataProvider>();
     this.LoadOutline();
     this.GenerateOutlineIfNotExist();
     this.undoSystem.RegisterUndoCallback(new Undo.UndoRedoCallback(this.UndoRedoPerformed));
     this.shapeEditorDirty = true;
     this.SetupShapeEditor();
     this.spriteEditorWindow.enableMouseMoveEvent = true;
 }
        public void GenerateOutline(ITextureDataProvider textureDataProvider, Rect rect, float detail, byte alphaTolerance, bool holeDetection, out Vector2[][] paths)
        {
            if (alphaTolerance >= 255)
            {
                throw new ArgumentException("Alpha tolerance should be lower than 255");
            }

            m_CurrentTexture        = textureDataProvider.GetReadableTexture2D();
            m_CurrentRect           = rect;
            m_CurrentAlphaTolerance = alphaTolerance;

            InternalEditorBridge.GenerateOutline(textureDataProvider.texture, rect, 1f, alphaTolerance, holeDetection, out paths);

            if (paths.Length > 0)
            {
                ClipPaths(ref paths);

                Debug.Assert(paths.Length > 0);

                var rectSizeMagnitude = rect.size.magnitude;
                var minDistance       = Mathf.Max(rectSizeMagnitude / 10f, kMinLinearizeDistance);
                var maxDistance       = Mathf.Max(rectSizeMagnitude / 100f, kMinLinearizeDistance);
                var distance          = Mathf.Lerp(minDistance, maxDistance, detail);

                for (var pathIndex = 0; pathIndex < paths.Length; ++pathIndex)
                {
                    var pathLength = CalculatePathLength(paths[pathIndex]);
                    if (pathLength > distance)
                    {
                        var newPath = Linearize(new List <Vector2>(paths[pathIndex]), distance);

                        if (newPath.Count > 3)
                        {
                            paths[pathIndex] = newPath.ToArray();
                        }

                        SmoothPath(paths[pathIndex], 5, 0.1f, 135f);
                    }
                }

                ClipPaths(ref paths);
            }

            // Merge the Polygons to one (doesn't always succeeds).
            var clipper  = new Clipper(Clipper.ioPreserveCollinear);
            var subj     = ToClipper(paths);
            var solution = new Paths();

            clipper.AddPaths(subj, PolyType.ptSubject, true);
            clipper.Execute(ClipType.ctUnion, solution, PolyFillType.pftNonZero, PolyFillType.pftNonZero);
            paths = ToVector2(solution);
            m_CurrentAlphaTolerance = alphaTolerance;
        }
Пример #6
0
        void DisplayMainTexture()
        {
            ITextureDataProvider textureDataProvider = spriteEditor.GetDataProvider <ITextureDataProvider>();

            if (textureDataProvider != null && textureDataProvider.previewTexture != null)
            {
                Texture2D mainTexture = textureDataProvider.previewTexture;
                int       width = 0, height = 0;
                textureDataProvider.GetTextureActualWidthAndHeight(out width, out height);
                spriteEditor.SetPreviewTexture(mainTexture, width, height);
            }
        }
        public override void OnModuleDeactivate()
        {
            // Reset to display the main texture.
            ITextureDataProvider textureDataProvider = spriteEditor.GetDataProvider <ITextureDataProvider>();

            if (textureDataProvider != null && textureDataProvider.previewTexture != null)
            {
                Texture2D mainTexture = textureDataProvider.previewTexture;
                int       width = 0, height = 0;
                textureDataProvider.GetTextureActualWidthAndHeight(out width, out height);
                spriteEditor.SetPreviewTexture(mainTexture, width, height);
            }
        }
Пример #8
0
        static float CalculateDefinitionScale(Texture2D texture, ITextureDataProvider dataProvider)
        {
            float definitionScale = 1;

            if (texture != null && dataProvider != null)
            {
                int actualWidth = 0, actualHeight = 0;
                dataProvider.GetTextureActualWidthAndHeight(out actualWidth, out actualHeight);
                float definitionScaleW = texture.width / (float)actualWidth;
                float definitionScaleH = texture.height / (float)actualHeight;
                definitionScale = Mathf.Min(definitionScaleW, definitionScaleH);
            }
            return(definitionScale);
        }
Пример #9
0
        private void Init(Rect buttonRect, SpriteFrameModule sf, ITextureDataProvider dataProvider)
        {
            if (SpriteEditorMenu.s_Setting == null)
            {
                SpriteEditorMenu.s_Setting = ScriptableObject.CreateInstance <SpriteEditorMenuSetting>();
            }
            this.m_SpriteFrameModule   = sf;
            this.m_TextureDataProvider = dataProvider;
            buttonRect = GUIUtility.GUIToScreenRect(buttonRect);
            float   y          = 145f;
            Vector2 windowSize = new Vector2(300f, y);

            base.ShowAsDropDown(buttonRect, windowSize, null, ShowMode.PopupMenuWithKeyboardFocus);
            Undo.undoRedoPerformed = (Undo.UndoRedoCallback)Delegate.Combine(Undo.undoRedoPerformed, new Undo.UndoRedoCallback(this.UndoRedoPerformed));
        }
Пример #10
0
 public void RefreshPropertiesCache()
 {
     this.m_SelectedAssetPath  = this.GetSelectionAssetPath();
     this.m_SpriteDataProvider = (AssetImporter.GetAtPath(this.m_SelectedAssetPath) as ISpriteEditorDataProvider);
     if (this.m_SpriteDataProvider != null)
     {
         this.m_SpriteDataProvider.InitSpriteEditorDataProvider();
         ITextureDataProvider dataProvider = this.m_SpriteDataProvider.GetDataProvider <ITextureDataProvider>();
         if (dataProvider != null)
         {
             int width  = 0;
             int height = 0;
             dataProvider.GetTextureActualWidthAndHeight(out width, out height);
             this.m_Texture = ((!(dataProvider.texture == null)) ? new SpriteEditorWindow.PreviewTexture2D(dataProvider.texture, width, height) : null);
         }
     }
 }
Пример #11
0
        public void OutlineFromAlpha(IOutlineGenerator outlineGenerator, ITextureDataProvider textureDataProvider, float outlineDetail, byte alphaTolerance)
        {
            Debug.Assert(spriteMeshData != null, "Assert failed. Expected: spriteMeshData != null. Actual: spriteMeshData == null");
            Debug.Assert(textureDataProvider != null, "Assert failed. Expected: textureDataProvider != null. Actual: textureDataProvider == null");
            Debug.Assert(textureDataProvider.texture != null, "Assert failed. Expected: textureDataProvider.texture != null. Actual: textureDataProvider.texture == null");

            int width, height;

            textureDataProvider.GetTextureActualWidthAndHeight(out width, out height);

            Vector2 scale      = new Vector2(textureDataProvider.texture.width / (float)width, textureDataProvider.texture.height / (float)height);
            Vector2 scaleInv   = new Vector2(1f / scale.x, 1f / scale.y);
            Vector2 rectOffset = spriteMeshData.frame.size * 0.5f;

            Rect scaledRect = spriteMeshData.frame;

            scaledRect.min = Vector2.Scale(scaledRect.min, scale);
            scaledRect.max = Vector2.Scale(scaledRect.max, scale);

            spriteMeshData.Clear();

            Vector2[][] paths;
            outlineGenerator.GenerateOutline(textureDataProvider, scaledRect, outlineDetail, alphaTolerance, false, out paths);

            int vertexIndexBase = 0;

            for (int i = 0; i < paths.Length; ++i)
            {
                int numPathVertices = paths[i].Length;

                for (int j = 0; j <= numPathVertices; j++)
                {
                    if (j < numPathVertices)
                    {
                        spriteMeshData.AddVertex(Vector2.Scale(paths[i][j], scaleInv) + rectOffset, default(BoneWeight));
                    }

                    if (j > 0)
                    {
                        spriteMeshData.edges.Add(new Edge(vertexIndexBase + j - 1, vertexIndexBase + j % numPathVertices));
                    }
                }

                vertexIndexBase += numPathVertices;
            }
        }
        public override void OnModuleDeactivate()
        {
            // Reset to display the main texture.
            ITextureDataProvider textureDataProvider = spriteEditor.GetDataProvider <ITextureDataProvider>();

            if (textureDataProvider != null && textureDataProvider.previewTexture != null)
            {
                Texture2D mainTexture = textureDataProvider.previewTexture;
                int       width = 0, height = 0;
                textureDataProvider.GetTextureActualWidthAndHeight(out width, out height);
                spriteEditor.SetPreviewTexture(mainTexture, width, height);
            }
            if (spriteEditor.GetMainVisualContainer().Contains(m_SecondaryTextureInspectorContainer))
            {
                spriteEditor.GetMainVisualContainer().Remove(m_SecondaryTextureInspectorContainer);
            }
        }
Пример #13
0
        // implements ISpriteEditorModule

        public override void OnModuleActivate()
        {
            spriteImportMode      = SpriteUtility.GetSpriteImportMode(spriteEditor.GetDataProvider <ISpriteEditorDataProvider>());
            m_TextureDataProvider = spriteEditor.GetDataProvider <ITextureDataProvider>();
            m_SpriteDataProvider  = spriteEditor.GetDataProvider <ISpriteEditorDataProvider>();
            int width, height;

            m_TextureDataProvider.GetTextureActualWidthAndHeight(out width, out height);
            textureActualWidth       = width;
            textureActualHeight      = height;
            m_RectsCache             = ScriptableObject.CreateInstance <SpriteRectModel>();
            m_RectsCache.spriteRects = m_SpriteDataProvider.GetSpriteRects().ToList();
            spriteEditor.spriteRects = m_RectsCache.spriteRects;
            if (spriteEditor.selectedSpriteRect != null)
            {
                spriteEditor.selectedSpriteRect = m_RectsCache.spriteRects.FirstOrDefault(x => x.spriteID == spriteEditor.selectedSpriteRect.spriteID);
            }
        }
Пример #14
0
        public override void OnModuleActivate()
        {
            this.spriteImportMode      = SpriteUtility.GetSpriteImportMode(base.spriteEditor.GetDataProvider <ISpriteEditorDataProvider>());
            this.m_TextureDataProvider = base.spriteEditor.GetDataProvider <ITextureDataProvider>();
            this.m_SpriteDataProvider  = base.spriteEditor.GetDataProvider <ISpriteEditorDataProvider>();
            int textureActualWidth;
            int textureActualHeight;

            this.m_TextureDataProvider.GetTextureActualWidthAndHeight(out textureActualWidth, out textureActualHeight);
            this.textureActualWidth       = textureActualWidth;
            this.textureActualHeight      = textureActualHeight;
            this.m_RectsCache             = ScriptableObject.CreateInstance <SpriteRectModel>();
            this.m_RectsCache.spriteRects = this.m_SpriteDataProvider.GetSpriteRects().ToList <SpriteRect>();
            if (base.spriteEditor.selectedSpriteRect != null)
            {
                base.spriteEditor.selectedSpriteRect = this.m_RectsCache.spriteRects.FirstOrDefault((SpriteRect x) => x.spriteID == base.spriteEditor.selectedSpriteRect.spriteID);
            }
        }
        public void GenerateOutline(ITextureDataProvider textureDataProvider, Rect rect, float detail, byte alphaTolerance, bool holeDetection, out Vector2[][] paths)
        {
            if (alphaTolerance >= 255)
            {
                throw new ArgumentException("Alpha tolerance should be lower than 255");
            }

            m_CurrentTexture        = textureDataProvider.GetReadableTexture2D();
            m_CurrentRect           = rect;
            m_CurrentAlphaTolerance = alphaTolerance;

            InternalEditorBridge.GenerateOutline(textureDataProvider.texture, rect, 1f, alphaTolerance, holeDetection, out paths);

            if (paths.Length > 0)
            {
                ClipPaths(ref paths);

                Debug.Assert(paths.Length > 0);

                var rectSizeMagnitude = rect.size.magnitude;
                var minDistance       = Mathf.Max(rectSizeMagnitude / 10f, kMinLinearizeDistance);
                var maxDistance       = Mathf.Max(rectSizeMagnitude / 100f, kMinLinearizeDistance);
                var distance          = Mathf.Lerp(minDistance, maxDistance, detail);

                for (var pathIndex = 0; pathIndex < paths.Length; ++pathIndex)
                {
                    var pathLength = CalculatePathLength(paths[pathIndex]);
                    if (pathLength > distance)
                    {
                        var newPath = Linearize(new List <Vector2>(paths[pathIndex]), distance);

                        if (newPath.Count > 3)
                        {
                            paths[pathIndex] = newPath.ToArray();
                        }

                        SmoothPath(paths[pathIndex], 5, 0.1f, 135f);
                    }
                }

                ClipPaths(ref paths);
            }
        }
Пример #16
0
        private void Init(Rect buttonRect, SpriteFrameModule sf, ITextureDataProvider dataProvider)
        {
            // Create for once if setting was not created before.
            if (s_Setting == null)
            {
                s_Setting = CreateInstance <SpriteEditorMenuSetting>();
            }

            m_SpriteFrameModule   = sf;
            m_TextureDataProvider = dataProvider;

            buttonRect = GUIUtility.GUIToScreenRect(buttonRect);
            float windowHeight = 195;
            var   windowSize   = new Vector2(300, windowHeight);

            ShowAsDropDown(buttonRect, windowSize);

            Undo.undoRedoPerformed += UndoRedoPerformed;
        }
Пример #17
0
        internal static bool ShowAtPosition(Rect buttonRect, SpriteFrameModule sf, ITextureDataProvider textureProvider)
        {
            // We could not use realtimeSinceStartUp since it is set to 0 when entering/exitting playmode, we assume an increasing time when comparing time.
            long nowMilliSeconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
            bool justClosed      = nowMilliSeconds < s_LastClosedTime + 50;

            if (!justClosed)
            {
                if (UnityEvent.current != null) // Event.current can be null during integration test
                {
                    UnityEvent.current.Use();
                }

                SpriteEditorMenu spriteEditorMenu = CreateInstance <SpriteEditorMenu>();
                spriteEditorMenu.Init(buttonRect, sf, textureProvider);
                return(true);
            }
            return(false);
        }
        // implements ISpriteEditorModule

        public override void OnModuleActivate()
        {
            spriteImportMode      = SpriteFrameModule.GetSpriteImportMode(spriteEditor.GetDataProvider <ISpriteEditorDataProvider>());
            m_TextureDataProvider = spriteEditor.GetDataProvider <ITextureDataProvider>();
            m_SpriteDataProvider  = spriteEditor.GetDataProvider <ISpriteEditorDataProvider>();
            int width, height;

            m_TextureDataProvider.GetTextureActualWidthAndHeight(out width, out height);
            textureActualWidth       = width;
            textureActualHeight      = height;
            m_RectsCache             = ScriptableObject.CreateInstance <SpriteRectModel>();
            m_RectsCache.hideFlags   = HideFlags.HideAndDontSave;
            m_RectsCache.spriteRects = m_SpriteDataProvider.GetSpriteRects().ToList();
            spriteEditor.spriteRects = m_RectsCache.spriteRects;
            if (spriteEditor.selectedSpriteRect != null)
            {
                spriteEditor.selectedSpriteRect = m_RectsCache.spriteRects.FirstOrDefault(x => x.spriteID == spriteEditor.selectedSpriteRect.spriteID);
            }
            AddMainUI(spriteEditor.GetMainVisualContainer());
            undoSystem.RegisterUndoCallback(UndoCallback);
        }
Пример #19
0
        internal static bool ShowAtPosition(Rect buttonRect, SpriteFrameModule sf, ITextureDataProvider textureProvider)
        {
            long num = DateTime.Now.Ticks / 10000L;
            bool result;

            if (num >= SpriteEditorMenu.s_LastClosedTime + 50L)
            {
                if (Event.current != null)
                {
                    Event.current.Use();
                }
                SpriteEditorMenu spriteEditorMenu = ScriptableObject.CreateInstance <SpriteEditorMenu>();
                spriteEditorMenu.Init(buttonRect, sf, textureProvider);
                result = true;
            }
            else
            {
                result = false;
            }
            return(result);
        }
Пример #20
0
        private void CreateMeshCache(SpriteCache sprite, ISpriteMeshDataProvider meshProvider, ITextureDataProvider textureDataProvider)
        {
            Debug.Assert(m_SkeletonMap.ContainsKey(sprite));

            var guid         = new GUID(sprite.id);
            var mesh         = CreateCache <MeshCache>();
            var skeleton     = m_SkeletonMap[sprite] as SkeletonCache;
            var metaVertices = meshProvider.GetVertices(guid);

            mesh.sprite = sprite;
            mesh.SetCompatibleBoneSet(skeleton.bones);

            foreach (var mv in metaVertices)
            {
                var v = new Vertex2D(mv.position, mv.boneWeight);
                mesh.vertices.Add(v);
            }

            mesh.indices = new List <int>(meshProvider.GetIndices(guid));

            var edges = meshProvider.GetEdges(guid);

            foreach (var e in edges)
            {
                mesh.edges.Add(new Edge(e.x, e.y));
            }

            mesh.textureDataProvider = textureDataProvider;

            m_MeshMap[sprite] = mesh;
        }
Пример #21
0
        protected static List <SpriteOutline> GenerateSpriteRectOutline(Rect rect, float detail, byte alphaTolerance, ITextureDataProvider textureProvider)
        {
            List <SpriteOutline> list = new List <SpriteOutline>();

            UnityEngine.Texture2D texture = textureProvider.texture;
            if (texture != null)
            {
                int num  = 0;
                int num2 = 0;
                textureProvider.GetTextureActualWidthAndHeight(out num, out num2);
                int     width  = texture.width;
                int     height = texture.height;
                Vector2 vector = new Vector2((float)width / (float)num, (float)height / (float)num2);
                Rect    rect2  = rect;
                rect2.xMin *= vector.x;
                rect2.xMax *= vector.x;
                rect2.yMin *= vector.y;
                rect2.yMax *= vector.y;
                Vector2[][] array;
                UnityEditor.Sprites.SpriteUtility.GenerateOutline(texture, rect2, detail, alphaTolerance, true, out array);
                Rect r = default(Rect);
                r.size   = rect.size;
                r.center = Vector2.zero;
                for (int i = 0; i < array.Length; i++)
                {
                    SpriteOutline spriteOutline = new SpriteOutline();
                    Vector2[]     array2        = array[i];
                    for (int j = 0; j < array2.Length; j++)
                    {
                        Vector2 vector2 = array2[j];
                        spriteOutline.Add(SpriteOutlineModule.CapPointToRect(new Vector2(vector2.x / vector.x, vector2.y / vector.y), r));
                    }
                    list.Add(spriteOutline);
                }
            }
            return(list);
        }
        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);
        }