DYTSrouce/src/viewer/OsgCameraManipulator.cpp
2025-01-04 12:12:51 +08:00

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);
}