aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs8
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs72
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs57
-rw-r--r--OpenSim/Region/Framework/Scenes/UndoState.cs139
4 files changed, 96 insertions, 180 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 8809cd0..038eaa4 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -549,11 +549,12 @@ namespace OpenSim.Region.Framework.Scenes
549 val.Z = Util.Clamp<float>(oldp.Z, 0.5f, 4096.0f); 549 val.Z = Util.Clamp<float>(oldp.Z, 0.5f, 4096.0f);
550 } 550 }
551 } 551 }
552 552/* don't see the need but worse don't see where is restored to false if things stay in
553 foreach (SceneObjectPart part in m_parts.GetArray()) 553 foreach (SceneObjectPart part in m_parts.GetArray())
554 { 554 {
555 part.IgnoreUndoUpdate = true; 555 part.IgnoreUndoUpdate = true;
556 } 556 }
557 */
557 if (RootPart.GetStatusSandbox()) 558 if (RootPart.GetStatusSandbox())
558 { 559 {
559 if (Util.GetDistanceTo(RootPart.StatusSandboxPos, value) > 10) 560 if (Util.GetDistanceTo(RootPart.StatusSandboxPos, value) > 10)
@@ -3519,7 +3520,7 @@ namespace OpenSim.Region.Framework.Scenes
3519 if (part.UUID == m_rootPart.UUID) 3520 if (part.UUID == m_rootPart.UUID)
3520 { 3521 {
3521 UpdateRootRotation(rot); 3522 UpdateRootRotation(rot);
3522 if (!m_rootPart.Undoing) 3523/* if (!m_rootPart.Undoing)
3523 { 3524 {
3524 m_rootPart.Undoing = true; 3525 m_rootPart.Undoing = true;
3525 AbsolutePosition = pos; 3526 AbsolutePosition = pos;
@@ -3527,8 +3528,9 @@ namespace OpenSim.Region.Framework.Scenes
3527 } 3528 }
3528 else 3529 else
3529 { 3530 {
3531 */
3530 AbsolutePosition = pos; 3532 AbsolutePosition = pos;
3531 } 3533// }
3532 } 3534 }
3533 else 3535 else
3534 { 3536 {
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 0760808..cce606a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -263,8 +263,8 @@ namespace OpenSim.Region.Framework.Scenes
263 private bool m_occupied; // KF if any av is sitting on this prim 263 private bool m_occupied; // KF if any av is sitting on this prim
264 private string m_text = String.Empty; 264 private string m_text = String.Empty;
265 private string m_touchName = String.Empty; 265 private string m_touchName = String.Empty;
266 private readonly Stack<UndoState> m_undo = new Stack<UndoState>(5); 266 private Stack<UndoState> m_undo = new Stack<UndoState>(5);
267 private readonly Stack<UndoState> m_redo = new Stack<UndoState>(5); 267 private Stack<UndoState> m_redo = new Stack<UndoState>(5);
268 268
269 private bool m_passTouches; 269 private bool m_passTouches;
270 270
@@ -1709,6 +1709,11 @@ namespace OpenSim.Region.Framework.Scenes
1709 dupe.Category = Category; 1709 dupe.Category = Category;
1710 dupe.m_rezzed = m_rezzed; 1710 dupe.m_rezzed = m_rezzed;
1711 1711
1712 dupe.m_undo = new Stack<UndoState>(5);
1713 dupe.m_redo = new Stack<UndoState>(5);
1714 dupe.IgnoreUndoUpdate = false;
1715 dupe.Undoing = false;
1716
1712 dupe.m_inventory = new SceneObjectPartInventory(dupe); 1717 dupe.m_inventory = new SceneObjectPartInventory(dupe);
1713 dupe.m_inventory.Items = (TaskInventoryDictionary)m_inventory.Items.Clone(); 1718 dupe.m_inventory.Items = (TaskInventoryDictionary)m_inventory.Items.Clone();
1714 1719
@@ -3659,61 +3664,38 @@ namespace OpenSim.Region.Framework.Scenes
3659 3664
3660 public void StoreUndoState(bool forGroup) 3665 public void StoreUndoState(bool forGroup)
3661 { 3666 {
3662 if (!Undoing) 3667 if (!Undoing && !IgnoreUndoUpdate) // just to read better - undo is in progress, or suspended
3663 { 3668 {
3664 if (!IgnoreUndoUpdate) 3669 if (ParentGroup != null)
3665 { 3670 {
3666 if (ParentGroup != null) 3671 lock (m_undo)
3667 { 3672 {
3668 lock (m_undo) 3673 if (m_undo.Count > 0)
3669 { 3674 {
3670 if (m_undo.Count > 0) 3675 // see if we had a change
3671 {
3672 UndoState last = m_undo.Peek();
3673 if (last != null)
3674 {
3675 // TODO: May need to fix for group comparison
3676 if (last.Compare(this))
3677 {
3678 // m_log.DebugFormat(
3679 // "[SCENE OBJECT PART]: Not storing undo for {0} {1} since current state is same as last undo state, initial stack size {2}",
3680 // Name, LocalId, m_undo.Count);
3681 3676
3682 return; 3677 UndoState last = m_undo.Peek();
3683 } 3678 if (last != null)
3679 {
3680 if (last.Compare(this, forGroup))
3681 {
3682 return;
3684 } 3683 }
3685 } 3684 }
3686 3685 }
3687 // m_log.DebugFormat(
3688 // "[SCENE OBJECT PART]: Storing undo state for {0} {1}, forGroup {2}, initial stack size {3}",
3689 // Name, LocalId, forGroup, m_undo.Count);
3690
3691 if (ParentGroup.GetSceneMaxUndo() > 0)
3692 {
3693 UndoState nUndo = new UndoState(this, forGroup);
3694 3686
3695 m_undo.Push(nUndo); 3687 if (ParentGroup.GetSceneMaxUndo() > 0)
3688 {
3689 UndoState nUndo = new UndoState(this, forGroup);
3696 3690
3697 if (m_redo.Count > 0) 3691 m_undo.Push(nUndo);
3698 m_redo.Clear();
3699 3692
3700 // m_log.DebugFormat( 3693 if (m_redo.Count > 0)
3701 // "[SCENE OBJECT PART]: Stored undo state for {0} {1}, forGroup {2}, stack size now {3}", 3694 m_redo.Clear();
3702 // Name, LocalId, forGroup, m_undo.Count);
3703 }
3704 } 3695 }
3705 } 3696 }
3706 } 3697 }
3707 // else
3708 // {
3709 // m_log.DebugFormat("[SCENE OBJECT PART]: Ignoring undo store for {0} {1}", Name, LocalId);
3710 // }
3711 } 3698 }
3712 // else
3713 // {
3714 // m_log.DebugFormat(
3715 // "[SCENE OBJECT PART]: Ignoring undo store for {0} {1} since already undoing", Name, LocalId);
3716 // }
3717 } 3699 }
3718 3700
3719 /// <summary> 3701 /// <summary>
@@ -3749,7 +3731,7 @@ namespace OpenSim.Region.Framework.Scenes
3749 nUndo = new UndoState(this, goback.ForGroup); 3731 nUndo = new UndoState(this, goback.ForGroup);
3750 } 3732 }
3751 3733
3752 goback.PlaybackState(this); 3734 goback.PlayState(this);
3753 3735
3754 if (nUndo != null) 3736 if (nUndo != null)
3755 m_redo.Push(nUndo); 3737 m_redo.Push(nUndo);
@@ -3783,7 +3765,7 @@ namespace OpenSim.Region.Framework.Scenes
3783 m_undo.Push(nUndo); 3765 m_undo.Push(nUndo);
3784 } 3766 }
3785 3767
3786 gofwd.PlayfwdState(this); 3768 gofwd.PlayState(this);
3787 } 3769 }
3788 3770
3789// m_log.DebugFormat( 3771// m_log.DebugFormat(
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 2efb0d2..4190cf6 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -463,15 +463,8 @@ namespace OpenSim.Region.Framework.Scenes
463 // without the parent rotation applied. 463 // without the parent rotation applied.
464 if (ParentID != 0) 464 if (ParentID != 0)
465 { 465 {
466 SceneObjectPart part = m_scene.GetSceneObjectPart(ParentID); 466 SceneObjectPart part = ParentPart;
467 if (part != null)
468 {
469 return part.AbsolutePosition + (m_pos * part.GetWorldRotation()); 467 return part.AbsolutePosition + (m_pos * part.GetWorldRotation());
470 }
471 else
472 {
473 return ParentPosition + m_pos;
474 }
475 } 468 }
476 } 469 }
477 return m_pos; 470 return m_pos;
@@ -589,6 +582,13 @@ namespace OpenSim.Region.Framework.Scenes
589 } 582 }
590 private UUID m_parentUUID = UUID.Zero; 583 private UUID m_parentUUID = UUID.Zero;
591 584
585 public SceneObjectPart ParentPart
586 {
587 get { return m_parentPart; }
588 set { m_parentPart = value; }
589 }
590 private SceneObjectPart m_parentPart = null;
591
592 public float Health 592 public float Health
593 { 593 {
594 get { return m_health; } 594 get { return m_health; }
@@ -827,6 +827,7 @@ namespace OpenSim.Region.Framework.Scenes
827 part.SitTargetAvatar = UUID; 827 part.SitTargetAvatar = UUID;
828 ParentPosition = part.GetWorldPosition(); 828 ParentPosition = part.GetWorldPosition();
829 ParentID = part.LocalId; 829 ParentID = part.LocalId;
830 ParentPart = part;
830 m_pos = m_prevSitOffset; 831 m_pos = m_prevSitOffset;
831 pos = ParentPosition; 832 pos = ParentPosition;
832 } 833 }
@@ -1801,37 +1802,35 @@ namespace OpenSim.Region.Framework.Scenes
1801 1802
1802 if (ParentID != 0) 1803 if (ParentID != 0)
1803 { 1804 {
1804 SceneObjectPart part = m_scene.GetSceneObjectPart(ParentID); 1805 SceneObjectPart part = ParentPart;
1805 if (part != null) 1806 TaskInventoryDictionary taskIDict = part.TaskInventory;
1807 if (taskIDict != null)
1806 { 1808 {
1807 TaskInventoryDictionary taskIDict = part.TaskInventory; 1809 lock (taskIDict)
1808 if (taskIDict != null)
1809 { 1810 {
1810 lock (taskIDict) 1811 foreach (UUID taskID in taskIDict.Keys)
1811 { 1812 {
1812 foreach (UUID taskID in taskIDict.Keys) 1813 UnRegisterControlEventsToScript(LocalId, taskID);
1813 { 1814 taskIDict[taskID].PermsMask &= ~(
1814 UnRegisterControlEventsToScript(LocalId, taskID); 1815 2048 | //PERMISSION_CONTROL_CAMERA
1815 taskIDict[taskID].PermsMask &= ~( 1816 4); // PERMISSION_TAKE_CONTROLS
1816 2048 | //PERMISSION_CONTROL_CAMERA
1817 4); // PERMISSION_TAKE_CONTROLS
1818 }
1819 } 1817 }
1820 } 1818 }
1819 }
1821 1820
1822 // Reset sit target. 1821 // Reset sit target.
1823 if (part.SitTargetAvatar == UUID) 1822 if (part.SitTargetAvatar == UUID)
1824 part.SitTargetAvatar = UUID.Zero; 1823 part.SitTargetAvatar = UUID.Zero;
1825 1824
1826 part.ParentGroup.DeleteAvatar(UUID); 1825 part.ParentGroup.DeleteAvatar(UUID);
1827 ParentPosition = part.GetWorldPosition(); 1826 ParentPosition = part.GetWorldPosition();
1828 ControllingClient.SendClearFollowCamProperties(part.ParentUUID); 1827 ControllingClient.SendClearFollowCamProperties(part.ParentUUID);
1829 }
1830 1828
1831 m_pos += ParentPosition + new Vector3(0.0f, 0.0f, 2.0f * m_sitAvatarHeight); 1829 m_pos += ParentPosition + new Vector3(0.0f, 0.0f, 2.0f * m_sitAvatarHeight);
1832 ParentPosition = Vector3.Zero; 1830 ParentPosition = Vector3.Zero;
1833 1831
1834 ParentID = 0; 1832 ParentID = 0;
1833 ParentPart = null;
1835 1834
1836 if (PhysicsActor == null) 1835 if (PhysicsActor == null)
1837 AddToPhysicalScene(false); 1836 AddToPhysicalScene(false);
@@ -2292,6 +2291,10 @@ namespace OpenSim.Region.Framework.Scenes
2292 return; 2291 return;
2293 } 2292 }
2294 2293
2294 ParentPart = m_scene.GetSceneObjectPart(m_requestedSitTargetID);
2295 if (ParentPart == null)
2296 return;
2297
2295 ParentID = m_requestedSitTargetID; 2298 ParentID = m_requestedSitTargetID;
2296 2299
2297 Velocity = Vector3.Zero; 2300 Velocity = Vector3.Zero;
diff --git a/OpenSim/Region/Framework/Scenes/UndoState.cs b/OpenSim/Region/Framework/Scenes/UndoState.cs
index 5ed3c79..029c828 100644
--- a/OpenSim/Region/Framework/Scenes/UndoState.cs
+++ b/OpenSim/Region/Framework/Scenes/UndoState.cs
@@ -66,43 +66,25 @@ namespace OpenSim.Region.Framework.Scenes
66 /// </summary> 66 /// </summary>
67 /// <param name="part"></param> 67 /// <param name="part"></param>
68 /// <param name="forGroup">True if the undo is for an entire group</param> 68 /// <param name="forGroup">True if the undo is for an entire group</param>
69 /// only for root parts ????
69 public UndoState(SceneObjectPart part, bool forGroup) 70 public UndoState(SceneObjectPart part, bool forGroup)
70 { 71 {
71 if (part.ParentID == 0) 72 if (part.ParentID == 0)
72 { 73 {
73 ForGroup = forGroup; 74 ForGroup = forGroup;
74
75 // if (ForGroup)
76 Position = part.ParentGroup.AbsolutePosition; 75 Position = part.ParentGroup.AbsolutePosition;
77 // else
78 // Position = part.OffsetPosition;
79
80 // m_log.DebugFormat(
81 // "[UNDO STATE]: Storing undo position {0} for root part", Position);
82
83 Rotation = part.RotationOffset; 76 Rotation = part.RotationOffset;
84 77 if (!forGroup)
85 // m_log.DebugFormat( 78 Scale = part.Shape.Scale;
86 // "[UNDO STATE]: Storing undo rotation {0} for root part", Rotation); 79 else
87 80 Scale = Vector3.Zero; // until we fix it
88 Scale = part.Shape.Scale;
89
90 // m_log.DebugFormat(
91 // "[UNDO STATE]: Storing undo scale {0} for root part", Scale);
92 } 81 }
93 else 82 else
94 { 83 {
84 ForGroup = false; // previus code implies only root parts can undo grp
95 Position = part.OffsetPosition; 85 Position = part.OffsetPosition;
96 // m_log.DebugFormat(
97 // "[UNDO STATE]: Storing undo position {0} for child part", Position);
98
99 Rotation = part.RotationOffset; 86 Rotation = part.RotationOffset;
100 // m_log.DebugFormat(
101 // "[UNDO STATE]: Storing undo rotation {0} for child part", Rotation);
102
103 Scale = part.Shape.Scale; 87 Scale = part.Shape.Scale;
104 // m_log.DebugFormat(
105 // "[UNDO STATE]: Storing undo scale {0} for child part", Scale);
106 } 88 }
107 } 89 }
108 90
@@ -111,35 +93,42 @@ namespace OpenSim.Region.Framework.Scenes
111 /// </summary> 93 /// </summary>
112 /// <param name="part"></param> 94 /// <param name="part"></param>
113 /// <returns>true if both the part's position, rotation and scale match those in this undo state. False otherwise.</returns> 95 /// <returns>true if both the part's position, rotation and scale match those in this undo state. False otherwise.</returns>
114 public bool Compare(SceneObjectPart part) 96 public bool Compare(SceneObjectPart part, bool forgrp)
115 { 97 {
98 if (ForGroup != forgrp) // if diferent targets, then they are diferent
99 return false;
100
116 if (part != null) 101 if (part != null)
117 { 102 {
118 if (part.ParentID == 0) 103 if (part.ParentID == 0)
119 return 104 {
120 Position == part.ParentGroup.AbsolutePosition 105 // root part
121 && Rotation == part.RotationOffset 106 // grp position is same as part
122 && Scale == part.Shape.Scale; 107 if (Position != part.ParentGroup.AbsolutePosition)
108 return false;
109 if (Rotation != part.RotationOffset)
110 return false;
111 if (ForGroup)
112 return true; // for now don't do grp scale
113 return (Scale == part.Shape.Scale);
114 }
123 else 115 else
124 return 116 {
125 Position == part.OffsetPosition 117 return (Position == part.OffsetPosition
126 && Rotation == part.RotationOffset 118 && Rotation == part.RotationOffset
127 && Scale == part.Shape.Scale; 119 && Scale == part.Shape.Scale);
120 }
128 } 121 }
129 122
130 return false; 123 return false;
131 } 124 }
132 125
133 public void PlaybackState(SceneObjectPart part) 126 public void PlayState(SceneObjectPart part)
134 { 127 {
135 part.Undoing = true; 128 part.Undoing = true;
136 129
137 if (part.ParentID == 0) 130 if (part.ParentID == 0)
138 { 131 {
139 // m_log.DebugFormat(
140 // "[UNDO STATE]: Undoing position to {0} for root part {1} {2}",
141 // Position, part.Name, part.LocalId);
142
143 if (Position != Vector3.Zero) 132 if (Position != Vector3.Zero)
144 { 133 {
145 if (ForGroup) 134 if (ForGroup)
@@ -148,10 +137,6 @@ namespace OpenSim.Region.Framework.Scenes
148 part.ParentGroup.UpdateRootPosition(Position); 137 part.ParentGroup.UpdateRootPosition(Position);
149 } 138 }
150 139
151 // m_log.DebugFormat(
152 // "[UNDO STATE]: Undoing rotation {0} to {1} for root part {2} {3}",
153 // part.RotationOffset, Rotation, part.Name, part.LocalId);
154
155 if (ForGroup) 140 if (ForGroup)
156 part.UpdateRotation(Rotation); 141 part.UpdateRotation(Rotation);
157 else 142 else
@@ -159,86 +144,30 @@ namespace OpenSim.Region.Framework.Scenes
159 144
160 if (Scale != Vector3.Zero) 145 if (Scale != Vector3.Zero)
161 { 146 {
162 // m_log.DebugFormat( 147 // if (ForGroup)
163 // "[UNDO STATE]: Undoing scale {0} to {1} for root part {2} {3}", 148 // part.ParentGroup.GroupResize(Scale);
164 // part.Shape.Scale, Scale, part.Name, part.LocalId); 149 // else
165 150 if (!ForGroup) // we don't have grp scale for now
166 if (ForGroup)
167 part.ParentGroup.GroupResize(Scale);
168 else
169 part.Resize(Scale); 151 part.Resize(Scale);
170 } 152 }
171
172 part.ParentGroup.ScheduleGroupForTerseUpdate(); 153 part.ParentGroup.ScheduleGroupForTerseUpdate();
173 } 154 }
174 else 155 else
175 { 156 {
176 // Note: Updating these properties on sop automatically schedules an update if needed 157 if (ForGroup) // trap for group since seems parts can't do it
177 if (Position != Vector3.Zero) 158 return;
178 {
179 // m_log.DebugFormat(
180 // "[UNDO STATE]: Undoing position {0} to {1} for child part {2} {3}",
181 // part.OffsetPosition, Position, part.Name, part.LocalId);
182
183 part.OffsetPosition = Position;
184 }
185
186 // m_log.DebugFormat(
187 // "[UNDO STATE]: Undoing rotation {0} to {1} for child part {2} {3}",
188 // part.RotationOffset, Rotation, part.Name, part.LocalId);
189 159
160 // Note: Updating these properties on sop automatically schedules an update if needed
161 part.OffsetPosition = Position;
190 part.UpdateRotation(Rotation); 162 part.UpdateRotation(Rotation);
191
192 if (Scale != Vector3.Zero) 163 if (Scale != Vector3.Zero)
193 { 164 {
194 // m_log.DebugFormat(
195 // "[UNDO STATE]: Undoing scale {0} to {1} for child part {2} {3}",
196 // part.Shape.Scale, Scale, part.Name, part.LocalId);
197
198 part.Resize(Scale); 165 part.Resize(Scale);
199 } 166 }
200 } 167 }
201 168
202 part.Undoing = false; 169 part.Undoing = false;
203 } 170 }
204
205 public void PlayfwdState(SceneObjectPart part)
206 {
207 part.Undoing = true;
208
209 if (part.ParentID == 0)
210 {
211 if (Position != Vector3.Zero)
212 part.ParentGroup.AbsolutePosition = Position;
213
214 if (Rotation != Quaternion.Identity)
215 part.UpdateRotation(Rotation);
216
217 if (Scale != Vector3.Zero)
218 {
219 if (ForGroup)
220 part.ParentGroup.GroupResize(Scale);
221 else
222 part.Resize(Scale);
223 }
224
225 part.ParentGroup.ScheduleGroupForTerseUpdate();
226 }
227 else
228 {
229 // Note: Updating these properties on sop automatically schedules an update if needed
230 if (Position != Vector3.Zero)
231 part.OffsetPosition = Position;
232
233 if (Rotation != Quaternion.Identity)
234 part.UpdateRotation(Rotation);
235
236 if (Scale != Vector3.Zero)
237 part.Resize(Scale);
238 }
239
240 part.Undoing = false;
241 }
242 } 171 }
243 172
244 public class LandUndoState 173 public class LandUndoState