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