#include "viewer/OsgCameraManipulator.h" #include #include "common/SpdLogger.h" OsgCameraManipulator::OsgCameraManipulator(osgGA::CameraManipulator* manipulator, QObject* parent) noexcept : QObject(parent) , sceneManip_(manipulator) { LOG_INFO("actor, self={}", fmt::ptr(this)); if (nullptr == sceneManip_) { sceneManip_ = new OsgSceneManipulator; } } OsgCameraManipulator::~OsgCameraManipulator() { LOG_INFO("dctor, self={}", fmt::ptr(this)); } void OsgCameraManipulator::Initialize(void) { if (initialized_) { return; } initialized_ = true; //sceneManip_->SetSceneManipulator(this); } void OsgCameraManipulator::Uninitialize(void) { if (!initialized_) { return; } //sceneManip_->SetSceneManipulator(nullptr); initialized_ = false; } void OsgCameraManipulator::SetHomePosition(const osg::Vec3& eye, const osg::Vec3& center, const osg::Vec3& up) { assert(nullptr != sceneManip_); sceneManip_->setHomePosition(eye, center, up); } //void OsgCameraManipulator::TrackNode(osg::Node* node) { // assert(nullptr != sceneManip_); // sceneManip_->setTrackNode(node); //} osgGA::CameraManipulator* OsgCameraManipulator::GetManipulator(void) const { return sceneManip_.get(); } //void OsgCameraManipulator::SetEventHandle(Core::IEventHandle* pEventHandle) { // if (nullptr == m_pSceneManip) { // return; // } // m_pSceneManip->SetEventHandle(pEventHandle); //} // //Core::IEventHandle* OsgCameraManipulator::GetEventHandle() const { // if (nullptr == m_pSceneManip) { // return nullptr; // } // return m_pSceneManip->GetEventHandle(); //} //void OsgCameraManipulator::OnManipulatorOperation(Core::Message* pMessage) { // Core::GetObjectValueFromObjectBridge(pMessage->GetBody(), m_type); //} ////////////////////////////////////////////////////////////////////// OsgSceneManipulator::OsgSceneManipulator(void) : osgGA::TrackballManipulator() {} void OsgSceneManipulator::setByMatrix(const osg::Matrixd& matrix) { _center = osg::Vec3d(0.0, 0.0, -_distance) * matrix; _rotation = matrix.getRotate(); } void OsgSceneManipulator::setByInverseMatrix(const osg::Matrixd& matrix) { setByMatrix(osg::Matrix::inverse(matrix)); } osg::Matrixd OsgSceneManipulator::getMatrix() const { return osg::Matrixd::translate(0.0, 0.0, -_distance) * osg::Matrixd::rotate(_rotation) * osg::Matrixd::translate(_center); } osg::Matrixd OsgSceneManipulator::getInverseMatrix() const { return osg::Matrixd::translate(_center) * osg::Matrixd::rotate(_rotation.inverse()) * osg::Matrixd::translate(0.0, 0.0, -_distance); } //void OsgSceneManipulator::SetEventHandle(Core::IEventHandle* pEventHandle) { // m_pEventHandle = dynamic_cast(pEventHandle); //} //Core::IEventHandle* OsgSceneManipulator::GetEventHandle() const { // return m_pEventHandle.Get(); //} OsgSceneManipulator::~OsgSceneManipulator() {} bool OsgSceneManipulator::performMovementLeftMouseButton(const double eventTimeDelta, const double dx, const double dy) { rotateWithFixedVertical(static_cast(dx), static_cast(dy)); //const auto type = m_pOsgCameraManipulator->GetType(); //if (Core::ICameraManipulator::Type::TD_SCENE_ROTATION == type) { // rotateWithFixedVertical(static_cast(dx), static_cast(dy)); //} else if (Core::ICameraManipulator::Type::TD_SCENE_TRANSFORM == type) { // double scale = 0.3 * _distance * static_cast(getThrowScale(eventTimeDelta)); // panModel(static_cast(dx * scale), static_cast(dy * scale)); //} // if (Core::IScene::OperationType::TD_SCENE != m_pScene->GetOperationType()) { // double scale = 0.3 * _distance * static_cast( getThrowScale(eventTimeDelta)); // panModel(static_cast(dx * scale), // static_cast(dy * scale)); // } // else { // rotateWithFixedVertical(static_cast(dx), // static_cast(dy)); // } return true; } bool OsgSceneManipulator::handleKeyDown(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us) { //if (osgGA::GUIEventAdapter::KEY_Alt_L == ea.getKey() || // osgGA::GUIEventAdapter::KEY_Alt_R == ea.getKey()) {/* // Core::GloabMessageSend(EM_MANIPULATOR_OPERATION, // Core::ICameraManipulator::Type::TD_SCENE_ROTATION);*/ // return true; //} else if (osgGA::GUIEventAdapter::KEY_Q == ea.getKey()) { // Core::GloabMessageSend(EM_MANIPULATOR_OPERATION, // Core::ICameraManipulator::Type::TD_SCENE_TRANSFORM); // return true; //} else if (osgGA::GUIEventAdapter::KEY_W == ea.getKey()) { // Core::GloabMessageSend(EM_MANIPULATOR_OPERATION, Core::ICameraManipulator::Type::TD_TRANSFORM); // return true; //} else if (osgGA::GUIEventAdapter::KEY_E == ea.getKey()) { // Core::GloabMessageSend(EM_MANIPULATOR_OPERATION, Core::ICameraManipulator::Type::TD_ROTATION); // return true; //} else if (osgGA::GUIEventAdapter::KEY_R == ea.getKey()) { // Core::GloabMessageSend(EM_MANIPULATOR_OPERATION, Core::ICameraManipulator::Type::TD_SCALE); // return true; //} return osgGA::TrackballManipulator::handleKeyDown(ea, us); } bool OsgSceneManipulator::handleKeyUp(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us) { //if (osgGA::GUIEventAdapter::KEY_Alt_L == ea.getKey() // || osgGA::GUIEventAdapter::KEY_Alt_R == ea.getKey()) { // Core::GloabMessageSend(EM_MANIPULATOR_OPERATION, Core::ICameraManipulator::Type::TD_TRANSFORM); //} return osgGA::TrackballManipulator::handleKeyUp(ea, us); } bool OsgSceneManipulator::handleMousePush(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us) { //if (nullptr == m_pEventHandle) { // return false; //} double x = static_cast(ea.getX()); double y = static_cast(ea.getY()); auto button = ea.getButton(); switch (button) { //case osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON: { // m_pEventHandle->LButtonDown(x, y); //}break; default: break; } return osgGA::TrackballManipulator::handleMousePush(ea, us); } bool OsgSceneManipulator::handleMouseRelease(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& us) { //if (nullptr == m_pEventHandle) { // return false; //} double x = static_cast(ea.getX()); double y = static_cast(ea.getY()); auto button = ea.getButton(); switch (button) { /* case osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON: { m_pEventHandle->LButtonRelease(x, y); }*/ break; default: break; } return osgGA::TrackballManipulator::handleMousePush(ea, us); }