diff --git a/OpenSim/Framework/ObjectChangeData.cs b/OpenSim/Framework/ObjectChangeData.cs new file mode 100644 index 0000000000..8d56291865 --- /dev/null +++ b/OpenSim/Framework/ObjectChangeData.cs @@ -0,0 +1,80 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using OpenMetaverse; + +namespace OpenSim.Framework +{ + public enum ObjectChangeType : uint + { + // bits definitions + Position = 0x01, + Rotation = 0x02, + Scale = 0x04, + Group = 0x08, + UniformScale = 0x10, + + // macros from above + // single prim + primP = 0x01, + primR = 0x02, + primPR = 0x03, + primS = 0x04, + primPS = 0x05, + primRS = 0x06, + primPSR = 0x07, + + primUS = 0x14, + primPUS = 0x15, + primRUS = 0x16, + primPUSR = 0x17, + + // group + groupP = 0x09, + groupR = 0x0A, + groupPR = 0x0B, + groupS = 0x0C, + groupPS = 0x0D, + groupRS = 0x0E, + groupPSR = 0x0F, + + groupUS = 0x1C, + groupPUS = 0x1D, + groupRUS = 0x1E, + groupPUSR = 0x1F, + + PRSmask = 0x07 + } + + public struct ObjectChangeData + { + public Quaternion rotation; + public Vector3 position; + public Vector3 scale; + public ObjectChangeType change; + } +} diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 4c43c10992..18af6234b6 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -11504,14 +11504,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP case 1: //change position sp udata.position = new Vector3(block.Data, 0); - udata.what = ObjectChangeWhat.primP; + udata.change = ObjectChangeType.primP; updatehandler(localId, udata, this); break; case 2: // rotation sp udata.rotation = new Quaternion(block.Data, 0, true); - udata.what = ObjectChangeWhat.primR; + udata.change = ObjectChangeType.primR; updatehandler(localId, udata, this); break; @@ -11519,13 +11519,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP udata.position = new Vector3(block.Data, 0); udata.rotation = new Quaternion(block.Data, 12, true); - udata.what = ObjectChangeWhat.primPR; + udata.change = ObjectChangeType.primPR; updatehandler(localId, udata, this); break; case 4: // scale sp udata.scale = new Vector3(block.Data, 0); - udata.what = ObjectChangeWhat.primS; + udata.change = ObjectChangeType.primS; updatehandler(localId, udata, this); break; @@ -11533,7 +11533,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP case 0x14: // uniform scale sp udata.scale = new Vector3(block.Data, 0); - udata.what = ObjectChangeWhat.primUS; + udata.change = ObjectChangeType.primUS; updatehandler(localId, udata, this); break; @@ -11541,7 +11541,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP udata.position = new Vector3(block.Data, 0); udata.scale = new Vector3(block.Data, 12); - udata.what = ObjectChangeWhat.primPS; + udata.change = ObjectChangeType.primPS; updatehandler(localId, udata, this); break; @@ -11549,7 +11549,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP udata.position = new Vector3(block.Data, 0); udata.scale = new Vector3(block.Data, 12); - udata.what = ObjectChangeWhat.primPUS; + udata.change = ObjectChangeType.primPUS; updatehandler(localId, udata, this); break; @@ -11557,14 +11557,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP case 9: //( 8 + 1 )group position udata.position = new Vector3(block.Data, 0); - udata.what = ObjectChangeWhat.groupP; + udata.change = ObjectChangeType.groupP; updatehandler(localId, udata, this); break; case 0x0A: // (8 + 2) group rotation udata.rotation = new Quaternion(block.Data, 0, true); - udata.what = ObjectChangeWhat.groupR; + udata.change = ObjectChangeType.groupR; updatehandler(localId, udata, this); break; @@ -11572,7 +11572,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP udata.position = new Vector3(block.Data, 0); udata.rotation = new Quaternion(block.Data, 12, true); - udata.what = ObjectChangeWhat.groupPR; + udata.change = ObjectChangeType.groupPR; updatehandler(localId, udata, this); break; @@ -11583,8 +11583,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP udata.scale = new Vector3(block.Data, 0); - // udata.what = ObjectChangeWhat.groupS; - udata.what = ObjectChangeWhat.primS; // to conform to current SL + // udata.change = ObjectChangeType.groupS; + udata.change = ObjectChangeType.primS; // to conform to current SL updatehandler(localId, udata, this); break; @@ -11595,15 +11595,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP udata.position = new Vector3(block.Data, 0); udata.scale = new Vector3(block.Data, 12); - // udata.what = ObjectChangeWhat.groupPS; - udata.what = ObjectChangeWhat.primPS; // to conform to current SL + // udata.change = ObjectChangeType.groupPS; + udata.change = ObjectChangeType.primPS; // to conform to current SL updatehandler(localId, udata, this); break; case 0x1C: // (0x10 + 8 + 4 ) group scale UNIFORM udata.scale = new Vector3(block.Data, 0); - udata.what = ObjectChangeWhat.groupUS; + udata.change = ObjectChangeType.groupUS; updatehandler(localId, udata, this); break; @@ -11611,7 +11611,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP udata.position = new Vector3(block.Data, 0); udata.scale = new Vector3(block.Data, 12); - udata.what = ObjectChangeWhat.groupPUS; + udata.change = ObjectChangeType.groupPUS; updatehandler(localId, udata, this); break; diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 5e770ba1fd..e6e3ad0ab3 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -47,57 +47,6 @@ namespace OpenSim.Region.Framework.Scenes public delegate void ChangedBackupDelegate(SceneObjectGroup sog); - - public enum ObjectChangeWhat : uint - { - // bits definitions - Position = 0x01, - Rotation = 0x02, - Scale = 0x04, - Group = 0x08, - UniformScale = 0x10, - - // macros from above - // single prim - primP = 0x01, - primR = 0x02, - primPR = 0x03, - primS = 0x04, - primPS = 0x05, - primRS = 0x06, - primPSR = 0x07, - - primUS = 0x14, - primPUS = 0x15, - primRUS = 0x16, - primPUSR = 0x17, - - // group - groupP = 0x09, - groupR = 0x0A, - groupPR = 0x0B, - groupS = 0x0C, - groupPS = 0x0D, - groupRS = 0x0E, - groupPSR = 0x0F, - - groupUS = 0x1C, - groupPUS = 0x1D, - groupRUS = 0x1E, - groupPUSR = 0x1F, - - PRSmask = 0x07 - } - - public struct ObjectChangeData - { - public Quaternion rotation; - public Vector3 position; - public Vector3 scale; - public ObjectChangeWhat what; - } - - /// /// This class used to be called InnerScene and may not yet truly be a SceneGraph. The non scene graph components /// should be migrated out over time. @@ -1352,75 +1301,13 @@ namespace OpenSim.Region.Framework.Scenes { if (m_parentScene.Permissions.CanEditObject(grp.UUID, remoteClient.AgentId)) { -// part.StoreUndoState(data.what | ObjectChangeWhat.PRSmask); // for now save all to keep previus behavour ??? - part.StoreUndoState(data.what); // lets test only saving what we changed + part.StoreUndoState(data.change); // lets test only saving what we changed grp.doChangeObject(part, (ObjectChangeData)data); } } } } -/* moved to SOG - protected internal void doChangeObject(SceneObjectPart part, ObjectChangeData data) - { - if (part != null && part.ParentGroup != null) - { - ObjectChangeWhat what = data.what; - bool togroup = ((what & ObjectChangeWhat.Group) != 0); -// bool uniform = ((what & ObjectChangeWhat.UniformScale) != 0); not in use - - SceneObjectGroup group = part.ParentGroup; - PhysicsActor pha = group.RootPart.PhysActor; - - if (togroup) - { - // related to group - if ((what & ObjectChangeWhat.Position) != 0) - group.AbsolutePosition = data.position; - if ((what & ObjectChangeWhat.Rotation) != 0) - group.RootPart.UpdateRotation(data.rotation); - if ((what & ObjectChangeWhat.Scale) != 0) - { - if (pha != null) - pha.Building = true; - group.GroupResize(data.scale); - if (pha != null) - pha.Building = false; - } - } - else - { - // related to single prim in a link-set ( ie group) - if (pha != null) - pha.Building = true; - - // must deal with root part specially for position and rotation - // so parts offset positions or rotations are fixed - - if (part == group.RootPart) - { - if ((what & ObjectChangeWhat.Position) != 0) - group.UpdateRootPosition(data.position); - if ((what & ObjectChangeWhat.Rotation) != 0) - group.UpdateRootRotation(data.rotation); - } - else - { - if ((what & ObjectChangeWhat.Position) != 0) - part.OffsetPosition = data.position; - if ((what & ObjectChangeWhat.Rotation) != 0) - part.UpdateRotation(data.rotation); - } - - if ((what & ObjectChangeWhat.Scale) != 0) - part.Resize(data.scale); - - if (pha != null) - pha.Building = false; - } - } - } -*/ /// /// Update the scale of an individual prim. /// diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index e5cfed0508..b2502e0674 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -3521,9 +3521,9 @@ namespace OpenSim.Region.Framework.Scenes if (part != null && part.ParentGroup != null) { - ObjectChangeWhat what = data.what; - bool togroup = ((what & ObjectChangeWhat.Group) != 0); - // bool uniform = ((what & ObjectChangeWhat.UniformScale) != 0); not in use + ObjectChangeType change = data.change; + bool togroup = ((change & ObjectChangeType.Group) != 0); + // bool uniform = ((what & ObjectChangeType.UniformScale) != 0); not in use SceneObjectGroup group = part.ParentGroup; PhysicsActor pha = group.RootPart.PhysActor; @@ -3533,17 +3533,17 @@ namespace OpenSim.Region.Framework.Scenes if (togroup) { // related to group - if ((what & ObjectChangeWhat.Position) != 0) + if ((change & ObjectChangeType.Position) != 0) { group.AbsolutePosition = data.position; updateType = updatetype.groupterse; } - if ((what & ObjectChangeWhat.Rotation) != 0) + if ((change & ObjectChangeType.Rotation) != 0) { group.RootPart.UpdateRotation(data.rotation); updateType = updatetype.none; } - if ((what & ObjectChangeWhat.Scale) != 0) + if ((change & ObjectChangeType.Scale) != 0) { if (pha != null) pha.Building = true; @@ -3566,26 +3566,26 @@ namespace OpenSim.Region.Framework.Scenes if (part == group.RootPart) { - if ((what & ObjectChangeWhat.Position) != 0) + if ((change & ObjectChangeType.Position) != 0) group.UpdateRootPosition(data.position); - if ((what & ObjectChangeWhat.Rotation) != 0) + if ((change & ObjectChangeType.Rotation) != 0) group.UpdateRootRotation(data.rotation); - if ((what & ObjectChangeWhat.Scale) != 0) + if ((change & ObjectChangeType.Scale) != 0) part.Resize(data.scale); } else { - if ((what & ObjectChangeWhat.Position) != 0) + if ((change & ObjectChangeType.Position) != 0) { part.OffsetPosition = data.position; updateType = updatetype.partterse; } - if ((what & ObjectChangeWhat.Rotation) != 0) + if ((change & ObjectChangeType.Rotation) != 0) { part.UpdateRotation(data.rotation); updateType = updatetype.none; } - if ((what & ObjectChangeWhat.Scale) != 0) + if ((change & ObjectChangeType.Scale) != 0) { part.Resize(data.scale); updateType = updatetype.none; diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 94e4560979..f647544aa5 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -3644,7 +3644,7 @@ namespace OpenSim.Region.Framework.Scenes //ParentGroup.ScheduleGroupForFullUpdate(); } - public void StoreUndoState(ObjectChangeWhat what) + public void StoreUndoState(ObjectChangeType change) { if (m_UndoRedo == null) m_UndoRedo = new UndoRedoState(5); @@ -3653,7 +3653,7 @@ namespace OpenSim.Region.Framework.Scenes { if (!Undoing && !IgnoreUndoUpdate && ParentGroup != null) // just to read better - undo is in progress, or suspended { - m_UndoRedo.StoreUndo(this, what); + m_UndoRedo.StoreUndo(this, change); } } } diff --git a/OpenSim/Region/Framework/Scenes/UndoState.cs b/OpenSim/Region/Framework/Scenes/UndoState.cs index fd90714093..7bbf1bd1c6 100644 --- a/OpenSim/Region/Framework/Scenes/UndoState.cs +++ b/OpenSim/Region/Framework/Scenes/UndoState.cs @@ -30,6 +30,7 @@ using System.Reflection; using System.Collections.Generic; using log4net; using OpenMetaverse; +using OpenSim.Framework; using OpenSim.Region.Framework.Interfaces; namespace OpenSim.Region.Framework.Scenes @@ -44,30 +45,30 @@ namespace OpenSim.Region.Framework.Scenes /// Constructor. /// /// - /// bit field with what is changed + /// bit field with what is changed /// - public UndoState(SceneObjectPart part, ObjectChangeWhat what) + public UndoState(SceneObjectPart part, ObjectChangeType change) { data = new ObjectChangeData(); - data.what = what; + data.change = change; creationtime = DateTime.UtcNow; if (part.ParentGroup.RootPart == part) { - if ((what & ObjectChangeWhat.Position) != 0) + if ((change & ObjectChangeType.Position) != 0) data.position = part.ParentGroup.AbsolutePosition; - if ((what & ObjectChangeWhat.Rotation) != 0) + if ((change & ObjectChangeType.Rotation) != 0) data.rotation = part.RotationOffset; - if ((what & ObjectChangeWhat.Scale) != 0) + if ((change & ObjectChangeType.Scale) != 0) data.scale = part.Shape.Scale; } else { - if ((what & ObjectChangeWhat.Position) != 0) + if ((change & ObjectChangeType.Position) != 0) data.position = part.OffsetPosition; - if ((what & ObjectChangeWhat.Rotation) != 0) + if ((change & ObjectChangeType.Rotation) != 0) data.rotation = part.RotationOffset; - if ((what & ObjectChangeWhat.Scale) != 0) + if ((change & ObjectChangeType.Scale) != 0) data.scale = part.Shape.Scale; } } @@ -97,27 +98,27 @@ namespace OpenSim.Region.Framework.Scenes /// /// true what fiels and related data are equal, False otherwise. /// - public bool Compare(SceneObjectPart part, ObjectChangeWhat what) + public bool Compare(SceneObjectPart part, ObjectChangeType change) { - if (data.what != what) // if diferent targets, then they are diferent + if (data.change != change) // if diferent targets, then they are diferent return false; if (part != null) { if (part.ParentID == 0) { - if ((what & ObjectChangeWhat.Position) != 0 && data.position != part.ParentGroup.AbsolutePosition) + if ((change & ObjectChangeType.Position) != 0 && data.position != part.ParentGroup.AbsolutePosition) return false; } else { - if ((what & ObjectChangeWhat.Position) != 0 && data.position != part.OffsetPosition) + if ((change & ObjectChangeType.Position) != 0 && data.position != part.OffsetPosition) return false; } - if ((what & ObjectChangeWhat.Rotation) != 0 && data.rotation != part.RotationOffset) + if ((change & ObjectChangeType.Rotation) != 0 && data.rotation != part.RotationOffset) return false; - if ((what & ObjectChangeWhat.Rotation) != 0 && data.scale == part.Shape.Scale) + if ((change & ObjectChangeType.Rotation) != 0 && data.scale == part.Shape.Scale) return false; return true; @@ -196,9 +197,9 @@ namespace OpenSim.Region.Framework.Scenes /// adds a new state undo to part or its group, with changes indicated by what bits /// /// - /// bit field with what is changed + /// bit field with what is changed - public void StoreUndo(SceneObjectPart part, ObjectChangeWhat what) + public void StoreUndo(SceneObjectPart part, ObjectChangeType change) { lock (m_undo) { @@ -220,7 +221,7 @@ namespace OpenSim.Region.Framework.Scenes // see if we actually have a change if (last != null) { - if (last.Compare(part, what)) + if (last.Compare(part, change)) return; } } @@ -230,7 +231,7 @@ namespace OpenSim.Region.Framework.Scenes while (m_undo.Count >= size) m_undo.RemoveLast(); - UndoState nUndo = new UndoState(part, what); + UndoState nUndo = new UndoState(part, change); m_undo.AddFirst(nUndo); } } @@ -273,7 +274,7 @@ namespace OpenSim.Region.Framework.Scenes while (m_redo.Count >= size) m_redo.RemoveLast(); - nUndo = new UndoState(part, goback.data.what); // new value in part should it be full goback copy? + nUndo = new UndoState(part, goback.data.change); // new value in part should it be full goback copy? m_redo.AddFirst(nUndo); goback.PlayState(part); @@ -320,7 +321,7 @@ namespace OpenSim.Region.Framework.Scenes while (m_undo.Count >= size) m_undo.RemoveLast(); - nUndo = new UndoState(part, gofwd.data.what); // new value in part should it be full gofwd copy? + nUndo = new UndoState(part, gofwd.data.change); // new value in part should it be full gofwd copy? m_undo.AddFirst(nUndo); gofwd.PlayState(part);