[Development] QSGNode::markDirty no longer works?

achartier at fastmail.fm achartier at fastmail.fm
Wed Dec 4 23:14:10 CET 2013


Hi,

I had a QQuickItem-based 2D linegraph working fine in prior versions of
Qt 5. This code does not seem to work with Qt 5.2 RC 1. Below is the
relevant code of my QQuickItem-based linegraph:

QSGNode* Linegraph::updatePaintNode(QSGNode* oldNode,
UpdatePaintNodeData* updatePaintNodeData)
{
    Q_UNUSED(updatePaintNodeData);

    QSGGeometryNode* node = nullptr;
    QSGGeometry* geometry = nullptr;
    QSGFlatColorMaterial* material = nullptr;

    if (!oldNode)
    {
        node = new QSGGeometryNode();
        geometry = new
        QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 1000);
        geometry->setLineWidth(1);
        geometry->setDrawingMode(GL_LINE_STRIP);
        geometry->allocate(1000);
        node->setGeometry(geometry);
        node->setFlag(QSGNode::OwnsGeometry);
        material = new QSGFlatColorMaterial();
        node->setMaterial(material);
        node->setFlag(QSGNode::OwnsMaterial);
    }
    else
    {
        node = static_cast<QSGGeometryNode*>(oldNode);
        geometry = node->geometry();
        material = static_cast<QSGFlatColorMaterial*>(node->material());
    }

    const QRectF bounds = boundingRect();
    const float horizontalPointSpacing = (float)bounds.width() / (1000 -
    1.0f);
    QSGGeometry::Point2D* vertices = geometry->vertexDataAsPoint2D();

    float currentX = 0.0f;
    float currentY = 0.0f;

    for (quint32 pointIndex = 0; pointIndex < m_numOfTracePoints;
    ++pointIndex)
    {
        currentX = 1.0f + pointIndex * horizontalPointSpacing;
        currentY = qBound(0.0f, (m_data[pointIndex] * (-1)) / 100000.0f,
        1.0f) * (float)bounds.height();

        vertices[pointIndex].set(currentX, currentY);
    }

    node->markDirty(QSGNode::DirtyForceUpdate);

    return node;
}

In prior versions of Qt, the second to last line
(node->markDirty(QSGNode::DirtyForceUpdate)) was needed, otherwise
updates to the "vertices" point array would not be reflected in what
gets drawn. Now, with Qt 5.2 RC 1, changes made to the points stored in
the "vertices" point array are never reflected in what is drawn:
whatever the array is initialized with is what is drawn in all
subsequent updates.

Is this a user error on my part? Should I be using something other than
QSGNode::markDirty to force the "vertices" point array changes to take
effect? Or is this perhaps a bug in Qt 5.2 RC 1?

Any help is greatly appreciated.

Thanks.



More information about the Development mailing list