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

68 lines
1.9 KiB
C++

/*
* SPDX-FileCopyrightText: 2020 Arjen Hiemstra <ahiemstra@heimr.nl>
*
* SPDX-License-Identifier: LGPL-2.0-or-later
*/
#pragma once
#include <QSGMaterial>
#include <QSGMaterialShader>
#include <QColor>
/**
* A material rendering a rectangle with a shadow.
*
* This material uses a distance field shader to render a rectangle with a
* shadow below it, optionally with rounded corners.
*/
class ShadowedRectangleMaterial : public QSGMaterial
{
public:
enum class ShaderType
{
Standard,
LowPower
};
ShadowedRectangleMaterial();
QSGMaterialShader* createShader() const override;
QSGMaterialType* type() const override;
int compare( const QSGMaterial* other ) const override;
QVector2D aspect = QVector2D{1.0, 1.0};
float size = 0.0;
QVector4D radius = QVector4D{0.0, 0.0, 0.0, 0.0};
QColor color = Qt::white;
QColor shadowColor = Qt::black;
QVector2D offset;
ShaderType shaderType = ShaderType::Standard;
static QSGMaterialType staticType;
};
class ShadowedRectangleShader : public QSGMaterialShader
{
public:
ShadowedRectangleShader( ShadowedRectangleMaterial::ShaderType shaderType );
char const* const* attributeNames() const override;
void initialize() override;
void updateState( const QSGMaterialShader::RenderState& state, QSGMaterial* newMaterial, QSGMaterial* oldMaterial ) override;
protected:
void setShader( ShadowedRectangleMaterial::ShaderType shaderType, const QString& shader );
private:
int m_matrixLocation = -1;
int m_opacityLocation = -1;
int m_aspectLocation = -1;
int m_sizeLocation = -1;
int m_radiusLocation = -1;
int m_colorLocation = -1;
int m_shadowColorLocation = -1;
int m_offsetLocation = -1;
};