From 180be7de07014aa33bc6066f12a0819b731c1c9d Mon Sep 17 00:00:00 2001
From: Dr Scofield
Date: Tue, 10 Feb 2009 13:10:57 +0000
Subject: this is step 2 of 2 of the OpenSim.Region.Environment refactor.
NOTHING has been deleted or moved off to forge at this point. what has
happened is that OpenSim.Region.Environment.Modules has been split in two:
- OpenSim.Region.CoreModules: all those modules that are either
directly or indirectly referenced from other OpenSim packages, or
that provide functionality that the OpenSim developer community
considers core functionality:
CoreModules/Agent/AssetTransaction
CoreModules/Agent/Capabilities
CoreModules/Agent/TextureDownload
CoreModules/Agent/TextureSender
CoreModules/Agent/TextureSender/Tests
CoreModules/Agent/Xfer
CoreModules/Avatar/AvatarFactory
CoreModules/Avatar/Chat/ChatModule
CoreModules/Avatar/Combat
CoreModules/Avatar/Currency/SampleMoney
CoreModules/Avatar/Dialog
CoreModules/Avatar/Friends
CoreModules/Avatar/Gestures
CoreModules/Avatar/Groups
CoreModules/Avatar/InstantMessage
CoreModules/Avatar/Inventory
CoreModules/Avatar/Inventory/Archiver
CoreModules/Avatar/Inventory/Transfer
CoreModules/Avatar/Lure
CoreModules/Avatar/ObjectCaps
CoreModules/Avatar/Profiles
CoreModules/Communications/Local
CoreModules/Communications/REST
CoreModules/Framework/EventQueue
CoreModules/Framework/InterfaceCommander
CoreModules/Hypergrid
CoreModules/InterGrid
CoreModules/Scripting/DynamicTexture
CoreModules/Scripting/EMailModules
CoreModules/Scripting/HttpRequest
CoreModules/Scripting/LoadImageURL
CoreModules/Scripting/VectorRender
CoreModules/Scripting/WorldComm
CoreModules/Scripting/XMLRPC
CoreModules/World/Archiver
CoreModules/World/Archiver/Tests
CoreModules/World/Estate
CoreModules/World/Land
CoreModules/World/Permissions
CoreModules/World/Serialiser
CoreModules/World/Sound
CoreModules/World/Sun
CoreModules/World/Terrain
CoreModules/World/Terrain/DefaultEffects
CoreModules/World/Terrain/DefaultEffects/bin
CoreModules/World/Terrain/DefaultEffects/bin/Debug
CoreModules/World/Terrain/Effects
CoreModules/World/Terrain/FileLoaders
CoreModules/World/Terrain/FloodBrushes
CoreModules/World/Terrain/PaintBrushes
CoreModules/World/Terrain/Tests
CoreModules/World/Vegetation
CoreModules/World/Wind
CoreModules/World/WorldMap
- OpenSim.Region.OptionalModules: all those modules that are not core
modules:
OptionalModules/Avatar/Chat/IRC-stuff
OptionalModules/Avatar/Concierge
OptionalModules/Avatar/Voice/AsterixVoice
OptionalModules/Avatar/Voice/SIPVoice
OptionalModules/ContentManagementSystem
OptionalModules/Grid/Interregion
OptionalModules/Python
OptionalModules/SvnSerialiser
OptionalModules/World/NPC
OptionalModules/World/TreePopulator
---
.../CoreModules/World/Terrain/FileLoaders/BMP.cs | 76 +++++++
.../CoreModules/World/Terrain/FileLoaders/GIF.cs | 61 +++++
.../Terrain/FileLoaders/GenericSystemDrawing.cs | 195 ++++++++++++++++
.../CoreModules/World/Terrain/FileLoaders/JPEG.cs | 112 +++++++++
.../CoreModules/World/Terrain/FileLoaders/LLRAW.cs | 250 +++++++++++++++++++++
.../CoreModules/World/Terrain/FileLoaders/PNG.cs | 61 +++++
.../CoreModules/World/Terrain/FileLoaders/RAW32.cs | 170 ++++++++++++++
.../CoreModules/World/Terrain/FileLoaders/TIFF.cs | 61 +++++
.../World/Terrain/FileLoaders/Terragen.cs | 142 ++++++++++++
9 files changed, 1128 insertions(+)
create mode 100644 OpenSim/Region/CoreModules/World/Terrain/FileLoaders/BMP.cs
create mode 100644 OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GIF.cs
create mode 100644 OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs
create mode 100644 OpenSim/Region/CoreModules/World/Terrain/FileLoaders/JPEG.cs
create mode 100644 OpenSim/Region/CoreModules/World/Terrain/FileLoaders/LLRAW.cs
create mode 100644 OpenSim/Region/CoreModules/World/Terrain/FileLoaders/PNG.cs
create mode 100644 OpenSim/Region/CoreModules/World/Terrain/FileLoaders/RAW32.cs
create mode 100644 OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs
create mode 100644 OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs
(limited to 'OpenSim/Region/CoreModules/World/Terrain/FileLoaders')
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/BMP.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/BMP.cs
new file mode 100644
index 0000000..4f395b5
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/BMP.cs
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSim Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using OpenSim.Region.Framework.Interfaces;
+
+namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
+{
+ ///
+ /// A generic windows bitmap loader.
+ /// Should be capable of handling 24-bit RGB images.
+ ///
+ /// Uses the System.Drawing filesystem loader.
+ ///
+ internal class BMP : GenericSystemDrawing
+ {
+ ///
+ /// Exports a file to a image on the disk using a System.Drawing exporter.
+ ///
+ /// The target filename
+ /// The terrain channel being saved
+ public override void SaveFile(string filename, ITerrainChannel map)
+ {
+ Bitmap colours = CreateGrayscaleBitmapFromMap(map);
+
+ colours.Save(filename, ImageFormat.Bmp);
+ }
+
+ ///
+ /// Exports a stream using a System.Drawing exporter.
+ ///
+ /// The target stream
+ /// The terrain channel being saved
+ public override void SaveStream(Stream stream, ITerrainChannel map)
+ {
+ Bitmap colours = CreateGrayscaleBitmapFromMap(map);
+
+ colours.Save(stream, ImageFormat.Png);
+ }
+
+ ///
+ /// The human readable version of the file format(s) this loader handles
+ ///
+ ///
+ public override string ToString()
+ {
+ return "BMP";
+ }
+ }
+}
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GIF.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GIF.cs
new file mode 100644
index 0000000..cff82d1
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GIF.cs
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSim Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using OpenSim.Region.Framework.Interfaces;
+
+namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
+{
+ internal class GIF : GenericSystemDrawing
+ {
+ public override void SaveFile(string filename, ITerrainChannel map)
+ {
+ Bitmap colours = CreateGrayscaleBitmapFromMap(map);
+
+ colours.Save(filename, ImageFormat.Gif);
+ }
+
+ ///
+ /// Exports a stream using a System.Drawing exporter.
+ ///
+ /// The target stream
+ /// The terrain channel being saved
+ public override void SaveStream(Stream stream, ITerrainChannel map)
+ {
+ Bitmap colours = CreateGrayscaleBitmapFromMap(map);
+
+ colours.Save(stream, ImageFormat.Gif);
+ }
+
+ public override string ToString()
+ {
+ return "GIF";
+ }
+ }
+}
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs
new file mode 100644
index 0000000..477c73c
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSim Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+
+namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
+{
+ ///
+ /// A virtual class designed to have methods overloaded,
+ /// this class provides an interface for a generic image
+ /// saving and loading mechanism, but does not specify the
+ /// format. It should not be insubstantiated directly.
+ ///
+ public class GenericSystemDrawing : ITerrainLoader
+ {
+ #region ITerrainLoader Members
+
+ public string FileExtension
+ {
+ get { return ".gsd"; }
+ }
+
+ ///
+ /// Loads a file from a specified filename on the disk,
+ /// parses the image using the System.Drawing parsers
+ /// then returns a terrain channel. Values are
+ /// returned based on HSL brightness between 0m and 128m
+ ///
+ /// The target image to load
+ /// A terrain channel generated from the image.
+ public virtual ITerrainChannel LoadFile(string filename)
+ {
+ return LoadBitmap(new Bitmap(filename));
+ }
+
+ public ITerrainChannel LoadFile(string filename, int x, int y, int fileWidth, int fileHeight, int w, int h)
+ {
+ throw new NotImplementedException();
+ }
+
+ public virtual ITerrainChannel LoadStream(Stream stream)
+ {
+ return LoadBitmap(new Bitmap(stream));
+ }
+
+ protected virtual ITerrainChannel LoadBitmap(Bitmap bitmap)
+ {
+ ITerrainChannel retval = new TerrainChannel(bitmap.Width, bitmap.Height);
+
+ int x;
+ for (x = 0; x < bitmap.Width; x++)
+ {
+ int y;
+ for (y = 0; y < bitmap.Height; y++)
+ {
+ retval[x, y] = bitmap.GetPixel(x, bitmap.Height - y - 1).GetBrightness() * 128;
+ }
+ }
+
+ return retval;
+ }
+
+ ///
+ /// Exports a file to a image on the disk using a System.Drawing exporter.
+ ///
+ /// The target filename
+ /// The terrain channel being saved
+ public virtual void SaveFile(string filename, ITerrainChannel map)
+ {
+ Bitmap colours = CreateGrayscaleBitmapFromMap(map);
+
+ colours.Save(filename, ImageFormat.Png);
+ }
+
+ ///
+ /// Exports a stream using a System.Drawing exporter.
+ ///
+ /// The target stream
+ /// The terrain channel being saved
+ public virtual void SaveStream(Stream stream, ITerrainChannel map)
+ {
+ Bitmap colours = CreateGrayscaleBitmapFromMap(map);
+
+ colours.Save(stream, ImageFormat.Png);
+ }
+
+ #endregion
+
+ public override string ToString()
+ {
+ return "SYS.DRAWING";
+ }
+
+ ///
+ /// Protected method, generates a grayscale bitmap
+ /// image from a specified terrain channel.
+ ///
+ /// The terrain channel to export to bitmap
+ /// A System.Drawing.Bitmap containing a grayscale image
+ protected static Bitmap CreateGrayscaleBitmapFromMap(ITerrainChannel map)
+ {
+ Bitmap bmp = new Bitmap(map.Width, map.Height);
+
+ const int pallete = 256;
+
+ Color[] grays = new Color[pallete];
+ for (int i = 0; i < grays.Length; i++)
+ {
+ grays[i] = Color.FromArgb(i, i, i);
+ }
+
+ for (int y = 0; y < map.Height; y++)
+ {
+ for (int x = 0; x < map.Width; x++)
+ {
+ // 512 is the largest possible height before colours clamp
+ int colorindex = (int) (Math.Max(Math.Min(1.0, map[x, y] / 128.0), 0.0) * (pallete - 1));
+
+ // Handle error conditions
+ if (colorindex > pallete - 1 || colorindex < 0)
+ bmp.SetPixel(x, map.Height - y - 1, Color.Red);
+ else
+ bmp.SetPixel(x, map.Height - y - 1, grays[colorindex]);
+ }
+ }
+ return bmp;
+ }
+
+ ///
+ /// Protected method, generates a coloured bitmap
+ /// image from a specified terrain channel.
+ ///
+ /// The terrain channel to export to bitmap
+ /// A System.Drawing.Bitmap containing a coloured image
+ protected static Bitmap CreateBitmapFromMap(ITerrainChannel map)
+ {
+ Bitmap gradientmapLd = new Bitmap("defaultstripe.png");
+
+ int pallete = gradientmapLd.Height;
+
+ Bitmap bmp = new Bitmap(map.Width, map.Height);
+ Color[] colours = new Color[pallete];
+
+ for (int i = 0; i < pallete; i++)
+ {
+ colours[i] = gradientmapLd.GetPixel(0, i);
+ }
+
+ for (int y = 0; y < map.Height; y++)
+ {
+ for (int x = 0; x < map.Width; x++)
+ {
+ // 512 is the largest possible height before colours clamp
+ int colorindex = (int) (Math.Max(Math.Min(1.0, map[x, y] / 512.0), 0.0) * (pallete - 1));
+
+ // Handle error conditions
+ if (colorindex > pallete - 1 || colorindex < 0)
+ bmp.SetPixel(x, map.Height - y - 1, Color.Red);
+ else
+ bmp.SetPixel(x, map.Height - y - 1, colours[colorindex]);
+ }
+ }
+ return bmp;
+ }
+ }
+}
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/JPEG.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/JPEG.cs
new file mode 100644
index 0000000..f8e31f8
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/JPEG.cs
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSim Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using OpenSim.Region.Framework.Interfaces;
+
+namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
+{
+ public class JPEG : ITerrainLoader
+ {
+ #region ITerrainLoader Members
+
+ public string FileExtension
+ {
+ get { return ".jpg"; }
+ }
+
+ public ITerrainChannel LoadFile(string filename)
+ {
+ throw new NotImplementedException();
+ }
+
+ public ITerrainChannel LoadFile(string filename, int x, int y, int fileWidth, int fileHeight, int w, int h)
+ {
+ throw new NotImplementedException();
+ }
+
+ public ITerrainChannel LoadStream(Stream stream)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void SaveFile(string filename, ITerrainChannel map)
+ {
+ Bitmap colours = CreateBitmapFromMap(map);
+
+ colours.Save(filename, ImageFormat.Jpeg);
+ }
+
+ ///
+ /// Exports a stream using a System.Drawing exporter.
+ ///
+ /// The target stream
+ /// The terrain channel being saved
+ public void SaveStream(Stream stream, ITerrainChannel map)
+ {
+ Bitmap colours = CreateBitmapFromMap(map);
+
+ colours.Save(stream, ImageFormat.Jpeg);
+ }
+
+ #endregion
+
+ public override string ToString()
+ {
+ return "JPEG";
+ }
+
+ private static Bitmap CreateBitmapFromMap(ITerrainChannel map)
+ {
+ Bitmap gradientmapLd = new Bitmap("defaultstripe.png");
+
+ int pallete = gradientmapLd.Height;
+
+ Bitmap bmp = new Bitmap(map.Width, map.Height);
+ Color[] colours = new Color[pallete];
+
+ for (int i = 0; i < pallete; i++)
+ {
+ colours[i] = gradientmapLd.GetPixel(0, i);
+ }
+
+ for (int y = 0; y < map.Height; y++)
+ {
+ for (int x = 0; x < map.Width; x++)
+ {
+ // 512 is the largest possible height before colours clamp
+ int colorindex = (int) (Math.Max(Math.Min(1.0, map[x, y] / 512.0), 0.0) * (pallete - 1));
+ bmp.SetPixel(x, map.Height - y - 1, colours[colorindex]);
+ }
+ }
+ return bmp;
+ }
+ }
+}
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/LLRAW.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/LLRAW.cs
new file mode 100644
index 0000000..a86ae00
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/LLRAW.cs
@@ -0,0 +1,250 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSim Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.IO;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+
+namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
+{
+ public class LLRAW : ITerrainLoader
+ {
+ public struct HeightmapLookupValue : IComparable
+ {
+ public int Index;
+ public double Value;
+
+ public HeightmapLookupValue(int index, double value)
+ {
+ Index = index;
+ Value = value;
+ }
+
+ public int CompareTo(HeightmapLookupValue val)
+ {
+ return Value.CompareTo(val.Value);
+ }
+ }
+
+ /// Lookup table to speed up terrain exports
+ HeightmapLookupValue[] LookupHeightTable;
+
+ public LLRAW()
+ {
+ LookupHeightTable = new HeightmapLookupValue[256 * 256];
+
+ for (int i = 0; i < 256; i++)
+ {
+ for (int j = 0; j < 256; j++)
+ {
+ LookupHeightTable[i + (j * 256)] = new HeightmapLookupValue(i + (j * 256), ((double)i * ((double)j / 128.0d)));
+ }
+ }
+ Array.Sort(LookupHeightTable);
+ }
+
+ #region ITerrainLoader Members
+
+ public ITerrainChannel LoadFile(string filename)
+ {
+ FileInfo file = new FileInfo(filename);
+ FileStream s = file.Open(FileMode.Open, FileAccess.Read);
+ ITerrainChannel retval = LoadStream(s);
+
+ s.Close();
+
+ return retval;
+ }
+
+ public ITerrainChannel LoadFile(string filename, int offsetX, int offsetY, int fileWidth, int fileHeight, int sectionWidth, int sectionHeight)
+ {
+ TerrainChannel retval = new TerrainChannel(sectionWidth, sectionHeight);
+
+ FileInfo file = new FileInfo(filename);
+ FileStream s = file.Open(FileMode.Open, FileAccess.Read);
+ BinaryReader bs = new BinaryReader(s);
+
+ int currFileYOffset = fileHeight - 1;
+
+ // if our region isn't on the first Y section of the areas to be landscaped, then
+ // advance to our section of the file
+ while (currFileYOffset > offsetY)
+ {
+ // read a whole strip of regions
+ int heightsToRead = sectionHeight * (fileWidth * sectionWidth);
+ bs.ReadBytes(heightsToRead * 13); // because there are 13 fun channels
+ currFileYOffset--;
+ }
+
+ // got to the Y start offset within the file of our region
+ // so read the file bits associated with our region
+ int y;
+ // for each Y within our Y offset
+ for (y = sectionHeight - 1; y >= 0; y--)
+ {
+ int currFileXOffset = 0;
+
+ // if our region isn't the first X section of the areas to be landscaped, then
+ // advance the stream to the X start pos of our section in the file
+ // i.e. eat X upto where we start
+ while (currFileXOffset < offsetX)
+ {
+ bs.ReadBytes(sectionWidth * 13);
+ currFileXOffset++;
+ }
+
+ // got to our X offset, so write our regions X line
+ int x;
+ for (x = 0; x < sectionWidth; x++)
+ {
+ // Read a strip and continue
+ retval[x, y] = bs.ReadByte() * (bs.ReadByte() / 128.0);
+ bs.ReadBytes(11);
+ }
+ // record that we wrote it
+ currFileXOffset++;
+
+ // if our region isn't the last X section of the areas to be landscaped, then
+ // advance the stream to the end of this Y column
+ while (currFileXOffset < fileWidth)
+ {
+ // eat the next regions x line
+ bs.ReadBytes(sectionWidth * 13); //The 13 channels again
+ currFileXOffset++;
+ }
+ }
+
+ bs.Close();
+ s.Close();
+
+ return retval;
+ }
+
+ public ITerrainChannel LoadStream(Stream s)
+ {
+ TerrainChannel retval = new TerrainChannel();
+
+ BinaryReader bs = new BinaryReader(s);
+ int y;
+ for (y = 0; y < retval.Height; y++)
+ {
+ int x;
+ for (x = 0; x < retval.Width; x++)
+ {
+ retval[x, (retval.Height - 1) - y] = bs.ReadByte() * (bs.ReadByte() / 128.0);
+ bs.ReadBytes(11); // Advance the stream to next bytes.
+ }
+ }
+
+ bs.Close();
+
+ return retval;
+ }
+
+ public void SaveFile(string filename, ITerrainChannel map)
+ {
+ FileInfo file = new FileInfo(filename);
+ FileStream s = file.Open(FileMode.CreateNew, FileAccess.Write);
+ SaveStream(s, map);
+
+ s.Close();
+ }
+
+ public void SaveStream(Stream s, ITerrainChannel map)
+ {
+ BinaryWriter binStream = new BinaryWriter(s);
+
+ // Output the calculated raw
+ for (int y = 0; y < map.Height; y++)
+ {
+ for (int x = 0; x < map.Width; x++)
+ {
+ double t = map[x, (map.Height - 1) - y];
+ //if height is less than 0, set it to 0 as
+ //can't save -ve values in a LLRAW file
+ if (t < 0d)
+ {
+ t = 0d;
+ }
+
+ int index = 0;
+
+ // The lookup table is pre-sorted, so we either find an exact match or
+ // the next closest (smaller) match with a binary search
+ index = Array.BinarySearch(LookupHeightTable, new HeightmapLookupValue(0, t));
+ if (index < 0)
+ index = ~index - 1;
+
+ index = LookupHeightTable[index].Index;
+
+ byte red = (byte) (index & 0xFF);
+ byte green = (byte) ((index >> 8) & 0xFF);
+ const byte blue = 20;
+ const byte alpha1 = 0;
+ const byte alpha2 = 0;
+ const byte alpha3 = 0;
+ const byte alpha4 = 0;
+ const byte alpha5 = 255;
+ const byte alpha6 = 255;
+ const byte alpha7 = 255;
+ const byte alpha8 = 255;
+ byte alpha9 = red;
+ byte alpha10 = green;
+
+ binStream.Write(red);
+ binStream.Write(green);
+ binStream.Write(blue);
+ binStream.Write(alpha1);
+ binStream.Write(alpha2);
+ binStream.Write(alpha3);
+ binStream.Write(alpha4);
+ binStream.Write(alpha5);
+ binStream.Write(alpha6);
+ binStream.Write(alpha7);
+ binStream.Write(alpha8);
+ binStream.Write(alpha9);
+ binStream.Write(alpha10);
+ }
+ }
+
+ binStream.Close();
+ }
+
+ public string FileExtension
+ {
+ get { return ".raw"; }
+ }
+
+ #endregion
+
+ public override string ToString()
+ {
+ return "LL/SL RAW";
+ }
+ }
+}
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/PNG.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/PNG.cs
new file mode 100644
index 0000000..0dea282
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/PNG.cs
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSim Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using OpenSim.Region.Framework.Interfaces;
+
+namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
+{
+ internal class PNG : GenericSystemDrawing
+ {
+ public override void SaveFile(string filename, ITerrainChannel map)
+ {
+ Bitmap colours = CreateGrayscaleBitmapFromMap(map);
+
+ colours.Save(filename, ImageFormat.Png);
+ }
+
+ ///
+ /// Exports a stream using a System.Drawing exporter.
+ ///
+ /// The target stream
+ /// The terrain channel being saved
+ public override void SaveStream(Stream stream, ITerrainChannel map)
+ {
+ Bitmap colours = CreateGrayscaleBitmapFromMap(map);
+
+ colours.Save(stream, ImageFormat.Png);
+ }
+
+ public override string ToString()
+ {
+ return "PNG";
+ }
+ }
+}
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/RAW32.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/RAW32.cs
new file mode 100644
index 0000000..178104f
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/RAW32.cs
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSim Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System.IO;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+
+namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
+{
+ public class RAW32 : ITerrainLoader
+ {
+ #region ITerrainLoader Members
+
+ public string FileExtension
+ {
+ get { return ".r32"; }
+ }
+
+ public ITerrainChannel LoadFile(string filename)
+ {
+ FileInfo file = new FileInfo(filename);
+ FileStream s = file.Open(FileMode.Open, FileAccess.Read);
+ ITerrainChannel retval = LoadStream(s);
+
+ s.Close();
+
+ return retval;
+ }
+
+ public ITerrainChannel LoadFile(string filename, int offsetX, int offsetY, int fileWidth, int fileHeight, int sectionWidth, int sectionHeight)
+ {
+ TerrainChannel retval = new TerrainChannel(sectionWidth, sectionHeight);
+
+ FileInfo file = new FileInfo(filename);
+ FileStream s = file.Open(FileMode.Open, FileAccess.Read);
+ BinaryReader bs = new BinaryReader(s);
+
+ int currFileYOffset = 0;
+
+ // if our region isn't on the first Y section of the areas to be landscaped, then
+ // advance to our section of the file
+ while (currFileYOffset < offsetY)
+ {
+ // read a whole strip of regions
+ int heightsToRead = sectionHeight * (fileWidth * sectionWidth);
+ bs.ReadBytes(heightsToRead * 4); // because the floats are 4 bytes in the file
+ currFileYOffset++;
+ }
+
+ // got to the Y start offset within the file of our region
+ // so read the file bits associated with our region
+ int y;
+ // for each Y within our Y offset
+ for (y = 0; y < sectionHeight; y++)
+ {
+ int currFileXOffset = 0;
+
+ // if our region isn't the first X section of the areas to be landscaped, then
+ // advance the stream to the X start pos of our section in the file
+ // i.e. eat X upto where we start
+ while (currFileXOffset < offsetX)
+ {
+ bs.ReadBytes(sectionWidth * 4); // 4 bytes = single
+ currFileXOffset++;
+ }
+
+ // got to our X offset, so write our regions X line
+ int x;
+ for (x = 0; x < sectionWidth; x++)
+ {
+ // Read a strip and continue
+ retval[x, y] = bs.ReadSingle();
+ }
+ // record that we wrote it
+ currFileXOffset++;
+
+ // if our region isn't the last X section of the areas to be landscaped, then
+ // advance the stream to the end of this Y column
+ while (currFileXOffset < fileWidth)
+ {
+ // eat the next regions x line
+ bs.ReadBytes(sectionWidth * 4); // 4 bytes = single
+ currFileXOffset++;
+ }
+ }
+
+ bs.Close();
+ s.Close();
+
+ return retval;
+ }
+
+ public ITerrainChannel LoadStream(Stream s)
+ {
+ TerrainChannel retval = new TerrainChannel();
+
+ BinaryReader bs = new BinaryReader(s);
+ int y;
+ for (y = 0; y < retval.Height; y++)
+ {
+ int x;
+ for (x = 0; x < retval.Width; x++)
+ {
+ retval[x, y] = bs.ReadSingle();
+ }
+ }
+
+ bs.Close();
+
+ return retval;
+ }
+
+ public void SaveFile(string filename, ITerrainChannel map)
+ {
+ FileInfo file = new FileInfo(filename);
+ FileStream s = file.Open(FileMode.Create, FileAccess.Write);
+ SaveStream(s, map);
+
+ s.Close();
+ }
+
+ public void SaveStream(Stream s, ITerrainChannel map)
+ {
+ BinaryWriter bs = new BinaryWriter(s);
+
+ int y;
+ for (y = 0; y < map.Height; y++)
+ {
+ int x;
+ for (x = 0; x < map.Width; x++)
+ {
+ bs.Write((float) map[x, y]);
+ }
+ }
+
+ bs.Close();
+ }
+
+ #endregion
+
+ public override string ToString()
+ {
+ return "RAW32";
+ }
+ }
+}
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs
new file mode 100644
index 0000000..220431f
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSim Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using OpenSim.Region.Framework.Interfaces;
+
+namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
+{
+ internal class TIFF : GenericSystemDrawing
+ {
+ public override void SaveFile(string filename, ITerrainChannel map)
+ {
+ Bitmap colours = CreateGrayscaleBitmapFromMap(map);
+
+ colours.Save(filename, ImageFormat.Tiff);
+ }
+
+ ///
+ /// Exports a stream using a System.Drawing exporter.
+ ///
+ /// The target stream
+ /// The terrain channel being saved
+ public override void SaveStream(Stream stream, ITerrainChannel map)
+ {
+ Bitmap colours = CreateGrayscaleBitmapFromMap(map);
+
+ colours.Save(stream, ImageFormat.Tiff);
+ }
+
+ public override string ToString()
+ {
+ return "TIFF";
+ }
+ }
+}
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs
new file mode 100644
index 0000000..426708d
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSim Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.IO;
+using System.Text;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+
+namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
+{
+ ///
+ /// Terragen File Format Loader
+ /// Built from specification at
+ /// http://www.planetside.co.uk/terragen/dev/tgterrain.html
+ ///
+ internal class Terragen : ITerrainLoader
+ {
+ #region ITerrainLoader Members
+
+ public ITerrainChannel LoadFile(string filename)
+ {
+ FileInfo file = new FileInfo(filename);
+ FileStream s = file.Open(FileMode.Open, FileAccess.Read);
+ ITerrainChannel retval = LoadStream(s);
+
+ s.Close();
+
+ return retval;
+ }
+
+ public ITerrainChannel LoadStream(Stream s)
+ {
+ TerrainChannel retval = new TerrainChannel();
+
+ BinaryReader bs = new BinaryReader(s);
+
+ bool eof = false;
+ if (Encoding.ASCII.GetString(bs.ReadBytes(16)) == "TERRAGENTERRAIN ")
+ {
+ int w = 256;
+ int h = 256;
+
+ // Terragen file
+ while (eof == false)
+ {
+ string tmp = Encoding.ASCII.GetString(bs.ReadBytes(4));
+ switch (tmp)
+ {
+ case "SIZE":
+ int sztmp = bs.ReadInt16() + 1;
+ w = sztmp;
+ h = sztmp;
+ bs.ReadInt16();
+ break;
+ case "XPTS":
+ w = bs.ReadInt16();
+ bs.ReadInt16();
+ break;
+ case "YPTS":
+ h = bs.ReadInt16();
+ bs.ReadInt16();
+ break;
+ case "ALTW":
+ eof = true;
+ Int16 heightScale = bs.ReadInt16();
+ Int16 baseHeight = bs.ReadInt16();
+ retval = new TerrainChannel(w, h);
+ int x;
+ for (x = 0; x < w; x++)
+ {
+ int y;
+ for (y = 0; y < h; y++)
+ {
+ retval[x, y] = baseHeight + bs.ReadInt16() * (double) heightScale / 65536.0;
+ }
+ }
+ break;
+ default:
+ bs.ReadInt32();
+ break;
+ }
+ }
+ }
+
+ bs.Close();
+
+ return retval;
+ }
+
+ public void SaveFile(string filename, ITerrainChannel map)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void SaveStream(Stream stream, ITerrainChannel map)
+ {
+ throw new NotImplementedException();
+ }
+
+ public string FileExtension
+ {
+ get { return ".ter"; }
+ }
+
+ public ITerrainChannel LoadFile(string filename, int x, int y, int fileWidth, int fileHeight, int w, int h)
+ {
+ throw new NotImplementedException();
+ }
+
+ #endregion
+
+ public override string ToString()
+ {
+ return "Terragen";
+ }
+ }
+}
--
cgit v1.1