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_qgsphongmaterial.cpp"
32using namespace Qt::StringLiterals;
35QgsPhongMaterial::QgsPhongMaterial( QNode *parent )
37 , mAmbientParameter( new
Qt3DRender::QParameter( u
"ambientColor"_s, QVariant() ) )
38 , mDiffuseParameter( new
Qt3DRender::QParameter( u
"diffuseColor"_s, QVariant() ) )
39 , mSpecularParameter( new
Qt3DRender::QParameter( u
"specularColor"_s, QVariant() ) )
40 , mShininessParameter( new
Qt3DRender::QParameter( u
"shininess"_s, 0.0f ) )
41 , mOpacityParameter( new
Qt3DRender::QParameter( u
"opacity"_s, 1.0f ) )
42 , mTransformParameter( new
Qt3DRender::QParameter( u
"meshMatrix"_s, QVariant::fromValue( QMatrix4x4() ), this ) )
43 , mNormalTransformParameter( new
Qt3DRender::QParameter( u
"meshNormalMatrix"_s, QVariant::fromValue( QMatrix3x3() ), this ) )
45 setAmbient( QColor::fromRgbF( 0.1f, 0.1f, 0.1f, 1.0f ) );
46 setDiffuse( QColor::fromRgbF( 0.7f, 0.7f, 0.7f, 1.0f ) );
47 setSpecular( QColor::fromRgbF( 1.0f, 1.0f, 1.0f, 1.0f ) );
51QgsPhongMaterial::~QgsPhongMaterial() =
default;
53void QgsPhongMaterial::init()
55 Qt3DRender::QEffect *effect =
new Qt3DRender::QEffect();
56 effect->addParameter( mAmbientParameter );
57 effect->addParameter( mDiffuseParameter );
58 effect->addParameter( mSpecularParameter );
59 effect->addParameter( mShininessParameter );
60 effect->addParameter( mOpacityParameter );
62 mShaderProgram =
new Qt3DRender::QShaderProgram();
64 Qt3DRender::QRenderPass *renderPass =
new Qt3DRender::QRenderPass();
65 renderPass->setShaderProgram( mShaderProgram );
67 Qt3DRender::QFilterKey *filterKey =
new Qt3DRender::QFilterKey();
68 filterKey->setName( u
"renderingStyle"_s );
69 filterKey->setValue( u
"forward"_s );
71 Qt3DRender::QTechnique *technique =
new Qt3DRender::QTechnique();
72 technique->graphicsApiFilter()->setApi( Qt3DRender::QGraphicsApiFilter::OpenGL );
73 technique->graphicsApiFilter()->setProfile( Qt3DRender::QGraphicsApiFilter::CoreProfile );
74 technique->graphicsApiFilter()->setMajorVersion( 3 );
75 technique->graphicsApiFilter()->setMinorVersion( 3 );
76 technique->addFilterKey( filterKey );
77 technique->addRenderPass( renderPass );
79 effect->addTechnique( technique );
80 effect->addParameter( mTransformParameter );
81 effect->addParameter( mNormalTransformParameter );
90 mInstanceFlags = flags;
94void QgsPhongMaterial::setInstancingMeshTransform(
const QMatrix4x4 &transform )
96 const QMatrix3x3 normalTransform = transform.normalMatrix();
97 mTransformParameter->setValue( QVariant::fromValue( transform ) );
98 mNormalTransformParameter->setValue( QVariant::fromValue( normalTransform ) );
101void QgsPhongMaterial::updateShaders()
103 const QByteArray fragCode = Qt3DRender::QShaderProgram::loadSource( QUrl( u
"qrc:/shaders/phong.frag"_s ) );
109 defines << u
"USE_INSTANCE_SCALE"_s;
111 defines << u
"USE_INSTANCE_ROTATION"_s;
112 const QByteArray vertCode = Qt3DRender::QShaderProgram::loadSource( QUrl( u
"qrc:/shaders/instanced.vert"_s ) );
114 mShaderProgram->setFragmentShaderCode( fragCode );
116 else if ( mDataDefinedEnabled )
118 mShaderProgram->setShaderCode( Qt3DRender::QShaderProgram::Vertex, Qt3DRender::QShaderProgram::loadSource( QUrl( u
"qrc:/shaders/phongDataDefined.vert"_s ) ) );
123 mShaderProgram->setShaderCode( Qt3DRender::QShaderProgram::Vertex, Qt3DRender::QShaderProgram::loadSource( QUrl( u
"qrc:/shaders/default.vert"_s ) ) );
124 mShaderProgram->setFragmentShaderCode( fragCode );
128void QgsPhongMaterial::setDataDefinedEnabled(
bool enabled )
130 if ( enabled != mDataDefinedEnabled )
132 mDataDefinedEnabled = enabled;
137void QgsPhongMaterial::setAmbient(
const QColor &ambient,
float scaleFactor )
140 mAmbientParameter->setValue( QColor::fromRgbF( color.redF() * scaleFactor, color.greenF() * scaleFactor, color.blueF() * scaleFactor ) );
143void QgsPhongMaterial::setDiffuse(
const QColor &diffuse,
float scaleFactor )
146 mDiffuseParameter->setValue( QColor::fromRgbF( color.redF() * scaleFactor, color.greenF() * scaleFactor, color.blueF() * scaleFactor ) );
149void QgsPhongMaterial::setSpecular(
const QColor &specular,
float scaleFactor )
152 mSpecularParameter->setValue( QColor::fromRgbF( color.redF() * scaleFactor, color.greenF() * scaleFactor, color.blueF() * scaleFactor ) );
155void QgsPhongMaterial::setShininess(
float shininess )
157 mShininessParameter->setValue( shininess );
160void QgsPhongMaterial::setOpacity(
float opacity )
162 mOpacityParameter->setValue( opacity );
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.