Skip to content

Commit

Permalink
Moved finding geometries from parseVectorLayerEntity to each symbol c…
Browse files Browse the repository at this point in the history
…lass
  • Loading branch information
NEDJIMAbelgacem committed Jul 28, 2020
1 parent 300ebd4 commit a656da3
Show file tree
Hide file tree
Showing 13 changed files with 164 additions and 82 deletions.
7 changes: 7 additions & 0 deletions python/3d/auto_generated/symbols/qgsline3dsymbol.sip.in
Expand Up @@ -113,6 +113,13 @@ Returns material used for shading of the symbol
Sets the ``material`` settings used for shading of the symbol.

Ownership of ``material`` is transferred to the symbol.
%End

virtual bool exportGeometries( Qgs3DSceneExporter *exporter, Qt3DCore::QEntity *entity, const QString &objectNamePrefix ) const;

%Docstring
Exports the geometries contained withing the hierarchy of entity.
Returns whether any objects were exported
%End

};
Expand Down
6 changes: 6 additions & 0 deletions python/3d/auto_generated/symbols/qgspoint3dsymbol.sip.in
Expand Up @@ -138,6 +138,12 @@ Sets transform for individual objects represented by the symbol
Returns transform for billboards
%End

virtual bool exportGeometries( Qgs3DSceneExporter *exporter, Qt3DCore::QEntity *entity, const QString &objectNamePrefix ) const;

%Docstring
Exports the geometries contained withing the hierarchy of entity.
Returns whether any objects were exported
%End
private:
QgsPoint3DSymbol &operator=( const QgsPoint3DSymbol & );
};
Expand Down
9 changes: 9 additions & 0 deletions python/3d/auto_generated/symbols/qgspolygon3dsymbol.sip.in
Expand Up @@ -183,6 +183,15 @@ Sets which facade of the buildings is rendered (0 for None, 1 for Walls, 2 for R
%Docstring
Returns which facade of the buildings is rendered (0 for None, 1 for Walls, 2 for Roofs, 3 for WallsAndRoofs)

.. versionadded:: 3.16
%End

virtual bool exportGeometries( Qgs3DSceneExporter *exporter, Qt3DCore::QEntity *entity, const QString &objectNamePrefix ) const;

%Docstring
Exports the geometries contained withing the hierarchy of entity.
Returns whether any objects were exported

.. versionadded:: 3.16
%End

Expand Down
10 changes: 10 additions & 0 deletions python/core/auto_generated/3d/qgsabstract3dsymbol.sip.in
Expand Up @@ -10,6 +10,9 @@



namespace Qt3DCore
{
}


class QgsAbstract3DSymbol
Expand Down Expand Up @@ -76,6 +79,13 @@ Returns a reference to the symbol layer's property collection, used for data def
void setDataDefinedProperties( const QgsPropertyCollection &collection );
%Docstring
Sets the symbol layer's property collection, used for data defined overrides.
%End

virtual bool exportGeometries( Qgs3DSceneExporter *exporter, Qt3DCore::QEntity *entity, const QString &objectNamePrefix ) const;
%Docstring
Exports the geometries contained withing the hierarchy of entity.
Returns whether any objects were exported
If this function is not overloaded we don't try to export anything
%End

protected:
Expand Down
84 changes: 2 additions & 82 deletions src/3d/qgs3dsceneexporter.cpp
Expand Up @@ -218,88 +218,8 @@ bool Qgs3DSceneExporter::parseVectorLayerEntity( Qt3DCore::QEntity *entity, QgsV
{
QgsVectorLayer3DRenderer *vectorLayerRenderer = dynamic_cast< QgsVectorLayer3DRenderer *>( abstractVectorRenderer );
const QgsAbstract3DSymbol *symbol = vectorLayerRenderer->symbol();
QString symbolType = symbol->type();
if ( symbolType == "polygon" )
{
QList<Qt3DRender::QGeometryRenderer *> renderers = entity->findChildren<Qt3DRender::QGeometryRenderer *>();
for ( Qt3DRender::QGeometryRenderer *r : renderers )
{
Qgs3DExportObject *object = processGeometryRenderer( r, layer->name() + QStringLiteral( "_" ) );
if ( object == nullptr ) continue;
processEntityMaterial( entity, object );
mObjects.push_back( object );
}
return renderers.size() != 0;
}
else if ( symbolType == "line" )
{
const QgsLine3DSymbol *lineSymbol = dynamic_cast<const QgsLine3DSymbol *>( symbol );
if ( lineSymbol->renderAsSimpleLines() )
{
QVector<Qgs3DExportObject *> objs = processLines( entity, layer->name() + QStringLiteral( "_" ) );
mObjects << objs;
return objs.size() != 0;
}
else
{
QList<Qt3DRender::QGeometryRenderer *> renderers = entity->findChildren<Qt3DRender::QGeometryRenderer *>();
for ( Qt3DRender::QGeometryRenderer *r : renderers )
{
Qgs3DExportObject *object = processGeometryRenderer( r, layer->name() + QStringLiteral( "_" ) );
if ( object == nullptr ) continue;
object->setupMaterial( lineSymbol->material() );
mObjects.push_back( object );
}
return renderers.size() != 0;
}
}
else if ( symbolType == "point" )
{
const QgsPoint3DSymbol *pointSymbol = dynamic_cast<const QgsPoint3DSymbol *>( symbol );
if ( pointSymbol->shape() == QgsPoint3DSymbol::Model )
{
Qt3DRender::QSceneLoader *sceneLoader = entity->findChild<Qt3DRender::QSceneLoader *>();
if ( sceneLoader != nullptr )
{
QVector<Qgs3DExportObject *> objects = processSceneLoaderGeometries( sceneLoader, layer->name() + QStringLiteral( "_" ) );
for ( Qgs3DExportObject *obj : objects )
{
obj->setSmoothEdges( mSmoothEdges );
obj->setupMaterial( pointSymbol->material() );
}
mObjects << objects;
}
else
{
QList<Qt3DRender::QMesh *> meshes = entity->findChildren<Qt3DRender::QMesh *>();
for ( Qt3DRender::QMesh *mesh : meshes )
{
Qgs3DExportObject *object = processGeometryRenderer( mesh, layer->name() + QStringLiteral( "_" ) );
if ( object == nullptr ) continue;
object->setSmoothEdges( mSmoothEdges );
object->setupMaterial( pointSymbol->material() );
mObjects << object;
}
}
return true;
}
else if ( pointSymbol->shape() == QgsPoint3DSymbol::Billboard )
{
Qgs3DExportObject *obj = processPoints( entity, layer->name() + QStringLiteral( "_" ) );
if ( obj != nullptr ) mObjects << obj;
if ( obj != nullptr ) return true;
}
else
{
QVector<Qgs3DExportObject *> objects = processInstancedPointGeometry( entity, layer->name() + QStringLiteral( "_" ) );
for ( Qgs3DExportObject *obj : objects )
{
obj->setupMaterial( pointSymbol->material() );
mObjects << obj;
}
return true;
}
}
bool exported = symbol->exportGeometries( this, entity, layer->name() + QStringLiteral( "_" ) );
return exported;
}
}
return false;
Expand Down
4 changes: 4 additions & 0 deletions src/3d/qgs3dsceneexporter.h
Expand Up @@ -140,6 +140,10 @@ class Qgs3DSceneExporter : public Qt3DCore::QEntity
bool mExportTextures = false;
int mTerrainTextureResolution = 512;
float mScale = 1.0f;

friend QgsPolygon3DSymbol;
friend QgsLine3DSymbol;
friend QgsPoint3DSymbol;
};

#endif // QGS3DSCENEEXPORTER_H
25 changes: 25 additions & 0 deletions src/3d/symbols/qgsline3dsymbol.cpp
Expand Up @@ -16,6 +16,8 @@
#include "qgsline3dsymbol.h"
#include "qgsphongmaterialsettings.h"
#include "qgs3dutils.h"
#include "qgs3dexportobject.h"
#include "qgs3dsceneexporter.h"

QgsLine3DSymbol::QgsLine3DSymbol()
: mMaterial( qgis::make_unique< QgsPhongMaterialSettings >() )
Expand Down Expand Up @@ -92,3 +94,26 @@ QgsAbstract3DSymbol *QgsLine3DSymbol::create()
{
return new QgsLine3DSymbol();
}

bool QgsLine3DSymbol::exportGeometries( Qgs3DSceneExporter *exporter, Qt3DCore::QEntity *entity, const QString &objectNamePrefix ) const
{
if ( renderAsSimpleLines() )
{
QVector<Qgs3DExportObject *> objs = exporter->processLines( entity, objectNamePrefix );
exporter->mObjects << objs;
return objs.size() != 0;
}
else
{
QList<Qt3DRender::QGeometryRenderer *> renderers = entity->findChildren<Qt3DRender::QGeometryRenderer *>();
for ( Qt3DRender::QGeometryRenderer *r : renderers )
{
Qgs3DExportObject *object = exporter->processGeometryRenderer( r, objectNamePrefix );
if ( object == nullptr ) continue;
object->setupMaterial( material() );
exporter->mObjects.push_back( object );
}
return renderers.size() != 0;
}
return false;
}
6 changes: 6 additions & 0 deletions src/3d/symbols/qgsline3dsymbol.h
Expand Up @@ -92,6 +92,12 @@ class _3D_EXPORT QgsLine3DSymbol : public QgsAbstract3DSymbol SIP_NODEFAULTCTORS
*/
void setMaterial( QgsAbstractMaterialSettings *material SIP_TRANSFER );

/**
* Exports the geometries contained withing the hierarchy of entity.
* Returns whether any objects were exported
*/
bool exportGeometries( Qgs3DSceneExporter *exporter, Qt3DCore::QEntity *entity, const QString &objectNamePrefix ) const override;

private:
//! how to handle altitude of vector features
Qgs3DTypes::AltitudeClamping mAltClamping = Qgs3DTypes::AltClampRelative;
Expand Down
49 changes: 49 additions & 0 deletions src/3d/symbols/qgspoint3dsymbol.cpp
Expand Up @@ -19,6 +19,8 @@
#include "qgsreadwritecontext.h"
#include "qgsxmlutils.h"
#include "qgssymbollayerutils.h"
#include "qgs3dexportobject.h"
#include "qgs3dsceneexporter.h"


QgsAbstract3DSymbol *QgsPoint3DSymbol::clone() const
Expand Down Expand Up @@ -163,3 +165,50 @@ void QgsPoint3DSymbol::setMaterial( QgsAbstractMaterialSettings *material )
mMaterial.reset( material );
}

bool QgsPoint3DSymbol::exportGeometries( Qgs3DSceneExporter *exporter, Qt3DCore::QEntity *entity, const QString &objectNamePrefix ) const
{
if ( shape() == QgsPoint3DSymbol::Model )
{
Qt3DRender::QSceneLoader *sceneLoader = entity->findChild<Qt3DRender::QSceneLoader *>();
if ( sceneLoader != nullptr )
{
QVector<Qgs3DExportObject *> objects = exporter->processSceneLoaderGeometries( sceneLoader, objectNamePrefix );
for ( Qgs3DExportObject *obj : objects )
{
obj->setSmoothEdges( exporter->smoothEdges() );
obj->setupMaterial( material() );
}
exporter->mObjects << objects;
}
else
{
QList<Qt3DRender::QMesh *> meshes = entity->findChildren<Qt3DRender::QMesh *>();
for ( Qt3DRender::QMesh *mesh : meshes )
{
Qgs3DExportObject *object = exporter->processGeometryRenderer( mesh, objectNamePrefix );
if ( object == nullptr ) continue;
object->setSmoothEdges( exporter->smoothEdges() );
object->setupMaterial( material() );
exporter->mObjects << object;
}
}
return true;
}
else if ( shape() == QgsPoint3DSymbol::Billboard )
{
Qgs3DExportObject *obj = exporter->processPoints( entity, objectNamePrefix );
if ( obj != nullptr ) exporter->mObjects << obj;
if ( obj != nullptr ) return true;
}
else
{
QVector<Qgs3DExportObject *> objects = exporter->processInstancedPointGeometry( entity, objectNamePrefix );
for ( Qgs3DExportObject *obj : objects )
{
obj->setupMaterial( material() );
exporter->mObjects << obj;
}
return true;
}
return false;
}
5 changes: 5 additions & 0 deletions src/3d/symbols/qgspoint3dsymbol.h
Expand Up @@ -114,6 +114,11 @@ class _3D_EXPORT QgsPoint3DSymbol : public QgsAbstract3DSymbol SIP_NODEFAULTCTOR
//! Returns transform for billboards
QMatrix4x4 billboardTransform() const;

/**
* Exports the geometries contained withing the hierarchy of entity.
* Returns whether any objects were exported
*/
bool exportGeometries( Qgs3DSceneExporter *exporter, Qt3DCore::QEntity *entity, const QString &objectNamePrefix ) const override;
private:
//! how to handle altitude of vector features
Qgs3DTypes::AltitudeClamping mAltClamping = Qgs3DTypes::AltClampRelative;
Expand Down
16 changes: 16 additions & 0 deletions src/3d/symbols/qgspolygon3dsymbol.cpp
Expand Up @@ -15,8 +15,11 @@

#include "qgspolygon3dsymbol.h"

#include <Qt3DCore/QEntity>

#include "qgs3dutils.h"
#include "qgssymbollayerutils.h"
#include "qgs3dsceneexporter.h"

QgsPolygon3DSymbol::QgsPolygon3DSymbol()
: mMaterial( qgis::make_unique< QgsPhongMaterialSettings >() )
Expand Down Expand Up @@ -124,3 +127,16 @@ void QgsPolygon3DSymbol::setMaterial( QgsAbstractMaterialSettings *material )

mMaterial.reset( material );
}

bool QgsPolygon3DSymbol::exportGeometries( Qgs3DSceneExporter *exporter, Qt3DCore::QEntity *entity, const QString &objectNamePrefix ) const
{
QList<Qt3DRender::QGeometryRenderer *> renderers = entity->findChildren<Qt3DRender::QGeometryRenderer *>();
for ( Qt3DRender::QGeometryRenderer *r : renderers )
{
Qgs3DExportObject *object = exporter->processGeometryRenderer( r, objectNamePrefix );
if ( object == nullptr ) continue;
exporter->processEntityMaterial( entity, object );
exporter->mObjects.push_back( object );
}
return renderers.size() != 0;
}
7 changes: 7 additions & 0 deletions src/3d/symbols/qgspolygon3dsymbol.h
Expand Up @@ -154,6 +154,13 @@ class _3D_EXPORT QgsPolygon3DSymbol : public QgsAbstract3DSymbol SIP_NODEFAULTCT
*/
int renderedFacade() const { return mRenderedFacade; }

/**
* Exports the geometries contained withing the hierarchy of entity.
* Returns whether any objects were exported
* \since QGIS 3.16
*/
bool exportGeometries( Qgs3DSceneExporter *exporter, Qt3DCore::QEntity *entity, const QString &objectNamePrefix ) const override;

private:
//! how to handle altitude of vector features
Qgs3DTypes::AltitudeClamping mAltClamping = Qgs3DTypes::AltClampRelative;
Expand Down
18 changes: 18 additions & 0 deletions src/core/3d/qgsabstract3dsymbol.h
Expand Up @@ -25,6 +25,11 @@ class QDomElement;
class QString;

class QgsReadWriteContext;
class Qgs3DSceneExporter;
namespace Qt3DCore
{
class QEntity;
}


/**
Expand Down Expand Up @@ -74,6 +79,19 @@ class CORE_EXPORT QgsAbstract3DSymbol
//! Sets the symbol layer's property collection, used for data defined overrides.
void setDataDefinedProperties( const QgsPropertyCollection &collection ) { mDataDefinedProperties = collection; }

/**
* Exports the geometries contained withing the hierarchy of entity.
* Returns whether any objects were exported
* If this function is not overloaded we don't try to export anything
*/
virtual bool exportGeometries( Qgs3DSceneExporter *exporter, Qt3DCore::QEntity *entity, const QString &objectNamePrefix ) const
{
Q_UNUSED( exporter );
Q_UNUSED( entity );
Q_UNUSED( objectNamePrefix );
return false;
}

protected:

/**
Expand Down

0 comments on commit a656da3

Please sign in to comment.