#pragma once
#include <config.h>
#ifdef HAVE_OSG
#include "GUIOSGHeader.h"
class GUIOSGView;
enum ManipulatorMode {
MODE_EGO = 0,
MODE_WALK,
MODE_TERRAIN
};
class GUIOSGManipulator : public osgGA::TerrainManipulator {
public:
GUIOSGManipulator(GUIOSGView* parent, ManipulatorMode initMode = MODE_TERRAIN, bool verticalFixed = true, double eyeHeight = 1.7);
~GUIOSGManipulator();
bool performMovementLeftMouseButton(const double eventTimeDelta, const double dx, const double dy) override;
bool performMovementMiddleMouseButton(const double eventTimeDelta, const double dx, const double dy) override;
bool performMovementRightMouseButton(const double eventTimeDelta, const double dx, const double dy) override;
bool performMouseDeltaMovement(const float dx, const float dy) override;
bool handleMouseMove(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) override;
bool handleMouseDrag(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) override;
bool handleMousePush(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) override;
bool handleMouseRelease(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) override;
bool handleMouseDeltaMovement(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) override;
bool handleKeyDown(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) override;
bool handleKeyUp(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) override;
void rotateYawPitch(osg::Quat& rotation, const double yaw, const double pitch, const osg::Vec3d& localUp);
void setByMatrix(const osg::Matrixd& matrix) override;
osg::Matrixd getMatrix() const override;
osg::Matrixd getInverseMatrix() const override;
void updateHUDText();
protected:
void centerMousePointer(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) override;
private:
GUIOSGManipulator() = delete;
GUIOSGManipulator(const GUIOSGManipulator& g);
private:
GUIOSGView* myParent;
ManipulatorMode myCurrentMode;
double myMoveSpeed;
osg::Vec3d myMove;
};
#endif