shaaa - 2019-07-27

I successfully compiled filter_csg module from meshlabplugins according to my requirements.

Initially it loads the meshes ( i mean mesh1 and mesh2 ) , till Rasterizing everything is ok, but after the Rasterizing marching cubes reconstruction is not working ..

Here is my code snippet. Please provide a way to get out of this problem....

string errorMessage;

if (1)
{
    m1.face.EnableFFAdjacency();
    tri::UpdateTopology<CMeshO>::FaceFace(m1);

    std::vector<Point3f> faceNormal;

    faceNormal.resize(m1.face.size());
    std::vector<Point3f>::iterator ci1;
    CMeshO::FaceIterator fi;
    for (fi = m1.face.begin(), ci1 = faceNormal.begin(); fi != m1.face.end(); ++fi, ++ci1)
        if (!(*fi).IsD()) (*ci1) = (*fi).N();

    m1.face.EnableQuality();

    m2.face.EnableFFAdjacency();
    tri::UpdateTopology<CMeshO>::FaceFace(m2);

    std::vector<Point3f> faceNormal1;

    faceNormal1.resize(m2.face.size());
    std::vector<Point3f>::iterator ci;
    CMeshO::FaceIterator fi1;
    for (fi1 = m2.face.begin(), ci = faceNormal1.begin(); fi1 != m2.face.end(); ++fi1, ++ci)
        if (!(*fi1).IsD()) (*ci) = (*fi1).N();

    m2.face.EnableQuality();
}
if (!isValid(m1, errorMessage) || !isValid(m2, errorMessage))
    return false;

if (1)
{
    std::vector<Point3f> faceNormal;

    faceNormal.resize(m1.face.size());
    std::vector<Point3f>::iterator ci1;
    CMeshO::FaceIterator fi;
    for (fi = m1.face.begin(), ci1 = faceNormal.begin(); fi != m1.face.end(); ++fi, ++ci1)
        if (!(*fi).IsD()) (*ci1) = (*fi).N();

    m1.face.EnableQuality();

    std::vector<Point3f> faceNormal1;

    faceNormal1.resize(m2.face.size());
    std::vector<Point3f>::iterator ci;
    CMeshO::FaceIterator fi1;
    for (fi1 = m2.face.begin(), ci = faceNormal1.begin(); fi1 != m2.face.end(); ++fi1, ++ci)
        if (!(*fi1).IsD()) (*ci) = (*fi1).N();

    m2.face.EnableQuality();
}

for (size_t ii = 0; ii < m1.VN(); ++ii)
    m1.vert[ii].P() = m1.Tr * m1.vert[ii].P();
vcg::tri::UpdateBounding<CMeshO>::Box(m1);
vcg::tri::UpdateNormal<CMeshO>::PerVertexNormalizedPerFaceNormalized(m1);

for (size_t ii = 0; ii < m2.VN(); ++ii)
    m2.vert[ii].P() = m2.Tr * m2.vert[ii].P();
vcg::tri::UpdateBounding<CMeshO>::Box(m2);
vcg::tri::UpdateNormal<CMeshO>::PerVertexNormalizedPerFaceNormalized(m2);

typedef CMeshO::ScalarType scalar;

    const scalar d = 3.1500f;

    typedef Intercept<mpq_class, scalar> intercept;

    const Point3f delta(d, d, d);
    const int subFreq = 32; 
    //Log(0, "Rasterizing first volume...");
    InterceptVolume<intercept> v = InterceptSet3<intercept>(m1, delta, subFreq, callback);
    //Log(0, "Rasterizing second volume...");
    InterceptVolume<intercept> tmp = InterceptSet3<intercept>(m2, delta, subFreq, callback);

    CMeshO mesh;

    v &= tmp;
        //mesh = md.addNewMesh("", "intersection");

        //v |= tmp;
        //mesh = md.addNewMesh("", "union");

    //v -= tmp;
        //mesh = md.addNewMesh("", "difference");

    typedef vcg::intercept::Walker<CMeshO, intercept> MyWalker;
    typedef vcg::tri::MarchingCubes<CMeshO, MyWalker> mymarchingcubes;
        MyWalker walker;
    mymarchingcubes mc(mesh, walker);
    walker.BuildMesh<mymarchingcubes>(mesh, v, mc, callback);
    //Log(0, "Done");

    vcg::tri::UpdateBounding<CMeshO>::Box(mesh);
    vcg::tri::UpdateNormal<CMeshO>::PerFaceFromCurrentVertexNormal(mesh);

    vcg::tri::io::ExporterOFF<CMeshO>::Save(mesh, "ss.ply");