22#include <Qt3DRender/QEffect>
23#include <Qt3DRender/QFilterKey>
24#include <Qt3DRender/QGraphicsApiFilter>
25#include <Qt3DRender/QParameter>
26#include <Qt3DRender/QRenderPass>
27#include <Qt3DRender/QShaderProgram>
28#include <Qt3DRender/QTechnique>
30#include "moc_qgsgoochmaterial.cpp"
32using namespace Qt::StringLiterals;
35QgsGoochMaterial::QgsGoochMaterial( QNode *parent )
37 , mDiffuseParameter( new
Qt3DRender::QParameter( u
"kd"_s, QVariant() ) )
38 , mSpecularParameter( new
Qt3DRender::QParameter( u
"ks"_s, QVariant() ) )
39 , mWarmParameter( new
Qt3DRender::QParameter( u
"kyellow"_s, QVariant() ) )
40 , mCoolParameter( new
Qt3DRender::QParameter( u
"kblue"_s, QVariant() ) )
41 , mShininessParameter( new
Qt3DRender::QParameter( u
"shininess"_s, 100.0f ) )
42 , mAlphaParameter( new
Qt3DRender::QParameter( u
"alpha"_s, 0.25f ) )
43 , mBetaParameter( new
Qt3DRender::QParameter( u
"beta"_s, 0.5f ) )
44 , mTransformParameter( new
Qt3DRender::QParameter( u
"meshMatrix"_s, QVariant::fromValue( QMatrix4x4() ), this ) )
45 , mNormalTransformParameter( new
Qt3DRender::QParameter( u
"meshNormalMatrix"_s, QVariant::fromValue( QMatrix3x3() ), this ) )
47 setDiffuse( QColor::fromRgbF( 0.7f, 0.7f, 0.7f, 1.0f ) );
48 setSpecular( QColor::fromRgbF( 1.0f, 1.0f, 1.0f, 1.0f ) );
49 setWarm( QColor::fromRgbF( 0.42f, 0.0f, 0.42f, 1.0f ) );
50 setCool( QColor::fromRgbF( 1.0f, 0.51f, 0.0f, 1.0f ) );
54QgsGoochMaterial::~QgsGoochMaterial() =
default;
56void QgsGoochMaterial::init()
58 Qt3DRender::QEffect *effect =
new Qt3DRender::QEffect();
59 effect->addParameter( mDiffuseParameter );
60 effect->addParameter( mSpecularParameter );
61 effect->addParameter( mWarmParameter );
62 effect->addParameter( mCoolParameter );
63 effect->addParameter( mShininessParameter );
64 effect->addParameter( mAlphaParameter );
65 effect->addParameter( mBetaParameter );
67 mShaderProgram =
new Qt3DRender::QShaderProgram();
69 Qt3DRender::QRenderPass *renderPass =
new Qt3DRender::QRenderPass();
70 renderPass->setShaderProgram( mShaderProgram );
72 Qt3DRender::QFilterKey *filterKey =
new Qt3DRender::QFilterKey();
73 filterKey->setName( u
"renderingStyle"_s );
74 filterKey->setValue( u
"forward"_s );
76 Qt3DRender::QTechnique *technique =
new Qt3DRender::QTechnique();
77 technique->graphicsApiFilter()->setApi( Qt3DRender::QGraphicsApiFilter::OpenGL );
78 technique->graphicsApiFilter()->setProfile( Qt3DRender::QGraphicsApiFilter::CoreProfile );
79 technique->graphicsApiFilter()->setMajorVersion( 3 );
80 technique->graphicsApiFilter()->setMinorVersion( 3 );
81 technique->addFilterKey( filterKey );
82 technique->addRenderPass( renderPass );
84 effect->addTechnique( technique );
85 effect->addParameter( mTransformParameter );
86 effect->addParameter( mNormalTransformParameter );
95 mInstanceFlags = flags;
99void QgsGoochMaterial::setInstancingMeshTransform(
const QMatrix4x4 &transform )
101 const QMatrix3x3 normalTransform = transform.normalMatrix();
102 mTransformParameter->setValue( QVariant::fromValue( transform ) );
103 mNormalTransformParameter->setValue( QVariant::fromValue( normalTransform ) );
106void QgsGoochMaterial::updateShaders()
108 const QByteArray fragCode = Qt3DRender::QShaderProgram::loadSource( QUrl( u
"qrc:/shaders/gooch.frag"_s ) );
114 defines << u
"USE_INSTANCE_SCALE"_s;
116 defines << u
"USE_INSTANCE_ROTATION"_s;
117 const QByteArray vertCode = Qt3DRender::QShaderProgram::loadSource( QUrl( u
"qrc:/shaders/instanced.vert"_s ) );
119 mShaderProgram->setFragmentShaderCode( fragCode );
121 else if ( mDataDefinedEnabled )
123 mShaderProgram->setShaderCode( Qt3DRender::QShaderProgram::Vertex, Qt3DRender::QShaderProgram::loadSource( QUrl( u
"qrc:/shaders/goochDataDefined.vert"_s ) ) );
128 mShaderProgram->setShaderCode( Qt3DRender::QShaderProgram::Vertex, Qt3DRender::QShaderProgram::loadSource( QUrl( u
"qrc:/shaders/default.vert"_s ) ) );
129 mShaderProgram->setFragmentShaderCode( fragCode );
133void QgsGoochMaterial::setDataDefinedEnabled(
bool enabled )
135 if ( enabled != mDataDefinedEnabled )
137 mDataDefinedEnabled = enabled;
142void QgsGoochMaterial::setDiffuse(
const QColor &diffuse )
147void QgsGoochMaterial::setSpecular(
const QColor &specular )
152void QgsGoochMaterial::setWarm(
const QColor &warm )
157void QgsGoochMaterial::setCool(
const QColor &cool )
162void QgsGoochMaterial::setShininess(
float shininess )
164 mShininessParameter->setValue( shininess );
167void QgsGoochMaterial::setAlpha(
float alpha )
169 mAlphaParameter->setValue( alpha );
172void QgsGoochMaterial::setBeta(
float beta )
174 mBetaParameter->setValue( beta );
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.