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); } }