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);
        }
예제 #2
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        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());
            }
        }
예제 #8
0
        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);
                }
            }
        }
예제 #9
0
        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);
        }