Example #1
0
        void CreateMaterial()
        {
            var path = EditorUtility.SaveFolderPanel("Save Decal", Application.dataPath, "Assets");

            if (!string.IsNullOrEmpty(path))
            {
                var mat   = new Material(Shader.Find("Decal2D/SpriteDecalUnlit"));
                var decal = SaveTextureFromSprite(canvas.GetComponent <SpriteRenderer>().sprite, true);
                TextureResizing.Bilinear(decal, canvas.decalSize);
                System.IO.File.WriteAllBytes(path + "/" + canvas.name + "_decal.png", decal.EncodeToPNG());
                var decalPath = Helper.ConvertLoRelativePath(path) + "/" + canvas.name + "_decal.png";
                AssetDatabase.ImportAsset(decalPath);
                TextureImporter imp = (TextureImporter)AssetImporter.GetAtPath(decalPath);
                imp.isReadable    = true;
                imp.textureFormat = TextureImporterFormat.ARGB32;
                imp.mipmapEnabled = true;
                imp.wrapMode      = TextureWrapMode.Clamp;
                imp.SaveAndReimport();
                canvas.decalMaterial = mat;
                canvas.RescaleDecal(AssetDatabase.LoadAssetAtPath <Texture2D>(decalPath));
                AssetDatabase.CreateAsset(mat, Helper.ConvertLoRelativePath(path) + "/" + canvas.name + "_material.mat");

                EditorUtility.SetDirty(canvas);
                var prefabPath = Helper.ConvertLoRelativePath(path) + "/" + canvas.name + ".prefab";
                var prefab     = PrefabUtility.CreatePrefab(prefabPath, canvas.gameObject);
                PrefabUtility.ConnectGameObjectToPrefab(canvas.gameObject, prefab);
                Selection.activeObject = prefab;
            }
        }
        public static Texture2D CaptureTextureFromSprite(Sprite sprite, string path)
        {
            TextureImporter original     = (TextureImporter)AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(sprite.texture));
            var             t_format     = original.textureFormat;
            var             t_type       = original.textureType;
            var             t_isReadable = original.isReadable;

            original.textureType   = TextureImporterType.Advanced;
            original.isReadable    = true;
            original.textureFormat = TextureImporterFormat.ARGB32;
            original.SaveAndReimport();
            var relativeRect = sprite.rect;
            var map          = new Texture2D((int)(relativeRect.width), (int)(relativeRect.height), TextureFormat.ARGB32, false, true);
            var pixels       = new List <Color>(map.height * map.width);
            var xStart       = (int)relativeRect.x;
            var yStart       = (int)relativeRect.y;

            for (int y = yStart; y < yStart + map.height; y++)
            {
                for (int x = xStart; x < xStart + map.width; x++)
                {
                    pixels.Add(sprite.texture.GetPixel(x, y));
                }
            }
            map.SetPixels(pixels.ToArray());
            map.Apply();
            original.textureType   = t_type;
            original.isReadable    = t_isReadable;
            original.textureFormat = t_format;
            original.SaveAndReimport();
            if (map.width != data.textureWidth || map.height != data.textureHeight)
            {
                TextureResizing.Bilinear(map, data.textureWidth, data.textureHeight);
            }
            var b = map.EncodeToPNG();

            File.WriteAllBytes(path, b);
            AssetDatabase.ImportAsset(path);
            TextureImporter output = (TextureImporter)AssetImporter.GetAtPath(path);

            output.alphaIsTransparency = true;
            output.textureType         = TextureImporterType.Advanced;
            output.isReadable          = true;
            output.textureFormat       = TextureImporterFormat.RGBA32;
            output.wrapMode            = TextureWrapMode.Repeat;
            output.normalmapFilter     = TextureImporterNormalFilter.Standard;
            output.npotScale           = TextureImporterNPOTScale.ToNearest;
            output.spriteImportMode    = SpriteImportMode.None;
            output.SaveAndReimport();
            return(AssetDatabase.LoadAssetAtPath <Texture2D>(path));
        }
Example #3
0
        void RescaleDecal()
        {
            var sprite = canvas.GetComponent <SpriteRenderer>().sprite;

            TextureResizing.Bilinear(canvas.decal, sprite.rect.width * canvas.decalSize, sprite.rect.height * canvas.decalSize);
            var decalPath = AssetDatabase.GetAssetPath(canvas.decal);

            System.IO.File.WriteAllBytes(Helper.ConvertToAbsolutePath(decalPath), canvas.decal.EncodeToPNG());
            AssetDatabase.ImportAsset(decalPath);
            TextureImporter imp = (TextureImporter)AssetImporter.GetAtPath(decalPath);

            imp.isReadable = true;
            imp.SaveAndReimport();
            canvas.RescaleDecal(canvas.decal);
            EditorUtility.SetDirty(canvas);
        }
        /// <summary>
        /// Creates prefab from sprite
        /// </summary>
        /// <param name="mesh"></param>
        /// <param name="name"></param>
        /// <param name="path"></param>
        public static void SavePrefabFromSprite(Mesh mesh, string name, string path)
        {
            var obj = new GameObject(name);

            mesh.name = "mesh";
            var prefabPath = path + "/" + name + ".prefab";
            var mf         = obj.AddComponent <MeshFilter>();
            var mr         = obj.AddComponent <MeshRenderer>();

            var mat    = new Material(data.shader);
            var prefab = PrefabUtility.CreatePrefab(prefabPath, obj);

            mat.name        = "material";
            mat.mainTexture = data.sprite.texture;
            AssetDatabase.AddObjectToAsset(mesh, prefab);
            AssetDatabase.AddObjectToAsset(mat, prefab);
            if (data.useDecal)
            {
                var decal = SaveTextureFromSprite(data.sprite, true);
                if (data.decalSize != 1)
                {
                    TextureResizing.Bilinear(decal, (int)(decal.width * data.decalSize), (int)(decal.height * data.decalSize));
                }
                decal.wrapMode = TextureWrapMode.Clamp;
                decal.name     = "decal";
                AssetDatabase.AddObjectToAsset(decal, prefab);
                if (mat.HasProperty("_DecalTex"))
                {
                    mat.SetTexture("_DecalTex", decal);
                }
            }
            mf                = prefab.GetComponent <MeshFilter>();
            mr                = prefab.GetComponent <MeshRenderer>();
            mf.sharedMesh     = mesh;
            mr.sharedMaterial = mat;
            DestroyImmediate(obj);
            AssetDatabase.ImportAsset(prefabPath);
            Selection.activeObject = AssetDatabase.LoadAssetAtPath <GameObject>(prefabPath);
        }
        public static void SavePrefabFolderFromSprite(Mesh mesh, string name, string path)
        {
            var obj = new GameObject(name);

            mesh.name = "mesh";
            path     += "/" + name;
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
            var prefabPath = path + "/" + name + ".prefab";
            var matPath    = path + "/material.mat";
            var meshPath   = path + "/mesh.asset";


            var mf = obj.AddComponent <MeshFilter>();
            var mr = obj.AddComponent <MeshRenderer>();

            var mat    = new Material(data.shader);
            var prefab = PrefabUtility.CreatePrefab(prefabPath, obj);

            mat.name        = "material";
            mat.mainTexture = data.sprite.texture;
            AssetDatabase.CreateAsset(mesh, meshPath);
            AssetDatabase.CreateAsset(mat, matPath);
            if (data.useDecal)
            {
                var decalPath = path + "/decal.png";
                var decal     = SaveTextureFromSprite(data.sprite, true);
                if (data.decalSize != 1)
                {
                    TextureResizing.Bilinear(decal, (int)(decal.width * data.decalSize), (int)(decal.height * data.decalSize));
                }
                decal.wrapMode = TextureWrapMode.Clamp;
                decal.name     = "decal";
                var b = decal.EncodeToPNG();
                File.WriteAllBytes(Application.dataPath.Remove(Application.dataPath.Length - 6, 6) + decalPath, b);
                AssetDatabase.ImportAsset(decalPath);
                TextureImporter output = (TextureImporter)AssetImporter.GetAtPath(decalPath);
                output.alphaIsTransparency = true;
                output.textureType         = TextureImporterType.Advanced;
                output.isReadable          = true;
                output.textureFormat       = TextureImporterFormat.RGBA32;
                output.wrapMode            = TextureWrapMode.Repeat;
                output.normalmapFilter     = TextureImporterNormalFilter.Standard;
                output.npotScale           = TextureImporterNPOTScale.ToNearest;
                output.spriteImportMode    = SpriteImportMode.None;
                output.SaveAndReimport();

                if (mat.HasProperty("_DecalTex"))
                {
                    mat.SetTexture("_DecalTex", AssetDatabase.LoadAssetAtPath <Texture2D>(decalPath));
                }
            }
            mf                = prefab.GetComponent <MeshFilter>();
            mr                = prefab.GetComponent <MeshRenderer>();
            mf.sharedMesh     = mesh;
            mr.sharedMaterial = mat;
            DestroyImmediate(obj);
            AssetDatabase.ImportAsset(prefabPath);
            Selection.activeObject = AssetDatabase.LoadAssetAtPath <GameObject>(prefabPath);
        }
Example #6
0
        public void Generate(Texture2D texture, Rect rect, float scale)
        {
            currentScale = scale;
            m_width      = (int)rect.width;
            m_heigth     = (int)rect.height;
            int i          = 0;
            var xStart     = (int)rect.x;
            var yStart     = (int)rect.y;
            var tmpTexture = new Texture2D(m_width, m_heigth, TextureFormat.ARGB32, true);

#if UNITY_EDITOR
            var imp = (UnityEditor.TextureImporter)UnityEditor.AssetImporter.GetAtPath(UnityEditor.AssetDatabase.GetAssetPath(texture)) as UnityEditor.TextureImporter;
            if (imp != null && !imp.isReadable)
            {
                imp.isReadable = true;
                imp.SaveAndReimport();
            }
#endif
            for (int y = 0; y < m_heigth; y++)
            {
                for (int x = 0; x < m_width; x++)
                {
                    tmpTexture.SetPixel(x, y, texture.GetPixel(xStart + x, yStart + y));
                    i++;
                }
            }
            tmpTexture.Apply();
            if (scale < 1)
            {
                m_width  = (int)(m_width * scale);
                m_heigth = (int)(m_heigth * scale);
                if (texture.filterMode == FilterMode.Point)
                {
                    TextureResizing.Point(tmpTexture, m_width, m_heigth);
                }
                else
                {
                    TextureResizing.Bilinear(tmpTexture, m_width, m_heigth);
                }
            }

            List <Point> list = new List <Point>(m_width * m_heigth);

            for (int y = 0; y < m_heigth; y++)
            {
                for (int x = 0; x < m_width; x++)
                {
                    var p = tmpTexture.GetPixel(x, y);
                    if (p.a > 0)
                    {
                        var point = new Point(x, y, tmpTexture.GetPixel(x, y));
                        list.Add(point);
                    }
                }
            }
            m_points = list.ToArray();
#if UNITY_EDITOR
            if (m_iconPreview != null)
            {
                DestroyImmediate(m_iconPreview, true);
            }
            m_iconPreview           = tmpTexture;
            m_iconPreview.hideFlags = HideFlags.HideInHierarchy;
            UnityEditor.AssetDatabase.AddObjectToAsset(m_iconPreview, this);
#else
            DestroyImmediate(tmpTexture);
#endif
        }