charge un fichier wavefront .obj et renvoie les donnees.
18 FILE *in= fopen(filename,
"rt");
21 printf(
"[error] loading mesh '%s'...\n", filename);
25 printf(
"loading mesh '%s'...\n", filename);
29 int default_material_id= -1;
37 char line_buffer[1024];
42 if(fgets(line_buffer,
sizeof(line_buffer), in) == NULL)
49 line_buffer[
sizeof(line_buffer) -1]= 0;
52 char *line= line_buffer;
53 while(*line && isspace(*line))
61 if(sscanf(line,
"v %f %f %f", &x, &y, &z) != 3)
63 data.positions.push_back(
vec3(x, y, z) );
65 else if(line[1] ==
'n')
67 if(sscanf(line,
"vn %f %f %f", &x, &y, &z) != 3)
69 data.normals.push_back(
vec3(x, y, z) );
71 else if(line[1] ==
't')
73 if(sscanf(line,
"vt %f %f", &x, &y) != 2)
75 data.texcoords.push_back(
vec2(x, y) );
79 else if(line[0] ==
'f')
86 for(line= line +1; ; line= line + next)
93 if(sscanf(line,
" %d/%d/%d %n", &idp.back(), &idt.back(), &idn.back(), &next) == 3)
95 else if(sscanf(line,
" %d/%d %n", &idp.back(), &idt.back(), &next) == 2)
97 else if(sscanf(line,
" %d//%d %n", &idp.back(), &idn.back(), &next) == 2)
99 else if(sscanf(line,
" %d %n", &idp.back(), &next) == 1)
106 if(material_id == -1)
108 if(default_material_id == -1)
111 default_material_id= data.materials.size();
115 material_id= default_material_id;
116 printf(
"usemtl default\n");
120 for(
int v= 2; v +1 < (int) idp.size(); v++)
122 int idv[3]= { 0, v -1, v };
123 for(
int i= 0; i < 3; 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;
130 if(p < 0 || p >= (
int) data.positions.size())
134 data.position_indices.push_back(p);
135 data.texcoord_indices.push_back(t);
136 data.normal_indices.push_back(n);
140 data.material_indices.push_back(material_id);
144 else if(line[0] ==
'm')
146 if(sscanf(line,
"mtllib %[^\r\n]", tmp) == 1)
149 data.materials= materials.data;
153 else if(line[0] ==
'u')
155 if(sscanf(line,
"usemtl %[^\r\n]", tmp) == 1)
158 for(
unsigned int i= 0; i < (
unsigned int) materials.names.size(); i++)
159 if(materials.names[i] == tmp)
162 if(material_id == -1)
165 if(default_material_id == -1)
168 default_material_id= data.materials.size();
172 material_id= default_material_id;
181 printf(
"loading mesh '%s'...\n[error]\n%s\n\n", filename, line_buffer);
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());
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.
std::string pathname(const std::string &filename)
ensemble de matieres texturees.
representation d'une matiere texturee.
vecteur generique, utilitaire.
vecteur generique, utilitaire.