From dffc35a1bb6892faf4513bc61f6903b29c765bdb Mon Sep 17 00:00:00 2001 From: NEDJIMAbelgacem Date: Tue, 14 Jul 2020 14:07:07 +0100 Subject: [PATCH] Refactor phong material setup --- src/3d/qgs3dexportobject.cpp | 14 ++++++++ src/3d/qgs3dexportobject.h | 4 +++ src/3d/qgs3dsceneexporter.cpp | 60 +++++++---------------------------- 3 files changed, 29 insertions(+), 49 deletions(-) diff --git a/src/3d/qgs3dexportobject.cpp b/src/3d/qgs3dexportobject.cpp index 2a1ee185abbe..84b6a9709398 100644 --- a/src/3d/qgs3dexportobject.cpp +++ b/src/3d/qgs3dexportobject.cpp @@ -20,6 +20,8 @@ #include #include +#include "qgsphongmaterialsettings.h" + Qgs3DExportObject::Qgs3DExportObject( const QString &name, const QString &parentName, QObject *parent ) : QObject( parent ) , mName( name ) @@ -92,6 +94,18 @@ void Qgs3DExportObject::setupTextureCoordinates( const QVector &texturesB mTexturesUV << texturesBuffer; } +void Qgs3DExportObject::setupPhongMaterial( const QgsPhongMaterialSettings &material ) +{ + QColor diffuse = material.diffuse(); + QColor specular = material.specular(); + QColor ambient = material.ambient(); + float shininess = material.shininess(); + setMaterialParameter( QString( "Kd" ), QString( "%1 %2 %3" ).arg( diffuse.redF() ).arg( diffuse.greenF() ).arg( diffuse.blueF() ) ); + setMaterialParameter( QString( "Ka" ), QString( "%1 %2 %3" ).arg( ambient.redF() ).arg( ambient.greenF() ).arg( ambient.blueF() ) ); + setMaterialParameter( QString( "Ks" ), QString( "%1 %2 %3" ).arg( specular.redF() ).arg( specular.greenF() ).arg( specular.blueF() ) ); + setMaterialParameter( QString( "Ns" ), QString( "%1" ).arg( shininess ) ); +} + void Qgs3DExportObject::objectBounds( float &minX, float &minY, float &minZ, float &maxX, float &maxY, float &maxZ ) { for ( unsigned int vertice : mIndexes ) diff --git a/src/3d/qgs3dexportobject.h b/src/3d/qgs3dexportobject.h index 39ad6fb472ef..9bded3b77d52 100644 --- a/src/3d/qgs3dexportobject.h +++ b/src/3d/qgs3dexportobject.h @@ -22,6 +22,8 @@ #include #include +class QgsPhongMaterialSettings; + /** * \brief The Qgs3DExportObject class * Manages the data of each object of the scene (positions, normals, texture coordinates ...) since each object @@ -70,6 +72,8 @@ class Qgs3DExportObject : public QObject void setupNormalCoordinates( const QVector &normalsBuffer ); //! Sets texture coordinates for each vertex void setupTextureCoordinates( const QVector &texturesBuffer ); + //! Sets the material parameters (diffuse color, shininess...) from phong material + void setupPhongMaterial( const QgsPhongMaterialSettings &material ); //! Sets the texture image used by the object void setTextureImage( const QImage &image ) { this->mTextureImage = image; }; diff --git a/src/3d/qgs3dsceneexporter.cpp b/src/3d/qgs3dsceneexporter.cpp index 8be80bc6c6e6..a12ccb437a26 100644 --- a/src/3d/qgs3dsceneexporter.cpp +++ b/src/3d/qgs3dsceneexporter.cpp @@ -205,11 +205,12 @@ bool Qgs3DSceneExporter::parseVectorLayerEntity( Qt3DCore::QEntity *entity, QgsV if ( pointSymbol->shape() == QgsPoint3DSymbol::Model ) { Qt3DRender::QSceneLoader *sceneLoader = entity->findChild(); - if (sceneLoader != nullptr) processSceneLoaderGeometry( sceneLoader, pointSymbol ); - else { + if ( sceneLoader != nullptr ) processSceneLoaderGeometry( sceneLoader, pointSymbol ); + else + { QList meshes = entity->findChildren(); - for (Qt3DRender::QMesh * mesh : meshes) - processMeshGeometry(mesh, pointSymbol); + for ( Qt3DRender::QMesh *mesh : meshes ) + processMeshGeometry( mesh, pointSymbol ); } return true; } @@ -406,15 +407,8 @@ void Qgs3DSceneExporter::processPolygonGeometry( QgsTessellatedPolygonGeometry * QVector normalsData = getAttributeData( normalsAttribute, normalsBytes ); object->setupNormalCoordinates( normalsData ); } - QgsPhongMaterialSettings material = polygonSymbol->material(); - QColor diffuse = material.diffuse(); - QColor specular = material.specular(); - QColor ambient = material.ambient(); - float shininess = material.shininess(); - object->setMaterialParameter( QString( "Kd" ), QString( "%1 %2 %3" ).arg( diffuse.redF() ).arg( diffuse.greenF() ).arg( diffuse.blueF() ) ); - object->setMaterialParameter( QString( "Ka" ), QString( "%1 %2 %3" ).arg( ambient.redF() ).arg( ambient.greenF() ).arg( ambient.blueF() ) ); - object->setMaterialParameter( QString( "Ks" ), QString( "%1 %2 %3" ).arg( specular.redF() ).arg( specular.greenF() ).arg( specular.blueF() ) ); - object->setMaterialParameter( QString( "Ns" ), QString( "%1" ).arg( shininess ) ); + + object->setupPhongMaterial( polygonSymbol->material() ); // TODO: handle textures } @@ -438,15 +432,7 @@ void Qgs3DSceneExporter::processBufferedLineGeometry( QgsTessellatedPolygonGeome object->setupNormalCoordinates( normalsData ); } - QgsPhongMaterialSettings material = lineSymbol->material(); - QColor diffuse = material.diffuse(); - QColor specular = material.specular(); - QColor ambient = material.ambient(); - float shininess = material.shininess(); - object->setMaterialParameter( QString( "Kd" ), QString( "%1 %2 %3" ).arg( diffuse.redF() ).arg( diffuse.greenF() ).arg( diffuse.blueF() ) ); - object->setMaterialParameter( QString( "Ka" ), QString( "%1 %2 %3" ).arg( ambient.redF() ).arg( ambient.greenF() ).arg( ambient.blueF() ) ); - object->setMaterialParameter( QString( "Ks" ), QString( "%1 %2 %3" ).arg( specular.redF() ).arg( specular.greenF() ).arg( specular.blueF() ) ); - object->setMaterialParameter( QString( "Ns" ), QString( "%1" ).arg( shininess ) ); + object->setupPhongMaterial( lineSymbol->material() ); } void Qgs3DSceneExporter::processInstancedPointGeometry( Qt3DCore::QEntity *entity, const QgsPoint3DSymbol *pointSymbol ) @@ -489,15 +475,7 @@ void Qgs3DSceneExporter::processInstancedPointGeometry( Qt3DCore::QEntity *entit object->setupNormalCoordinates( normalsData ); } - QgsPhongMaterialSettings material = pointSymbol->material(); - QColor diffuse = material.diffuse(); - QColor specular = material.specular(); - QColor ambient = material.ambient(); - float shininess = material.shininess(); - object->setMaterialParameter( QString( "Kd" ), QString( "%1 %2 %3" ).arg( diffuse.redF() ).arg( diffuse.greenF() ).arg( diffuse.blueF() ) ); - object->setMaterialParameter( QString( "Ka" ), QString( "%1 %2 %3" ).arg( ambient.redF() ).arg( ambient.greenF() ).arg( ambient.blueF() ) ); - object->setMaterialParameter( QString( "Ks" ), QString( "%1 %2 %3" ).arg( specular.redF() ).arg( specular.greenF() ).arg( specular.blueF() ) ); - object->setMaterialParameter( QString( "Ns" ), QString( "%1" ).arg( shininess ) ); + object->setupPhongMaterial( pointSymbol->material() ); } } } @@ -569,15 +547,7 @@ void Qgs3DSceneExporter::processSceneLoaderGeometry( Qt3DRender::QSceneLoader *s object->setupNormalCoordinates( normalsData ); } - QgsPhongMaterialSettings material = pointSymbol->material(); - QColor diffuse = material.diffuse(); - QColor specular = material.specular(); - QColor ambient = material.ambient(); - float shininess = material.shininess(); - object->setMaterialParameter( QString( "Kd" ), QString( "%1 %2 %3" ).arg( diffuse.redF() ).arg( diffuse.greenF() ).arg( diffuse.blueF() ) ); - object->setMaterialParameter( QString( "Ka" ), QString( "%1 %2 %3" ).arg( ambient.redF() ).arg( ambient.greenF() ).arg( ambient.blueF() ) ); - object->setMaterialParameter( QString( "Ks" ), QString( "%1 %2 %3" ).arg( specular.redF() ).arg( specular.greenF() ).arg( specular.blueF() ) ); - object->setMaterialParameter( QString( "Ns" ), QString( "%1" ).arg( shininess ) ); + object->setupPhongMaterial( pointSymbol->material() ); } } @@ -635,15 +605,7 @@ void Qgs3DSceneExporter::processMeshGeometry( Qt3DRender::QMesh *mesh, const Qgs object->setupNormalCoordinates( normalsData ); } - QgsPhongMaterialSettings material = pointSymbol->material(); - QColor diffuse = material.diffuse(); - QColor specular = material.specular(); - QColor ambient = material.ambient(); - float shininess = material.shininess(); - object->setMaterialParameter( QString( "Kd" ), QString( "%1 %2 %3" ).arg( diffuse.redF() ).arg( diffuse.greenF() ).arg( diffuse.blueF() ) ); - object->setMaterialParameter( QString( "Ka" ), QString( "%1 %2 %3" ).arg( ambient.redF() ).arg( ambient.greenF() ).arg( ambient.blueF() ) ); - object->setMaterialParameter( QString( "Ks" ), QString( "%1 %2 %3" ).arg( specular.redF() ).arg( specular.greenF() ).arg( specular.blueF() ) ); - object->setMaterialParameter( QString( "Ns" ), QString( "%1" ).arg( shininess ) ); + object->setupPhongMaterial( pointSymbol->material() ); } void Qgs3DSceneExporter::save( const QString &sceneName, const QString &sceneFolderPath )