-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathLineStrip.cpp
More file actions
78 lines (58 loc) · 1.79 KB
/
Copy pathLineStrip.cpp
File metadata and controls
78 lines (58 loc) · 1.79 KB
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
#include "LineStrip.hpp"
#include <QSGGeometryNode>
#include "FlatColorSceneMaterial.hpp"
LineStrip::LineStrip(QQuickItem *scene)
: rogii::qt_quick::SceneItem(scene)
{
}
void LineStrip::reserve(int count)
{
mPoints.reserve(count);
}
void LineStrip::appendPoint(const QPointF &p)
{
mPoints.append(p);
mChanged = true;
update();
}
void LineStrip::setColor(QColor color)
{
mColor = color;
mChanged = true;
update();
}
QSGNode *LineStrip::updatePaintNode(QSGNode * oldNode, QQuickItem::UpdatePaintNodeData *)
{
if (getScene() == nullptr)
return nullptr;
QSGGeometryNode * node(static_cast<QSGGeometryNode*>(oldNode));
if (node == nullptr)
{
node = new QSGGeometryNode;
QSGGeometry * g = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 0);
g->setDrawingMode(QSGGeometry::DrawLineStrip);
node->setGeometry(g);
node->setFlag(QSGNode::OwnsGeometry);
node->setMaterial(new rogii::qt_quick::FlatColorSceneMaterial(*getScene()));
node->setFlag(QSGNode::OwnsMaterial);
}
if (mChanged)
{
mChanged = false;
QSGGeometry * geometry(node->geometry());
auto * material(static_cast<rogii::qt_quick::FlatColorSceneMaterial *>(node->material()));
material->setModelMatrix(getModelMatrix());
material->setColor(mColor);
auto points = mPoints;
geometry->allocate(points.size());
QSGGeometry::Point2D * vertex = geometry->vertexDataAsPoint2D();
for (int i(0), count(geometry->vertexCount()); i < count; ++i)
{
const auto & v(points[i]);
vertex[i].set(v.x(), v.y());
}
node->markDirty(QSGNode::DirtyMaterial);
node->markDirty(QSGNode::DirtyGeometry);
}
return node;
}