/** * Create the VBO for the triangles * */ void CreateTrianglesVBO() { trianglesVBO.Invalidate(); List <RenderVertex> renderVertices = new List <RenderVertex>(); for (int triangleIndex = 0; triangleIndex < mesh.GetNumberOfTriangles(); triangleIndex++) { Triangle t = mesh.GetTriangle(triangleIndex); for (int vertexIndex = 0; vertexIndex < 3; vertexIndex++) { Vector3 pos = mesh.GetVertex(t.GetVertexIndex(vertexIndex)); Vector2 textCoords = mesh.GetTextureCoordinate(t.GetTexCoordIndex(vertexIndex)); renderVertices.Add(new RenderVertex(pos, t.Normal, color, textCoords)); } } trianglesVBO.Setup(renderVertices, PrimitiveType.Triangles); }
public static ITriangleMesh Snap(ITriangleMesh mesh, float epsilon) { Dictionary <int, int> vertexMapping = new Dictionary <int, int>(); ITriangleMesh result = new TriangleMesh(); for (int i = 0; i < mesh.GetNumberOfVertices(); i++) { Vector3 vi = mesh.GetVertex(i); bool found = false; for (int j = 0; j < result.GetNumberOfVertices(); j++) { Vector3 vj = result.GetVertex(j); if (Vector3.Subtract(vi, vj).Length < epsilon) { vertexMapping[i] = j; found = true; } } if (!found) { int idx = result.AddVertex(vi); vertexMapping[i] = idx; } } for (int i = 0; i < mesh.GetNumberOfTexCoords(); i++) { result.AddTextureCoordinate(mesh.GetTextureCoordinate(i)); } for (int i = 0; i < mesh.GetNumberOfTriangles(); i++) { Triangle t = mesh.GetTriangle(i).Clone(); t.A = vertexMapping[t.A]; t.B = vertexMapping[t.B]; t.C = vertexMapping[t.C]; result.AddTriangle(t); } Console.WriteLine("Mesh snapping: " + mesh.GetNumberOfVertices() + " -> " + result.GetNumberOfVertices() + " verts."); return(result); }
/** * Generated the unification of two meshes. Attention: no new mesh is generated, in fact the * geometry of mesh2 is added to mesh1. */ public static void Unite(ITriangleMesh mesh1, ITriangleMesh mesh2) { int numberOfVertsMesh1 = mesh1.GetNumberOfVertices(); int numberOfTexCoordsMesh1 = mesh1.GetNumberOfTexCoords(); for (int i = 0; i < mesh2.GetNumberOfVertices(); i++) { mesh1.AddVertex(mesh2.GetVertex(i)); } for (int i = 0; i < mesh2.GetNumberOfTexCoords(); i++) { mesh1.AddTextureCoordinate(mesh2.GetTextureCoordinate(i)); } for (int i = 0; i < mesh2.GetNumberOfTriangles(); i++) { Triangle t = mesh2.GetTriangle(i).Clone(); t.VertexIndexOffset(numberOfVertsMesh1); t.TexCoordsIndexOffset(numberOfTexCoordsMesh1); mesh1.AddTriangle(t); } mesh1.ComputeTriangleNormals(); }