From bfd9cc44b40e64af3c7504d43a15b7e1b44070a0 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Sat, 26 Mar 2011 02:05:53 +0000
Subject: When an object is duplicated, add the dupe to the uuid/local id
indexes as well as the basic entities list.
Added a prim counts test to reinforce this - shift-copy was no incrementing prim count. This will sometime become a basic scene test.
New code needs to be refactored so we just call SceneGraph.AddSceneObject(). This will happen in the near future.
With this, basic owner prim counts on a single parcel appear to be working fine (with the same previous existing taint calls as used by the land management module).
More work to do.
---
.../World/Land/Tests/PrimCountModuleTests.cs | 23 +++++++++++++++++
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 30 +++++++++++++++++++++-
2 files changed, 52 insertions(+), 1 deletion(-)
diff --git a/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs b/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs
index 80b2859..dd55f98 100644
--- a/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs
+++ b/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs
@@ -105,6 +105,29 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
}
///
+ /// Test count after a parcel owner owned copied object is added.
+ ///
+ [Test]
+ public void TestCopiedOwnerObject()
+ {
+ TestHelper.InMethod();
+// log4net.Config.XmlConfigurator.Configure();
+
+ IPrimCounts pc = m_lo.PrimCounts;
+
+ SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_userId, 0x01);
+ m_scene.AddNewSceneObject(sog, false);
+ m_scene.SceneGraph.DuplicateObject(sog.LocalId, Vector3.Zero, 0, m_userId, UUID.Zero, Quaternion.Identity);
+
+ Assert.That(pc.Owner, Is.EqualTo(6));
+ Assert.That(pc.Group, Is.EqualTo(0));
+ Assert.That(pc.Others, Is.EqualTo(0));
+ Assert.That(pc.Users[m_userId], Is.EqualTo(6));
+ Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0));
+ Assert.That(pc.Simulator, Is.EqualTo(6));
+ }
+
+ ///
/// Test count after a parcel owner owned object is removed.
///
[Test]
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 1621398..60855b2 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -363,6 +363,10 @@ namespace OpenSim.Region.Framework.Scenes
if (Entities.ContainsKey(sceneObject.UUID))
return false;
+
+// m_log.DebugFormat(
+// "[SCENEGRAPH]: Adding scene object {0} {1}, with {2} parts on {3}",
+// sceneObject.Name, sceneObject.UUID, sceneObject.Parts.Length, m_parentScene.RegionInfo.RegionName);
SceneObjectPart[] children = sceneObject.Parts;
@@ -1798,7 +1802,10 @@ namespace OpenSim.Region.Framework.Scenes
///
public SceneObjectGroup DuplicateObject(uint originalPrimID, Vector3 offset, uint flags, UUID AgentID, UUID GroupID, Quaternion rot)
{
- //m_log.DebugFormat("[SCENE]: Duplication of object {0} at offset {1} requested by agent {2}", originalPrim, offset, AgentID);
+// m_log.DebugFormat(
+// "[SCENE]: Duplication of object {0} at offset {1} requested by agent {2}",
+// originalPrimID, offset, AgentID);
+
SceneObjectGroup original = GetGroupByPrim(originalPrimID);
if (original != null)
{
@@ -1829,7 +1836,28 @@ namespace OpenSim.Region.Framework.Scenes
copy.RootPart.SalePrice = 10;
}
+ // FIXME: This section needs to be refactored so that it just calls AddSceneObject()
Entities.Add(copy);
+
+ lock (SceneObjectGroupsByFullID)
+ SceneObjectGroupsByFullID[copy.UUID] = copy;
+
+ SceneObjectPart[] children = copy.Parts;
+
+ lock (SceneObjectGroupsByFullPartID)
+ {
+ SceneObjectGroupsByFullPartID[copy.UUID] = copy;
+ foreach (SceneObjectPart part in children)
+ SceneObjectGroupsByFullPartID[part.UUID] = copy;
+ }
+
+ lock (SceneObjectGroupsByLocalPartID)
+ {
+ SceneObjectGroupsByLocalPartID[copy.LocalId] = copy;
+ foreach (SceneObjectPart part in children)
+ SceneObjectGroupsByLocalPartID[copy.LocalId] = copy;
+ }
+ // PROBABLE END OF FIXME
// Since we copy from a source group that is in selected
// state, but the copy is shown deselected in the viewer,
--
cgit v1.1