Example #1
0
        public static void OpenWindow(FxAtlasAssembler assembler = null)
        {
            var win = GetWindow <FxAtlasEditorWindow>();

            win.titleContent = new GUIContent("FxAtlas Editor");
            win.Show();
            if (assembler)
            {
                win.assembler = assembler;
            }
        }
        static Texture2D GeneratePackedTexture(FxAtlasAssembler assembler)
        {
            var renderTexture = new RenderTexture(assembler.AtlasWidth, assembler.AtlasHeight, 0);

            renderTexture.Create();
            var originalActive = RenderTexture.active;

            RenderTexture.active = renderTexture;
            GL.PushMatrix();
            GL.LoadPixelMatrix(0, renderTexture.width, renderTexture.height, 0);

            GL.Clear(true, true, Color.clear);

            foreach (var sprite in assembler.Sprites)
            {
                if (sprite.Texture)
                {
                    if (DrawTextureMaterial)
                    {
                        Graphics.DrawTexture(sprite.GetPixelRectFlipY(assembler.AtlasHeight),
                                             sprite.Texture, new Rect(0, 0, 1, 1), 0, 0, 0, 0, DrawTextureMaterial, 0); //drawColor
                        Graphics.DrawTexture(sprite.GetPixelRectFlipY(assembler.AtlasHeight),
                                             sprite.Texture, new Rect(0, 0, 1, 1), 0, 0, 0, 0, DrawTextureMaterial, 1); //drawAlpha
                    }
                    else
                    {
                        Graphics.DrawTexture(sprite.GetPixelRectFlipY(assembler.AtlasHeight),
                                             sprite.Texture, new Rect(0, 0, 1, 1), 0, 0, 0, 0);
                    }
                }
            }

            Texture2D tex2D = new Texture2D(renderTexture.width, renderTexture.height, TextureFormat.RGBA32, false);

            tex2D.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
            tex2D.Apply();
            GL.PopMatrix();
            RenderTexture.active = originalActive;

            renderTexture.Release();

            return(tex2D);
        }
Example #3
0
 void GetAssembler()
 {
     EditorGUILayout.PrefixLabel("FxAtlas Editor");
     assembler = (FxAtlasAssembler)EditorGUILayout.ObjectField(
         assembler, typeof(FxAtlasAssembler), true);
 }
        public static bool SaveAtlas(FxAtlasAssembler assembler)
        {
            if (!assembler)
            {
                return(false);
            }

            string    atlasAssetPath;
            string    atlasTexturePath;
            FxAtlas   atlasAsset = assembler.AtlasAsset;
            Texture2D atlasTexture;

            //没有atlas的时候,新建一个
            if (atlasAsset == null)
            {
                atlasAssetPath = EditorUtility.SaveFilePanel("Save", "Assets", "atlas.asset", "asset");
                if (string.IsNullOrEmpty(atlasAssetPath))
                {
                    return(false);
                }
                else if (atlasAssetPath.EndsWith(".asset") == false)
                {
                    Debug.LogError("must has .asset extension");
                    return(false);
                }

                atlasAssetPath = FileUtil.GetProjectRelativePath(atlasAssetPath);

                atlasAsset = ScriptableObject.CreateInstance <FxAtlas>();
                AssetDatabase.CreateAsset(atlasAsset, atlasAssetPath);
                AssetDatabase.ImportAsset(atlasAssetPath, ImportAssetOptions.ForceUpdate);
                atlasAsset = AssetDatabase.LoadAssetAtPath <FxAtlas>(atlasAssetPath);
            }
            else
            {
                //得到当前atlas的路径
                atlasAssetPath = AssetDatabase.GetAssetPath(atlasAsset);
            }

            atlasTexturePath = atlasAssetPath.Replace(".asset", ".png");

            atlasTexture = GeneratePackedTexture(assembler);

            SavePackedTexture(atlasTexturePath, ref atlasTexture);

            Undo.RecordObjects(new Object[] { assembler, atlasAsset }, "Save Atlas");
            EditorUtility.SetDirty(assembler);
            EditorUtility.SetDirty(atlasAsset);

            atlasAsset.AtlasTexture = atlasTexture;

            var sprites = new FxSprite[assembler.Sprites.Length];

            for (int i = 0; i < assembler.Sprites.Length; i++)
            {
                sprites[i] = new FxSprite()
                {
                    id          = assembler.Sprites[i].ID,
                    name        = assembler.Sprites[i].IdentityName,
                    scaleOffset = assembler.Sprites[i].GetUVRect(assembler.AtlasWidth, assembler.AtlasHeight)
                };
            }

            atlasAsset.Sprites = sprites;

            assembler.AtlasAsset = atlasAsset;

            return(true);
        }