| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- #include <OgreRenderWindow.h>
- #include <OgreRoot.h>
- #include <OIS.h>
- #include "core/CameraManager.h"
- #include "core/CameraManagerCommands.h"
- #include "common/QGearsApplication.h"
- #include "core/ConfigVar.h"
- #include "core/InputManager.h"
- #include "core/Logger.h"
- ConfigVar cv_cam_speed("camera_speed", "Camera speed", "0.02");
- template<>CameraManager* Ogre::Singleton<CameraManager>::msSingleton = nullptr;
- CameraManager::CameraManager():
- m_CameraFree(false),
- m_CameraFreeRotate(false),
- m_2DPosition(Ogre::Vector3::ZERO),
- m_2DOrientation(Ogre::Quaternion::ZERO),
- m_2DFOV(0),
- m_2DScroll(Ogre::Vector2::ZERO)
- {
- LOG_TRIVIAL("CameraManager started.");
- InitCommands();
- m_Camera = Ogre::Root::getSingleton().getSceneManager("Scene")->createCamera("Camera");
- m_Camera->setNearClipDistance(0.001f);
- m_Camera->setFarClipDistance(1000.0f);
- m_Camera->setPosition(Ogre::Vector3(0, 0, 0));
- m_Camera->lookAt(Ogre::Vector3(0, 0, 0));
- m_Viewport = QGears::Application::getSingleton().getRenderWindow()->addViewport(m_Camera, 0);
- m_Viewport->setBackgroundColour(Ogre::ColourValue(0, 0, 0));
- m_Camera->setAspectRatio(Ogre::Real(m_Viewport->getActualWidth()) / Ogre::Real(m_Viewport->getActualHeight()));
- }
- CameraManager::~CameraManager()
- {
- LOG_TRIVIAL("CameraManager finished.");
- }
- void
- CameraManager::Input(const QGears::Event& event, Ogre::Real timeSinceLastFrame)
- {
- if(m_CameraFree == true)
- {
- float speed = cv_cam_speed.GetF() * timeSinceLastFrame;
- if(InputManager::getSingleton().IsButtonPressed(OIS::KC_RSHIFT)
- || InputManager::getSingleton().IsButtonPressed(OIS::KC_LSHIFT))
- {
- speed *= 4;
- }
- if (event.type == QGears::ET_KEY_IMPULSE && event.param1 == OIS::KC_W)
- {
- m_Camera->moveRelative(Ogre::Vector3(0, 0, -speed));
- }
- else if (event.type == QGears::ET_KEY_IMPULSE
- && event.param1 == OIS::KC_A)
- {
- m_Camera->moveRelative(Ogre::Vector3(-speed, 0, 0));
- }
- else if (event.type == QGears::ET_KEY_IMPULSE
- && event.param1 == OIS::KC_S)
- {
- m_Camera->moveRelative(Ogre::Vector3(0, 0, speed));
- }
- else if (event.type == QGears::ET_KEY_IMPULSE
- && event.param1 == OIS::KC_D)
- {
- m_Camera->moveRelative(Ogre::Vector3(speed, 0, 0));
- }
- else if (event.type == QGears::ET_MOUSE_PRESS
- && event.param1 == OIS::MB_Right)
- {
- m_CameraFreeRotate = true;
- }
- else if (event.type == QGears::ET_MOUSE_RELEASE
- && event.param1 == OIS::MB_Right)
- {
- m_CameraFreeRotate = false;
- }
- else if (event.type == QGears::ET_MOUSE_MOVE
- && m_CameraFreeRotate == true)
- {
- m_Camera->rotate(Ogre::Vector3::UNIT_Z,
- Ogre::Radian(Ogre::Degree(-event.param1 * 0.13f)));
- m_Camera->pitch(Ogre::Degree(-event.param2 * 0.13f));
- }
- }
- }
- void
- CameraManager::Update()
- {
- }
- void
- CameraManager::OnResize()
- {
- m_Camera->setAspectRatio(Ogre::Real(m_Viewport->getActualWidth())
- / Ogre::Real(m_Viewport->getActualHeight()));
- }
- void
- CameraManager::SetCameraFree(const bool enable)
- {
- m_CameraFree = enable;
- if(m_CameraFree == true)
- {
- m_Camera->resetFrustumExtents();
- CameraManager::getSingleton().GetCurrentCamera()->setFOVy(Ogre::Radian(Ogre::Math::PI / 4.0f));
- }
- else
- {
- CameraManager::getSingleton().GetCurrentCamera()->setPosition(m_2DPosition);
- CameraManager::getSingleton().GetCurrentCamera()->setOrientation(m_2DOrientation);
- CameraManager::getSingleton().GetCurrentCamera()->setFOVy(m_2DFOV);
- Set2DScroll(Get2DScroll());
- }
- }
- void
- CameraManager::Set2DCamera(const Ogre::Vector3 position, const Ogre::Quaternion orientation, const Ogre::Radian fov)
- {
- m_2DPosition = position;
- m_2DOrientation = orientation;
- m_2DFOV = fov;
- CameraManager::getSingleton().GetCurrentCamera()->setPosition(m_2DPosition);
- CameraManager::getSingleton().GetCurrentCamera()->setOrientation(m_2DOrientation);
- CameraManager::getSingleton().GetCurrentCamera()->setFOVy(m_2DFOV);
- Set2DScroll(Ogre::Vector2::ZERO);
- }
- void
- CameraManager::Set2DScroll(const Ogre::Vector2& position)
- {
- m_2DScroll = position;
- if(m_CameraFree == true)
- {
- return;
- }
- float width = static_cast<float>(m_Viewport->getActualWidth());
- float height = static_cast<float>(m_Viewport->getActualHeight());
- float left, right, top, bottom;
- m_Camera->resetFrustumExtents();
- m_Camera->getFrustumExtents(left, right, top, bottom);
- float move_x = ((right - left) / width) * position.x;
- float move_y = ((bottom - top) / height) * -position.y;
- m_Camera->setFrustumExtents(left - move_x, right - move_x,
- top + move_y, bottom + move_y);
- }
- const Ogre::Vector2&
- CameraManager::Get2DScroll() const
- {
- return m_2DScroll;
- }
- const Ogre::Vector3
- CameraManager::ProjectPointToScreen(const Ogre::Vector3& point)
- {
- Ogre::Vector3 view = m_Camera->getViewMatrix() * point;
- float z = view.z;
- view = m_Camera->getProjectionMatrix() * view;
- view.z = z;
- float width = static_cast<float>(m_Viewport->getActualWidth() / 2);
- float height = static_cast<float>(m_Viewport->getActualHeight() / 2);
- view.x = width + view.x * width;
- view.y = height - view.y * height;
- return view;
- }
- Ogre::Camera*
- CameraManager::GetCurrentCamera()
- {
- return m_Camera;
- }
- Ogre::Viewport*
- CameraManager::getViewport()
- {
- return m_Viewport;
- }
- void CameraManager::EnableWireFrame(bool)
- {
- if (m_Camera)
- {
- //m_Camera->setPolygonMode(Ogre::PM_WIREFRAME);
- // m_Camera->rotate( Ogre::Vector3::UNIT_Z, Ogre::Radian( Ogre::Degree( 180 ) ) );
- m_Camera->setFarClipDistance(900000000);
- }
- }
|