From 16d0a895cb817f96a55091fadbbd4cfb2d909204 Mon Sep 17 00:00:00 2001
From: Justin Clarke Casey
Date: Tue, 17 Jun 2008 20:36:21 +0000
Subject: * Refactor: Move the responsibility for applying physics and sending
the initial client update to Scene.AddSceneObject() from some of the
SceneObjectGroup constructors * I think this has been done cleanly from
inspection and testing, but if prim creation or load suddenly starts playing
up more than usual, please open a mantis * This also has the effect of
stopping the archiver generating ghost in-world prims * Some code dupliction
also removed
---
.../Modules/World/Serialiser/SceneXmlLoader.cs | 33 +---------------------
OpenSim/Region/Environment/Scenes/InnerScene.cs | 8 ++++--
.../Region/Environment/Scenes/Scene.Inventory.cs | 6 ++--
OpenSim/Region/Environment/Scenes/Scene.cs | 11 ++++----
.../Region/Environment/Scenes/SceneObjectGroup.cs | 9 ------
.../Region/Examples/SimpleModule/RegionModule.cs | 1 -
6 files changed, 16 insertions(+), 52 deletions(-)
diff --git a/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs b/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs
index 5591ddc..db16601 100644
--- a/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs
+++ b/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs
@@ -45,7 +45,7 @@ namespace OpenSim.Region.Environment.Scenes
{
XmlDocument doc = new XmlDocument();
XmlNode rootNode;
- int primCount = 0;
+
if (fileName.StartsWith("http:") || File.Exists(fileName))
{
XmlTextReader reader = new XmlTextReader(fileName);
@@ -65,33 +65,6 @@ namespace OpenSim.Region.Environment.Scenes
//obj.RegenerateFullIDs();
scene.AddSceneObject(obj, true);
-
- SceneObjectPart rootPart = obj.GetChildPart(obj.UUID);
- // Apply loadOffsets for load/import and move combinations
- rootPart.GroupPosition = rootPart.AbsolutePosition + loadOffset;
- bool UsePhysics = (((rootPart.GetEffectiveObjectFlags() & (uint) LLObject.ObjectFlags.Physics) > 0) &&
- scene.m_physicalPrim);
- if ((rootPart.GetEffectiveObjectFlags() & (uint) LLObject.ObjectFlags.Phantom) == 0)
- {
- rootPart.PhysActor = scene.PhysicsScene.AddPrimShape(
- rootPart.Name,
- rootPart.Shape,
- new PhysicsVector(rootPart.AbsolutePosition.X + loadOffset.X,
- rootPart.AbsolutePosition.Y + loadOffset.Y,
- rootPart.AbsolutePosition.Z + loadOffset.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);
-
- // to quote from SceneObjectPart: Basic
- // Physics returns null.. joy joy joy.
- if (rootPart.PhysActor != null)
- {
- rootPart.PhysActor.LocalID = rootPart.LocalId;
- rootPart.DoPhysicsPropertyUpdate(UsePhysics, true);
- }
- }
- primCount++;
}
}
else
@@ -196,10 +169,6 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectGroup obj = new SceneObjectGroup(xmlData);
scene.AddSceneObjectFromStorage(obj);
-
- obj.ApplyPhysics(scene.m_physicalPrim);
-
- obj.ScheduleGroupForFullUpdate();
}
public static void SavePrimsToXml2(Scene scene, string fileName)
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs
index 9bbfc3d..e803122 100644
--- a/OpenSim/Region/Environment/Scenes/InnerScene.cs
+++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs
@@ -197,15 +197,16 @@ namespace OpenSim.Region.Environment.Scenes
foreach (SceneObjectPart part in sceneObject.Children.Values)
{
part.LocalId = m_parentScene.PrimIDAllocate();
-
}
+
sceneObject.UpdateParentIDs();
AddSceneObject(sceneObject, true);
}
///
- /// Add an object to the scene.
+ /// Add an object to the scene. This will both update the scene, and send information about the
+ /// new object to all clients interested in the scene.
///
///
///
@@ -216,6 +217,9 @@ namespace OpenSim.Region.Environment.Scenes
///
protected internal bool AddSceneObject(SceneObjectGroup sceneObject, bool attachToBackup)
{
+ sceneObject.ApplyPhysics(m_parentScene.m_physicalPrim);
+ sceneObject.ScheduleGroupForFullUpdate();
+
lock (Entities)
{
if (!Entities.ContainsKey(sceneObject.UUID))
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
index ebc721f..ff62a3b 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
@@ -1499,7 +1499,7 @@ namespace OpenSim.Region.Environment.Scenes
{
string xmlData = Helpers.FieldToUTF8String(rezAsset.Data);
SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData);
- if (!ExternalChecks.ExternalChecksCanRezObject(group.Children.Count,remoteClient.AgentId, pos) && !attachment)
+ if (!ExternalChecks.ExternalChecksCanRezObject(group.Children.Count, remoteClient.AgentId, pos) && !attachment)
{
return null;
}
@@ -1513,8 +1513,8 @@ namespace OpenSim.Region.Environment.Scenes
if (!attachment)
{
pos = GetNewRezLocation(
- RayStart, RayEnd, RayTargetID, new LLQuaternion(0, 0, 0, 1),
- BypassRayCast, bRayEndIsIntersection, true, group.GroupScale(), false);
+ RayStart, RayEnd, RayTargetID, new LLQuaternion(0, 0, 0, 1),
+ BypassRayCast, bRayEndIsIntersection, true, group.GroupScale(), false);
group.AbsolutePosition = pos;
}
else
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index b39e08d..7adfeca 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -1460,7 +1460,6 @@ namespace OpenSim.Region.Environment.Scenes
rootPart.ObjectFlags &= ~(uint)LLObject.ObjectFlags.Scripted;
rootPart.TrimPermissions();
group.CheckSculptAndLoad();
- group.ApplyPhysics(m_physicalPrim);
//rootPart.DoPhysicsPropertyUpdate(UsePhysics, true);
}
@@ -1578,9 +1577,12 @@ namespace OpenSim.Region.Environment.Scenes
public virtual SceneObjectGroup AddNewPrim(LLUUID ownerID, LLVector3 pos, LLQuaternion rot, PrimitiveBaseShape shape)
{
+ //m_log.DebugFormat(
+ // "[SCENE]: Scene.AddNewPrim() called for agent {0} in {1}", ownerID, RegionInfo.RegionName);
+
SceneObjectGroup sceneOb =
new SceneObjectGroup(this, m_regionHandle, ownerID, PrimIDAllocate(), pos, rot, shape);
- AddSceneObject(sceneOb, true);
+
SceneObjectPart rootPart = sceneOb.GetChildPart(sceneOb.UUID);
// if grass or tree, make phantom
//rootPart.TrimPermissions();
@@ -1591,9 +1593,8 @@ namespace OpenSim.Region.Environment.Scenes
if (rootPart.Shape.PCode != (byte)PCode.Grass)
AdaptTree(ref shape);
}
- // if not phantom, add to physics
- sceneOb.ApplyPhysics(m_physicalPrim);
- m_innerScene.AddToUpdateList(sceneOb);
+
+ AddSceneObject(sceneOb, true);
return sceneOb;
}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index 877f196..f94830e 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -350,10 +350,6 @@ namespace OpenSim.Region.Environment.Scenes
SetPartAsRoot(part);
RegionHandle = regionHandle;
-
- ApplyPhysics(scene.m_physicalPrim);
-
- ScheduleGroupForFullUpdate();
}
///
@@ -412,10 +408,6 @@ namespace OpenSim.Region.Environment.Scenes
m_rootPart.ParentID = 0;
m_rootPart.RegionHandle = m_regionHandle;
UpdateParentIDs();
-
- ApplyPhysics(scene.m_physicalPrim);
-
- ScheduleGroupForFullUpdate();
}
///
@@ -854,7 +846,6 @@ namespace OpenSim.Region.Environment.Scenes
if (part.UUID != m_rootPart.UUID)
{
part.ParentID = m_rootPart.LocalId;
-
}
}
}
diff --git a/OpenSim/Region/Examples/SimpleModule/RegionModule.cs b/OpenSim/Region/Examples/SimpleModule/RegionModule.cs
index ab643a2..2e6ed42 100644
--- a/OpenSim/Region/Examples/SimpleModule/RegionModule.cs
+++ b/OpenSim/Region/Examples/SimpleModule/RegionModule.cs
@@ -77,7 +77,6 @@ namespace OpenSim.Region.Examples.SimpleModule
FileSystemObject fileObject = new FileSystemObject(m_scene, fileInfo, filePos);
m_scene.AddSceneObject(fileObject, true);
- fileObject.ScheduleGroupForFullUpdate();
}
}
--
cgit v1.1