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(); }
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; }