22#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
23#include <Qt3DRender/QAttribute>
24#include <Qt3DRender/QBuffer>
28#include <Qt3DCore/QAttribute>
29#include <Qt3DCore/QBuffer>
41 for (
int i = 0; i < faceIndex.size(); i += 3 )
43 if ( i + 2 >= faceIndex.size() )
continue;
45 if ( faceIndex[i] == faceIndex[i + 1] || faceIndex[i + 1] == faceIndex[i + 2] || faceIndex[i] == faceIndex[i + 2] )
47 for (
int j = 0; j < 3; ++j )
48 vertexIndex << faceIndex[i + j] + 1;
54 for (
int i = 0; i < positionsBuffer.size(); i += 3 )
56 for (
int j = 0; j < 3; ++j )
58 mVertexPosition << positionsBuffer[i + j] * scale + translation[j];
65 insertIndexData<uint>( mIndexes, facesIndexes );
70 Q_UNUSED( lineIndexes );
71 for (
int i = 0; i < mVertexPosition.size(); i += 3 ) mIndexes << i / 3 + 1;
76 mNormals << normalsBuffer;
81 mTexturesUV << texturesBuffer;
87 for (
auto it = parameters.begin(); it != parameters.end(); ++it )
96 for (
const unsigned int vertice : mIndexes )
98 const int heightIndex = ( vertice - 1 ) * 3 + 1;
99 minX = std::min( minX, mVertexPosition[heightIndex - 1] );
100 maxX = std::max( maxX, mVertexPosition[heightIndex - 1] );
101 minY = std::min( minY, mVertexPosition[heightIndex] );
102 maxY = std::max( maxY, mVertexPosition[heightIndex] );
103 minZ = std::min( minZ, mVertexPosition[heightIndex + 1] );
104 maxZ = std::max( maxZ, mVertexPosition[heightIndex + 1] );
120 for (
int i = 0; i < mVertexPosition.size(); i += 3 )
124 out << ( mVertexPosition[i] - center.x() ) / scale <<
" ";
125 out << ( mVertexPosition[i + 1] - center.y() ) / scale <<
" ";
126 out << ( mVertexPosition[i + 2] - center.z() ) / scale <<
"\n";
127 if ( i + 3 <= mNormals.size() )
129 out <<
"vn " << mNormals[i] <<
" " << mNormals[i + 1] <<
" " << mNormals[i + 2] <<
"\n";
131 const int u_index = i / 3 * 2;
132 if ( u_index + 1 < mTexturesUV.size() )
135 out <<
"vt " << mTexturesUV[u_index] <<
" " << 1.0f - mTexturesUV[u_index + 1] <<
"\n";
139 bool hasTextures = mTexturesUV.size() == mVertexPosition.size() / 3 * 2;
141 bool hasNormals = mNormals.size() == mVertexPosition.size();
143 if ( !hasNormals && !mNormals.empty() )
145 QgsDebugError(
"Vertex normals count and vertex positions count are different" );
147 int verticesCount = mVertexPosition.size() / 3;
149 auto getVertexIndex = [&](
int i ) -> QString
151 const int negativeIndex = -1 - ( verticesCount - i );
152 if ( hasNormals && !hasTextures )
153 return QStringLiteral(
"%1//%2" ).arg( negativeIndex ).arg( negativeIndex );
154 if ( !hasNormals && hasTextures )
155 return QStringLiteral(
"%1/%2" ).arg( negativeIndex ).arg( negativeIndex );
156 if ( hasNormals && hasTextures )
157 return QStringLiteral(
"%1/%2/%3" ).arg( negativeIndex ).arg( negativeIndex ).arg( negativeIndex );
158 return QString::number( negativeIndex );
164 for (
int i = 0; i < mIndexes.size(); i += 3 )
166 if ( mIndexes[i] == mIndexes[i + 1] && mIndexes[i + 1] == mIndexes[i + 2] )
168 out <<
"f " << getVertexIndex( mIndexes[i] );
169 out <<
" " << getVertexIndex( mIndexes[i + 1] );
170 out <<
" " << getVertexIndex( mIndexes[i + 2] );
177 for (
const int i : mIndexes ) out <<
" " << getVertexIndex( i );
180 else if ( mType ==
Points )
183 for (
int i = 0; i < mVertexPosition.size(); i += 3 )
184 out <<
" " << getVertexIndex( i / 3 + 1 );
191 QString materialName = mName +
"_material";
192 if ( mMaterialParameters.size() == 0 && ( mTexturesUV.size() == 0 || mTextureImage.isNull() ) )
return QString();
193 mtlOut <<
"newmtl " << materialName <<
"\n";
194 if ( mTexturesUV.size() != 0 && !mTextureImage.isNull() )
196 const QString filePath = QDir( folderPath ).filePath( materialName +
".jpg" );
197 mTextureImage.save( filePath,
"JPG" );
198 mtlOut <<
"\tmap_Kd " << materialName <<
".jpg" <<
"\n";
200 for (
auto it = mMaterialParameters.constBegin(); it != mMaterialParameters.constEnd(); it++ )
202 mtlOut <<
"\t" << it.key() <<
" " << it.value() <<
"\n";
204 mtlOut <<
"\tillum 2\n";
void setMaterialParameter(const QString ¶meter, const QString &value)
Sets a material parameter to be exported in the .mtl file.
void saveTo(QTextStream &out, float scale, const QVector3D ¢er)
Saves the current object to the output stream while scaling the object and centering it to be visible...
void objectBounds(float &minX, float &minY, float &minZ, float &maxX, float &maxY, float &maxZ)
Updates the box bounds explained with the current object bounds This expands the bounding box if the ...
void setupNormalCoordinates(const QVector< float > &normalsBuffer)
Sets normal coordinates for each vertex.
void setupPositionCoordinates(const QVector< float > &positionsBuffer, float scale=1.0f, const QVector3D &translation=QVector3D(0, 0, 0))
Sets positions coordinates and does the translation and scaling.
void setupMaterial(QgsAbstractMaterialSettings *material)
Sets the material parameters (diffuse color, shininess...) from phong material.
QString saveMaterial(QTextStream &mtlOut, const QString &folder)
saves the texture of the object and material information
void setupLine(const QVector< uint > &facesIndexes)
sets line vertex indexes
void setupFaces(const QVector< uint > &facesIndexes)
Sets the faces in facesIndexes to the faces in the object.
void setupTextureCoordinates(const QVector< float > &texturesBuffer)
Sets texture coordinates for each vertex.
virtual QMap< QString, QString > toExportParameters() const =0
Returns the parameters to be exported to .mtl file.
Qt3DCore::QAttribute Qt3DQAttribute
Qt3DCore::QBuffer Qt3DQBuffer
void insertIndexData(QVector< uint > &vertexIndex, const QVector< T > &faceIndex)
#define QgsDebugError(str)