22#include <Qt3DRender/QEffect>
23#include <Qt3DRender/QGraphicsApiFilter>
24#include <Qt3DRender/QParameter>
25#include <Qt3DRender/QShaderProgram>
26#include <Qt3DRender/QTechnique>
28#include "moc_qgsphongtexturedmaterial.cpp"
30using namespace Qt::StringLiterals;
33QgsPhongTexturedMaterial::QgsPhongTexturedMaterial( QNode *parent )
35 , mAmbientParameter( new
Qt3DRender::QParameter( u
"ambientColor"_s, QVariant() ) )
36 , mDiffuseTextureParameter( new
Qt3DRender::QParameter( u
"diffuseTexture"_s, QVariant() ) )
37 , mDiffuseTextureScaleParameter( new
Qt3DRender::QParameter( u
"texCoordScale"_s, 1.0f ) )
38 , mDiffuseTextureRotationParameter( new
Qt3DRender::QParameter( u
"texCoordRotation"_s, 0.0f ) )
39 , mDiffuseTextureOffsetParameter( new
Qt3DRender::QParameter( u
"texCoordOffset"_s, QVariant::fromValue( QVector2D( 0, 0 ) ), this ) )
40 , mSpecularParameter( new
Qt3DRender::QParameter( u
"specularColor"_s, QVariant() ) )
41 , mShininessParameter( new
Qt3DRender::QParameter( u
"shininess"_s, 150.0f ) )
42 , mOpacityParameter( new
Qt3DRender::QParameter( u
"opacity"_s, 1.0f ) )
44 , mGL3Technique( new
Qt3DRender::QTechnique( this ) )
45 , mGL3RenderPass( new
Qt3DRender::QRenderPass( this ) )
46 , mShaderProgram( new
Qt3DRender::QShaderProgram( this ) )
47 , mFilterKey( new
Qt3DRender::QFilterKey( this ) )
48 , mTransformParameter( new
Qt3DRender::QParameter( u
"meshMatrix"_s, QVariant::fromValue( QMatrix4x4() ), this ) )
49 , mNormalTransformParameter( new
Qt3DRender::QParameter( u
"meshNormalMatrix"_s, QVariant::fromValue( QMatrix3x3() ), this ) )
51 setAmbient( QColor::fromRgbF( 0.05f, 0.05f, 0.05f, 1.0f ) );
52 setSpecular( QColor::fromRgbF( 0.01f, 0.01f, 0.01f, 1.0f ) );
56QgsPhongTexturedMaterial::~QgsPhongTexturedMaterial() =
default;
59void QgsPhongTexturedMaterial::init()
63 mGL3Technique->graphicsApiFilter()->setApi( Qt3DRender::QGraphicsApiFilter::OpenGL );
64 mGL3Technique->graphicsApiFilter()->setMajorVersion( 3 );
65 mGL3Technique->graphicsApiFilter()->setMinorVersion( 1 );
66 mGL3Technique->graphicsApiFilter()->setProfile( Qt3DRender::QGraphicsApiFilter::CoreProfile );
68 mFilterKey->setParent(
this );
69 mFilterKey->setName( u
"renderingStyle"_s );
70 mFilterKey->setValue( u
"forward"_s );
72 mGL3Technique->addFilterKey( mFilterKey );
73 mGL3RenderPass->setShaderProgram( mShaderProgram );
74 mGL3Technique->addRenderPass( mGL3RenderPass );
75 mEffect->addTechnique( mGL3Technique );
77 mShaderProgram->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u
"qrc:/shaders/diffuseSpecular.frag"_s ) ) );
79 mEffect->addParameter( mAmbientParameter );
80 mEffect->addParameter( mDiffuseTextureParameter );
81 mEffect->addParameter( mDiffuseTextureScaleParameter );
82 mEffect->addParameter( mDiffuseTextureRotationParameter );
83 mEffect->addParameter( mDiffuseTextureOffsetParameter );
84 mEffect->addParameter( mSpecularParameter );
85 mEffect->addParameter( mShininessParameter );
86 mEffect->addParameter( mOpacityParameter );
87 mEffect->addParameter( mTransformParameter );
88 mEffect->addParameter( mNormalTransformParameter );
96 mInstanceFlags = flags;
101void QgsPhongTexturedMaterial::updateShaders()
103 const QByteArray fragCode = Qt3DRender::QShaderProgram::loadSource( QUrl( u
"qrc:/shaders/diffuseSpecular.frag"_s ) );
107 QStringList defines = { u
"HAS_TEXTURE"_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 ) );
117 QByteArray vertexCode = Qt3DRender::QShaderProgram::loadSource( QUrl( u
"qrc:/shaders/default.vert"_s ) );
118 QStringList defines { u
"TEXTURE_ROTATION"_s, u
"TEXTURE_OFFSET"_s };
119 if ( mDataDefinedTextureTransformEnabled )
120 defines << u
"DATA_DEFINED_TEXTURE_TRANSFORMS"_s;
123 mShaderProgram->setVertexShaderCode( vertexCode );
125 mShaderProgram->setFragmentShaderCode( fragCode );
128void QgsPhongTexturedMaterial::setInstancingMeshTransform(
const QMatrix4x4 &transform )
130 const QMatrix3x3 normalTransform = transform.normalMatrix();
131 mTransformParameter->setValue( QVariant::fromValue( transform ) );
132 mNormalTransformParameter->setValue( QVariant::fromValue( normalTransform ) );
135void QgsPhongTexturedMaterial::setAmbient(
const QColor &ambient )
140void QgsPhongTexturedMaterial::setDiffuseTexture( Qt3DRender::QAbstractTexture *diffuseTexture )
142 mDiffuseTextureParameter->setValue( QVariant::fromValue( diffuseTexture ) );
145void QgsPhongTexturedMaterial::setDiffuseTextureScale(
float diffuseTextureScale )
147 mDiffuseTextureScaleParameter->setValue( diffuseTextureScale );
150void QgsPhongTexturedMaterial::setDiffuseTextureRotation(
float textureRotation )
152 mDiffuseTextureRotationParameter->setValue( textureRotation );
155void QgsPhongTexturedMaterial::setDiffuseTextureOffset(
float textureOffsetX,
float textureOffsetY )
157 mDiffuseTextureOffsetParameter->setValue( QVariant::fromValue( QVector2D( textureOffsetX, textureOffsetY ) ) );
160void QgsPhongTexturedMaterial::setSpecular(
const QColor &specular )
165void QgsPhongTexturedMaterial::setShininess(
float shininess )
167 mShininessParameter->setValue( shininess );
170void QgsPhongTexturedMaterial::setOpacity(
float opacity )
172 mOpacityParameter->setValue( opacity );
175void QgsPhongTexturedMaterial::setDataDefinedTextureTransformEnabled(
bool enabled )
177 if ( enabled == mDataDefinedTextureTransformEnabled )
180 mDataDefinedTextureTransformEnabled = enabled;
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.