24#include <Qt3DRender/QEffect>
25#include <Qt3DRender/QGraphicsApiFilter>
26#include <Qt3DRender/QParameter>
27#include <Qt3DRender/QRenderPass>
28#include <Qt3DRender/QShaderProgram>
29#include <Qt3DRender/QTechnique>
31#include "moc_qgshighlightmaterial.cpp"
33using namespace Qt::StringLiterals;
37QgsHighlightMaterial::QgsHighlightMaterial( QNode *parent )
39 , mTransformParameter( new
Qt3DRender::QParameter( u
"meshMatrix"_s, QVariant::fromValue( QMatrix4x4() ), this ) )
40 , mNormalTransformParameter( new
Qt3DRender::QParameter( u
"meshNormalMatrix"_s, QVariant::fromValue( QMatrix3x3() ), this ) )
45QgsHighlightMaterial::~QgsHighlightMaterial() =
default;
47void QgsHighlightMaterial::init()
49 Qt3DRender::QEffect *effect =
new Qt3DRender::QEffect;
50 Qt3DRender::QTechnique *technique =
new Qt3DRender::QTechnique;
51 technique->graphicsApiFilter()->setApi( Qt3DRender::QGraphicsApiFilter::OpenGL );
52 technique->graphicsApiFilter()->setProfile( Qt3DRender::QGraphicsApiFilter::CoreProfile );
53 technique->graphicsApiFilter()->setMajorVersion( 3 );
54 technique->graphicsApiFilter()->setMinorVersion( 3 );
56 Qt3DRender::QRenderPass *pass =
new Qt3DRender::QRenderPass;
58 mShaderProgram =
new Qt3DRender::QShaderProgram();
59 pass->setShaderProgram( mShaderProgram );
61 mShaderProgram->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u
"qrc:/shaders/singlecolor.frag"_s ) ) );
66 color.setAlphaF( alpha );
68 pass->addParameter( colorParam );
70 technique->addRenderPass( pass );
71 effect->addTechnique( technique );
72 effect->addParameter( mTransformParameter );
73 effect->addParameter( mNormalTransformParameter );
83 mInstanceFlags = flags;
87void QgsHighlightMaterial::setInstancingMeshTransform(
const QMatrix4x4 &transform )
89 const QMatrix3x3 normalTransform = transform.normalMatrix();
90 mTransformParameter->setValue( QVariant::fromValue( transform ) );
91 mNormalTransformParameter->setValue( QVariant::fromValue( normalTransform ) );
94void QgsHighlightMaterial::updateShaders()
100 defines << u
"USE_INSTANCE_SCALE"_s;
102 defines << u
"USE_INSTANCE_ROTATION"_s;
103 const QByteArray vertCode = Qt3DRender::QShaderProgram::loadSource( QUrl( u
"qrc:/shaders/instanced.vert"_s ) );
108 mShaderProgram->setShaderCode( Qt3DRender::QShaderProgram::Vertex, Qt3DRender::QShaderProgram::loadSource( QUrl( u
"qrc:/shaders/default.vert"_s ) ) );
static const QColor DEFAULT_HIGHLIGHT_COLOR
Default highlight color.
QFlags< InstancedMaterialFlag > InstancedMaterialFlags
@ DataDefinedRotation
Per-instance data-defined rotation.
@ DataDefinedScale
Per-instance data-defined scale.
static QByteArray addDefinesToShaderCode(const QByteArray &shaderCode, const QStringList &defines)
Inserts some define macros into a shader source code.
static QColor srgbToLinear(const QColor &color)
Converts a SRGB color to a linear color.
Base class for all materials used within QGIS 3D views.
Stores settings for use within QGIS.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.