CameraManager.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #include <OgreRenderWindow.h>
  2. #include <OgreRoot.h>
  3. #include <OIS.h>
  4. #include "core/CameraManager.h"
  5. #include "core/CameraManagerCommands.h"
  6. #include "common/QGearsApplication.h"
  7. #include "core/ConfigVar.h"
  8. #include "core/InputManager.h"
  9. #include "core/Logger.h"
  10. ConfigVar cv_cam_speed("camera_speed", "Camera speed", "0.02");
  11. template<>CameraManager* Ogre::Singleton<CameraManager>::msSingleton = nullptr;
  12. CameraManager::CameraManager():
  13. m_CameraFree(false),
  14. m_CameraFreeRotate(false),
  15. m_2DPosition(Ogre::Vector3::ZERO),
  16. m_2DOrientation(Ogre::Quaternion::ZERO),
  17. m_2DFOV(0),
  18. m_2DScroll(Ogre::Vector2::ZERO)
  19. {
  20. LOG_TRIVIAL("CameraManager started.");
  21. InitCommands();
  22. m_Camera = Ogre::Root::getSingleton().getSceneManager("Scene")->createCamera("Camera");
  23. m_Camera->setNearClipDistance(0.001f);
  24. m_Camera->setFarClipDistance(1000.0f);
  25. m_Camera->setPosition(Ogre::Vector3(0, 0, 0));
  26. m_Camera->lookAt(Ogre::Vector3(0, 0, 0));
  27. m_Viewport = QGears::Application::getSingleton().getRenderWindow()->addViewport(m_Camera, 0);
  28. m_Viewport->setBackgroundColour(Ogre::ColourValue(0, 0, 0));
  29. m_Camera->setAspectRatio(Ogre::Real(m_Viewport->getActualWidth()) / Ogre::Real(m_Viewport->getActualHeight()));
  30. }
  31. CameraManager::~CameraManager()
  32. {
  33. LOG_TRIVIAL("CameraManager finished.");
  34. }
  35. void
  36. CameraManager::Input(const QGears::Event& event, Ogre::Real timeSinceLastFrame)
  37. {
  38. if(m_CameraFree == true)
  39. {
  40. float speed = cv_cam_speed.GetF() * timeSinceLastFrame;
  41. if(InputManager::getSingleton().IsButtonPressed(OIS::KC_RSHIFT)
  42. || InputManager::getSingleton().IsButtonPressed(OIS::KC_LSHIFT))
  43. {
  44. speed *= 4;
  45. }
  46. if (event.type == QGears::ET_KEY_IMPULSE && event.param1 == OIS::KC_W)
  47. {
  48. m_Camera->moveRelative(Ogre::Vector3(0, 0, -speed));
  49. }
  50. else if (event.type == QGears::ET_KEY_IMPULSE
  51. && event.param1 == OIS::KC_A)
  52. {
  53. m_Camera->moveRelative(Ogre::Vector3(-speed, 0, 0));
  54. }
  55. else if (event.type == QGears::ET_KEY_IMPULSE
  56. && event.param1 == OIS::KC_S)
  57. {
  58. m_Camera->moveRelative(Ogre::Vector3(0, 0, speed));
  59. }
  60. else if (event.type == QGears::ET_KEY_IMPULSE
  61. && event.param1 == OIS::KC_D)
  62. {
  63. m_Camera->moveRelative(Ogre::Vector3(speed, 0, 0));
  64. }
  65. else if (event.type == QGears::ET_MOUSE_PRESS
  66. && event.param1 == OIS::MB_Right)
  67. {
  68. m_CameraFreeRotate = true;
  69. }
  70. else if (event.type == QGears::ET_MOUSE_RELEASE
  71. && event.param1 == OIS::MB_Right)
  72. {
  73. m_CameraFreeRotate = false;
  74. }
  75. else if (event.type == QGears::ET_MOUSE_MOVE
  76. && m_CameraFreeRotate == true)
  77. {
  78. m_Camera->rotate(Ogre::Vector3::UNIT_Z,
  79. Ogre::Radian(Ogre::Degree(-event.param1 * 0.13f)));
  80. m_Camera->pitch(Ogre::Degree(-event.param2 * 0.13f));
  81. }
  82. }
  83. }
  84. void
  85. CameraManager::Update()
  86. {
  87. }
  88. void
  89. CameraManager::OnResize()
  90. {
  91. m_Camera->setAspectRatio(Ogre::Real(m_Viewport->getActualWidth())
  92. / Ogre::Real(m_Viewport->getActualHeight()));
  93. }
  94. void
  95. CameraManager::SetCameraFree(const bool enable)
  96. {
  97. m_CameraFree = enable;
  98. if(m_CameraFree == true)
  99. {
  100. m_Camera->resetFrustumExtents();
  101. CameraManager::getSingleton().GetCurrentCamera()->setFOVy(Ogre::Radian(Ogre::Math::PI / 4.0f));
  102. }
  103. else
  104. {
  105. CameraManager::getSingleton().GetCurrentCamera()->setPosition(m_2DPosition);
  106. CameraManager::getSingleton().GetCurrentCamera()->setOrientation(m_2DOrientation);
  107. CameraManager::getSingleton().GetCurrentCamera()->setFOVy(m_2DFOV);
  108. Set2DScroll(Get2DScroll());
  109. }
  110. }
  111. void
  112. CameraManager::Set2DCamera(const Ogre::Vector3 position, const Ogre::Quaternion orientation, const Ogre::Radian fov)
  113. {
  114. m_2DPosition = position;
  115. m_2DOrientation = orientation;
  116. m_2DFOV = fov;
  117. CameraManager::getSingleton().GetCurrentCamera()->setPosition(m_2DPosition);
  118. CameraManager::getSingleton().GetCurrentCamera()->setOrientation(m_2DOrientation);
  119. CameraManager::getSingleton().GetCurrentCamera()->setFOVy(m_2DFOV);
  120. Set2DScroll(Ogre::Vector2::ZERO);
  121. }
  122. void
  123. CameraManager::Set2DScroll(const Ogre::Vector2& position)
  124. {
  125. m_2DScroll = position;
  126. if(m_CameraFree == true)
  127. {
  128. return;
  129. }
  130. float width = static_cast<float>(m_Viewport->getActualWidth());
  131. float height = static_cast<float>(m_Viewport->getActualHeight());
  132. float left, right, top, bottom;
  133. m_Camera->resetFrustumExtents();
  134. m_Camera->getFrustumExtents(left, right, top, bottom);
  135. float move_x = ((right - left) / width) * position.x;
  136. float move_y = ((bottom - top) / height) * -position.y;
  137. m_Camera->setFrustumExtents(left - move_x, right - move_x,
  138. top + move_y, bottom + move_y);
  139. }
  140. const Ogre::Vector2&
  141. CameraManager::Get2DScroll() const
  142. {
  143. return m_2DScroll;
  144. }
  145. const Ogre::Vector3
  146. CameraManager::ProjectPointToScreen(const Ogre::Vector3& point)
  147. {
  148. Ogre::Vector3 view = m_Camera->getViewMatrix() * point;
  149. float z = view.z;
  150. view = m_Camera->getProjectionMatrix() * view;
  151. view.z = z;
  152. float width = static_cast<float>(m_Viewport->getActualWidth() / 2);
  153. float height = static_cast<float>(m_Viewport->getActualHeight() / 2);
  154. view.x = width + view.x * width;
  155. view.y = height - view.y * height;
  156. return view;
  157. }
  158. Ogre::Camera*
  159. CameraManager::GetCurrentCamera()
  160. {
  161. return m_Camera;
  162. }
  163. Ogre::Viewport*
  164. CameraManager::getViewport()
  165. {
  166. return m_Viewport;
  167. }
  168. void CameraManager::EnableWireFrame(bool)
  169. {
  170. if (m_Camera)
  171. {
  172. //m_Camera->setPolygonMode(Ogre::PM_WIREFRAME);
  173. // m_Camera->rotate( Ogre::Vector3::UNIT_Z, Ogre::Radian( Ogre::Degree( 180 ) ) );
  174. m_Camera->setFarClipDistance(900000000);
  175. }
  176. }