31bool QSGCurveStrokeMaterialShader::updateUniformData(RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect)
34 QByteArray *buf = state.uniformData();
35 Q_ASSERT(buf->size() >= 64);
36 const int matrixCount = qMin(state.projectionMatrixCount(), newEffect->viewCount());
38 auto *newMaterial =
static_cast<QSGCurveStrokeMaterial *>(newEffect);
39 auto *oldMaterial =
static_cast<QSGCurveStrokeMaterial *>(oldEffect);
41 auto *newNode = newMaterial !=
nullptr ? newMaterial->node() :
nullptr;
42 auto *oldNode = oldMaterial !=
nullptr ? oldMaterial->node() :
nullptr;
44 if (state.isMatrixDirty()) {
45 float localScale = newNode !=
nullptr ? newNode->localScale() : 1.0f;
46 for (
int viewIndex = 0; viewIndex < matrixCount; ++viewIndex) {
47 QMatrix4x4 m = state.combinedMatrix(viewIndex);
49 memcpy(buf->data() + viewIndex * 64, m.constData(), 64);
52 float matrixScale = qSqrt(qAbs(state.determinant())) * state.devicePixelRatio() * localScale;
53 memcpy(buf->data() + matrixCount * 64, &matrixScale, 4);
54 float dpr = state.devicePixelRatio();
55 memcpy(buf->data() + matrixCount * 64 + 8, &dpr, 4);
59 if (state.isOpacityDirty()) {
60 const float opacity = state.opacity();
61 memcpy(buf->data() + matrixCount * 64 + 4, &opacity, 4);
65 if (oldNode ==
nullptr || newNode->strokeWidth() != oldNode->strokeWidth()) {
66 float w = newNode->strokeWidth();
67 memcpy(buf->data() + matrixCount * 64 + 12, &w, 4);
71 int offset = matrixCount * 64 + 16;
72 if (newNode ==
nullptr)
75 if (newNode->gradientType() == QGradient::NoGradient) {
76 QVector4D newStrokeColor(newNode->color().redF(),
77 newNode->color().greenF(),
78 newNode->color().blueF(),
79 newNode->color().alphaF());
80 QVector4D oldStrokeColor = oldNode !=
nullptr
81 ? QVector4D(oldNode->color().redF(),
82 oldNode->color().greenF(),
83 oldNode->color().blueF(),
84 oldNode->color().alphaF())
86 if (oldNode ==
nullptr || oldStrokeColor != newStrokeColor) {
87 memcpy(buf->data() + offset, &newStrokeColor, 16);
91 }
else if (newNode->gradientType() == QGradient::LinearGradient) {
92 Q_ASSERT(buf->size() >= offset + 8 + 8);
94 QVector2D newGradientStart = QVector2D(newNode->strokeGradient()->a);
95 QVector2D oldGradientStart = oldNode !=
nullptr
96 ? QVector2D(oldNode->strokeGradient()->a)
99 if (newGradientStart != oldGradientStart || oldEffect ==
nullptr) {
100 memcpy(buf->data() + offset, &newGradientStart, 8);
105 QVector2D newGradientEnd = QVector2D(newNode->strokeGradient()->b);
106 QVector2D oldGradientEnd = oldNode!=
nullptr
107 ? QVector2D(oldNode->strokeGradient()->b)
110 if (newGradientEnd != oldGradientEnd || oldEffect ==
nullptr) {
111 memcpy(buf->data() + offset, &newGradientEnd, 8);
116 }
else if (newNode->gradientType() == QGradient::RadialGradient) {
117 Q_ASSERT(buf->size() >= offset + 8 + 8 + 4 + 4 + 4);
119 QVector2D newFocalPoint = QVector2D(newNode->strokeGradient()->b);
120 QVector2D oldFocalPoint = oldNode !=
nullptr
121 ? QVector2D(oldNode->strokeGradient()->b)
123 if (oldNode ==
nullptr || newFocalPoint != oldFocalPoint) {
124 memcpy(buf->data() + offset, &newFocalPoint, 8);
129 QVector2D newCenterPoint = QVector2D(newNode->strokeGradient()->a);
130 QVector2D oldCenterPoint = oldNode !=
nullptr
131 ? QVector2D(oldNode->strokeGradient()->a)
134 QVector2D newCenterToFocal = newCenterPoint - newFocalPoint;
135 QVector2D oldCenterToFocal = oldCenterPoint - oldFocalPoint;
136 if (oldNode ==
nullptr || newCenterToFocal != oldCenterToFocal) {
137 memcpy(buf->data() + offset, &newCenterToFocal, 8);
142 float newCenterRadius = newNode->strokeGradient()->v0;
143 float oldCenterRadius = oldNode !=
nullptr
144 ? oldNode->strokeGradient()->v0
146 if (oldNode ==
nullptr || !qFuzzyCompare(newCenterRadius, oldCenterRadius)) {
147 memcpy(buf->data() + offset, &newCenterRadius, 4);
152 float newFocalRadius = newNode->strokeGradient()->v1;
153 float oldFocalRadius = oldNode !=
nullptr
154 ? oldNode->strokeGradient()->v1
156 if (oldNode ==
nullptr || !qFuzzyCompare(newFocalRadius, oldFocalRadius)) {
157 memcpy(buf->data() + offset, &newFocalRadius, 4);
165 }
else if (newNode->gradientType() == QGradient::ConicalGradient) {
166 Q_ASSERT(buf->size() >= offset + 8 + 4 + 4);
168 QVector2D newFocalPoint = QVector2D(newNode->strokeGradient()->a);
169 QVector2D oldFocalPoint = oldNode !=
nullptr
170 ? QVector2D(oldNode->strokeGradient()->a)
172 if (oldNode ==
nullptr || newFocalPoint != oldFocalPoint) {
173 memcpy(buf->data() + offset, &newFocalPoint, 8);
178 float newAngle = newNode->strokeGradient()->v0;
179 float oldAngle = oldNode !=
nullptr
180 ? oldNode->strokeGradient()->v0
182 if (oldNode ==
nullptr || !qFuzzyCompare(newAngle, oldAngle)) {
183 newAngle = -qDegreesToRadians(newAngle);
184 memcpy(buf->data() + offset, &newAngle, 4);
193 if (oldNode ==
nullptr || newNode->debug() != oldNode->debug()) {
194 float w = newNode->debug();
195 memcpy(buf->data() + offset, &w, 4);