void OnSceneGUI() { VoronoiGenerator gen = (VoronoiGenerator)target; if (gen.lr != null) { if (quad == null || gen.wasReset) { if (VoronoiGenerator.instance == null) { gen.GenerateNoisyLineDebug(); } var lr = gen.lr; VoronoiGenerator.TryGetLineIntersections( gen.startControl, gen.endControl, gen.startNoisy, gen.endNoisy, out Vector2 intersectPoint, out float t1, out float t2); Debug.Log("t1: " + t1 + " t2: " + t2); quad = new Quad(gen.startControl, gen.endControl, gen.startNoisy, gen.endNoisy, gen.debugSubdivisions, -t1, gen.debugAmplitude, new System.Random()); List <Vector3> positions = new List <Vector3>(); positions.Add(gen.startNoisy); positions.AddRange(quad.points); positions.Add(gen.endNoisy); lr.SetPositions(positions.ToArray()); gen.wasReset = false; } else { quad.Draw(); } } if (gen.dGraph != null && gen.viewDelaunayTriangles) { Handles.color = Color.red; foreach (var edge in gen.dGraph.edges) { Handles.DrawDottedLine(edge.start.position, edge.end.position, 2); } } if (gen.vGraph != null && gen.viewVoronoiPolygons) { if (gen.viewIntersectionDirections) { if (VoronoiGraph.boundCrossingEdges != null) { foreach (MapSide mapSide in (MapSide[])Enum.GetValues(typeof(MapSide))) { if (mapSide == MapSide.Inside) { continue; } Handles.color = new Color(1, .62f, .016f, 1); for (int i = 0; i < VoronoiGraph.boundCrossingEdges[mapSide].Count; ++i) { var edge = VoronoiGraph.boundCrossingEdges[mapSide][i]; Vector2 nextPos; if (i == VoronoiGraph.boundCrossingEdges[mapSide].Count - 1) { //nextPos = borderEndPoints[mapSide].Item2; continue; } else { nextPos = VoronoiGraph.boundCrossingEdges[mapSide][i + 1].intersectPosition; } Handles.ArrowHandleCap(i, edge.intersectPosition, Quaternion.LookRotation(Vector3.right + new Vector3(0, .5f, 0)), Vector2.Distance(edge.intersectPosition, nextPos), EventType.Repaint); Handles.Label((edge.intersectPosition + nextPos) / 2, "" + i); } } } } style.normal.textColor = Color.black; if (gen.viewCorners) { foreach (var corner in VoronoiGraph.uniqueCorners) { if (corner.isInvalidated) { Handles.color = new Color(.5f, .5f, .5f, .5f); } else if (corner.isOOB) { Handles.color = Color.red; } else if (corner.isOnBorder) { Handles.color = cornerGreen; } else { Handles.color = Color.white; } Handles.SphereHandleCap(0, corner.position, Quaternion.identity, .25f, EventType.Repaint); if (gen.viewCornerIDs) { Handles.Label(corner.position + textOffset, "" + corner.num, style); } } } int intersectCount = 0; style.normal.textColor = Color.yellow; foreach (var edge in VoronoiGraph.uniqueVEdges) { if (edge.start.isOnBorder && edge.end.isOnBorder) { Handles.color = Color.green; } else if (!edge.start.isOOB && !edge.end.isOOB) { Handles.color = Color.blue; } else if ((edge.start.isOOB ^ edge.end.isOOB) && !edge.start.isOnBorder && !edge.end.isOnBorder) { Handles.color = Color.yellow; style.normal.textColor = Color.yellow; if (gen.viewIntersections) { foreach (var intersection in VoronoiGenerator.FindMapBoundsIntersection(edge.start.position, edge.end.position)) { Handles.CylinderHandleCap(0, intersection, Quaternion.identity, .4f, EventType.Repaint); if (gen.viewIntersectionIDs) { Handles.Label(intersection + textOffset, "" + (intersectCount++), style); } } } } else { Handles.color = Color.red; if (gen.viewIntersections) { foreach (var intersection in VoronoiGenerator.FindMapBoundsIntersection(edge.start.position, edge.end.position)) { // this is a very rare occurence of an edge that starts on a border and intersects with a different map edge. Handles.CylinderHandleCap(0, intersection, Quaternion.identity, .4f, EventType.Repaint); if (gen.viewIntersectionIDs) { Handles.Label(intersection + textOffset, "" + (intersectCount++), style); } Handles.color = Color.yellow; } } } Handles.DrawDottedLine(edge.start.position, edge.end.position, 2); if (gen.viewEdgeIDs) { style.normal.textColor = Color.cyan; Handles.Label((edge.start.position + edge.end.position) * .5f + textOffset, "" + edge.id, style); } } Handles.color = Color.cyan; foreach (var polygon in VoronoiGenerator.debugPolygons) { foreach (var edge in polygon.GetVoronoiEdges()) { Handles.DrawDottedLine(edge.start.position, edge.end.position, 1); } foreach (var corner in polygon.corners) { Handles.SphereHandleCap(0, corner.position, Quaternion.identity, .175f, EventType.Repaint); } int i = 0; style.normal.textColor = Color.cyan; foreach (var edge in polygon.GetVoronoiEdges()) { Handles.Label((edge.start.position + edge.end.position) / 2, "" + i, style); ++i; } style.normal.textColor = Color.white; i = 0; foreach (var corner in polygon.corners) { Handles.Label(corner.position + textOffset, "" + i, style); ++i; } } Handles.color = Color.magenta; foreach (var edge in VoronoiGenerator.debugEdges) { Handles.DrawDottedLine(edge.start.position, edge.end.position, 1); } foreach (var corner in VoronoiGenerator.debugCorners) { Handles.SphereHandleCap(0, corner.position, Quaternion.identity, .175f, EventType.Repaint); } } if (gen.regions != null && gen.viewRegionIDs) { foreach (var region in gen.regions) { if (region == null || region.polygon == null) { break; } Handles.Label(region.polygon.centroid.position, "" + region.id, style); } } if (VoronoiGraph.uniqueCorners != null && gen.debugSlopeDirections) { foreach (Corner corner in VoronoiGraph.uniqueCorners) { if (corner.downSlope != null) { Vector3 cornerPos = Quaternion.AngleAxis(90, Vector3.right) * corner.position; Vector3 targetPos = Quaternion.AngleAxis(90, Vector3.right) * corner.downSlope.position; Handles.ArrowHandleCap(0, cornerPos, Quaternion.LookRotation(targetPos - cornerPos, Vector3.up), 1, EventType.Repaint); } } } }
public override void OnInspectorGUI() { VoronoiGenerator gen = (VoronoiGenerator)target; using (var check = new EditorGUI.ChangeCheckScope()) { mapGenerationSettingsFoldout = EditorGUILayout.Foldout(mapGenerationSettingsFoldout, new GUIContent("Map Generation Settings")); if (mapGenerationSettingsFoldout) { EditorGUI.indentLevel = 1; gen.newRandomSeed = EditorGUILayout.Toggle(new GUIContent("New RandomSeed"), gen.newRandomSeed); gen.randomSeed = EditorGUILayout.DelayedTextField(new GUIContent("RandomSeed"), gen.randomSeed); EditorGUILayout.PropertyField(serializedObject.FindProperty("mapWidth")); EditorGUILayout.PropertyField(serializedObject.FindProperty("mapHeight")); EditorGUILayout.PropertyField(serializedObject.FindProperty("regionAmount")); EditorGUILayout.PropertyField(serializedObject.FindProperty("minSqrDistBtwnSites")); EditorGUILayout.PropertyField(serializedObject.FindProperty("minDistBtwnSiteAndBorder")); EditorGUILayout.PropertyField(serializedObject.FindProperty("minDistBtwnCornerAndBorder")); EditorGUILayout.PropertyField(serializedObject.FindProperty("minEdgeLengthToMerge")); GUI.enabled = false; EditorGUILayout.PropertyField(serializedObject.FindProperty("mergeNearCorners")); EditorGUILayout.PropertyField(serializedObject.FindProperty("clampToMapBounds")); GUI.enabled = true; EditorGUI.indentLevel = 0; } gen.borderSettingsFoldout = EditorGUILayout.Foldout(gen.borderSettingsFoldout, new GUIContent("Border Settings")); if (gen.borderSettingsFoldout) { EditorGUI.indentLevel = 1; bool borders = EditorGUILayout.Toggle(new GUIContent("Show Borders"), gen.bordersEnabled); if (borders != gen.bordersEnabled) { gen.ToggleBorders(borders); } EditorGUILayout.PropertyField(serializedObject.FindProperty("subdivisions")); EditorGUILayout.PropertyField(serializedObject.FindProperty("amplitude")); EditorGUI.indentLevel = 0; } EditorGUILayout.PropertyField(serializedObject.FindProperty("regionMaterial")); EditorGUILayout.PropertyField(serializedObject.FindProperty("sideMaterial")); EditorGUILayout.PropertyField(serializedObject.FindProperty("regionPrefab")); EditorGUILayout.PropertyField(serializedObject.FindProperty("regionHolder")); EditorGUILayout.PropertyField(serializedObject.FindProperty("noisePreviewMeshRenderer")); if (check.changed || GUILayout.Button("Generate Voronoi")) { AtomosZ.EditorTools.EditorUtils.ClearLogConsole(); gen.GenerateMap(); EditorUtility.SetDirty(target); } if (GUILayout.Button("Clear Map")) { gen.ClearMap(); } } using (var check = new EditorGUI.ChangeCheckScope()) { EditorGUILayout.PropertyField(serializedObject.FindProperty("noiseSettings")); EditorGUILayout.PropertyField(serializedObject.FindProperty("heightMapSettings")); if (check.changed) { gen.GenerateTexture(); } } gen.mapDebugFoldout = EditorGUILayout.Foldout(gen.mapDebugFoldout, new GUIContent("Map Debug Settings")); if (gen.mapDebugFoldout) { EditorGUI.indentLevel = 1; EditorGUILayout.PropertyField(serializedObject.FindProperty("viewDelaunayCircles")); EditorGUILayout.PropertyField(serializedObject.FindProperty("viewDelaunayTriangles")); EditorGUILayout.PropertyField(serializedObject.FindProperty("viewCenteroids")); EditorGUILayout.PropertyField(serializedObject.FindProperty("viewVoronoiPolygons")); EditorGUILayout.PropertyField(serializedObject.FindProperty("viewCorners")); EditorGUILayout.PropertyField(serializedObject.FindProperty("viewCornerIDs")); EditorGUILayout.PropertyField(serializedObject.FindProperty("viewEdgeIDs")); EditorGUILayout.PropertyField(serializedObject.FindProperty("viewIntersections")); EditorGUILayout.PropertyField(serializedObject.FindProperty("viewIntersectionIDs")); EditorGUILayout.PropertyField(serializedObject.FindProperty("viewIntersectionDirections")); EditorGUILayout.PropertyField(serializedObject.FindProperty("viewRegionIDs")); EditorGUILayout.PropertyField(serializedObject.FindProperty("debugSlopeDirections")); gen.debugBorders = EditorGUILayout.Toggle(new GUIContent("Debug Borders"), gen.debugBorders); if (gen.debugBorders) { EditorGUI.indentLevel = 2; EditorGUILayout.PropertyField(serializedObject.FindProperty("topBorder")); EditorGUILayout.PropertyField(serializedObject.FindProperty("rightBorder")); EditorGUILayout.PropertyField(serializedObject.FindProperty("bottomBorder")); EditorGUILayout.PropertyField(serializedObject.FindProperty("leftBorder")); EditorGUI.indentLevel = 1; } gen.debugNoisyLine = EditorGUILayout.Foldout(gen.debugNoisyLine, new GUIContent("Noisy Line Debug")); if (gen.debugNoisyLine) { EditorGUI.indentLevel = 2; EditorGUILayout.PropertyField(serializedObject.FindProperty("debugSubdivisions")); EditorGUILayout.PropertyField(serializedObject.FindProperty("debugAmplitude")); EditorGUILayout.PropertyField(serializedObject.FindProperty("startNoisy")); EditorGUILayout.PropertyField(serializedObject.FindProperty("endNoisy")); EditorGUILayout.PropertyField(serializedObject.FindProperty("startControl")); EditorGUILayout.PropertyField(serializedObject.FindProperty("endControl")); if (GUILayout.Button("Generate Noisy Line")) { AtomosZ.EditorTools.EditorUtils.ClearLogConsole(); gen.GenerateNoisyLineDebug(); EditorUtility.SetDirty(target); } EditorGUI.indentLevel = 1; } EditorGUI.indentLevel = 0; } serializedObject.ApplyModifiedProperties(); }