#include "parserOBJ.h" #include using namespace std; using namespace M_PARSER; static void erreur(string s) { cout << "Erreur dans parserOBJ.cpp : " << endl; cout << s << endl; exit(1); } ParserOBJ::ParserOBJ(std::string nom) : Parser(nom,EOL_TOKEN) { skipToken(); } Objet *ParserOBJ::lire() { Objet *o=new Objet; lire(o); return o; } void ParserOBJ::lire(Objet *o) { Facet *f; Vertex *v; Vecteur3d *n; while (token()!=FIN) { if (sToken()=="#") { lireLigne(); } if (sToken()=="vn") { skipToken(); n=new Vecteur3d; o->normale.push_back(n); int k=0; while (token()!=P_EOL) { if (token()==REEL) (*n)[k]=lireReel(); else (*n)[k]=float(lireEntier()); k++; if (k>3) erreur("lecture normale avec plus de 3 composantes !!!"); } } if (sToken()=="f") { skipToken(); f=new Facet; o->af.push_back(f); int a[2]; while (token()!=P_EOL) { f->av.push_back(o->av[lireEntier()-1]); if (sToken()=="/") { int k=0; skipToken(); if (sToken()=="/") {skipToken(); k++;} a[k]=lireEntier();k++; if (sToken()=="/") { skipToken(); a[k]=lireEntier();k++; } if (k==2) f->an.push_back(o->normale[a[1]-1]); } } } if (sToken()=="v") { skipToken(); v=new Vertex; Point3d p; o->av.push_back(v); int k=0; while (token()!=P_EOL) { if (token()==REEL) p[k]=lireReel(); else p[k]=float(lireEntier()); k++; if (k>3) erreur("lecture sommet avec plus de 3 composantes !!!"); } v->setPoint(p); } skipToken(); } }