using System; using System.Collections.Generic; using InfinityCode.RealWorldTerrain; using InfinityCode.RealWorldTerrain.Generators; using InfinityCode.RealWorldTerrain.Windows; using UnityEditor; using UnityEngine; public class RegenerateBuildingsWindow : EditorWindow { public List items; private bool isIdle = true; private Vector2 scrollPosition; private int itemIndex = -1; private void OnGUI() { if (isIdle) OnIdleGUI(); else OnGenerateGUI(); } private void OnIdleGUI() { if (items == null) items = new List(); 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(); } private void PrepareStart() { if (items == null || items.Count == 0) return; isIdle = false; itemIndex = -1; RealWorldTerrainWindow.OnCaptureCompleted += OnCaptureCompleted; RealWorldTerrainWindow.OnCaptureCanceled += OnCaptureCanceled; GenerateNextItem(); } private void OnCaptureCanceled() { Finish(); } private void OnCaptureCompleted() { try { RealWorldTerrainItem item = items[itemIndex]; string path = item.container.folder; path += "/" + RealWorldTerrainBuildingGenerator.baseContainer.name + ".prefab"; PrefabUtility.CreatePrefab(path, RealWorldTerrainBuildingGenerator.baseContainer); DestroyImmediate(RealWorldTerrainBuildingGenerator.baseContainer); } catch (Exception e) { Debug.Log(e.Message + "\n" + e.StackTrace); } EditorApplication.update += GenerateNextItem; } private void GenerateNextItem() { EditorApplication.update -= GenerateNextItem; itemIndex++; if (itemIndex >= items.Count) { Finish(); return; } RealWorldTerrainWindow.OpenWindow(RealWorldTerrainGenerateType.additional, items[itemIndex]); RealWorldTerrainWindow.prefs.generateBuildings = true; // Here you can specify additional generation settings. RealWorldTerrainWindow.StartCapture(); } private void Finish() { EditorApplication.update -= GenerateNextItem; RealWorldTerrainWindow.OnCaptureCompleted -= OnCaptureCompleted; RealWorldTerrainWindow.OnCaptureCanceled -= OnCaptureCanceled; isIdle = true; Repaint(); } private void OnGenerateGUI() { EditorGUILayout.LabelField("Generating, please wait ..."); if (GUILayout.Button("Cancel")) RealWorldTerrainWindow.CancelCapture(); } [MenuItem("Window/Infinity Code/Real World Terrain/Tools/Regenerate Buildings")] public static void OpenWindow() { GetWindow("Regenerate Buildings"); } }