MeshData *TetGenCaller::CopyTetMesh(tetgenio *io)
{
    MeshData *NewMesh = new MeshData(this->Mesh->BoundingBox);

    // Add vertices
    for (int i = 0; i < io->numberofpoints; i++) {
        double *c;
        c = &io->pointlist[3 * i];
        NewMesh->VertexOctreeRoot->AddVertex(c[0], c[1], c[2]);
    }

    // Add triangles
    for (int i = 0; i < io->numberoftrifaces; i++) {
        int *triface;
        int marker = io->trifacemarkerlist[i];
        triface = &io->trifacelist[3 * i];
        TriangleType *t = NewMesh->AddTriangle({triface[0], triface[1], triface[2]});
        t->InterfaceID = marker;
    }

    // Add tetrahedrons
    for (int i = 0; i < io->numberoftetrahedra; i++) {
        int *tet = &io->tetrahedronlist[4 * i];
        TetType *t = NewMesh->AddTetrahedron({tet[0], tet[1], tet[2], tet[3]});

        if (io->numberoftetrahedronattributes == 1) {
            int tetattr = io->tetrahedronattributelist[i];
            t->MaterialID = tetattr;
        } else {
            t->MaterialID = 0;
        }
    }

    return NewMesh;
}