double GLC_Mesh::volume() { double resultVolume= 0.0; if (!m_MeshData.isEmpty()) { IndexList triangleIndex; QList<GLC_Material*> materials= materialSet().toList(); const int materialsCount= materials.count(); for (int i= 0; i < materialsCount; ++i) { GLC_uint materialId= materials.at(i)->id(); if (containsTriangles(0, materialId)) { triangleIndex.append(getTrianglesIndex(0, materialId).toList()); } if (containsStrips(0, materialId)) { triangleIndex.append(equivalentTrianglesIndexOfstripsIndex(0, materialId)); } if (containsFans(0, materialId)) { triangleIndex.append(equivalentTrianglesIndexOfFansIndex(0, materialId)); } } GLfloatVector vertices= m_MeshData.positionVector(); Q_ASSERT((triangleIndex.count() % 3) == 0); const int triangleCount= triangleIndex.count() / 3; for (int i= 0; i < triangleCount; ++i) { const int index= i * 3; const double v1x= vertices.at(triangleIndex.at(index) * 3); const double v1y= vertices.at(triangleIndex.at(index) * 3 + 1); const double v1z= vertices.at(triangleIndex.at(index) * 3 + 2); const double v2x= vertices.at(triangleIndex.at(index + 1) * 3); const double v2y= vertices.at(triangleIndex.at(index + 1) * 3 + 1); const double v2z= vertices.at(triangleIndex.at(index + 1) * 3 + 2); const double v3x= vertices.at(triangleIndex.at(index + 2) * 3); const double v3y= vertices.at(triangleIndex.at(index + 2) * 3 + 1); const double v3z= vertices.at(triangleIndex.at(index + 2) * 3 + 2); resultVolume+= ((v2y - v1y) * (v3z - v1z) - (v2z - v1z) * (v3y - v1y)) * (v1x + v2x + v3x); } resultVolume= resultVolume / 6.0; } return resultVolume; }
IndexList GLC_Mesh::getEquivalentTrianglesStripsFansIndex(int lod, GLC_uint materialId) { IndexList subject; if (containsTriangles(lod, materialId)) { subject= getTrianglesIndex(lod, materialId).toList(); } if (containsStrips(lod, materialId)) { subject.append(equivalentTrianglesIndexOfstripsIndex(lod, materialId)); } if (containsFans(lod, materialId)) { subject.append(equivalentTrianglesIndexOfFansIndex(lod, materialId)); } Q_ASSERT((subject.count() % 3) == 0); return subject; }