Ejemplo n.º 1
0
    private void do_ray_trace(Vector3 pt, MapSpriteSet set)
    {
        pt.z = -900;

        if (Physics.Raycast(pt, Vector3.forward, out var hit, 9000))
        {
            if (hit.collider == MeshCollider)
            {
                var hitpt = new Vector3(hit.point.x, hit.point.y, 0);

                if (m_poly.Any(x => Vector3.Distance(x, hitpt) < set.ProvinceEdgeThreshold))
                {
                    return;
                }

                hitpt.z = -10;
                m_sprite_points.Add(hitpt);
            }
        }
    }
Ejemplo n.º 2
0
    public void CalculateSpritePoints()
    {
        m_sprite_points = new List <Vector3>();
        Vector3 mins = get_mins();
        Vector3 maxs = get_maxs();
        Vector3 cur  = new Vector3(mins.x, mins.y);
        Vector3 cc   = MeshCollider.bounds.center;
        //List<ConnectionMarker> roads = m_connections.Where(x => x.Connection.ConnectionType == ConnectionType.ROAD).ToList();
        MapSpriteSet set = ArtManager.s_art_manager.GetMapSpriteSet(m_node.ProvinceData.Terrain);

        while (cur.x < maxs.x)
        {
            while (cur.y < maxs.y)
            {
                do_ray_trace(cur, set);

                cur.y += UnityEngine.Random.Range(0.04f, 0.06f);
            }

            cur.y  = mins.y + UnityEngine.Random.Range(0.04f, 0.06f);
            cur.x += 0.04f;
        }

        m_sprite_points.Shuffle();
        List <Vector3> result = new List <Vector3>();

        float cull      = ArtManager.s_art_manager.SpriteSetCollection.GetCullChance(m_node.ProvinceData.Terrain);
        int   cullcount = Mathf.RoundToInt((1.0f - cull) * m_sprite_points.Count);

        for (int i = 0; i < cullcount; i++)
        {
            result.Add(m_sprite_points[i]);
        }

        m_sprite_points = result;
    }
Ejemplo n.º 3
0
    public IEnumerable CalculateSpritePoints()
    {
        if (m_wraps != null)
        {
            foreach (ProvinceWrapMarker m in m_wraps)
            {
                m.CalculateSpritePoints();
                if (Util.ShouldYield())
                {
                    yield return(null);
                }
            }
        }

        m_sprite_points = new List <Vector3>();
        Vector3 mins = get_mins();
        Vector3 maxs = get_maxs();
        Vector3 cur  = new Vector3(mins.x, mins.y);
        List <ConnectionMarker> roads_rivers = m_connections.Where(x => x.Connection.ConnectionType == ConnectionType.ROAD || x.Connection.ConnectionType == ConnectionType.SHALLOWRIVER);
        MapSpriteSet            set          = ArtManager.s_art_manager.GetMapSpriteSet(m_node.ProvinceData.Terrain);

        while (cur.x < maxs.x)
        {
            while (cur.y < maxs.y)
            {
                var pt = cur;
                pt.z = -900;
                RaycastHit hit;

                if (MeshCollider.Raycast(new Ray(pt, Vector3.forward), out hit, 9000))
                {
                    m_sprite_points.Add(new Vector3(pt.x, pt.y, 0));
                }
                cur.y += UnityEngine.Random.Range(0.04f, 0.06f);
            }

            cur.y  = mins.y + UnityEngine.Random.Range(0.04f, 0.06f);
            cur.x += 0.04f;
            if (Util.ShouldYield())
            {
                yield return(null);
            }
        }

        NativeCullNearby.Invoke(m_sprite_points, GetCullPoints(roads_rivers), set.ProvinceEdgeThreshold);
        for (int i = 0; i < m_sprite_points.Count; ++i)
        {
            m_sprite_points[i] += new Vector3(0, 0, -10);
        }

        m_sprite_points.Shuffle();
        List <Vector3> result = new List <Vector3>();

        float cull      = ArtManager.s_art_manager.SpriteSetCollection.GetCullChance(m_node.ProvinceData.Terrain);
        int   cullcount = Mathf.RoundToInt((1.0f - cull) * m_sprite_points.Count);

        for (int i = 0; i < cullcount; i++)
        {
            result.Add(m_sprite_points[i]);
        }

        m_sprite_points = result;
    }
Ejemplo n.º 4
0
    public List <SpriteMarker> PlaceSprites()
    {
        ClearSprites();

        if (m_wraps != null)
        {
            foreach (ProvinceWrapMarker m in m_wraps)
            {
                m.PlaceSprites();
            }
        }

        MapSpriteSet set = ArtManager.s_art_manager.GetMapSpriteSet(m_node.ProvinceData.Terrain);

        if (!set.MapSprites.Any())
        {
            return(new List <SpriteMarker>());
        }

        List <ProvinceSprite> shuffled = set.MapSprites.Where(x => x.IsCenterpiece && m_node.ProvinceData.Terrain.IsFlagSet(x.ValidTerrain));

        if (m_node.ProvinceData.Terrain.IsFlagSet(Terrain.LARGEPROV) && !m_node.ProvinceData.IsWater)
        {
            shuffled = set.MapSprites.Where(x => x.IsCenterpiece && x.ValidTerrain == Terrain.LARGEPROV);
        }

        shuffled.Shuffle();
        List <ProvinceSprite> centers = shuffled.OrderBy(x => 9000f - x.Size).ToList();

        if (centers.Any() && !IsDummy) // certain provinces have a centerpiece so place that first
        {
            foreach (ProvinceSprite ps in centers)
            {
                if (ps.Size < m_center_size)
                {
                    Vector3 pos = m_poly_center;
                    m_sprite_points = m_sprite_points.Where(x => !(Vector3.Distance(x, pos) < ps.Size * 0.5f || Mathf.Abs(pos.y - x.y) < 0.2f));
                    pos.z           = -3;
                    sprite_group.PlaceSprite(ps, pos);

                    break;
                }
            }
        }

        set.MapSprites.Shuffle();
        List <ProvinceSprite> sprites = new List <ProvinceSprite>();

        foreach (ProvinceSprite ps in set.MapSprites) // guarantee that we have at least 1 of each valid sprite
        {
            if (!m_node.ProvinceData.Terrain.IsFlagSet(ps.ValidTerrain) || ps.IsCenterpiece || !m_sprite_points.Any())
            {
                continue;
            }
            sprites.Add(ps);
        }

        if (sprites.Count == 0)
        {
            return(new List <SpriteMarker>());
        }
        {
            List <NativeObjectPlacer.Item> sprite_items = new List <NativeObjectPlacer.Item>();
            List <float> sprite_size = new List <float>();
            foreach (var s in sprites)
            {
                sprite_items.Add(new NativeObjectPlacer.Item
                {
                    size              = s.Size,
                    spawn_chance      = s.SpawnChance,
                    extra_border_dist = s.ValidTerrain == Terrain.LARGEPROV ? 1 : 0,
                });
            }
            List <Vector3> already_placed = new List <Vector3>();
            already_placed.AddRange(sprite_group.SpritePos());
            List <int> objs = NativeObjectPlacer.Invoke(sprite_items, m_sprite_points, m_poly, already_placed);
            for (int i = 0; i < objs.Count; ++i)
            {
                sprite_group.PlaceSprite(sprites[objs[i]], m_sprite_points[i]);
            }
            m_sprite_points.Clear();
        }

        List <SpriteMarker> all = new List <SpriteMarker>();

        foreach (ProvinceWrapMarker m in m_wraps)
        {
            all.AddRange(m.PlaceSprites());
        }

        sprite_group.Build(CaptureCam.Bounds());

        return(all);
    }
Ejemplo n.º 5
0
    public List <SpriteMarker> PlaceSprites()
    {
        MapSpriteSet set = ArtManager.s_art_manager.GetMapSpriteSet(m_node.ProvinceData.Terrain);

        if (!set.MapSprites.Any())
        {
            return(m_sprites);
        }

        int valid_ct = set.MapSprites.Where(x => m_node.ProvinceData.Terrain.IsFlagSet(x.ValidTerrain)).Count();

        if (valid_ct == 0)
        {
            return(m_sprites);
        }

        while (m_sprite_points.Any())
        {
            Vector3        pos = m_sprite_points[0];
            ProvinceSprite ps  = ArtManager.s_art_manager.GetProvinceSprite(m_node.ProvinceData.Terrain);

            if (ps == null)
            {
                m_sprite_points.Remove(pos);
                continue;
            }

            while (UnityEngine.Random.Range(0f, 1f) > ps.SpawnChance)
            {
                ps = ArtManager.s_art_manager.GetProvinceSprite(m_node.ProvinceData.Terrain);

                if (ps == null)
                {
                    break;
                }
            }

            if (ps == null)
            {
                m_sprite_points.Remove(pos);
                continue;
            }

            List <Vector3> remove = m_sprite_points.Where(x => Vector3.Distance(x, pos) < ps.Size).ToList();

            foreach (Vector3 p in remove)
            {
                m_sprite_points.Remove(p);
            }

            //m_sprite_points.Remove(pos);
            pos.z = -3f;

            GameObject   g  = GameObject.Instantiate(MapSpritePrefab);
            SpriteMarker sm = g.GetComponent <SpriteMarker>();
            sm.SetSprite(ps);
            sm.transform.position = pos;

            m_sprites.Add(sm);
            m_sprites.AddRange(sm.CreateMirrorSprites(Vector3.zero, Vector3.zero));
        }

        return(m_sprites);
    }