From b7134c834c9e44802debc10671acbece1e94aa95 Mon Sep 17 00:00:00 2001 From: MW Date: Tue, 21 Aug 2007 16:25:57 +0000 Subject: Shift and Drag copying should now work correctly. [This was one of those stupid little one line bugs that was so much fun to track down that I decided to spend a few hours on it) Linking groups should now work better than it did, but still a bit of work to do on getting the rotations of all the parts after linking right. Added part of dalien's #301 patch (xml loading/saving related parts with some small changes) --- OpenSim/Region/Application/OpenSimMain.cs | 2 + .../ClientStack/ClientView.PacketHandlers.cs | 2 +- .../Environment/Scenes/Scene.PacketHandlers.cs | 12 +++--- OpenSim/Region/Environment/Scenes/Scene.cs | 2 + .../Region/Environment/Scenes/SceneObjectGroup.cs | 50 +++++++++++++++++++--- .../Region/Environment/Scenes/SceneObjectPart.cs | 10 ++--- 6 files changed, 60 insertions(+), 18 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Application/OpenSimMain.cs b/OpenSim/Region/Application/OpenSimMain.cs index 2e37029..b301bf2 100644 --- a/OpenSim/Region/Application/OpenSimMain.cs +++ b/OpenSim/Region/Application/OpenSimMain.cs @@ -333,6 +333,8 @@ namespace OpenSim m_log.Error(" alert [First] [Last] [Message] - send an alert to a user. Case sensitive."); m_log.Error(" alert general [Message] - send an alert to all users."); m_log.Error("backup - trigger a simulator backup"); + m_log.Error("load-xml [filename] - load prims from XML"); + m_log.Error("save-xml [filename] - save prims to XML"); m_log.Error("script - manually trigger scripts? or script commands?"); m_log.Error("show uptime - show simulator startup and uptime."); m_log.Error("show users - show info about connected users."); diff --git a/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs b/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs index 6b94ec1..09a4d0f 100644 --- a/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs +++ b/OpenSim/Region/ClientStack/ClientView.PacketHandlers.cs @@ -80,7 +80,7 @@ namespace OpenSim.Region.ClientStack protected bool MultipleObjUpdate(ClientView simClient, Packet packet) { MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)packet; - //System.Console.WriteLine("new multi update packet " + multipleupdate.ToString()); + // System.Console.WriteLine("new multi update packet " + multipleupdate.ToString()); for (int i = 0; i < multipleupdate.ObjectData.Length; i++) { #region position diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs index 1db9d29..0180e14 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs @@ -132,7 +132,7 @@ namespace OpenSim.Region.Environment.Scenes ScenePresence fromAvatar = this.Avatars[fromAgentID]; ScenePresence toAvatar = this.Avatars[toAgentID]; string fromName = fromAvatar.Firstname + " " + fromAvatar.Lastname; - toAvatar.ControllingClient.SendInstantMessage( fromAgentID, fromAgentSession, message, toAgentID, imSessionID, fromName, dialog, timestamp); + toAvatar.ControllingClient.SendInstantMessage(fromAgentID, fromAgentSession, message, toAgentID, imSessionID, fromName, dialog, timestamp); } else { @@ -508,15 +508,15 @@ namespace OpenSim.Region.Environment.Scenes public void UpdatePrimSinglePosition(uint localID, LLVector3 pos, IClientAPI remoteClient) { - Primitive prim = null; + bool hasPrim = false; foreach (EntityBase ent in Entities.Values) { if (ent is SceneObjectGroup) { - //prim = ((SceneObject)ent).HasChildPrim(localID); - if (prim != null) + hasPrim = ((SceneObjectGroup)ent).HasChildPrim(localID); + if (hasPrim != false) { - prim.UpdateSinglePosition(pos); + ((SceneObjectGroup)ent).UpdateSinglePosition(pos, localID); break; } } @@ -653,7 +653,7 @@ namespace OpenSim.Region.Environment.Scenes }*/ } - + public virtual void ProcessObjectGrab(uint localID, LLVector3 offsetPos, IClientAPI remoteClient) { this.EventManager.TriggerObjectGrab(localID, offsetPos, remoteClient); diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 537ab8c..02a035d 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -610,6 +610,8 @@ namespace OpenSim.Region.Environment.Scenes { SceneObjectGroup obj = new SceneObjectGroup(this, this.m_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(); AddEntity(obj); primCount++; } diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 33f41e9..cd38b23 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -251,11 +251,11 @@ namespace OpenSim.Region.Environment.Scenes public new SceneObjectGroup Copy() { SceneObjectGroup dupe = (SceneObjectGroup)this.MemberwiseClone(); + dupe.m_parts = new Dictionary(); dupe.m_parts.Clear(); dupe.AbsolutePosition = new LLVector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z); dupe.m_scene = m_scene; dupe.m_regionHandle = this.m_regionHandle; - dupe.CopyRootPart(this.m_rootPart); List partList = new List(this.m_parts.Values); @@ -291,6 +291,7 @@ namespace OpenSim.Region.Environment.Scenes public void CopyPart(SceneObjectPart part) { SceneObjectPart newPart = part.Copy(m_scene.PrimIDAllocate()); + newPart.SetParent(this); this.m_parts.Add(newPart.UUID, newPart); this.SetPartAsNonRoot(newPart); } @@ -431,6 +432,9 @@ namespace OpenSim.Region.Environment.Scenes public void LinkToGroup(SceneObjectGroup objectGroup) { SceneObjectPart linkPart = objectGroup.m_rootPart; + Axiom.Math.Vector3 oldGroupPosition = new Vector3(linkPart.GroupPosition.X, linkPart.GroupPosition.Y, linkPart.GroupPosition.Z); + Axiom.Math.Quaternion oldRootRotation = new Quaternion(linkPart.RotationOffset.W, linkPart.RotationOffset.X, linkPart.RotationOffset.Y, linkPart.RotationOffset.Z); + linkPart.OffsetPosition = linkPart.GroupPosition - this.AbsolutePosition; linkPart.GroupPosition = this.AbsolutePosition; @@ -450,20 +454,39 @@ namespace OpenSim.Region.Environment.Scenes { if (part.UUID != objectGroup.m_rootPart.UUID) { - this.LinkNonRootPart(part); + this.LinkNonRootPart(part, oldGroupPosition, oldRootRotation); } } m_scene.EventManager.OnBackup -= objectGroup.ProcessBackup; m_scene.DeleteEntity(objectGroup.UUID); + objectGroup.DeleteParts(); this.ScheduleGroupForFullUpdate(); } - private void LinkNonRootPart(SceneObjectPart part) + private void LinkNonRootPart(SceneObjectPart part, Vector3 oldGroupPosition, Quaternion oldGroupRotation) { part.SetParent(this); part.ParentID = this.m_rootPart.LocalID; this.m_parts.Add(part.UUID, part); + + Vector3 axiomOldPos = new Vector3(part.OffsetPosition.X, part.OffsetPosition.Y, part.OffsetPosition.Z); + axiomOldPos = oldGroupRotation * axiomOldPos; + axiomOldPos += oldGroupPosition; + LLVector3 oldAbsolutePosition = new LLVector3(axiomOldPos.x, axiomOldPos.y, axiomOldPos.z); + part.OffsetPosition = oldAbsolutePosition - this.AbsolutePosition; + + Quaternion axiomRootRotation = new Quaternion(m_rootPart.RotationOffset.W, m_rootPart.RotationOffset.X, m_rootPart.RotationOffset.Y, m_rootPart.RotationOffset.Z); + + Vector3 axiomPos = new Vector3(part.OffsetPosition.X, part.OffsetPosition.Y, part.OffsetPosition.Z); + axiomPos = axiomRootRotation.Inverse() * axiomPos; + part.OffsetPosition = new LLVector3(axiomPos.x, axiomPos.y, axiomPos.z); + + Quaternion axiomPartRotation = new Quaternion(part.RotationOffset.W, part.RotationOffset.X, part.RotationOffset.Y, part.RotationOffset.Z); + + axiomPartRotation = oldGroupRotation * axiomPartRotation; + axiomPartRotation = axiomRootRotation.Inverse() * axiomPartRotation; + part.RotationOffset = new LLQuaternion(axiomPartRotation.x, axiomPartRotation.y, axiomPartRotation.z, axiomPartRotation.w); } /// @@ -669,7 +692,7 @@ namespace OpenSim.Region.Environment.Scenes public void UpdateGroupPosition(LLVector3 pos) { this.AbsolutePosition = pos; - + this.ScheduleGroupForTerseUpdate(); } /// @@ -720,6 +743,7 @@ namespace OpenSim.Region.Environment.Scenes pos.X = newPos.X; pos.Y = newPos.Y; pos.Z = newPos.Z; + this.ScheduleGroupForTerseUpdate(); } #endregion @@ -859,7 +883,7 @@ namespace OpenSim.Region.Environment.Scenes /// internal void SendPartFullUpdate(IClientAPI remoteClient, SceneObjectPart part) { - if (m_rootPart == part) + if (m_rootPart.UUID == part.UUID) { part.SendFullUpdateToClient(remoteClient, AbsolutePosition); } @@ -876,7 +900,7 @@ namespace OpenSim.Region.Environment.Scenes /// internal void SendPartTerseUpdate(IClientAPI remoteClient, SceneObjectPart part) { - if (m_rootPart == part) + if (m_rootPart.UUID == part.UUID) { part.SendTerseUpdateToClient(remoteClient, AbsolutePosition); } @@ -932,6 +956,14 @@ namespace OpenSim.Region.Environment.Scenes } } + public void RegenerateFullIDs() + { + foreach (SceneObjectPart part in this.m_parts.Values) + { + part.UUID = LLUUID.Random(); + } + } + public LLUUID GetPartsFullID(uint localID) { SceneObjectPart part = this.GetChildPrim(localID); @@ -984,6 +1016,12 @@ namespace OpenSim.Region.Environment.Scenes } } + public void DeleteParts() + { + this.m_rootPart = null; + this.m_parts.Clear(); + } + public override void SetText(string text, Vector3 color, double alpha) { Text = text; diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index 8cf55ad..de3ad38 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs @@ -64,7 +64,7 @@ namespace OpenSim.Region.Environment.Scenes set { m_name = value; } } - protected LLObject.ObjectFlags m_flags = (LLObject.ObjectFlags)32 + 65536 + 131072 + 256 +4 +8 + 268435456 + 128; + protected LLObject.ObjectFlags m_flags = (LLObject.ObjectFlags)32 + 65536 + 131072 + 256 + 4 + 8 + 268435456 + 128; public uint ObjectFlags { get { return (uint)m_flags; } @@ -405,7 +405,7 @@ namespace OpenSim.Region.Environment.Scenes { if (localID == this.m_localID) { - //client.SendTaskInventory(this.m_uuid, 1, Helpers.StringToField("primInventory2")); + //client.SendTaskInventory(this.m_uuid, 1, Helpers.StringToField("primInventory2")); client.SendTaskInventory(this.m_uuid, 0, new byte[0]); } } @@ -421,7 +421,7 @@ namespace OpenSim.Region.Environment.Scenes InventoryStringBuilder invString = new InventoryStringBuilder(); invString.AddItemStart(); invString.AddNameValueLine("item_id", LLUUID.Random().ToStringHyphenated()); - invString.AddNameValueLine("parent_id",LLUUID.Zero.ToStringHyphenated()); + invString.AddNameValueLine("parent_id", LLUUID.Zero.ToStringHyphenated()); invString.AddPermissionsStart(); invString.AddNameValueLine("base_mask", "0x7FFFFFFF"); @@ -437,7 +437,7 @@ namespace OpenSim.Region.Environment.Scenes invString.AddNameValueLine("asset_id", "00000000-0000-2222-3333-000000000001"); invString.AddNameValueLine("type", "lsltext"); - invString.AddNameValueLine("inv_type" , "lsltext"); + invString.AddNameValueLine("inv_type", "lsltext"); invString.AddNameValueLine("flags", "0x00"); invString.AddNameValueLine("name", "Test inventory" + "|"); invString.AddNameValueLine("desc", "test description" + "|"); @@ -447,7 +447,7 @@ namespace OpenSim.Region.Environment.Scenes byte[] fileInv = Helpers.StringToField(invString.BuildString); byte[] data = new byte[fileInv.Length + 4]; Array.Copy(Helpers.IntToBytes(fileInv.Length), 0, data, 0, 4); - Array.Copy(fileInv, 0,data , 4, fileInv.Length); + Array.Copy(fileInv, 0, data, 4, fileInv.Length); client.SendXferPacket(xferID, 0 + 0x80000000, data); } #endregion -- cgit v1.1