Subversion Repositories gelsvn

Rev

Blame | Last modification | View Log | RSS feed

#include <fstream>
#include <string>
#include "x3d_save.h"
#include "HMesh/FaceCirculator.h"

namespace HMeshUtil
{
        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->get_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(int 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];
        }
}