Subversion Repositories gelsvn

Rev

Rev 375 | Rev 380 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 375 Rev 377
Line 11... Line 11...
11
using namespace std;
11
using namespace std;
12
using namespace HMesh;
12
using namespace HMesh;
13
 
13
 
14
namespace HMesh
14
namespace HMesh
15
{
15
{
16
		namespace
16
    namespace
17
		{
17
    {
18
				vector<int> faces;
18
        vector<int> faces;
19
				vector<int> indices;
19
        vector<int> indices;
20
				vector<Vec3f> vertices;
20
        vector<Vec3f> vertices;
21
 
21
 
22
				void coord_index_to_face_vec(const vector<int>& coord_index, 
22
        void coord_index_to_face_vec(const vector<int>& coord_index, 
23
																		 vector<int>& faces,
23
                                     vector<int>& faces,
24
																		 vector<int>& indices)
24
                                     vector<int>& indices)
25
				{
25
        {
26
						Face face;
26
            Face face;
27
						size_t k=0;
27
            size_t k=0;
28
						for(size_t i=0;i<coord_index.size();i++) 
28
            for(size_t i=0;i<coord_index.size();i++) 
29
						{
29
            {
30
								int idx = coord_index[i];
30
                int idx = coord_index[i];
31
								if (idx==-1) 
31
                if (idx==-1) 
32
								{
32
                {
33
										faces.push_back(k);
33
                    faces.push_back(k);
34
										k=0;
34
                    k=0;
35
								}
35
                }
36
								else
36
                else
37
								{
37
                {
38
										indices.push_back(idx);
38
                    indices.push_back(idx);
39
										++k;
39
                    ++k;
-
 
40
                }
40
								}
41
            }
41
						}
42
        }
42
				}
43
    }
43
 
44
 
44
		}
-
 
45
	
-
 
46
    void handle_X3D(XmlElement& elem)
45
    void handle_X3D(XmlElement& elem)
47
    {
46
    {
48
      elem.process_elements();
47
        elem.process_elements();
49
    }
48
    }
50
 
49
 
51
    void handle_Scene(XmlElement& elem)
50
    void handle_Scene(XmlElement& elem)
52
    {
51
    {
53
      elem.process_elements();
52
        elem.process_elements();
54
    }
53
    }
55
 
54
 
56
    void handle_Transform(XmlElement& elem)
55
    void handle_Transform(XmlElement& elem)
57
    {
56
    {
58
      elem.process_elements();
57
        elem.process_elements();
59
    }
58
    }
60
 
59
 
61
    void handle_Shape(XmlElement& elem)
60
    void handle_Shape(XmlElement& elem)
62
    {
61
    {
63
      cout << "Found shape" << endl;
62
        cout << "Found shape" << endl;
64
      elem.process_elements();
63
        elem.process_elements();
65
			cout << "Shape ends" << endl;				
64
        cout << "Shape ends" << endl;				
66
    }
65
    }
67
 
66
 
68
    void handle_IndexedFaceSet(XmlElement& elem)
67
    void handle_IndexedFaceSet(XmlElement& elem)
69
    {
68
    {
70
			vector<int> coord_index;
69
        vector<int> coord_index;
71
			parse(elem.atts["coordIndex"].c_str(), coord_index);
70
        parse(elem.atts["coordIndex"].c_str(), coord_index);
72
			coord_index_to_face_vec(coord_index, faces, indices);
71
        coord_index_to_face_vec(coord_index, faces, indices);
-
 
72
        elem.process_elements();
73
    }
73
    }
74
 
74
 
75
    void handle_Coordinate(XmlElement& elem)
75
    void handle_Coordinate(XmlElement& elem)
76
    {
76
    {
77
		  parse(elem.atts["point"].c_str(), vertices);
77
        parse(elem.atts["point"].c_str(), vertices);
78
    }
78
    }
79
 
79
 
80
		int find_last_of(const std::string& F, const std::string& C)
80
    int find_last_of(const std::string& F, const std::string& C)
81
		{
81
    {
82
				size_t pos = F.find_last_of(C);
82
        size_t pos = F.find_last_of(C);
83
				if (pos == string::npos) 
83
        if (pos == string::npos) 
84
						return -1;
84
            return -1;
85
				return pos;
85
        return pos;
86
		}
86
    }
87
 
-
 
88
		bool x3d_load(const std::string& filename, Manifold& mani) 
-
 
89
		{
-
 
90
				faces.clear();
-
 
91
				indices.clear();
-
 
92
				vertices.clear();
-
 
93
 
-
 
94
				Timer tim;
-
 
95
				tim.start();
-
 
96
 
-
 
97
				std::string baseurl;
-
 
98
				int idx = s_max(find_last_of(filename, "\\"), 
-
 
99
												find_last_of(filename, "/"));
-
 
100
 
87
 
-
 
88
    bool x3d_load(const std::string& filename, Manifold& mani) 
-
 
89
    {
-
 
90
        faces.clear();
-
 
91
        indices.clear();
-
 
92
        vertices.clear();
-
 
93
 
-
 
94
        Timer tim;
-
 
95
        tim.start();
-
 
96
 
-
 
97
        std::string baseurl;
-
 
98
        int idx = s_max(find_last_of(filename, "\\"), 
-
 
99
                        find_last_of(filename, "/"));
-
 
100
 
101
				if(idx != -1)
101
        if(idx != -1)
102
						baseurl = std::string(filename.substr(0, idx+1));
102
          baseurl = std::string(filename.substr(0, idx+1));
103
 
103
 
104
        XmlDoc x3d_doc(filename.c_str());
104
        XmlDoc x3d_doc(filename.c_str());
105
        x3d_doc.add_handler("X3D", handle_X3D);
105
        x3d_doc.add_handler("X3D", handle_X3D);
106
        x3d_doc.add_handler("Scene", handle_Scene);
106
        x3d_doc.add_handler("Scene", handle_Scene);
107
        x3d_doc.add_handler("Shape", handle_Shape);
107
        x3d_doc.add_handler("Shape", handle_Shape);
108
        x3d_doc.add_handler("Transform", handle_Transform);
108
        x3d_doc.add_handler("Transform", handle_Transform);
109
        x3d_doc.add_handler("IndexedFaceSet", handle_IndexedFaceSet);
109
        x3d_doc.add_handler("IndexedFaceSet", handle_IndexedFaceSet);
110
        x3d_doc.add_handler("Coordinate", handle_Coordinate);
110
        x3d_doc.add_handler("Coordinate", handle_Coordinate);
111
        x3d_doc.process_elements();
111
        x3d_doc.process_elements();
112
 
112
 
113
				build_manifold(mani, vertices.size(), &vertices[0], faces.size(),
113
        build_manifold(mani, vertices.size(), &vertices[0], faces.size(),
114
											 &faces[0], &indices[0]);
114
                       &faces[0], &indices[0]);
115
 
115
 
116
				cout << " Loading took " << tim.get_secs() << endl;
116
        cout << " Loading took " << tim.get_secs() << endl;
117
				return false;
117
        return false;
118
		}
118
    }
119
}
119
}