Esempio n. 1
0
    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;
        }
    }
Esempio n. 3
0
    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;
    }
Esempio n. 5
0
    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);
    }
Esempio n. 6
0
    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);
    }
Esempio n. 7
0
    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);
        }
    }
Esempio n. 8
0
    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);
        }
    }
Esempio n. 9
0
    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);
    }
Esempio n. 10
0
    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);
        }
    }
Esempio n. 12
0
    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;
    }
Esempio n. 13
0
    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);
    }
Esempio n. 16
0
    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);
    }
Esempio n. 17
0
    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);
    }
Esempio n. 18
0
    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);
    }
Esempio n. 19
0
 public void CreatePolyBorder()
 {
     m_border = new PolyBorder(m_tri_centers[0] + transform.position, m_tri_centers[1] + transform.position, Connection);
 }
Esempio n. 20
0
    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;
    }
Esempio n. 21
0
    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);
    }
Esempio n. 22
0
    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);
    }
Esempio n. 23
0
    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);
    }