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