Ejemplo n.º 1
0
    public static void Invoke(List <Vector3> points, List <Vector3> border, float min_dist)
    {
        var job = new NativeCullNearby {
            border   = new NativeArray <Vector3>(border.ToArray(), Allocator.TempJob),
            points   = new NativeArray <Vector3>(points.ToArray(), Allocator.TempJob),
            n_out    = new NativeArray <int>(1, Allocator.TempJob),
            min_dist = min_dist,
        };

        job.Schedule().Complete();
        points.Clear();
        int n = job.n_out[0];

        for (int i = 0; i < n; ++i)
        {
            points.Add(job.points[i]);
        }
        job.border.Dispose();
        job.points.Dispose();
        job.n_out.Dispose();
    }
Ejemplo n.º 2
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;
    }