//ref: http://answers.unity3d.com/questions/1193700/what-is-the-proper-way-to-draw-previews-for-custom.html /// <summary> /// Creates a Texture2D with a preview of a tilemap or tilemapGroup. In case you use a tilemapGroup, the tilemap will be used as reference for the PixelsPerUnits. /// </summary> /// <param name="tilemap"></param> /// <param name="tilemapGroup"></param> /// <returns></returns> public static Texture2D CreateTilemapGroupPreviewTexture(STETilemap tilemap, TilemapGroup tilemapGroup = null) { float pixelToUnits = tilemap.Tileset.TilePxSize.x / tilemap.CellSize.x; Bounds tilemapGroupBounds = tilemap.MapBounds; if (tilemapGroup) { tilemapGroup.IterateTilemapWithAction((STETilemap tmap) => tilemapGroupBounds.Encapsulate(tmap.MapBounds)); } Vector2 size = tilemapGroupBounds.size * pixelToUnits; Camera previewCamera = Camera.main ? Camera.main : Object.FindObjectOfType <Camera>(); previewCamera = GameObject.Instantiate(previewCamera); s_previewCamera = previewCamera; RenderTexture rendTextr = new RenderTexture((int)size.x, (int)size.y, 32, RenderTextureFormat.ARGB32); rendTextr.Create(); previewCamera.transform.position = tilemap.transform.TransformPoint(new Vector3(tilemapGroupBounds.center.x, tilemapGroupBounds.center.y, -10)); RenderTexture savedActiveRT = RenderTexture.active; RenderTexture savedCamTargetTexture = previewCamera.targetTexture; RenderTexture.active = rendTextr; previewCamera.targetTexture = rendTextr; previewCamera.orthographicSize = (previewCamera.pixelRect.height) / (2f * pixelToUnits); previewCamera.Render(); Texture2D outputTexture = new Texture2D((int)size.x, (int)size.y, TextureFormat.ARGB32, false); outputTexture.ReadPixels(new Rect(0, 0, (int)size.x, (int)size.y), 0, 0); outputTexture.Apply(); previewCamera.targetTexture = savedCamTargetTexture; RenderTexture.active = savedActiveRT; Object.DestroyImmediate(rendTextr); Object.DestroyImmediate(previewCamera.gameObject); s_previewCamera = null; return(outputTexture); }
private void DoWindow(int id) { Event e = Event.current; STETilemap defaultTilemap = m_target.GetDefaultTilemapForCurrentTileSelection(); GUILayout.BeginArea(new Rect(0f, EditorGUIUtility.singleLineHeight, m_defaultTilemapsWindowRect.width, m_defaultTilemapsWindowRect.height)); GUILayout.Label("Default Tilemap: " + (defaultTilemap? "<b>" + defaultTilemap.name + "</b>" : "<none>"), STEditorStyles.Instance.richLabel); if (GUILayout.Button("Set Default Tilemap <b>(For the Palette Selection)</b>", STEditorStyles.Instance.richButton)) { if (m_target.SelectedTilemap && m_target.SelectedTilemap.Tileset && m_target.SelectedTilemap.Tileset.TileSelection != null) { foreach (uint tileData in m_target.SelectedTilemap.Tileset.TileSelection.selectionData) { SetDefaultTilemapFromTileData(m_target.SelectedTilemap, 0, 0, tileData); } } else { m_target.SetDefaultTilemapForCurrentSelectedTileOrBrush(); } } if (GUILayout.Button("Remove Default Tilemap <b>(For the Palette Selection)</b>", STEditorStyles.Instance.richButton)) { m_target.ClearDefaultTilemapForCurrentSelectedTileOrBrush(); } EditorGUILayout.Space(); if (GUILayout.Button("Set Default Tilemap <b>(For the Tiles in the Tilemap)</b>", STEditorStyles.Instance.richButton)) { TilemapUtils.IterateTilemapWithAction(m_target.SelectedTilemap, SetDefaultTilemapFromTileData); } if (GUILayout.Button("Set Default Tilemap <b>(For all Tilemaps)</b>", STEditorStyles.Instance.richButton)) { m_target.IterateTilemapWithAction((STETilemap tilemap) => { TilemapUtils.IterateTilemapWithAction(tilemap, SetDefaultTilemapFromTileData); }); } EditorGUILayout.Space(); /* * if (GUILayout.Button("Clear Default Tilemap <b>(All Tiles in the Tilemap)</b>", STEditorStyles.Instance.richButton)) * TilemapUtils.IterateTilemapWithAction(m_target.SelectedTilemap, (STETilemap tilemap, int gx, int gy, uint tileData) => * { * int brushId = Tileset.GetBrushIdFromTileData(tileData); * if (brushId != Tileset.k_BrushId_Default) * m_target.ClearBrushDefaultTilemap(brushId); * else * { * int tileId = Tileset.GetTileIdFromTileData(tileData); * if (tileId != Tileset.k_TileId_Empty) * m_target.ClearTileDefaultTilemap(tileId); * } * }); */ if (GUILayout.Button("Clear Default Tilemap Data <b>(For all Tiles)</b>", STEditorStyles.Instance.richButton)) { m_target.ClearAllDefaultTilemapData(); } GUILayout.EndArea(); if (e.isMouse && m_defaultTilemapsWindowRect.Contains(e.mousePosition)) { if (e.type == EventType.MouseDown && e.mousePosition.y <= EditorGUIUtility.singleLineHeight) { m_defaultTilemapWindowMinimized = !m_defaultTilemapWindowMinimized; } e.Use(); } }