198 lines
6.9 KiB
C++
198 lines
6.9 KiB
C++
#include "viewer/OsgCameraManipulator.h"
|
|
|
|
#include <osgViewer/View>
|
|
|
|
#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<Scenes::EventHandle*>(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<float>(dx), static_cast<float>(dy));
|
|
//const auto type = m_pOsgCameraManipulator->GetType();
|
|
//if (Core::ICameraManipulator::Type::TD_SCENE_ROTATION == type) {
|
|
// rotateWithFixedVertical(static_cast<float>(dx), static_cast<float>(dy));
|
|
//} else if (Core::ICameraManipulator::Type::TD_SCENE_TRANSFORM == type) {
|
|
// double scale = 0.3 * _distance * static_cast<double>(getThrowScale(eventTimeDelta));
|
|
// panModel(static_cast<float>(dx * scale), static_cast<float>(dy * scale));
|
|
//}
|
|
|
|
// if (Core::IScene::OperationType::TD_SCENE != m_pScene->GetOperationType()) {
|
|
// double scale = 0.3 * _distance * static_cast<double>( getThrowScale(eventTimeDelta));
|
|
// panModel(static_cast<float>(dx * scale),
|
|
// static_cast<float>(dy * scale));
|
|
// }
|
|
// else {
|
|
// rotateWithFixedVertical(static_cast<float>(dx),
|
|
// static_cast<float>(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<double>(ea.getX());
|
|
double y = static_cast<double>(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<double>(ea.getX());
|
|
double y = static_cast<double>(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);
|
|
}
|
|
|
|
|