diff options
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/KeyframeMotion.cs | 95 |
1 files changed, 75 insertions, 20 deletions
diff --git a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs index 5a1fd13..6dc6504 100644 --- a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs +++ b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs | |||
@@ -22,25 +22,36 @@ using log4net; | |||
22 | 22 | ||
23 | namespace OpenSim.Region.Framework.Scenes | 23 | namespace OpenSim.Region.Framework.Scenes |
24 | { | 24 | { |
25 | public static class KeyframeTimer | 25 | public class KeyframeTimer |
26 | { | 26 | { |
27 | private static Timer m_timer; | 27 | private static Dictionary<Scene, KeyframeTimer>m_timers = |
28 | private static Dictionary<KeyframeMotion, object> m_motions = new Dictionary<KeyframeMotion, object>(); | 28 | new Dictionary<Scene, KeyframeTimer>(); |
29 | private static object m_lockObject = new object(); | ||
30 | private static object m_timerLock = new object(); | ||
31 | public const double timerInterval = 50.0; | ||
32 | 29 | ||
33 | static KeyframeTimer() | 30 | private Timer m_timer; |
31 | private Dictionary<KeyframeMotion, object> m_motions = new Dictionary<KeyframeMotion, object>(); | ||
32 | private object m_lockObject = new object(); | ||
33 | private object m_timerLock = new object(); | ||
34 | private const double m_tickDuration = 50.0; | ||
35 | private Scene m_scene; | ||
36 | |||
37 | public double TickDuration | ||
38 | { | ||
39 | get { return m_tickDuration; } | ||
40 | } | ||
41 | |||
42 | public KeyframeTimer(Scene scene) | ||
34 | { | 43 | { |
35 | m_timer = new Timer(); | 44 | m_timer = new Timer(); |
36 | m_timer.Interval = timerInterval; | 45 | m_timer.Interval = TickDuration; |
37 | m_timer.AutoReset = true; | 46 | m_timer.AutoReset = true; |
38 | m_timer.Elapsed += OnTimer; | 47 | m_timer.Elapsed += OnTimer; |
39 | 48 | ||
49 | m_scene = scene; | ||
50 | |||
40 | m_timer.Start(); | 51 | m_timer.Start(); |
41 | } | 52 | } |
42 | 53 | ||
43 | private static void OnTimer(object sender, ElapsedEventArgs ea) | 54 | private void OnTimer(object sender, ElapsedEventArgs ea) |
44 | { | 55 | { |
45 | if (!Monitor.TryEnter(m_timerLock)) | 56 | if (!Monitor.TryEnter(m_timerLock)) |
46 | return; | 57 | return; |
@@ -58,7 +69,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
58 | { | 69 | { |
59 | try | 70 | try |
60 | { | 71 | { |
61 | m.OnTimer(); | 72 | m.OnTimer(TickDuration); |
62 | } | 73 | } |
63 | catch (Exception inner) | 74 | catch (Exception inner) |
64 | { | 75 | { |
@@ -78,17 +89,44 @@ namespace OpenSim.Region.Framework.Scenes | |||
78 | 89 | ||
79 | public static void Add(KeyframeMotion motion) | 90 | public static void Add(KeyframeMotion motion) |
80 | { | 91 | { |
81 | lock (m_lockObject) | 92 | KeyframeTimer timer; |
93 | |||
94 | if (motion.Scene == null) | ||
95 | return; | ||
96 | |||
97 | lock (m_timers) | ||
82 | { | 98 | { |
83 | m_motions[motion] = null; | 99 | if (!m_timers.TryGetValue(motion.Scene, out timer)) |
100 | { | ||
101 | timer = new KeyframeTimer(motion.Scene); | ||
102 | m_timers[motion.Scene] = timer; | ||
103 | } | ||
104 | } | ||
105 | |||
106 | lock (timer.m_lockObject) | ||
107 | { | ||
108 | timer.m_motions[motion] = null; | ||
84 | } | 109 | } |
85 | } | 110 | } |
86 | 111 | ||
87 | public static void Remove(KeyframeMotion motion) | 112 | public static void Remove(KeyframeMotion motion) |
88 | { | 113 | { |
89 | lock (m_lockObject) | 114 | KeyframeTimer timer; |
115 | |||
116 | if (motion.Scene == null) | ||
117 | return; | ||
118 | |||
119 | lock (m_timers) | ||
90 | { | 120 | { |
91 | m_motions.Remove(motion); | 121 | if (!m_timers.TryGetValue(motion.Scene, out timer)) |
122 | { | ||
123 | return; | ||
124 | } | ||
125 | } | ||
126 | |||
127 | lock (timer.m_lockObject) | ||
128 | { | ||
129 | timer.m_motions.Remove(motion); | ||
92 | } | 130 | } |
93 | } | 131 | } |
94 | } | 132 | } |
@@ -156,6 +194,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
156 | private DataFormat m_data = DataFormat.Translation | DataFormat.Rotation; | 194 | private DataFormat m_data = DataFormat.Translation | DataFormat.Rotation; |
157 | 195 | ||
158 | private bool m_running = false; | 196 | private bool m_running = false; |
197 | |||
159 | [NonSerialized()] | 198 | [NonSerialized()] |
160 | private bool m_selected = false; | 199 | private bool m_selected = false; |
161 | 200 | ||
@@ -163,6 +202,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
163 | 202 | ||
164 | private int m_skipLoops = 0; | 203 | private int m_skipLoops = 0; |
165 | 204 | ||
205 | [NonSerialized()] | ||
206 | private Scene m_scene; | ||
207 | |||
208 | public Scene Scene | ||
209 | { | ||
210 | get { return m_scene; } | ||
211 | } | ||
212 | |||
166 | public DataFormat Data | 213 | public DataFormat Data |
167 | { | 214 | { |
168 | get { return m_data; } | 215 | get { return m_data; } |
@@ -221,8 +268,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
221 | 268 | ||
222 | newMotion.m_group = grp; | 269 | newMotion.m_group = grp; |
223 | 270 | ||
224 | if (grp != null && grp.IsSelected) | 271 | if (grp != null) |
225 | newMotion.m_selected = true; | 272 | { |
273 | newMotion.m_scene = grp.Scene; | ||
274 | if (grp.IsSelected) | ||
275 | newMotion.m_selected = true; | ||
276 | } | ||
226 | 277 | ||
227 | newMotion.m_timerStopped = false; | 278 | newMotion.m_timerStopped = false; |
228 | newMotion.m_isCrossing = false; | 279 | newMotion.m_isCrossing = false; |
@@ -246,6 +297,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
246 | return; | 297 | return; |
247 | 298 | ||
248 | m_group = grp; | 299 | m_group = grp; |
300 | m_scene = grp.Scene; | ||
301 | |||
249 | Vector3 grppos = grp.AbsolutePosition; | 302 | Vector3 grppos = grp.AbsolutePosition; |
250 | Vector3 offset = grppos - m_serializedPosition; | 303 | Vector3 offset = grppos - m_serializedPosition; |
251 | // avoid doing it more than once | 304 | // avoid doing it more than once |
@@ -278,6 +331,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
278 | { | 331 | { |
279 | m_basePosition = grp.AbsolutePosition; | 332 | m_basePosition = grp.AbsolutePosition; |
280 | m_baseRotation = grp.GroupRotation; | 333 | m_baseRotation = grp.GroupRotation; |
334 | m_scene = grp.Scene; | ||
281 | } | 335 | } |
282 | 336 | ||
283 | m_timerStopped = true; | 337 | m_timerStopped = true; |
@@ -297,6 +351,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
297 | KeyframeMotion newmotion = new KeyframeMotion(null, m_mode, m_data); | 351 | KeyframeMotion newmotion = new KeyframeMotion(null, m_mode, m_data); |
298 | 352 | ||
299 | newmotion.m_group = newgrp; | 353 | newmotion.m_group = newgrp; |
354 | newmotion.m_scene = newgrp.Scene; | ||
300 | 355 | ||
301 | if (m_keyframes != null) | 356 | if (m_keyframes != null) |
302 | { | 357 | { |
@@ -482,7 +537,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
482 | } | 537 | } |
483 | } | 538 | } |
484 | 539 | ||
485 | public void OnTimer() | 540 | public void OnTimer(double tickDuration) |
486 | { | 541 | { |
487 | if (m_skipLoops > 0) | 542 | if (m_skipLoops > 0) |
488 | { | 543 | { |
@@ -546,16 +601,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
546 | } | 601 | } |
547 | 602 | ||
548 | m_currentFrame = m_frames[0]; | 603 | m_currentFrame = m_frames[0]; |
549 | m_currentFrame.TimeMS += (int)KeyframeTimer.timerInterval; | 604 | m_currentFrame.TimeMS += (int)tickDuration; |
550 | 605 | ||
551 | //force a update on a keyframe transition | 606 | //force a update on a keyframe transition |
552 | update = true; | 607 | update = true; |
553 | } | 608 | } |
554 | 609 | ||
555 | m_currentFrame.TimeMS -= (int)KeyframeTimer.timerInterval; | 610 | m_currentFrame.TimeMS -= (int)tickDuration; |
556 | 611 | ||
557 | // Do the frame processing | 612 | // Do the frame processing |
558 | double steps = (double)m_currentFrame.TimeMS / KeyframeTimer.timerInterval; | 613 | double steps = (double)m_currentFrame.TimeMS / tickDuration; |
559 | 614 | ||
560 | if (steps <= 0.0) | 615 | if (steps <= 0.0) |
561 | { | 616 | { |