Subversion Repositories gelsvn

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

#include <sstream>
#include <fstream>
#include <unistd.h>

#include "CGLA/Mat2x2f.h"
#include "Geometry/Polygonizer.h"
#include "Geometry/TrilinFilter.h"
#include "Geometry/load_raw.h"
#include "HMeshUtil/build_manifold.h"
#include "HMeshUtil/x3d_save.h"
#include "Util/ArgExtracter.h"

using namespace HMesh;
using namespace HMeshUtil;
using namespace Geometry;
using namespace CGLA;
using namespace Util;
using namespace std;

typedef RGrid<unsigned char> RGridb;

class VolumeImplicit: public ImplicitFunction
{
                TrilinFilter<RGridb> trifi;
                
public:
                
                VolumeImplicit(const RGridb* g): trifi(g) {}
                
                float eval(float x,float y,float z) 
                                {
                                                if(trifi.in_domain(Vec3f(x,y,z)))
                                                {
                                                                unsigned char v =trifi(Vec3f(x,y,z));
                                                                return static_cast<float>(v);
                                                }
                                                return 0;
                                }
};



int main(int argc, char **argv)
{
        ArgExtracter ae(argc, argv);
        float iso = 30;
        ae.extract("-i", iso);
        int X  = 256;
        ae.extract("-x", X);
        int Y  = 256;
        ae.extract("-y", Y);
        int Z  = 256;
        ae.extract("-z", Z);
        string file = ae.get_last_arg();
        
        RGridb grid(Vec3i(X,Y,Z));
        load_raw(file,grid);

        VolumeImplicit vol_imp(&grid);
        Polygonizer pol(&vol_imp, 1.0f/X, iso); 
        pol.march(0,0,0);

        vector<int> indices;
        vector<Vec3f> verts;
        vector<int> faces;
        
        for(int i=0;i<pol.no_vertices();++i)
        {
                        verts.push_back(*reinterpret_cast<Vec3f*>(&pol.get_vertex(i)));
        }
        for(int i=0;i<pol.no_triangles();++i)
        {
                        faces.push_back(3);
                        TRIANGLE f = pol.get_triangle(i);
                        indices.push_back(f.v0);
                        indices.push_back(f.v1);
                        indices.push_back(f.v2);
        }

        Manifold m;
        build_manifold(m, 
                                                                 verts.size(), &verts[0], 
                                                                 faces.size(), &faces[0], &indices[0]);
        x3d_save("bp.x3d", m);
        
}