18#include <QSGFlatColorMaterial>
27 switch (geometry->sizeOfVertex()) {
29 Q_ASSERT_X(
false,
"VertexDataType",
"Unknown vertex data type from QSGGeometry");
30 case 2 *
sizeof(float):
32 case 4 *
sizeof(float):
34 case 2 *
sizeof(float) + 4 *
sizeof(
char):
40QRectF boundingBox_QSGGeometryNode_vertexData(T *vertices,
int count)
46 float minX = vertices[0].x;
47 float minY = vertices[0].y;
48 float maxX = vertices[0].x;
49 float maxY = vertices[0].y;
50 for (
int i = 1; i < count; ++i) {
51 if (vertices[i].x < minX)
53 if (vertices[i].y < minY)
55 if (vertices[i].x > maxX)
57 if (vertices[i].y > maxY)
60 return QRectF(minX, minY, maxX, maxY);
67 switch (typeOfGeometry(geometry)) {
69 return boundingBox_QSGGeometryNode_vertexData(geometry->vertexDataAsPoint2D(), geometry->vertexCount());
71 return boundingBox_QSGGeometryNode_vertexData(geometry->vertexDataAsColoredPoint2D(), geometry->vertexCount());
73 return boundingBox_QSGGeometryNode_vertexData(geometry->vertexDataAsTexturedPoint2D(), geometry->vertexCount());
81 , m_vertexDataType(Point2DType)
82 , m_drawingMode(TriangleStrip)
105 return m_vertexDataType;
110 if (m_vertexDataType ==
type)
113 m_vertexDataType =
type;
120 return m_drawingMode;
151 QSGGeometry *geometry =
nullptr;
152 const QList<qreal> &
data = m_vertexData;
153 switch (m_vertexDataType) {
155 Q_ASSERT(
data.size() % 2 == 0);
156 const int vertexCount =
static_cast<int>(
data.size() / 2);
157 geometry =
new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), vertexCount);
158 QSGGeometry::Point2D *vertices = geometry->vertexDataAsPoint2D();
159 for (
int i = 0; i < vertexCount; ++i) {
160 const auto x =
static_cast<float>(
data[i * 2]);
161 const auto y =
static_cast<float>(
data[(i * 2) + 1]);
162 vertices[i].set(x, y);
168 geometry =
new QSGGeometry(QSGGeometry::defaultAttributes_ColoredPoint2D(), 0);
172 geometry =
new QSGGeometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 0);
175 geometry->setDrawingMode(m_drawingMode);
176 geometry->setLineWidth(m_lineWidth);
182 , m_geometryItem(nullptr)
183 , m_geometryDirty(false)
186 setFlag(ItemHasContents,
true);
191 return m_geometryItem;
196 if (m_geometryItem == item)
199 if (m_geometryItem) {
202 m_geometryItem = item;
203 if (m_geometryItem) {
210void QuickPrimitiveItem::updateImplicitSize(QSGGeometry *geometry)
213 setImplicitWidth(boundingRect.x() + boundingRect.width());
214 setImplicitHeight(boundingRect.y() + boundingRect.height());
224 if (m_color ==
color)
232void QuickPrimitiveItem::updateGeometry()
234 m_geometryDirty =
true;
245 auto *node =
static_cast<QSGGeometryNode *
>(oldNode);
247 node =
new QSGGeometryNode;
248 node->setFlag(QSGNode::OwnsGeometry);
249 auto *material =
new QSGFlatColorMaterial;
250 node->setMaterial(material);
251 node->setFlag(QSGNode::OwnsMaterial);
252 m_geometryDirty =
true;
255 if (m_geometryDirty) {
260 m_geometryDirty =
false;
264 auto *material =
static_cast<QSGFlatColorMaterial *
>(node->material());
265 material->setColor(m_color);
void setLineWidth(float lineWidth)
void lineWidthChanged(float lineWidth)
VertexDataType vertexDataType() const
void vertexDataChanged(const QList< qreal > &vertexData)
void setVertexData(const QList< qreal > &vertexData)
QSGGeometry * createGeometry() const
void setDrawingMode(DrawingMode drawingMode)
QList< qreal > vertexData() const
void vertexDataTypeChanged(QuickGeometryItem::VertexDataType type)
QuickGeometryItem(QObject *parent=nullptr)
void drawingModeChanged(QuickGeometryItem::DrawingMode drawingMode)
QuickGeometryItem::VertexDataType type
void setVertexDataType(VertexDataType type)
void changed()
Emitted in case any of this object properties changes.
QuickGeometryItem * geometryItem() const
void colorChanged(const QColor &color)
void geometryItemChanged(QuickGeometryItem *geometry)
QuickPrimitiveItem(QQuickItem *parent=nullptr)
QuickGeometryItem * geometry
void setColor(const QColor &color)
QSGNode * updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) override
void setGeometryItem(QuickGeometryItem *item)
QRectF boundingRect(QSGGeometry *geometry)