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);
}