-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathquickosgviewer.h
121 lines (100 loc) · 4.26 KB
/
quickosgviewer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#ifndef _OSGQ_VIEWER_H_
#define _OSGQ_VIEWER_H_
#include <QQuickFramebufferObject>
#include <QOpenGLFramebufferObject>
#include <QVector3D>
#include <QList>
#include <osg/OperationThread>
#include <osg/MatrixTransform>
#include <osgGA/EventQueue>
#include <osgViewer/Viewer>
#include <osgGA/GUIEventHandler>
#include <QTimer>
#define QColor2OSGColor(c) osg::Vec4(c.redF(), c.greenF(), c.blueF(), 1.0f)
#define QVec3ToOSGVec3(v) osg::Vec3(v[0], v[1], v[2])
class QuickOSGRenderer;
class QuickOSGViewer : public QQuickFramebufferObject
{
Q_OBJECT
friend class QuickOSGRenderer;
Q_PROPERTY(QColor clearColor READ clearColor WRITE setClearColor)
Q_PROPERTY(bool hoverEnabled READ hoverEnabled WRITE setHoverEnabled NOTIFY hoverEnabledChanged)
Q_PROPERTY(osg::Node* scene READ scene WRITE setScene NOTIFY sceneChanged)
Q_PROPERTY(int framerate READ framerate WRITE setFramerate NOTIFY framerateChanged)
Q_PROPERTY(osg::Camera* camera READ camera WRITE setCamera NOTIFY cameraChanged)
Q_PROPERTY(QOpenGLFramebufferObject* defaultFbo READ defaultFbo NOTIFY defaultFboChanged)
public:
QuickOSGViewer(QQuickItem *parent = nullptr);
~QuickOSGViewer();
Q_INVOKABLE void home(); // 模型home
Q_INVOKABLE void lookAt(QVector3D eye, QVector3D center, QVector3D up);
Q_INVOKABLE void addOperation(osg::Operation* operation) { m_operationQueue->add(operation); }
QColor clearColor(){ return m_clearColor; }
void setClearColor(const QColor& newColor);
bool hoverEnabled() { return m_hoverEnabled; }
void setHoverEnabled(bool newHoverEnabled);
osg::Node* scene() const;
void setScene(osg::Node* node);
osg::Node* getNode(QString& name);
int framerate() const { return m_framerate; }
void setFramerate(int newFramerate);
osg::Camera* camera() const { return m_camera.get(); }
void setCamera(osg::Camera* newCamera);
void addEventhandle(osgGA::GUIEventHandler* handler);
QOpenGLFramebufferObject* defaultFbo() const
{
return m_defaultFbo;
}
void setDefaultFbo(QOpenGLFramebufferObject* newDefaultFbo){
if(m_defaultFbo == newDefaultFbo) return;
m_defaultFbo = newDefaultFbo;
emit defaultFboChanged(m_defaultFbo);
}
osg::Camera* createRTTCamera() const;
osgViewer::Viewer* rawViewer() const{return m_viewer.get();}
public slots:
void addChild(osg::Node* childNode, osg::Node* parentNode = nullptr);
protected:
virtual QQuickFramebufferObject::Renderer* createRenderer() const override;
virtual void mousePressEvent(QMouseEvent* event) override;
virtual void mouseDoubleClickEvent(QMouseEvent* event) override;
virtual void mouseMoveEvent(QMouseEvent* event) override;
virtual void hoverMoveEvent(QHoverEvent* event) override;
virtual void mouseReleaseEvent(QMouseEvent* event) override;
virtual void geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry) override;
virtual void wheelEvent(QWheelEvent* event) override;
virtual void keyPressEvent(QKeyEvent* event) override;
virtual void keyReleaseEvent(QKeyEvent* event) override;
private:
void setKeyboardModifiers(QInputEvent* event);
void setMouseEventData(QMouseEvent* event);
void setHoverEventData(QHoverEvent* event);
int getOsgKey(QKeyEvent* event);
signals:
void framerateChanged();
void sceneChanged();
void hoverEnabledChanged();
void cameraChanged();
void sceneEvent(QString event);
void defaultFboChanged(QOpenGLFramebufferObject* defaultFbo);
private:
int m_keyMask;
int m_mouseX, m_mouseY;
int m_mouseBtn; //Button numbering is 1 for left mouse button, 2 for middle, 3 for right.
QColor m_clearColor = QColor(Qt::white);
bool m_hoverEnabled = false;
osg::ref_ptr<osgGA::EventQueue> m_eventQueue;
osg::ref_ptr<osg::OperationQueue> m_operationQueue;
osg::ref_ptr<osg::Node> m_sceneNode;
osg::ref_ptr<osg::Switch> m_invisibleGroup;
osg::ref_ptr<osg::Camera> m_camera;
int m_framerate = 60;
osg::ref_ptr<osgViewer::Viewer> m_viewer;
QTimer m_updateTimer;
QOpenGLFramebufferObject* m_defaultFbo = nullptr;
};
Q_DECLARE_METATYPE(osg::Node*)
Q_DECLARE_METATYPE(osg::Operation*)
Q_DECLARE_METATYPE(osg::Vec3Array*)
Q_DECLARE_METATYPE(osg::DrawElementsUInt*)
#endif //_OSGQ_VIEWER_H_