public static List <int> Invoke(List <Item> item, List <Vector3> points, List <Vector3> border, List <Vector3> already_placed_items) { var max_res_count = points.Count + already_placed_items.Count; var points_res = new NativeArray <Vector3>(max_res_count, Allocator.TempJob); for (int i = 0; i < already_placed_items.Count; ++i) { points_res[i] = already_placed_items[i]; } var job = new NativeObjectPlacer { item = new NativeArray <Item>(item.ToArray(), Allocator.TempJob), points = new NativeArray <Vector3>(points.ToArray(), Allocator.TempJob), border = new NativeArray <Vector3>(border.ToArray(), Allocator.TempJob), item_types = new NativeArray <int>(max_res_count, Allocator.TempJob), n_out = new NativeArray <int>(1, Allocator.TempJob), n_in = points.Count, points_res = points_res, seed = Random.Range(0, 1000000), n_v = already_placed_items.Count, }; job.Schedule().Complete(); List <int> res = new List <int>(); int n = job.n_out[0]; for (int i = already_placed_items.Count; i < n; ++i) { points[i - already_placed_items.Count] = job.points_res[i]; res.Add(job.item_types[i]); } job.item.Dispose(); job.points.Dispose(); job.border.Dispose(); job.item_types.Dispose(); job.n_out.Dispose(); job.points_res.Dispose(); return(res); }
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); }
public List <SpriteMarker> PlaceSprites() { ClearSprites(); if (m_wraps != null) { foreach (var m in m_wraps) { m.PlaceSprites(); } } var set = ArtManager.s_art_manager.GetMapSpriteSet(m_node.ProvinceData.Terrain); if (!set.MapSprites.Any()) { return(new List <SpriteMarker>()); } var 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(); var centers = shuffled.OrderBy(x => 9000f - x.Size).ToList(); if (centers.Any() && !IsDummy) // certain provinces have a centerpiece so place that first { foreach (var ps in centers) { if (ps.Size < m_center_size) { var pos = m_poly_center; if (ps.CullSpritePositions) { pos.z = -10; // sprite points are at z = -10 so we need to match that m_sprite_points = m_sprite_points.Where(x => (Vector3.Distance(x, pos) > (ps.Size * 0.4f))); } pos.z = -3; // sprite placement is at z = -3 SpriteGroup.PlaceSprite(ps, pos); break; } } } set.MapSprites.Shuffle(); var sprites = new List <ProvinceSprite>(); foreach (var 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) { continue; } sprites.Add(ps); } if (sprites.Count == 0) { return(new List <SpriteMarker>()); } var sprite_items = new List <NativeObjectPlacer.Item>(); var sprite_size = new List <float>(); foreach (var s in sprites) { sprite_items.Add(new NativeObjectPlacer.Item { size = s.Size, spawn_chance = s.SpawnChance, place_at_least_1 = s.PlaceAtLeastOne == true ? 1 : 0, extra_border_dist = s.ValidTerrain == Terrain.LARGEPROV ? 1 : 0, cull_nearby_points = s.CullSpritePositions == true ? 1 : 0 }); } var already_placed = new List <Vector3>(); already_placed.AddRange(SpriteGroup.SpritePos()); var objs = NativeObjectPlacer.Invoke(sprite_items, m_sprite_points, m_poly, already_placed); for (var i = 0; i < objs.Count; ++i) { SpriteGroup.PlaceSprite(sprites[objs[i]], m_sprite_points[i]); } m_sprite_points.Clear(); var all = new List <SpriteMarker>(); foreach (var m in m_wraps) { all.AddRange(m.PlaceSprites()); } SpriteGroup.Build(CaptureCam.Bounds()); return(all); }