From 7a9922af27658ac570517df530dd7c2cf6d6dded Mon Sep 17 00:00:00 2001 From: MW Date: Wed, 25 Jun 2008 19:33:19 +0000 Subject: Added support for terrain map to be serialised to xml(as base64 binary). useful for places that the terrain map is needed in a serialised form. Also could add console commands to save and load from files, which should be faster than .raw files (these load/save commands are not included/implemented) Add util functions to compress and uncompress strings. Fixed a couple of modules so they use SceneCommunicationService rather than directly call functions on the CommsManager. --- .../Modules/World/Terrain/TerrainChannel.cs | 75 ++++++++++++++++++++++ 1 file changed, 75 insertions(+) (limited to 'OpenSim/Region/Environment/Modules/World/Terrain/TerrainChannel.cs') diff --git a/OpenSim/Region/Environment/Modules/World/Terrain/TerrainChannel.cs b/OpenSim/Region/Environment/Modules/World/Terrain/TerrainChannel.cs index 1399960..53d03fc 100644 --- a/OpenSim/Region/Environment/Modules/World/Terrain/TerrainChannel.cs +++ b/OpenSim/Region/Environment/Modules/World/Terrain/TerrainChannel.cs @@ -27,6 +27,11 @@ using OpenSim.Framework; using OpenSim.Region.Environment.Interfaces; +using System; +using System.Text; +using System.Xml; +using System.IO; +using System.Xml.Serialization; namespace OpenSim.Region.Environment.Modules.World.Terrain { @@ -151,5 +156,75 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain return copy; } + + public string SaveToXmlString() + { + XmlWriterSettings settings = new XmlWriterSettings(); + settings.Encoding = Encoding.UTF8; + using (StringWriter sw = new StringWriter()) + { + using (XmlWriter writer = XmlWriter.Create(sw, settings)) + { + WriteXml(writer); + } + string output = sw.ToString(); + return output; + } + } + + private void WriteXml(XmlWriter writer) + { + writer.WriteStartElement(String.Empty, "TerrainMap", String.Empty); + ToXml(writer); + writer.WriteEndElement(); + } + + public void LoadFromXmlString(string data) + { + StringReader sr = new StringReader(data); + XmlTextReader reader = new XmlTextReader(sr); + reader.Read(); + + ReadXml(reader); + reader.Close(); + sr.Close(); + } + + private void ReadXml(XmlReader reader) + { + reader.ReadStartElement("TerrainMap"); + FromXml(reader); + } + + private void ToXml(XmlWriter xmlWriter) + { + float[] mapData = GetFloatsSerialised(); + byte[] buffer = new byte[mapData.Length * 4]; + for (int i = 0; i < mapData.Length; i++) + { + byte[] value = BitConverter.GetBytes(mapData[i]); + Array.Copy(value, 0, buffer, (i * 4), 4); + } + XmlSerializer serializer = new XmlSerializer(typeof(byte[])); + serializer.Serialize(xmlWriter, buffer); + } + + private void FromXml(XmlReader xmlReader) + { + XmlSerializer serializer = new XmlSerializer(typeof(byte[])); + byte[] dataArray = (byte[])serializer.Deserialize(xmlReader); + int index = 0; + + for (int y = 0; y < Height; y++) + { + for (int x = 0; x < Width; x++) + { + float value; + value = BitConverter.ToSingle(dataArray, index); + index += 4; + this[x, y] = (double)value; + } + } + } } } \ No newline at end of file -- cgit v1.1