#if UNITY_EDITOR using UnityEditor; using UnityEngine; using Wwise.Wooduan.Components; // using Wwise.Wooduan.Core; // using System; // using System.Collections.Generic; // using System.Linq; // using System.Text; // using System.Xml; // using System.Xml.Linq; // using XmlConfig; namespace Wwise.Wooduan.Editor.Components { [UnityEditor.CustomEditor(typeof(OpenWorldAmbientSound))] public class OpenWorldAmbientSoundInspector : UnityEditor.Editor { private OpenWorldAmbientSound _component; // private int _matrixRadius = 5; // private BrushMode _brushMode = BrushMode.Single; // private int _brushSize = 2; // private string _xmlPath; // private XElement _xTiles; // public readonly List _undoModifies = new List(); // private enum BrushMode // { // Single, // Brush, // FloodFill // } private void OnEnable() { _component = target as OpenWorldAmbientSound; _component.OnCurrentTileChanged = OnCurrentTileChanged; } private void OnCurrentTileChanged() { Repaint(); } public override void OnInspectorGUI() { base.OnInspectorGUI(); if (!Application.isPlaying) return; if (_component.terrainDataImage) { EditorGUILayout.LabelField("Current Tile Data", EditorStyles.boldLabel); using (new UnityEditor.EditorGUILayout.VerticalScope("box")) { EditorGUILayout.LabelField("X = " + _component.CurrentX); EditorGUILayout.LabelField("Y = " + _component.CurrentY); EditorGUILayout.LabelField(_component.RedTerrainName + " = " + _component.CurrentTerrainColor.r); EditorGUILayout.LabelField(_component.GreenTerrainName + " = " + _component.CurrentTerrainColor.g); EditorGUILayout.LabelField(_component.BlueTerrainName + " = " + _component.CurrentTerrainColor.b); EditorGUILayout.LabelField("Elevation = " + _component.CurrentElevation); EditorGUILayout.LabelField("Player Altitude = " + _component.PlayerAltitude); } return; } // if (_component.CurrentTile != null) // { // EditorGUILayout.LabelField("Current Tile Data", EditorStyles.boldLabel); // using (new UnityEditor.EditorGUILayout.VerticalScope("box")) // { // EditorGUILayout.LabelField("X = " + _component.CurrentX); // EditorGUILayout.LabelField("Y = " + _component.CurrentY); // EditorGUILayout.LabelField("Terrain = " + _component.CurrentTile.R); // EditorGUILayout.LabelField("Elevation = " + _component.CurrentTile.A); // } // // var elevation = EditorGUILayout.IntSlider("Elevation", _component.CurrentTile.A, 0, 255); // if (elevation != _component.CurrentTile.A) // _component.ModifyElevation(_component.CurrentTile, Elevation); // } // // GUILayout.BeginHorizontal(); // EditorGUILayout.LabelField("Tile Matrix", EditorStyles.boldLabel); // if (GUILayout.Button("Set to Majority")) // SetToMajority(); // GUILayout.EndHorizontal(); // // using (new UnityEditor.EditorGUILayout.VerticalScope("box")) // { // DrawTileMatrix(); // _matrixRadius = EditorGUILayout.IntSlider("Matrix Size", _matrixRadius, 3, 7); // _brushMode = (BrushMode)EditorGUILayout.EnumPopup("Brush Mode", _brushMode); // if (_brushMode == BrushMode.Brush) // _brushSize = EditorGUILayout.IntSlider("Brush Size", _brushSize, 2, 4); // } // // GUILayout.BeginHorizontal(); // EditorGUILayout.LabelField("Tile Modifications", EditorStyles.boldLabel); // if (GUILayout.Button("Undo")) // Undo(); // if (GUILayout.Button("Save XML")) // SaveXML(); // GUILayout.EndHorizontal(); // using (new UnityEditor.EditorGUILayout.VerticalScope("box")) // { // foreach (var mod in _component.TileModifications) // { // EditorGUILayout.LabelField(string.Format("[{0}, {1}] T: {2} => {3}, A: {4} => {5}", // mod.X, mod.Y, mod.R, mod.newR, mod.A, mod.newA)); // } // } } // private void DrawTileMatrix() // { // var defaultColor = GUI.backgroundColor; // for (var deltaY = _matrixRadius; deltaY >= -_matrixRadius; deltaY--) // { // var y = _component.CurrentY + deltaY; // GUILayout.BeginHorizontal(); // for (var deltaX = -_matrixRadius; deltaX <= _matrixRadius; deltaX++) // { // var x = _component.CurrentX + deltaX; // var tile = _component.GetSoundTileByCoordinate(x, y); // if (tile == null) // { // GUI.backgroundColor = Color.gray; // GUILayout.Label(GUIContent.none, EditorStyles.toolbarButton, GUILayout.Width(18)); // } // else // { // SetTileColor(tile); // if (GUILayout.Button(deltaX == 0 && deltaY == 0 ? "★" : "", EditorStyles.toolbarButton, GUILayout.Width(18))) // OnBrushClicked(x, y, tile); // } // } // GUILayout.EndHorizontal(); // } // GUI.backgroundColor = defaultColor; // } // private void OnBrushClicked(int x, int y, AmbientSoundDataTile tileClicked) // { // _undoModifies.Clear(); // var nextTerrain = GetNextTerrain(tileClicked.R); // switch (_brushMode) // { // case BrushMode.Single: // ModifyTile(tileClicked, nextTerrain); // break; // case BrushMode.Brush: // for (var i = -(_brushSize - 1); i < _brushSize; i++) // { // for (var j = -(_brushSize - 1); j < _brushSize; j++) // { // var tileOnBrush = _component.GetSoundTileByCoordinate(x + i, y + j); // if (tileOnBrush != null) // ModifyTile(tileOnBrush, nextTerrain); // } // } // break; // case BrushMode.FloodFill: // FloodFill(x, y, tileClicked.R, nextTerrain); // break; // } // } // private void FloodFill(int x, int y, string originalTerrain, string newTerrain) // { // if (x < _component.CurrentX - _matrixRadius || x > _component.CurrentX + _matrixRadius || // y < _component.CurrentY - _matrixRadius || y > _component.CurrentY + _matrixRadius) // return; // var tile = _component.GetSoundTileByCoordinate(x, y); // if (tile.R != originalTerrain) // return; // ModifyTile(tile, newTerrain); // FloodFill(x - 1, y, originalTerrain, newTerrain); // FloodFill(x + 1, y, originalTerrain, newTerrain); // FloodFill(x, y - 1, originalTerrain, newTerrain); // FloodFill(x, y + 1, originalTerrain, newTerrain); // } // // private void SetToMajority() // { // _undoModifies.Clear(); // var tileDict = new Dictionary(); // var tiles = new List(); // for (var deltaY = _matrixRadius; deltaY >= -_matrixRadius; deltaY--) // { // var y = _component.CurrentY + deltaY; // for (var deltaX = -_matrixRadius; deltaX <= _matrixRadius; deltaX++) // { // var x = _component.CurrentX + deltaX; // var tile = _component.GetSoundTileByCoordinate(x, y); // if (tileDict.ContainsKey(tile.R)) // tileDict[tile.R]++; // else // tileDict[tile.R] = 1; // tiles.Add(tile); // } // } // string majorityTile = ""; // var majorityCount = 0; // foreach (var data in tileDict) // { // if (data.Value > majorityCount) // { // majorityTile = data.Key; // majorityCount = data.Value; // } // } // // foreach (var tile in tiles) // { // if (tile.R != majorityTile) // ModifyTile(tile, majorityTile); // } // } // // private void ModifyTile(AmbientSoundDataTile tile, string newTerrain) // { // var modify = new AmbientSoundDataTileModify() // { // X = tile.X, // Y = tile.Y, // R = tile.R, // newR = newTerrain // }; // _undoModifies.Add(modify); // _component.ModifyTerrain(tile, newTerrain); // } // // private string GetNextTerrain(string currentTerrain) // { // switch (currentTerrain) // { // case "Sand": // return "Grass"; // case "Grass": // return "Water"; // case "Water": // return "None"; // case "None": // return "Sand"; // } // return "None"; // } // // private void SetTileColor(AmbientSoundDataTile tile) // { // switch (tile.R) // { // case "Sand": // GUI.backgroundColor = Color.yellow; // break; // case "Grass": // GUI.backgroundColor = Color.green; // break; // case "Water": // GUI.backgroundColor = Color.blue; // break; // case "None": // GUI.backgroundColor = Color.white; // break; // } // GUI.backgroundColor = new Color(GUI.backgroundColor.r, GUI.backgroundColor.g, GUI.backgroundColor.b, Mathf.Clamp01(tile.A / 255f + 0.5f)); // } // // private void Undo() // { // foreach (var mod in _undoModifies) // { // var tile = _component.GetSoundTileByCoordinate(mod.X, mod.Y); // _component.ModifyTerrain(tile, mod.R); // } // _undoModifies.Clear(); // } // // private void SaveXML() // { // _xTiles = null; // _xmlPath = EditorUtility.OpenFilePanel("Import from", Application.dataPath, "xml"); // if (!string.IsNullOrEmpty(_xmlPath)) // _xTiles = XDocument.Load(_xmlPath).Root.Element("tiles"); // // foreach (var mod in _component.TileModifications) // { // var xTile = FindTileElement(mod.X, mod.Y); // if (xTile != null) // { // var xTerrain = xTile.Element("R"); // if (xTerrain != null) // xTerrain.SetValue(mod.newR); // var xElevation = xTile.Element("A"); // if (xElevation != null) // xElevation.SetValue(mod.newA); // } // } // var settings = new XmlWriterSettings // { // Encoding = new UTF8Encoding(false), // Indent = true // }; // var xmlWriter = XmlWriter.Create(_xmlPath, settings); // _xTiles.Parent.Save(xmlWriter); // xmlWriter.Flush(); // xmlWriter.Close(); // _component.TileModifications.Clear(); // } // // private XElement FindTileElement(int x, int y) // { // if (_xTiles != null) // { // foreach (var tile in _xTiles.Elements("tile")) // { // if (tile.Element("X").Value == x.ToString()) // { // if (tile.Element("Y").Value == y.ToString()) // return tile; // } // } // } // return null; // } } } #endif