diff options
author | UbitUmarov | 2012-08-29 03:19:47 +0100 |
---|---|---|
committer | UbitUmarov | 2012-08-29 03:19:47 +0100 |
commit | 2e54c3cc8f4caf6b6d056ae04419b171942a17d7 (patch) | |
tree | e3dbc9ea4813e9e148782292dba24689a870d39c /OpenSim/Region/Framework | |
parent | [Potentially broken] keyframes changes.. since it's there, use timer for (diff) | |
download | opensim-SC-2e54c3cc8f4caf6b6d056ae04419b171942a17d7.zip opensim-SC-2e54c3cc8f4caf6b6d056ae04419b171942a17d7.tar.gz opensim-SC-2e54c3cc8f4caf6b6d056ae04419b171942a17d7.tar.bz2 opensim-SC-2e54c3cc8f4caf6b6d056ae04419b171942a17d7.tar.xz |
A few more changes to keyframes
Diffstat (limited to 'OpenSim/Region/Framework')
3 files changed, 116 insertions, 64 deletions
diff --git a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs index 5333177..42e3860 100644 --- a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs +++ b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs | |||
@@ -81,10 +81,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
81 | private bool m_timerStopped; | 81 | private bool m_timerStopped; |
82 | 82 | ||
83 | [NonSerialized()] | 83 | [NonSerialized()] |
84 | private bool m_crossing; | 84 | private bool m_isCrossing; |
85 | 85 | ||
86 | [NonSerialized()] | 86 | [NonSerialized()] |
87 | private int m_crossFailcntr; | 87 | private bool m_waitingCrossing; |
88 | 88 | ||
89 | // retry position for cross fail | 89 | // retry position for cross fail |
90 | [NonSerialized()] | 90 | [NonSerialized()] |
@@ -112,9 +112,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
112 | public bool Selected | 112 | public bool Selected |
113 | { | 113 | { |
114 | set | 114 | set |
115 | { | 115 | { |
116 | m_crossing = false; | ||
117 | m_crossFailcntr = 0; | ||
118 | if (!value) | 116 | if (!value) |
119 | { | 117 | { |
120 | // Once we're let go, recompute positions | 118 | // Once we're let go, recompute positions |
@@ -130,6 +128,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
130 | m_serializedPosition = m_group.AbsolutePosition; | 128 | m_serializedPosition = m_group.AbsolutePosition; |
131 | } | 129 | } |
132 | } | 130 | } |
131 | m_isCrossing = false; | ||
132 | m_waitingCrossing = false; | ||
133 | m_selected = value; | 133 | m_selected = value; |
134 | } | 134 | } |
135 | } | 135 | } |
@@ -150,6 +150,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
150 | m_timer.Stop(); | 150 | m_timer.Stop(); |
151 | } | 151 | } |
152 | 152 | ||
153 | private void RemoveTimer() | ||
154 | { | ||
155 | if (m_timer == null) | ||
156 | return; | ||
157 | m_timerStopped = true; | ||
158 | m_timer.Stop(); | ||
159 | m_timer.Elapsed -= OnTimer; | ||
160 | m_timer = null; | ||
161 | } | ||
162 | |||
163 | |||
153 | public static KeyframeMotion FromData(SceneObjectGroup grp, Byte[] data) | 164 | public static KeyframeMotion FromData(SceneObjectGroup grp, Byte[] data) |
154 | { | 165 | { |
155 | KeyframeMotion newMotion = null; | 166 | KeyframeMotion newMotion = null; |
@@ -169,8 +180,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
169 | newMotion.m_onTimerLock = new object(); | 180 | newMotion.m_onTimerLock = new object(); |
170 | newMotion.m_timerStopped = false; | 181 | newMotion.m_timerStopped = false; |
171 | newMotion.m_inOnTimer = false; | 182 | newMotion.m_inOnTimer = false; |
172 | newMotion.m_crossing = false; | 183 | newMotion.m_isCrossing = false; |
173 | newMotion.m_crossFailcntr = 0; | 184 | newMotion.m_waitingCrossing = false; |
174 | } | 185 | } |
175 | catch | 186 | catch |
176 | { | 187 | { |
@@ -184,8 +195,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
184 | { | 195 | { |
185 | // lock (m_onTimerLock) | 196 | // lock (m_onTimerLock) |
186 | { | 197 | { |
187 | m_crossing = false; | 198 | m_isCrossing = false; |
188 | m_crossFailcntr = 0; | 199 | m_waitingCrossing = false; |
189 | StopTimer(); | 200 | StopTimer(); |
190 | 201 | ||
191 | m_group = grp; | 202 | m_group = grp; |
@@ -220,10 +231,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
220 | m_onTimerLock = new object(); | 231 | m_onTimerLock = new object(); |
221 | 232 | ||
222 | m_group = grp; | 233 | m_group = grp; |
223 | m_basePosition = grp.AbsolutePosition; | 234 | if (grp != null) |
224 | m_baseRotation = grp.GroupRotation; | 235 | { |
225 | m_crossing = false; | 236 | m_basePosition = grp.AbsolutePosition; |
226 | m_crossFailcntr = 0; | 237 | m_baseRotation = grp.GroupRotation; |
238 | } | ||
239 | m_isCrossing = false; | ||
240 | m_waitingCrossing = false; | ||
227 | } | 241 | } |
228 | 242 | ||
229 | public void SetKeyframes(Keyframe[] frames) | 243 | public void SetKeyframes(Keyframe[] frames) |
@@ -231,34 +245,74 @@ namespace OpenSim.Region.Framework.Scenes | |||
231 | m_keyframes = frames; | 245 | m_keyframes = frames; |
232 | } | 246 | } |
233 | 247 | ||
248 | public KeyframeMotion Copy(SceneObjectGroup newgrp) | ||
249 | { | ||
250 | StopTimer(); | ||
251 | |||
252 | KeyframeMotion newmotion = new KeyframeMotion(newgrp, m_mode, m_data); | ||
253 | |||
254 | if (newgrp != null && newgrp.IsSelected) | ||
255 | newmotion.m_selected = true; | ||
256 | |||
257 | if (m_keyframes != null) | ||
258 | m_keyframes.CopyTo(newmotion.m_keyframes, 0); | ||
259 | |||
260 | newmotion.m_frames = new List<Keyframe>(m_frames); | ||
261 | newmotion.m_currentFrame = m_currentFrame; | ||
262 | |||
263 | newmotion.m_nextPosition = m_nextPosition; | ||
264 | if (m_selected) | ||
265 | newmotion.m_serializedPosition = m_serializedPosition; | ||
266 | else | ||
267 | { | ||
268 | if (m_group != null) | ||
269 | newmotion.m_serializedPosition = m_group.AbsolutePosition; | ||
270 | else | ||
271 | newmotion.m_serializedPosition = m_serializedPosition; | ||
272 | } | ||
273 | |||
274 | newmotion.m_iterations = m_iterations; | ||
275 | |||
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 | |||
282 | if (m_running && !m_waitingCrossing) | ||
283 | StartTimer(); | ||
284 | |||
285 | return newmotion; | ||
286 | } | ||
287 | |||
234 | public void Delete() | 288 | public void Delete() |
235 | { | 289 | { |
236 | m_running = false; | 290 | m_running = false; |
237 | m_crossing = false; | 291 | RemoveTimer(); |
238 | m_crossFailcntr = 0; | 292 | m_isCrossing = false; |
239 | StopTimer(); | 293 | m_waitingCrossing = false; |
240 | m_frames.Clear(); | 294 | m_frames.Clear(); |
241 | m_keyframes = null; | 295 | m_keyframes = null; |
242 | |||
243 | if (m_timer == null) | ||
244 | return; | ||
245 | m_timer.Elapsed -= OnTimer; | ||
246 | m_timer = null; | ||
247 | } | 296 | } |
248 | 297 | ||
249 | public void Start() | 298 | public void Start() |
250 | { | 299 | { |
251 | m_crossing = false; | 300 | m_isCrossing = false; |
252 | m_crossFailcntr = 0; | 301 | m_waitingCrossing = false; |
253 | if (m_keyframes.Length > 0) | 302 | if (m_keyframes.Length > 0) |
254 | { | 303 | { |
255 | if (m_timer == null) | 304 | if (m_timer == null) |
256 | { | 305 | { |
257 | m_timer = new Timer(); | 306 | m_timer = new Timer(); |
258 | m_timer.Interval = (int)timerInterval; | 307 | m_timer.Interval = timerInterval; |
259 | m_timer.AutoReset = true; | 308 | m_timer.AutoReset = true; |
260 | m_timer.Elapsed += OnTimer; | 309 | m_timer.Elapsed += OnTimer; |
261 | } | 310 | } |
311 | else | ||
312 | { | ||
313 | StopTimer(); | ||
314 | m_timer.Interval = timerInterval; | ||
315 | } | ||
262 | 316 | ||
263 | m_inOnTimer = false; | 317 | m_inOnTimer = false; |
264 | StartTimer(); | 318 | StartTimer(); |
@@ -267,24 +321,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
267 | else | 321 | else |
268 | { | 322 | { |
269 | m_running = false; | 323 | m_running = false; |
270 | if (m_timer != null) | 324 | RemoveTimer(); |
271 | { | ||
272 | StopTimer(); | ||
273 | m_timer.Elapsed -= OnTimer; | ||
274 | m_timer = null; | ||
275 | } | ||
276 | } | 325 | } |
277 | } | 326 | } |
278 | 327 | ||
279 | public void Stop() | 328 | public void Stop() |
280 | { | 329 | { |
281 | m_running = false; | 330 | m_running = false; |
282 | m_crossing = false; | 331 | m_isCrossing = false; |
283 | m_crossFailcntr = 0; | 332 | m_waitingCrossing = false; |
284 | 333 | ||
285 | StopTimer(); | 334 | RemoveTimer(); |
286 | m_timer.Elapsed -= OnTimer; | ||
287 | m_timer = null; | ||
288 | 335 | ||
289 | m_basePosition = m_group.AbsolutePosition; | 336 | m_basePosition = m_group.AbsolutePosition; |
290 | m_baseRotation = m_group.GroupRotation; | 337 | m_baseRotation = m_group.GroupRotation; |
@@ -299,8 +346,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
299 | public void Pause() | 346 | public void Pause() |
300 | { | 347 | { |
301 | m_running = false; | 348 | m_running = false; |
302 | m_crossFailcntr = 0; | 349 | RemoveTimer(); |
303 | StopTimer(); | ||
304 | 350 | ||
305 | m_group.RootPart.Velocity = Vector3.Zero; | 351 | m_group.RootPart.Velocity = Vector3.Zero; |
306 | m_group.RootPart.UpdateAngularVelocity(Vector3.Zero); | 352 | m_group.RootPart.UpdateAngularVelocity(Vector3.Zero); |
@@ -421,7 +467,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
421 | if (m_group == null) | 467 | if (m_group == null) |
422 | return; | 468 | return; |
423 | 469 | ||
424 | // lock (m_onTimerLock) | 470 | lock (m_onTimerLock) |
425 | { | 471 | { |
426 | 472 | ||
427 | m_inOnTimer = true; | 473 | m_inOnTimer = true; |
@@ -441,15 +487,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
441 | return; | 487 | return; |
442 | } | 488 | } |
443 | 489 | ||
444 | if (m_crossing) | 490 | if (m_isCrossing) |
445 | { | 491 | { |
446 | // if crossing and timer running then cross failed | 492 | // if crossing and timer running then cross failed |
447 | // wait some time then | 493 | // wait some time then |
448 | // retry to set the position that evtually caused the outbound | 494 | // retry to set the position that evtually caused the outbound |
449 | // if still outside region this will call startCrossing below | 495 | // if still outside region this will call startCrossing below |
450 | m_crossing = false; | 496 | m_isCrossing = false; |
451 | m_group.AbsolutePosition = m_nextPosition; | 497 | m_group.AbsolutePosition = m_nextPosition; |
452 | if (!m_crossing) | 498 | if (!m_isCrossing) |
453 | { | 499 | { |
454 | StopTimer(); | 500 | StopTimer(); |
455 | m_timer.Interval = timerInterval; | 501 | m_timer.Interval = timerInterval; |
@@ -552,9 +598,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
552 | 598 | ||
553 | if (angle > 0.01f) | 599 | if (angle > 0.01f) |
554 | */ | 600 | */ |
555 | if(Math.Abs(step.X -current.X) > 0.001f | 601 | if(Math.Abs(step.X - current.X) > 0.001f |
556 | || Math.Abs(step.Y -current.Y) > 0.001f | 602 | || Math.Abs(step.Y - current.Y) > 0.001f |
557 | || Math.Abs(step.Z -current.Z) > 0.001f) | 603 | || Math.Abs(step.Z - current.Z) > 0.001f) |
558 | // assuming w is a dependente var | 604 | // assuming w is a dependente var |
559 | 605 | ||
560 | { | 606 | { |
@@ -563,7 +609,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
563 | update = true; | 609 | update = true; |
564 | } | 610 | } |
565 | } | 611 | } |
566 | |||
567 | } | 612 | } |
568 | 613 | ||
569 | if (update) | 614 | if (update) |
@@ -573,7 +618,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
573 | catch ( Exception ex) | 618 | catch ( Exception ex) |
574 | { | 619 | { |
575 | // still happening sometimes | 620 | // still happening sometimes |
576 | // lets try to see what | 621 | // lets try to see where |
577 | m_log.Warn("[KeyFrame]: timer overrun" + ex.Message); | 622 | m_log.Warn("[KeyFrame]: timer overrun" + ex.Message); |
578 | } | 623 | } |
579 | 624 | ||
@@ -585,29 +630,34 @@ namespace OpenSim.Region.Framework.Scenes | |||
585 | } | 630 | } |
586 | } | 631 | } |
587 | 632 | ||
588 | public Byte[] Serialize(bool StopMoveTimer) | 633 | public Byte[] Serialize() |
589 | { | 634 | { |
635 | StopTimer(); | ||
590 | MemoryStream ms = new MemoryStream(); | 636 | MemoryStream ms = new MemoryStream(); |
591 | if (StopMoveTimer && m_timer != null) | ||
592 | StopTimer(); | ||
593 | 637 | ||
594 | // lock (m_onTimerLock) | 638 | BinaryFormatter fmt = new BinaryFormatter(); |
595 | { | 639 | SceneObjectGroup tmp = m_group; |
596 | BinaryFormatter fmt = new BinaryFormatter(); | 640 | m_group = null; |
597 | SceneObjectGroup tmp = m_group; | 641 | if (!m_selected && tmp != null) |
598 | m_group = null; | 642 | m_serializedPosition = tmp.AbsolutePosition; |
599 | if(!m_selected) | 643 | fmt.Serialize(ms, this); |
600 | m_serializedPosition = tmp.AbsolutePosition; | 644 | m_group = tmp; |
601 | fmt.Serialize(ms, this); | 645 | if (m_running && !m_waitingCrossing) |
602 | m_group = tmp; | 646 | StartTimer(); |
603 | return ms.ToArray(); | 647 | |
604 | } | 648 | return ms.ToArray(); |
605 | } | 649 | } |
606 | 650 | ||
607 | public void StartCrossingCheck() | 651 | public void StartCrossingCheck() |
608 | { | 652 | { |
653 | // timer will be restart by crossingFailure | ||
654 | // or never since crossing worked and this | ||
655 | // should be deleted | ||
609 | StopTimer(); | 656 | StopTimer(); |
610 | m_crossing = true; | 657 | |
658 | m_isCrossing = true; | ||
659 | m_waitingCrossing = true; | ||
660 | |||
611 | // to remove / retune to smoth crossings | 661 | // to remove / retune to smoth crossings |
612 | if (m_group.RootPart.Velocity != Vector3.Zero) | 662 | if (m_group.RootPart.Velocity != Vector3.Zero) |
613 | { | 663 | { |
@@ -618,6 +668,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
618 | 668 | ||
619 | public void CrossingFailure() | 669 | public void CrossingFailure() |
620 | { | 670 | { |
671 | m_waitingCrossing = false; | ||
672 | |||
621 | if (m_group != null) | 673 | if (m_group != null) |
622 | { | 674 | { |
623 | m_group.RootPart.Velocity = Vector3.Zero; | 675 | m_group.RootPart.Velocity = Vector3.Zero; |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 65a1da2..834d27b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -2066,7 +2066,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2066 | { | 2066 | { |
2067 | if (part.KeyframeMotion != null) | 2067 | if (part.KeyframeMotion != null) |
2068 | { | 2068 | { |
2069 | part.KeyframeMotion = KeyframeMotion.FromData(backup_group, part.KeyframeMotion.Serialize(false)); | 2069 | part.KeyframeMotion = KeyframeMotion.FromData(backup_group, part.KeyframeMotion.Serialize()); |
2070 | // part.KeyframeMotion.UpdateSceneObject(this); | 2070 | // part.KeyframeMotion.UpdateSceneObject(this); |
2071 | } | 2071 | } |
2072 | }); | 2072 | }); |
@@ -4419,7 +4419,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4419 | { | 4419 | { |
4420 | if (part.KeyframeMotion != null) | 4420 | if (part.KeyframeMotion != null) |
4421 | { | 4421 | { |
4422 | part.KeyframeMotion = KeyframeMotion.FromData(sog, part.KeyframeMotion.Serialize(true)); | 4422 | part.KeyframeMotion = KeyframeMotion.FromData(sog, part.KeyframeMotion.Serialize()); |
4423 | // this is called later | 4423 | // this is called later |
4424 | // part.KeyframeMotion.UpdateSceneObject(this); | 4424 | // part.KeyframeMotion.UpdateSceneObject(this); |
4425 | } | 4425 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index 1c75607..123c158 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs | |||
@@ -1241,7 +1241,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
1241 | 1241 | ||
1242 | if (sog.RootPart.KeyframeMotion != null) | 1242 | if (sog.RootPart.KeyframeMotion != null) |
1243 | { | 1243 | { |
1244 | Byte[] data = sog.RootPart.KeyframeMotion.Serialize(true); | 1244 | Byte[] data = sog.RootPart.KeyframeMotion.Serialize(); |
1245 | 1245 | ||
1246 | writer.WriteStartElement(String.Empty, "KeyframeMotion", String.Empty); | 1246 | writer.WriteStartElement(String.Empty, "KeyframeMotion", String.Empty); |
1247 | writer.WriteBase64(data, 0, data.Length); | 1247 | writer.WriteBase64(data, 0, data.Length); |