// ------------------------------------------------------------------ // Desc: // ------------------------------------------------------------------ void OnGUI() { EditorGUI.indentLevel = 0; if (curEdit == null) { GUILayout.Space(10); GUILayout.Label("Please select an Atlas Info"); // DISABLE: this.ShowNotification( new GUIContent("Please select an Atlas Info")); return; } // ======================================================== // toolbar // ======================================================== GUILayout.BeginHorizontal(EditorStyles.toolbar); GUILayout.FlexibleSpace(); // ======================================================== // Select // ======================================================== GUI.enabled = selectedElements.Count != 0; if (GUILayout.Button("Select In Project...", EditorStyles.toolbarButton)) { List <Object> selects = new List <Object>(curEdit.elements.Count); foreach (exAtlasInfo.Element el in selectedElements) { if (selects.IndexOf(el.texture) == -1) { selects.Add(el.texture); } } if (selects.Count != 0) { selectIdx = (selectIdx + 1) % selects.Count; Selection.objects = selects.ToArray(); EditorGUIUtility.PingObject(Selection.objects[selectIdx]); } } GUI.enabled = true; GUILayout.Space(5); // ======================================================== // zoom in/out slider // ======================================================== GUILayout.Label("Zoom"); GUILayout.Space(5); curEdit.scale = GUILayout.HorizontalSlider(curEdit.scale, 0.1f, 2.0f, GUILayout.MaxWidth(150)); GUILayout.Space(5); curEdit.scale = EditorGUILayout.FloatField(curEdit.scale, EditorStyles.toolbarTextField, GUILayout.Width(50)); curEdit.scale = Mathf.Clamp(curEdit.scale, 0.1f, 2.0f); // ======================================================== // Build // ======================================================== GUI.enabled = curEdit.needRebuild; if (GUILayout.Button("Build", EditorStyles.toolbarButton, GUILayout.Width(80))) { // build atlas info to atals exAtlasInfoUtility.Build(curEdit); // build sprite animclip that used this atlasInfo exAtlasInfoUtility.BuildSpAnimClipsFromRebuildList(curEdit); // update scene sprites List <string> rebuildAtlasInfos = new List <string>(); rebuildAtlasInfos.Add(exEditorHelper.AssetToGUID(curEdit)); exSceneHelper.UpdateSprites(rebuildAtlasInfos); // NOTE: without this you will got leaks message EditorUtility.UnloadUnusedAssets(); } GUI.enabled = true; // ======================================================== // Help // ======================================================== if (GUILayout.Button(exEditorHelper.HelpTexture(), EditorStyles.toolbarButton)) { Help.BrowseURL("http://www.ex-dev.com/ex2d/wiki/doku.php?id=manual:atlas_editor"); } GUILayout.EndHorizontal(); // ======================================================== // scroll view // ======================================================== float toolbarHeight = EditorStyles.toolbar.CalcHeight(new GUIContent(""), 0); scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Width(position.width), GUILayout.Height(position.height - toolbarHeight)); Rect lastRect = new Rect(10, 0, 1, 1); GUILayout.Space(5); // DISABLE { // // draw label // GUILayout.Label ( AssetDatabase.GetAssetPath(curEdit) ); // } DISABLE end // ======================================================== // atlas info // ======================================================== Object newAtlasInfo = EditorGUILayout.ObjectField("Atlas Info" , curEdit , typeof(exAtlasInfo) , false , GUILayout.Width(300) ); if (newAtlasInfo != curEdit) { Selection.activeObject = newAtlasInfo; } // ======================================================== // settings area // ======================================================== GUILayout.BeginHorizontal(); GUILayout.BeginVertical(GUILayout.MaxWidth(200)); // ======================================================== // canvas // ======================================================== curEdit.foldCanvas = EditorGUILayout.Foldout(curEdit.foldCanvas, "Canvas"); if (curEdit.foldCanvas) { GUILayout.BeginHorizontal(); GUILayout.Space(20); GUILayout.BeginVertical(); // width and height int width = curEdit.width; int height = curEdit.height; WidthAndHeightField(ref width, ref height); // Check if we need to Reset width & height if (width != curEdit.width || height != curEdit.height) { curEdit.width = width; curEdit.height = height; if (curEdit.texture) { // NOTE: if we don't write data to disk, all changes will go back. string path = AssetDatabase.GetAssetPath(curEdit.texture); exTextureHelper.SetReadable(curEdit.texture, true); curEdit.texture.Resize(width, height); curEdit.ClearAtlasTexture(); // NOTE: we can not write back directly since the texture format problem Texture2D tex = new Texture2D(width, height, TextureFormat.ARGB32, false); for (int i = 0; i < width; ++i) { for (int j = 0; j < height; ++j) { tex.SetPixel(i, j, new Color(1.0f, 1.0f, 1.0f, 0.0f)); } } tex.Apply(false); byte[] pngData = tex.EncodeToPNG(); if (pngData != null) { File.WriteAllBytes(path, pngData); } Object.DestroyImmediate(tex); TextureImporter importSettings = TextureImporter.GetAtPath(path) as TextureImporter; importSettings.maxTextureSize = Mathf.Max(width, height); importSettings.wrapMode = TextureWrapMode.Clamp; importSettings.isReadable = curEdit.readable; AssetDatabase.ImportAsset(path); } curEdit.needRebuild = true; } curEdit.bgColor = EditorGUILayout.ColorField("Bg Color", curEdit.bgColor); curEdit.showCheckerboard = EditorGUILayout.Toggle("Show Checkerboard", curEdit.showCheckerboard); GUILayout.EndVertical(); GUILayout.EndHorizontal(); } GUILayout.Space(20); // ======================================================== // layout // ======================================================== curEdit.foldLayout = EditorGUILayout.Foldout(curEdit.foldLayout, "Layout"); if (curEdit.foldLayout) { GUILayout.BeginHorizontal(); GUILayout.Space(20); GUILayout.BeginVertical(); // algorithm curEdit.algorithm = (exAtlasInfo.Algorithm)EditorGUILayout.EnumPopup("Algorithm", curEdit.algorithm); // sortBy curEdit.sortBy = (exAtlasInfo.SortBy)EditorGUILayout.EnumPopup("Sort By", curEdit.sortBy); // sortOrder curEdit.sortOrder = (exAtlasInfo.SortOrder)EditorGUILayout.EnumPopup("Sort Order", curEdit.sortOrder); // padding curEdit.paddingMode = (exAtlasInfo.PaddingMode)EditorGUILayout.EnumPopup("Padding", curEdit.paddingMode); GUILayout.BeginHorizontal(); GUILayout.Space(20); GUI.enabled = (curEdit.paddingMode == exAtlasInfo.PaddingMode.Custom); curEdit.customPadding = Math.Max(EditorGUILayout.IntField("Pixels", curEdit.actualPadding), 0); // Clamp to 0 GUI.enabled = true; GUILayout.EndHorizontal(); // TODO: have bug, just disable it { // allow rotate GUI.enabled = false; curEdit.allowRotate = false; curEdit.allowRotate = EditorGUILayout.Toggle("Allow Rotate", curEdit.allowRotate); GUI.enabled = true; // } TODO end if (GUILayout.Button("Apply")) { try { EditorUtility.DisplayProgressBar("Layout Elements...", "Layout Elements...", 0.5f); // register undo Undo.RegisterUndo(curEdit, "Apply.LayoutElements"); curEdit.LayoutElements(); EditorUtility.ClearProgressBar(); } catch (System.Exception) { EditorUtility.ClearProgressBar(); throw; } } // GUI.enabled = true; GUILayout.EndVertical(); GUILayout.EndHorizontal(); } GUILayout.Space(20); // ======================================================== // Element // ======================================================== curEdit.foldElement = EditorGUILayout.Foldout(curEdit.foldElement, "Element"); if (curEdit.foldElement) { GUILayout.BeginHorizontal(); GUILayout.Space(20); GUILayout.BeginVertical(); // sprite background color curEdit.elementBgColor = EditorGUILayout.ColorField("Bg Color", curEdit.elementBgColor); curEdit.elementSelectColor = EditorGUILayout.ColorField("Select Color", curEdit.elementSelectColor); GUILayout.EndVertical(); GUILayout.EndHorizontal(); } GUILayout.Space(40); // ======================================================== // atlas texture and material // ======================================================== GUILayout.BeginHorizontal(); GUILayout.Space(10); GUILayout.BeginVertical(); GUI.enabled = false; string assetPath = AssetDatabase.GetAssetPath(curEdit); string dir = Path.GetDirectoryName(assetPath); // ======================================================== // texture // ======================================================== if (curEdit.texture) { curEdit.texture = (Texture2D)EditorGUILayout.ObjectField("Texture" , curEdit.texture , typeof(Texture2D) , false , GUILayout.Width(100) , GUILayout.Height(100) ); } else { GUI.enabled = true; if (GUILayout.Button("Create Texture...")) { // create texture Texture2D tex = new Texture2D(curEdit.width, curEdit.height, TextureFormat.ARGB32, false); for (int i = 0; i < curEdit.width; ++i) { for (int j = 0; j < curEdit.height; ++j) { tex.SetPixel(i, j, new Color(1.0f, 1.0f, 1.0f, 0.0f)); } } tex.Apply(false); // save texture to png string atlasTexturePath = Path.Combine(dir, curEdit.atlasName + ".png"); byte[] pngData = tex.EncodeToPNG(); if (pngData != null) { File.WriteAllBytes(atlasTexturePath, pngData); } Object.DestroyImmediate(tex); // import texture AssetDatabase.ImportAsset(atlasTexturePath); TextureImporter importSettings = TextureImporter.GetAtPath(atlasTexturePath) as TextureImporter; importSettings.maxTextureSize = Mathf.Max(curEdit.width, curEdit.height); importSettings.textureFormat = TextureImporterFormat.AutomaticTruecolor; importSettings.isReadable = true; importSettings.wrapMode = TextureWrapMode.Clamp; importSettings.mipmapEnabled = false; importSettings.textureType = TextureImporterType.Default; importSettings.npotScale = TextureImporterNPOTScale.None; AssetDatabase.ImportAsset(atlasTexturePath); curEdit.texture = (Texture2D)AssetDatabase.LoadAssetAtPath(atlasTexturePath, typeof(Texture2D)); if (curEdit.material) { curEdit.material.mainTexture = curEdit.texture; } EditorUtility.SetDirty(curEdit); } GUI.enabled = false; } // GUILayout.Space(5); // ======================================================== // material // ======================================================== if (curEdit.material) { curEdit.material = (Material)EditorGUILayout.ObjectField("Material" , curEdit.material , typeof(Material) , false ); } else { GUI.enabled = true; if (GUILayout.Button("Create Material...")) { Material newMaterial = new Material(Shader.Find("ex2D/Alpha Blended")); AssetDatabase.CreateAsset(newMaterial, Path.Combine(dir, curEdit.atlasName + ".mat")); curEdit.material = newMaterial; curEdit.material.mainTexture = curEdit.texture; EditorUtility.SetDirty(curEdit); } GUI.enabled = false; } // GUILayout.Space(5); // ======================================================== // atlas // ======================================================== if (curEdit.atlas) { curEdit.atlas = (exAtlas)EditorGUILayout.ObjectField("Atlas" , curEdit.atlas , typeof(exAtlas) , false ); } else { GUI.enabled = true; if (GUILayout.Button("Create Atlas...")) { exAtlas newAtlas = exAtlasInfoUtility.CreateAtlas(dir, curEdit.atlasName); curEdit.atlas = newAtlas; EditorUtility.SetDirty(curEdit); } GUI.enabled = false; } GUI.enabled = true; // GUILayout.Space(5); // ======================================================== // build color // ======================================================== GUILayout.BeginHorizontal(); bool newUseBuildColor = GUILayout.Toggle(curEdit.useBuildColor, "Use Build Color"); if (newUseBuildColor != curEdit.useBuildColor) { curEdit.useBuildColor = newUseBuildColor; curEdit.needRebuild = true; GUI.changed = true; } GUI.enabled = curEdit.useBuildColor; Color newBuildColor = EditorGUILayout.ColorField(curEdit.buildColor); if (newBuildColor != curEdit.buildColor) { curEdit.buildColor = newBuildColor; curEdit.needRebuild = true; GUI.changed = true; } GUI.enabled = true; GUILayout.EndHorizontal(); // ======================================================== // contour bleed // ======================================================== GUI.enabled = !curEdit.useBuildColor; GUILayout.BeginHorizontal(); bool newUseContourBleed = GUILayout.Toggle(curEdit.useContourBleed, new GUIContent("Use Contour Bleed", "Prevents artifacts around the silhouette of artwork due to bilinear filtering (requires Build Color to be turned off)")) && !curEdit.useBuildColor; if (newUseContourBleed != curEdit.useContourBleed) { curEdit.useContourBleed = newUseContourBleed; curEdit.needRebuild = true; GUI.changed = true; } GUILayout.EndHorizontal(); GUI.enabled = true; // ======================================================== // padding bleed // ======================================================== GUI.enabled = (curEdit.paddingMode == exAtlasInfo.PaddingMode.Auto) || (curEdit.actualPadding >= 2); GUILayout.BeginHorizontal(); bool newUsePaddingBleed = GUILayout.Toggle(curEdit.usePaddingBleed, new GUIContent("Use Padding Bleed", "Prevents artifacts and seams around the outer bounds of a texture due to bilinear filtering (requires at least Padding of 2)")) && GUI.enabled; if (newUsePaddingBleed != curEdit.usePaddingBleed) { curEdit.usePaddingBleed = newUsePaddingBleed; curEdit.needRebuild = true; GUI.changed = true; } GUILayout.EndHorizontal(); GUI.enabled = true; // ======================================================== // trim elements // ======================================================== bool newTrimElements = GUILayout.Toggle(curEdit.trimElements, "Trimmed Elements"); if (newTrimElements != curEdit.trimElements) { curEdit.trimElements = newTrimElements; foreach (exAtlasInfo.Element el in curEdit.elements) { curEdit.UpdateElement(el.texture, newTrimElements); } curEdit.needRebuild = true; GUI.changed = true; } // ======================================================== // readable // ======================================================== bool newReadable = GUILayout.Toggle(curEdit.readable, "Read/Write Enabled"); if (newReadable != curEdit.readable) { curEdit.readable = newReadable; GUI.changed = true; exTextureHelper.SetReadable(curEdit.texture, curEdit.readable); } // ======================================================== // bitmap fonts // ======================================================== GUILayout.Space(20); GUILayout.Label("Atlas Fonts"); for (int i = 0; i < curEdit.bitmapFonts.Count; ++i) { GUILayout.BeginHorizontal(); exBitmapFont bmfont = curEdit.bitmapFonts[i]; EditorGUILayout.ObjectField(bmfont , typeof(exBitmapFont) , false ); if (GUILayout.Button("Delete", GUILayout.MaxWidth(80))) { curEdit.RemoveBitmapFont(bmfont); AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(bmfont)); --i; } GUILayout.EndHorizontal(); } GUILayout.EndVertical(); GUILayout.EndHorizontal(); GUILayout.EndVertical(); // ======================================================== // space // ======================================================== GUILayout.Space(40); lastRect = GUILayoutUtility.GetLastRect(); // ======================================================== // atlas area // ======================================================== GUILayout.BeginVertical(); GUILayout.Space(10); // exAtlas Border and Background lastRect = GUILayoutUtility.GetLastRect(); int borderSize = 1; atlasInfoRect = new Rect(lastRect.xMax + borderSize, lastRect.yMax + borderSize, curEdit.width * curEdit.scale, curEdit.height * curEdit.scale); AtlasInfoField(atlasInfoRect, borderSize, curEdit); GUILayout.EndVertical(); GUILayout.EndHorizontal(); // ======================================================== // draw select rect // ======================================================== if (inRectSelectState && (selectRect.width != 0.0f || selectRect.height != 0.0f)) { exEditorHelper.DrawRect(selectRect, new Color(0.0f, 0.5f, 1.0f, 0.2f), new Color(0.0f, 0.5f, 1.0f, 1.0f)); } // ======================================================== Event e = Event.current; // ======================================================== // mouse down if (e.type == EventType.MouseDown && e.button == 0 && e.clickCount == 1) { GUIUtility.keyboardControl = -1; // remove any keyboard control mouseDownPos = e.mousePosition; inRectSelectState = true; UpdateSelectRect(); ConfirmRectSelection(); Repaint(); e.Use(); } // rect select if (inRectSelectState) { if (e.type == EventType.MouseDrag) { UpdateSelectRect(); ConfirmRectSelection(); Repaint(); e.Use(); } else if (e.type == EventType.MouseUp && e.button == 0) { inRectSelectState = false; ConfirmRectSelection(); Repaint(); e.Use(); } } // dragging selected if (inDraggingElementState) { if (e.type == EventType.MouseDrag) { MoveSelections(e.delta / curEdit.scale); Repaint(); e.Use(); } else if (e.type == EventType.MouseUp && e.button == 0) { if (curEdit.needUpdateAnimClips) { foreach (exAtlasInfo.Element el in selectedElements) { curEdit.AddSpriteAnimClipForRebuilding(el); } curEdit.needUpdateAnimClips = false; } inDraggingElementState = false; accDeltaMove = Vector2.zero; e.Use(); } } // key events if (e.isKey) { if (e.type == EventType.KeyDown) { if (e.keyCode == KeyCode.Backspace || e.keyCode == KeyCode.Delete) { RemoveSelectedElements(); Repaint(); e.Use(); } } } EditorGUILayout.EndScrollView(); // ======================================================== // do imports // ======================================================== if (doImport) { doImport = false; ImportObjects(); Selection.activeObject = oldSelActiveObject; Selection.objects = oldSelObjects.ToArray(); oldSelObjects.Clear(); oldSelActiveObject = null; Repaint(); } // if (GUI.changed) { EditorUtility.SetDirty(curEdit); } }