aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs81
1 files changed, 80 insertions, 1 deletions
diff --git a/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs
index bf5e776..0ad60df 100644
--- a/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs
+++ b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs
@@ -192,7 +192,7 @@ namespace OpenSim.Region.Terrain
192 resultText += "terrain voronoi <points> <blocksize> - generates a worley fractal with X points per block"; 192 resultText += "terrain voronoi <points> <blocksize> - generates a worley fractal with X points per block";
193 resultText += "terrain seed <seed> - sets the random seed value to <seed>\n"; 193 resultText += "terrain seed <seed> - sets the random seed value to <seed>\n";
194 resultText += "terrain load <type> <filename> - loads a terrain from disk, type can be 'F32', 'F64', 'RAW' or 'IMG'\n"; 194 resultText += "terrain load <type> <filename> - loads a terrain from disk, type can be 'F32', 'F64', 'RAW' or 'IMG'\n";
195 resultText += "terrain save <type> <filename> - saves a terrain to disk, type can be 'F32', 'F64' or 'PNG'\n"; 195 resultText += "terrain save <type> <filename> - saves a terrain to disk, type can be 'F32', 'F64', 'PNG', 'RAW' or 'HIRAW'\n";
196 resultText += "terrain save grdmap <filename> <gradient map> - creates a PNG snapshot of the region using a named gradient map\n"; 196 resultText += "terrain save grdmap <filename> <gradient map> - creates a PNG snapshot of the region using a named gradient map\n";
197 resultText += "terrain rescale <min> <max> - rescales a terrain to be between <min> and <max> meters high\n"; 197 resultText += "terrain rescale <min> <max> - rescales a terrain to be between <min> and <max> meters high\n";
198 resultText += "terrain erode aerobic <windspeed> <pickupmin> <dropmin> <carry> <rounds> <lowest>\n"; 198 resultText += "terrain erode aerobic <windspeed> <pickupmin> <dropmin> <carry> <rounds> <lowest>\n";
@@ -295,6 +295,10 @@ namespace OpenSim.Region.Terrain
295 writeToFileRAW(args[2]); 295 writeToFileRAW(args[2]);
296 break; 296 break;
297 297
298 case "hiraw":
299 writeToFileHiRAW(args[2]);
300 break;
301
298 default: 302 default:
299 resultText = "Unknown image or data format"; 303 resultText = "Unknown image or data format";
300 return false; 304 return false;
@@ -532,6 +536,7 @@ namespace OpenSim.Region.Terrain
532 536
533 /// <summary> 537 /// <summary>
534 /// A very fast LL-RAW file output mechanism - lower precision mechanism but wont take 5 minutes to run either. 538 /// A very fast LL-RAW file output mechanism - lower precision mechanism but wont take 5 minutes to run either.
539 /// (is also editable in an image application)
535 /// </summary> 540 /// </summary>
536 /// <param name="filename">Filename to write to</param> 541 /// <param name="filename">Filename to write to</param>
537 public void writeToFileRAW(string filename) 542 public void writeToFileRAW(string filename)
@@ -595,6 +600,80 @@ namespace OpenSim.Region.Terrain
595 } 600 }
596 601
597 /// <summary> 602 /// <summary>
603 /// Outputs to a LL compatible RAW in the most efficient manner possible
604 /// </summary>
605 /// <remarks>Does not calculate the revert map</remarks>
606 /// <param name="filename">The filename to output to</param>
607 public void writeToFileHiRAW(string filename)
608 {
609 System.IO.FileInfo file = new System.IO.FileInfo(filename);
610 System.IO.FileStream s = file.Open(System.IO.FileMode.CreateNew, System.IO.FileAccess.Write);
611 System.IO.BinaryWriter bs = new System.IO.BinaryWriter(s);
612
613 // Generate a smegging big lookup table to speed the operation up (it needs it)
614 double[] lookupTable = new double[65536];
615 int i, j, x, y;
616 for (i = 0; i < 256; i++)
617 {
618 for (j = 0; j < 256; j++)
619 {
620 lookupTable[i + (j * 256)] = ((double)i * ((double)j / 127.0));
621 }
622 }
623
624 // Output the calculated raw
625 for (x = 0; x < w; x++)
626 {
627 for (y = 0; y < h; y++)
628 {
629 double t = heightmap.get(x, y);
630 double min = double.MaxValue;
631 int index = 0;
632
633 for (i = 0; i < 65536; i++)
634 {
635 if (Math.Abs(t - lookupTable[i]) < min)
636 {
637 min = Math.Abs(t - lookupTable[i]);
638 index = i;
639 }
640 }
641
642 byte red = (byte)(index & 0xFF);
643 byte green = (byte)((index >> 8) & 0xFF);
644 byte blue = (byte)watermap.get(x, y);
645 byte alpha1 = 0; // Land Parcels
646 byte alpha2 = 0; // For Sale Land
647 byte alpha3 = 0; // Public Edit Object
648 byte alpha4 = 0; // Public Edit Land
649 byte alpha5 = 255; // Safe Land
650 byte alpha6 = 255; // Flying Allowed
651 byte alpha7 = 255; // Create Landmark
652 byte alpha8 = 255; // Outside Scripts
653 byte alpha9 = red;
654 byte alpha10 = green;
655
656 bs.Write(red);
657 bs.Write(green);
658 bs.Write(blue);
659 bs.Write(alpha1);
660 bs.Write(alpha2);
661 bs.Write(alpha3);
662 bs.Write(alpha4);
663 bs.Write(alpha5);
664 bs.Write(alpha6);
665 bs.Write(alpha7);
666 bs.Write(alpha8);
667 bs.Write(alpha9);
668 bs.Write(alpha10);
669 }
670 }
671
672 bs.Close();
673 s.Close();
674 }
675
676 /// <summary>
598 /// Sets the random seed to be used by procedural functions which involve random numbers. 677 /// Sets the random seed to be used by procedural functions which involve random numbers.
599 /// </summary> 678 /// </summary>
600 /// <param name="val">The desired seed</param> 679 /// <param name="val">The desired seed</param>