Rev 150 | Rev 394 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
#include <fstream>
#include <string>
#include "x3d_save.h"
#include "HMesh/FaceCirculator.h"
namespace HMesh
{
using namespace std;
using namespace CGLA;
using namespace HMesh;
namespace
{
const string X3D_BEGIN =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<!DOCTYPE X3D PUBLIC \"http://www.web3D.org/TaskGroups/x3d/translation/x3d-compact.dtd\"\n"
"\"/www.web3d.org/TaskGroups/x3d/translation/x3d-compact.dtd\">\n"
"<X3D>\n"
" <head>\n"
" </head>\n"
" <Scene>\n"
" <Viewpoint description=\"Pyramid\" orientation=\"0 1 0 .2\" position=\"4 0 25\"/>\n"
" <NavigationInfo type=\"EXAMINE ANY\"/>\n";
const string X3D_END =
" </Scene>\n"
"</X3D>\n";
}
bool x3d_save(const std::string& filename, Manifold& m)
{
ofstream os(filename.data());
if(os.bad()) return false;
os << X3D_BEGIN << endl;
os << "<Shape>\n"
<< "<Appearance>\n"
<< "<Material diffuseColor=\"0.8 0.8 0.2\" specularColor=\"0 0 0.5\"/>\n"
<< "</Appearance>\n";
os << "<Coordinate point=\"" << endl;
vector<int> touch(m.no_vertices());
int max_vertex_idx=0;
for(VertexIter vi = m.vertices_begin(); vi != m.vertices_end();
++vi,++max_vertex_idx)
{
touch[max_vertex_idx] = vi->touched;
vi->touched = max_vertex_idx;
Vec3f p = vi->pos;
os << p[0] << " " << p[1] << " " << p[2] << "\n";
}
os << "\"/>" << endl;
os << "<IndexedFaceSet coordIndex=\"" << endl;
for(FaceIter fi = m.faces_begin();fi != m.faces_end(); ++fi)
{
std::vector<int> verts;
for(FaceCirculator fc(fi);!fc.end();++fc)
{
int vertex_idx = fc.get_vertex()->touched;
if(vertex_idx >= max_vertex_idx)
{
cout << vertex_idx << " " << max_vertex_idx << endl;
verts.push_back(0);
}
else
{
assert(vertex_idx < max_vertex_idx);
verts.push_back(vertex_idx);
}
}
//assert(verts.size()==3);
for(size_t i=1;i<(verts.size()-1);++i)
{
os << verts[0] << " " << verts[i] << " " << verts[i+1] << " -1\n";
}
}
os << "\">" << endl;
os << "</IndexedFaceSet>\n"
<< "</Shape>\n";
os << X3D_END << endl;
max_vertex_idx=0;
for(VertexIter vi = m.vertices_begin(); vi != m.vertices_end(); ++vi,
++max_vertex_idx)
vi->touched = touch[max_vertex_idx];
return false;
}
}