Subversion Repositories gelsvn

Rev

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

Rev 436 Rev 510
Line 54... Line 54...
54
			if (i<0) {
54
			if (i<0) {
55
				return mesh->texcoords.no_vertices()+i;
55
				return mesh->texcoords.no_vertices()+i;
56
			} else
56
			} else
57
				return i-1;
57
				return i-1;
58
		}
58
		}
59
		
59
 
60
		void read_material_library(const string& filename);
60
		void read_material_library(const string& filename, vector<Material>& materials);
61
 
61
 
62
	public:
62
	public:
63
 
63
 
64
		TriMeshObjLoader(TriMesh *_mesh): mesh(_mesh) {}
64
		TriMeshObjLoader(TriMesh *_mesh): mesh(_mesh) {}
65
		
65
		
66
		void load(const std::string& filename);
66
		void load(const std::string& filename);
-
 
67
    void load_material_library(const string& filename, vector<Material>& materials)
-
 
68
    {
-
 
69
      pathname = get_path(filename);
-
 
70
      read_material_library(filename, materials);
-
 
71
    }
67
	};
72
	};
68
	
73
	
69
	void TriMeshObjLoader::read_material_library(const string& filename)
74
	void TriMeshObjLoader::read_material_library(const string& filename, vector<Material>& materials)
70
	{
75
	{
71
		string fn = pathname + filename;
76
		string fn = pathname + filename;
72
		FILE* file = fopen(fn.data(), "r");
77
		FILE* file = fopen(fn.data(), "r");
73
		if (!file) 
78
		if (!file) 
74
			{
79
			{
Line 100... Line 105...
100
					}
105
					}
101
			}
106
			}
102
		rewind(file);
107
		rewind(file);
103
		
108
		
104
		/* allocate memory for the materials */
109
		/* allocate memory for the materials */
105
		mesh->materials.resize(nummaterials);
110
		materials.resize(nummaterials);
106
 
111
 
107
		/* now, read in the data */
112
		/* now, read in the data */
108
		nummaterials = 0;
113
		nummaterials = 0;
109
		while(fscanf(file, "%s", buf) != EOF) {
114
		while(fscanf(file, "%s", buf) != EOF) {
110
			switch(buf[0]) {
115
			switch(buf[0]) {
Line 114... Line 119...
114
				break;
119
				break;
115
			case 'n':				/* newmtl */
120
			case 'n':				/* newmtl */
116
				fgets(buf, sizeof(buf), file);
121
				fgets(buf, sizeof(buf), file);
117
				sscanf(buf, "%s %s", buf, buf);
122
				sscanf(buf, "%s %s", buf, buf);
118
				nummaterials++;
123
				nummaterials++;
119
				mesh->materials[nummaterials].name = buf;
124
				materials[nummaterials].name = buf;
120
				break;
125
				break;
121
			case 'N':
126
			case 'N':
122
        switch(buf[1])
127
        switch(buf[1])
123
          {
128
          {
124
          case 's':
129
          case 's':
125
				    fscanf(file, "%f", &mesh->materials[nummaterials].shininess);
130
				    fscanf(file, "%f", &materials[nummaterials].shininess);
126
				    /* wavefront shininess is from [0, 1000], so scale for OpenGL */
131
				    /* wavefront shininess is from [0, 1000], so scale for OpenGL */
127
				    mesh->materials[nummaterials].shininess /= 1000.0;
132
				    materials[nummaterials].shininess /= 1000.0;
128
				    mesh->materials[nummaterials].shininess *= 128.0;
133
				    materials[nummaterials].shininess *= 128.0;
129
            break;
134
            break;
130
          case 'i':
135
          case 'i':
131
				    fscanf(file, "%f", &mesh->materials[nummaterials].ior_in);
136
				    fscanf(file, "%f", &materials[nummaterials].ior);
132
            break;
137
            break;
133
					default:
138
					default:
134
						/* eat up rest of line */
139
						/* eat up rest of line */
135
						fgets(buf, sizeof(buf), file);
140
						fgets(buf, sizeof(buf), file);
136
						break;
141
						break;
Line 139... Line 144...
139
			case 'K': 
144
			case 'K': 
140
				switch(buf[1]) 
145
				switch(buf[1]) 
141
					{
146
					{
142
					case 'd':
147
					case 'd':
143
						fscanf(file, "%f %f %f",
148
						fscanf(file, "%f %f %f",
144
									 &mesh->materials[nummaterials].diffuse[0],
149
									 &materials[nummaterials].diffuse[0],
145
									 &mesh->materials[nummaterials].diffuse[1],
150
									 &materials[nummaterials].diffuse[1],
146
									 &mesh->materials[nummaterials].diffuse[2]);
151
									 &materials[nummaterials].diffuse[2]);
147
						break;
152
						break;
148
					case 's':
153
					case 's':
149
						fscanf(file, "%f %f %f",
154
						fscanf(file, "%f %f %f",
150
									 &mesh->materials[nummaterials].specular[0],
155
									 &materials[nummaterials].specular[0],
151
									 &mesh->materials[nummaterials].specular[1],
156
									 &materials[nummaterials].specular[1],
152
									 &mesh->materials[nummaterials].specular[2]);
157
									 &materials[nummaterials].specular[2]);
153
						break;
158
						break;
154
					case 'a':
159
					case 'a':
155
						fscanf(file, "%f %f %f",
160
						fscanf(file, "%f %f %f",
156
									 &mesh->materials[nummaterials].ambient[0],
161
									 &materials[nummaterials].ambient[0],
157
									 &mesh->materials[nummaterials].ambient[1],
162
									 &materials[nummaterials].ambient[1],
158
									 &mesh->materials[nummaterials].ambient[2]);
163
									 &materials[nummaterials].ambient[2]);
159
						break;
164
						break;
160
					default:
165
					default:
161
						/* eat up rest of line */
166
						/* eat up rest of line */
162
						fgets(buf, sizeof(buf), file);
167
						fgets(buf, sizeof(buf), file);
163
						break;
168
						break;
164
					}
169
					}
165
				break;
170
				break;
166
      case 'T':
171
      case 'T':
167
				fscanf(file, "%f %f %f",
172
				fscanf(file, "%f %f %f",
168
               &mesh->materials[nummaterials].transmission[0],
173
               &materials[nummaterials].transmission[0],
169
               &mesh->materials[nummaterials].transmission[1],
174
               &materials[nummaterials].transmission[1],
170
               &mesh->materials[nummaterials].transmission[2]);
175
               &materials[nummaterials].transmission[2]);
171
        break;
176
        break;
172
      case 'i':
177
      case 'i':
173
				fscanf(file, "%d", &mesh->materials[nummaterials].illum);
178
				fscanf(file, "%d", &materials[nummaterials].illum);
174
        break;
179
        break;
175
			case 'm': // Map ... all maps are treated equally.
180
			case 'm': // Map ... all maps are treated equally.
176
				{
181
				{
177
					fscanf(file,"%s",buf);
182
					fscanf(file,"%s",buf);
178
					mesh->materials[nummaterials].tex_path = pathname;
183
					materials[nummaterials].tex_path = pathname;
179
					mesh->materials[nummaterials].tex_name = string(buf);
184
					materials[nummaterials].tex_name = string(buf);
-
 
185
          materials[nummaterials].has_texture = true;
180
				}
186
				}
181
				break;
187
				break;
182
			default:
188
			default:
183
				/* eat up rest of line */
189
				/* eat up rest of line */
184
				fgets(buf, sizeof(buf), file);
190
				fgets(buf, sizeof(buf), file);
Line 217... Line 223...
217
						fgets(buf, sizeof(buf), fp);
223
						fgets(buf, sizeof(buf), fp);
218
						break;
224
						break;
219
					case 'm':
225
					case 'm':
220
						fgets(buf, sizeof(buf), fp);
226
						fgets(buf, sizeof(buf), fp);
221
						sscanf(buf, "%s %s", buf, buf);
227
						sscanf(buf, "%s %s", buf, buf);
222
						read_material_library(buf);
228
						read_material_library(buf, mesh->materials);
223
						break;
229
						break;
224
					case 'u':
230
					case 'u':
225
						fgets(buf, sizeof(buf), fp);
231
						fgets(buf, sizeof(buf), fp);
226
						sscanf(buf, "%s %s", buf, buf);
232
						sscanf(buf, "%s %s", buf, buf);
227
						current_material = mesh->find_material(buf);
233
						current_material = mesh->find_material(buf);
Line 376... Line 382...
376
			}
382
			}
377
    fclose(fp);
383
    fclose(fp);
378
	}
384
	}
379
 
385
 
380
 
386
 
381
	void obj_load(const string& filename, TriMesh &mesh)
387
	void obj_load(const string& filename, TriMesh& mesh)
382
	{
388
	{
383
		TriMeshObjLoader loader(&mesh);
389
		TriMeshObjLoader loader(&mesh);
384
		loader.load(filename);
390
		loader.load(filename);
385
	}
391
	}
386
 
392
 
-
 
393
  void mtl_load(const string& filename, vector<Material>& materials)
-
 
394
  {
-
 
395
    TriMeshObjLoader loader(0);
-
 
396
    loader.load_material_library(filename, materials);
-
 
397
  }
387
}
398
}