private void Finish() { state = TerrainQualityManagerState.idle; if (queries != null) { foreach (TerrainQualityManagerQuery query in queries) { query.Dispose(); } queries = null; } queryIndex = 0; if (mode == TerrainQualityManagerModes.singleTerrain) { UpdateDefaultProps(); } else { defAlphamapResolution = alphamapResolution; defBaseMapResolution = baseMapResolution; defDetailResolution = detailResolution; defHeightmapResolution = heightmapResolution; defResolutionPerPatch = resolutionPerPatch; } GC.Collect(); Repaint(); }
private void NextQuery() { queryIndex++; activeQueryIndex = 0; if (queryIndex >= queries.Count) { state = TerrainQualityManagerState.finish; } Repaint(); }
private void OnIdleGUI() { if (availableResolutionsStr == null || availableHeightsStr == null) { availableHeightsStr = availableHeights.Select(h => h.ToString()).ToArray(); availableResolutionsStr = availableResolutions.Select(r => r.ToString()).ToArray(); } DrawToolbar(); EditorGUI.BeginChangeCheck(); mode = (TerrainQualityManagerModes)EditorGUILayout.EnumPopup("Mode: ", mode); if (EditorGUI.EndChangeCheck()) { if (mode != TerrainQualityManagerModes.singleTerrain) { terrain = null; UpdateDefaultProps(); } } if (GUILayout.Button("Refresh Default Values")) { UpdateDefaultProps(); GUI.FocusControl(null); } scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition); if (mode == TerrainQualityManagerModes.singleTerrain) { OnGUISingle(); } else { OnGUIMulti(); } if (mode != TerrainQualityManagerModes.allTerrainsInScene) { DrawNeighborWarning(); } EditorGUILayout.EndScrollView(); if (GUILayout.Button("Apply")) { state = TerrainQualityManagerState.prepare; } }
private void Prepare() { TerrainData[] terrainDatas = null; if (mode == TerrainQualityManagerModes.singleTerrain) { if (terrain == null) { EditorUtility.DisplayDialog("Error", "Terrain not selected.", "OK"); state = TerrainQualityManagerState.idle; return; } terrainDatas = new[] { terrain.terrainData }; } else if (mode == TerrainQualityManagerModes.allTerrainsInScene) { Terrain[] terrains = FindObjectsOfType(typeof(Terrain)) as Terrain[]; if (terrains != null) { terrainDatas = terrains.Select(t => t.terrainData).ToArray(); } } else if (mode == TerrainQualityManagerModes.allTerrainsInProject) { string[] terrainsGUID = AssetDatabase.FindAssets("t:terrain"); terrainDatas = new TerrainData[terrainsGUID.Length]; for (int i = 0; i < terrainsGUID.Length; i++) { string assetPath = AssetDatabase.GUIDToAssetPath(terrainsGUID[i]); terrainDatas[i] = AssetDatabase.LoadMainAssetAtPath(assetPath) as TerrainData; } } if (terrainDatas == null) { state = TerrainQualityManagerState.idle; return; } bool changeHeightmap = false; foreach (TerrainData t in terrainDatas) { if (t.heightmapResolution != heightmapResolution) { changeHeightmap = true; TerrainQualityManagerQuery query = AddQuery("Resize heightmap.", t); if (t.heightmapResolution > heightmapResolution) { query.method = DownScaleHeightmap; } else { query.method = UpScaleHeightmap; } } if (t.alphamapResolution != alphamapResolution) { TerrainQualityManagerQuery query = AddQuery("Resize alphamap.", t); if (t.alphamapResolution > alphamapResolution) { query.method = DownScaleAlphamap; } else { query.method = UpScaleAlphamap; } } if (t.detailResolution != detailResolution) { AddQuery("Resize detailmap.", t).method = ScaleDetailmap; } if (t.baseMapResolution != baseMapResolution) { t.baseMapResolution = baseMapResolution; } } if (queries == null || queries.Count == 0) { EditorUtility.DisplayDialog("Error", "Nothing to do.", "OK"); Finish(); return; } Undo.RegisterCompleteObjectUndo(terrainDatas, "Change Terrain Maps Resolution"); if (changeHeightmap && mode == TerrainQualityManagerModes.allTerrainsInScene) { AddQuery("Update Neighbors").method = UpdateNeighbors; } activeQueryIndex = 0; queryIndex = 0; state = TerrainQualityManagerState.working; }