Пример #1
0
    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();
    }
Пример #2
0
 private void NextQuery()
 {
     queryIndex++;
     activeQueryIndex = 0;
     if (queryIndex >= queries.Count)
     {
         state = TerrainQualityManagerState.finish;
     }
     Repaint();
 }
Пример #3
0
    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;
        }
    }
Пример #4
0
    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;
    }