public override GameObject CreateExternalObject(Sprite sprite, SpriteConfigData data)
        {
            GameObject prefab = sprite.CreateEmptyMeshPrefab(false);

            sprite.GetVertexAndTriangle3D(data, out var vertices, out var triangles, MeshRenderType.Opaque);
            sprite.AddComponentsAssets(vertices, triangles, prefab, RENDER_TYPE_OPAQUE, data.opaqueShaderName);
            return(prefab);
        }
 private void Revert()
 {
     _configData  = SpriteConfigData.GetData(_originalUserData);
     _meshCreator = MeshCreatorBase.GetInstnace(_configData);
     _preview.SetWireframes(_meshCreator.GetMeshWireframes());
     _importData.textureImporter.userData = _originalUserData;
     _isDataChanged = false;
 }
Exemple #3
0
        public override GameObject CreateExternalObject(Sprite sprite, SpriteConfigData data)
        {
            GameObject prefab = sprite.CreateEmptyMeshPrefab(false);

            sprite.GetMeshData(data, out var vertices, out var triangles, MeshRenderType.Transparent);
            sprite.AddComponentsAssets(vertices, triangles, prefab, RENDER_TYPE_TRANSPARENT, data.transparentShader);
            return(prefab);
        }
        public override GameObject CreateExternalObject(Sprite sprite, SpriteConfigData data)
        {
            GameObject prefab = sprite.CreateEmptyMeshPrefab(false);

            Vector3[] vertices3D  = Array.ConvertAll(sprite.vertices, i => new Vector3(i.x, i.y, 0));
            int[]     triangles3D = Array.ConvertAll(sprite.triangles, i => (int)i);
            sprite.AddComponentsAssets(vertices3D, triangles3D, prefab, RENDER_TYPE_TRANSPARENT, data.transparentShaderName);
            return(prefab);
        }
        public override GameObject CreateExternalObject(Sprite sprite, SpriteConfigData data)
        {
            GameObject prefab = sprite.CreateEmptyMeshPrefab(false);

            Vector2[] vertices  = sprite.vertices;
            ushort[]  triangles = sprite.triangles;
            sprite.AddComponentsAssets(vertices, triangles, prefab, RENDER_TYPE_TRANSPARENT, data.transparentShader);
            return(prefab);
        }
 public static void GetMeshData(this Sprite sprite, SpriteConfigData data, out Vector2[] vertices, out ushort[] triangles, MeshRenderType meshRenderType)
 {
     if (!TryGetMeshData(sprite, data, out vertices, out triangles, meshRenderType))
     {
         //fallback
         vertices  = sprite.vertices;
         triangles = sprite.triangles;
     }
 }
Exemple #7
0
 public static void GetVertexAndTriangle2D(this Sprite sprite, SpriteConfigData configData, out Vector2[] vertices2D, out ushort[] triangles2D, MeshRenderType meshRenderType)
 {
     if (!TryGetVertexAndTriangle2D(sprite, configData, out vertices2D, out triangles2D, meshRenderType))
     {
         //fallback
         vertices2D  = sprite.vertices;
         triangles2D = sprite.triangles;
     }
 }
        public SpriteProcessor(Sprite sprite, string assetPath)
        {
            _importData       = new SpriteImportData(sprite, assetPath);
            _originalUserData = _importData.textureImporter.userData;
            _configData       = SpriteConfigData.GetData(_originalUserData);
            _meshCreator      = MeshCreatorBase.GetInstnace(_configData);
            _preview          = new SpritePreview(_meshCreator.GetMeshWireframes());

            Undo.undoRedoPerformed += UndoReimport;
        }
Exemple #9
0
        public override GameObject CreateExternalObject(Sprite sprite, SpriteConfigData data)
        {
            GameObject root = sprite.CreateEmptyMeshPrefab(true);
            GameObject sub  = root.transform.GetChild(0).gameObject;

            sprite.GetMeshData(data, out var transparentVertices, out var transparentTriangles, MeshRenderType.SeparatedTransparent);
            sprite.GetMeshData(data, out var opaqueVertices, out var opaqueTriangles, MeshRenderType.Opaque);
            sprite.AddComponentsAssets(transparentVertices, transparentTriangles, root, RENDER_TYPE_TRANSPARENT, data.transparentShader);
            sprite.AddComponentsAssets(opaqueVertices, opaqueTriangles, sub, RENDER_TYPE_OPAQUE, data.opaqueShader);
            return(root);
        }
        private void UndoReimport()
        {
            _configData    = SpriteConfigData.GetData(_importData.textureImporter.userData);
            _isDataChanged = true;

            foreach (var t in _targets)
            {
                AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(t),
                                          ImportAssetOptions.ForceUpdate |
                                          ImportAssetOptions.DontDownloadFromCacheServer);
            }
        }
Exemple #11
0
        private void UpdateAndResize(Rect rect, Sprite sprite, SpriteConfigData data)
        {
            _rect     = rect;
            _sprite   = sprite;
            _infoText = "";

            foreach (var wireframe in _wireframes)
            {
                wireframe.UpdateAndResize(_rect, _sprite, data);
                _infoText += wireframe.GetInfo(_sprite) + "\n";
            }
        }
Exemple #12
0
        private static Vector2[][] GenerateSeparatedTransparent(Sprite sprite, SpriteConfigData data)
        {
            Vector2[][]             transparentPaths          = GenerateTransparentOutline(sprite, data.transparentDetail, data.transparentAlphaTolerance, data.detectHoles);
            Vector2[][]             opaquePaths               = GenerateOpaqueOutline(sprite, data.opaqueDetail, data.opaqueAlphaTolerance);
            List <List <IntPoint> > convertedTransparentPaths = ConvertToIntPointList(transparentPaths);
            List <List <IntPoint> > convertedOpaquePaths      = ConvertToIntPointList(opaquePaths);
            List <List <IntPoint> > intersectionPaths         = new List <List <IntPoint> >();
            Clipper clipper = new Clipper();

            clipper.AddPaths(convertedTransparentPaths, PolyType.ptSubject, true);
            clipper.AddPaths(convertedOpaquePaths, PolyType.ptClip, true);
            clipper.Execute(ClipType.ctDifference, intersectionPaths, PolyFillType.pftEvenOdd, PolyFillType.pftEvenOdd);
            return(ConvertToVector2Array(intersectionPaths));
        }
Exemple #13
0
        public static Vector2[][] GenerateOutline(Sprite sprite, SpriteConfigData data, MeshRenderType meshRenderType)
        {
            switch (meshRenderType)
            {
            case MeshRenderType.Transparent:
                return(GenerateTransparentOutline(sprite, data.transparentDetail, data.transparentAlphaTolerance, data.detectHoles));

            case MeshRenderType.Opaque:
                return(GenerateOpaqueOutline(sprite, data.opaqueDetail, data.opaqueAlphaTolerance));

            case MeshRenderType.SeparatedTransparent:
                return(GenerateSeparatedTransparent(sprite, data));

            default:
                return(Array.Empty <Vector2[]>());
            }
        }
Exemple #14
0
        public static void GetVertexAndTriangle3D(this Sprite sprite, SpriteConfigData configData, out Vector3[] vertices3D, out int[] triangles3D, MeshRenderType meshRenderType)
        {
            if (!TryGetVertexAndTriangle2D(sprite, configData, out var vertices2D, out var triangles2D, meshRenderType))
            {
                //fallback
                vertices2D  = sprite.vertices;
                triangles2D = sprite.triangles;
            }

            vertices3D  = Array.ConvertAll(vertices2D, i => new Vector3(i.x, i.y, 0));
            triangles3D = Array.ConvertAll(triangles2D, i => (int)i);

            if (configData.thickness > 0)
            {
                TriangulationUtil.ExpandMeshThickness(ref vertices3D, ref triangles3D, configData.thickness);
            }
        }
Exemple #15
0
        private void OnPostprocessSprites(Texture2D texture, Sprite[] sprites)
        {
            TextureImporter         textureImporter         = assetImporter as TextureImporter;
            TextureImporterSettings textureImporterSettings = new TextureImporterSettings();

            textureImporter.ReadTextureSettings(textureImporterSettings);
            SpriteConfigData configData = SpriteConfigData.GetData(textureImporter.userData);

            if (textureImporterSettings.spriteMeshType != SpriteMeshType.Tight || !configData.overriden)
            {
                return;
            }

            MeshCreatorBase creator = MeshCreatorBase.GetInstnace(configData);

            foreach (var sprite in sprites)
            {
                creator.OverrideGeometry(sprite, configData);
            }
        }
        public static SpriteConfigData GetData(string jsonData)
        {
            SpriteConfigData data = null;

            try
            {
                data = JsonUtility.FromJson <SpriteConfigData>(jsonData);
            }
            catch (Exception e)
            {
                Debug.LogWarning(e);
            }

            if (data == null)
            {
                data = new SpriteConfigData();
            }

            return(data);
        }
        private void UndoReimport()
        {
            _configData    = SpriteConfigData.GetData(_mainImportData.textureImporter.userData);
            _isDataChanged = true;

            if (_targets == null)
            {
                return;
            }

            foreach (var t in _targets)
            {
                string path = AssetDatabase.GetAssetPath(t);

                if (!string.IsNullOrEmpty(path))
                {
                    AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate | ImportAssetOptions.DontDownloadFromCacheServer);
                }
            }
        }
        private static bool TryGetMeshData(Sprite sprite, SpriteConfigData data, out Vector2[] vertices, out ushort[] triangles, MeshRenderType meshRenderType)
        {
            vertices  = Array.Empty <Vector2>();
            triangles = Array.Empty <ushort>();

            if (data == null || !data.overriden)
            {
                return(false);
            }

            Vector2[][] paths = OutlineUtil.GenerateOutline(sprite, data, meshRenderType);
            TriangulationUtil.Triangulate(paths, data.edgeSmoothing, data.useNonZero, out vertices, out triangles);

            //validate
            if (vertices.Length >= ushort.MaxValue)
            {
                Debug.LogErrorFormat($"Too many veretics! Sprite '{sprite.name}' has {vertices.Length} vertices.");
                return(false);
            }

            return(true);
        }
Exemple #19
0
        public static bool TryGetVertexAndTriangle2D(this Sprite sprite, SpriteConfigData configData, out Vector2[] vertices, out ushort[] triangles, MeshRenderType meshRenderType)
        {
            vertices  = Array.Empty <Vector2>();
            triangles = Array.Empty <ushort>();

            if (configData == null || sprite == null ||
                configData.mode == SpriteConfigData.Mode.UnityDefaultForTransparent ||
                configData.mode == SpriteConfigData.Mode.UnityDefaultForOpaque)
            {
                return(false);
            }

            Vector2[][] paths = OutlineUtil.GenerateOutline(sprite, configData, meshRenderType);

            if (meshRenderType == MeshRenderType.Grid)
            {
                vertices  = paths[0];
                triangles = new ushort[vertices.Length];

                for (var i = 0; i < triangles.Length; i++)
                {
                    triangles[i] = (ushort)i;
                }
            }
            else
            {
                TriangulationUtil.Triangulate(paths, configData.edgeSmoothing, configData.useNonZero, out vertices, out triangles);
            }

            //validate
            if (vertices.Length >= ushort.MaxValue)
            {
                Debug.LogErrorFormat($"Too many vertices! Sprite '{sprite.name}' has {vertices.Length} vertices.");
                return(false);
            }

            return(true);
        }
        public void Update(Rect rect, Sprite baseSprite, Sprite dummySprite, TextureInfo textureInfo, SpriteConfigData configData)
        {
            Rect = rect;

            _textureInfo = textureInfo;
            _infoText    = "";

            foreach (var wireframe in _wireframes)
            {
                wireframe.UpdateAndResize(this.Rect, baseSprite, dummySprite, _textureInfo, configData);
                _infoText += wireframe.GetInfo(textureInfo) + "\n";
            }
        }
        public void UpdateAndResize(Rect rect, Sprite sprite, SpriteConfigData data)
        {
            sprite.GetMeshData(data, out _vertices, out _triangles, _meshRenderType);

            Resize(rect, sprite);
        }
Exemple #22
0
 public abstract void UpdateExternalObject(GameObject externalObject, Sprite baseSprite, Sprite dummySprite, TextureInfo textureInfo, SpriteConfigData data);
Exemple #23
0
 public abstract GameObject CreateExternalObject(Sprite sprite, TextureInfo textureInfo, SpriteConfigData data, string oldPrefabPath = null);
Exemple #24
0
 public abstract void OverrideGeometry(Sprite baseSprite, Sprite dummySprite, TextureInfo textureInfo, SpriteConfigData configData);
Exemple #25
0
 public void Show(Rect rect, Sprite sprite, SpriteConfigData configData, bool hasMultipleTargets)
 {
     UpdateAndResize(rect, sprite, configData);
     Draw(hasMultipleTargets);
 }
Exemple #26
0
 public override void OverrideGeometry(Sprite sprite, SpriteConfigData data)
 {
     sprite.GetMeshData(data, out var vertices, out var triangles, MeshRenderType.Transparent);
     sprite.SetSpriteScaleToVertices(vertices, 1, false, false);
     sprite.OverrideGeometry(vertices, triangles);
 }
 public static MeshCreatorBase GetInstnace(SpriteConfigData configData)
 {
     return(configData.overriden ? _creator[configData.mode] : _defaultCreator);
 }
        public static void AddComponentsAssets(Sprite sprite, GameObject prefab, Vector3[] v, int[] t, TextureInfo textureInfo, string renderType, string shaderName, SpriteConfigData spriteConfigData)
        {
            prefab.layer = spriteConfigData.overrideSortingLayer ? spriteConfigData.layer : SpriteAssistSettings.Settings.defaultLayer;
            string tag = spriteConfigData.overrideTag ? spriteConfigData.tag : SpriteAssistSettings.Settings.defaultTag;

            if (string.IsNullOrEmpty(tag))
            {
                prefab.tag = SpriteAssistSettings.DEFAULT_TAG;
            }

            //add components
            MeshFilter   meshFilter   = prefab.GetComponent <MeshFilter>();
            MeshRenderer meshRenderer = prefab.GetComponent <MeshRenderer>();

            if (meshFilter == null)
            {
                meshFilter = prefab.AddComponent <MeshFilter>();
            }

            if (meshRenderer == null)
            {
                meshRenderer = prefab.AddComponent <MeshRenderer>();
            }

            if (spriteConfigData.overrideSortingLayer)
            {
                meshRenderer.sortingLayerID = spriteConfigData.sortingLayerId;
                meshRenderer.sortingOrder   = spriteConfigData.sortingOrder;
            }
            else
            {
                meshRenderer.sortingLayerID = SpriteAssistSettings.Settings.defaultSortingLayerId;
                meshRenderer.sortingOrder   = SpriteAssistSettings.Settings.defaultSortingOrder;
            }

            //create new mesh
            Mesh mesh = new Mesh()
            {
                name = renderType,
            };

            mesh.Update(v, t, textureInfo);
            meshFilter.mesh = mesh;

            //create new material
            Material material = new Material(Shader.Find(shaderName));

            material.name        = renderType;
            material.mainTexture = sprite.texture;

            meshRenderer.sharedMaterial = material;

            //set assets as sub-asset
            AssetDatabase.AddObjectToAsset(material, prefab);
            AssetDatabase.AddObjectToAsset(mesh, prefab);
            //AssetDatabase.SaveAssets();
        }
 public abstract void OverrideGeometry(Sprite sprite, SpriteConfigData configData);
 public abstract GameObject CreateExternalObject(Sprite sprite, SpriteConfigData data);