RotationController.cs
上传用户:huazai0421
上传日期:2008-05-30
资源大小:405k
文件大小:3k
源码类别:

SilverLight

开发平台:

C#

  1. // Silver.Globe, version 0.11 for Silverlight 1.1 Alpha
  2. // Copyright © Florian Krüsch (xaml-kru.com)
  3. // xaml-kru.com/silverglobe
  4. // This source is subject to the Microsoft Public License (Ms-PL).
  5. // See http://www.microsoft.com/resources/sharedsource/licensingbasics/publiclicense.mspx.
  6. // All other rights reserved.
  7. using System;
  8. using System.Windows.Threading;
  9. using SilverGlobe.Data;
  10. namespace SilverGlobe
  11. {
  12.     /// <summary>
  13.     /// RotationController .
  14.     /// </summary>
  15.     internal sealed class RotationController
  16.     {
  17.         #region Members
  18.         private RotationMode _currentMode = RotationMode.None;
  19. private DispatcherTimer _timer;
  20.         private EaseOutRotationController _easeOutController;
  21.         private MouseRotationController _mouseController;
  22.         private SlerpController _slerpController;
  23.         #endregion
  24.         #region Properties
  25.         /// <summary>
  26.         /// Returns true, if currently a quaternion slerp is performed on the globe.
  27.         /// </summary>
  28.         public Boolean DoesLocationAnimation
  29.         {
  30.             get { return _currentMode == RotationMode.Slerp; }
  31.         }
  32.         #endregion
  33.         #region Constructor
  34.         public RotationController(Globe globe, DispatcherTimer timer)
  35.         {
  36.             _easeOutController = new EaseOutRotationController(globe);
  37.             _mouseController = new MouseRotationController(globe);
  38.             _slerpController = new SlerpController(globe);
  39. _slerpController.SlerpCompleted += Slerp_Completed;
  40. _timer = timer;
  41.         }
  42.         #endregion
  43.         #region Methods
  44.         /// <summary>
  45.         /// Let the current rotation controller update its values
  46.         /// </summary>
  47.         public void Update()
  48.         {
  49.             switch (_currentMode)
  50.             {
  51.                 case RotationMode.EaseOut:
  52.                     _easeOutController.Update();
  53.                     break;
  54.                 case RotationMode.Slerp:
  55.                     _slerpController.Update();
  56.                     break;
  57.             }
  58.         }
  59.         /// <summary>
  60.         /// Animate the globe to a given geographical position.
  61.         /// </summary>
  62.         public void AnimateTo(GeoPosition position)
  63.         {
  64.             _currentMode = RotationMode.Slerp;
  65.             _mouseController.End();
  66.             _slerpController.Init(position.GetQuaternion());
  67.         }
  68.         /// <summary>
  69.         /// Bind the globe's rotation to the mouse.
  70.         /// </summary>
  71.         public void BindToMousePosition()
  72.         {
  73.             _currentMode = RotationMode.Mouse;
  74.             _mouseController.Init();
  75.         }
  76.         /// <summary>
  77.         /// Ease out the current globe rotation
  78.         /// </summary>
  79.         public void EaseOut()
  80.         {
  81.             _currentMode = RotationMode.EaseOut;
  82.                         
  83.             _mouseController.End();
  84.             _easeOutController.Init(_mouseController.Axis, _mouseController.GetSpeed());
  85.         }
  86.         /// <summary>
  87.         /// Stop all rotations.
  88.         /// </summary>
  89.         public void Stop()
  90.         {
  91.             _currentMode = RotationMode.None;
  92.             _mouseController.End();
  93. _timer.Stop();
  94.         }
  95.         #endregion
  96.         #region Implementation
  97.         private void Slerp_Completed(Object sender, EventArgs e)
  98.         {
  99.             Stop();
  100.         }
  101.         #endregion   
  102.     }
  103. }