qskinny/examples/iotdashboard/kirigami/scenegraph/shadowedborderrectanglematerial.cpp
2021-06-04 11:55:10 +02:00

68 lines
2.0 KiB
C++

/*
* SPDX-FileCopyrightText: 2020 Arjen Hiemstra <ahiemstra@heimr.nl>
*
* SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include "shadowedborderrectanglematerial.h"
#include <QOpenGLContext>
QSGMaterialType ShadowedBorderRectangleMaterial::staticType;
ShadowedBorderRectangleMaterial::ShadowedBorderRectangleMaterial()
{
setFlag(QSGMaterial::Blending, true);
}
QSGMaterialShader* ShadowedBorderRectangleMaterial::createShader() const
{
return new ShadowedBorderRectangleShader{shaderType};
}
QSGMaterialType* ShadowedBorderRectangleMaterial::type() const
{
return &staticType;
}
int ShadowedBorderRectangleMaterial::compare(const QSGMaterial *other) const
{
auto material = static_cast<const ShadowedBorderRectangleMaterial *>(other);
auto result = ShadowedRectangleMaterial::compare(other);
if (result == 0
&& material->borderColor == borderColor
&& qFuzzyCompare(material->borderWidth, borderWidth)
) {
return 0;
}
return result;
}
ShadowedBorderRectangleShader::ShadowedBorderRectangleShader(ShadowedRectangleMaterial::ShaderType shaderType)
: ShadowedRectangleShader(shaderType)
{
setShader(shaderType, QStringLiteral("shadowedborderrectangle"));
}
void ShadowedBorderRectangleShader::initialize()
{
ShadowedRectangleShader::initialize();
m_borderWidthLocation = program()->uniformLocation("borderWidth");
m_borderColorLocation = program()->uniformLocation("borderColor");
}
void ShadowedBorderRectangleShader::updateState(const QSGMaterialShader::RenderState& state, QSGMaterial* newMaterial, QSGMaterial* oldMaterial)
{
ShadowedRectangleShader::updateState(state, newMaterial, oldMaterial);
auto p = program();
if (!oldMaterial || newMaterial->compare(oldMaterial) != 0 ) {
auto material = static_cast<ShadowedBorderRectangleMaterial *>(newMaterial);
p->setUniformValue(m_borderWidthLocation, material->borderWidth);
p->setUniformValue(m_borderColorLocation, material->borderColor);
}
}