aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/scenegraph/qsgcurvestrokenode_p.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick/scenegraph/qsgcurvestrokenode_p.cpp')
-rw-r--r--src/quick/scenegraph/qsgcurvestrokenode_p.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/quick/scenegraph/qsgcurvestrokenode_p.cpp b/src/quick/scenegraph/qsgcurvestrokenode_p.cpp
new file mode 100644
index 0000000000..b86493b169
--- /dev/null
+++ b/src/quick/scenegraph/qsgcurvestrokenode_p.cpp
@@ -0,0 +1,90 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qsgcurvestrokenode_p_p.h"
+#include "qsgcurvestrokenode_p.h"
+
+QT_BEGIN_NAMESPACE
+
+bool QSGCurveStrokeMaterialShader::updateUniformData(RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect)
+{
+ bool changed = false;
+ QByteArray *buf = state.uniformData();
+ Q_ASSERT(buf->size() >= 64);
+ const int matrixCount = qMin(state.projectionMatrixCount(), newEffect->viewCount());
+
+ auto *newMaterial = static_cast<QSGCurveStrokeMaterial *>(newEffect);
+ auto *oldMaterial = static_cast<QSGCurveStrokeMaterial *>(oldEffect);
+
+ auto *newNode = newMaterial != nullptr ? newMaterial->node() : nullptr;
+ auto *oldNode = oldMaterial != nullptr ? oldMaterial->node() : nullptr;
+
+ if (state.isMatrixDirty()) {
+ float localScale = newNode != nullptr ? newNode->localScale() : 1.0f;
+ for (int viewIndex = 0; viewIndex < matrixCount; ++viewIndex) {
+ QMatrix4x4 m = state.combinedMatrix(viewIndex);
+ m.scale(localScale);
+ memcpy(buf->data() + viewIndex * 64, m.constData(), 64);
+ }
+ float matrixScale = qSqrt(qAbs(state.determinant())) * state.devicePixelRatio() * localScale;
+ memcpy(buf->data() + matrixCount * 64, &matrixScale, 4);
+ changed = true;
+ }
+
+ if (state.isOpacityDirty()) {
+ const float opacity = state.opacity();
+ memcpy(buf->data() + matrixCount * 64 + 4, &opacity, 4);
+ changed = true;
+ }
+
+ int offset = matrixCount * 64 + 16;
+ if (newNode == nullptr)
+ return changed;
+
+ QVector4D newStrokeColor(newNode->color().redF(),
+ newNode->color().greenF(),
+ newNode->color().blueF(),
+ newNode->color().alphaF());
+ QVector4D oldStrokeColor = oldNode != nullptr
+ ? QVector4D(oldNode->color().redF(),
+ oldNode->color().greenF(),
+ oldNode->color().blueF(),
+ oldNode->color().alphaF())
+ : QVector4D{};
+
+ if (oldNode == nullptr || oldStrokeColor != newStrokeColor) {
+ memcpy(buf->data() + offset, &newStrokeColor, 16);
+ changed = true;
+ }
+ offset += 16;
+
+ if (oldNode == nullptr || newNode->strokeWidth() != oldNode->strokeWidth()) {
+ float w = newNode->strokeWidth();
+ memcpy(buf->data() + offset, &w, 4);
+ changed = true;
+ }
+ offset += 4;
+ if (oldNode == nullptr || newNode->debug() != oldNode->debug()) {
+ float w = newNode->debug();
+ memcpy(buf->data() + offset, &w, 4);
+ changed = true;
+ }
+// offset += 4;
+
+ return changed;
+}
+
+int QSGCurveStrokeMaterial::compare(const QSGMaterial *other) const
+{
+ int typeDif = type() - other->type();
+ if (!typeDif) {
+ auto *othernode = static_cast<const QSGCurveStrokeMaterial*>(other)->node();
+ if (node()->color() != othernode->color())
+ return node()->color().rgb() < othernode->color().rgb() ? -1 : 1;
+ if (node()->strokeWidth() != othernode->strokeWidth())
+ return node()->strokeWidth() < othernode->strokeWidth() ? -1 : 1;
+ }
+ return typeDif;
+}
+
+QT_END_NAMESPACE