aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Framework/Scenes/KeyframeMotion.cs58
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs12
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs3
3 files changed, 38 insertions, 35 deletions
diff --git a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs
index 42e3860..e4e6f2c 100644
--- a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs
+++ b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs
@@ -112,20 +112,23 @@ namespace OpenSim.Region.Framework.Scenes
112 public bool Selected 112 public bool Selected
113 { 113 {
114 set 114 set
115 { 115 {
116 if (!value) 116 if (m_group != null)
117 {
118 // Once we're let go, recompute positions
119 if (m_selected)
120 UpdateSceneObject(m_group);
121 }
122 else
123 { 117 {
124 // Save selection position in case we get moved 118 if (!value)
125 if (!m_selected)
126 { 119 {
127 StopTimer(); 120 // Once we're let go, recompute positions
128 m_serializedPosition = m_group.AbsolutePosition; 121 if (m_selected)
122 UpdateSceneObject(m_group);
123 }
124 else
125 {
126 // Save selection position in case we get moved
127 if (!m_selected)
128 {
129 StopTimer();
130 m_serializedPosition = m_group.AbsolutePosition;
131 }
129 } 132 }
130 } 133 }
131 m_isCrossing = false; 134 m_isCrossing = false;
@@ -199,6 +202,9 @@ namespace OpenSim.Region.Framework.Scenes
199 m_waitingCrossing = false; 202 m_waitingCrossing = false;
200 StopTimer(); 203 StopTimer();
201 204
205 if (grp == null)
206 return;
207
202 m_group = grp; 208 m_group = grp;
203 Vector3 grppos = grp.AbsolutePosition; 209 Vector3 grppos = grp.AbsolutePosition;
204 Vector3 offset = grppos - m_serializedPosition; 210 Vector3 offset = grppos - m_serializedPosition;
@@ -228,14 +234,16 @@ namespace OpenSim.Region.Framework.Scenes
228 m_mode = mode; 234 m_mode = mode;
229 m_data = data; 235 m_data = data;
230 236
231 m_onTimerLock = new object();
232
233 m_group = grp; 237 m_group = grp;
234 if (grp != null) 238 if (grp != null)
235 { 239 {
236 m_basePosition = grp.AbsolutePosition; 240 m_basePosition = grp.AbsolutePosition;
237 m_baseRotation = grp.GroupRotation; 241 m_baseRotation = grp.GroupRotation;
238 } 242 }
243
244 m_onTimerLock = new object();
245 m_timerStopped = true;
246 m_inOnTimer = false;
239 m_isCrossing = false; 247 m_isCrossing = false;
240 m_waitingCrossing = false; 248 m_waitingCrossing = false;
241 } 249 }
@@ -249,18 +257,23 @@ namespace OpenSim.Region.Framework.Scenes
249 { 257 {
250 StopTimer(); 258 StopTimer();
251 259
252 KeyframeMotion newmotion = new KeyframeMotion(newgrp, m_mode, m_data); 260 KeyframeMotion newmotion = new KeyframeMotion(null, m_mode, m_data);
253 261
254 if (newgrp != null && newgrp.IsSelected) 262 newmotion.m_group = newgrp;
255 newmotion.m_selected = true;
256 263
257 if (m_keyframes != null) 264 if (m_keyframes != null)
265 {
266 newmotion.m_keyframes = new Keyframe[m_keyframes.Length];
258 m_keyframes.CopyTo(newmotion.m_keyframes, 0); 267 m_keyframes.CopyTo(newmotion.m_keyframes, 0);
268 }
259 269
260 newmotion.m_frames = new List<Keyframe>(m_frames); 270 newmotion.m_frames = new List<Keyframe>(m_frames);
271
272 newmotion.m_basePosition = m_basePosition;
273 newmotion.m_baseRotation = m_baseRotation;
274
261 newmotion.m_currentFrame = m_currentFrame; 275 newmotion.m_currentFrame = m_currentFrame;
262 276
263 newmotion.m_nextPosition = m_nextPosition;
264 if (m_selected) 277 if (m_selected)
265 newmotion.m_serializedPosition = m_serializedPosition; 278 newmotion.m_serializedPosition = m_serializedPosition;
266 else 279 else
@@ -272,12 +285,7 @@ namespace OpenSim.Region.Framework.Scenes
272 } 285 }
273 286
274 newmotion.m_iterations = m_iterations; 287 newmotion.m_iterations = m_iterations;
275 288 newmotion.m_running = m_running;
276 newmotion.m_onTimerLock = new object();
277 newmotion.m_timerStopped = false;
278 newmotion.m_inOnTimer = false;
279 newmotion.m_isCrossing = false;
280 newmotion.m_waitingCrossing = false;
281 289
282 if (m_running && !m_waitingCrossing) 290 if (m_running && !m_waitingCrossing)
283 StartTimer(); 291 StartTimer();
@@ -299,7 +307,7 @@ namespace OpenSim.Region.Framework.Scenes
299 { 307 {
300 m_isCrossing = false; 308 m_isCrossing = false;
301 m_waitingCrossing = false; 309 m_waitingCrossing = false;
302 if (m_keyframes.Length > 0) 310 if (m_keyframes != null && m_group != null && m_keyframes.Length > 0)
303 { 311 {
304 if (m_timer == null) 312 if (m_timer == null)
305 { 313 {
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 834d27b..fe34ad4 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2062,6 +2062,7 @@ namespace OpenSim.Region.Framework.Scenes
2062 HasGroupChangedDueToDelink = false; 2062 HasGroupChangedDueToDelink = false;
2063 2063
2064 m_scene.EventManager.TriggerOnSceneObjectPreSave(backup_group, this); 2064 m_scene.EventManager.TriggerOnSceneObjectPreSave(backup_group, this);
2065/*
2065 backup_group.ForEachPart(delegate(SceneObjectPart part) 2066 backup_group.ForEachPart(delegate(SceneObjectPart part)
2066 { 2067 {
2067 if (part.KeyframeMotion != null) 2068 if (part.KeyframeMotion != null)
@@ -2070,7 +2071,7 @@ namespace OpenSim.Region.Framework.Scenes
2070// part.KeyframeMotion.UpdateSceneObject(this); 2071// part.KeyframeMotion.UpdateSceneObject(this);
2071 } 2072 }
2072 }); 2073 });
2073 2074*/
2074 datastore.StoreObject(backup_group, m_scene.RegionInfo.RegionID); 2075 datastore.StoreObject(backup_group, m_scene.RegionInfo.RegionID);
2075 2076
2076 backup_group.ForEachPart(delegate(SceneObjectPart part) 2077 backup_group.ForEachPart(delegate(SceneObjectPart part)
@@ -4415,15 +4416,6 @@ namespace OpenSim.Region.Framework.Scenes
4415 public virtual ISceneObject CloneForNewScene() 4416 public virtual ISceneObject CloneForNewScene()
4416 { 4417 {
4417 SceneObjectGroup sog = Copy(false); 4418 SceneObjectGroup sog = Copy(false);
4418 sog.ForEachPart(delegate(SceneObjectPart part)
4419 {
4420 if (part.KeyframeMotion != null)
4421 {
4422 part.KeyframeMotion = KeyframeMotion.FromData(sog, part.KeyframeMotion.Serialize());
4423 // this is called later
4424// part.KeyframeMotion.UpdateSceneObject(this);
4425 }
4426 });
4427 sog.IsDeleted = false; 4419 sog.IsDeleted = false;
4428 return sog; 4420 return sog;
4429 } 4421 }
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index bf5fc99..4788a24 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -2110,6 +2110,9 @@ namespace OpenSim.Region.Framework.Scenes
2110 Array.Copy(Shape.ExtraParams, extraP, extraP.Length); 2110 Array.Copy(Shape.ExtraParams, extraP, extraP.Length);
2111 dupe.Shape.ExtraParams = extraP; 2111 dupe.Shape.ExtraParams = extraP;
2112 2112
2113 if (KeyframeMotion != null)
2114 dupe.KeyframeMotion = KeyframeMotion.Copy(null);
2115
2113 if (userExposed) 2116 if (userExposed)
2114 { 2117 {
2115 if (dupe.m_shape.SculptEntry && dupe.m_shape.SculptTexture != UUID.Zero) 2118 if (dupe.m_shape.SculptEntry && dupe.m_shape.SculptTexture != UUID.Zero)