Subversion Repositories gelsvn

Rev

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

Rev 605 Rev 606
Line 56... Line 56...
56
			if (i<0) {
56
			if (i<0) {
57
				return mesh->texcoords.no_vertices()+i;
57
				return mesh->texcoords.no_vertices()+i;
58
			} else
58
			} else
59
				return i-1;
59
				return i-1;
60
		}
60
		}
-
 
61
 
-
 
62
    void read_material_library(const string& filename, vector<Material>& materials);
61
		
63
 
62
	public:
64
	public:
63
        
65
        
64
		TriMeshObjLoader(TriMesh *_mesh): mesh(_mesh) {}
66
		TriMeshObjLoader(TriMesh *_mesh): mesh(_mesh) {}
65
		
67
		
66
		void load(const std::string& filename);
68
		void load(const std::string& filename);
67
        
69
        
-
 
70
    void load_material_library(const string& filename, vector<Material>& materials)
-
 
71
    {
-
 
72
      pathname = get_path(filename);
68
		void read_material_library(const string& filename);
73
      read_material_library(filename, materials);
69
        
74
    }        
70
	};
75
	};
71
	
76
	
72
	void TriMeshObjLoader::read_material_library(const string& filename)
77
	void TriMeshObjLoader::read_material_library(const string& filename, vector<Material>& materials)
73
	{
78
	{
74
		string fn = pathname + filename;
79
    string fn = pathname + filename;
75
        ifstream material_file(fn.data());
80
    ifstream material_file(fn.data());  
-
 
81
    if(!material_file)
-
 
82
    {
-
 
83
      cerr << "Could not open " << filename << endl;
-
 
84
      return;
76
        
85
    }
-
 
86
 
-
 
87
    string buf;
-
 
88
    unsigned int nummaterials=0;
77
		if(material_file)
89
    while(material_file >> buf)
-
 
90
    {
-
 
91
      switch(buf[0])
-
 
92
      {
-
 
93
      case 'n':
-
 
94
        ++nummaterials;
-
 
95
        mesh->materials.push_back(Material());
-
 
96
        material_file >> materials[nummaterials].name;
-
 
97
        break;
-
 
98
      case 'N':
-
 
99
        switch(buf[1])
78
        {
100
        {
79
            string buf;
-
 
80
            unsigned int nummaterials=0;
-
 
81
            while(material_file >> buf)
-
 
82
            {
-
 
83
                switch(buf[0])
-
 
84
                {
101
        case 's':
85
                    case 'n':
-
 
86
                        ++nummaterials;
-
 
87
                        mesh->materials.push_back(Material());
-
 
88
                        material_file >> mesh->materials[nummaterials].name;
-
 
89
                        break;
-
 
90
                    case 'N':
-
 
91
                        switch(buf[1])
-
 
92
                    {
-
 
93
                        case 's':
-
 
94
                            material_file >> mesh->materials[nummaterials].shininess;
102
          material_file >> materials[nummaterials].shininess;
95
                            mesh->materials[nummaterials].shininess *= 128.0f/1000.0f;
103
          materials[nummaterials].shininess *= 128.0f/1000.0f;
96
                            break;
104
          break;
97
                        case 'i':
105
        case 'i':
98
                            material_file >> mesh->materials[nummaterials].ior_in;
106
          material_file >> materials[nummaterials].ior;
99
                            break;
107
          break;
100
                    }
108
        }
101
                        break;
109
        break;
102
                    case 'K':
110
      case 'K':
103
                        switch(buf[1])
111
        switch(buf[1])
104
					{
112
        {
105
                        case 'd':
113
        case 'd':
106
                            material_file >> mesh->materials[nummaterials].diffuse;
114
          material_file >> materials[nummaterials].diffuse[0]
107
                            break;
115
                        >> materials[nummaterials].diffuse[1]
108
                        case 's':
-
 
109
                            material_file >> mesh->materials[nummaterials].specular;
116
                        >> materials[nummaterials].diffuse[2];
110
                            break;
117
          break;
111
                        case 'a':
118
        case 's':
112
                            material_file >> mesh->materials[nummaterials].ambient;
119
          material_file >> materials[nummaterials].specular[0]
113
                            break;
120
                        >> materials[nummaterials].specular[1]
114
					}
-
 
115
                        break;
-
 
116
                    case 'T':
-
 
117
                        material_file >> mesh->materials[nummaterials].transmission;
121
                        >> materials[nummaterials].specular[2];
118
                        break;
122
          break;
119
                    case 'i':
123
        case 'a':
120
                        material_file >> mesh->materials[nummaterials].illum;
-
 
121
                        break;
-
 
122
                    case 'm': // Map ... all maps are treated equally.
-
 
123
                        material_file >> mesh->materials[nummaterials].tex_name;
124
          material_file >> materials[nummaterials].ambient[0]
124
                        mesh->materials[nummaterials].has_texture = true;
125
                        >> materials[nummaterials].ambient[1]
125
                        mesh->materials[nummaterials].tex_path = pathname;
126
                        >> materials[nummaterials].ambient[2];
126
                        break;
-
 
127
                    case '#':
-
 
128
                    default:
-
 
129
                        material_file.ignore(1024, '\n');
-
 
130
                        break;
-
 
131
                        
-
 
132
                }
-
 
133
            }
127
          break;
134
        }
128
        }
-
 
129
        break;
-
 
130
      case 'T':
-
 
131
        material_file >> materials[nummaterials].transmission[0]
-
 
132
                      >> materials[nummaterials].transmission[1]
-
 
133
                      >> materials[nummaterials].transmission[2];
-
 
134
        break;
-
 
135
      case 'i':
-
 
136
        material_file >> materials[nummaterials].illum;
-
 
137
        break;
-
 
138
      case 'm': // Map ... all maps are treated equally.
-
 
139
        material_file >> materials[nummaterials].tex_name;
-
 
140
        materials[nummaterials].has_texture = true;
-
 
141
        materials[nummaterials].tex_path = pathname;
-
 
142
        break;
-
 
143
      case '#':
-
 
144
      default:
-
 
145
        material_file.ignore(1024, '\n');
-
 
146
        break;
-
 
147
      }
135
    }
148
    }
-
 
149
  }
136
    
150
    
137
    
-
 
138
	void TriMeshObjLoader::load(const std::string& filename)
151
  void TriMeshObjLoader::load(const std::string& filename)
139
	{
152
  {
140
		pathname = get_path(filename);
153
    pathname = get_path(filename);
141
        ifstream obj_file(filename.data());
154
    ifstream obj_file(filename.data());
142
        if(obj_file)
155
    if(!obj_file)
-
 
156
    {
-
 
157
			cerr << "File " << filename << " does not exist" << endl;
-
 
158
      exit(0);
-
 
159
    }
-
 
160
 
-
 
161
    mesh->materials.resize(1);
-
 
162
    string buf;
-
 
163
    int current_material=0;
-
 
164
    while(obj_file >> buf)
-
 
165
    {
-
 
166
      switch(buf[0])
-
 
167
      {
-
 
168
      case 'v': // v, vn, vt
143
        {
169
        {
144
            mesh->materials.resize(1);
-
 
145
            string buf;
170
          if(buf == "v")
146
            int current_material=0;
-
 
147
            while(obj_file >> buf)
-
 
148
            {
171
          {
149
                cout << buf[0] << endl;
-
 
150
                switch(buf[0])
-
 
151
                {
-
 
152
                    case 'v': // v, vn, vt
-
 
153
                    {
172
            Vec3f v_geo;
154
                        if(buf == "v")
-
 
155
                        {
-
 
156
                            Vec3f v_geo;
-
 
157
                            obj_file >> v_geo;
173
            obj_file >> v_geo;
158
                            mesh->geometry.add_vertex(v_geo);
174
            mesh->geometry.add_vertex(v_geo);
159
                        }
175
          }
160
                        else if(buf == "vn")
176
          else if(buf == "vn")
161
                        {
177
          {
162
                            Vec3f v_norm;
178
            Vec3f v_norm;
163
                            obj_file >> v_norm;
179
            obj_file >> v_norm;
164
                            mesh->normals.add_vertex(v_norm);
180
            mesh->normals.add_vertex(v_norm);
165
                        }
181
          }
166
                        else if(buf == "vt")
182
          else if(buf == "vt")
167
                        {
183
          {
168
                            Vec3f v_tex;
184
            Vec3f v_tex;
169
                            obj_file >> v_tex[0] >> v_tex[1];
185
            obj_file >> v_tex[0] >> v_tex[1];
170
                            v_tex[2]=1;
186
            v_tex[2]=1;
171
                            mesh->texcoords.add_vertex(v_tex);
187
            mesh->texcoords.add_vertex(v_tex);
172
                        }
188
          }
173
                    }
189
        }
174
                        break;
190
        break;
175
                    case 'f':
191
      case 'f':
176
                    {
192
        {
177
                        char line[1024];
193
          char line[1024];
178
                        
-
 
179
                        vector<int> v_indices;
-
 
180
                        vector<int> t_indices;
-
 
181
                        vector<int> n_indices;
-
 
182
                        
194
                        
183
                        obj_file.getline(line, 1022);
-
 
184
                        char* pch = strtok(line, " \t");
-
 
185
                        while(pch != 0)
-
 
186
                        {
-
 
187
                            int v,t,n;
-
 
188
                            if(sscanf(pch, "%d/%d/%d", &v, &t, &n)==3)
-
 
189
                            {
-
 
190
                                v_indices.push_back(get_vert(v));
-
 
191
                                t_indices.push_back(get_texcoord(t));
-
 
192
                                n_indices.push_back(get_normal(n));
-
 
193
                            }
-
 
194
                            else if(sscanf(pch, "%d//%d", &v, &n)==2)
-
 
195
                            {
-
 
196
                                v_indices.push_back(get_vert(v));
-
 
197
                                n_indices.push_back(get_normal(n));
-
 
198
                            }
-
 
199
                            else if(sscanf(pch, "%d/%d", &v, &t)==2)
-
 
200
                            {
-
 
201
                                v_indices.push_back(get_vert(v));
-
 
202
                                t_indices.push_back(get_texcoord(t));
-
 
203
                            }
-
 
204
                            else if(sscanf(pch, "%d", &v)==1)
-
 
205
                                v_indices.push_back(get_vert(v));
-
 
206
                            pch = strtok(0, " \t");
-
 
207
                        }
-
 
208
                        if(v_indices.size()>=3)
-
 
209
                            for(size_t i=0;i<=(v_indices.size()-3);++i)
-
 
210
                            {
-
 
211
                                int idx = mesh->geometry.add_face(Vec3i(v_indices[0], v_indices[i+1], v_indices[i+2]));
-
 
212
                                if(t_indices.size())
-
 
213
                                    mesh->texcoords.add_face(Vec3i(t_indices[0], t_indices[i+1], t_indices[i+2]), idx);
-
 
214
                                if(n_indices.size())
-
 
215
                                    mesh->normals.add_face(Vec3i(n_indices[0], n_indices[i+1], n_indices[i+2]), idx);
-
 
216
                                mesh->mat_idx.push_back(current_material);
-
 
217
                            }
-
 
218
                    }
-
 
219
                        break;
-
 
220
                    case 'm':
-
 
221
                        obj_file >> buf;
-
 
222
                        read_material_library(buf);
-
 
223
                        break;
195
          vector<int> v_indices;
224
                    case 'u':
-
 
225
                        obj_file >> buf;
-
 
226
                        current_material = mesh->find_material(buf);
-
 
227
                        break;
196
          vector<int> t_indices;
228
                    case '#':
-
 
229
                    default:
-
 
230
                        obj_file.ignore(1024, '\n');
-
 
231
                        break;
197
          vector<int> n_indices;
232
                        
198
                        
-
 
199
          obj_file.getline(line, 1022);
-
 
200
          char* pch = strtok(line, " \t");
-
 
201
          while(pch != 0)
-
 
202
          {
-
 
203
            int v,t,n;
-
 
204
            if(sscanf(pch, "%d/%d/%d", &v, &t, &n)==3)
-
 
205
            {
-
 
206
              v_indices.push_back(get_vert(v));
-
 
207
              t_indices.push_back(get_texcoord(t));
-
 
208
              n_indices.push_back(get_normal(n));
233
                }
209
            }
-
 
210
            else if(sscanf(pch, "%d//%d", &v, &n)==2)
-
 
211
            {
-
 
212
              v_indices.push_back(get_vert(v));
-
 
213
              n_indices.push_back(get_normal(n));
-
 
214
            }
-
 
215
            else if(sscanf(pch, "%d/%d", &v, &t)==2)
-
 
216
            {
-
 
217
              v_indices.push_back(get_vert(v));
-
 
218
              t_indices.push_back(get_texcoord(t));
-
 
219
            }
-
 
220
            else if(sscanf(pch, "%d", &v)==1)
-
 
221
              v_indices.push_back(get_vert(v));
-
 
222
            pch = strtok(0, " \t");
-
 
223
          }
-
 
224
          if(v_indices.size()>=3)
-
 
225
            for(size_t i=0;i<=(v_indices.size()-3);++i)
-
 
226
            {
-
 
227
              int idx = mesh->geometry.add_face(Vec3i(v_indices[0], v_indices[i+1], v_indices[i+2]));
-
 
228
              if(t_indices.size())
-
 
229
              mesh->texcoords.add_face(Vec3i(t_indices[0], t_indices[i+1], t_indices[i+2]), idx);
-
 
230
              if(n_indices.size())
-
 
231
              mesh->normals.add_face(Vec3i(n_indices[0], n_indices[i+1], n_indices[i+2]), idx);
-
 
232
              mesh->mat_idx.push_back(current_material);
234
            }
233
            }
235
        }
234
        }
-
 
235
        break;
-
 
236
      case 'm':
-
 
237
        obj_file >> buf;
-
 
238
        read_material_library(buf, mesh->materials);
-
 
239
        break;
-
 
240
      case 'u':
-
 
241
        obj_file >> buf;
-
 
242
        current_material = mesh->find_material(buf);
-
 
243
        break;
-
 
244
      case '#':
-
 
245
      default:
-
 
246
        obj_file.ignore(1024, '\n');
-
 
247
        break;                        
-
 
248
      }
236
    }
249
    }
-
 
250
  }
237
    
251
    
238
	void obj_load(const string& filename, TriMesh &mesh)
252
	void obj_load(const string& filename, TriMesh &mesh)
239
	{
253
	{
240
		TriMeshObjLoader loader(&mesh);
254
		TriMeshObjLoader loader(&mesh);
241
		loader.load(filename);
255
		loader.load(filename);
242
	}
256
	}
243
    
257
    
244
    /// Load materials from an MRL file
258
  /// Load materials from an MTL file
245
    void mtl_load(const std::string& filename, std::vector<Material>& materials)
259
  void mtl_load(const std::string& filename, std::vector<Material>& materials)
246
    {
260
  {
247
        TriMesh m;
-
 
248
		TriMeshObjLoader loader(&m);
261
    TriMeshObjLoader loader(0);
249
		loader.read_material_library(filename);
262
    loader.load_material_library(filename, materials);
250
        materials = m.materials;
-
 
251
    }
263
  }    
252
    
-
 
253
    
-
 
254
}
264
}