public void draw_border(PolyBorder pb, Vector3 offset) { m_border = pb; BorderLine.positionCount = 2; BorderLine.SetPositions(new Vector3[] { new Vector3(900, 900, 0), new Vector3(901, 900, 0) }); if (m_connection.ConnectionType == ConnectionType.RIVER || m_connection.ConnectionType == ConnectionType.SHALLOWRIVER) { return; } List <Vector3> border = pb.GetFullLengthBorder(); List <Vector3> fix = new List <Vector3>(); foreach (Vector3 v in border) { fix.Add(new Vector3(v.x + offset.x, v.y + offset.y, -0.8f)); } Vector3[] arr = fix.ToArray(); BorderLine.positionCount = arr.Length; BorderLine.SetPositions(arr); Color c = new Color(0f, 0f, 0f, ArtManager.s_art_manager.BorderOpacity); BorderLine.startColor = c; BorderLine.endColor = c; }
public void draw_border(PolyBorder pb, List <Vector3> poly, Vector3 offset) { m_border = pb; var border = pb.GetFullLengthBorder(); var fix = new List <Vector3>(); foreach (var v in border) { fix.Add(new Vector3(v.x + offset.x, v.y + offset.y, -0.8f)); } if (m_connection.ConnectionType == ConnectionType.RIVER || m_connection.ConnectionType == ConnectionType.SHALLOWRIVER) { var offset_poly = new List <Vector3>(); foreach (var v in poly) { offset_poly.Add(new Vector3(v.x + offset.x, v.y + offset.y, -0.8f)); } var key_start = new Keyframe(0f, ArtManager.s_art_manager.CurrentArtConfiguration.ProvinceBorderWidth * 2f); var key_end = new Keyframe(1f, ArtManager.s_art_manager.CurrentArtConfiguration.ProvinceBorderWidth * 2f); BorderLine.widthCurve = new AnimationCurve(key_start, key_end); BorderLine.startColor = GenerationManager.s_generation_manager.BorderColor; BorderLine.endColor = GenerationManager.s_generation_manager.BorderColor; BorderLine.positionCount = offset_poly.Count; BorderLine.SetPositions(offset_poly.ToArray()); return; } var arr = fix.ToArray(); var border_scale = 1f; if ((m_connection.Node1.ProvinceData.IsWater && !m_connection.Node2.ProvinceData.IsWater) || (!m_connection.Node1.ProvinceData.IsWater && m_connection.Node2.ProvinceData.IsWater)) { border_scale = 2f; } var key1 = new Keyframe(0f, ArtManager.s_art_manager.CurrentArtConfiguration.ProvinceBorderWidth * border_scale); var key2 = new Keyframe(1f, ArtManager.s_art_manager.CurrentArtConfiguration.ProvinceBorderWidth * border_scale); BorderLine.widthCurve = new AnimationCurve(key1, key2); BorderLine.positionCount = arr.Length; BorderLine.SetPositions(arr); if (m_connection.IsSeaConnection) { BorderLine.materials = new Material[] { MatSeaBorder }; BorderLine.startColor = GenerationManager.s_generation_manager.SeaBorderColor; BorderLine.endColor = GenerationManager.s_generation_manager.SeaBorderColor; } else { BorderLine.materials = new Material[] { MatLandBorder }; BorderLine.startColor = GenerationManager.s_generation_manager.BorderColor; BorderLine.endColor = GenerationManager.s_generation_manager.BorderColor; } }
public GameObject CreateWrapMesh(PolyBorder pb, Vector3 offset) // create a connection wrap marker and its polygon { if (m_wraps == null) { m_wraps = new List <ConnectionWrapMarker>(); } if (m_wraps.Any(x => Vector3.Distance(x.Offset, offset) < 0.1f)) { return(null); } var obj = GameObject.Instantiate(WrapMarkerPrefab); var wrap = obj.GetComponent <ConnectionWrapMarker>(); wrap.UpdateArtStyle(); wrap.SetParent(this); wrap.CreatePoly(m_poly, pb, offset); obj.transform.position = obj.transform.position + offset; m_wraps.Add(wrap); return(obj); }
public void draw_border(PolyBorder pb, Vector3 offset) { m_border = pb; BorderLine.positionCount = 2; BorderLine.SetPositions(new Vector3[] { new Vector3(900, 900, 0), new Vector3(901, 900, 0) }); if (m_connection.ConnectionType == ConnectionType.RIVER || m_connection.ConnectionType == ConnectionType.SHALLOWRIVER) { return; } var border = pb.GetFullLengthBorder(); var fix = new List <Vector3>(); foreach (var v in border) { fix.Add(new Vector3(v.x + offset.x, v.y + offset.y, -0.8f)); } var arr = fix.ToArray(); BorderLine.positionCount = arr.Length; BorderLine.SetPositions(arr); BorderLine.startColor = GenerationManager.s_generation_manager.BorderColor; BorderLine.endColor = GenerationManager.s_generation_manager.BorderColor; }
public void ConstructPoly(PolyBorder pb, Vector3 offset) { MeshFilter.mesh.Clear(); RoadLine.positionCount = 2; RoadLine.SetPositions(new Vector3[] { new Vector3(900, 900, 0), new Vector3(901, 900, 0) }); if (m_poly == null || !m_poly.Any()) { return; } Triangulator tr = new Triangulator(get_pts_array(m_poly)); int[] indices = tr.Triangulate(); Vector2[] uv = new Vector2[m_poly.Count]; for (int i = 0; i < m_poly.Count; i++) { uv[i] = new Vector2(m_poly[i].x, m_poly[i].y); } Mesh m = new Mesh(); m.vertices = m_poly.ToArray(); m.uv = uv; m.triangles = indices; m.RecalculateNormals(); m.RecalculateBounds(); Vector3[] norms = m.normals; for (int i = 0; i < norms.Length - 1; i++) { norms[i] = Vector3.back; } m.normals = norms; MeshFilter.mesh = m; Vector3 pos = transform.position * -1f; if (m_connection.ConnectionType == ConnectionType.ROAD) { pos.z = -2.0f; } else { pos.z = -0.9f; } MeshObj.transform.localPosition = pos; SetSeason(GenerationManager.s_generation_manager.Season); }
public PolyBorder Offset(Vector3 offset) { var ordered = new List <Vector3>(); foreach (var v in OrderedPoints) { ordered.Add(v + offset); } var pb = new PolyBorder(P1 + offset, P2 + offset, Connection); pb.OrderedPoints = ordered; return(pb); }
void draw_shore(Vector3 offset) { if (m_stroke != null) { GameObject.Destroy(m_stroke.gameObject); m_stroke = null; } if ((m_parent.Prov1.Node.ProvinceData.IsWater && !m_parent.Prov2.Node.ProvinceData.IsWater) || (m_parent.Prov2.Node.ProvinceData.IsWater && !m_parent.Prov1.Node.ProvinceData.IsWater)) { GameObject g = GameObject.Instantiate(InnerStrokePrefab); m_stroke = g.GetComponent <InnerStroke>(); m_stroke.DrawStroke(PolyBorder.GetFullLengthBorder(), offset); } }
private void draw_shore() { if (m_stroke != null) { GameObject.Destroy(m_stroke.gameObject); m_stroke = null; } if ((Prov1.Node.ProvinceData.IsWater && !Prov2.Node.ProvinceData.IsWater) || (Prov2.Node.ProvinceData.IsWater && !Prov1.Node.ProvinceData.IsWater)) { var g = GameObject.Instantiate(InnerStrokePrefab); m_stroke = g.GetComponent <InnerStroke>(); m_stroke.UpdateArtStyle(); m_stroke.DrawStroke(PolyBorder.GetFullLengthBorder(), Vector3.zero); } }
public List <Vector3> GetFullLengthBorderMinusEnd(bool reversed = false) { List <Vector3> pts = new List <Vector3>(); if (reversed) { PolyBorder pb = Reversed(); pts.Add(pb.P1); pts.AddRange(pb.OrderedPoints); } else { pts.Add(P1); pts.AddRange(OrderedPoints); } return(pts); }
public PolyBorder Reversed() { var ordered = new List <Vector3>(); ordered.AddRange(OrderedPoints); ordered.Reverse(); var ordered_fine = new List <Vector3>(); ordered_fine.AddRange(OrderedFinePoints); ordered_fine.Reverse(); var pb = new PolyBorder(P2, P1, Connection); pb.OrderedPoints = ordered; pb.OrderedFinePoints = ordered_fine; return(pb); }
private void draw_shore(Vector3 offset) { if (m_stroke != null) { GameObject.Destroy(m_stroke.gameObject); m_stroke = null; } if ((m_parent.Prov1.Node.ProvinceData.IsWater && !m_parent.Prov2.Node.ProvinceData.IsWater) || (m_parent.Prov2.Node.ProvinceData.IsWater && !m_parent.Prov1.Node.ProvinceData.IsWater)) { var g = GameObject.Instantiate(InnerStrokePrefab); m_stroke = g.GetComponent <InnerStroke>(); m_stroke.UpdateArtStyle(); m_stroke.DrawStroke(PolyBorder.GetFullLengthBorder(), offset, true, ArtManager.s_art_manager.CurrentArtConfiguration.MinimumSeaShoreWidth, ArtManager.s_art_manager.CurrentArtConfiguration.MaximumSeaShoreWidth); } }
private void draw_road(PolyBorder path) { var pts = new List <Vector3>(); foreach (var pt in path.OrderedFinePoints) { pts.Add(pt + new Vector3(0, 0, -0.9f)); } pts.RemoveAt(0); pts.RemoveAt(pts.Count - 1); RoadLine.positionCount = pts.Count; RoadLine.SetPositions(pts.ToArray()); var jitter = new AnimationCurve(); var num_keys = UnityEngine.Random.Range(2, 8); var floats = new List <float>(); for (var i = 0; i < num_keys; i++) { var rand = UnityEngine.Random.Range(0f, 1f); var ct = 0; while (floats.Any(x => Mathf.Abs(rand - x) < 0.1f) && ct < 10) { rand = UnityEngine.Random.Range(0f, 1f); ct++; } if (ct < 10) { floats.Add(rand); jitter.AddKey(rand, UnityEngine.Random.Range(ArtManager.s_art_manager.CurrentArtConfiguration.MinimumRoadWidth, ArtManager.s_art_manager.CurrentArtConfiguration.MaximumRoadWidth)); } } RoadLine.widthCurve = jitter; }
void draw_road(PolyBorder path) { List <Vector3> pts = new List <Vector3>(); foreach (Vector3 pt in path.OrderedFinePoints) { pts.Add(pt + new Vector3(0, 0, -0.9f)); } pts.RemoveAt(0); pts.RemoveAt(pts.Count - 1); RoadLine.positionCount = pts.Count; RoadLine.SetPositions(pts.ToArray()); AnimationCurve jitter = new AnimationCurve(); int num_keys = UnityEngine.Random.Range(2, 8); List <float> floats = new List <float>(); for (int i = 0; i < num_keys; i++) { float rand = UnityEngine.Random.Range(0f, 1f); int ct = 0; while (floats.Any(x => Mathf.Abs(rand - x) < 0.1f) && ct < 10) { rand = UnityEngine.Random.Range(0f, 1f); ct++; } if (ct < 10) { floats.Add(rand); jitter.AddKey(rand, UnityEngine.Random.Range(0.12f, 0.24f)); } } RoadLine.widthCurve = jitter; }
public void CreatePoly(List <Vector3> poly, PolyBorder pb, Vector3 offset) { m_poly = poly; m_offset = offset; draw_border(pb, poly, offset); draw_shore(offset); if (m_connection.ConnectionType == ConnectionType.ROAD) { draw_road(offset); } if (m_connection.ConnectionType == ConnectionType.RIVER || m_connection.ConnectionType == ConnectionType.SHALLOWRIVER) { ConstructPoly(pb, offset); draw_river_shore(offset); } else { MeshFilter.mesh.Clear(); } SetSeason(GenerationManager.s_generation_manager.Season); }
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 void RecalculatePoly() { BorderLine.positionCount = 2; BorderLine.SetPositions(new Vector3[] { new Vector3(900, 900, 0), new Vector3(901, 900, 0) }); RoadLine.positionCount = 2; RoadLine.SetPositions(new Vector3[] { new Vector3(900, 900, 0), new Vector3(901, 900, 0) }); MeshFilter.mesh.Clear(); if (m_culling_points == null) { m_culling_points = new List <Vector3>(); } if (PolyBorder == null) { return; } draw_shore(); if (m_connection.ConnectionType == ConnectionType.RIVER || m_connection.ConnectionType == ConnectionType.SHALLOWRIVER) { m_poly = get_contour(PolyBorder, ArtManager.s_art_manager.CurrentArtConfiguration.MinimumRiverWidth, ArtManager.s_art_manager.CurrentArtConfiguration.MaximumRiverWidth); m_full_contour = new List <Vector3>(); m_full_contour.AddRange(m_poly); m_full_contour.Add(m_poly[0]); var key_start = new Keyframe(0f, ArtManager.s_art_manager.CurrentArtConfiguration.ProvinceBorderWidth * 2f); var key_end = new Keyframe(1f, ArtManager.s_art_manager.CurrentArtConfiguration.ProvinceBorderWidth * 2f); BorderLine.widthCurve = new AnimationCurve(key_start, key_end); BorderLine.startColor = GenerationManager.s_generation_manager.BorderColor; BorderLine.endColor = GenerationManager.s_generation_manager.BorderColor; BorderLine.positionCount = m_full_contour.Count; BorderLine.SetPositions(m_full_contour.ToArray()); ConstructPoly(); draw_river_shore(); SetSeason(GenerationManager.s_generation_manager.Season); return; } else if (m_connection.ConnectionType == ConnectionType.ROAD) { var distance = Vector3.Distance(m_pos1, m_pos2); var scaled_reduction = distance * ArtManager.s_art_manager.CurrentArtConfiguration.RoadShortening; var dir = (m_pos2 - m_pos1).normalized; var p1 = m_pos1 + dir * scaled_reduction; var p2 = m_pos2 - dir * scaled_reduction; var road_line = new PolyBorder(p1, p2, m_connection, true); m_culling_points = road_line.OrderedPoints; m_poly = road_line.OrderedFinePoints; draw_road(road_line); } var border = PolyBorder.GetFullLengthBorder(); var fix = new List <Vector3>(); foreach (var v in border) { fix.Add(new Vector3(v.x, v.y, -0.8f)); } var border_scale = 1f; if ((m_connection.Node1.ProvinceData.IsWater && !m_connection.Node2.ProvinceData.IsWater) || (!m_connection.Node1.ProvinceData.IsWater && m_connection.Node2.ProvinceData.IsWater)) { border_scale = 2f; } var arr = fix.ToArray(); var key1 = new Keyframe(0f, ArtManager.s_art_manager.CurrentArtConfiguration.ProvinceBorderWidth * border_scale); var key2 = new Keyframe(1f, ArtManager.s_art_manager.CurrentArtConfiguration.ProvinceBorderWidth * border_scale); BorderLine.widthCurve = new AnimationCurve(key1, key2); BorderLine.positionCount = arr.Length; BorderLine.SetPositions(arr); if (m_connection.IsSeaConnection) { BorderLine.materials = new Material[] { MatSeaBorder }; BorderLine.startColor = GenerationManager.s_generation_manager.SeaBorderColor; BorderLine.endColor = GenerationManager.s_generation_manager.SeaBorderColor; } else { BorderLine.materials = new Material[] { MatLandBorder }; BorderLine.startColor = GenerationManager.s_generation_manager.BorderColor; BorderLine.endColor = GenerationManager.s_generation_manager.BorderColor; } SetSeason(GenerationManager.s_generation_manager.Season); }
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 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 void CreatePolyBorder() { m_border = new PolyBorder(m_tri_centers[0] + transform.position, m_tri_centers[1] + transform.position, Connection); }
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; }
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); }
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 void RecalculatePoly() { BorderLine.positionCount = 2; BorderLine.SetPositions(new Vector3[] { new Vector3(900, 900, 0), new Vector3(901, 900, 0) }); RoadLine.positionCount = 2; RoadLine.SetPositions(new Vector3[] { new Vector3(900, 900, 0), new Vector3(901, 900, 0) }); MeshFilter.mesh.Clear(); if (m_culling_points == null) { m_culling_points = new List <Vector3>(); } if (PolyBorder == null) { return; } draw_shore(); if (m_connection.ConnectionType == ConnectionType.RIVER || m_connection.ConnectionType == ConnectionType.SHALLOWRIVER) { m_poly = get_contour(PolyBorder, 0.02f, 0.08f); ConstructPoly(); draw_river_shore(); SetSeason(GenerationManager.s_generation_manager.Season); return; } else if (m_connection.ConnectionType == ConnectionType.ROAD) { var dir = (m_pos2 - m_pos1).normalized; var p1 = m_pos1 + dir * 0.4f; var p2 = m_pos2 - dir * 0.4f; if (Vector3.Distance(m_pos1, m_pos2) > 3f) { p1 = m_pos1 + dir * 0.6f; p2 = m_pos2 - dir * 0.6f; } if (Vector3.Distance(p1, p2) < 0.5f) { p1 = m_pos1 + dir * 0.3f; p2 = m_pos2 - dir * 0.3f; } var fake = new PolyBorder(p1, p2, m_connection); m_culling_points = fake.OrderedPoints; m_poly = fake.OrderedFinePoints; draw_road(fake); } var border = PolyBorder.GetFullLengthBorder(); var fix = new List <Vector3>(); foreach (var v in border) { fix.Add(new Vector3(v.x, v.y, -0.8f)); } var arr = fix.ToArray(); BorderLine.positionCount = arr.Length; BorderLine.SetPositions(arr); BorderLine.startColor = GenerationManager.s_generation_manager.BorderColor; BorderLine.endColor = GenerationManager.s_generation_manager.BorderColor; SetSeason(GenerationManager.s_generation_manager.Season); }