Subversion Repositories gelsvn

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
39 bj 1
#include <fstream>
2
#include <string>
3
#include "x3d_save.h"
4
#include "HMesh/FaceCirculator.h"
5
 
6
namespace HMeshUtil
7
{
8
	using namespace std;
9
	using namespace CGLA;
10
	using namespace HMesh;
11
 
12
 
13
	namespace
14
	{
15
		const string X3D_BEGIN = 
16
		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
17
		"<!DOCTYPE X3D PUBLIC \"http://www.web3D.org/TaskGroups/x3d/translation/x3d-compact.dtd\"\n"
18
		"\"/www.web3d.org/TaskGroups/x3d/translation/x3d-compact.dtd\">\n"
19
		"<X3D>\n"
20
		"  <head>\n"
21
		"  </head>\n"
22
		"  <Scene>\n"
23
		"		<Viewpoint description=\"Pyramid\" orientation=\"0 1 0 .2\" position=\"4 0 25\"/>\n"
24
		"    <NavigationInfo type=\"EXAMINE ANY\"/>\n";
25
 
26
		const string X3D_END = 
27
		"  </Scene>\n"
28
		"</X3D>\n";
29
 
30
	}
31
 
32
	bool x3d_save(const std::string& filename, Manifold& m)
33
	{
34
		ofstream os(filename.data());
35
		if(os.bad()) return false;
36
		os << X3D_BEGIN << endl;
37
 
38
		os << "<Shape>\n"
39
			 << "<Appearance>\n"
40
			 << "<Material diffuseColor=\"0.8 0.8 0.2\" specularColor=\"0 0 0.5\"/>\n"
41
			 << "</Appearance>\n";
42
 
43
		os <<  "<Coordinate point=\"" << endl;
44
		vector<int> touch(m.no_vertices());
45
		int max_vertex_idx=0;
46
		for(VertexIter vi = m.vertices_begin(); vi != m.vertices_end(); 
47
				++vi,++max_vertex_idx)
48
			{
49
				touch[max_vertex_idx] = vi->touched;
50
				vi->touched = max_vertex_idx;
62 jab 51
				Vec3f p = vi->pos;
39 bj 52
				os << p[0] << " " << p[1] << " " << p[2] << "\n";
53
			}
54
		os << "\"/>" << endl;
55
 
56
		os << "<IndexedFaceSet coordIndex=\"" << endl;
57
		for(FaceIter fi = m.faces_begin();fi != m.faces_end(); ++fi)
58
			{
59
				std::vector<int> verts;
60
				for(FaceCirculator fc(fi);!fc.end();++fc)
61
					{
62
						int vertex_idx = fc.get_vertex()->touched;
63
						if(vertex_idx >= max_vertex_idx)
64
							{
65
								cout << vertex_idx  << " " << max_vertex_idx << endl;
66
								verts.push_back(0);
67
							}
68
						else
69
							{
70
								assert(vertex_idx < max_vertex_idx);
71
								verts.push_back(vertex_idx);
72
							}
73
					}
74
				//assert(verts.size()==3);
75
				for(int i=1;i<(verts.size()-1);++i)
76
					{
77
						os << verts[0] << " " << verts[i] << " " << verts[i+1] << " -1\n";
78
					}
79
			}
80
		os << "\">" << endl;
81
		os << "</IndexedFaceSet>\n"
82
			 << "</Shape>\n";
83
		os << X3D_END << endl;
84
 
85
		max_vertex_idx=0;
86
		for(VertexIter vi = m.vertices_begin(); vi != m.vertices_end(); ++vi,
87
					++max_vertex_idx)
88
			vi->touched = touch[max_vertex_idx];
102 bj 89
 
90
		return false;
39 bj 91
	}
92
}