44 : mAltClamping( other.altitudeClamping() )
45 , mMaterial( other.material() ? other.material()->clone() : nullptr )
46 , mShape( other.shape() )
47 , mShapeProperties( other.shapeProperties() )
48 , mTransform( other.transform() )
49 , mBillboardSymbol( other.billboardSymbol() ? other.billboardSymbol()->clone() : nullptr )
51 setDataDefinedProperties( other.dataDefinedProperties() );
56 QDomDocument doc = elem.ownerDocument();
58 QDomElement elemDataProperties = doc.createElement( QStringLiteral(
"data" ) );
60 elem.appendChild( elemDataProperties );
62 elem.setAttribute( QStringLiteral(
"material_type" ), mMaterial->type() );
63 QDomElement elemMaterial = doc.createElement( QStringLiteral(
"material" ) );
64 mMaterial->writeXml( elemMaterial, context );
65 elem.appendChild( elemMaterial );
67 elem.setAttribute( QStringLiteral(
"shape" ),
shapeToString( mShape ) );
69 QVariantMap shapePropertiesCopy( mShapeProperties );
70 shapePropertiesCopy[QStringLiteral(
"model" )] = QVariant( context.
pathResolver().
writePath( shapePropertiesCopy[QStringLiteral(
"model" )].toString() ) );
72 QDomElement elemShapeProperties = doc.createElement( QStringLiteral(
"shape-properties" ) );
74 elem.appendChild( elemShapeProperties );
76 QDomElement elemTransform = doc.createElement( QStringLiteral(
"transform" ) );
78 elem.appendChild( elemTransform );
84 elem.appendChild( symbolElem );
90 QDomElement elemDataProperties = elem.firstChildElement( QStringLiteral(
"data" ) );
93 QDomElement elemMaterial = elem.firstChildElement( QStringLiteral(
"material" ) );
94 const QString materialType = elem.attribute( QStringLiteral(
"material_type" ), QStringLiteral(
"phong" ) );
98 mMaterial->readXml( elemMaterial, context );
100 mShape =
shapeFromString( elem.attribute( QStringLiteral(
"shape" ) ) );
102 QDomElement elemShapeProperties = elem.firstChildElement( QStringLiteral(
"shape-properties" ) );
104 mShapeProperties[QStringLiteral(
"model" )] = QVariant( context.
pathResolver().
readPath( mShapeProperties[QStringLiteral(
"model" )].toString() ) );
106 QDomElement elemTransform = elem.firstChildElement( QStringLiteral(
"transform" ) );
109 QDomElement symbolElem = elem.firstChildElement( QStringLiteral(
"symbol" ) );
111 setBillboardSymbol( QgsSymbolLayerUtils::loadSymbol< QgsMarkerSymbol >( symbolElem, context ) );
121 if (
shape == QStringLiteral(
"sphere" ) )
123 else if (
shape == QLatin1String(
"cone" ) )
125 else if (
shape == QLatin1String(
"cube" ) )
127 else if (
shape == QLatin1String(
"torus" ) )
129 else if (
shape == QLatin1String(
"plane" ) )
131 else if (
shape == QLatin1String(
"extruded-text" ) )
133 else if (
shape == QLatin1String(
"model" ) )
135 else if (
shape == QLatin1String(
"billboard" ) )
145 case Cylinder:
return QStringLiteral(
"cylinder" );
146 case Sphere:
return QStringLiteral(
"sphere" );
147 case Cone:
return QStringLiteral(
"cone" );
148 case Cube:
return QStringLiteral(
"cube" );
149 case Torus:
return QStringLiteral(
"torus" );
150 case Plane:
return QStringLiteral(
"plane" );
151 case ExtrudedText:
return QStringLiteral(
"extruded-text" );
152 case Model:
return QStringLiteral(
"model" );
153 case Billboard:
return QStringLiteral(
"billboard" );
154 default: Q_ASSERT(
false );
return QString();
160 QMatrix4x4 billboardTransformMatrix;
161 billboardTransformMatrix.translate( QVector3D( 0, mTransform.data()[13], 0 ) );
163 return billboardTransformMatrix;
168 return mMaterial.get();
183 Qt3DRender::QSceneLoader *sceneLoader = entity->findChild<Qt3DRender::QSceneLoader *>();
184 if ( sceneLoader !=
nullptr )
186 QVector<Qgs3DExportObject *> objects = exporter->processSceneLoaderGeometries( sceneLoader, objectNamePrefix );
192 exporter->mObjects << objects;
196 QList<Qt3DRender::QMesh *> meshes = entity->findChildren<Qt3DRender::QMesh *>();
197 for ( Qt3DRender::QMesh *mesh : meshes )
199 Qgs3DExportObject *
object = exporter->processGeometryRenderer( mesh, objectNamePrefix );
200 if (
object ==
nullptr )
continue;
202 object->setupMaterial(
material() );
203 exporter->mObjects << object;
211 if ( obj !=
nullptr ) exporter->mObjects << obj;
212 if ( obj !=
nullptr )
return true;
216 QVector<Qgs3DExportObject *> objects = exporter->processInstancedPointGeometry( entity, objectNamePrefix );
220 exporter->mObjects << obj;
Manages the data of each object of the scene (positions, normals, texture coordinates ....
void setSmoothEdges(bool smoothEdges)
Sets whether triangles edges will look smooth.
Entity that handles the exporting of 3D scene.
bool smoothEdges() const
Returns whether the triangles will look smooth.
static QString altClampingToString(Qgs3DTypes::AltitudeClamping altClamp)
Converts a value from AltitudeClamping enum to a string.
static QString matrix4x4toString(const QMatrix4x4 &m)
Converts a 4x4 transform matrix to a string.
static Qgs3DTypes::AltitudeClamping altClampingFromString(const QString &str)
Converts a string to a value from AltitudeClamping enum.
static QMatrix4x4 stringToMatrix4x4(const QString &str)
Convert a string to a 4x4 transform matrix.
static QgsMaterialRegistry * materialRegistry()
Returns the material registry, used for managing 3D materials.
A marker symbol type, for rendering Point and MultiPoint geometries.
QString writePath(const QString &filename) const
Prepare a filename to save it to the project file.
QString readPath(const QString &filename) const
Turn filename read from the project file to an absolute path.
Shape
3D shape types supported by the symbol
@ ExtrudedText
Supported in Qt 5.9+.
QgsAbstractMaterialSettings * material() const
Returns material used for shading of the symbol.
QMatrix4x4 billboardTransform() const
Returns transform for billboards.
void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const override
QgsPoint3DSymbol()
Constructor for QgsPoint3DSymbol with default QgsMarkerSymbol as the billboardSymbol.
bool exportGeometries(Qgs3DSceneExporter *exporter, Qt3DCore::QEntity *entity, const QString &objectNamePrefix) const override SIP_SKIP
Exports the geometries contained within the hierarchy of entity.
void setMaterial(QgsAbstractMaterialSettings *material SIP_TRANSFER)
Sets the material settings used for shading of the symbol.
QgsAbstract3DSymbol * clone() const override SIP_FACTORY
Shape shape() const
Returns 3D shape for points.
QgsMarkerSymbol * billboardSymbol() const
Returns a symbol for billboard.
void setBillboardSymbol(QgsMarkerSymbol *symbol)
Set symbol for billboard and the ownership is transferred.
static QString shapeToString(Shape shape)
Returns string from a shape enum value.
static QgsAbstract3DSymbol * create() SIP_FACTORY
Creates a new QgsPoint3DSymbol.
static Shape shapeFromString(const QString &shape)
Returns shape enum value from a string.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context) override
QList< QgsWkbTypes::GeometryType > compatibleGeometryTypes() const override
The class is used as a container of context for various read/write operations on other objects.
const QgsPathResolver & pathResolver() const
Returns path resolver for conversion between relative and absolute paths.
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
static QgsSymbol * defaultSymbol(QgsWkbTypes::GeometryType geomType)
Returns a new default symbol for the specified geometry type.
static QDomElement writeVariant(const QVariant &value, QDomDocument &doc)
Write a QVariant to a QDomElement.
static QVariant readVariant(const QDomElement &element)
Read a QVariant from a QDomElement.