hisoka56
Messages postés
17
Date d'inscription
lundi 7 juillet 2003
Statut
Membre
Dernière intervention
22 juillet 2008
1
3 nov. 2006 à 17:44
hum désolé, je pensais avoir posté le reste avec:
fichier model_loader.cpp:
#include "model_loader.h"
#include <string.h>
#include
using namespace std;
/*
permet de charger des models 3d au format ASE
*/
ml::model::model(char *nom)
{
charger(nom);
}
ml::model::model()
{
}
void ml::model::charger(char *nom)
{
int nbre=0;
char tmp[14];
fichier = fopen(nom, "r");
if (fichier==NULL) return;
//compte le nombre d'elements
while(fgets(tmp, 14, fichier) != NULL)
if (!strcmp(tmp, "*GEOMOBJECT {"))
nbre++;
//nbre contient le nombre d'elements
if (nbre == 0) return;
for (int i=1; i<=nbre; i++)
{
element t;
t.charger(fichier, i);
elt.push_back(t);
}
fclose(fichier);
}
void ml::model::afficher()
{
for (int i=0; i<elt.size(); i++)
elt[i].afficher();
}
ml::element::element()
{
texture=0;
strcpy(nom, "aucun nom");
}
int ml::element::charger(FILE *fichier, int n)
{
char *tex;
char tamp[200];
int k=0;
char cherche[20] = "\t*MATERIAL ";
char tmp[20];
rewind(fichier);
while(fgets(tmp, 12, fichier) != NULL)
{
if(!strcmp(tmp, cherche))
{
k=fgetc(fichier);
if (k-48+1 == n)//si c'est le fichier de texture voulu (-48=>c->int +1)
{
k=n;
break;
}
}
}
if (k!=n) return 0; //texture non trouvée
while (strcmp(fgets(tmp, 15, fichier), "\t\t\t*MAP_AMOUNT"));
fgets(tmp, 19, fichier);
fgets(tamp, 200, fichier);
tex=strchr(tamp, '"');
tex = (tex+1);
tex[strlen(tex)-2] = '\0';
//a partir d'ici tex contient le chemin exacte de la texture
texture=loadTexture(tex);
for(int i=1; i<=n; i++)
while (strcmp(fgets(tmp, 14, fichier), "\t*NODE_NAME ""));
fgets(nom, 20, fichier);
nom[strlen(nom)-2] = '\0';
//nom contient le nom du mesh associé
int n_vertex=0, n_faces=0;
while(strcmp(fgets(tmp, 19, fichier), "\t\t*MESH_NUMVERTEX "));
fgets(tmp, 10, fichier);
n_vertex=atoi(tmp);
while(strcmp(fgets(tmp, 18, fichier), "\t\t*MESH_NUMFACES "));
fgets(tmp, 10, fichier);
n_faces=atoi(tmp);
//n_vertex & n_faces contiennent respectivement le nombre de vertex et de faces
//lit les vertex
fgets(tamp, 100, fichier);
for (int i=0; i<n_vertex; i++)
{
v3d vert;
char *ch;
fgets(tamp, 100, fichier);
ch=strchr(tamp, 'X'); ch=strchr(ch, '\t');
ch=ch+1;
sscanf(ch, "%lf\t%lf\%lf", &vert.x, &vert.y, &vert.z);
//v3d vert ={x,y,z};
vertex.push_back(vert);
}
//les vertex sont stockés
//lit les faces
while(strcmp(fgets(tamp, 21, fichier), "\t\t*MESH_FACE_LIST {\n"));
for (int i=0; i<n_faces; i++)
{
face fc;
char *ch, tA[5], tB[5], tC[5];
fgets(tamp, 200, fichier);
ch=strchr(tamp, ':');ch+=7;
sscanf(ch, "%s %s %s %s %s",tA, tamp, tB,tamp, tC);
fc.A=atoi(tA); fc.B=atoi(tB); fc.C=atoi(tC);
faces.push_back(fc);
}
//les faces sont lues
//lit les vertex sur les textures
int n_tvertex;
while(strcmp(fgets(tmp, 20, fichier), "\t\t*MESH_NUMTVERTEX "));
fgets(tmp, 10, fichier);
n_tvertex=atoi(tmp);
fgets(tamp, 200, fichier);
for (int i=0; i<n_tvertex; i++)
{
tv3d tvert;
char *ch;
fgets(tamp, 100, fichier);
ch=strchr(tamp, 'T'); ch=strchr(ch, '\t');
ch=ch+1;
sscanf(ch, "%lf\t%lf\%lf", &tvert.x, &tvert.y, &tvert.z);
tvertex.push_back(tvert);
}
//chargées
//lit les tfaces
int n_tfaces;
while(strcmp(fgets(tmp, 20, fichier), "\t\t*MESH_NUMTVFACES "));
fgets(tmp, 10, fichier);
n_tfaces=atoi(tmp);
fgets(tamp, 200, fichier);
for (int i=0; i<n_tfaces; i++)
{
tface tf;
char *ch;
fgets(tamp, 100, fichier);
ch=strchr(tamp, 'C'); ch=strchr(ch, '\t');
ch=ch+1;
sscanf(ch, "%ld\t%ld\%ld", &tf.A, &tf.B, &tf.C);
tfaces.push_back(tf);
}
return 1;
}
void ml::element::afficher()
{
for (int i=0; i<faces.size(); i++)
afficherface(i);
}
void ml::element::afficherface(int i)
{
face f = {faces[i].A, faces[i].B, faces[i].C};
v3d v[3];
v[0]= vertex[f.A];
v[1]= vertex[f.B];
v[2]= vertex[f.C];
//a completer pour les textures
glBegin(GL_TRIANGLES);
glColor3ub(0,0,255); //face bleu
glVertex3d(v[0].x, v[0].y, v[0].z);
glVertex3d(v[1].x, v[1].y, v[1].z);
glVertex3d(v[2].x, v[2].y, v[2].z);
glEnd();
}
le main de test:
using namespace ml;
int main(int argc, char *argv[])
{
model m;
m.charger("models/maison.ASE");
model_loader::mod.push_back(m);
cout <<model_loader::mod.size(); //ici pas de probleme il m'affiche 1
ogl g;
g.boucle_affiche();
return 0;
}
et la fonction qui devrait afficher le model:
void ogl::boucle_affiche()
{
last_time = SDL_GetTicks();
for (;;)
{
start_time = SDL_GetTicks();
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
exit(0);
break;
case SDL_KEYDOWN:
switch (event.key.keysym.sym)
{
case SDLK_p:
takeScreenshot("test.bmp");
break;
}
}
}
gluLookAt(200,200,200,0,0,10,0,0,1);
current_time = SDL_GetTicks();
elapsed_time = current_time - last_time;
last_time = current_time;
glMatrixMode( GL_MODELVIEW );
glLoadIdentity( );
//md.afficher();
cout <<model_loader::mod.size(); //le probleme se trouve ici
//a la ligne du dessus je devrais avoir 1 (le model chargé) mais il me dit que le vecteur est vide
glFlush();
SDL_GL_SwapBuffers();
stop_time = SDL_GetTicks();
if ((stop_time - last_time) < time_per_frame)
{
SDL_Delay(time_per_frame - (stop_time - last_time));
}
}
}