-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathosgItem.cpp
112 lines (89 loc) · 2.46 KB
/
osgItem.cpp
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
#include "osgItem.h"
#include <QSGRendererInterface>
#include <QQuickWindow>
#include <osgDB/ReadFile>
#include <osgGA/TrackballManipulator>
OSGItem::OSGItem(QQuickItem *parent)
: QQuickItem(parent)
{
// Our item shows something so set the flag.
setFlag(ItemHasContents);
setAcceptedMouseButtons(Qt::MouseButton::AllButtons);
QObject::connect(this, &OSGItem::sourceChanged, this, &OSGItem::setNode);
}
QSGNode *OSGItem::updatePaintNode(QSGNode *node, UpdatePaintNodeData *)
{
QSGRenderNode *n = static_cast<QSGRenderNode *>(node);
QSGRendererInterface *ri = window()->rendererInterface();
if (!ri)
return nullptr;
if (!n)
{
mOSGRenderNode = new OSGRenderNode(this);
mOSGRenderNode->setupOSG(x(), y(), width(), height(), 1);
setNode(mSource);
mOSGRenderNode->setCameraManipulator(new osgGA::TrackballManipulator);
n = mOSGRenderNode;
}
static_cast<OSGRenderNode *>(n)->sync(this);
if (!n)
qWarning("QSGRendererInterface reports unknown graphics API %d", ri->graphicsApi());
return n;
}
void OSGItem::keyPressEvent(QKeyEvent *event)
{
if(mOSGRenderNode)
mOSGRenderNode->keyPressEvent(event);
}
void OSGItem::keyReleaseEvent(QKeyEvent *event)
{
if(mOSGRenderNode)
mOSGRenderNode->keyReleaseEvent(event);
}
void OSGItem::mousePressEvent(QMouseEvent *event)
{
if(mOSGRenderNode)
mOSGRenderNode->mousePressEvent(event);
}
void OSGItem::mouseMoveEvent(QMouseEvent *event)
{
if(mOSGRenderNode)
mOSGRenderNode->mouseMoveEvent(event);
}
void OSGItem::mouseReleaseEvent(QMouseEvent *event)
{
if(mOSGRenderNode)
mOSGRenderNode->mouseReleaseEvent(event);
}
void OSGItem::mouseDoubleClickEvent(QMouseEvent *event)
{
if(mOSGRenderNode)
mOSGRenderNode->mouseDoubleClickEvent(event);
}
void OSGItem::wheelEvent(QWheelEvent *event)
{
if(mOSGRenderNode)
mOSGRenderNode->wheelEvent(event);
}
QUrl OSGItem::source() const
{
return mSource;
}
void OSGItem::setSource(const QUrl &source)
{
if(mSource != source)
{
mSource = source;
emit sourceChanged(source);
}
}
void OSGItem::setNode(const QUrl &source)
{
if(mOSGRenderNode)
{
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(source.url(QUrl::PreferLocalFile).toStdString());
osg::ref_ptr<osg::Group> group = new osg::Group;
group->addChild(node);
mOSGRenderNode->setSceneData(group);
}
}