From e75bcd4c59234382ac3efb743a228cd23d92ad45 Mon Sep 17 00:00:00 2001 From: marc Date: Fri, 25 Nov 2011 15:21:42 +0100 Subject: [PATCH 01/13] Workaround for mesh to correct the number of faces in GetNumberOfSides(). Meshs are handeled as sculpts but can have up to 8 faces (SL restriction the collada format can handle even more). The patch enables all LSL function that adressing faces to behave correct. Like llGetNumberOfSides(); llSetLinkPrimitiveParamsFast(); llSetPrimitiveParams(); llSetColor(); Signed-off-by: marc --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 24322a174f..304a7a7b10 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -3272,7 +3272,15 @@ namespace OpenSim.Region.Framework.Scenes if (hasHollow) ret += 1; break; case PrimType.SCULPT: - ret = 1; + // Special mesh handling + if (this.Shape.SculptType == 5) + { + ret = 7; // its a mesh then max 8 faces + } + else + { + ret = 1; // its a sculpt then max 1 faces + } break; } return ret; From aba42d85434b0e0f367a4f691a9fab9d68fab99a Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 3 Dec 2011 15:54:06 +0000 Subject: [PATCH 02/13] Correct SOP.GetNumberOfSides() to return 8 for meshes rather than 7 We are returning the actual number of 'sides', not the maximum index number. Also minor format corrections. --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 304a7a7b10..dcbcfa312b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -3273,16 +3273,13 @@ namespace OpenSim.Region.Framework.Scenes break; case PrimType.SCULPT: // Special mesh handling - if (this.Shape.SculptType == 5) - { - ret = 7; // its a mesh then max 8 faces - } + if (Shape.SculptType == (byte)SculptType.Mesh) + ret = 8; // if it's a mesh then max 8 faces else - { - ret = 1; // its a sculpt then max 1 faces - } + ret = 1; // if it's a sculpt then max 1 face break; } + return ret; } @@ -3295,6 +3292,7 @@ namespace OpenSim.Region.Framework.Scenes { if (Shape.SculptEntry) return PrimType.SCULPT; + if ((Shape.ProfileCurve & 0x07) == (byte)ProfileShape.Square) { if (Shape.PathCurve == (byte)Extrusion.Straight) From aac3f2d04ed5d828f48959f73fca893f884cec3b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 3 Dec 2011 16:04:11 +0000 Subject: [PATCH 03/13] Add agent circuit number checks to TestCloseAgent() --- .../Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs index f0bbf0bc2b..f6a3d1f148 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs @@ -103,11 +103,15 @@ namespace OpenSim.Region.Framework.Scenes.Tests ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(sp.UUID), Is.Not.Null); + Assert.That(scene.AuthenticateHandler.AgentCircuits.Count, Is.EqualTo(1)); + Assert.That(scene.AuthenticateHandler.AgentCircuitsByUUID.Count, Is.EqualTo(1)); scene.IncomingCloseAgent(sp.UUID); Assert.That(scene.GetScenePresence(sp.UUID), Is.Null); Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(sp.UUID), Is.Null); + Assert.That(scene.AuthenticateHandler.AgentCircuits.Count, Is.EqualTo(0)); + Assert.That(scene.AuthenticateHandler.AgentCircuitsByUUID.Count, Is.EqualTo(0)); } /// From c934901a056f142c49e6b449971fcaf59ff19d82 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 3 Dec 2011 16:11:47 +0000 Subject: [PATCH 04/13] Use GetAgentCircuits() to receive a copy of the AgentCircuitsByUUID dictionary rather than AgentCircuitManager.AgentCircuits directly in "show circuits" to avoid enumeration exceptions --- OpenSim/Framework/AgentCircuitManager.cs | 91 +++++++++++-------- OpenSim/Region/Application/OpenSim.cs | 2 +- .../Scenes/Tests/ScenePresenceAgentTests.cs | 6 +- 3 files changed, 57 insertions(+), 42 deletions(-) diff --git a/OpenSim/Framework/AgentCircuitManager.cs b/OpenSim/Framework/AgentCircuitManager.cs index 1ce8c34079..a59bcfa1c4 100644 --- a/OpenSim/Framework/AgentCircuitManager.cs +++ b/OpenSim/Framework/AgentCircuitManager.cs @@ -35,15 +35,22 @@ namespace OpenSim.Framework /// public class AgentCircuitManager { - public Dictionary AgentCircuits = new Dictionary(); - public Dictionary AgentCircuitsByUUID = new Dictionary(); + /// + /// Agent circuits indexed by circuit code. + /// + private Dictionary m_agentCircuits = new Dictionary(); + + /// + /// Agent circuits indexed by agent UUID. + /// + private Dictionary m_agentCircuitsByUUID = new Dictionary(); public virtual AuthenticateResponse AuthenticateSession(UUID sessionID, UUID agentID, uint circuitcode) { AgentCircuitData validcircuit = null; - if (AgentCircuits.ContainsKey(circuitcode)) + if (m_agentCircuits.ContainsKey(circuitcode)) { - validcircuit = AgentCircuits[circuitcode]; + validcircuit = m_agentCircuits[circuitcode]; } AuthenticateResponse user = new AuthenticateResponse(); if (validcircuit == null) @@ -82,71 +89,81 @@ namespace OpenSim.Framework /// public virtual void AddNewCircuit(uint circuitCode, AgentCircuitData agentData) { - lock (AgentCircuits) + lock (m_agentCircuits) { - if (AgentCircuits.ContainsKey(circuitCode)) + if (m_agentCircuits.ContainsKey(circuitCode)) { - AgentCircuits[circuitCode] = agentData; - AgentCircuitsByUUID[agentData.AgentID] = agentData; + m_agentCircuits[circuitCode] = agentData; + m_agentCircuitsByUUID[agentData.AgentID] = agentData; } else { - AgentCircuits.Add(circuitCode, agentData); - AgentCircuitsByUUID[agentData.AgentID] = agentData; + m_agentCircuits.Add(circuitCode, agentData); + m_agentCircuitsByUUID[agentData.AgentID] = agentData; } } } public virtual void RemoveCircuit(uint circuitCode) { - lock (AgentCircuits) + lock (m_agentCircuits) { - if (AgentCircuits.ContainsKey(circuitCode)) + if (m_agentCircuits.ContainsKey(circuitCode)) { - UUID agentID = AgentCircuits[circuitCode].AgentID; - AgentCircuits.Remove(circuitCode); - AgentCircuitsByUUID.Remove(agentID); + UUID agentID = m_agentCircuits[circuitCode].AgentID; + m_agentCircuits.Remove(circuitCode); + m_agentCircuitsByUUID.Remove(agentID); } } } public virtual void RemoveCircuit(UUID agentID) { - lock (AgentCircuits) + lock (m_agentCircuits) { - if (AgentCircuitsByUUID.ContainsKey(agentID)) + if (m_agentCircuitsByUUID.ContainsKey(agentID)) { - uint circuitCode = AgentCircuitsByUUID[agentID].circuitcode; - AgentCircuits.Remove(circuitCode); - AgentCircuitsByUUID.Remove(agentID); + uint circuitCode = m_agentCircuitsByUUID[agentID].circuitcode; + m_agentCircuits.Remove(circuitCode); + m_agentCircuitsByUUID.Remove(agentID); } } } public AgentCircuitData GetAgentCircuitData(uint circuitCode) { AgentCircuitData agentCircuit = null; - AgentCircuits.TryGetValue(circuitCode, out agentCircuit); + m_agentCircuits.TryGetValue(circuitCode, out agentCircuit); return agentCircuit; } public AgentCircuitData GetAgentCircuitData(UUID agentID) { AgentCircuitData agentCircuit = null; - AgentCircuitsByUUID.TryGetValue(agentID, out agentCircuit); + m_agentCircuitsByUUID.TryGetValue(agentID, out agentCircuit); return agentCircuit; } + /// + /// Get all current agent circuits indexed by agent UUID. + /// + /// + public Dictionary GetAgentCircuits() + { + lock (m_agentCircuitsByUUID) + return new Dictionary(m_agentCircuitsByUUID); + } + public void UpdateAgentData(AgentCircuitData agentData) { - if (AgentCircuits.ContainsKey((uint) agentData.circuitcode)) + if (m_agentCircuits.ContainsKey((uint) agentData.circuitcode)) { - AgentCircuits[(uint) agentData.circuitcode].firstname = agentData.firstname; - AgentCircuits[(uint) agentData.circuitcode].lastname = agentData.lastname; - AgentCircuits[(uint) agentData.circuitcode].startpos = agentData.startpos; + m_agentCircuits[(uint) agentData.circuitcode].firstname = agentData.firstname; + m_agentCircuits[(uint) agentData.circuitcode].lastname = agentData.lastname; + m_agentCircuits[(uint) agentData.circuitcode].startpos = agentData.startpos; // Updated for when we don't know them before calling Scene.NewUserConnection - AgentCircuits[(uint) agentData.circuitcode].SecureSessionID = agentData.SecureSessionID; - AgentCircuits[(uint) agentData.circuitcode].SessionID = agentData.SessionID; + m_agentCircuits[(uint) agentData.circuitcode].SecureSessionID = agentData.SecureSessionID; + m_agentCircuits[(uint) agentData.circuitcode].SessionID = agentData.SessionID; // m_log.Debug("update user start pos is " + agentData.startpos.X + " , " + agentData.startpos.Y + " , " + agentData.startpos.Z); } @@ -159,16 +176,16 @@ namespace OpenSim.Framework /// public bool TryChangeCiruitCode(uint circuitcode, uint newcircuitcode) { - lock (AgentCircuits) + lock (m_agentCircuits) { - if (AgentCircuits.ContainsKey((uint)circuitcode) && !AgentCircuits.ContainsKey((uint)newcircuitcode)) + if (m_agentCircuits.ContainsKey((uint)circuitcode) && !m_agentCircuits.ContainsKey((uint)newcircuitcode)) { - AgentCircuitData agentData = AgentCircuits[(uint)circuitcode]; + AgentCircuitData agentData = m_agentCircuits[(uint)circuitcode]; agentData.circuitcode = newcircuitcode; - AgentCircuits.Remove((uint)circuitcode); - AgentCircuits.Add(newcircuitcode, agentData); + m_agentCircuits.Remove((uint)circuitcode); + m_agentCircuits.Add(newcircuitcode, agentData); return true; } } @@ -178,17 +195,17 @@ namespace OpenSim.Framework public void UpdateAgentChildStatus(uint circuitcode, bool childstatus) { - if (AgentCircuits.ContainsKey(circuitcode)) + if (m_agentCircuits.ContainsKey(circuitcode)) { - AgentCircuits[circuitcode].child = childstatus; + m_agentCircuits[circuitcode].child = childstatus; } } public bool GetAgentChildStatus(uint circuitcode) { - if (AgentCircuits.ContainsKey(circuitcode)) + if (m_agentCircuits.ContainsKey(circuitcode)) { - return AgentCircuits[circuitcode].child; + return m_agentCircuits[circuitcode].child; } return false; } diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 4b38a2e2f7..8d98cc9b93 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -1039,7 +1039,7 @@ namespace OpenSim { //this.HttpServer. acd.AppendFormat("{0}:\n", scene.RegionInfo.RegionName); - foreach (AgentCircuitData aCircuit in scene.AuthenticateHandler.AgentCircuits.Values) + foreach (AgentCircuitData aCircuit in scene.AuthenticateHandler.GetAgentCircuits().Values) acd.AppendFormat("\t{0} {1} ({2})\n", aCircuit.firstname, aCircuit.lastname, (aCircuit.child ? "Child" : "Root")); } ); diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs index f6a3d1f148..57d22bde68 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs @@ -103,15 +103,13 @@ namespace OpenSim.Region.Framework.Scenes.Tests ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(sp.UUID), Is.Not.Null); - Assert.That(scene.AuthenticateHandler.AgentCircuits.Count, Is.EqualTo(1)); - Assert.That(scene.AuthenticateHandler.AgentCircuitsByUUID.Count, Is.EqualTo(1)); + Assert.That(scene.AuthenticateHandler.GetAgentCircuits().Count, Is.EqualTo(1)); scene.IncomingCloseAgent(sp.UUID); Assert.That(scene.GetScenePresence(sp.UUID), Is.Null); Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(sp.UUID), Is.Null); - Assert.That(scene.AuthenticateHandler.AgentCircuits.Count, Is.EqualTo(0)); - Assert.That(scene.AuthenticateHandler.AgentCircuitsByUUID.Count, Is.EqualTo(0)); + Assert.That(scene.AuthenticateHandler.GetAgentCircuits().Count, Is.EqualTo(0)); } /// From ced820bd5e0fe9c20309fe1a3cb91f9ee316ec22 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 3 Dec 2011 16:19:11 +0000 Subject: [PATCH 05/13] Improve locking in AgentCircuitManager --- OpenSim/Framework/AgentCircuitManager.cs | 66 +++++++++++++++--------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/OpenSim/Framework/AgentCircuitManager.cs b/OpenSim/Framework/AgentCircuitManager.cs index a59bcfa1c4..b6e48b4372 100644 --- a/OpenSim/Framework/AgentCircuitManager.cs +++ b/OpenSim/Framework/AgentCircuitManager.cs @@ -38,6 +38,9 @@ namespace OpenSim.Framework /// /// Agent circuits indexed by circuit code. /// + /// + /// We lock this for operations both on this dictionary and on m_agentCircuitsByUUID + /// private Dictionary m_agentCircuits = new Dictionary(); /// @@ -48,16 +51,20 @@ namespace OpenSim.Framework public virtual AuthenticateResponse AuthenticateSession(UUID sessionID, UUID agentID, uint circuitcode) { AgentCircuitData validcircuit = null; - if (m_agentCircuits.ContainsKey(circuitcode)) + + lock (m_agentCircuits) { - validcircuit = m_agentCircuits[circuitcode]; + if (m_agentCircuits.ContainsKey(circuitcode)) + validcircuit = m_agentCircuits[circuitcode]; } + AuthenticateResponse user = new AuthenticateResponse(); + if (validcircuit == null) { //don't have this circuit code in our list user.Authorised = false; - return (user); + return user; } if ((sessionID == validcircuit.SessionID) && (agentID == validcircuit.AgentID)) @@ -79,7 +86,7 @@ namespace OpenSim.Framework user.Authorised = false; } - return (user); + return user; } /// @@ -129,17 +136,24 @@ namespace OpenSim.Framework } } } + public AgentCircuitData GetAgentCircuitData(uint circuitCode) { AgentCircuitData agentCircuit = null; - m_agentCircuits.TryGetValue(circuitCode, out agentCircuit); + + lock (m_agentCircuits) + m_agentCircuits.TryGetValue(circuitCode, out agentCircuit); + return agentCircuit; } public AgentCircuitData GetAgentCircuitData(UUID agentID) { AgentCircuitData agentCircuit = null; - m_agentCircuitsByUUID.TryGetValue(agentID, out agentCircuit); + + lock (m_agentCircuits) + m_agentCircuitsByUUID.TryGetValue(agentID, out agentCircuit); + return agentCircuit; } @@ -149,23 +163,26 @@ namespace OpenSim.Framework /// public Dictionary GetAgentCircuits() { - lock (m_agentCircuitsByUUID) + lock (m_agentCircuits) return new Dictionary(m_agentCircuitsByUUID); } public void UpdateAgentData(AgentCircuitData agentData) { - if (m_agentCircuits.ContainsKey((uint) agentData.circuitcode)) + lock (m_agentCircuits) { - m_agentCircuits[(uint) agentData.circuitcode].firstname = agentData.firstname; - m_agentCircuits[(uint) agentData.circuitcode].lastname = agentData.lastname; - m_agentCircuits[(uint) agentData.circuitcode].startpos = agentData.startpos; + if (m_agentCircuits.ContainsKey((uint) agentData.circuitcode)) + { + m_agentCircuits[(uint) agentData.circuitcode].firstname = agentData.firstname; + m_agentCircuits[(uint) agentData.circuitcode].lastname = agentData.lastname; + m_agentCircuits[(uint) agentData.circuitcode].startpos = agentData.startpos; - // Updated for when we don't know them before calling Scene.NewUserConnection - m_agentCircuits[(uint) agentData.circuitcode].SecureSessionID = agentData.SecureSessionID; - m_agentCircuits[(uint) agentData.circuitcode].SessionID = agentData.SessionID; + // Updated for when we don't know them before calling Scene.NewUserConnection + m_agentCircuits[(uint) agentData.circuitcode].SecureSessionID = agentData.SecureSessionID; + m_agentCircuits[(uint) agentData.circuitcode].SessionID = agentData.SessionID; - // m_log.Debug("update user start pos is " + agentData.startpos.X + " , " + agentData.startpos.Y + " , " + agentData.startpos.Z); + // m_log.Debug("update user start pos is " + agentData.startpos.X + " , " + agentData.startpos.Y + " , " + agentData.startpos.Z); + } } } @@ -189,25 +206,24 @@ namespace OpenSim.Framework return true; } } - return false; + return false; } public void UpdateAgentChildStatus(uint circuitcode, bool childstatus) { - if (m_agentCircuits.ContainsKey(circuitcode)) - { - m_agentCircuits[circuitcode].child = childstatus; - } + lock (m_agentCircuits) + if (m_agentCircuits.ContainsKey(circuitcode)) + m_agentCircuits[circuitcode].child = childstatus; } public bool GetAgentChildStatus(uint circuitcode) { - if (m_agentCircuits.ContainsKey(circuitcode)) - { - return m_agentCircuits[circuitcode].child; - } + lock (m_agentCircuits) + if (m_agentCircuits.ContainsKey(circuitcode)) + return m_agentCircuits[circuitcode].child; + return false; } } -} +} \ No newline at end of file From 4919c6056022053f8632b030a06fd8f48ac02a8e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 3 Dec 2011 18:59:54 +0000 Subject: [PATCH 06/13] Add beginning of ScenePresenceAgentTests.TestCreateChildScenePresence() This required an option to be added to NullRegionData via ConnectionString for it to act as a non-static instance, so that regression tests (which only load this class once) don't get hopeless confused and complex to compensate. Normal standalone operation unaffected. --- OpenSim/Data/Null/NullRegionData.cs | 40 +++++++++--- .../Tests/AgentCircuitManagerTests.cs | 2 - OpenSim/Framework/Tests/AnimationTests.cs | 2 - .../EntityTransfer/EntityTransferModule.cs | 1 - .../Grid/Tests/GridConnectorsTests.cs | 9 +-- .../Scenes/Tests/ScenePresenceAgentTests.cs | 63 ++++++++++++++----- OpenSim/Tests/Common/Helpers/SceneHelpers.cs | 3 + prebuild.xml | 1 + 8 files changed, 89 insertions(+), 32 deletions(-) diff --git a/OpenSim/Data/Null/NullRegionData.cs b/OpenSim/Data/Null/NullRegionData.cs index 9d09af7636..deb50cb4df 100644 --- a/OpenSim/Data/Null/NullRegionData.cs +++ b/OpenSim/Data/Null/NullRegionData.cs @@ -40,24 +40,40 @@ namespace OpenSim.Data.Null { private static NullRegionData Instance = null; + /// + /// Should we use the static instance for all invocations? + /// + private bool m_useStaticInstance = true; + // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); Dictionary m_regionData = new Dictionary(); public NullRegionData(string connectionString, string realm) { - if (Instance == null) +// m_log.DebugFormat( +// "[NULL REGION DATA]: Constructor got connectionString {0}, realm {1}", connectionString, realm); + + // The !static connection string is a hack so that regression tests can use this module without a high degree of fragility + // in having to deal with the static reference in the once-loaded NullRegionData class. + // + // In standalone operation, we have to use only one instance of this class since the login service and + // simulator have no other way of using a common data store. + if (connectionString == "!static") + m_useStaticInstance = false; + else if (Instance == null) Instance = this; - //Console.WriteLine("[XXX] NullRegionData constructor"); } private delegate bool Matcher(string value); public List Get(string regionName, UUID scopeID) { - if (Instance != this) + if (m_useStaticInstance && Instance != this) return Instance.Get(regionName, scopeID); +// m_log.DebugFormat("[NULL REGION DATA]: Getting region {0}, scope {1}", regionName, scopeID); + string cleanName = regionName.ToLower(); // Handle SQL wildcards @@ -82,6 +98,7 @@ namespace OpenSim.Data.Null cleanName = cleanName.Remove(cleanName.Length - 1); } } + Matcher queryMatch; if (wildcardPrefix && wildcardSuffix) queryMatch = delegate(string s) { return s.Contains(cleanName); }; @@ -110,7 +127,7 @@ namespace OpenSim.Data.Null public RegionData Get(int posX, int posY, UUID scopeID) { - if (Instance != this) + if (m_useStaticInstance && Instance != this) return Instance.Get(posX, posY, scopeID); List ret = new List(); @@ -129,7 +146,7 @@ namespace OpenSim.Data.Null public RegionData Get(UUID regionID, UUID scopeID) { - if (Instance != this) + if (m_useStaticInstance && Instance != this) return Instance.Get(regionID, scopeID); if (m_regionData.ContainsKey(regionID)) @@ -140,7 +157,7 @@ namespace OpenSim.Data.Null public List Get(int startX, int startY, int endX, int endY, UUID scopeID) { - if (Instance != this) + if (m_useStaticInstance && Instance != this) return Instance.Get(startX, startY, endX, endY, scopeID); List ret = new List(); @@ -156,9 +173,12 @@ namespace OpenSim.Data.Null public bool Store(RegionData data) { - if (Instance != this) + if (m_useStaticInstance && Instance != this) return Instance.Store(data); +// m_log.DebugFormat( +// "[NULL REGION DATA]: Storing region {0} {1}, scope {2}", data.RegionName, data.RegionID, data.ScopeID); + m_regionData[data.RegionID] = data; return true; @@ -166,7 +186,7 @@ namespace OpenSim.Data.Null public bool SetDataItem(UUID regionID, string item, string value) { - if (Instance != this) + if (m_useStaticInstance && Instance != this) return Instance.SetDataItem(regionID, item, value); if (!m_regionData.ContainsKey(regionID)) @@ -179,9 +199,11 @@ namespace OpenSim.Data.Null public bool Delete(UUID regionID) { - if (Instance != this) + if (m_useStaticInstance && Instance != this) return Instance.Delete(regionID); +// m_log.DebugFormat("[NULL REGION DATA]: Deleting region {0}", regionID); + if (!m_regionData.ContainsKey(regionID)) return false; diff --git a/OpenSim/Framework/Tests/AgentCircuitManagerTests.cs b/OpenSim/Framework/Tests/AgentCircuitManagerTests.cs index 9615f1b6ca..ae132c8c8b 100644 --- a/OpenSim/Framework/Tests/AgentCircuitManagerTests.cs +++ b/OpenSim/Framework/Tests/AgentCircuitManagerTests.cs @@ -194,8 +194,6 @@ namespace OpenSim.Framework.Tests resp = agentCircuitManager.AuthenticateSession(SessionId2, AgentId2, circuitcode2); Assert.That(!resp.Authorised); - } - } } diff --git a/OpenSim/Framework/Tests/AnimationTests.cs b/OpenSim/Framework/Tests/AnimationTests.cs index aa4c6aa1a7..967a35562c 100644 --- a/OpenSim/Framework/Tests/AnimationTests.cs +++ b/OpenSim/Framework/Tests/AnimationTests.cs @@ -87,8 +87,6 @@ namespace OpenSim.Framework.Tests anim4.SequenceNum = anim2.SequenceNum; Assert.That(anim4.ObjectID == objUUID2 && anim4.AnimID == animUUID2 && anim4.SequenceNum == 1, "void constructor and manual field population failed to set the properties correctly."); - - } } } \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 99064c8a1f..2f947fd1ab 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -1341,7 +1341,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer string reason = String.Empty; - bool regionAccepted = m_scene.SimulationService.CreateAgent(reg, a, (uint)TeleportFlags.Default, out reason); if (regionAccepted && newAgent) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs index cd7d6bc71c..b286d172e4 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/Tests/GridConnectorsTests.cs @@ -31,11 +31,10 @@ using System.IO; using System.Reflection; using System.Threading; using log4net.Config; +using Nini.Config; using NUnit.Framework; using OpenMetaverse; using OpenSim.Framework; -using Nini.Config; - using OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid; using OpenSim.Region.Framework.Scenes; using GridRegion = OpenSim.Services.Interfaces.GridRegion; @@ -69,6 +68,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests [Test] public void TestRegisterRegion() { + TestHelpers.InMethod(); +// log4net.Config.XmlConfigurator.Configure(); + SetUp(); // Create 4 regions @@ -191,7 +193,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid.Tests results = m_LocalConnector.GetHyperlinks(UUID.Zero); Assert.IsNotNull(results, "Retrieved GetHyperlinks list is null"); Assert.That(results.Count, Is.EqualTo(0), "Retrieved linked regions collection is not the number expected"); - } } -} +} \ No newline at end of file diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs index 57d22bde68..f479e12c63 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs @@ -31,7 +31,7 @@ using System.Reflection; using System.Text; using System.Threading; using System.Timers; -using Timer=System.Timers.Timer; +using Timer = System.Timers.Timer; using Nini.Config; using NUnit.Framework; using OpenMetaverse; @@ -39,11 +39,13 @@ using OpenSim.Framework; using OpenSim.Framework.Communications; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.ClientStack.Linden; using OpenSim.Region.CoreModules.Framework.EntityTransfer; using OpenSim.Region.CoreModules.World.Serialiser; using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation; using OpenSim.Tests.Common; using OpenSim.Tests.Common.Mock; +using GridRegion = OpenSim.Services.Interfaces.GridRegion; namespace OpenSim.Region.Framework.Scenes.Tests { @@ -112,14 +114,40 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(scene.AuthenticateHandler.GetAgentCircuits().Count, Is.EqualTo(0)); } + [Test] + public void TestCreateChildScenePresence() + { + TestHelpers.InMethod(); +// log4net.Config.XmlConfigurator.Configure(); + + LocalSimulationConnectorModule lsc = new LocalSimulationConnectorModule(); + + IConfigSource configSource = new IniConfigSource(); + IConfig config = configSource.AddConfig("Modules"); + config.Set("SimulationServices", "LocalSimulationConnectorModule"); + + TestScene scene = SceneHelpers.SetupScene(); + SceneHelpers.SetupSceneModules(scene, configSource, lsc); + + UUID agentId = TestHelpers.ParseTail(0x01); + AgentCircuitData acd = SceneHelpers.GenerateAgentData(agentId); + + GridRegion region = scene.GridService.GetRegionByName(UUID.Zero, scene.RegionInfo.RegionName); + string reason; + scene.SimulationService.CreateAgent(region, acd, (uint)TeleportFlags.ViaLogin, out reason); + + Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(agentId), Is.Not.Null); + Assert.That(scene.AuthenticateHandler.GetAgentCircuits().Count, Is.EqualTo(1)); + } + /// /// Test that if a root agent logs into a region, a child agent is also established in the neighbouring region /// /// - /// Please note that unlike the other tests here, this doesn't rely on structures + /// Please note that unlike the other tests here, this doesn't rely on anything set up in the instance fields. /// [Test] - public void TestChildAgentEstablished() + public void TestChildAgentEstablishedInNeighbour() { TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); @@ -127,18 +155,25 @@ namespace OpenSim.Region.Framework.Scenes.Tests UUID agent1Id = UUID.Parse("00000000-0000-0000-0000-000000000001"); TestScene myScene1 = SceneHelpers.SetupScene("Neighbour y", UUID.Random(), 1000, 1000); -// TestScene myScene2 = SceneHelpers.SetupScene("Neighbour y + 1", UUID.Random(), 1001, 1000); - - IConfigSource configSource = new IniConfigSource(); - configSource.AddConfig("Modules").Set("EntityTransferModule", "BasicEntityTransferModule"); - EntityTransferModule etm = new EntityTransferModule(); - - SceneHelpers.SetupSceneModules(myScene1, configSource, etm); - - SceneHelpers.AddScenePresence(myScene1, agent1Id); -// ScenePresence childPresence = myScene2.GetScenePresence(agent1); + TestScene myScene2 = SceneHelpers.SetupScene("Neighbour y + 1", UUID.Random(), 1001, 1000); - // TODO: Need to do a fair amount of work to allow synchronous establishment of child agents + IConfigSource configSource = new IniConfigSource(); + IConfig config = configSource.AddConfig("Startup"); + config.Set("serverside_object_permissions", true); + config.Set("EventQueue", true); + + EntityTransferModule etm = new EntityTransferModule(); + + EventQueueGetModule eqgm1 = new EventQueueGetModule(); + SceneHelpers.SetupSceneModules(myScene1, configSource, etm, eqgm1); + + EventQueueGetModule eqgm2 = new EventQueueGetModule(); + SceneHelpers.SetupSceneModules(myScene2, configSource, etm, eqgm2); + +// SceneHelpers.AddScenePresence(myScene1, agent1Id); +// ScenePresence childPresence = myScene2.GetScenePresence(agent1); +// +// // TODO: Need to do a fair amount of work to allow synchronous establishment of child agents // Assert.That(childPresence, Is.Not.Null); // Assert.That(childPresence.IsChildAgent, Is.True); } diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs index d358ae86f2..e4640be04b 100644 --- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs @@ -49,6 +49,7 @@ using OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts; using OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence; using OpenSim.Services.Interfaces; using OpenSim.Tests.Common.Mock; +using GridRegion = OpenSim.Services.Interfaces.GridRegion; namespace OpenSim.Tests.Common { @@ -139,6 +140,7 @@ namespace OpenSim.Tests.Common testScene.RegionInfo.EstateSettings = new EstateSettings(); testScene.LoginsDisabled = false; + testScene.RegisterRegionWithGrid(); return testScene; } @@ -222,6 +224,7 @@ namespace OpenSim.Tests.Common config.Configs["Modules"].Set("GridServices", "LocalGridServicesConnector"); config.Configs["GridService"].Set("StorageProvider", "OpenSim.Data.Null.dll:NullRegionData"); config.Configs["GridService"].Set("LocalServiceModule", "OpenSim.Services.GridService.dll:GridService"); + config.Configs["GridService"].Set("ConnectionString", "!static"); LocalGridServicesConnector gridService = new LocalGridServicesConnector(); gridService.Initialise(config); diff --git a/prebuild.xml b/prebuild.xml index a7e3bde5b8..4e3617214d 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -3016,6 +3016,7 @@ + From 3852f05e6e03425e06eec1faa19929146901c92e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 3 Dec 2011 19:10:32 +0000 Subject: [PATCH 07/13] Extend TestCreateChildScenePresence to make assertions both at CreateAgent stage and then at Scene.AddClient() --- .../Scenes/Tests/ScenePresenceAgentTests.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs index f479e12c63..df2dacb306 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs @@ -131,13 +131,29 @@ namespace OpenSim.Region.Framework.Scenes.Tests UUID agentId = TestHelpers.ParseTail(0x01); AgentCircuitData acd = SceneHelpers.GenerateAgentData(agentId); + acd.child = true; GridRegion region = scene.GridService.GetRegionByName(UUID.Zero, scene.RegionInfo.RegionName); string reason; + // XXX: ViaLogin may not be correct here. scene.SimulationService.CreateAgent(region, acd, (uint)TeleportFlags.ViaLogin, out reason); Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(agentId), Is.Not.Null); Assert.That(scene.AuthenticateHandler.GetAgentCircuits().Count, Is.EqualTo(1)); + + // There's no scene presence yet since only an agent circuit has been established. + Assert.That(scene.GetScenePresence(agentId), Is.Null); + + TestClient client = new TestClient(acd, scene); + scene.AddNewClient(client, PresenceType.User); + + Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(agentId), Is.Not.Null); + Assert.That(scene.AuthenticateHandler.GetAgentCircuits().Count, Is.EqualTo(1)); + + ScenePresence sp = scene.GetScenePresence(agentId); + Assert.That(sp, Is.Not.Null); + Assert.That(sp.UUID, Is.EqualTo(agentId)); + Assert.That(sp.IsChildAgent, Is.True); } /// From a4d82895be6617ab409735c107903c6aaef2c234 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 3 Dec 2011 19:14:37 +0000 Subject: [PATCH 08/13] Remove T012_TestAddNeighbourRegion() and T013_TestRemoveNeighbourRegion() since they don't do anything useful. --- .../Scenes/Tests/ScenePresenceAgentTests.cs | 75 ++----------------- 1 file changed, 5 insertions(+), 70 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs index df2dacb306..946481c7ea 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs @@ -135,6 +135,9 @@ namespace OpenSim.Region.Framework.Scenes.Tests GridRegion region = scene.GridService.GetRegionByName(UUID.Zero, scene.RegionInfo.RegionName); string reason; + + // *** This is the first stage, when a neighbouring region is told that a viewer is about to try and + // establish a child scene presence. We pass in the circuit code that the client has to connect with *** // XXX: ViaLogin may not be correct here. scene.SimulationService.CreateAgent(region, acd, (uint)TeleportFlags.ViaLogin, out reason); @@ -144,6 +147,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests // There's no scene presence yet since only an agent circuit has been established. Assert.That(scene.GetScenePresence(agentId), Is.Null); + // *** This is the second stage, where the client established a child agent/scene presence using the + // circuit code given to the scene in stage 1 *** TestClient client = new TestClient(acd, scene); scene.AddNewClient(client, PresenceType.User); @@ -247,48 +252,6 @@ namespace OpenSim.Region.Framework.Scenes.Tests // Assert.That(presence, Is.Null, "presence is not null"); // } - [Test] - public void T012_TestAddNeighbourRegion() - { - TestHelpers.InMethod(); - - string reason; - - if (acd1 == null) - fixNullPresence(); - - scene.NewUserConnection(acd1, 0, out reason); - if (testclient == null) - testclient = new TestClient(acd1, scene); - scene.AddNewClient(testclient, PresenceType.User); - - ScenePresence presence = scene.GetScenePresence(agent1); - presence.MakeRootAgent(new Vector3(90,90,90),false); - - string cap = presence.ControllingClient.RequestClientInfo().CapsPath; - - presence.AddNeighbourRegion(region2, cap); - presence.AddNeighbourRegion(region3, cap); - - Assert.That(presence.KnownRegionCount, Is.EqualTo(2)); - } - - [Test] - public void T013_TestRemoveNeighbourRegion() - { - TestHelpers.InMethod(); - - ScenePresence presence = scene.GetScenePresence(agent1); - presence.RemoveNeighbourRegion(region3); - - Assert.That(presence.KnownRegionCount,Is.EqualTo(1)); - /* - presence.MakeChildAgent; - presence.MakeRootAgent; - CompleteAvatarMovement - */ - } - // I'm commenting this test because it does not represent // crossings. The Thread.Sleep's in here are not meaningful mocks, // and they sometimes fail in panda. @@ -391,33 +354,5 @@ namespace OpenSim.Region.Framework.Scenes.Tests Assert.That(presence2.IsChildAgent, Is.True, "Did not return from region as expected."); Assert.That(presence.IsChildAgent, Is.False, "Presence was not made root in old region again."); } - - public void fixNullPresence() - { - string firstName = "testfirstname"; - - AgentCircuitData agent = new AgentCircuitData(); - agent.AgentID = agent1; - agent.firstname = firstName; - agent.lastname = "testlastname"; - agent.SessionID = UUID.Zero; - agent.SecureSessionID = UUID.Zero; - agent.circuitcode = 123; - agent.BaseFolder = UUID.Zero; - agent.InventoryFolder = UUID.Zero; - agent.startpos = Vector3.Zero; - agent.CapsPath = GetRandomCapsObjectPath(); - agent.Appearance = new AvatarAppearance(); - - acd1 = agent; - } - - public static string GetRandomCapsObjectPath() - { - UUID caps = UUID.Random(); - string capsPath = caps.ToString(); - capsPath = capsPath.Remove(capsPath.Length - 4, 4); - return capsPath; - } } } \ No newline at end of file From a82aea53f863566037fa4fe3d546f57a49a126fa Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 3 Dec 2011 19:32:59 +0000 Subject: [PATCH 09/13] Split up test SceneHelpers to provide an AddChildScenePresence() call --- .../Scenes/Tests/ScenePresenceAgentTests.cs | 1 + OpenSim/Tests/Common/Helpers/SceneHelpers.cs | 35 +++++++++++++------ 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs index 946481c7ea..d4c299f996 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs @@ -166,6 +166,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests /// /// /// Please note that unlike the other tests here, this doesn't rely on anything set up in the instance fields. + /// INCOMPLETE /// [Test] public void TestChildAgentEstablishedInNeighbour() diff --git a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs index e4640be04b..a25eb66751 100644 --- a/OpenSim/Tests/Common/Helpers/SceneHelpers.cs +++ b/OpenSim/Tests/Common/Helpers/SceneHelpers.cs @@ -396,27 +396,42 @@ namespace OpenSim.Tests.Common /// public static ScenePresence AddScenePresence(Scene scene, AgentCircuitData agentData) { - string reason; - // We emulate the proper login sequence here by doing things in four stages - // Stage 0: log the presence + // Stage 0: login scene.PresenceService.LoginAgent(agentData.AgentID.ToString(), agentData.SessionID, agentData.SecureSessionID); - // Stage 1: simulate login by telling the scene to expect a new user connection - if (!scene.NewUserConnection(agentData, (uint)TeleportFlags.ViaLogin, out reason)) + // Stages 1 & 2 + ScenePresence sp = IntroduceClientToScene(scene, agentData, TeleportFlags.ViaLogin); + + // Stage 3: Complete the entrance into the region. This converts the child agent into a root agent. + sp.CompleteMovement(sp.ControllingClient, true); + + return sp; + } + + private static ScenePresence IntroduceClientToScene(Scene scene, AgentCircuitData agentData, TeleportFlags tf) + { + string reason; + + // Stage 1: tell the scene to expect a new user connection + if (!scene.NewUserConnection(agentData, (uint)tf, out reason)) Console.WriteLine("NewUserConnection failed: " + reason); // Stage 2: add the new client as a child agent to the scene TestClient client = new TestClient(agentData, scene); scene.AddNewClient(client, PresenceType.User); - // Stage 3: Complete the entrance into the region. This converts the child agent into a root agent. - ScenePresence scp = scene.GetScenePresence(agentData.AgentID); - scp.CompleteMovement(client, true); - //scp.MakeRootAgent(new Vector3(90, 90, 90), true); + return scene.GetScenePresence(agentData.AgentID); + } - return scp; + public static ScenePresence AddChildScenePresence(Scene scene, UUID agentId) + { + AgentCircuitData acd = GenerateAgentData(agentId); + acd.child = true; + + // XXX: ViaLogin may not be correct for child agents + return IntroduceClientToScene(scene, acd, TeleportFlags.ViaLogin); } /// From 080dfcc9c96c387599cf6734756a83e33a210553 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 4 Dec 2011 08:24:16 -0800 Subject: [PATCH 10/13] HG: Renamed one method --- OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs | 2 +- .../Services/Connectors/Hypergrid/UserAgentServiceConnector.cs | 2 +- OpenSim/Services/HypergridService/GatekeeperService.cs | 2 +- OpenSim/Services/HypergridService/UserAgentService.cs | 2 +- OpenSim/Services/Interfaces/IHypergridServices.cs | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs index 72a4aeaa62..50010f2dfb 100644 --- a/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs +++ b/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs @@ -143,7 +143,7 @@ namespace OpenSim.Server.Handlers.Hypergrid UUID.TryParse(sessionID_str, out sessionID); string gridName = (string)requestData["externalName"]; - bool success = m_HomeUsersService.AgentIsComingHome(sessionID, gridName); + bool success = m_HomeUsersService.IsAgentComingHome(sessionID, gridName); Hashtable hash = new Hashtable(); hash["result"] = success.ToString(); diff --git a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs index 63aabad04f..7a4ec57997 100644 --- a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs @@ -358,7 +358,7 @@ namespace OpenSim.Services.Connectors.Hypergrid return null; } - public bool AgentIsComingHome(UUID sessionID, string thisGridExternalName) + public bool IsAgentComingHome(UUID sessionID, string thisGridExternalName) { Hashtable hash = new Hashtable(); hash["sessionID"] = sessionID.ToString(); diff --git a/OpenSim/Services/HypergridService/GatekeeperService.cs b/OpenSim/Services/HypergridService/GatekeeperService.cs index e26383f0ff..5d99c79ac8 100644 --- a/OpenSim/Services/HypergridService/GatekeeperService.cs +++ b/OpenSim/Services/HypergridService/GatekeeperService.cs @@ -243,7 +243,7 @@ namespace OpenSim.Services.HypergridService // Make sure this is the user coming home, and not a foreign user with same UUID as a local user if (m_UserAgentService != null) { - if (!m_UserAgentService.AgentIsComingHome(aCircuit.SessionID, m_ExternalName)) + if (!m_UserAgentService.IsAgentComingHome(aCircuit.SessionID, m_ExternalName)) { // Can't do, sorry reason = "Unauthorized"; diff --git a/OpenSim/Services/HypergridService/UserAgentService.cs b/OpenSim/Services/HypergridService/UserAgentService.cs index 1559cf3205..cdc560c4f5 100644 --- a/OpenSim/Services/HypergridService/UserAgentService.cs +++ b/OpenSim/Services/HypergridService/UserAgentService.cs @@ -281,7 +281,7 @@ namespace OpenSim.Services.HypergridService } // We need to prevent foreign users with the same UUID as a local user - public bool AgentIsComingHome(UUID sessionID, string thisGridExternalName) + public bool IsAgentComingHome(UUID sessionID, string thisGridExternalName) { if (!m_TravelingAgents.ContainsKey(sessionID)) return false; diff --git a/OpenSim/Services/Interfaces/IHypergridServices.cs b/OpenSim/Services/Interfaces/IHypergridServices.cs index 220caef007..e86ec519e5 100644 --- a/OpenSim/Services/Interfaces/IHypergridServices.cs +++ b/OpenSim/Services/Interfaces/IHypergridServices.cs @@ -65,7 +65,7 @@ namespace OpenSim.Services.Interfaces List StatusNotification(List friends, UUID userID, bool online); //List GetOnlineFriends(UUID userID, List friends); - bool AgentIsComingHome(UUID sessionID, string thisGridExternalName); + bool IsAgentComingHome(UUID sessionID, string thisGridExternalName); bool VerifyAgent(UUID sessionID, string token); bool VerifyClient(UUID sessionID, string reportedIP); } From a2d98c72930594da2cd8056adf1e2be942051843 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 4 Dec 2011 10:10:09 -0800 Subject: [PATCH 11/13] HG: Added HEAD method to Helo service. This is the preferred method, but its wide use will have to wait a few releases. So the sims are still calling GET for now. --- .../Handlers/Hypergrid/HeloServerConnector.cs | 34 ++++++++++++++++++- .../Hypergrid/HeloServiceConnector.cs | 2 ++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs index 39baa324cb..4accea1ecd 100644 --- a/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs +++ b/OpenSim/Server/Handlers/Hypergrid/HeloServerConnector.cs @@ -45,9 +45,11 @@ namespace OpenSim.Server.Handlers.Hypergrid base(config, server, configName) { server.AddStreamHandler(new HeloServerGetHandler("opensim-robust")); + server.AddStreamHandler(new HeloServerHeadHandler("opensim-robust")); } } + [Obsolete] public class HeloServerGetHandler : BaseStreamHandler { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -68,7 +70,7 @@ namespace OpenSim.Server.Handlers.Hypergrid private byte[] OKResponse(OSHttpResponse httpResponse) { - m_log.Debug("[HELO]: hi, I was called"); + m_log.Debug("[HELO]: hi, GET was called"); httpResponse.AddHeader("X-Handlers-Provided", m_HandlersType); httpResponse.StatusCode = (int)HttpStatusCode.OK; httpResponse.StatusDescription = "OK"; @@ -76,4 +78,34 @@ namespace OpenSim.Server.Handlers.Hypergrid } } + + public class HeloServerHeadHandler : BaseStreamHandler + { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private string m_HandlersType; + + public HeloServerHeadHandler(string handlersType) : + base("HEAD", "/helo") + { + m_HandlersType = handlersType; + } + + public override byte[] Handle(string path, Stream requestData, + OSHttpRequest httpRequest, OSHttpResponse httpResponse) + { + return OKResponse(httpResponse); + } + + private byte[] OKResponse(OSHttpResponse httpResponse) + { + m_log.Debug("[HELO]: hi, HEAD was called"); + httpResponse.AddHeader("X-Handlers-Provided", m_HandlersType); + httpResponse.StatusCode = (int)HttpStatusCode.OK; + httpResponse.StatusDescription = "OK"; + return new byte[0]; + } + + } + } diff --git a/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs index 7b166c14e3..7cfd6e8df3 100644 --- a/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs @@ -54,6 +54,8 @@ namespace OpenSim.Services.Connectors public virtual string Helo() { HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(m_ServerURI + "/helo"); + // Eventually we need to switch to HEAD + /* req.Method = "HEAD"; */ try { From 37889eb3fa8e172fb8c1b73a5c5443fc7bf4e5a3 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 5 Dec 2011 18:35:03 +0000 Subject: [PATCH 12/13] For the GetTexture capability, if a data range is requested that covers the whole asset length, return HTTP PartialContent instead of NotFound NotFound is obviously wrong, and this change stops viewer 3.2.2 (and v probably earlier) complaining in the log about missing textures that are actually present. We still return PartialContent even if the range requested is a superset of the data range as per httpd's behaviour https://issues.apache.org/bugzilla/show_bug.cgi?id=51878 Viewer 3.2.2 and very probably earlier appear happy with this. Whether fixing this NotFound bug has any practical effect apart from resolve viewer log messages is unknown. --- .../Handlers/GetTexture/GetTextureHandler.cs | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs index 245d9312d2..7ab30ceb27 100644 --- a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs +++ b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs @@ -111,6 +111,10 @@ namespace OpenSim.Capabilities.Handlers m_log.Warn("[GETTEXTURE]: Failed to parse a texture_id from GetTexture request: " + httpRequest.Url); } +// m_log.DebugFormat( +// "[GETTEXTURE]: For texture {0} sending back response {1}, data length {2}", +// textureID, httpResponse.StatusCode, httpResponse.ContentLength); + httpResponse.Send(); return null; } @@ -210,7 +214,7 @@ namespace OpenSim.Capabilities.Handlers private void WriteTextureData(OSHttpRequest request, OSHttpResponse response, AssetBase texture, string format) { string range = request.Headers.GetOne("Range"); - //m_log.DebugFormat("[GETTEXTURE]: Range {0}", range); + if (!String.IsNullOrEmpty(range)) // JP2's only { // Range request @@ -222,23 +226,27 @@ namespace OpenSim.Capabilities.Handlers if (start >= texture.Data.Length) { response.StatusCode = (int)System.Net.HttpStatusCode.RequestedRangeNotSatisfiable; - return; } + else + { + end = Utils.Clamp(end, 0, texture.Data.Length - 1); + start = Utils.Clamp(start, 0, end); + int len = end - start + 1; - end = Utils.Clamp(end, 0, texture.Data.Length - 1); - start = Utils.Clamp(start, 0, end); - int len = end - start + 1; + //m_log.Debug("Serving " + start + " to " + end + " of " + texture.Data.Length + " bytes for texture " + texture.ID); - //m_log.Debug("Serving " + start + " to " + end + " of " + texture.Data.Length + " bytes for texture " + texture.ID); - - if (len < texture.Data.Length) + // Always return PartialContent, even if the range covered the entire data length + // We were accidentally sending back 404 before in this situation + // https://issues.apache.org/bugzilla/show_bug.cgi?id=51878 supports sending 206 even if the + // entire range is requested, and viewer 3.2.2 (and very probably earlier) seems fine with this. response.StatusCode = (int)System.Net.HttpStatusCode.PartialContent; - response.ContentLength = len; - response.ContentType = texture.Metadata.ContentType; - response.AddHeader("Content-Range", String.Format("bytes {0}-{1}/{2}", start, end, texture.Data.Length)); - - response.Body.Write(texture.Data, start, len); + response.ContentLength = len; + response.ContentType = texture.Metadata.ContentType; + response.AddHeader("Content-Range", String.Format("bytes {0}-{1}/{2}", start, end, texture.Data.Length)); + + response.Body.Write(texture.Data, start, len); + } } else { @@ -257,6 +265,10 @@ namespace OpenSim.Capabilities.Handlers response.ContentType = "image/" + format; response.Body.Write(texture.Data, 0, texture.Data.Length); } + +// m_log.DebugFormat( +// "[GETTEXTURE]: For texture {0} requested range {1} responded {2} with content length {3} (actual {4})", +// texture.FullID, range, response.StatusCode, response.ContentLength, texture.Data.Length); } private bool TryParseRange(string header, out int start, out int end) @@ -275,7 +287,6 @@ namespace OpenSim.Capabilities.Handlers return false; } - private byte[] ConvertTextureData(AssetBase texture, string format) { m_log.DebugFormat("[GETTEXTURE]: Converting texture {0} to {1}", texture.ID, format); From 66f4ce354f57646de32b376cba79dfc6ded17c14 Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 5 Dec 2011 19:01:14 +0000 Subject: [PATCH 13/13] Fix CHANGED_TEXTURE and CHANGED_COLOR. --- .../DynamicTexture/DynamicTextureModule.cs | 4 +- .../Framework/Scenes/SceneObjectPart.cs | 82 ++++++++++--------- .../Scripting/Minimodule/SOPObjectMaterial.cs | 10 +-- .../Shared/Api/Implementation/LSL_Api.cs | 36 ++++---- 4 files changed, 67 insertions(+), 65 deletions(-) diff --git a/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs b/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs index f2c8b3dd54..18bd0186b8 100644 --- a/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs @@ -355,7 +355,7 @@ namespace OpenSim.Region.CoreModules.Scripting.DynamicTexture // I'm pretty sure noone whats to set fullbright true if it wasn't true before. // tmptex.DefaultTexture.Fullbright = true; - part.UpdateTexture(tmptex); + part.UpdateTextureEntry(tmptex.GetBytes()); } if (oldID != UUID.Zero && ((Disp & DISP_EXPIRE) != 0)) @@ -437,4 +437,4 @@ namespace OpenSim.Region.CoreModules.Scripting.DynamicTexture #endregion } -} \ No newline at end of file +} diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index dcbcfa312b..c8b39a4085 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -3178,7 +3178,10 @@ namespace OpenSim.Region.Framework.Scenes /// public void SetFaceColor(Vector3 color, int face) { - Primitive.TextureEntry tex = Shape.Textures; + // The only way to get a deep copy/ If we don't do this, we can + // mever detect color changes further down. + Byte[] buf = Shape.Textures.GetBytes(); + Primitive.TextureEntry tex = new Primitive.TextureEntry(buf, 0, buf.Length); Color4 texcolor; if (face >= 0 && face < GetNumberOfSides()) { @@ -3187,8 +3190,7 @@ namespace OpenSim.Region.Framework.Scenes texcolor.G = Util.Clip((float)color.Y, 0.0f, 1.0f); texcolor.B = Util.Clip((float)color.Z, 0.0f, 1.0f); tex.FaceTextures[face].RGBA = texcolor; - UpdateTexture(tex); - TriggerScriptChangedEvent(Changed.COLOR); + UpdateTextureEntry(tex.GetBytes()); return; } else if (face == ALL_SIDES) @@ -3209,8 +3211,7 @@ namespace OpenSim.Region.Framework.Scenes texcolor.B = Util.Clip((float)color.Z, 0.0f, 1.0f); tex.DefaultTexture.RGBA = texcolor; } - UpdateTexture(tex); - TriggerScriptChangedEvent(Changed.COLOR); + UpdateTextureEntry(tex.GetBytes()); return; } } @@ -4537,49 +4538,50 @@ namespace OpenSim.Region.Framework.Scenes } } - /// - /// Update the textures on the part. - /// - /// - /// Added to handle bug in libsecondlife's TextureEntry.ToBytes() - /// not handling RGBA properly. Cycles through, and "fixes" the color - /// info - /// - /// - public void UpdateTexture(Primitive.TextureEntry tex) - { - //Color4 tmpcolor; - //for (uint i = 0; i < 32; i++) - //{ - // if (tex.FaceTextures[i] != null) - // { - // tmpcolor = tex.GetFace((uint) i).RGBA; - // tmpcolor.A = tmpcolor.A*255; - // tmpcolor.R = tmpcolor.R*255; - // tmpcolor.G = tmpcolor.G*255; - // tmpcolor.B = tmpcolor.B*255; - // tex.FaceTextures[i].RGBA = tmpcolor; - // } - //} - //tmpcolor = tex.DefaultTexture.RGBA; - //tmpcolor.A = tmpcolor.A*255; - //tmpcolor.R = tmpcolor.R*255; - //tmpcolor.G = tmpcolor.G*255; - //tmpcolor.B = tmpcolor.B*255; - //tex.DefaultTexture.RGBA = tmpcolor; - UpdateTextureEntry(tex.GetBytes()); - } - /// /// Update the texture entry for this part. /// /// public void UpdateTextureEntry(byte[] textureEntry) { - m_shape.TextureEntry = textureEntry; - TriggerScriptChangedEvent(Changed.TEXTURE); + Primitive.TextureEntry newTex = new Primitive.TextureEntry(textureEntry, 0, textureEntry.Length); + Primitive.TextureEntry oldTex = Shape.Textures; + Changed changeFlags = 0; + + for (int i = 0 ; i < GetNumberOfSides(); i++) + { + Primitive.TextureEntryFace newFace = newTex.DefaultTexture; + Primitive.TextureEntryFace oldFace = oldTex.DefaultTexture; + + if (oldTex.FaceTextures[i] != null) + oldFace = oldTex.FaceTextures[i]; + if (newTex.FaceTextures[i] != null) + newFace = newTex.FaceTextures[i]; + + Color4 oldRGBA = oldFace.RGBA; + Color4 newRGBA = newFace.RGBA; + + if (oldRGBA.R != newRGBA.R || + oldRGBA.G != newRGBA.G || + oldRGBA.B != newRGBA.B || + oldRGBA.A != newRGBA.A) + changeFlags |= Changed.COLOR; + + if (oldFace.TextureID != newFace.TextureID) + changeFlags |= Changed.TEXTURE; + + // Max change, skip the rest of testing + if (changeFlags == (Changed.TEXTURE | Changed.COLOR)) + break; + } + + m_shape.TextureEntry = textureEntry; + if (changeFlags != 0) + TriggerScriptChangedEvent(changeFlags); + UpdateFlag = UpdateRequired.FULL; ParentGroup.HasGroupChanged = true; + //This is madness.. //ParentGroup.ScheduleGroupForFullUpdate(); //This is sparta diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObjectMaterial.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObjectMaterial.cs index 0cba6afb6c..cea738cddb 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObjectMaterial.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObjectMaterial.cs @@ -55,7 +55,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face); texface.RGBA = new Color4(value.R,value.G,value.B,value.A); tex.FaceTextures[m_face] = texface; - m_parent.UpdateTexture(tex); + m_parent.UpdateTextureEntry(tex.GetBytes()); } } @@ -72,7 +72,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face); texface.TextureID = value; tex.FaceTextures[m_face] = texface; - m_parent.UpdateTexture(tex); + m_parent.UpdateTextureEntry(tex.GetBytes()); } } @@ -97,7 +97,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face); texface.Fullbright = value; tex.FaceTextures[m_face] = texface; - m_parent.UpdateTexture(tex); + m_parent.UpdateTextureEntry(tex.GetBytes()); } } @@ -110,7 +110,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face); texface.Glow = (float) value; tex.FaceTextures[m_face] = texface; - m_parent.UpdateTexture(tex); + m_parent.UpdateTextureEntry(tex.GetBytes()); } } @@ -123,7 +123,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face); texface.Shiny = value ? Shininess.High : Shininess.None; tex.FaceTextures[m_face] = texface; - m_parent.UpdateTexture(tex); + m_parent.UpdateTextureEntry(tex.GetBytes()); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 6c418df6ad..6d067b02cd 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -1424,7 +1424,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { tex.CreateFace((uint) face); tex.FaceTextures[face].TexMapType = textype; - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } else if (face == ScriptBaseClass.ALL_SIDES) @@ -1437,7 +1437,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } tex.DefaultTexture.TexMapType = textype; } - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } } @@ -1449,7 +1449,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { tex.CreateFace((uint) face); tex.FaceTextures[face].Glow = glow; - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } else if (face == ScriptBaseClass.ALL_SIDES) @@ -1462,7 +1462,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } tex.DefaultTexture.Glow = glow; } - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } } @@ -1497,7 +1497,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api tex.CreateFace((uint) face); tex.FaceTextures[face].Shiny = sval; tex.FaceTextures[face].Bump = bump; - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } else if (face == ScriptBaseClass.ALL_SIDES) @@ -1512,7 +1512,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api tex.DefaultTexture.Shiny = sval; tex.DefaultTexture.Bump = bump; } - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } } @@ -1524,7 +1524,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { tex.CreateFace((uint) face); tex.FaceTextures[face].Fullbright = bright; - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } else if (face == ScriptBaseClass.ALL_SIDES) @@ -1537,7 +1537,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } tex.DefaultTexture.Fullbright = bright; - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } } @@ -1593,7 +1593,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api texcolor = tex.CreateFace((uint)face).RGBA; texcolor.A = Util.Clip((float)alpha, 0.0f, 1.0f); tex.FaceTextures[face].RGBA = texcolor; - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } else if (face == ScriptBaseClass.ALL_SIDES) @@ -1617,7 +1617,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api tex.DefaultTexture.RGBA = texcolor; } - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } } @@ -1774,7 +1774,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api Primitive.TextureEntryFace texface = tex.CreateFace((uint)face); texface.TextureID = textureID; tex.FaceTextures[face] = texface; - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } else if (face == ScriptBaseClass.ALL_SIDES) @@ -1787,7 +1787,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } tex.DefaultTexture.TextureID = textureID; - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } } @@ -1809,7 +1809,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api texface.RepeatU = (float)u; texface.RepeatV = (float)v; tex.FaceTextures[face] = texface; - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } if (face == ScriptBaseClass.ALL_SIDES) @@ -1824,7 +1824,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } tex.DefaultTexture.RepeatU = (float)u; tex.DefaultTexture.RepeatV = (float)v; - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } } @@ -1845,7 +1845,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api texface.OffsetU = (float)u; texface.OffsetV = (float)v; tex.FaceTextures[face] = texface; - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } if (face == ScriptBaseClass.ALL_SIDES) @@ -1860,7 +1860,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } tex.DefaultTexture.OffsetU = (float)u; tex.DefaultTexture.OffsetV = (float)v; - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } } @@ -1880,7 +1880,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api Primitive.TextureEntryFace texface = tex.CreateFace((uint)face); texface.Rotation = (float)rotation; tex.FaceTextures[face] = texface; - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } if (face == ScriptBaseClass.ALL_SIDES) @@ -1893,7 +1893,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } tex.DefaultTexture.Rotation = (float)rotation; - part.UpdateTexture(tex); + part.UpdateTextureEntry(tex.GetBytes()); return; } }