public void Generate(World world) { WorldSizePixels = world.Width * world.Height; for (int i = 0; i < Seeds; i++) { int y = world.GetRandomHeight(); int x = world.GetRandomWidth(); if (Monitor.TryEnter(world[x, y])) { if (!world[x, y].Initialised) { world[x, y].Altitude = 70;// (short)world.random.Next(-100, 101); world[x, y].Initialised = true; RandomPointsWorldSeed worldSeed = new RandomPointsWorldSeed(world, this, new Point(x, y), world.GetPosition(x, y)); ThreadPool.QueueUserWorkItem(ProcessSeed, worldSeed); Interlocked.Increment(ref WorkingThreads); Interlocked.Increment(ref PixelsCompleted); } Monitor.Exit(world[x, y]); } else Seeds--; } while (WorkingThreads > 0) Thread.Sleep(5); return; }
public void Generate(World world) { WorldSizePixels = world.Width * world.Height; for (int i = 0; i < Seeds; i++) { int y = world.GetRandomHeight(); int x = world.GetRandomWidth(); if (Monitor.TryEnter(world[x, y])) { if (!world[x, y].Initialised) { world[x, y].Altitude = 70;// (short)world.random.Next(-100, 101); world[x, y].Initialised = true; RandomPointsWorldSeed worldSeed = new RandomPointsWorldSeed(world, this, new Point(x, y), world.GetPosition(x, y)); ThreadPool.QueueUserWorkItem(ProcessSeed, worldSeed); Interlocked.Increment(ref WorkingThreads); Interlocked.Increment(ref PixelsCompleted); } Monitor.Exit(world[x, y]); } else { Seeds--; } } while (WorkingThreads > 0) { Thread.Sleep(5); } return; }
static void ProcessSeed(object WorldSeed) { RandomPointsWorldSeed worldSeed = (RandomPointsWorldSeed)WorldSeed; if (RandNum.Double() > 0.1) { ThreadPool.QueueUserWorkItem(ProcessSeed, WorldSeed); return; } Point p = worldSeed.Point; Position Pos = worldSeed.ParentPositon; //worldSeed.world.GetPosition(p); for (int i = 0; i < 8; i++) { Point p2 = new Point(p.X, p.Y); switch (i) { case 0: //top right p2.X++; p2.Y--; break; case 1: //right p2.X++; break; case 2: //bottom right p2.X++; p2.Y++; break; case 3: //bottom p2.Y++; break; case 4: //bottom left p2.X--; p2.Y++; break; case 5: //left p2.X--; break; case 6: //top left p2.X--; p2.Y--; break; case 7: //top p2.Y--; break; } p2 = new Point(worldSeed.World.CheckXCoord(p2.X), worldSeed.World.CheckYCoord(p2.Y)); Position Pos2 = worldSeed.World.GetPosition(p2); if (Monitor.TryEnter(Pos2)) { if (!Pos2.Initialised) { Pos2.Initialised = true; short Step = (short)RandNum.Integer(2); //(MinStep, MaxStep); if (Step == 0) { Pos2.Altitude = (short)Pos.Altitude; } else { if (RandNum.Double() < worldSeed.WorldFormer.HighAltitudeProbability) { Pos2.Altitude = (short)(Pos.Altitude + Step); } else { Pos2.Altitude = (short)(Pos.Altitude - Step); } } Interlocked.Increment(ref worldSeed.WorldFormer.PixelsCompleted); RandomPointsWorldSeed NewWorldSeed = new RandomPointsWorldFormer.RandomPointsWorldSeed(worldSeed.World, worldSeed.WorldFormer, p2, Pos2); Interlocked.Increment(ref worldSeed.WorldFormer.WorkingThreads); ThreadPool.QueueUserWorkItem(ProcessSeed, NewWorldSeed); } Monitor.Exit(Pos2); } } Interlocked.Decrement(ref worldSeed.WorldFormer.WorkingThreads); }