charge un fichier wavefront .obj et renvoie les donnees.
17{
18 FILE *in= fopen(filename, "rt");
19 if(in == NULL)
20 {
21 printf(
"[error] loading mesh '%s'...\n", filename);
23 }
24
25 printf(
"loading mesh '%s'...\n", filename);
26
29 int default_material_id= -1;
30 int material_id= -1;
31
32 std::vector<int> idp;
33 std::vector<int> idt;
34 std::vector<int> idn;
35
36 char tmp[1024];
37 char line_buffer[1024];
38 bool error= true;
39 for(;;)
40 {
41
42 if(fgets(line_buffer, sizeof(line_buffer), in) == NULL)
43 {
44 error= false;
45 break;
46 }
47
48
49 line_buffer[sizeof(line_buffer) -1]= 0;
50
51
52 char *line= line_buffer;
53 while(*line && isspace(*line))
54 line++;
55
56 if(line[0] == 'v')
57 {
58 float x, y, z;
59 if(line[1] == ' ')
60 {
61 if(sscanf(line, "v %f %f %f", &x, &y, &z) != 3)
62 break;
63 data.positions.push_back(
vec3(x, y, z) );
64 }
65 else if(line[1] == 'n')
66 {
67 if(sscanf(line, "vn %f %f %f", &x, &y, &z) != 3)
68 break;
69 data.normals.push_back(
vec3(x, y, z) );
70 }
71 else if(line[1] == 't')
72 {
73 if(sscanf(line, "vt %f %f", &x, &y) != 2)
74 break;
75 data.texcoords.push_back(
vec2(x, y) );
76 }
77 }
78
79 else if(line[0] == 'f')
80 {
81 idp.clear();
82 idt.clear();
83 idn.clear();
84
85 int next;
86 for(line= line +1; ; line= line + next)
87 {
88 idp.push_back(0);
89 idt.push_back(0);
90 idn.push_back(0);
91
92 next= 0;
93 if(sscanf(line, " %d/%d/%d %n", &idp.back(), &idt.back(), &idn.back(), &next) == 3)
94 continue;
95 else if(sscanf(line, " %d/%d %n", &idp.back(), &idt.back(), &next) == 2)
96 continue;
97 else if(sscanf(line, " %d//%d %n", &idp.back(), &idn.back(), &next) == 2)
98 continue;
99 else if(sscanf(line, " %d %n", &idp.back(), &next) == 1)
100 continue;
101 else if(next == 0)
102 break;
103 }
104
105
106 if(material_id == -1)
107 {
108 if(default_material_id == -1)
109 {
110
111 default_material_id= data.materials.size();
113 }
114
115 material_id= default_material_id;
116 printf(
"usemtl default\n");
117 }
118
119
120 for(int v= 2; v +1 < (int) idp.size(); v++)
121 {
122 int idv[3]= { 0, v -1, v };
123 for(int i= 0; i < 3; i++)
124 {
125 int k= idv[i];
126 int p= (idp[k] < 0) ? (int) data.positions.size() + idp[k] : idp[k] -1;
127 int t= (idt[k] < 0) ? (int) data.texcoords.size() + idt[k] : idt[k] -1;
128 int n= (idn[k] < 0) ? (int) data.normals.size() + idn[k] : idn[k] -1;
129
130 if(p < 0 || p >= (int) data.positions.size())
131 break;
132
133
134 data.position_indices.push_back(p);
135 data.texcoord_indices.push_back(t);
136 data.normal_indices.push_back(n);
137 }
138
139
140 data.material_indices.push_back(material_id);
141 }
142 }
143
144 else if(line[0] == 'm')
145 {
146 if(sscanf(line, "mtllib %[^\r\n]", tmp) == 1)
147 {
149 data.materials= materials.data;
150 }
151 }
152
153 else if(line[0] == 'u')
154 {
155 if(sscanf(line, "usemtl %[^\r\n]", tmp) == 1)
156 {
157 material_id= -1;
158 for(unsigned int i= 0; i < (unsigned int) materials.names.size(); i++)
159 if(materials.names[i] == tmp)
160 material_id= i;
161
162 if(material_id == -1)
163 {
164
165 if(default_material_id == -1)
166 {
167
168 default_material_id= data.materials.size();
170 }
171
172 material_id= default_material_id;
173 }
174 }
175 }
176 }
177
178 fclose(in);
179
180 if(error)
181 printf(
"loading mesh '%s'...\n[error]\n%s\n\n", filename, line_buffer);
182
183 printf(
" %d positions, %d texcoords, %d normals, %d triangles\n",
184 (int) data.positions.size(), (int) data.texcoords.size(), (int) data.normals.size(), (int) data.material_indices.size());
185
186 return data;
187}
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
MaterialDataLib read_material_data(const char *filename)
charge un ensemble de matieres texturees.
ensemble de matieres texturees.
representation d'une matiere texturee.
vecteur generique, utilitaire.
vecteur generique, utilitaire.