コード例 #1
0
ファイル: Program.cs プロジェクト: kurtis2222/snarf-win32
    private void SnarfCollisionCheck(PSprite snarf)
    {
        int i;

        //Wall collisions
        for (i = 0; i < game_wall.Count; i++)
        {
            if (snarf.pos.IntersectsWith(game_wall[i].pos))
            {
                CheckCollision(snarf, game_wall[i].pos);
                return;
            }
        }
        //Snarf pits
        for (i = 0; i < game_pits.Count; i++)
        {
            if (snarf.pos.IntersectsWith(game_pits[i].pos))
            {
                CheckCollision(snarf, game_pits[i].pos);
                return;
            }
        }
        //Teleport
        for (i = 0; i < game_tele.Count; i++)
        {
            if (snarf.pos.IntersectsWith(game_tele[i].pos))
            {
                CheckCollision(snarf, game_tele[i].pos);
                return;
            }
        }
    }
コード例 #2
0
        public void Draw(float delta)
        {
            PSprite last = null;

            Parallel.For(completed, completed + imagesPerFrame + 1, i =>
            {
                if (i < imageCount)
                {
                    var input = PSprite.FromFilePath(@"E\image-" + (i + 1).ToString("00000") + ".png");
                    input     = Convert(input);
                    input.Save(@"E\out-" + i.ToString("00000") + ".png");
                    last = input;
                }
                else
                {
                    Console.WriteLine("A");
                }
            });

            if (last != null)
            {
                Art.DrawImage(last, 0, 0, Width, Height);
            }

            completed += imagesPerFrame;
        }
コード例 #3
0
        public PSprite Convert(PSprite i2)
        {
            var pixels = i2.Art.GetPixels();

            //double newValue = 0;
            //var c = (100.0 + -15) / 100.0;

            //c *= c;

            //for (int i = 0; i < pixels.Length; i++)
            //{
            //    newValue = pixels[i];

            //    newValue /= 255.0;
            //    newValue -= 0.5;
            //    newValue *= c;
            //    newValue += 0.5;
            //    newValue *= 255;

            //    if (newValue < 0)
            //        newValue = 0;
            //    if (newValue > 255)
            //        newValue = 255;

            //    pixels[i] = (byte)newValue;
            //}

            for (var y = 0; y < i2.Height; y++)
            {
                for (var x = 0; x < i2.Width; x++)
                {
                    var index = (x + (y * i2.Width)) * 4;
                    var co    = new PColor();
                    co.A = 255;
                    co.B = pixels[index];
                    co.G = pixels[index + 1];
                    co.R = pixels[index + 2];
                    var c2 = Convert(co);
                    pixels[index]     = (byte)c2.B;
                    pixels[index + 1] = (byte)c2.G;
                    pixels[index + 2] = (byte)c2.R;
                    pixels[index + 3] = 255;

                    //i.Art.Set(x, y, Convert(i.Art.GetPixel(x, y)));
                }
            }

            i2.Art.SetPixels(pixels);

            return(i2);
        }
コード例 #4
0
        public void Setup()
        {
            var i    = 1;
            var name = "image-" + i.ToString("00000") + ".png";

            while (File.Exists(@"E\" + name))
            {
                imageCount++;
                i++;
                name = "image-" + i.ToString("00000") + ".png";
            }

            Art.DrawImage(Convert(PSprite.FromFilePath("b.png")), 0, 0, Width, Height);
        }
コード例 #5
0
        public PixelParticles(string[] args)
        {
            var mode = "";

            foreach (var a in args)
            {
                if (a.Trim() == string.Empty)
                {
                    continue;
                }
                if (a.StartsWith("-"))
                {
                    mode = a.Substring(1);
                }
                else
                {
                    switch (mode)
                    {
                    case "s": StartImagePath = a; break;

                    case "e": EndImagePath = a; break;

                    case "f": OutputImagesFolderPath = a; break;

                    case "o": OutputVideoPath = a; break;

                    case "t": TimeToTakeSeconds = float.Parse(a); break;

                    case "p": PixelLength = int.Parse(a); break;

                    case "b": BufferFrames = int.Parse(a); break;

                    case "x": ExportMode = a; break;

                    case "r": FrameRateTarget = int.Parse(a); break;

                    case "i": BackgroundImage = PSprite.FromFilePath(a); break;
                    }
                }

                if (a == "-count")
                {
                    Count = true;
                }
            }

            CreateCanvas(1920, 1080, FrameRateTarget);
        }
コード例 #6
0
ファイル: RedFilter.cs プロジェクト: GuyInGrey/Processing
        public void Draw(float delta)
        {
            var spritePath = Images[i];
            var sprite     = PSprite.FromFilePath(spritePath);
            var pixels     = sprite.Art.GetPixels();
            //for (var i = 0; i < Width * Height; i++)
            //{
            //    var index = (i * 4) + 2;
            //    pixels[index] = 0;
            //}
            var max = Width * Height * 4;

            for (var index = 2; index < max; index += 4)
            {
                pixels[index] = 0;
            }
            sprite.Art.SetPixels(pixels);

            sprite.Save($@"LargestStar\OutImages\{i:000000}.png");
            Art.DrawImage(sprite, 0, 0, Width, Height);

            i++;
        }
コード例 #7
0
ファイル: Program.cs プロジェクト: kurtis2222/snarf-win32
 void CheckCollision(PSprite src, Rectangle trg)
 {
     if (src.dir == 0 && src.pos.Top < trg.Bottom)
     {
         src.pos.Y = trg.Bottom;
         src.dir   = (byte)(++src.dir % 4);
     }
     else if (src.dir == 1 && src.pos.Bottom > trg.Top)
     {
         src.pos.Y = trg.Top - IMG_SIZE;
         src.dir   = (byte)(++src.dir % 4);
     }
     else if (src.dir == 2 && src.pos.Left < trg.Right)
     {
         src.pos.X = trg.Right;
         src.dir   = (byte)(++src.dir % 4);
     }
     else if (src.dir == 3 && src.pos.Right > trg.Left)
     {
         src.pos.X = trg.Left - IMG_SIZE;
         src.dir   = (byte)(++src.dir % 4);
     }
 }
コード例 #8
0
        public static void CreateAnimation(Viewport from, Viewport to, ref ReadOnlyBuffer <float> coordinates, int imageWidth, int imageHeight)
        {
            // Creating/handling the frames folder.
            if (Directory.Exists("frames"))
            {
                foreach (var f in Directory.GetFiles("frames"))
                {
                    File.Delete(f);
                }
            }
            else
            {
                Directory.CreateDirectory("frames");
            }
            Thread.Sleep(500);

            var previousMaxDensity = -1f;

            /// This just determines how many frames to render.
            var timeToTake = 1; // seconds
            var frameRate  = 1000;

            var progress = 0;

            var watch = new Stopwatch();

            watch.Start();
            for (var i = 0; i < frameRate * timeToTake; i++)
            {
                var t = i / (float)(frameRate * timeToTake);
                t = Smoothing(t);
                var image = new PSprite(imageWidth, imageHeight);
                image.Art.SetPixels(GalaxyRenderer.Render(
                                        Viewport.Lerp(from, to, t), 1000, 1000,
                                        GalaxyRenderer.DefaultColorMapping,
                                        i == 0 ? (float?)null : previousMaxDensity,
                                        out previousMaxDensity,
                                        ref coordinates));
                if (!(image is null))
                {
                    image.Save(@"frames\" + i.ToString("000000") + ".png");
                    image.Dispose();
                }
                progress++;

                #region Logging progress per frame
                Console.WriteLine(progress + " / " + (frameRate * timeToTake) + "  -  " + ((progress * 100) / (double)(frameRate * timeToTake)).ToString("0.00") + "%");

                var secondsPerFrame = watch.Elapsed.TotalSeconds / progress;
                var framesRemaining = (frameRate * timeToTake) - progress;
                var timeRemaining   = new TimeSpan((long)(10000000 * (framesRemaining * secondsPerFrame)));
                Console.WriteLine("Estimated time remaining: " +
                                  timeRemaining.Hours.ToString("00") + ":" +
                                  timeRemaining.Minutes.ToString("00") + ":" +
                                  timeRemaining.Seconds.ToString("00"));
                Console.WriteLine("Average time per frame: " + secondsPerFrame.ToString("0.00") + " seconds.");
                #endregion
            }

            Console.WriteLine("Frame rendering complete. Compiling video...");
            var info = new ProcessStartInfo()
            {
                FileName         = "ffmpeg",
                Arguments        = string.Format(" -framerate {0} -i %06d.png -c:v libx264 -r {0} {1}.mp4", frameRate, "out"),
                WorkingDirectory = "frames",
            };
            var p = Process.Start(info);
            p.WaitForExit();
            Console.WriteLine("Finished. Saved video as out.mp4.");
            Console.Read();
        }
コード例 #9
0
ファイル: MandelbrotV1.cs プロジェクト: GuyInGrey/Processing
        public void Setup()
        {
            Console.Write("Enter video framerate: ");
            var framerate = Console.ReadLine();

            Console.Write("Enter total frame count: ");
            var frames = int.Parse(Console.ReadLine());

            Console.Write("Enter output video file name (no extension): ");
            var name = Console.ReadLine().Trim();

            Console.Write("Enter resolution separated by a comma (480,480): ");
            var res = Console.ReadLine().Split(',').ToList().ConvertAll(resPart => int.Parse(resPart)).ToArray();

            Console.Write("Enter mandelbrot power range (x in f(z)=z^x + c) separated by a comma (1,10): ");
            var range = Console.ReadLine().Split(',').ToList().ConvertAll(rangePart => int.Parse(rangePart)).ToArray();
            var s     = Stopwatch.StartNew();

            Console.WriteLine("Generation is starting, please wait...");
            var done = 0;

            var items  = Enumerable.Range(0, frames).ToArray();
            var chunks = items
                         .Select((s2, i) => new { Value = s2, Index = i })
                         .GroupBy(x => x.Index / 10)
                         .Select(grp => grp.Select(x => x.Value).ToArray()).ToList();

            var threads = new List <Thread>();

            for (var t = 0; t < Environment.ProcessorCount - 1; t++)
            {
                var t2     = t;
                var thread = new Thread(() =>
                {
                    start:;
                    if (chunks.Count == 0)
                    {
                        goto exit;
                    }

                    var assignedChunk = chunks[0];
                    chunks.RemoveAt(0);
                    foreach (var a in assignedChunk)
                    {
                        var pow   = PMath.Map(a, 1, frames, range[0], range[1]);
                        var Image = new PSprite(res[0], res[1]);

                        var pixels = Image.Art.GetPixels();
                        for (var y = 0; y < Image.Height; y++)
                        {
                            for (var x = 0; x < Image.Width; x++)
                            {
                                var xTarget = 4f;
                                var yTarget = (xTarget / Image.Width) * Image.Height;

                                var x2 = (x / (Image.Width / (xTarget))) - (xTarget / 2);
                                var y2 = (y / (Image.Height / (yTarget))) - (yTarget / 2);

                                var c         = new Complex(x2, y2);
                                var z         = Complex.Zero;
                                var max       = -1f;
                                var maxWasHit = false;
                                for (var i = 0; i < maxDepth; i++)
                                {
                                    z = (Complex.Pow(z, pow)) + c;
                                    if ((z.Real * z.Real) + (z.Imaginary * z.Imaginary) > 16 && max == -1f)
                                    {
                                        max       = i;
                                        maxWasHit = true;
                                        break;
                                    }
                                }

                                var color = PColor.Black;

                                if (maxWasHit)
                                {
                                    var floorMax = (int)Math.Floor(max);
                                    var c1       = pallet[floorMax % pallet.Length];
                                    var c2       = pallet[(floorMax + 1) % pallet.Length];
                                    color        = PColor.Lerp(c1, c2, 0.5f);
                                }

                                var pos = ((y * Image.Width) + x) * 4;

                                pixels[pos]     = (byte)(color.R);
                                pixels[pos + 1] = (byte)(color.G);
                                pixels[pos + 2] = (byte)(color.B);
                                pixels[pos + 3] = 255;
                            }
                        }
                        Image.Art.SetPixels(pixels);
                        Image.Save(folder + a.ToString("000000") + ".png");
                        var percent           = (done / (float)frames);
                        var remaining         = (1f - percent) * 100;
                        var secondsPerPercent = s.Elapsed.TotalSeconds / (percent * 100f);
                        var minutesRemaining  = ((secondsPerPercent * remaining) / 60f);
                        var estimatedTime     = DateTime.Now.AddMinutes(done == 0 ? 0 : minutesRemaining);
                        Console.WriteLine("Progress: " + done + "/" + frames + "  " + (percent * 100f).ToString("0.00") +
                                          "%   Estimated completion time: " + estimatedTime);
                        done++;
                    }
                    goto start;
                    exit:;
                })
                {
                    Name     = "Mandelbrot: Core " + (t + 1),
                    Priority = ThreadPriority.AboveNormal,
                };
                threads.Add(thread);
                thread.Start();
            }
            ;

            var info = new ProcessStartInfo()
            {
                FileName         = "ffmpeg",
                Arguments        = string.Format(" -framerate {0} -i %06d.png -c:v libx264 -r {0} {1}.mp4", framerate, name),
                WorkingDirectory = folder,
            };

            var activeThreads = 1;

            do
            {
                Console.Title = "Active thread count: " + activeThreads;
                activeThreads = threads.Where(t => t.IsAlive).Count();
                Thread.Sleep(1000);
                Title(activeThreads);
            }while (activeThreads > 0);

            Console.Title = "Active thread count: 0";

            var p = Process.Start(info);

            p.WaitForExit();

            Console.WriteLine(@"Saved as " + folder + "out.mp4");
            Console.ReadLine();
            Close();
        }
コード例 #10
0
        public void Setup()
        {
            StartImage = PSprite.FromFilePath(StartImagePath);
            EndImage   = PSprite.FromFilePath(EndImagePath);

            if (Count)
            {
                var startCount = 0;
                var endCount   = 0;

                for (var y = 0; y < Height; y++)
                {
                    for (var x = 0; x < Width; x++)
                    {
                        if (StartImage.Art.GetPixel(x, y).A > 0)
                        {
                            startCount++;
                        }
                        if (EndImage.Art.GetPixel(x, y).A > 0)
                        {
                            endCount++;
                        }
                    }
                }

                Console.WriteLine("Start: " + startCount);
                Console.WriteLine("End: " + endCount);
                Console.ReadLine();

                return;
            }

            var startPixels = StartImage.Art.GetPixels();

            AvailablePositions = new OrderedDictionary();
            pixels             = new List <Pixel>(Width * Height);

            CalculateStart(Width, Height);

            var imagePixels = EndImage.Art.GetPixels();

            var totalDone = 0;

            var width      = Width;
            var height     = Height;
            var generating = false;
            var count      = 0;

            var distance = 0;

            for (var y = 0; y < height; y++)
            {
                for (var x = 0; x < width; x++)
                {
                    var b = (x + (y * width)) * 4;
                    var c = PColor.FromPixels(imagePixels, b);

                    if (c.A > 0)
                    {
                        if (AvailablePositions.Count == 0)
                        {
                            if (generating)
                            {
                                while (generating)
                                {
                                }
                                goto b;
                            }

                            generating = true;
                            CalculateStart(width, height);
                            generating = false;
                        }

                        b :;

                        var pos = (-1, -1);

                        distance -= 2;
                        if (distance < 0)
                        {
                            distance = 0;
                        }
                        goto endWhile; // To Skip
                        do
                        {
                            //for (var y2 = y - distance; y2 < y + distance + 1; y2++)
                            //{
                            //    for (var x2 = x - distance; x2 < x + distance + 1; x2++)
                            //    {
                            //        if (x2 > 0 && x2 < width && y2 > 0 && y2 < height)
                            //        {
                            //            pos = Check(x2, y2);
                            //            if (pos != (-1, -1)) { goto endWhile; }
                            //        }
                            //    }
                            //}

                            for (var y2 = (int)PMath.Clamp(y - distance, 0, height - 1); y2 < (int)PMath.Clamp(y + distance + 1, 0, height - 1); y2++)
                            {
                                var minus   = (int)PMath.Clamp(x - distance, 0, width - 1);
                                var tempPos = (minus, y2);
                                pos = Available2[minus, y2] ? tempPos : (-1, -1);
                                if (pos != (-1, -1))
                                {
                                    goto endWhile;
                                }

                                var plus = (int)PMath.Clamp(x + distance, 0, width - 1);
                                tempPos = (plus, y2);
                                pos     = Available2[plus, y2] ? tempPos : (-1, -1);
                                if (pos != (-1, -1))
                                {
                                    goto endWhile;
                                }
                            }

                            for (var x2 = (int)PMath.Clamp(x - distance, 0, width - 1); x2 < (int)PMath.Clamp(x + distance + 1, 0, width - 1); x2++)
                            {
                                var minus   = (int)PMath.Clamp(y - distance, 0, height - 1);
                                var tempPos = (x2, minus);
                                pos = Available2[x2, minus] ? tempPos : (-1, -1);
                                if (pos != (-1, -1))
                                {
                                    goto endWhile;
                                }

                                var plus = (int)PMath.Clamp(y + distance, 0, height - 1);
                                tempPos = (x2, plus);
                                pos     = Available2[x2, plus] ? tempPos : (-1, -1);
                                if (pos != (-1, -1))
                                {
                                    goto endWhile;
                                }
                            }

                            if (distance > width)
                            {
                                CalculateStart(width, height);
                                distance = 0;
                            }

                            distance++;
                        }while (pos == (-1, -1));
                        endWhile :;
                        pos = ((int, int))AvailablePositions[0];
                        AvailablePositions.RemoveAt(0);

                        //AvailablePositions.Remove(pos);

                        Available2[pos.Item1, pos.Item2] = false;
                        var b2 = (pos.Item1 + (pos.Item2 * width)) * 4;

                        pixels.Add(new Pixel()
                        {
                            StartColor = PColor.FromPixels(startPixels, b2), EndColor = c, StartPos = pos, EndPos = (x, y), Offset = PMath.Random(0, Offset)
                        });