Example #1
0
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;
}
Example #2
0
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;
}