void RenderableConcave::tessellate(const Polygon3D& polygon) {
	if (polygon.size() < 3) return;

	float minX = (std::numeric_limits<float>::max)();
	float maxX = (std::numeric_limits<float>::min)();
	float minY = (std::numeric_limits<float>::max)();
	float maxY = (std::numeric_limits<float>::min)();

	for (int i = 0; i < polygon.size(); i++) {
		minX = std::min<float>(polygon[i].x(), minX);
		maxX = std::max<float>(polygon[i].x(), maxX);
		minY = std::min<float>(polygon[i].y(), minY);
		maxY = std::max<float>(polygon[i].y(), maxY);
	}

	std::vector<Polygon3D> trapezoids = polygon.tessellate();

	for (int i = 0; i < trapezoids.size(); ++i) {
		if (trapezoids[i].size() < 3) continue;

		QVector2D tex0((trapezoids[i][0].x() - minX) / (maxX - minX), (trapezoids[i][0].y() - minY) / (maxY - minY));
		for (int j = 1; j < trapezoids[i].size() - 1; ++j) {
			generateMeshVertex(trapezoids[i][0].x(), trapezoids[i][0].y(), trapezoids[i][0].z(), 0, 0, 1, tex0.x(), tex0.y());
			generateMeshVertex(trapezoids[i][j].x(), trapezoids[i][j].y(), trapezoids[i][j].z(), 0, 0, 1, (trapezoids[i][j].x() - minX) / (maxX - minX), (trapezoids[i][j].y() - minY) / (maxY - minY));
			generateMeshVertex(trapezoids[i][j+1].x(), trapezoids[i][j+1].y(), trapezoids[i][j+1].z(), 0, 0, 1, (trapezoids[i][j+1].x() - minX) / (maxX - minX), (trapezoids[i][j+1].y() - minY) / (maxY - minY));
		}
	}
}
void RenderableLineList::addLine(const Polygon3D &polygon, const QVector3D &normal, const QColor& color) {
	for (int i = 0; i < polygon.size(); ++i) {
		int next = (i + 1) % polygon.size();
		generateMeshVertex(polygon[i].x(), polygon[i].y(), polygon[i].z(), normal.x(), normal.y(), normal.z(), color);
		generateMeshVertex(polygon[next].x(), polygon[next].y(), polygon[next].z(), normal.x(), normal.y(), normal.z(), color);
	}
}
void RenderableConcave::tessellate(const Polygon3D& polygon, const QColor& color) {
	if (polygon.size() < 3) return;

	std::vector<Polygon3D> trapezoids = polygon.tessellate();

	for (int i = 0; i < trapezoids.size(); ++i) {
		if (trapezoids[i].size() < 3) continue;

		QVector3D n = Util::calculateNormal(trapezoids[i][0], trapezoids[i][1], trapezoids[i][2]);

		for (int j = 1; j < trapezoids[i].size() - 1; ++j) {
			generateMeshVertex(trapezoids[i][0].x(), trapezoids[i][0].y(), trapezoids[i][0].z(), 0, 0, 1, color);
			generateMeshVertex(trapezoids[i][j].x(), trapezoids[i][j].y(), trapezoids[i][j].z(), 0, 0, 1, color);
			generateMeshVertex(trapezoids[i][j+1].x(), trapezoids[i][j+1].y(), trapezoids[i][j+1].z(), 0, 0, 1, color);
		}
	}
}
bool CExporter::buildOneMeshRigid(grp::RigidMeshExporter* rigidMesh,
								   INode* node,
								   Mesh* mesh)
{
	//顶点信息
	std::vector<ExportVertex> exportVertices;
	//索引
	std::vector< std::vector<grp::LodIndices> > buffers;

	//构建顶点信息
	if (!generateMeshVertex(node, mesh, exportVertices, buffers))
	{
		return false;
	}
	if (!buildGrpRigidMesh(rigidMesh, node, mesh, exportVertices, buffers))
	{
		return false;
	}
	return true;
}
bool CExporter::buildOneMeshSkin(grp::SkinnedMeshExporter* skinnedMesh,
								  INode* node,
								  ISkin* skin,
								  ISkinContextData* data,
								  Mesh* mesh)
{
	//顶点信息
	std::vector<ExportVertex> exportVertices;
	//索引
	std::vector< std::vector<grp::LodIndices> > buffers;	//每个子mesh,每级lod的index buffer

	//构建顶点信息
	if (!generateMeshVertex(node, mesh, exportVertices, buffers))
	{
		return false;
	}
	if (!buildGrpSkinnedMesh(skinnedMesh,	node, skin,	data, mesh, exportVertices, buffers))
	{
		return false;
	}
	return true;
}
void RenderableLineList::addLine(const Polyline3D &polyline, const QVector3D &normal, const QColor& color) {
	for (int i = 0; i < polyline.size() - 1; ++i) {
		generateMeshVertex(polyline[i].x(), polyline[i].y(), polyline[i].z(), normal.x(), normal.y(), normal.z(), color);
		generateMeshVertex(polyline[i + 1].x(), polyline[i + 1].y(), polyline[i + 1].z(), normal.x(), normal.y(), normal.z(), color);
	}
}