public List <SpriteMarker> PlaceSprites() { if (m_sprites != null) { foreach (var sm in m_sprites) { GameObject.Destroy(sm.gameObject); } } m_sprites = new List <SpriteMarker>(); if (m_connection.ConnectionType == ConnectionType.MOUNTAIN) { if (PolyBorder == null) { return(m_sprites); } m_sprites = new List <SpriteMarker>(); var last = new Vector3(-900, -900, 0); var cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); if (cs == null) { return(m_sprites); } var ct = 0; make_sprite(PolyBorder.P1, cs, Vector3.zero); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); make_sprite(PolyBorder.P2, cs, Vector3.zero); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); foreach (var pt in PolyBorder.OrderedFinePoints) { if (Vector3.Distance(pt, PolyBorder.P2) < cs.Size) // if near to the endpoint, find the mid point between end point and current point and draw 1 sprite { Vector3 midpoint = (last + PolyBorder.P2) / 2; make_sprite(midpoint, cs, Vector3.zero); break; } if (Vector3.Distance(pt, last) < cs.Size) // still too close to the last placed sprite, keep searching { ct++; continue; } ct++; last = pt; make_sprite(pt, cs, Vector3.zero); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); } } else if (m_connection.ConnectionType == ConnectionType.MOUNTAINPASS) { if (PolyBorder == null) { return(m_sprites); } var last = new Vector3(-900, -900, 0); var cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); var other = PolyBorder.Reversed(); make_sprite(PolyBorder.P1, cs, Vector3.zero); // draw a sprite at both endpoints cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); make_sprite(PolyBorder.P2, cs, Vector3.zero); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); var first_quarter = Mathf.RoundToInt(PolyBorder.OrderedFinePoints.Count * 0.3f); var last_quarter = Mathf.RoundToInt(PolyBorder.OrderedFinePoints.Count * 0.7f); var gap_distance = Vector3.Distance(PolyBorder.OrderedFinePoints[first_quarter], PolyBorder.OrderedFinePoints[last_quarter]); if (gap_distance < ArtManager.s_art_manager.CurrentArtConfiguration.MinimumMountainPassGapSize) { first_quarter = Mathf.RoundToInt(PolyBorder.OrderedFinePoints.Count * 0.2f); last_quarter = Mathf.RoundToInt(PolyBorder.OrderedFinePoints.Count * 0.8f); } for (int i = 0; i < PolyBorder.OrderedFinePoints.Count; i++) { var pt = PolyBorder.OrderedFinePoints[i]; var is_mountain = i <first_quarter || i> last_quarter; if (Vector3.Distance(pt, PolyBorder.P2) < cs.Size) // if near to the endpoint, find the mid point between end point and current point and draw 1 sprite { Vector3 midpoint = (last + PolyBorder.P2) / 2; make_sprite(midpoint, cs, Vector3.zero); break; } if (Vector3.Distance(pt, last) < cs.Size) // still too close to the last placed sprite, keep searching { continue; } last = pt; make_sprite(pt, cs, Vector3.zero); if (is_mountain) { cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); } else { cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAINPASS); } } } return(m_sprites); }
public List <SpriteMarker> PlaceSprites() { if (m_sprites != null) { foreach (SpriteMarker sm in m_sprites) { GameObject.Destroy(sm.gameObject); } } m_sprites = new List <SpriteMarker>(); if (m_connection.ConnectionType == ConnectionType.MOUNTAIN) { if (PolyBorder == null) { return(m_sprites); } m_sprites = new List <SpriteMarker>(); Vector3 last = new Vector3(-900, -900, 0); ConnectionSprite cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); if (cs == null) { return(m_sprites); } int ct = 0; make_sprite(PolyBorder.P1, cs, Vector3.zero); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); make_sprite(PolyBorder.P2, cs, Vector3.zero); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); foreach (Vector3 pt in PolyBorder.OrderedFinePoints) { if (Vector3.Distance(last, pt) < cs.Size && ct < m_border.OrderedFinePoints.Count - 1) { ct++; continue; } ct++; last = pt; make_sprite(pt, cs, Vector3.zero); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); } } else if (m_connection.ConnectionType == ConnectionType.MOUNTAINPASS) { if (PolyBorder == null) { return(m_sprites); } m_sprites = new List <SpriteMarker>(); Vector3 last = new Vector3(-900, -900, 0); ConnectionSprite cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); PolyBorder other = PolyBorder.Reversed(); int right_ct = 0; int right_pos = 0; foreach (Vector3 pt in other.OrderedFinePoints) { if (Vector3.Distance(last, pt) < cs.Size) { right_pos++; continue; } last = pt; make_sprite(pt, cs, Vector3.zero); if (right_ct > 1) { break; } cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); right_ct++; right_pos++; } Vector3 endpt = other.OrderedFinePoints[right_pos]; right_ct = -1; cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); bool is_mountain = true; foreach (Vector3 pt in PolyBorder.OrderedFinePoints) { if (Vector3.Distance(pt, endpt) < 0.08f) { break; } if (Vector3.Distance(last, pt) < cs.Size) { continue; } last = pt; if (!is_mountain) { make_sprite(pt, cs, new Vector3(0, 0.01f)); } else { make_sprite(pt, cs, Vector3.zero); } if (Vector3.Distance(pt, endpt) < 2.0f) { cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAINPASS); is_mountain = false; } else { cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); is_mountain = true; } right_ct--; } } return(m_sprites); }
public void RecalculatePoly() { m_poly = new List <Vector3>(); if (IsDummy) { return; } List <PolyBorder> borders = new List <PolyBorder>(); List <ConnectionMarker> conns = new List <ConnectionMarker>(); conns.AddRange(m_connections); if (m_linked != null) { foreach (ProvinceMarker pm in m_linked) { conns.AddRange(pm.Connections); } } if (Node.X == 0 && Node.Y == 0) // corner case { foreach (ConnectionMarker cm in Connections) // main connections { borders.Add(cm.PolyBorder); } foreach (ProvinceMarker pm in LinkedProvinces) // grab all children connections { foreach (ConnectionMarker cm in pm.Connections) { borders.Add(cm.GetOffsetBorder(-cm.DummyOffset)); } } } else // bot side or left side case { foreach (ConnectionMarker cm in conns) { if (cm.IsEdge && (Node.X == 0 || Node.Y == 0) && Vector3.Distance(cm.Midpoint, transform.position) > 3f) { borders.Add(cm.GetOffsetBorder(-cm.DummyOffset)); } else { borders.Add(cm.PolyBorder); } } } m_needs_regen = false; Vector3 cur = borders[0].P2; PolyBorder b = null; List <PolyBorder> result = new List <PolyBorder>(); while (borders.Any()) { b = borders.FirstOrDefault(x => Vector3.Distance(x.P1, cur) < 0.01f); if (b == null) { b = borders.FirstOrDefault(x => Vector3.Distance(x.P2, cur) < 0.01f); if (b == null) // this probably should never happen { m_needs_regen = true; Debug.LogError("Unable to find PolyBorder for province marker: " + ProvinceNumber); break; } PolyBorder rev = b.Reversed(); result.Add(rev); borders.Remove(b); cur = rev.P2; b = null; } else { borders.Remove(b); cur = b.P2; } if (b != null) { result.Add(b); } } Vector3 avg = Vector3.zero; List <Vector3> simplified = new List <Vector3>(); foreach (PolyBorder pb in result) { int mid1 = Mathf.RoundToInt(pb.OrderedPoints.Count * 0.33f); int mid2 = Mathf.RoundToInt(pb.OrderedPoints.Count * 0.66f); m_poly.AddRange(pb.GetFullLengthBorderMinusEnd()); avg += pb.P1; avg += pb.OrderedPoints[mid1]; avg += pb.OrderedPoints[mid2]; simplified.Add(pb.P1); simplified.Add(pb.OrderedPoints[mid1]); simplified.Add(pb.OrderedPoints[mid2]); } Vector3 closest = new Vector3(9000, 9000); avg /= (result.Count * 3); avg -= new Vector3(0f, 0.2f); // shift the center down slightly for aesthetics simplified = simplified.OrderBy(x => Mathf.Abs(avg.y - x.y)).ToList(); foreach (Vector3 p in simplified) // calculate the distance to left { if (p.x < avg.x) { m_center_size = Vector3.Distance(p, avg); break; } } foreach (Vector3 p in simplified) // calculate the distance to right { if (p.x > avg.x) { m_center_size += Vector3.Distance(p, avg); m_center_size *= 0.75f; break; } } m_poly_center = avg; }
private List <Vector3> get_contour(PolyBorder pb, float min_lat, float max_lat) { var dist = 0.08f; var pts = new List <Vector3>(); var norm = (pb.P2 - pb.P1).normalized; var prev = pb.P1; var lateral = Vector3.zero; for (var i = 0; i < pb.OrderedPoints.Count - 1; i++) { var pt = pb.OrderedPoints[i]; if (Vector3.Distance(prev, pt) < dist) { continue; } var behind = pb.OrderedPoints[Mathf.Max(i - 1, 0)]; var forward = pb.OrderedPoints[Mathf.Min(i + 1, pb.OrderedPoints.Count - 1)]; dist = UnityEngine.Random.Range(0.04f, 0.16f); var dir = (pt - behind).normalized; var lateral1 = Vector3.Cross(dir, Vector3.forward); dir = (forward - pt).normalized; var lateral2 = Vector3.Cross(dir, Vector3.forward); var true_lat = (lateral1 + lateral2) * 0.5f; if (i == 0) { true_lat = lateral2; } else if (i == pb.OrderedPoints.Count - 1) { true_lat = lateral1; } var shift = pt + true_lat * UnityEngine.Random.Range(min_lat, max_lat); pts.Add(shift); lateral = true_lat; prev = pt; } var endpt = pb.P2 + norm * 0.04f + lateral * min_lat; var endpt2 = pb.P2 + norm * 0.04f - lateral * min_lat; pts.Add(endpt); pts.Add(endpt2); prev = endpt; dist = 0.08f; var ordered = pb.Reversed().OrderedPoints; for (var i = 0; i < ordered.Count - 1; i++) { var pt = ordered[i]; if (Vector3.Distance(prev, pt) < dist) { continue; } var behind = ordered[Mathf.Max(i - 1, 0)]; var forward = ordered[Mathf.Min(i + 1, ordered.Count - 1)]; dist = UnityEngine.Random.Range(0.04f, 0.16f); var dir = (pt - behind).normalized; var lateral1 = Vector3.Cross(dir, Vector3.forward); dir = (forward - pt).normalized; var lateral2 = Vector3.Cross(dir, Vector3.forward); var true_lat = (lateral1 + lateral2) * 0.5f; if (i == 0) { true_lat = lateral2; } else if (i == ordered.Count - 1) { true_lat = lateral1; } var shift = pt + true_lat * UnityEngine.Random.Range(min_lat, max_lat); pts.Add(shift); lateral = true_lat; prev = pt; } endpt = pb.P1 - norm * 0.04f + lateral * min_lat; endpt2 = pb.P1 - norm * 0.04f - lateral * min_lat; pts.Add(endpt); pts.Add(endpt2); pts.Add(pts[0]); var path = new CubicBezierPath(pts.ToArray()); var max = (float)(pts.Count - 1) - 0.04f; var j = 0.04f; var spacing = 0.04f; var last = pb.P1; ordered = new List <Vector3>(); while (j < max) { var pt = path.GetPoint(j); if (Vector3.Distance(pt, last) >= spacing) { ordered.Add(pt); last = pt; } j += 0.04f; } return(ordered); }
public List <SpriteMarker> PlaceSprites() { if (m_sprites != null) { foreach (var sm in m_sprites) { GameObject.Destroy(sm.gameObject); } } m_sprites = new List <SpriteMarker>(); var all = new List <SpriteMarker>(); /*foreach (var m in m_wraps) * { * //all.AddRange(m.PlaceSprites()); * }*/ if (PolyBorder != null) { var max = MapBorder.s_map_border.Maxs; var min = MapBorder.s_map_border.Mins; var p1 = false; var p2 = false; if (PolyBorder.P1.x < min.x || PolyBorder.P1.y < min.y || PolyBorder.P1.x > max.x || PolyBorder.P1.y > max.y) { m_force_mirror = true; m_forced_min = PolyBorder.P1; m_forced_max = PolyBorder.P1; p1 = true; } if (PolyBorder.P2.x < min.x || PolyBorder.P2.y < min.y || PolyBorder.P2.x > max.x || PolyBorder.P2.y > max.y) { m_force_mirror = true; m_forced_min = PolyBorder.P2; m_forced_max = PolyBorder.P2; p2 = true; } if (p1 && p2) { m_forced_max = max + new Vector3(0.02f, 0.02f); m_forced_min = max - new Vector3(0.02f, 0.02f); } } if (m_connection.ConnectionType == ConnectionType.MOUNTAIN) { if (PolyBorder == null) { return(m_sprites); } var last = new Vector3(-900, -900, 0); var cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); var bottom = ArtManager.s_art_manager.GetMountainSpecSprite(); if (cs == null) { return(m_sprites); } var ct = 0; make_sprite(PolyBorder.P1, cs, Vector3.zero); make_sprite(PolyBorder.P1, bottom, new Vector3(0, 0.01f)); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); make_sprite(PolyBorder.P2, cs, Vector3.zero); make_sprite(PolyBorder.P2, bottom, new Vector3(0, 0.01f)); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); foreach (var pt in PolyBorder.OrderedFinePoints) { if (Vector3.Distance(last, pt) < cs.Size && ct < PolyBorder.OrderedFinePoints.Count - 3) { ct++; continue; } ct++; last = pt; make_sprite(pt, cs, Vector3.zero); make_sprite(pt, bottom, new Vector3(0, 0.01f)); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); bottom = ArtManager.s_art_manager.GetMountainSpecSprite(); } } else if (m_connection.ConnectionType == ConnectionType.MOUNTAINPASS) { if (PolyBorder == null) { return(m_sprites); } var last = new Vector3(-900, -900, 0); var cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); var bottom = ArtManager.s_art_manager.GetMountainSpecSprite(); var other = PolyBorder.Reversed(); make_sprite(PolyBorder.P1, cs, Vector3.zero); make_sprite(PolyBorder.P1, bottom, new Vector3(0, 0.01f)); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); bottom = ArtManager.s_art_manager.GetMountainSpecSprite(); make_sprite(PolyBorder.P2, cs, Vector3.zero); make_sprite(PolyBorder.P2, bottom, new Vector3(0, 0.01f)); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); bottom = ArtManager.s_art_manager.GetMountainSpecSprite(); make_sprite(other.OrderedFinePoints[0], cs, Vector3.zero); make_sprite(other.OrderedFinePoints[0], bottom, new Vector3(0, 0.01f)); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); bottom = ArtManager.s_art_manager.GetMountainSpecSprite(); make_sprite(other.OrderedFinePoints[1], cs, Vector3.zero); make_sprite(other.OrderedFinePoints[1], bottom, new Vector3(0, 0.01f)); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); bottom = ArtManager.s_art_manager.GetMountainSpecSprite(); make_sprite(other.OrderedFinePoints[2], cs, Vector3.zero); make_sprite(other.OrderedFinePoints[2], bottom, new Vector3(0, 0.01f)); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); bottom = ArtManager.s_art_manager.GetMountainSpecSprite(); var endpt = other.OrderedFinePoints[2]; cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); var is_mountain = true; foreach (var pt in PolyBorder.OrderedFinePoints) { if (Vector3.Distance(pt, endpt) < 0.05f) { break; } if (Vector3.Distance(last, pt) < cs.Size) { continue; } last = pt; if (!is_mountain) { make_sprite(pt, cs, new Vector3(0, 0.01f)); } else { make_sprite(pt, cs, Vector3.zero); make_sprite(pt, bottom, new Vector3(0, 0.01f)); } if (Vector3.Distance(pt, endpt) < 0.6f) { cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAINPASS); is_mountain = false; } else { cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); is_mountain = true; } bottom = ArtManager.s_art_manager.GetMountainSpecSprite(); } } else if (m_connection.ConnectionType == ConnectionType.SHALLOWRIVER) { var mid = Mathf.RoundToInt(PolyBorder.OrderedPoints.Count * 0.25f); if (UnityEngine.Random.Range(0, 2) == 0) { mid = Mathf.RoundToInt(PolyBorder.OrderedPoints.Count * 0.75f); } var pos = PolyBorder.OrderedPoints[mid]; var pos2 = PolyBorder.OrderedPoints[mid + 1]; var actual = (pos - pos2).normalized;//(PolyBorder.P2 - PolyBorder.P1).normalized; var dir = new Vector3(-0.05f, 1f); if (Mathf.Abs(actual.y) < 0.3f) { var cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.RIVER); make_sprite(pos, cs, Vector3.zero); } else { var cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.SHALLOWRIVER); if ((actual.y < 0 && actual.x > 0) || (actual.y > 0 && actual.x < 0)) { make_bridge_sprite(pos, cs, Vector3.zero, true, true); dir = new Vector3(1f, 0.3f); } else { make_bridge_sprite(pos, cs, Vector3.zero, true, false); dir = new Vector3(1f, -0.3f); } } var cull = 0.05f; var positions = new List <Vector3>(); while (cull < 0.35f) { positions.Add(pos + (dir * cull)); positions.Add(pos + (dir * -cull)); cull += 0.05f; } m_culling_points = positions; } else if (m_connection.ConnectionType == ConnectionType.ROAD) { if (PolyBorder == null) { return(m_sprites); } var cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.ROAD); if (cs == null) { return(m_sprites); } foreach (var pt in m_poly) { make_sprite(pt, cs, new Vector3(UnityEngine.Random.Range(-0.01f, 0.01f), UnityEngine.Random.Range(-0.01f, 0.01f))); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.ROAD); } } all.AddRange(m_sprites); return(all); }
public List <SpriteMarker> PlaceSprites() { if (m_sprites != null) { foreach (var sm in m_sprites) { GameObject.Destroy(sm.gameObject); } } m_sprites = new List <SpriteMarker>(); var all = new List <SpriteMarker>(); if (PolyBorder != null) { var max = MapBorder.s_map_border.Maxs; var min = MapBorder.s_map_border.Mins; var p1 = false; var p2 = false; if (PolyBorder.P1.x < min.x || PolyBorder.P1.y < min.y || PolyBorder.P1.x > max.x || PolyBorder.P1.y > max.y) { m_force_mirror = true; m_forced_min = PolyBorder.P1; m_forced_max = PolyBorder.P1; p1 = true; } if (PolyBorder.P2.x < min.x || PolyBorder.P2.y < min.y || PolyBorder.P2.x > max.x || PolyBorder.P2.y > max.y) { m_force_mirror = true; m_forced_min = PolyBorder.P2; m_forced_max = PolyBorder.P2; p2 = true; } if (p1 && p2) { m_forced_max = max + new Vector3(0.02f, 0.02f); m_forced_min = max - new Vector3(0.02f, 0.02f); } } if (m_connection.ConnectionType == ConnectionType.MOUNTAIN) { if (PolyBorder == null) { return(m_sprites); } var last = new Vector3(-900, -900, 0); var cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); if (cs == null) { return(m_sprites); } var ct = 0; make_sprite(PolyBorder.P1, cs, Vector3.zero); // draw a sprite at both endpoints cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); make_sprite(PolyBorder.P2, cs, Vector3.zero); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); foreach (var pt in PolyBorder.OrderedFinePoints) { if (Vector3.Distance(pt, PolyBorder.P2) < cs.Size) // if near to the endpoint, find the mid point between end point and current point and draw 1 sprite { Vector3 midpoint = (last + PolyBorder.P2) / 2; make_sprite(midpoint, cs, Vector3.zero); break; } if (Vector3.Distance(pt, last) < cs.Size) // still too close to the last placed sprite, keep searching { ct++; continue; } ct++; last = pt; make_sprite(pt, cs, Vector3.zero); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); } } else if (m_connection.ConnectionType == ConnectionType.MOUNTAINPASS) { if (PolyBorder == null) { return(m_sprites); } var last = new Vector3(-900, -900, 0); var cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); var other = PolyBorder.Reversed(); make_sprite(PolyBorder.P1, cs, Vector3.zero); // draw a sprite at both endpoints cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); make_sprite(PolyBorder.P2, cs, Vector3.zero); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); var first_quarter = Mathf.RoundToInt(PolyBorder.OrderedFinePoints.Count * 0.3f); var last_quarter = Mathf.RoundToInt(PolyBorder.OrderedFinePoints.Count * 0.7f); var gap_distance = Vector3.Distance(PolyBorder.OrderedFinePoints[first_quarter], PolyBorder.OrderedFinePoints[last_quarter]); if (gap_distance < ArtManager.s_art_manager.CurrentArtConfiguration.MinimumMountainPassGapSize) { first_quarter = Mathf.RoundToInt(PolyBorder.OrderedFinePoints.Count * 0.2f); last_quarter = Mathf.RoundToInt(PolyBorder.OrderedFinePoints.Count * 0.8f); } for (int i = 0; i < PolyBorder.OrderedFinePoints.Count; i++) { var pt = PolyBorder.OrderedFinePoints[i]; var is_mountain = i <first_quarter || i> last_quarter; if (Vector3.Distance(pt, PolyBorder.P2) < cs.Size) // if near to the endpoint, find the mid point between end point and current point and draw 1 sprite { Vector3 midpoint = (last + PolyBorder.P2) / 2; make_sprite(midpoint, cs, Vector3.zero); break; } if (Vector3.Distance(pt, last) < cs.Size) // still too close to the last placed sprite, keep searching { continue; } last = pt; make_sprite(pt, cs, Vector3.zero); if (is_mountain) { cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAIN); } else { cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.MOUNTAINPASS); } } } else if (m_connection.ConnectionType == ConnectionType.SHALLOWRIVER) { var mid = Mathf.RoundToInt(PolyBorder.OrderedPoints.Count * 0.25f); if (UnityEngine.Random.Range(0, 2) == 0) { mid = Mathf.RoundToInt(PolyBorder.OrderedPoints.Count * 0.75f); } var pos = PolyBorder.OrderedPoints[mid]; var pos2 = PolyBorder.OrderedPoints[mid + 1]; var actual = (pos - pos2).normalized;//(PolyBorder.P2 - PolyBorder.P1).normalized; var dir = new Vector3(-0.05f, 1f); if (Mathf.Abs(actual.y) < 0.3f) { var cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.RIVER); make_sprite(pos, cs, Vector3.zero); } else { var cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.SHALLOWRIVER); if ((actual.y < 0 && actual.x > 0) || (actual.y > 0 && actual.x < 0)) { make_bridge_sprite(pos, cs, Vector3.zero, true, true); dir = new Vector3(1f, 0.3f); } else { make_bridge_sprite(pos, cs, Vector3.zero, true, false); dir = new Vector3(1f, -0.3f); } } var cull = 0.05f; var positions = new List <Vector3>(); while (cull < 0.35f) { positions.Add(pos + (dir * cull)); positions.Add(pos + (dir * -cull)); cull += 0.05f; } m_culling_points = positions; } else if (m_connection.ConnectionType == ConnectionType.ROAD) { if (PolyBorder == null) { return(m_sprites); } var cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.ROAD); if (cs == null) { return(m_sprites); } foreach (var pt in m_poly) { make_sprite(pt, cs, new Vector3(UnityEngine.Random.Range(-0.01f, 0.01f), UnityEngine.Random.Range(-0.01f, 0.01f))); cs = ArtManager.s_art_manager.GetConnectionSprite(ConnectionType.ROAD); } } all.AddRange(m_sprites); return(all); }