public void Display() { Event e = Event.current; m_dblClick.Update(); // This way a gui exception is avoided if (e.type == EventType.Layout && m_selectBrushInInspector != null) { Selection.activeObject = m_selectBrushInInspector; m_selectBrushInInspector = null; } if (m_lastTime == 0f) { m_lastTime = Time.realtimeSinceStartup; } m_timeDt = Time.realtimeSinceStartup - m_lastTime; m_lastTime = Time.realtimeSinceStartup; if (Tileset == null) { EditorGUILayout.HelpBox("There is no tileset selected", MessageType.Info); return; } else if (Tileset.AtlasTexture == null) { EditorGUILayout.HelpBox("There is no atlas texture set", MessageType.Info); return; } else if (Tileset.Tiles.Count == 0) { EditorGUILayout.HelpBox("There are no tiles to show in the current tileset", MessageType.Info); return; } if (m_scrollStyle == null) { m_scrollStyle = new GUIStyle("ScrollView"); } if (m_customBox == null) { m_customBox = new GUIStyle("Box"); } float visualTilePadding = 1; bool isLeftMouseReleased = e.type == EventType.MouseUp && e.button == 0; bool isRightMouseReleased = e.type == EventType.MouseUp && e.button == 1; bool isInsideTileScrollArea = e.isMouse && m_rTileScrollArea.Contains(e.mousePosition); bool isInsideBrushScrollArea = e.isMouse && m_rBrushScrollArea.Contains(e.mousePosition); // TileViews if (m_tileViewList == null || m_tileViewList.list != Tileset.TileViews) { if (e.type != EventType.Layout) { m_tileViewList = TilesetEditor.CreateTileViewReorderableList(Tileset); m_tileViewList.onSelectCallback += (ReorderableList list) => { m_viewMode = eViewMode.TileView; RemoveTileSelection(); }; m_tileViewList.onRemoveCallback += (ReorderableList list) => { RemoveTileSelection(); }; } } else { GUI.color = Color.cyan; GUILayout.BeginVertical(m_customBox); m_tileViewList.index = Mathf.Clamp(m_tileViewList.index, -1, Tileset.TileViews.Count - 1); m_tileViewList.DoLayoutList(); Rect rList = GUILayoutUtility.GetLastRect(); if (e.isMouse && !rList.Contains(e.mousePosition)) { m_tileViewList.ReleaseKeyboardFocus(); } GUILayout.EndVertical(); GUI.color = Color.white; } TileView tileView = m_tileViewList != null && m_tileViewList.index >= 0 ? Tileset.TileViews[m_tileViewList.index] : null; if (m_viewMode == eViewMode.Tileset) { Tileset.TileRowLength = Mathf.Clamp(EditorGUILayout.IntField("TileRowLength", Tileset.TileRowLength), 1, Tileset.Width); } m_viewMode = (eViewMode)EditorGUILayout.EnumPopup("View Mode", m_viewMode); if (tileView == null) { m_viewMode = eViewMode.Tileset; } if (m_viewMode != m_prevViewMode) { m_prevViewMode = m_viewMode; RemoveTileSelection(); } // Draw Background Color Selector Tileset.BackgroundColor = EditorGUILayout.ColorField("Background Color", Tileset.BackgroundColor); if (m_prevBgColor != Tileset.BackgroundColor || m_scrollStyle.normal.background == null) { m_prevBgColor = Tileset.BackgroundColor; if (m_scrollStyle.normal.background == null) { m_scrollStyle.normal.background = new Texture2D(1, 1) { hideFlags = HideFlags.DontSave } } ; m_scrollStyle.normal.background.SetPixel(0, 0, Tileset.BackgroundColor); m_scrollStyle.normal.background.Apply(); } //--- string sTileIdLabel = Tileset.SelectedTileId != Tileset.k_TileId_Empty? " (id:" + Tileset.SelectedTileId + ")" : ""; EditorGUILayout.LabelField("Tile Palette" + sTileIdLabel, EditorStyles.boldLabel); // keeps values safe m_tileViewRowLength = Mathf.Max(1, m_tileViewRowLength); float tileAreaWidth = m_tileViewRowLength * (Tileset.VisualTileSize.x + visualTilePadding) + 4f; float tileAreaHeight = (Tileset.VisualTileSize.y + visualTilePadding) * (1 + (m_visibleTileCount - 1) / m_tileViewRowLength) + 4f; m_tileViewRowLength = m_viewMode == eViewMode.TileView && tileView != null ? tileView.tileSelection.rowLength : Tileset.TileRowLength; m_tilesScrollPos = EditorGUILayout.BeginScrollView(m_tilesScrollPos, m_scrollStyle); { // Scroll Moving Drag if (e.type == EventType.MouseDrag && (e.button == 1 || e.button == 2)) { m_tilesScrollPos -= e.delta; } else { DoAutoScroll(); } if (e.isMouse) { m_lastTileScrollMousePos = e.mousePosition; } if (Tileset.Tiles != null) { GUILayoutUtility.GetRect(tileAreaWidth, tileAreaHeight); m_visibleTileCount = 0; List <uint> visibleTileList = new List <uint>(); int tileViewWidth = m_viewMode == eViewMode.Tileset ? Tileset.Width : tileView.tileSelection.rowLength; int tileViewHeight = m_viewMode == eViewMode.Tileset ? Tileset.Height : ((tileView.tileSelection.selectionData.Count - 1) / tileView.tileSelection.rowLength) + 1; int totalCount = ((((tileViewWidth - 1) / m_tileViewRowLength) + 1) * m_tileViewRowLength) * tileViewHeight; for (int i = 0; i < totalCount; ++i) { int tileId = GetTileIdFromIdx(i, m_tileViewRowLength, tileViewWidth, tileViewHeight); uint tileData = (uint)tileId; if (m_viewMode == eViewMode.TileView && tileId != Tileset.k_TileId_Empty) { tileData = tileView.tileSelection.selectionData[tileId]; tileId = (int)(tileData & Tileset.k_TileDataMask_TileId); } Tile tile = tileId != Tileset.k_TileId_Empty && tileId < Tileset.Tiles.Count ? Tileset.Tiles[tileId] : null; visibleTileList.Add(tileData); int tx = m_visibleTileCount % m_tileViewRowLength; int ty = m_visibleTileCount / m_tileViewRowLength; Rect rVisualTile = new Rect(2 + tx * (Tileset.VisualTileSize.x + visualTilePadding), 2 + ty * (Tileset.VisualTileSize.y + visualTilePadding), Tileset.VisualTileSize.x, Tileset.VisualTileSize.y); // Optimization, skipping not visible tiles Rect rLocalVisualTile = rVisualTile; rLocalVisualTile.position -= m_tilesScrollPos; if (!rLocalVisualTile.Overlaps(m_rTileScrollSize)) { ; // Do Nothing } else //--- { // Draw Tile if (tile == null) { HandlesEx.DrawRectWithOutline(rVisualTile, new Color(0f, 0f, 0f, 0.2f), new Color(0f, 0f, 0f, 0.2f)); } else { HandlesEx.DrawRectWithOutline(rVisualTile, new Color(0f, 0f, 0f, 0.1f), new Color(0f, 0f, 0f, 0.1f)); TilesetEditor.DoGUIDrawTileFromTileData(rVisualTile, tileData, Tileset); } Rect rTileRect = new Rect(2 + tx * (Tileset.VisualTileSize.x + visualTilePadding), 2 + ty * (Tileset.VisualTileSize.y + visualTilePadding), (Tileset.VisualTileSize.x + visualTilePadding), (Tileset.VisualTileSize.y + visualTilePadding)); if (rVisualTile.Contains(e.mousePosition)) { if (e.type == EventType.MouseDrag && e.button == 0) { m_pointedTileIdxRect = new KeyValuePair <int, Rect>(m_visibleTileCount, rTileRect); } else if (e.type == EventType.MouseDown && e.button == 0) { m_startDragTileIdxRect = m_pointedTileIdxRect = m_endDragTileIdxRect = new KeyValuePair <int, Rect>(m_visibleTileCount, rTileRect); } else if (e.type == EventType.MouseUp && e.button == 0) { m_endDragTileIdxRect = new KeyValuePair <int, Rect>(m_visibleTileCount, rTileRect); DoSetTileSelection(); } } if ((isLeftMouseReleased || isRightMouseReleased) && isInsideTileScrollArea && rVisualTile.Contains(e.mousePosition) && (m_startDragTileIdxRect.Key == m_endDragTileIdxRect.Key) && // and there is not dragging selection m_rTileScrollSize.Contains(e.mousePosition - m_tilesScrollPos)) // and it's inside the scroll area { Tileset.SelectedTileId = tileId; //Give focus to SceneView to get key events FocusSceneView(); if (isRightMouseReleased) { TilePropertiesWindow.Show(Tileset); } } else if (tile != null && Tileset.SelectedTileId == tileId) { HandlesEx.DrawRectWithOutline(rTileRect, new Color(0f, 0f, 0f, 0.1f), new Color(1f, 1f, 0f, 1f)); } } ++m_visibleTileCount; } m_visibleTileList = visibleTileList; // Draw selection rect if (m_startDragTileIdxRect.Key != m_pointedTileIdxRect.Key /*&& m_startDragTileIdxRect.Key == m_endDragTileIdxRect.Key*/) { Rect rSelection = new Rect(m_startDragTileIdxRect.Value.center, m_pointedTileIdxRect.Value.center - m_startDragTileIdxRect.Value.center); rSelection.Set(Mathf.Min(rSelection.xMin, rSelection.xMax), Mathf.Min(rSelection.yMin, rSelection.yMax), Mathf.Abs(rSelection.width), Mathf.Abs(rSelection.height)); rSelection.xMin -= m_startDragTileIdxRect.Value.width / 2; rSelection.xMax += m_startDragTileIdxRect.Value.width / 2; rSelection.yMin -= m_startDragTileIdxRect.Value.height / 2; rSelection.yMax += m_startDragTileIdxRect.Value.height / 2; HandlesEx.DrawRectWithOutline(rSelection, new Color(0f, 0f, 0f, 0.1f), new Color(1f, 1f, 1f, 1f)); } } } EditorGUILayout.EndScrollView(); if (e.type == EventType.Repaint) { m_rTileScrollArea = GUILayoutUtility.GetLastRect(); m_rTileScrollSize = m_rTileScrollArea; m_rTileScrollSize.position = Vector2.zero; // reset position to the Contains and Overlaps inside the tile scroll view without repositioning the position of local positions if (tileAreaWidth > m_rTileScrollSize.width) { m_rTileScrollSize.height -= GUI.skin.verticalScrollbar.fixedWidth; } if (tileAreaHeight > m_rTileScrollSize.height) { m_rTileScrollSize.width -= GUI.skin.verticalScrollbar.fixedWidth; } } EditorGUILayout.BeginHorizontal(); string sBrushIdLabel = Tileset.SelectedBrushId > 0 ? " (id:" + Tileset.SelectedBrushId + ")" : ""; EditorGUILayout.LabelField("Brush Palette" + sBrushIdLabel, EditorStyles.boldLabel); m_displayBrushReordList = EditorUtils.DoToggleButton("Display List", m_displayBrushReordList); EditorGUILayout.EndHorizontal(); int tileRowLength = (int)(m_rTileScrollSize.width / (Tileset.VisualTileSize.x + visualTilePadding)); if (tileRowLength <= 0) { tileRowLength = 1; } float fBrushesScrollMaxHeight = Screen.height / 4; //commented because m_rTileScrollSize.width.height was changed to Screen.height; fBrushesScrollMaxHeight -= fBrushesScrollMaxHeight % 2; // sometimes because size of tile scroll affects size of brush scroll, the height is dancing between +-1, so this is always taking the pair value float fBrushesScrollHeight = Mathf.Min(fBrushesScrollMaxHeight, 4 + (Tileset.VisualTileSize.y + visualTilePadding) * (1 + (Tileset.Brushes.Count / tileRowLength))); EditorGUILayout.BeginVertical(GUILayout.MinHeight(fBrushesScrollHeight)); if (m_displayBrushReordList) { DisplayBrushReorderableList(); } else { bool isRefreshBrushes = false; m_brushesScrollPos = EditorGUILayout.BeginScrollView(m_brushesScrollPos, m_scrollStyle); { Rect rScrollView = new Rect(0, 0, m_rTileScrollSize.width, 0); tileRowLength = Mathf.Clamp((int)rScrollView.width / (int)(Tileset.VisualTileSize.x + visualTilePadding), 1, tileRowLength); if (Tileset.Brushes != null) { GUILayout.Space((Tileset.VisualTileSize.y + visualTilePadding) * (1 + (Tileset.Brushes.Count - 1) / tileRowLength)); for (int i = 0; i < Tileset.Brushes.Count; ++i) { Tileset.BrushContainer brushCont = Tileset.Brushes[i]; if (brushCont.BrushAsset == null) { isRefreshBrushes = true; continue; } int tx = i % tileRowLength; int ty = i / tileRowLength; Rect rVisualTile = new Rect(2 + tx * (Tileset.VisualTileSize.x + visualTilePadding), 2 + ty * (Tileset.VisualTileSize.y + visualTilePadding), Tileset.VisualTileSize.x, Tileset.VisualTileSize.y); //Fix Missing Tileset reference if (brushCont.BrushAsset.Tileset == null) { Debug.LogWarning("Fixed missing tileset reference in brush " + brushCont.BrushAsset.name + " Id(" + brushCont.Id + ")"); brushCont.BrushAsset.Tileset = Tileset; } uint tileData = Tileset.k_TileData_Empty; if (brushCont.BrushAsset.IsAnimated()) { tileData = brushCont.BrushAsset.GetAnimTileData(); } else { tileData = brushCont.BrushAsset.PreviewTileData(); } TilesetEditor.DoGUIDrawTileFromTileData(rVisualTile, tileData, Tileset, brushCont.BrushAsset.GetAnimUV()); if ((isLeftMouseReleased || isRightMouseReleased || m_dblClick.IsDblClick) && isInsideBrushScrollArea && rVisualTile.Contains(Event.current.mousePosition)) { Tileset.SelectedBrushId = brushCont.Id; RemoveTileSelection(); if (m_dblClick.IsDblClick) { EditorGUIUtility.PingObject(brushCont.BrushAsset); m_selectBrushInInspector = brushCont.BrushAsset; } if (isRightMouseReleased) { TilePropertiesWindow.Show(Tileset); } } else if (Tileset.SelectedBrushId == brushCont.Id) { Rect rSelection = new Rect(2 + tx * (Tileset.VisualTileSize.x + visualTilePadding), 2 + ty * (Tileset.VisualTileSize.y + visualTilePadding), (Tileset.VisualTileSize.x + visualTilePadding), (Tileset.VisualTileSize.y + visualTilePadding)); HandlesEx.DrawRectWithOutline(rSelection, new Color(0f, 0f, 0f, 0.1f), new Color(1f, 1f, 0f, 1f)); } } } if (isRefreshBrushes) { Tileset.RemoveNullBrushes(); } } EditorGUILayout.EndScrollView(); if (e.type == EventType.Repaint) { m_rBrushScrollArea = GUILayoutUtility.GetLastRect(); } } EditorGUILayout.EndVertical(); if (GUILayout.Button("Import all brushes found")) { TilesetEditor.AddAllBrushesFoundInTheProject(Tileset); EditorUtility.SetDirty(Tileset); } }