public Cave(ref Random rnd, ref IMapHandler mh, Vector3i StartingPoint) { mMap = mh; rand = rnd; AddPoint(StartingPoint); // We need at least 4 points. int numPoints2Make = rand.Next(3, 10); for(int i=0;i<numPoints2Make;i++) { i++; AddPoint(new Vector3i(StartingPoint.X+rand.Next(-16, 16), StartingPoint.Y+rand.Next(-16, 16), StartingPoint.Z+rand.Next(-16, 16))); } Profiler profSphere = new Profiler("MakeSphere"); Profiler profSpline = new Profiler("GetInterpolatedSplinePoint"); int rad = rand.Next(1, 3); for(int p = 0;p<20;p++) { double t = (double)p/(double)(Points.Count*32); // Between 2/10 radius. profSpline.Start(); Vector3i derp = this.GetInterpolatedSplinePoint(t); profSpline.Stop(); mMap.SetBlockAt(derp.X, derp.Y, derp.Z, 0); profSphere.Start(); MakeSphere(derp, rad); profSphere.Stop(); //Console.WriteLine("MakeSphere r={0} @ t={1}", rad, t); //t += 0.05; } mMap.SaveAll(); Console.WriteLine(profSpline.ToString()); Console.WriteLine(profSphere.ToString()); }
private void generateTerrainToolStripMenuItem_Click(object sender, EventArgs e) { if (ActiveMdiChild != null) { if ((ActiveMdiChild as frmMap).Map != null) { dlgTerrainGen terragen = new dlgTerrainGen((ActiveMdiChild as frmMap).Map); if(terragen.ShowDialog() == DialogResult.Cancel) { ResetStatus(); return; } DialogResult dr = MessageBox.Show("This could DELETE EVERYTHING. ARE YOU SURE?", "ARE YOU NUTS", MessageBoxButtons.YesNo); if (dr == DialogResult.No) { ResetStatus(); return; } IMapGenerator mg = (IMapGenerator)terragen.pgMapGen.SelectedObject; (ActiveMdiChild as frmMap).Map.Generator = mg; dlgLongTask dlt = new dlgLongTask(); dlt.Start(delegate() { // ACTIVATE AUTOREPAIR (ActiveMdiChild as frmMap).Map.Autorepair = true; ///////////////////////////////////////////////////////////////// // UI Stuff ///////////////////////////////////////////////////////////////// dlt.SetMarquees(true, true); dlt.VocabSubtask = "chunk"; dlt.VocabSubtasks = "chunks"; dlt.Title = "Generating chunks."; dlt.Subtitle = "This will take a while. Go take a break."; dlt.SetMarquees(false, false); dlt.CurrentTask = "Replacing stuff in chunks..."; dlt.TasksComplete = 0; dlt.TasksTotal = 1; dlt.SubtasksTotal = 1; int numchunks = 0; // Generate terrain // Drop soil // Add pbarriers // Add dungeons // Add trees // Fix fluids // Fix lava int stage = 0; int numstages = 1; ForEachProgressHandler feph = new ForEachProgressHandler(delegate(int Total, int Progress) { numchunks = Total; dlt.TasksTotal = numchunks * numstages; dlt.TasksComplete = Progress + (stage * numchunks); dlt.SubtasksComplete = Progress; dlt.SubtasksTotal = Total; }); ForEachProgressHandler fl_feph = new ForEachProgressHandler(delegate(int Total, int Progress) { numchunks = Total; dlt.TasksTotal = numchunks * numstages; dlt.TasksComplete = Progress + (stage * numchunks); dlt.SubtasksComplete = Progress; dlt.SubtasksTotal = Total; dlt.perfChart.AddValue((ActiveMdiChild as frmMap).Map.ChunksLoaded); }); Vector3i Max = new Vector3i(0,0,0); Vector3i Min = new Vector3i(int.MaxValue, int.MaxValue, int.MaxValue); dlt.CurrentTask = "Determining map scale..."; (ActiveMdiChild as frmMap).Map.ForEachProgress += feph; dlt.ShowPerfChart(true); dlt.perfChart.Clear(); dlt.perfChart.ScaleMode = SpPerfChart.ScaleMode.Relative; (ActiveMdiChild as frmMap).Map.ForEachChunk(delegate(IMapHandler _mh, long X, long Z) { if (Min.X > X) Min.X = X; if (Max.X < X) Max.X = X; if (Min.Z > Z) Min.Z = Z; if (Max.Z < Z) Max.Z = Z; dlt.CurrentSubtask = string.Format("Map Scale: ({0},{1})", Max.X - Min.X, Max.Z - Min.Z); _mh.SaveAll(); }); (ActiveMdiChild as frmMap).Map.Cache.Enabled = false; int total = (int)((Max.X - Min.X) * (Max.Z - Min.Z)); int completed = 0; (ActiveMdiChild as frmMap).Map.ForEachKnownChunk(0,delegate(IMapHandler _mh, long X, long Z) { if (dlt.STOP) return; dlt.CurrentSubtask = string.Format("Generating chunk ({0},{1})", X, Z); double min, max; (ActiveMdiChild as frmMap).Map.Generate(X, Z, out min, out max); dlt.grpPerformance.Text = string.Format("Terrain Profile [{0},{1}]m", (int)(min * 100), (int)(max * 100)); dlt.perfChart.AddValue((decimal)max); feph(total, completed++); }); if ((ActiveMdiChild as frmMap).Map.Generator.GenerateCaves) { dlt.CurrentTask = "Generating caves..."; dlt.grpPerformance.Text = "Generation time (ms)"; Random rand = new Random((int)(ActiveMdiChild as frmMap).Map.RandomSeed); Profiler profCaves = new Profiler("Cave"); (ActiveMdiChild as frmMap).Map.ForEachKnownChunk(0, delegate(IMapHandler _mh, long X, long Z) { if (dlt.STOP) return; dlt.CurrentSubtask = string.Format("Generating caves in chunk ({0},{1})", X, Z); if (rand.Next(3) != 0) { int xo = (int)(X * _mh.ChunkScale.X); int zo = (int)(Z * _mh.ChunkScale.Z); int x = rand.Next((int)_mh.ChunkScale.X - 1); int z = rand.Next((int)_mh.ChunkScale.Z - 1); int y = rand.Next((int)(_mh.GetHeightAt(x, z) * 127) + 5); profCaves.Start(); new Cave(ref rand, ref _mh, new Vector3i(x + xo, y, z + zo)); Console.WriteLine("LOLDONE"); dlt.perfChart.AddValue(profCaves.Stop()); feph(total, completed++); } }); } completed = 0; /* Profiler profTrees = new Profiler("Trees"); for (int X = (int)Min.X; X < Max.X + 1; X++) { for (int Z = (int)Min.Z; Z < Max.Z + 1; Z++) { profTrees.Start(); if (dlt.STOP) return; dlt.CurrentSubtask = string.Format("Adding trees to chunk ({0},{1})", X, Z); (ActiveMdiChild as frmMap).Map.Populate(X, Z); dlt.grpPerformance.Text = "Performance"; profTrees.Stop(); dlt.perfChart.AddValue(profTrees.Stop()); feph(total, completed++); } } */ /* stage++; dlt.CurrentTask = "Eroding chunk surfaces..."; (ActiveMdiChild as frmMap).Map.ForEachProgress += feph; (ActiveMdiChild as frmMap).Map.ForEachChunk(delegate(IMapHandler _mh, long X, long Y) { dlt.CurrentSubtask = string.Format("Eroding chunk ({0},{1}, thermal)", X, Y); //(ActiveMdiChild as frmMap).Map.ErodeThermal(5, 10, (int)X, (int)Y); dlt.CurrentSubtask = string.Format("Eroding chunk ({0},{1}, hydraulic)", X, Y); //(ActiveMdiChild as frmMap).Map.Erode(5, 10, (int)X, (int)Y); dlt.CurrentSubtask = string.Format("Eroding chunk ({0},{1}, silt)", X, Y); //(ActiveMdiChild as frmMap).Map.Silt(63,true, (int)X, (int)Y); dlt.grpPerformance.Text = string.Format("Chunks in-memory ({0})", _mh.ChunksLoaded); dlt.perfChart.AddValue(_mh.ChunksLoaded); }); */ dlt.CurrentSubtask = "SAVING CHUNKS"; (ActiveMdiChild as frmMap).Map.SaveAll(); dlt.SetMarquees(false,false); dlt.Done(); ClearReport(); (ActiveMdiChild as frmMap).Map.Time = 0; //Utils.FixPlayerPlacement(ref (ActiveMdiChild as frmMap).Map); (ActiveMdiChild as frmMap).Map.Save(); (ActiveMdiChild as frmMap).Map.Cache.Enabled = true; MessageBox.Show("Done. Keep in mind that loading may initially be slow."); // DEACTIVATE AUTOREPAIR (ActiveMdiChild as frmMap).Map.Autorepair = false; }); dlt.ShowDialog(); } } }
private void MakeSphere(Vector3i pos, int rad) { Profiler profRead = new Profiler("Read"); Profiler profWrite = new Profiler("Write"); int radsq = rad ^ 2; // So we don't have to do sqrt, which is slow for (int x = (int)pos.X - rad; x < pos.X + rad; x++) { for (int y = (int)pos.Y - rad; y < pos.Y + rad; y++) { for (int z = (int)pos.Z - rad; z < pos.Z + rad; z++) { if(y<0||y>=mMap.ChunkScale.Y-1) continue; profRead.Start(); byte block = mMap.GetBlockAt(x,y,z); profRead.Stop(); //byte blockabove = mMap.GetBlockAt(x,y+1,z); // If water/sand/gravel, or the block above is, abort if (block == 0 || block == 8 || block == 9 || block == 12 || block == 13 || block==KnownBlocks.Error) continue; //if (blockabove == 0 || blockabove == 8 || blockabove == 9 || blockabove == 12 || blockabove == 13) // continue; int distsq = (x - (int)pos.X) ^ 2 + (y - (int)pos.Y) ^ 2 + (z - (int)pos.Z); if (distsq <= radsq) { profWrite.Start(); mMap.SetBlockAt(x, y, z, 0); profWrite.Stop(); } } } } Console.WriteLine(profRead.ToString()); Console.WriteLine(profWrite.ToString()); }