Moved finding geometries from parseVectorLayerEntity to each symbol class

This commit is contained in:
NEDJIMAbelgacem 2020-07-28 01:45:11 +01:00
parent 300ebd4af2
commit a656da3b75
13 changed files with 164 additions and 82 deletions

View File

@ -113,6 +113,13 @@ Returns material used for shading of the symbol
Sets the ``material`` settings used for shading of the symbol. Sets the ``material`` settings used for shading of the symbol.
Ownership of ``material`` is transferred to 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 %End
}; };

View File

@ -138,6 +138,12 @@ Sets transform for individual objects represented by the symbol
Returns transform for billboards Returns transform for billboards
%End %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: private:
QgsPoint3DSymbol &operator=( const QgsPoint3DSymbol & ); QgsPoint3DSymbol &operator=( const QgsPoint3DSymbol & );
}; };

View File

@ -183,6 +183,15 @@ Sets which facade of the buildings is rendered (0 for None, 1 for Walls, 2 for R
%Docstring %Docstring
Returns which facade of the buildings is rendered (0 for None, 1 for Walls, 2 for Roofs, 3 for WallsAndRoofs) 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 .. versionadded:: 3.16
%End %End

View File

@ -10,6 +10,9 @@
namespace Qt3DCore
{
}
class QgsAbstract3DSymbol class QgsAbstract3DSymbol
@ -76,6 +79,13 @@ Returns a reference to the symbol layer's property collection, used for data def
void setDataDefinedProperties( const QgsPropertyCollection &collection ); void setDataDefinedProperties( const QgsPropertyCollection &collection );
%Docstring %Docstring
Sets the symbol layer's property collection, used for data defined overrides. 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 %End
protected: protected:

View File

@ -218,88 +218,8 @@ bool Qgs3DSceneExporter::parseVectorLayerEntity( Qt3DCore::QEntity *entity, QgsV
{ {
QgsVectorLayer3DRenderer *vectorLayerRenderer = dynamic_cast< QgsVectorLayer3DRenderer *>( abstractVectorRenderer ); QgsVectorLayer3DRenderer *vectorLayerRenderer = dynamic_cast< QgsVectorLayer3DRenderer *>( abstractVectorRenderer );
const QgsAbstract3DSymbol *symbol = vectorLayerRenderer->symbol(); const QgsAbstract3DSymbol *symbol = vectorLayerRenderer->symbol();
QString symbolType = symbol->type(); bool exported = symbol->exportGeometries( this, entity, layer->name() + QStringLiteral( "_" ) );
if ( symbolType == "polygon" ) return exported;
{
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;
}
}
} }
} }
return false; return false;

View File

@ -140,6 +140,10 @@ class Qgs3DSceneExporter : public Qt3DCore::QEntity
bool mExportTextures = false; bool mExportTextures = false;
int mTerrainTextureResolution = 512; int mTerrainTextureResolution = 512;
float mScale = 1.0f; float mScale = 1.0f;
friend QgsPolygon3DSymbol;
friend QgsLine3DSymbol;
friend QgsPoint3DSymbol;
}; };
#endif // QGS3DSCENEEXPORTER_H #endif // QGS3DSCENEEXPORTER_H

View File

@ -16,6 +16,8 @@
#include "qgsline3dsymbol.h" #include "qgsline3dsymbol.h"
#include "qgsphongmaterialsettings.h" #include "qgsphongmaterialsettings.h"
#include "qgs3dutils.h" #include "qgs3dutils.h"
#include "qgs3dexportobject.h"
#include "qgs3dsceneexporter.h"
QgsLine3DSymbol::QgsLine3DSymbol() QgsLine3DSymbol::QgsLine3DSymbol()
: mMaterial( qgis::make_unique< QgsPhongMaterialSettings >() ) : mMaterial( qgis::make_unique< QgsPhongMaterialSettings >() )
@ -92,3 +94,26 @@ QgsAbstract3DSymbol *QgsLine3DSymbol::create()
{ {
return new QgsLine3DSymbol(); 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;
}

View File

@ -92,6 +92,12 @@ class _3D_EXPORT QgsLine3DSymbol : public QgsAbstract3DSymbol SIP_NODEFAULTCTORS
*/ */
void setMaterial( QgsAbstractMaterialSettings *material SIP_TRANSFER ); 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: private:
//! how to handle altitude of vector features //! how to handle altitude of vector features
Qgs3DTypes::AltitudeClamping mAltClamping = Qgs3DTypes::AltClampRelative; Qgs3DTypes::AltitudeClamping mAltClamping = Qgs3DTypes::AltClampRelative;

View File

@ -19,6 +19,8 @@
#include "qgsreadwritecontext.h" #include "qgsreadwritecontext.h"
#include "qgsxmlutils.h" #include "qgsxmlutils.h"
#include "qgssymbollayerutils.h" #include "qgssymbollayerutils.h"
#include "qgs3dexportobject.h"
#include "qgs3dsceneexporter.h"
QgsAbstract3DSymbol *QgsPoint3DSymbol::clone() const QgsAbstract3DSymbol *QgsPoint3DSymbol::clone() const
@ -163,3 +165,50 @@ void QgsPoint3DSymbol::setMaterial( QgsAbstractMaterialSettings *material )
mMaterial.reset( 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;
}

View File

@ -114,6 +114,11 @@ class _3D_EXPORT QgsPoint3DSymbol : public QgsAbstract3DSymbol SIP_NODEFAULTCTOR
//! Returns transform for billboards //! Returns transform for billboards
QMatrix4x4 billboardTransform() const; 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: private:
//! how to handle altitude of vector features //! how to handle altitude of vector features
Qgs3DTypes::AltitudeClamping mAltClamping = Qgs3DTypes::AltClampRelative; Qgs3DTypes::AltitudeClamping mAltClamping = Qgs3DTypes::AltClampRelative;

View File

@ -15,8 +15,11 @@
#include "qgspolygon3dsymbol.h" #include "qgspolygon3dsymbol.h"
#include <Qt3DCore/QEntity>
#include "qgs3dutils.h" #include "qgs3dutils.h"
#include "qgssymbollayerutils.h" #include "qgssymbollayerutils.h"
#include "qgs3dsceneexporter.h"
QgsPolygon3DSymbol::QgsPolygon3DSymbol() QgsPolygon3DSymbol::QgsPolygon3DSymbol()
: mMaterial( qgis::make_unique< QgsPhongMaterialSettings >() ) : mMaterial( qgis::make_unique< QgsPhongMaterialSettings >() )
@ -124,3 +127,16 @@ void QgsPolygon3DSymbol::setMaterial( QgsAbstractMaterialSettings *material )
mMaterial.reset( 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;
}

View File

@ -154,6 +154,13 @@ class _3D_EXPORT QgsPolygon3DSymbol : public QgsAbstract3DSymbol SIP_NODEFAULTCT
*/ */
int renderedFacade() const { return mRenderedFacade; } 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: private:
//! how to handle altitude of vector features //! how to handle altitude of vector features
Qgs3DTypes::AltitudeClamping mAltClamping = Qgs3DTypes::AltClampRelative; Qgs3DTypes::AltitudeClamping mAltClamping = Qgs3DTypes::AltClampRelative;

View File

@ -25,6 +25,11 @@ class QDomElement;
class QString; class QString;
class QgsReadWriteContext; class QgsReadWriteContext;
class Qgs3DSceneExporter;
namespace Qt3DCore
{
class QEntity;
}
/** /**
@ -74,6 +79,19 @@ class CORE_EXPORT QgsAbstract3DSymbol
//! Sets the symbol layer's property collection, used for data defined overrides. //! Sets the symbol layer's property collection, used for data defined overrides.
void setDataDefinedProperties( const QgsPropertyCollection &collection ) { mDataDefinedProperties = collection; } 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: protected:
/** /**