using System.Collections.Generic; using InfinityCode.RealWorldTerrain; using InfinityCode.RealWorldTerrain.Windows; using UnityEditor; using UnityEngine; public class RegenerateTexturesWindow : EditorWindow { public List items; private int itemIndex = -1; private bool isIdle = true; private Vector2 scrollPosition; private int width = 1024; private int height = 1024; private void Finish() { EditorApplication.update -= GenerateNextItem; RealWorldTerrainWindow.OnCaptureCompleted -= OnCaptureCompleted; RealWorldTerrainWindow.OnCaptureCanceled -= OnCaptureCanceled; isIdle = true; Repaint(); } private void GenerateNextItem() { EditorApplication.update -= GenerateNextItem; itemIndex++; if (itemIndex >= items.Count) { Finish(); return; } RealWorldTerrainWindow.OpenWindow(RealWorldTerrainGenerateType.texture, items[itemIndex]); RealWorldTerrainWindow.prefs.generateTextures = true; RealWorldTerrainWindow.prefs.textureSize = new RealWorldTerrainVector2i(width, height); // Here you can specify additional generation settings. RealWorldTerrainWindow.StartCapture(); } private void OnCaptureCanceled() { Finish(); } private void OnCaptureCompleted() { EditorApplication.update += GenerateNextItem; } private void OnGUI() { if (isIdle) OnIdleGUI(); else OnGenerateGUI(); } private void OnGenerateGUI() { EditorGUILayout.LabelField("Generating, please wait ..."); if (GUILayout.Button("Cancel")) RealWorldTerrainWindow.CancelCapture(); } private void OnIdleGUI() { if (items == null) items = new List(); EditorGUILayout.LabelField("Drop here...", GUI.skin.box, GUILayout.Height(100), GUILayout.ExpandWidth(true)); Rect rect = GUILayoutUtility.GetLastRect(); Event e = Event.current; if (rect.Contains(e.mousePosition)) { if (e.type == EventType.DragPerform) { DragAndDrop.AcceptDrag(); Object[] objects = DragAndDrop.objectReferences; if (objects != null && objects.Length > 0) { for (int i = 0; i < objects.Length; i++) { GameObject go = objects[i] as GameObject; if (go == null) continue; RealWorldTerrainItem item = go.GetComponent(); if (item != null && !items.Contains(item)) items.Add(item); } } e.Use(); Repaint(); } else if (e.type == EventType.DragUpdated) { DragAndDrop.visualMode = DragAndDropVisualMode.Copy; } } width = EditorGUILayout.IntField("Width", width); height = EditorGUILayout.IntField("Height", height); EditorGUILayout.LabelField("Items"); bool hasNull = false; scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition); for (int i = 0; i < items.Count; i++) { items[i] = EditorGUILayout.ObjectField(i + 1 + ": ", items[i], typeof(RealWorldTerrainItem), true) as RealWorldTerrainItem; if (items[i] == null) hasNull = true; } if (hasNull) items.RemoveAll(i => i == null); RealWorldTerrainItem newItem = EditorGUILayout.ObjectField(items.Count + 1 + ": ", null, typeof(RealWorldTerrainItem), true) as RealWorldTerrainItem; if (newItem != null) items.Add(newItem); EditorGUILayout.EndScrollView(); if (GUILayout.Button("Start")) PrepareStart(); } [MenuItem("Window/Infinity Code/Real World Terrain/Tools/Regenerate Textures")] public static void OpenWindow() { GetWindow("Regenerate Textures"); } private void PrepareStart() { if (items == null || items.Count == 0) return; isIdle = false; itemIndex = -1; RealWorldTerrainWindow.OnCaptureCompleted += OnCaptureCompleted; RealWorldTerrainWindow.OnCaptureCanceled += OnCaptureCanceled; GenerateNextItem(); } }