From d56ed8fe9c6428a4ac3288190be303b5813b0b91 Mon Sep 17 00:00:00 2001 From: MW Date: Sun, 4 Nov 2007 22:22:53 +0000 Subject: Some more refactoring --- .../Region/Environment/Scenes/SceneXmlLoader.cs | 145 +++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs (limited to 'OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs') diff --git a/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs b/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs new file mode 100644 index 0000000..1176e13 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; +using System.IO; +using libsecondlife; +using Axiom.Math; +using OpenSim.Framework; +using OpenSim.Region.Physics.Manager; + +namespace OpenSim.Region.Environment.Scenes +{ + public class SceneXmlLoader //Most likely can move to a module + { + protected InnerScene m_innerScene; + protected RegionInfo m_regInfo; + protected Scene m_parentScene; + + public SceneXmlLoader(Scene parentScene, InnerScene innerScene, RegionInfo regionInfo) + { + m_parentScene = parentScene; + m_innerScene = innerScene; + m_regInfo = regionInfo; + } + + public void LoadPrimsFromXml(string fileName) + { + XmlDocument doc = new XmlDocument(); + XmlNode rootNode; + int primCount = 0; + if (fileName.StartsWith("http:") || File.Exists(fileName)) + { + XmlTextReader reader = new XmlTextReader(fileName); + reader.WhitespaceHandling = WhitespaceHandling.None; + doc.Load(reader); + reader.Close(); + rootNode = doc.FirstChild; + foreach (XmlNode aPrimNode in rootNode.ChildNodes) + { + SceneObjectGroup obj = new SceneObjectGroup(m_parentScene, + m_regInfo.RegionHandle, aPrimNode.OuterXml); + //if we want this to be a import method then we need new uuids for the object to avoid any clashes + //obj.RegenerateFullIDs(); + m_innerScene.AddEntity(obj); + + SceneObjectPart rootPart = obj.GetChildPart(obj.UUID); + bool UsePhysics = ((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) > 0); + if ((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0) + rootPart.PhysActor = m_innerScene.PhyScene.AddPrimShape( + rootPart.Name, + rootPart.Shape, + new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y, + rootPart.AbsolutePosition.Z), + new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z), + new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X, + rootPart.RotationOffset.Y, rootPart.RotationOffset.Z), UsePhysics); + primCount++; + } + } + else + { + throw new Exception("Could not open file " + fileName + " for reading"); + } + } + + public void SavePrimsToXml(string fileName) + { + FileStream file = new FileStream(fileName, FileMode.Create); + StreamWriter stream = new StreamWriter(file); + int primCount = 0; + stream.WriteLine("\n"); + foreach (EntityBase ent in m_innerScene.Entities.Values) + { + if (ent is SceneObjectGroup) + { + stream.WriteLine(((SceneObjectGroup)ent).ToXmlString()); + primCount++; + } + } + stream.WriteLine("\n"); + stream.Close(); + file.Close(); + } + + public void LoadPrimsFromXml2(string fileName) + { + XmlDocument doc = new XmlDocument(); + XmlNode rootNode; + if (fileName.StartsWith("http:") || File.Exists(fileName)) + { + XmlTextReader reader = new XmlTextReader(fileName); + reader.WhitespaceHandling = WhitespaceHandling.None; + doc.Load(reader); + reader.Close(); + rootNode = doc.FirstChild; + foreach (XmlNode aPrimNode in rootNode.ChildNodes) + { + CreatePrimFromXml(aPrimNode.OuterXml); + } + } + else + { + throw new Exception("Could not open file " + fileName + " for reading"); + } + } + + public void CreatePrimFromXml(string xmlData) + { + SceneObjectGroup obj = new SceneObjectGroup(xmlData); + m_innerScene.AddEntityFromStorage(obj); + + SceneObjectPart rootPart = obj.GetChildPart(obj.UUID); + bool UsePhysics = ((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) > 0); + if ((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0) + rootPart.PhysActor = m_innerScene.PhyScene.AddPrimShape( + rootPart.Name, + rootPart.Shape, + new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y, + rootPart.AbsolutePosition.Z), + new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z), + new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X, + rootPart.RotationOffset.Y, rootPart.RotationOffset.Z), UsePhysics); + } + + public void SavePrimsToXml2(string fileName) + { + FileStream file = new FileStream(fileName, FileMode.Create); + StreamWriter stream = new StreamWriter(file); + int primCount = 0; + stream.WriteLine("\n"); + foreach (EntityBase ent in m_innerScene.Entities.Values) + { + if (ent is SceneObjectGroup) + { + stream.WriteLine(((SceneObjectGroup)ent).ToXmlString2()); + primCount++; + } + } + stream.WriteLine("\n"); + stream.Close(); + file.Close(); + } + + } +} -- cgit v1.1