CameraManager.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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 = NULL;
  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 ) || InputManager::getSingleton().IsButtonPressed( OIS::KC_LSHIFT ) )
  42. {
  43. speed *= 4;
  44. }
  45. if (event.type == QGears::ET_KEY_IMPULSE && event.param1 == OIS::KC_W)
  46. {
  47. m_Camera->moveRelative( Ogre::Vector3( 0, 0, -speed ) );
  48. }
  49. else if (event.type == QGears::ET_KEY_IMPULSE && event.param1 == OIS::KC_A)
  50. {
  51. m_Camera->moveRelative( Ogre::Vector3( -speed, 0, 0 ) );
  52. }
  53. else if (event.type == QGears::ET_KEY_IMPULSE && event.param1 == OIS::KC_S)
  54. {
  55. m_Camera->moveRelative( Ogre::Vector3( 0, 0, speed ) );
  56. }
  57. else if (event.type == QGears::ET_KEY_IMPULSE && event.param1 == OIS::KC_D)
  58. {
  59. m_Camera->moveRelative( Ogre::Vector3( speed, 0, 0 ) );
  60. }
  61. else if (event.type == QGears::ET_MOUSE_PRESS && event.param1 == OIS::MB_Right)
  62. {
  63. m_CameraFreeRotate = true;
  64. }
  65. else if (event.type == QGears::ET_MOUSE_RELEASE && event.param1 == OIS::MB_Right)
  66. {
  67. m_CameraFreeRotate = false;
  68. }
  69. else if (event.type == QGears::ET_MOUSE_MOVE && m_CameraFreeRotate == true)
  70. {
  71. m_Camera->rotate( Ogre::Vector3::UNIT_Z, Ogre::Radian( Ogre::Degree( -event.param1 * 0.13f ) ) );
  72. m_Camera->pitch( Ogre::Degree( -event.param2 * 0.13f ) );
  73. }
  74. }
  75. }
  76. void
  77. CameraManager::Update()
  78. {
  79. }
  80. void
  81. CameraManager::OnResize()
  82. {
  83. m_Camera->setAspectRatio( Ogre::Real( m_Viewport->getActualWidth() ) / Ogre::Real( m_Viewport->getActualHeight() ) );
  84. }
  85. void
  86. CameraManager::SetCameraFree( const bool enable )
  87. {
  88. m_CameraFree = enable;
  89. if( m_CameraFree == true )
  90. {
  91. m_Camera->resetFrustumExtents();
  92. CameraManager::getSingleton().GetCurrentCamera()->setFOVy( Ogre::Radian( Ogre::Math::PI / 4.0f ) );
  93. }
  94. else
  95. {
  96. CameraManager::getSingleton().GetCurrentCamera()->setPosition( m_2DPosition );
  97. CameraManager::getSingleton().GetCurrentCamera()->setOrientation( m_2DOrientation );
  98. CameraManager::getSingleton().GetCurrentCamera()->setFOVy( m_2DFOV );
  99. Set2DScroll( Get2DScroll() );
  100. }
  101. }
  102. void
  103. CameraManager::Set2DCamera( const Ogre::Vector3 position, const Ogre::Quaternion orientation, const Ogre::Radian fov )
  104. {
  105. m_2DPosition = position;
  106. m_2DOrientation = orientation;
  107. m_2DFOV = fov;
  108. CameraManager::getSingleton().GetCurrentCamera()->setPosition( m_2DPosition );
  109. CameraManager::getSingleton().GetCurrentCamera()->setOrientation( m_2DOrientation );
  110. CameraManager::getSingleton().GetCurrentCamera()->setFOVy( m_2DFOV );
  111. Set2DScroll( Ogre::Vector2::ZERO );
  112. }
  113. void
  114. CameraManager::Set2DScroll( const Ogre::Vector2& position )
  115. {
  116. m_2DScroll = position;
  117. if( m_CameraFree == true )
  118. {
  119. return;
  120. }
  121. float width = static_cast<float>(m_Viewport->getActualWidth());
  122. float height = static_cast<float>(m_Viewport->getActualHeight());
  123. float left, right, top, bottom;
  124. m_Camera->resetFrustumExtents();
  125. m_Camera->getFrustumExtents( left, right, top, bottom );
  126. float move_x = ( ( right - left ) / width ) * position.x;
  127. float move_y = ( ( bottom - top ) / height ) * -position.y;
  128. m_Camera->setFrustumExtents( left - move_x, right - move_x, top + move_y, bottom + move_y );
  129. }
  130. const Ogre::Vector2&
  131. CameraManager::Get2DScroll() const
  132. {
  133. return m_2DScroll;
  134. }
  135. const Ogre::Vector3
  136. CameraManager::ProjectPointToScreen( const Ogre::Vector3& point )
  137. {
  138. Ogre::Vector3 view = m_Camera->getViewMatrix() * point;
  139. float z = view.z;
  140. view = m_Camera->getProjectionMatrix() * view;
  141. view.z = z;
  142. float width = static_cast<float>(m_Viewport->getActualWidth() / 2);
  143. float height = static_cast<float>(m_Viewport->getActualHeight() / 2);
  144. view.x = width + view.x * width;
  145. view.y = height - view.y * height;
  146. return view;
  147. }
  148. Ogre::Camera*
  149. CameraManager::GetCurrentCamera()
  150. {
  151. return m_Camera;
  152. }
  153. Ogre::Viewport*
  154. CameraManager::getViewport()
  155. {
  156. return m_Viewport;
  157. }
  158. void CameraManager::EnableWireFrame(bool)
  159. {
  160. if ( m_Camera )
  161. {
  162. //m_Camera->setPolygonMode(Ogre::PM_WIREFRAME);
  163. // m_Camera->rotate( Ogre::Vector3::UNIT_Z, Ogre::Radian( Ogre::Degree( 180 ) ) );
  164. m_Camera->setFarClipDistance(900000000);
  165. }
  166. }