Subversion Repositories gelsvn

Rev

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

Rev 630 Rev 652
Line 4... Line 4...
4
 * For license and list of authors, see ../../doc/intro.pdf
4
 * For license and list of authors, see ../../doc/intro.pdf
5
 * ----------------------------------------------------------------------- */
5
 * ----------------------------------------------------------------------- */
6
 
6
 
7
#include <fstream>
7
#include <fstream>
8
#include "obj_load.h"
8
#include "obj_load.h"
9
 
-
 
10
#include "../Geometry/obj_load.h"
-
 
11
#include "../Geometry/TriMesh.h"
-
 
12
 
-
 
13
#include "Manifold.h"
9
#include "Manifold.h"
14
 
10
 
15
using namespace std;
11
using namespace std;
16
using namespace CGLA;
12
using namespace CGLA;
17
 
13
 
18
namespace HMesh
14
namespace HMesh
19
{
15
{
20
    using std::string;
16
    using std::string;
21
    using Geometry::TriMesh;
-
 
22
    using Geometry::obj_load;
-
 
23
    
17
    
24
    bool obj_load(const string& filename, Manifold& m)
18
    bool obj_load(const string& filename, Manifold& m)
25
    {
19
    {
26
        ifstream ifs(filename.data());
20
        ifstream obj_file(filename.data());
27
        
21
        
28
        if(ifs)
22
        if(obj_file)
29
        {
23
        {
-
 
24
            string buf;
30
            vector<Vec3f> vertices;
25
            vector<Vec3f> vertices;
31
            vector<int> faces;
26
            vector<int> faces;
32
            vector<int> indices;
27
            vector<int> indices;
-
 
28
            
33
            while(ifs.good() && !ifs.eof())
29
            while(obj_file >> buf)
34
            {
30
            {
35
                string tok;
-
 
36
                ifs >> tok;
-
 
37
                if(tok == "v")
31
                switch(buf[0])
38
                {
-
 
39
                    float x,y,z;
-
 
40
                    ifs >> x >> y >> z;
-
 
41
                    vertices.push_back(Vec3f(x,y,z));
-
 
42
                    char line[1000];
-
 
43
                    ifs.getline(line, 998);
-
 
44
                }
-
 
45
                else if(tok == "f")
-
 
46
                {
32
                {
47
                    char line[1000];
-
 
48
                    ifs.getline(line, 998);
33
                    case 'v': // v, vn, vt
49
                    char* pch = strtok(line, " \t");
-
 
50
                    int ctr = 0;
-
 
51
                    while(pch != 0)
-
 
52
                    {
34
                    {
-
 
35
                        if(buf == "v")
53
                        int v;
36
                        {
54
                        sscanf(pch, "%d", &v);
37
                            Vec3f v_geo;
-
 
38
                            obj_file >> v_geo;
55
                        indices.push_back(v-1);
39
                            vertices.push_back(v_geo);
-
 
40
                        }
-
 
41
                        else if(buf == "vn")
-
 
42
                        {
-
 
43
                            Vec3f v_norm;
-
 
44
                            obj_file >> v_norm;
-
 
45
                        }
56
                        pch = strtok(0, " \t");
46
                        else if(buf == "vt")
-
 
47
                        {
-
 
48
                            Vec3f v_tex;
-
 
49
                            obj_file >> v_tex[0] >> v_tex[1];
-
 
50
                            v_tex[2]=1;
57
                        ++ctr;
51
                        }
58
                    }
52
                    }
-
 
53
                        break;
-
 
54
                    case 'f':
-
 
55
                    {
-
 
56
                        char line[1024];
-
 
57
                        
-
 
58
                        vector<int> v_indices;
-
 
59
                        vector<int> t_indices;
-
 
60
                        vector<int> n_indices;
-
 
61
                        
-
 
62
                        obj_file.getline(line, 1022);
-
 
63
                        char* pch = strtok(line, " \t");
-
 
64
                        int ctr = 0;
-
 
65
                        while(pch != 0)
-
 
66
                        {
-
 
67
                            int v,t,n;
-
 
68
                            if(sscanf(pch, "%d/%d/%d", &v, &t, &n)==3)
-
 
69
                            {
-
 
70
                                indices.push_back(v>0?v-1:vertices.size()+v);
-
 
71
                                ++ctr;
-
 
72
                            }
-
 
73
                            else if(sscanf(pch, "%d//%d", &v, &n)==2)
-
 
74
                            {
-
 
75
                                indices.push_back(v>0?v-1:vertices.size()+v);
-
 
76
                                ++ctr;
-
 
77
                            }
-
 
78
                            else if(sscanf(pch, "%d/%d", &v, &t)==2)
-
 
79
                            {
-
 
80
                                indices.push_back(v>0?v-1:vertices.size()+v);
-
 
81
                                ++ctr;
-
 
82
                            }
-
 
83
                            else if(sscanf(pch, "%d", &v)==1)
-
 
84
                            {
-
 
85
                                indices.push_back(v>0?v-1:vertices.size()+v);
-
 
86
                                ++ctr;
-
 
87
                            }
-
 
88
                            pch = strtok(0, " \t");
59
                    if(ctr)
89
                        }
60
                        faces.push_back(ctr);
90
                        faces.push_back(ctr);
61
                }
91
                    }
-
 
92
                        break;
62
                else
93
                    case 'm':
-
 
94
                        obj_file >> buf;
-
 
95
                        break;
63
                {
96
                    case 'u':
-
 
97
                        obj_file >> buf;
64
                    char line[1000];
98
                        break;
-
 
99
                    case '#':
-
 
100
                    default:
65
                    ifs.getline(line, 998);
101
                        obj_file.ignore(1024, '\n');
-
 
102
                        break;
66
                }
103
                }
67
            }
104
            }
-
 
105
            cout << vertices.size() << " " << faces.size() << endl;
68
            m.clear();
106
            m.clear();
69
            m.build(vertices.size(),
107
            m.build(vertices.size(),
70
                    reinterpret_cast<float*>(&vertices[0]),
108
                    reinterpret_cast<float*>(&vertices[0]),
71
                    faces.size(),
109
                    faces.size(),
72
                    &faces[0],
110
                    &faces[0],