public override void ColorTileRay(PaintedHillsMod mymod, int origin_tile_x, int origin_tile_y, float radians, float tile_length) { var tile_origin = new Vector2(origin_tile_x, origin_tile_y); Vector2 unit_rotated = Vector2.UnitX.RotatedBy(radians); Vector2 beg_tile_offset = unit_rotated * 1f; Vector2 end_tile_offset = unit_rotated * (tile_length - 1f); Vector2 beg_pos = (tile_origin + beg_tile_offset) * 16; Vector2 end_pos = (tile_origin + end_tile_offset) * 16; var paint_func = new Utils.PerLinePoint(delegate(int tile_x_at, int tile_y_at) { if (tile_x_at < 0 || tile_x_at >= Main.maxTilesX || tile_y_at < 0 || tile_y_at > Main.maxTilesY) { return(false); } var at_pos = new Vector2(tile_x_at, tile_y_at) * 16f; float percent = Vector2.Distance(beg_pos, at_pos) / (tile_length * 16f); if (Main.rand.NextFloat() > percent) { if (!this.HueMap.HasHue(tile_x_at, tile_y_at)) { this.ColorTile(mymod, tile_x_at, tile_y_at); } } return(true); }); Utils.PlotTileLine(beg_pos, end_pos, 3, paint_func); }
public static void PaintFlood(PaintedHillsMod mymod, Colorer colorer, int tile_x, int tile_y, Paints hue) { var peek = new Dictionary <int, ISet <int> >(); peek[tile_x] = new HashSet <int>(); peek[tile_x].Add(tile_y); do { foreach (int x in peek.Keys) { foreach (int y in peek[x]) { colorer.ColorTile(mymod, x, y); } } int[] peek_x = peek.Keys.ToArray(); foreach (int x in peek_x) { int[] peek_y = peek[x].ToArray(); foreach (int y in peek_y) { AreaPainter.PeekAdjacentClearTiles(colorer.HueMap, peek, x, y); peek[x].Remove(y); } if (peek[x].Count == 0) { peek.Remove(x); } } } while(peek.Count > 0); }
public override void ColorTileLine(PaintedHillsMod mymod, int begin_tile_x, int begin_tile_y, int end_tile_x, int end_tile_y) { var beg_pos = new Vector2(begin_tile_x, begin_tile_y) * 16f; var end_pos = new Vector2(end_tile_x, end_tile_y) * 16f; float length = Vector2.Distance(beg_pos, end_pos); var paint_func = new Utils.PerLinePoint(delegate(int tile_x_at, int tile_y_at) { if (tile_x_at < 0 || tile_x_at >= Main.maxTilesX || tile_y_at < 0 || tile_y_at > Main.maxTilesY) { return(false); } var at_pos = new Vector2(tile_x_at, tile_y_at) * 16f; float percent = Vector2.Distance(beg_pos, at_pos) / length; if (Main.rand.NextFloat() > percent) { if (!this.HueMap.HasHue(tile_x_at, tile_y_at)) { this.ColorTile(mymod, tile_x_at, tile_y_at); } } return(true); }); Utils.PlotTileLine(beg_pos, end_pos, 3, paint_func); }
public virtual void ColorTile(PaintedHillsMod mymod, int tile_x, int tile_y) { if (TileHelpers.IsAir(Framing.GetTileSafely(tile_x, tile_y))) { return; } this.HueMap.AddHue(tile_x, tile_y, this.Hue); }
public static void PaintBlob(PaintedHillsMod mymod, Colorer colorer, int tile_x, int tile_y, float size, float size_variance, float shape_variance) { IDictionary <float, float> rays = RayPainter.GetChunkRays(size, size_variance, shape_variance); //if( (mymod.DEBUGFLAGS & 1) != 0 ) { // ErrorLogger.Log( JsonConfig<IDictionary<float, float>>.Serialize( rays ) ); //} //PaintRays.PaintRadiationEdges( huemap, tile_x, tile_y, rays, hue, new Painter(PaintBasic.PaintTile) ); //foreach( float rad in rays.Keys ) { // PaintRays.PaintRay( huemap, tile_x, tile_y, rad, rays[rad], hue, new Painter( PaintArea.PaintFlood ) ); //} RayPainter.PaintRadiation(mymod, colorer, tile_x, tile_y, rays); }
public virtual void ColorTileLine(PaintedHillsMod mymod, int begin_tile_x, int begin_tile_y, int end_tile_x, int end_tile_y) { var paint_func = new Utils.PerLinePoint(delegate(int tile_x_at, int tile_y_at) { if (tile_x_at < 0 || tile_x_at >= Main.maxTilesX || tile_y_at < 0 || tile_y_at > Main.maxTilesY) { return(false); } if (!this.HueMap.HasHue(tile_x_at, tile_y_at)) { this.ColorTile(mymod, tile_x_at, tile_y_at); } return(true); }); var beg_pos = new Vector2(begin_tile_x * 16f, begin_tile_y * 16f); var end_pos = new Vector2(end_tile_x * 16f, end_tile_y * 16f); Utils.PlotTileLine(beg_pos, end_pos, 3, paint_func); }
public static void PaintRadiationEdges(PaintedHillsMod mymod, Colorer colorer, int tile_x, int tile_y, IDictionary <float, float> ray_rads_and_lengths) { Vector2 tile_origin = new Vector2(tile_x, tile_y); Vector2 beg_pos = Vector2.Zero; Vector2 end_pos = Vector2.Zero; SortedSet <float> keys = new SortedSet <float>(ray_rads_and_lengths.Keys); for (int i = 0; i < 60; i++) { float curr_rad = RayPainter.GetRadianAt(i % 60); float next_rad = RayPainter.GetRadianAt((i + 1) % 60); beg_pos = tile_origin + (Vector2.UnitX.RotatedBy(curr_rad) * ray_rads_and_lengths[curr_rad]); end_pos = tile_origin + (Vector2.UnitX.RotatedBy(next_rad) * ray_rads_and_lengths[next_rad]); double add_rad = Math.Atan2(end_pos.Y - beg_pos.Y, end_pos.X - beg_pos.X); end_pos += Vector2.UnitX.RotatedBy(add_rad) * 2f; colorer.ColorTileLine(mymod, (int)beg_pos.X, (int)beg_pos.Y, (int)end_pos.X, (int)end_pos.Y); //ErrorLogger.Log( "PaintRadiationEdges x:"+tile_x+", y:"+tile_y+", rad:"+rad+", len:"+ray_rads_and_lengths[rad]+", offset:"+curr_tile_offset.ToString()); } }
public static void PaintRadiation(PaintedHillsMod mymod, Colorer colorer, int tile_x, int tile_y, IDictionary <float, float> ray_rads_and_lengths) { float steps = mymod.Config.HueBlobMinimumTileRadius; var rays = new SortedSet <float>(ray_rads_and_lengths.Keys); for (int i = 0; i < 60; i++) { float curr_rad = RayPainter.GetRadianAt(i % 60); float next_rad = RayPainter.GetRadianAt((i + 1) % 60); float curr_range = ray_rads_and_lengths[curr_rad]; float range_span = curr_range - ray_rads_and_lengths[next_rad]; //ErrorLogger.Log( "x: "+tile_x+", y: "+tile_y+", rad: "+curr_rad+", nextrad: "+next_rad+", range: "+curr_range+", span: "+range_span); for (float j = 0; j < steps; j += 1f) { float step_rad = curr_rad + RayPainter.GetRadianAt(j / steps); float step_range = curr_range + (range_span * (j / steps)); colorer.ColorTileRay(mymod, tile_x, tile_y, step_rad, step_range); } } }
public virtual void ColorTileRay(PaintedHillsMod mymod, int origin_tile_x, int origin_tile_y, float radians, float tile_length) { var tile_origin = new Vector2(origin_tile_x, origin_tile_y); var paint_func = new Utils.PerLinePoint(delegate(int tile_x_at, int tile_y_at) { if (tile_x_at < 0 || tile_x_at >= Main.maxTilesX || tile_y_at < 0 || tile_y_at > Main.maxTilesY) { return(false); } if (!this.HueMap.HasHue(tile_x_at, tile_y_at)) { this.ColorTile(mymod, tile_x_at, tile_y_at); } return(true); }); Vector2 unit_rotated = Vector2.UnitX.RotatedBy(radians); Vector2 beg_tile_offset = unit_rotated * 1f; Vector2 end_tile_offset = unit_rotated * (tile_length - 1f); Vector2 beg_pos = (tile_origin + beg_tile_offset) * 16; Vector2 end_pos = (tile_origin + end_tile_offset) * 16; Utils.PlotTileLine(beg_pos, end_pos, 3, paint_func); }