Paste #39378: Untitled Paste

Date: 2017/01/26 18:11:24 UTC-08:00
Type: Plain Text

View Raw Paste Download This Paste
Copy Link


using System;
using System.IO;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic;
using OpenTK;
using OpenTK.Input;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;

namespace NewNewThing
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Loading...");
            GameWindow window = new GameWindow(800, 600, GraphicsMode.Default, "SimuVerse", GameWindowFlags.Default);
            window.KeyDown += (sender, e) =>
            {
                if (e.Key == Key.Escape)
                {
                    window.Close();
                }
            };
            List<Entity> Entities = new List<Entity>();
            window.Load += (sender, e) =>
                {
                    Random Seed = new Random();
                    int ECount = Seed.Next(5000, 5000);
                    Console.WriteLine("Generating " + ECount + " entities...");
                    for (int i = 0; i < ECount; i++)
                    {
                        float Salt = Seed.Next(1, 1000) / 100f;
                        Entities.Add(new Entity()
                            {
                                Mass = Salt * Salt * Salt,
                                Size = Salt,
                                Position = new Vector2(Seed.Next(-5000, 5000), Seed.Next(-5000, 5000))
                            });
                    }
                    GL.ClearColor(Color4.Black);
                    GL.Enable(EnableCap.Texture2D);
                    Bitmap bmp = new Bitmap("circle.png");
                    int texture = GL.GenTexture();
                    GL.BindTexture(TextureTarget.Texture2D, texture);
                    BitmapData bmp_data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly,
                        System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                    GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bmp_data.Width,
                        bmp_data.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte,
                        bmp_data.Scan0);
                    bmp.UnlockBits(bmp_data);
                    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter,
                        (int)TextureMinFilter.Nearest);
                    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter,
                        (int)TextureMagFilter.Nearest);
                    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS,
                        (int)TextureWrapMode.Repeat);
                    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT,
                        (int)TextureWrapMode.Repeat);
                    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureCompareMode,
                        (int)TextureCompareMode.CompareRefToTexture);
                    bmp.Dispose();
                };
            window.VSync = VSyncMode.Off;
            float time = 0;
            float zoom = 10;
            float centerX = 0;
            float centerY = 0;
            window.RenderFrame += (sender, e) =>
                {
                    if (Keyboard.GetState().IsKeyDown(Key.Q))
                    {
                        zoom *= (float)e.Time + 1;
                    }
                    if (Keyboard.GetState().IsKeyDown(Key.E))
                    {
                        zoom *= 1 - (float)e.Time;
                    }
                    if (Keyboard.GetState().IsKeyDown(Key.A))
                    {
                        centerX += 10;
                    }
                    if (Keyboard.GetState().IsKeyDown(Key.D))
                    {
                        centerX -= 10;
                    }
                    if (Keyboard.GetState().IsKeyDown(Key.W))
                    {
                        centerY += 10;
                    }
                    if (Keyboard.GetState().IsKeyDown(Key.S))
                    {
                        centerY -= 10;
                    }
                    time += (float)e.Time;
                    GL.Clear(ClearBufferMask.ColorBufferBit);
                    GL.LoadIdentity();
                    GL.Ortho(-window.Width * zoom, window.Width * zoom, window.Height * zoom, -window.Height * zoom, -1, 1);
                    GL.Translate(centerX, centerY, 0);
                    foreach(Entity n in Entities)
                    {
                        n.Render();
                    }
                    float etime = (float)e.Time;
                    //for (int i = 0; i < Entities.Count; i++)
                    //{
                    int cap = Entities.Count;
                    Parallel.For(0, cap, (i) =>
                        {
                            if (i >= cap)
                            {
                                return;
                            }
                            Entity n = Entities[i];
                            n.Tick(etime);
                            for (int j = i + 1; j < Entities.Count; j++)
                            {
                                Entity a = Entities[j];
                                Vector2 distance = a.Position - n.Position;
                                if (distance.LengthSquared <= (a.Size + n.Size) * (a.Size + n.Size))
                                {
                                    Entities.RemoveAt(j);
                                    j--;
                                    cap--;
                                    n.Size = (float)Math.Pow(a.Mass + n.Mass, 1.0 / 3.0);
                                    n.Mass += a.Mass;
                                    n.Position = (n.Position * n.Mass + a.Position * a.Mass) / (n.Mass + a.Mass);
                                    n.Velocity = (n.Velocity * n.Mass + a.Velocity * a.Mass) / (n.Mass + a.Mass) * etime;
                                }
                                else
                                {
                                    n.Velocity += (a.Mass * distance / distance.LengthSquared) / n.Mass * etime;
                                    a.Velocity += (a.Mass * distance / distance.LengthSquared) / a.Mass * etime;
                                }
                            }
                        });
                    window.SwapBuffers();
            };
            window.Run(1, 60);
        }
    }
}