45 : mAltClamping( other.altitudeClamping() )
46 , mMaterial( other.material() ? other.material()->clone() : nullptr )
47 , mShape( other.shape() )
48 , mShapeProperties( other.shapeProperties() )
49 , mTransform( other.transform() )
50 , mBillboardSymbol( other.billboardSymbol() ? other.billboardSymbol()->clone() : nullptr )
52 setDataDefinedProperties( other.dataDefinedProperties() );
59 QDomDocument doc = elem.ownerDocument();
61 QDomElement elemDataProperties = doc.createElement( QStringLiteral(
"data" ) );
63 elem.appendChild( elemDataProperties );
65 elem.setAttribute( QStringLiteral(
"material_type" ), mMaterial->type() );
66 QDomElement elemMaterial = doc.createElement( QStringLiteral(
"material" ) );
67 mMaterial->writeXml( elemMaterial, context );
68 elem.appendChild( elemMaterial );
70 elem.setAttribute( QStringLiteral(
"shape" ),
shapeToString( mShape ) );
72 QVariantMap shapePropertiesCopy( mShapeProperties );
73 shapePropertiesCopy[QStringLiteral(
"model" )] = QVariant( context.
pathResolver().
writePath( shapePropertiesCopy[QStringLiteral(
"model" )].toString() ) );
75 QDomElement elemShapeProperties = doc.createElement( QStringLiteral(
"shape-properties" ) );
77 elem.appendChild( elemShapeProperties );
79 QDomElement elemTransform = doc.createElement( QStringLiteral(
"transform" ) );
81 elem.appendChild( elemTransform );
87 elem.appendChild( symbolElem );
93 QDomElement elemDataProperties = elem.firstChildElement( QStringLiteral(
"data" ) );
96 QDomElement elemMaterial = elem.firstChildElement( QStringLiteral(
"material" ) );
97 const QString materialType = elem.attribute( QStringLiteral(
"material_type" ), QStringLiteral(
"phong" ) );
101 mMaterial->readXml( elemMaterial, context );
103 mShape =
shapeFromString( elem.attribute( QStringLiteral(
"shape" ) ) );
105 QDomElement elemShapeProperties = elem.firstChildElement( QStringLiteral(
"shape-properties" ) );
107 mShapeProperties[QStringLiteral(
"model" )] = QVariant( context.
pathResolver().
readPath( mShapeProperties[QStringLiteral(
"model" )].toString() ) );
109 QDomElement elemTransform = elem.firstChildElement( QStringLiteral(
"transform" ) );
112 QDomElement symbolElem = elem.firstChildElement( QStringLiteral(
"symbol" ) );
114 setBillboardSymbol( QgsSymbolLayerUtils::loadSymbol< QgsMarkerSymbol >( symbolElem, context ) );
124 if (
shape == QStringLiteral(
"sphere" ) )
126 else if (
shape == QLatin1String(
"cone" ) )
128 else if (
shape == QLatin1String(
"cube" ) )
130 else if (
shape == QLatin1String(
"torus" ) )
132 else if (
shape == QLatin1String(
"plane" ) )
134 else if (
shape == QLatin1String(
"extruded-text" ) )
136 else if (
shape == QLatin1String(
"model" ) )
138 else if (
shape == QLatin1String(
"billboard" ) )
148 case Cylinder:
return QStringLiteral(
"cylinder" );
149 case Sphere:
return QStringLiteral(
"sphere" );
150 case Cone:
return QStringLiteral(
"cone" );
151 case Cube:
return QStringLiteral(
"cube" );
152 case Torus:
return QStringLiteral(
"torus" );
153 case Plane:
return QStringLiteral(
"plane" );
154 case ExtrudedText:
return QStringLiteral(
"extruded-text" );
155 case Model:
return QStringLiteral(
"model" );
156 case Billboard:
return QStringLiteral(
"billboard" );
157 default: Q_ASSERT(
false );
return QString();
163 QMatrix4x4 billboardTransformMatrix;
164 billboardTransformMatrix.translate( QVector3D( 0, mTransform.data()[13], 0 ) );
166 return billboardTransformMatrix;
171 return mMaterial.get();
186 Qt3DRender::QSceneLoader *sceneLoader = entity->findChild<Qt3DRender::QSceneLoader *>();
187 if ( sceneLoader !=
nullptr )
189 QVector<Qgs3DExportObject *> objects = exporter->processSceneLoaderGeometries( sceneLoader, objectNamePrefix );
195 exporter->mObjects << objects;
199 QList<Qt3DRender::QMesh *> meshes = entity->findChildren<Qt3DRender::QMesh *>();
200 for ( Qt3DRender::QMesh *mesh : meshes )
202 Qgs3DExportObject *
object = exporter->processGeometryRenderer( mesh, objectNamePrefix );
203 if (
object ==
nullptr )
continue;
205 object->setupMaterial(
material() );
206 exporter->mObjects << object;
214 if ( obj !=
nullptr ) exporter->mObjects << obj;
215 if ( obj !=
nullptr )
return true;
219 QVector<Qgs3DExportObject *> objects = exporter->processInstancedPointGeometry( entity, objectNamePrefix );
223 exporter->mObjects << obj;
232 return mBillboardSymbol.get();
237 mBillboardSymbol.reset( symbol );
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+.
~QgsPoint3DSymbol() override
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.
QgsMarkerSymbol * billboardSymbol() const
Returns a symbol for billboard.
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.
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.