private void LoadFromXml(string filename) { //Generation settings _generationSettings = new GenerationSettings(); var root = XElement.Load(filename); //locate generation node var generation = root.Element("Generation"); var district = root.Element("Districts"); var terrain = root.Element("Terrain"); if (generation == null) { return; } _generationSettings.UseSeed = bool.Parse(generation.Element("UseSeed").Value); _generationSettings.Seed = int.Parse(generation.Element("Seed").Value); _generationSettings.Width = double.Parse(generation.Element("Width").Value); _generationSettings.Length = double.Parse(generation.Element("Length").Value); _generationSettings.StartX = double.Parse(generation.Element("StartX").Value); _generationSettings.StartY = double.Parse(generation.Element("StartY").Value); _generationSettings.Amount = int.Parse(generation.Element("Amount").Value); _generationSettings.PointAlgorithm = (PointGenerationAlgorithm) Enum.Parse(typeof(PointGenerationAlgorithm), generation.Element("Point").Value); _generationSettings.VoronoiAlgorithm = (VoronoiAlgorithm)Enum.Parse(typeof(VoronoiAlgorithm), generation.Element("Voronoi").Value); var parentname = generation.Element("Parent").Value; _townGenerator.Parent = null; if (parentname != string.Empty) { _townGenerator.Parent = GameObject.Find(parentname); } //Load in terrain settings var splatmaps = new List <SplatTexture>(); foreach (var e in terrain.Element("Splatmaps").Elements()) { var newSplat = new SplatTexture { Texture = AssetDatabase.LoadAssetAtPath <Texture2D>(e.Value), TileSize = float.Parse(e.Attribute("Tiling").Value) }; splatmaps.Add(newSplat); } var trees = new List <GameObject>(); foreach (var e in terrain.Elements("Trees").Elements()) { var prefab = AssetDatabase.LoadAssetAtPath <GameObject>(e.Value); trees.Add(prefab); } var props = new List <GameObject>(); foreach (var e in terrain.Elements("Props").Elements()) { var prefab = AssetDatabase.LoadAssetAtPath <GameObject>(e.Value); props.Add(prefab); } var details = new List <DetailObject>(); foreach (var e in terrain.Elements("Details").Elements()) { var d = new DetailObject(); var type = (DetailType)int.Parse(e.Attribute("Type").Value); switch (type) { case DetailType.Texture: d.Detail = AssetDatabase.LoadAssetAtPath <Texture2D>(e.Value); d.Type = DetailType.Texture; break; case DetailType.GameObject: d.Detail = AssetDatabase.LoadAssetAtPath <GameObject>(e.Value); d.Type = DetailType.GameObject; break; } details.Add(d); } //lakes _terrainEditor.Settings.GenerateLake = bool.Parse(terrain.Element("Lakes").Attribute("generate").Value); _terrainEditor.Settings.WaterPrefab = AssetDatabase.LoadAssetAtPath <GameObject>(terrain.Element("Lakes").Element("lake").Value); _terrainEditor.GetSettings().SplatMaps = splatmaps; _terrainEditor.GetSettings().Trees = trees; _terrainEditor.GetSettings().Props = props; _terrainEditor.GetSettings().Details = details; //Clear previous loaded districts _prefabSelectors.Clear(); foreach (var districtElem in district.Elements()) { //Create district var distictEditor = CreatePrefabSelection(districtElem.Name.ToString()); if (distictEditor != null) { distictEditor.GetSettings().Frequency = int.Parse(districtElem.Element("Frequency").Value); distictEditor.GetSettings().Size = double.Parse(districtElem.Element("Size").Value); distictEditor.GetSettings().Offset = int.Parse(districtElem.Element("Offset").Value); distictEditor.GetSettings().Percentage = double.Parse(districtElem.Element("Interval").Value); //Load in all buildings distictEditor.ResetPrefabs(); foreach (var bElem in districtElem.Element("Buildings").Elements()) { distictEditor.AddPrefab(bElem.Value); } } } }
private void TerrainDetailsGUI() { var windowWidth = _parentWindow.maxSize.x; var spacing = windowWidth * 0.05f; var buttonWidth = windowWidth / 2 - spacing; //Settings.GrassDensity = EditorGUILayout.Slider("Density", Settings.GrassDensity, 2.0f, 32f); //Settings.DetailResolution = EditorGUILayout.IntField("Resolution", Settings.DetailResolution); //Selected detail GUI EditorGUILayout.BeginHorizontal(GUILayout.Width(windowWidth), GUILayout.Height(20)); GUILayout.Space(spacing / 2); _selectedDetailObject.Type = (DetailType)EditorGUILayout.EnumPopup(_selectedDetailObject.Type); switch (_selectedDetailObject.Type) { case DetailType.Texture: _selectedDetailObject.Detail = EditorGUILayout.ObjectField(_selectedDetailObject.Detail, typeof(Texture2D), false, GUILayout.Width(buttonWidth * 1.5f)); break; case DetailType.GameObject: _selectedDetailObject.Detail = EditorGUILayout.ObjectField(_selectedDetailObject.Detail, typeof(GameObject), false, GUILayout.Width(buttonWidth * 1.5f)); break; default: throw new ArgumentOutOfRangeException(); } //EditorGUILayout.LabelField(_selectedDetailLabel); GUILayout.Space(spacing / 2); EditorGUILayout.EndHorizontal(); //Show Added Trees //texture previews of added textures int size = 64; GUILayout.BeginHorizontal(); GUILayout.Space(spacing); //the splatmaps are limited to 4 + 1 road for (int i = 0; i < Settings.Details.Count; ++i) { var detail = Settings.Details[i]; GUILayout.BeginVertical(); string label = ((detail.Type == DetailType.GameObject)?"Mesh ": "Grass ") + i; ; GUILayout.Label(label); var detailTexture = (detail.Type == DetailType.GameObject) ? AssetPreview.GetAssetPreview(detail.Detail) : (Texture2D)detail.Detail; if (GUILayout.Button(detailTexture, GUIStyle.none, GUILayout.Width(size + (size * 0.2f)), GUILayout.Height(size))) { _selectedDetailObject = detail; } GUILayout.EndVertical(); } GUILayout.Space(spacing); GUILayout.EndHorizontal(); //Adding / Removing EditorGUILayout.BeginHorizontal(GUILayout.Width(windowWidth), GUILayout.Height(20)); GUILayout.Space(spacing); if (GUILayout.Button("Add Detail", GUILayout.Width(buttonWidth))) { var detail = new DetailObject(); detail.Detail = _selectedDetailObject.Detail; detail.Type = _selectedDetailObject.Type; Settings.Details.Add(detail); } //remove the selected splatTexture if (GUILayout.Button("Remove Detail", GUILayout.Width(buttonWidth))) { Settings.Details.Remove(_selectedDetailObject); } GUILayout.Space(spacing); EditorGUILayout.EndHorizontal(); }
private void TerrainDetailsGUI() { var windowWidth = _parentWindow.maxSize.x; var spacing = windowWidth * 0.05f; var buttonWidth = windowWidth / 2 - spacing; //Settings.GrassDensity = EditorGUILayout.Slider("Density", Settings.GrassDensity, 2.0f, 32f); //Settings.DetailResolution = EditorGUILayout.IntField("Resolution", Settings.DetailResolution); //Selected detail GUI EditorGUILayout.BeginHorizontal(GUILayout.Width(windowWidth), GUILayout.Height(20)); GUILayout.Space(spacing / 2); _selectedDetailObject.Type = (DetailType)EditorGUILayout.EnumPopup(_selectedDetailObject.Type); switch (_selectedDetailObject.Type) { case DetailType.Texture: _selectedDetailObject.Detail = EditorGUILayout.ObjectField(_selectedDetailObject.Detail, typeof(Texture2D), false, GUILayout.Width(buttonWidth * 1.5f)); break; case DetailType.GameObject: _selectedDetailObject.Detail = EditorGUILayout.ObjectField(_selectedDetailObject.Detail, typeof(GameObject), false, GUILayout.Width(buttonWidth * 1.5f)); break; default: throw new ArgumentOutOfRangeException(); } //EditorGUILayout.LabelField(_selectedDetailLabel); GUILayout.Space(spacing/2); EditorGUILayout.EndHorizontal(); //Show Added Trees //texture previews of added textures int size = 64; GUILayout.BeginHorizontal(); GUILayout.Space(spacing); //the splatmaps are limited to 4 + 1 road for (int i = 0; i < Settings.Details.Count; ++i) { var detail = Settings.Details[i]; GUILayout.BeginVertical(); string label = ((detail.Type == DetailType.GameObject)?"Mesh ": "Grass ") + i; ; GUILayout.Label(label); var detailTexture = (detail.Type == DetailType.GameObject) ? AssetPreview.GetAssetPreview(detail.Detail) : (Texture2D) detail.Detail; if (GUILayout.Button(detailTexture, GUIStyle.none, GUILayout.Width(size + (size*0.2f)), GUILayout.Height(size))) { _selectedDetailObject = detail; } GUILayout.EndVertical(); } GUILayout.Space(spacing); GUILayout.EndHorizontal(); //Adding / Removing EditorGUILayout.BeginHorizontal(GUILayout.Width(windowWidth), GUILayout.Height(20)); GUILayout.Space(spacing); if (GUILayout.Button("Add Detail", GUILayout.Width(buttonWidth))) { var detail = new DetailObject(); detail.Detail = _selectedDetailObject.Detail; detail.Type = _selectedDetailObject.Type; Settings.Details.Add(detail); } //remove the selected splatTexture if (GUILayout.Button("Remove Detail", GUILayout.Width(buttonWidth))) { Settings.Details.Remove(_selectedDetailObject); } GUILayout.Space(spacing); EditorGUILayout.EndHorizontal(); }
private void LoadFromXml(string filename) { //Generation settings _generationSettings = new GenerationSettings(); var root = XElement.Load(filename); //locate generation node var generation = root.Element("Generation"); var district = root.Element("Districts"); var terrain = root.Element("Terrain"); if (generation == null) return; _generationSettings.UseSeed = bool.Parse(generation.Element("UseSeed").Value); _generationSettings.Seed = int.Parse(generation.Element("Seed").Value); _generationSettings.Width = double.Parse(generation.Element("Width").Value); _generationSettings.Length = double.Parse(generation.Element("Length").Value); _generationSettings.StartX = double.Parse(generation.Element("StartX").Value); _generationSettings.StartY = double.Parse(generation.Element("StartY").Value); _generationSettings.Amount = int.Parse(generation.Element("Amount").Value); _generationSettings.PointAlgorithm = (PointGenerationAlgorithm) Enum.Parse(typeof(PointGenerationAlgorithm), generation.Element("Point").Value); _generationSettings.VoronoiAlgorithm = (VoronoiAlgorithm)Enum.Parse(typeof(VoronoiAlgorithm), generation.Element("Voronoi").Value); var parentname = generation.Element("Parent").Value; _townGenerator.Parent = null; if (parentname != string.Empty) { _townGenerator.Parent = GameObject.Find(parentname); } //Load in terrain settings var splatmaps = new List<SplatTexture>(); foreach (var e in terrain.Element("Splatmaps").Elements()) { var newSplat = new SplatTexture { Texture = AssetDatabase.LoadAssetAtPath<Texture2D>(e.Value), TileSize = float.Parse(e.Attribute("Tiling").Value) }; splatmaps.Add(newSplat); } var trees = new List<GameObject>(); foreach (var e in terrain.Elements("Trees").Elements()) { var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(e.Value); trees.Add(prefab); } var props = new List<GameObject>(); foreach (var e in terrain.Elements("Props").Elements()) { var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(e.Value); props.Add(prefab); } var details = new List<DetailObject>(); foreach (var e in terrain.Elements("Details").Elements()) { var d = new DetailObject(); var type = (DetailType)int.Parse(e.Attribute("Type").Value); switch (type) { case DetailType.Texture: d.Detail = AssetDatabase.LoadAssetAtPath<Texture2D>(e.Value); d.Type = DetailType.Texture; break; case DetailType.GameObject: d.Detail = AssetDatabase.LoadAssetAtPath<GameObject>(e.Value); d.Type = DetailType.GameObject; break; } details.Add(d); } //lakes _terrainEditor.Settings.GenerateLake = bool.Parse(terrain.Element("Lakes").Attribute("generate").Value); _terrainEditor.Settings.WaterPrefab = AssetDatabase.LoadAssetAtPath<GameObject>(terrain.Element("Lakes").Element("lake").Value); _terrainEditor.GetSettings().SplatMaps = splatmaps; _terrainEditor.GetSettings().Trees = trees; _terrainEditor.GetSettings().Props = props; _terrainEditor.GetSettings().Details = details; //Clear previous loaded districts _prefabSelectors.Clear(); foreach (var districtElem in district.Elements()) { //Create district var distictEditor = CreatePrefabSelection(districtElem.Name.ToString()); if (distictEditor != null) { distictEditor.GetSettings().Frequency = int.Parse(districtElem.Element("Frequency").Value); distictEditor.GetSettings().Size = double.Parse(districtElem.Element("Size").Value); distictEditor.GetSettings().Offset = int.Parse(districtElem.Element("Offset").Value); distictEditor.GetSettings().Percentage = double.Parse(districtElem.Element("Interval").Value); //Load in all buildings distictEditor.ResetPrefabs(); foreach (var bElem in districtElem.Element("Buildings").Elements()) { distictEditor.AddPrefab(bElem.Value); } } } }