void Inspect(GalaxyMapLayerData layer) { layer.EdgeReduction = FloatField("Edge Reduction", layer.EdgeReduction); layer.CoreBoost = FloatField("Core Boost", layer.CoreBoost); layer.CoreBoostOffset = FloatField("Core Boost Offset", layer.CoreBoostOffset); layer.CoreBoostPower = FloatField("Core Boost Power", layer.CoreBoostPower); layer.NoisePosition = FloatField("Noise Position", layer.NoisePosition); layer.NoiseOffset = FloatField("Noise Offset", layer.NoiseOffset); layer.NoiseAmplitude = FloatField("Noise Amplitude", layer.NoiseAmplitude); layer.NoiseGain = FloatField("Noise Gain", layer.NoiseGain); layer.NoiseLacunarity = FloatField("Noise Lacunarity", layer.NoiseLacunarity); layer.NoiseOctaves = IntField("Noise Octaves", layer.NoiseOctaves); layer.NoiseFrequency = FloatField("Noise Frequency", layer.NoiseFrequency); layer.SpokeOffset = FloatField("Spoke Offset", layer.SpokeOffset); layer.SpokeScale = FloatField("Spoke Scale", layer.SpokeScale); }
public override void OnInspectorGUI() { var galaxy = target as Galaxy; if (_currentLayer == null) { _currentLayer = galaxy.MapData.StarDensity; } if (Screen.width != _width) { _width = Screen.width; _starTex = new Texture2D(_width, _width, TextureFormat.ARGB32, false); _linkTex = new Texture2D(_width, _width, TextureFormat.ARGB32, false); RenderStars(); RenderLinks(); } GUILayout.Label("Preview", EditorStyles.boldLabel); _galaxyMat.SetFloat("Arms", galaxy.MapData.GlobalData.Arms); _galaxyMat.SetFloat("Twist", galaxy.MapData.GlobalData.Twist); _galaxyMat.SetFloat("TwistPower", galaxy.MapData.GlobalData.TwistPower); _galaxyMat.SetFloat("SpokeOffset", _currentLayer.SpokeOffset); _galaxyMat.SetFloat("SpokeScale", _currentLayer.SpokeScale); _galaxyMat.SetFloat("CoreBoost", _currentLayer.CoreBoost); _galaxyMat.SetFloat("CoreBoostOffset", _currentLayer.CoreBoostOffset); _galaxyMat.SetFloat("CoreBoostPower", _currentLayer.CoreBoostPower); _galaxyMat.SetFloat("EdgeReduction", _currentLayer.EdgeReduction); _galaxyMat.SetFloat("NoisePosition", _currentLayer.NoisePosition); _galaxyMat.SetFloat("NoiseAmplitude", _currentLayer.NoiseAmplitude); _galaxyMat.SetFloat("NoiseOffset", _currentLayer.NoiseOffset); _galaxyMat.SetFloat("NoiseGain", _currentLayer.NoiseGain); _galaxyMat.SetFloat("NoiseLacunarity", _currentLayer.NoiseLacunarity); _galaxyMat.SetFloat("NoiseFrequency", _currentLayer.NoiseFrequency); var rect = GetControlRect(false, _width); EditorGUI.DrawPreviewTexture(rect, _white, _galaxyMat); if (_drawLinks) { EditorGUI.DrawPreviewTexture(rect, _linkTex, _transparent); } if (_drawStars) { EditorGUI.DrawPreviewTexture(rect, _starTex, _transparent); } _drawStars = ToggleLeft($"Display {_stars.Count()} Stars", _drawStars); _drawResource = ToggleLeft("Display Resources", _drawResource); _drawLinks = ToggleLeft($"Display {_starLinks.Count} Links", _drawLinks); GUILayout.Space(10); // Show default inspector property editor DrawDefaultInspector(); BeginVertical("Box"); EditorGUI.indentLevel++; GUILayout.Label(_currentLayerName); Inspect(_currentLayer); EditorGUI.indentLevel--; EndVertical(); BeginVertical("Box"); EditorGUI.indentLevel++; _showResourceMaps = Foldout(_showResourceMaps, "Resource Density Maps"); if (_showResourceMaps) { EditorGUI.indentLevel++; foreach (var resourceDensity in galaxy.MapData.ResourceDensities) { BeginHorizontal(); resourceDensity.Name = DelayedTextField(resourceDensity.Name); if (GUILayout.Button("Inspect")) { _currentLayer = resourceDensity; } if (GUILayout.Button("Copy")) { galaxy.MapData.ResourceDensities.Add(resourceDensity.Copy()); } EndHorizontal(); } EditorGUI.indentLevel--; if (GUILayout.Button("Add New Resource")) { galaxy.MapData.ResourceDensities.Add(new GalaxyMapLayerData() { Name = "New Resource" }); } } else if (_currentLayer != galaxy.MapData.StarDensity) { _currentLayerName = "Star Density"; _currentLayer = galaxy.MapData.StarDensity; } EditorGUI.indentLevel--; EndVertical(); BeginVertical("Box"); EditorGUI.indentLevel++; _showStarEditor = Foldout(_showStarEditor, "Star Tools"); if (_showStarEditor) { _hilbertOrder = IntField("Hilbert Order", _hilbertOrder); _starCount = IntField("Star Count", _starCount); //_hilbertIndex = (ulong) EditorGUILayout.IntField("Hilbert Index", (int) _hilbertIndex); if (GUILayout.Button("Evaluate Hilbert Curve")) { var points = EvaluateHilbert(_hilbertOrder, false); Debug.Log($"Hilbert curve has {points.Count()} points, resolution {Mathf.RoundToInt(points.Max(p=>p.x))+1}"); } _minStarDistance = FloatField("Minimum Star Distance", _minStarDistance); if (GUILayout.Button("Generate Stars")) { var points = EvaluateHilbert(_hilbertOrder).ToArray(); var stars = new List <Vector2>(); int bail = 0; while (stars.Count < _starCount && bail < 10) { var accum = 0f; foreach (var hp in points.Select(p => p + Random.insideUnitCircle * ((points[0] - points[1]).magnitude / 2))) { var den = galaxy.MapData.StarDensity.Evaluate(hp, galaxy.MapData.GlobalData); if (!float.IsNaN(den)) { accum += saturate(den) * Random.value; } // else // Debug.Log($"Density at ({hp.x},{hp.y}) is NaN"); if (accum > 1 && (!stars.Any() || stars.Min(s => (s - hp).magnitude) > _minStarDistance)) { stars.Add(hp); accum = 0; } //Debug.Log($"Accumulator: {accum}"); } bail++; } Debug.Log($"Generated {stars.Count} stars."); _stars = stars; RenderStars(); } if (_stars.Any()) { _maxLinkLength = FloatField("Max Link Length", _maxLinkLength); if (GUILayout.Button("Generate Star Links")) { _voronoiMesh = VoronoiMesh <Vertex2, Cell2, VoronoiEdge <Vertex2, Cell2> > .Create(_stars.Select(s => new Vertex2(s.x, s.y)).ToList()); _starLinks.Clear(); // Each cell in this collection represents one of the triangle faces of the Delaunay Triangulation foreach (var cell in _voronoiMesh.Vertices) { var links = new[] { new VoronoiLink(cell.Vertices[0], cell.Vertices[1]), new VoronoiLink(cell.Vertices[0], cell.Vertices[2]), new VoronoiLink(cell.Vertices[2], cell.Vertices[1]) }; _starLinks.AddRange(links.Where(l => !_starLinks.ContainsLine(l) && l.Length < _maxLinkLength)); RenderLinks(); } } if (_starLinks.Any()) { _linkFilter = FloatField("Link Filter Percentage", _linkFilter); if (GUILayout.Button("Filter Star Links")) { var bail = 0; var count = _starLinks.Count * Mathf.Clamp01(_linkFilter); var deadLinks = new List <VoronoiLink>(); for (int i = 0; i < count && bail < count * 10; bail++) { var link = _starLinks.ElementAt(Random.Range(0, _starLinks.Count)); if (deadLinks.Contains(link)) { continue; } var mapMinusLink = _starLinks.Where(l => !l.Equals(link)).ToArray(); if (!mapMinusLink.ConnectedRegion(link.point1).Contains(link.point2)) { deadLinks.Add(link); } else { _starLinks.Remove(link); i++; } //if (_starLinks.Count(sl => sl.ContainsPoint(link.point1)) > 1 && _starLinks.Count(sl => sl.ContainsPoint(link.point2)) > 1) } RenderLinks(); } if (GUILayout.Button("Save Star Data")) { galaxy.MapData.Stars = _stars.Select(s => new StarData { Position = s }).ToList(); foreach (var star in galaxy.MapData.Stars) { star.Links.Clear(); star.Links.AddRange(_starLinks.Where(sl => (sl.point1.ToVector2() - star.Position).sqrMagnitude < float.Epsilon) .Select(sl => galaxy.MapData.Stars.IndexOf(galaxy.MapData.Stars.First(s => (sl.point2.ToVector2() - s.Position).sqrMagnitude < float.Epsilon)))); star.Links.AddRange(_starLinks.Where(sl => (sl.point2.ToVector2() - star.Position).sqrMagnitude < float.Epsilon) .Select(sl => galaxy.MapData.Stars.IndexOf(galaxy.MapData.Stars.First(s => (sl.point1.ToVector2() - s.Position).sqrMagnitude < float.Epsilon)))); } } if (GUILayout.Button("Connect to RethinkDB")) { _connection = R.Connection().Hostname(EditorPrefs.GetString("RethinkDB.URL")).Port(RethinkDBConstants.DefaultPort).Timeout(60).Connect(); } EditorGUI.BeginDisabledGroup(_connection == null); if (GUILayout.Button("Drop Galaxy Table")) { R.Db("Aetheria").TableDrop("Galaxy").Run(_connection); } if (GUILayout.Button("Create Galaxy Table")) { R.Db("Aetheria").TableCreate("Galaxy").Run(_connection); } EditorGUI.BeginDisabledGroup(!galaxy.MapData.Stars.Any()); if (GUILayout.Button("Upload Star Data")) { Converter.Serializer.Converters.Add(new MathJsonConverter()); JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = new List <JsonConverter> { new MathJsonConverter(), Converter.DateTimeConverter, Converter.BinaryConverter, Converter.GroupingConverter, Converter.PocoExprConverter } }; var starIDs = new Dictionary <StarData, Guid>(); foreach (var star in galaxy.MapData.Stars) { starIDs[star] = Guid.NewGuid(); } foreach (var star in galaxy.MapData.Stars) { R.Db("Aetheria").Table("Galaxy").Insert(new ZoneData { ID = starIDs[star], Name = starIDs[star].ToString().Substring(0, 8), Wormholes = star.Links.Select(i => starIDs[galaxy.MapData.Stars[i]]).ToList(), Position = star.Position }).Run(_connection); } //galaxy.MapData.GlobalData.MapLayers["StarDensity"] = galaxy.MapData.StarDensity.ID = Guid.NewGuid(); galaxy.MapData.StarDensity.Name = "StarDensity"; R.Db("Aetheria").Table("Galaxy").Insert(galaxy.MapData.StarDensity).Run(_connection); foreach (var data in galaxy.MapData.ResourceDensities) { // galaxy.MapData.GlobalData.MapLayers[data.Name] = data.ID = Guid.NewGuid(); R.Db("Aetheria").Table("Galaxy").Insert(data).Run(_connection); } R.Db("Aetheria").Table("Galaxy").Insert(galaxy.MapData.GlobalData).Run(_connection); } EditorGUI.EndDisabledGroup(); EditorGUI.EndDisabledGroup(); } } } EditorGUI.indentLevel--; EndVertical(); EditorUtility.SetDirty(target); }