Skip to content

Commit

Permalink
Refactor phong material setup
Browse files Browse the repository at this point in the history
  • Loading branch information
NEDJIMAbelgacem committed Jul 14, 2020
1 parent 633627f commit dffc35a
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 49 deletions.
14 changes: 14 additions & 0 deletions src/3d/qgs3dexportobject.cpp
Expand Up @@ -20,6 +20,8 @@
#include <QDir> #include <QDir>
#include <QImage> #include <QImage>


#include "qgsphongmaterialsettings.h"

Qgs3DExportObject::Qgs3DExportObject( const QString &name, const QString &parentName, QObject *parent ) Qgs3DExportObject::Qgs3DExportObject( const QString &name, const QString &parentName, QObject *parent )
: QObject( parent ) : QObject( parent )
, mName( name ) , mName( name )
Expand Down Expand Up @@ -92,6 +94,18 @@ void Qgs3DExportObject::setupTextureCoordinates( const QVector<float> &texturesB
mTexturesUV << texturesBuffer; 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 ) void Qgs3DExportObject::objectBounds( float &minX, float &minY, float &minZ, float &maxX, float &maxY, float &maxZ )
{ {
for ( unsigned int vertice : mIndexes ) for ( unsigned int vertice : mIndexes )
Expand Down
4 changes: 4 additions & 0 deletions src/3d/qgs3dexportobject.h
Expand Up @@ -22,6 +22,8 @@
#include <QVector3D> #include <QVector3D>
#include <QImage> #include <QImage>


class QgsPhongMaterialSettings;

/** /**
* \brief The Qgs3DExportObject class * \brief The Qgs3DExportObject class
* Manages the data of each object of the scene (positions, normals, texture coordinates ...) since each object * Manages the data of each object of the scene (positions, normals, texture coordinates ...) since each object
Expand Down Expand Up @@ -70,6 +72,8 @@ class Qgs3DExportObject : public QObject
void setupNormalCoordinates( const QVector<float> &normalsBuffer ); void setupNormalCoordinates( const QVector<float> &normalsBuffer );
//! Sets texture coordinates for each vertex //! Sets texture coordinates for each vertex
void setupTextureCoordinates( const QVector<float> &texturesBuffer ); void setupTextureCoordinates( const QVector<float> &texturesBuffer );
//! Sets the material parameters (diffuse color, shininess...) from phong material
void setupPhongMaterial( const QgsPhongMaterialSettings &material );


//! Sets the texture image used by the object //! Sets the texture image used by the object
void setTextureImage( const QImage &image ) { this->mTextureImage = image; }; void setTextureImage( const QImage &image ) { this->mTextureImage = image; };
Expand Down
60 changes: 11 additions & 49 deletions src/3d/qgs3dsceneexporter.cpp
Expand Up @@ -205,11 +205,12 @@ bool Qgs3DSceneExporter::parseVectorLayerEntity( Qt3DCore::QEntity *entity, QgsV
if ( pointSymbol->shape() == QgsPoint3DSymbol::Model ) if ( pointSymbol->shape() == QgsPoint3DSymbol::Model )
{ {
Qt3DRender::QSceneLoader *sceneLoader = entity->findChild<Qt3DRender::QSceneLoader *>(); Qt3DRender::QSceneLoader *sceneLoader = entity->findChild<Qt3DRender::QSceneLoader *>();
if (sceneLoader != nullptr) processSceneLoaderGeometry( sceneLoader, pointSymbol ); if ( sceneLoader != nullptr ) processSceneLoaderGeometry( sceneLoader, pointSymbol );
else { else
{
QList<Qt3DRender::QMesh *> meshes = entity->findChildren<Qt3DRender::QMesh *>(); QList<Qt3DRender::QMesh *> meshes = entity->findChildren<Qt3DRender::QMesh *>();
for (Qt3DRender::QMesh * mesh : meshes) for ( Qt3DRender::QMesh *mesh : meshes )
processMeshGeometry(mesh, pointSymbol); processMeshGeometry( mesh, pointSymbol );
} }
return true; return true;
} }
Expand Down Expand Up @@ -406,15 +407,8 @@ void Qgs3DSceneExporter::processPolygonGeometry( QgsTessellatedPolygonGeometry *
QVector<float> normalsData = getAttributeData<float>( normalsAttribute, normalsBytes ); QVector<float> normalsData = getAttributeData<float>( normalsAttribute, normalsBytes );
object->setupNormalCoordinates( normalsData ); object->setupNormalCoordinates( normalsData );
} }
QgsPhongMaterialSettings material = polygonSymbol->material();
QColor diffuse = material.diffuse(); object->setupPhongMaterial( polygonSymbol->material() );
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 ) );
// TODO: handle textures // TODO: handle textures
} }


Expand All @@ -438,15 +432,7 @@ void Qgs3DSceneExporter::processBufferedLineGeometry( QgsTessellatedPolygonGeome
object->setupNormalCoordinates( normalsData ); object->setupNormalCoordinates( normalsData );
} }


QgsPhongMaterialSettings material = lineSymbol->material(); object->setupPhongMaterial( 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 ) );
} }


void Qgs3DSceneExporter::processInstancedPointGeometry( Qt3DCore::QEntity *entity, const QgsPoint3DSymbol *pointSymbol ) void Qgs3DSceneExporter::processInstancedPointGeometry( Qt3DCore::QEntity *entity, const QgsPoint3DSymbol *pointSymbol )
Expand Down Expand Up @@ -489,15 +475,7 @@ void Qgs3DSceneExporter::processInstancedPointGeometry( Qt3DCore::QEntity *entit
object->setupNormalCoordinates( normalsData ); object->setupNormalCoordinates( normalsData );
} }


QgsPhongMaterialSettings material = pointSymbol->material(); object->setupPhongMaterial( 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 ) );
} }
} }
} }
Expand Down Expand Up @@ -569,15 +547,7 @@ void Qgs3DSceneExporter::processSceneLoaderGeometry( Qt3DRender::QSceneLoader *s
object->setupNormalCoordinates( normalsData ); object->setupNormalCoordinates( normalsData );
} }


QgsPhongMaterialSettings material = pointSymbol->material(); object->setupPhongMaterial( 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 ) );
} }
} }


Expand Down Expand Up @@ -635,15 +605,7 @@ void Qgs3DSceneExporter::processMeshGeometry( Qt3DRender::QMesh *mesh, const Qgs
object->setupNormalCoordinates( normalsData ); object->setupNormalCoordinates( normalsData );
} }


QgsPhongMaterialSettings material = pointSymbol->material(); object->setupPhongMaterial( 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 ) );
} }


void Qgs3DSceneExporter::save( const QString &sceneName, const QString &sceneFolderPath ) void Qgs3DSceneExporter::save( const QString &sceneName, const QString &sceneFolderPath )
Expand Down

0 comments on commit dffc35a

Please sign in to comment.