void TriBaseSurface::prepare(TangentSpaceMode tangentSpaceMode) { if (tangentSpaceMode == TangentSpaceMode_MeshMender) { std::vector<MeshMender::Vertex> vertices; const uint vertexCount = m_mesh->vertexCount(); vertices.resize(vertexCount); for (uint i = 0; i < vertexCount; i++) { const TriMesh::Vertex & vertex = m_mesh->vertexAt(i); vertices[i].pos = vertex.pos; vertices[i].normal = vertex.nor; vertices[i].s = vertex.tex.x(); vertices[i].t = vertex.tex.y(); vertices[i].tangent = Vector3(zero); vertices[i].binormal = Vector3(zero); } std::vector<unsigned int> indices; const uint faceCount = m_mesh->faceCount(); indices.resize(3 * faceCount); for (uint i = 0; i < faceCount; i++) { const TriMesh::Face & face = m_mesh->faceAt(i); indices[3 * i + 0] = face.v[0]; indices[3 * i + 1] = face.v[1]; indices[3 * i + 2] = face.v[2]; } std::vector<unsigned int> xrefs; // Default options. float minNormalsCreaseCosAngle = 0.0f; float minTangentsCreaseCosAngle = 0.0f; float minBinormalsCreaseCosAngle = 0.0f; float weightNormalsByArea = 1.0f; MeshMender::NormalCalcOption computeNormals = MeshMender::CALCULATE_NORMALS; MeshMender::ExistingSplitOption respectExistingSplits = MeshMender::DONT_RESPECT_SPLITS; MeshMender::CylindricalFixOption fixCylindricalWrapping = MeshMender::DONT_FIX_CYLINDRICAL; MeshMender mender; mender.Mend(vertices, indices, xrefs, minNormalsCreaseCosAngle, minTangentsCreaseCosAngle, minBinormalsCreaseCosAngle, weightNormalsByArea, computeNormals, respectExistingSplits, fixCylindricalWrapping); // Create new triMesh. const uint newFaceCount = indices.size() / 3; const uint newVertexCount = vertices.size(); TriMesh * triMesh = new TriMesh(newFaceCount, newVertexCount); triMesh->faces().resize(newFaceCount); triMesh->vertices().resize(newVertexCount); m_basisArray.resize(newVertexCount); for (uint i = 0; i < newVertexCount; i++) { TriMesh::Vertex & vertex = triMesh->vertexAt(i); vertex.pos = vertices[i].pos; vertex.nor = vertices[i].normal; vertex.tex = Vector2(vertices[i].s, vertices[i].t); m_basisArray[i].normal = vertices[i].normal; m_basisArray[i].tangent = vertices[i].tangent; m_basisArray[i].bitangent = vertices[i].binormal; } for (uint i = 0; i < newFaceCount; i++) { TriMesh::Face & face = triMesh->faceAt(i); face.v[0] = indices[3 * i + 0]; face.v[1] = indices[3 * i + 1]; face.v[2] = indices[3 * i + 2]; } } else if (tangentSpaceMode == TangentSpaceMode_Lengyel) { if (!MeshNormals::hasNormals(m_mesh.ptr())) { MeshNormals::computeNormals(m_mesh.ptr(), WeightFaceArea); } geometry::computeMeshTangents(m_mesh.ptr(), m_basisArray); foreach(i, m_basisArray) { Basis & basis = m_basisArray[i]; // basis.orthonormalize(); UE3_CreateOrthonormalBasis(basis); } }