ArcBall.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #ifndef _XBOX
  2. #include "ArcBall.h"
  3. #include "..\..\..\common_h\controls.h"
  4. #define ROTOLIMIT 1.52f
  5. STORM3_ArcBall::STORM3_ArcBall ()
  6. {
  7. Mode = ABM_DISABLED;
  8. Theta = 0.5f;
  9. Phi = 0.785f;
  10. LookTo = Vector(0.0f, 0.0f, 0.0f);
  11. Scale = 20.0f;
  12. iCurMouseX = 0;
  13. iCurMouseY = 0;
  14. RotateSensitivity ();
  15. ScaleSensitivity ();
  16. MoveSensitivity ();
  17. }
  18. STORM3_ArcBall::~STORM3_ArcBall ()
  19. {
  20. }
  21. bool STORM3_ArcBall::HandleMessages( unsigned int uMsg, int MouseX, int MouseY )
  22. {
  23. // Current screen mouse position
  24. int iMouseX = MouseX;
  25. int iMouseY = MouseY;
  26. if (!GetAsyncKeyState (VK_MENU) && uMsg == WM_LBUTTONDOWN) return false;
  27. switch (uMsg)
  28. {
  29. case WM_LBUTTONDOWN:
  30. Mode = ABM_ROTATE;
  31. iCurMouseX = iMouseX;
  32. iCurMouseY = iMouseY;
  33. return false;
  34. case WM_RBUTTONDOWN:
  35. Mode = ABM_SCALE;
  36. iCurMouseX = iMouseX;
  37. iCurMouseY = iMouseY;
  38. return false;
  39. case WM_MBUTTONDOWN:
  40. Mode = ABM_MOVE;
  41. iCurMouseX = iMouseX;
  42. iCurMouseY = iMouseY;
  43. return false;
  44. case WM_LBUTTONUP:
  45. Mode = ABM_DISABLED;
  46. return false;
  47. case WM_RBUTTONUP:
  48. Mode = ABM_DISABLED;
  49. return false;
  50. case WM_MBUTTONUP:
  51. Mode = ABM_DISABLED;
  52. return false;
  53. case WM_MOUSEMOVE:
  54. {
  55. if (Mode != ABM_DISABLED)
  56. {
  57. ProcessMouseMove (iMouseX, iMouseY);
  58. iCurMouseX = iMouseX;
  59. iCurMouseY = iMouseY;
  60. return true;
  61. }
  62. return false;
  63. }
  64. }
  65. return false;
  66. }
  67. void STORM3_ArcBall::ProcessMouseMove (int iMouseX, int iMouseY)
  68. {
  69. if (Mode == ABM_DISABLED) return;
  70. float fDeltaX = (float)( iCurMouseX-iMouseX );
  71. float fDeltaY = (float)( iCurMouseY-iMouseY );
  72. if (Mode == ABM_ROTATE)
  73. {
  74. Phi -= (fDeltaX * RotateSens);
  75. Theta -= (fDeltaY * RotateSens);
  76. if (Theta < -ROTOLIMIT) Theta = -ROTOLIMIT;
  77. if (Theta > ROTOLIMIT) Theta = ROTOLIMIT;
  78. }
  79. if (Mode == ABM_MOVE)
  80. {
  81. float StrafeSpeed = fabs (fDeltaX) * 0.0015f * Scale;
  82. float ElevationSpeed = fabs (fDeltaY) * 0.0015f * Scale;
  83. Vector Strafe(0.0f, 0.0f, 0.0f);
  84. Strafe.x = cos(Phi)*StrafeSpeed;
  85. Strafe.z = -sin(Phi)*StrafeSpeed;
  86. if (fDeltaX > 0) Strafe = -Strafe;
  87. if (fDeltaY > 0) ElevationSpeed = -ElevationSpeed;
  88. Strafe.y = ElevationSpeed;
  89. LookTo += Strafe;
  90. }
  91. if (Mode == ABM_SCALE)
  92. {
  93. float ScaleFactor = fDeltaY + fDeltaX;
  94. ScaleFactor /= ScaleSens;
  95. float Sign = ScaleFactor;
  96. ScaleFactor = 1.0f + fabs(ScaleFactor);
  97. if (Sign < 0) ScaleFactor = 1.0f / ScaleFactor;
  98. Scale *= ScaleFactor;
  99. }
  100. }
  101. ArcBallMode STORM3_ArcBall::GetMode ()
  102. {
  103. return Mode;
  104. }
  105. void STORM3_ArcBall::BuildViewMatrix (Matrix& matView)
  106. {
  107. float deltaX = sin(Phi) * Scale;
  108. float deltaZ = cos(Phi) * Scale;
  109. float deltaY = sin(Theta) * Scale;
  110. float NormalK = cos (Theta);
  111. deltaX *= NormalK;
  112. deltaZ *= NormalK;
  113. Vector LookFrom = LookTo;
  114. LookFrom += Vector (deltaX, deltaY, deltaZ);
  115. Vector vecUp(0, 1, 0);
  116. matView.BuildView(LookFrom, LookTo, vecUp);
  117. }
  118. void STORM3_ArcBall::SetScale (float _Scale)
  119. {
  120. Scale = _Scale;
  121. }
  122. void STORM3_ArcBall::SetTheta (float _Theta)
  123. {
  124. Theta = _Theta;
  125. }
  126. void STORM3_ArcBall::SetPhi (float _Phi)
  127. {
  128. Phi = _Phi;
  129. }
  130. void STORM3_ArcBall::RotateSensitivity (float value)
  131. {
  132. RotateSens = value;
  133. }
  134. void STORM3_ArcBall::ScaleSensitivity (float value)
  135. {
  136. ScaleSens = value;
  137. }
  138. void STORM3_ArcBall::MoveSensitivity (float value)
  139. {
  140. MoveSens = value;
  141. }
  142. #endif