SceneObjectGroup cleanup. Removes the default constructor and unnecessary null checks on m_rootPart

prioritization
John Hurliman 2009-09-16 15:06:08 -07:00
parent df7904c58b
commit f42d085ab1
9 changed files with 80 additions and 142 deletions

View File

@ -178,25 +178,38 @@ namespace OpenSim.Data.NHibernate
private SceneObjectGroup LoadObject(UUID uuid, UUID region) private SceneObjectGroup LoadObject(UUID uuid, UUID region)
{ {
SceneObjectGroup group = new SceneObjectGroup();
ICriteria criteria = manager.GetSession().CreateCriteria(typeof(SceneObjectPart)); ICriteria criteria = manager.GetSession().CreateCriteria(typeof(SceneObjectPart));
criteria.Add(Expression.Eq("RegionID", region)); criteria.Add(Expression.Eq("RegionID", region));
criteria.Add(Expression.Eq("ParentUUID", uuid)); criteria.Add(Expression.Eq("ParentUUID", uuid));
criteria.AddOrder(Order.Asc("ParentID")); criteria.AddOrder(Order.Asc("ParentID"));
foreach (SceneObjectPart p in criteria.List()) IList<SceneObjectPart> parts = criteria.List<SceneObjectPart>();
SceneObjectGroup group = null;
// Find the root part
for (int i = 0; i < parts.Count; i++)
{ {
// root part if (parts[i].UUID == uuid)
if (p.UUID == uuid)
{ {
group.SetRootPart(p); group = new SceneObjectGroup(parts[i]);
break;
} }
else }
// Add the children parts
if (group != null)
{
for (int i = 0; i < parts.Count; i++)
{ {
group.AddPart(p); if (parts[i].UUID != uuid)
group.AddPart(parts[i]);
} }
} }
else
{
m_log.Error("[NHIBERNATE]: LoadObject() Attempted to load a SceneObjectGroup with no root SceneObjectPart ");
}
return group; return group;
} }
@ -237,8 +250,7 @@ namespace OpenSim.Data.NHibernate
// root part // root part
if (p.UUID == p.ParentUUID) if (p.UUID == p.ParentUUID)
{ {
SceneObjectGroup group = new SceneObjectGroup(); SceneObjectGroup group = new SceneObjectGroup(p);
group.SetRootPart(p);
SOG.Add(p.ParentUUID, group); SOG.Add(p.ParentUUID, group);
} }
else else

View File

@ -416,7 +416,6 @@ namespace OpenSim.Data.SQLite
if (uuid == objID) //is new SceneObjectGroup ? if (uuid == objID) //is new SceneObjectGroup ?
{ {
SceneObjectGroup group = new SceneObjectGroup();
prim = buildPrim(primRow); prim = buildPrim(primRow);
DataRow shapeRow = shapes.Rows.Find(prim.UUID.ToString()); DataRow shapeRow = shapes.Rows.Find(prim.UUID.ToString());
if (shapeRow != null) if (shapeRow != null)
@ -430,7 +429,7 @@ namespace OpenSim.Data.SQLite
prim.Shape = PrimitiveBaseShape.Default; prim.Shape = PrimitiveBaseShape.Default;
} }
group.SetRootPart(prim); SceneObjectGroup group = new SceneObjectGroup(prim);
createdObjects.Add(group.UUID, group); createdObjects.Add(group.UUID, group);
retvals.Add(group); retvals.Add(group);
LoadItems(prim); LoadItems(prim);

View File

@ -322,9 +322,8 @@ namespace OpenSim.Data.Tests
// This is necessary or object will not be inserted in DB // This is necessary or object will not be inserted in DB
sop.ObjectFlags = 0; sop.ObjectFlags = 0;
SceneObjectGroup sog = new SceneObjectGroup(); SceneObjectGroup sog = new SceneObjectGroup(sop);
sog.SetScene(scene); // Reguired by nhibernate database module. sog.SetScene(scene); // Reguired by nhibernate database module.
sog.SetRootPart(sop);
// Inserts group in DB // Inserts group in DB
db.StoreObject(sog,region3); db.StoreObject(sog,region3);
@ -1003,9 +1002,8 @@ namespace OpenSim.Data.Tests
sop.UUID = uuid; sop.UUID = uuid;
sop.Shape = PrimitiveBaseShape.Default; sop.Shape = PrimitiveBaseShape.Default;
SceneObjectGroup sog = new SceneObjectGroup(); SceneObjectGroup sog = new SceneObjectGroup(sop);
sog.SetScene(scene); sog.SetScene(scene);
sog.SetRootPart(sop);
return sog; return sog;
} }

View File

@ -73,10 +73,6 @@ namespace OpenSim.Region.Examples.SimpleModule
base.UpdateMovement(); base.UpdateMovement();
} }
public ComplexObject()
{
}
public ComplexObject(Scene scene, ulong regionHandle, UUID ownerID, uint localID, Vector3 pos) public ComplexObject(Scene scene, ulong regionHandle, UUID ownerID, uint localID, Vector3 pos)
: base(ownerID, pos, PrimitiveBaseShape.Default) : base(ownerID, pos, PrimitiveBaseShape.Default)
{ {

View File

@ -250,16 +250,7 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
public override Vector3 AbsolutePosition public override Vector3 AbsolutePosition
{ {
get get { return m_rootPart.GroupPosition; }
{
if (m_rootPart == null)
{
throw new NullReferenceException(
string.Format("[SCENE OBJECT GROUP]: Object {0} has no root part.", m_uuid));
}
return m_rootPart.GroupPosition;
}
set set
{ {
Vector3 val = value; Vector3 val = value;
@ -291,41 +282,19 @@ namespace OpenSim.Region.Framework.Scenes
public override uint LocalId public override uint LocalId
{ {
get get { return m_rootPart.LocalId; }
{
if (m_rootPart == null)
{
m_log.Error("[SCENE OBJECT GROUP]: Unable to find the rootpart for a LocalId Request!");
return 0;
}
return m_rootPart.LocalId;
}
set { m_rootPart.LocalId = value; } set { m_rootPart.LocalId = value; }
} }
public override UUID UUID public override UUID UUID
{ {
get { get { return m_rootPart.UUID; }
if (m_rootPart == null)
{
m_log.Error("Got a null rootpart while requesting UUID. Called from: ", new Exception());
return UUID.Zero;
}
else return m_rootPart.UUID;
}
set { m_rootPart.UUID = value; } set { m_rootPart.UUID = value; }
} }
public UUID OwnerID public UUID OwnerID
{ {
get get { return m_rootPart.OwnerID; }
{
if (m_rootPart == null)
return UUID.Zero;
return m_rootPart.OwnerID;
}
set { m_rootPart.OwnerID = value; } set { m_rootPart.OwnerID = value; }
} }
@ -366,7 +335,7 @@ namespace OpenSim.Region.Framework.Scenes
{ {
m_isSelected = value; m_isSelected = value;
// Tell physics engine that group is selected // Tell physics engine that group is selected
if (m_rootPart != null && m_rootPart.PhysActor != null) if (m_rootPart.PhysActor != null)
{ {
m_rootPart.PhysActor.Selected = value; m_rootPart.PhysActor.Selected = value;
// Pass it on to the children. // Pass it on to the children.
@ -398,13 +367,6 @@ namespace OpenSim.Region.Framework.Scenes
#region Constructors #region Constructors
/// <summary>
/// Constructor
/// </summary>
public SceneObjectGroup()
{
}
/// <summary> /// <summary>
/// This constructor creates a SceneObjectGroup using a pre-existing SceneObjectPart. /// This constructor creates a SceneObjectGroup using a pre-existing SceneObjectPart.
/// The original SceneObjectPart will be used rather than a copy, preserving /// The original SceneObjectPart will be used rather than a copy, preserving
@ -420,8 +382,7 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
public SceneObjectGroup(UUID ownerID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape) public SceneObjectGroup(UUID ownerID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape)
{ {
Vector3 rootOffset = new Vector3(0, 0, 0); SetRootPart(new SceneObjectPart(ownerID, shape, pos, rot, Vector3.Zero));
SetRootPart(new SceneObjectPart(ownerID, shape, pos, rot, rootOffset));
} }
/// <summary> /// <summary>
@ -462,11 +423,7 @@ namespace OpenSim.Region.Framework.Scenes
public UUID GetFromItemID() public UUID GetFromItemID()
{ {
if (m_rootPart != null) return m_rootPart.FromItemID;
{
return m_rootPart.FromItemID;
}
return UUID.Zero;
} }
/// <summary> /// <summary>
@ -958,11 +915,7 @@ namespace OpenSim.Region.Framework.Scenes
public byte GetAttachmentPoint() public byte GetAttachmentPoint()
{ {
if (m_rootPart != null) return m_rootPart.Shape.State;
{
return m_rootPart.Shape.State;
}
return (byte)0;
} }
public void ClearPartAttachmentData() public void ClearPartAttachmentData()
@ -1072,6 +1025,9 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="part"></param> /// <param name="part"></param>
public void SetRootPart(SceneObjectPart part) public void SetRootPart(SceneObjectPart part)
{ {
if (part == null)
throw new ArgumentNullException("Cannot give SceneObjectGroup a null root SceneObjectPart");
part.SetParent(this); part.SetParent(this);
m_rootPart = part; m_rootPart = part;
if (!IsAttachment) if (!IsAttachment)
@ -1224,7 +1180,7 @@ namespace OpenSim.Region.Framework.Scenes
if (!silent) if (!silent)
{ {
if (m_rootPart != null && part == m_rootPart) if (part == m_rootPart)
avatars[i].ControllingClient.SendKillObject(m_regionHandle, part.LocalId); avatars[i].ControllingClient.SendKillObject(m_regionHandle, part.LocalId);
} }
} }
@ -1447,7 +1403,7 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="part"></param> /// <param name="part"></param>
internal void SendPartFullUpdate(IClientAPI remoteClient, SceneObjectPart part, uint clientFlags) internal void SendPartFullUpdate(IClientAPI remoteClient, SceneObjectPart part, uint clientFlags)
{ {
if (m_rootPart != null && m_rootPart.UUID == part.UUID) if (m_rootPart.UUID == part.UUID)
{ {
if (IsAttachment) if (IsAttachment)
{ {
@ -1881,12 +1837,6 @@ namespace OpenSim.Region.Framework.Scenes
if (m_isDeleted) if (m_isDeleted)
return; return;
// This is what happens when an orphanced link set child prim's
// group was queued when it was linked
//
if (m_rootPart == null)
return;
// Even temporary objects take part in physics (e.g. temp-on-rez bullets) // Even temporary objects take part in physics (e.g. temp-on-rez bullets)
//if ((RootPart.Flags & PrimFlags.TemporaryOnRez) != 0) //if ((RootPart.Flags & PrimFlags.TemporaryOnRez) != 0)
// return; // return;
@ -3129,26 +3079,22 @@ namespace OpenSim.Region.Framework.Scenes
int yaxis = 4; int yaxis = 4;
int zaxis = 8; int zaxis = 8;
if (m_rootPart != null) setX = ((axis & xaxis) != 0) ? true : false;
setY = ((axis & yaxis) != 0) ? true : false;
setZ = ((axis & zaxis) != 0) ? true : false;
float setval = (rotate10 > 0) ? 1f : 0f;
if (setX)
m_rootPart.RotationAxis.X = setval;
if (setY)
m_rootPart.RotationAxis.Y = setval;
if (setZ)
m_rootPart.RotationAxis.Z = setval;
if (setX || setY || setZ)
{ {
setX = ((axis & xaxis) != 0) ? true : false; m_rootPart.SetPhysicsAxisRotation();
setY = ((axis & yaxis) != 0) ? true : false;
setZ = ((axis & zaxis) != 0) ? true : false;
float setval = (rotate10 > 0) ? 1f : 0f;
if (setX)
m_rootPart.RotationAxis.X = setval;
if (setY)
m_rootPart.RotationAxis.Y = setval;
if (setZ)
m_rootPart.RotationAxis.Z = setval;
if (setX || setY || setZ)
{
m_rootPart.SetPhysicsAxisRotation();
}
} }
} }

View File

@ -65,8 +65,6 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
//m_log.DebugFormat("[SOG]: Starting deserialization of SOG"); //m_log.DebugFormat("[SOG]: Starting deserialization of SOG");
//int time = System.Environment.TickCount; //int time = System.Environment.TickCount;
SceneObjectGroup sceneObject = new SceneObjectGroup();
// libomv.types changes UUID to Guid // libomv.types changes UUID to Guid
xmlData = xmlData.Replace("<UUID>", "<Guid>"); xmlData = xmlData.Replace("<UUID>", "<Guid>");
xmlData = xmlData.Replace("</UUID>", "</Guid>"); xmlData = xmlData.Replace("</UUID>", "</Guid>");
@ -88,17 +86,13 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
parts = doc.GetElementsByTagName("RootPart"); parts = doc.GetElementsByTagName("RootPart");
if (parts.Count == 0) if (parts.Count == 0)
{
throw new Exception("Invalid Xml format - no root part"); throw new Exception("Invalid Xml format - no root part");
}
else sr = new StringReader(parts[0].InnerXml);
{ reader = new XmlTextReader(sr);
sr = new StringReader(parts[0].InnerXml); SceneObjectGroup sceneObject = new SceneObjectGroup(SceneObjectPart.FromXml(fromUserInventoryItemID, reader));
reader = new XmlTextReader(sr); reader.Close();
sceneObject.SetRootPart(SceneObjectPart.FromXml(fromUserInventoryItemID, reader)); sr.Close();
reader.Close();
sr.Close();
}
parts = doc.GetElementsByTagName("Part"); parts = doc.GetElementsByTagName("Part");
@ -119,16 +113,15 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
// Script state may, or may not, exist. Not having any, is NOT // Script state may, or may not, exist. Not having any, is NOT
// ever a problem. // ever a problem.
sceneObject.LoadScriptState(doc); sceneObject.LoadScriptState(doc);
return sceneObject;
} }
catch (Exception e) catch (Exception e)
{ {
m_log.ErrorFormat( m_log.ErrorFormat(
"[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData); "[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData);
return null;
} }
//m_log.DebugFormat("[SERIALIZER]: Finished deserialization of SOG {0}, {1}ms", Name, System.Environment.TickCount - time);
return sceneObject;
} }
/// <summary> /// <summary>
@ -195,8 +188,6 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
//m_log.DebugFormat("[SOG]: Starting deserialization of SOG"); //m_log.DebugFormat("[SOG]: Starting deserialization of SOG");
//int time = System.Environment.TickCount; //int time = System.Environment.TickCount;
SceneObjectGroup sceneObject = new SceneObjectGroup();
// libomv.types changes UUID to Guid // libomv.types changes UUID to Guid
xmlData = xmlData.Replace("<UUID>", "<Guid>"); xmlData = xmlData.Replace("<UUID>", "<Guid>");
xmlData = xmlData.Replace("</UUID>", "</Guid>"); xmlData = xmlData.Replace("</UUID>", "</Guid>");
@ -212,21 +203,23 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
XmlNodeList parts = doc.GetElementsByTagName("SceneObjectPart"); XmlNodeList parts = doc.GetElementsByTagName("SceneObjectPart");
// Process the root part first if (parts.Count == 0)
if (parts.Count > 0)
{ {
StringReader sr = new StringReader(parts[0].OuterXml); m_log.ErrorFormat("[SERIALIZER]: Deserialization of xml failed: No SceneObjectPart nodes. xml was " + xmlData);
XmlTextReader reader = new XmlTextReader(sr); return null;
sceneObject.SetRootPart(SceneObjectPart.FromXml(reader));
reader.Close();
sr.Close();
} }
StringReader sr = new StringReader(parts[0].OuterXml);
XmlTextReader reader = new XmlTextReader(sr);
SceneObjectGroup sceneObject = new SceneObjectGroup(SceneObjectPart.FromXml(reader));
reader.Close();
sr.Close();
// Then deal with the rest // Then deal with the rest
for (int i = 1; i < parts.Count; i++) for (int i = 1; i < parts.Count; i++)
{ {
StringReader sr = new StringReader(parts[i].OuterXml); sr = new StringReader(parts[i].OuterXml);
XmlTextReader reader = new XmlTextReader(sr); reader = new XmlTextReader(sr);
SceneObjectPart part = SceneObjectPart.FromXml(reader); SceneObjectPart part = SceneObjectPart.FromXml(reader);
sceneObject.AddPart(part); sceneObject.AddPart(part);
part.StoreUndoState(); part.StoreUndoState();
@ -238,15 +231,13 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
// ever a problem. // ever a problem.
sceneObject.LoadScriptState(doc); sceneObject.LoadScriptState(doc);
return sceneObject;
} }
catch (Exception e) catch (Exception e)
{ {
m_log.ErrorFormat("[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData); m_log.ErrorFormat("[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData);
return null;
} }
//m_log.DebugFormat("[SERIALIZER]: Finished deserialization of SOG {0}, {1}ms", Name, System.Environment.TickCount - time);
return sceneObject;
} }
/// <summary> /// <summary>

View File

@ -128,7 +128,6 @@ namespace OpenSim.Region.Framework.Scenes.Tests
private SceneObjectGroup NewSOG() private SceneObjectGroup NewSOG()
{ {
SceneObjectGroup sog = new SceneObjectGroup();
SceneObjectPart sop = new SceneObjectPart(UUID.Random(), PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero); SceneObjectPart sop = new SceneObjectPart(UUID.Random(), PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero);
sop.Name = RandomName(); sop.Name = RandomName();
sop.Description = sop.Name; sop.Description = sop.Name;
@ -137,8 +136,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
sop.TouchName = RandomName(); sop.TouchName = RandomName();
sop.ObjectFlags |= (uint)PrimFlags.Phantom; sop.ObjectFlags |= (uint)PrimFlags.Phantom;
sog.SetRootPart(sop); SceneObjectGroup sog = new SceneObjectGroup(sop);
scene.AddNewSceneObject(sog, false); scene.AddNewSceneObject(sog, false);
return sog; return sog;

View File

@ -407,9 +407,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests
sop.Shape.State = 1; sop.Shape.State = 1;
sop.OwnerID = agent; sop.OwnerID = agent;
SceneObjectGroup sog = new SceneObjectGroup(); SceneObjectGroup sog = new SceneObjectGroup(sop);
sog.SetScene(scene); sog.SetScene(scene);
sog.SetRootPart(sop);
return sog; return sog;
} }

View File

@ -66,7 +66,6 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
private void CreatePointEntity(Scene scene, UUID uuid, Vector3 groupPos) private void CreatePointEntity(Scene scene, UUID uuid, Vector3 groupPos)
{ {
SceneObjectGroup x = new SceneObjectGroup();
SceneObjectPart y = new SceneObjectPart(); SceneObjectPart y = new SceneObjectPart();
//Initialize part //Initialize part
@ -93,8 +92,8 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
y.TrimPermissions(); y.TrimPermissions();
//Initialize group and add part as root part //Initialize group and add part as root part
SceneObjectGroup x = new SceneObjectGroup(y);
x.SetScene(scene); x.SetScene(scene);
x.SetRootPart(y);
x.RegionHandle = scene.RegionInfo.RegionHandle; x.RegionHandle = scene.RegionInfo.RegionHandle;
x.SetScene(scene); x.SetScene(scene);