Either a texture or a gameobject
        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);
                    }
                }
            }
        }
示例#2
0
        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();
        }
示例#3
0
        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);
                    }
                }
            }
        }