I have the same problems !!!
I use GlDrawElements, but it runs slower than some call of glVertex and glVertexCoord !
I use ase file my code is :
void CObject3D::cree_list(BMPTexture* pTex){
//printf("Crée list …
");
int num_Tvecteur_temp=0;
//num_Tvecteur=0;
//Align textures coords.
//Align_All();
//TEXTURE ???????
if(num_Tvecteur > 0){
printf("Avec Texture ...
");
objListe = glGenLists(1);
glNewList(objListe, GL_COMPILE);
/*
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
*/
//glEnable(GL_TEXTURE_2D);
//glColor3f(1.0,1.0,1.0);
if( pTex == NULL){
if(numerotex > 0){
TGAtex[numerotex].Activer();
}else
glBindTexture(GL_TEXTURE_2D, 8);
//pTex[1].SetActive();
}else{
if(numerotex > 0)
pTex[numerotex].SetActive();
//printf("Texture N° : %d_n",numerotex);
}
/*
//Coordonnées vecteur
glVertexPointer(3,GL_FLOAT,0,matrice_finale);
//Coordonnes textures
glTexCoordPointer(2,GL_FLOAT,0,matrice_Tfinale);
//glTexCoordPointer(2,GL_FLOAT,0,temp_tab_tex);
//Création Object..
glDrawElements(GL_TRIANGLES,num_face * 3,GL_UNSIGNED_INT,matrice_face);
*/
glBegin(GL_TRIANGLES);
for(int j=0;j<num_face;j++){
glTexCoord2f(matrice_Tfinale[matrice_Tface[(j*3+0)]*2+0],
matrice_Tfinale[matrice_Tface[(j*3+0)]*2+1]);
glVertex3f(matrice_finale[matrice_face[(j*3+0)]*3+0],
matrice_finale[matrice_face[(j*3+0)]*3+1],
matrice_finale[matrice_face[(j*3+0)]*3+2]);
glTexCoord2f(matrice_Tfinale[matrice_Tface[(j*3+1)]*2+0],
matrice_Tfinale[matrice_Tface[(j*3+1)]*2+1]);
glVertex3f(matrice_finale[matrice_face[(j*3+1)]*3+0],
matrice_finale[matrice_face[(j*3+1)]*3+1],
matrice_finale[matrice_face[(j*3+1)]*3+2]);
glTexCoord2f(matrice_Tfinale[matrice_Tface[(j*3+2)]*2+0],
matrice_Tfinale[matrice_Tface[(j*3+2)]*2+1]);
glVertex3f(matrice_finale[matrice_face[(j*3+2)]*3+0],
matrice_finale[matrice_face[(j*3+2)]*3+1],
matrice_finale[matrice_face[(j*3+2)]*3+2]);
}
glEnd();
//glDisable(GL_TEXTURE_2D);
/*
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
*/
glEndList();
printf("Cree list finie
");
}else{ //SANS TEXTURE …
printf("Sans Texture …
");
change_couleur();
objListe = glGenLists(1);
glNewList(objListe, GL_COMPILE);
glDisable(GL_TEXTURE_2D);
glEnableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(3,GL_FLOAT,0,matrice_finale);
glDrawElements(GL_TRIANGLES,num_face*3,GL_UNSIGNED_INT,matrice_face);
/*
glBegin(GL_TRIANGLES);
for(int j=0;j<num_face;j++){
glVertex3f(matrice_finale[matrice_face[(j*3+0)]*3+0],
matrice_finale[matrice_face[(j*3+0)]*3+1],
matrice_finale[matrice_face[(j*3+0)]*3+2]);
glVertex3f(matrice_finale[matrice_face[(j*3+1)]*3+0],
matrice_finale[matrice_face[(j*3+1)]*3+1],
matrice_finale[matrice_face[(j*3+1)]*3+2]);
glVertex3f(matrice_finale[matrice_face[(j*3+2)]*3+0],
matrice_finale[matrice_face[(j*3+2)]*3+1],
matrice_finale[matrice_face[(j*3+2)]*3+2]);
}
glEnd();
*/
glDisableClientState(GL_VERTEX_ARRAY);
//glEnable(GL_TEXTURE_2D);
glEndList();
//glEnableClientState(GL_TEXTURE_COORD_ARRAY);
//glEnable(GL_TEXTURE_2D);
}
/*
objListe = glGenLists(1);
glNewList(objListe, GL_COMPILE);
change_couleur();
glEnableClientState(GL_VERTEX_ARRAY);
if(num_Tvecteur > 0){
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
if( pTex == NULL){
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glBindTexture(GL_TEXTURE_2D, 1);
}else
pTex->SetActive();
}else{
//glColor3f(1.0,1.0,1.0);
}
glVertexPointer(3,GL_FLOAT,0,matrice_finale);
if(num_Tvecteur > 0){ glTexCoordPointer(2,GL_FLOAT,0,matrice_temp);}
glDrawElements(GL_TRIANGLES,num_face*3,GL_UNSIGNED_INT,matrice_face);
glDisableClientState(GL_VERTEX_ARRAY);
if(num_Tvecteur > 0){glDisableClientState(GL_TEXTURE_COORD_ARRAY);}
glEndList();
*/
printf("Fin de cree list ...
");
if(matrice_Tfinale) delete [] matrice_Tfinale;
if(matrice_finale) delete [] matrice_finale;
if(matrice_face) delete [] matrice_face;
if(matrice_Tface) delete [] matrice_Tface;
//if(temp_tab_tex) delete [] temp_tab_tex;
}
void CObject3D::Align_All(){
//Allocation mémoire temporaire
//temp_tab_triangle = new GLfloat[num_face * 3];
temp_tab_tex = new GLfloat[num_face * 3 * 2];
//printf("Alignement …
");
//Manipulation
for(int j=0;j<num_face;j++){
temp_tab_tex[ (j*3) + 0 ] = matrice_Tfinale[matrice_Tface[(j*3+0)]*2+0];
temp_tab_tex[ (j*3) + 1 ] = matrice_Tfinale[matrice_Tface[(j*3+0)]*2+1];
/*
temp_tab_triangle[ (j*3) + 0] = matrice_finale[matrice_face[(j*3+0)]*3+0];
temp_tab_triangle[ (j*3) + 1] = matrice_finale[matrice_face[(j*3+0)]*3+1];
temp_tab_triangle[ (j*3) + 2] = matrice_finale[matrice_face[(j*3+0)]*3+2];
*/
temp_tab_tex[ (j*3) + 2 ] = matrice_Tfinale[matrice_Tface[(j*3+1)]*2+0];
temp_tab_tex[ (j*3) + 3 ] = matrice_Tfinale[matrice_Tface[(j*3+1)]*2+1];
/*
temp_tab_triangle[ (j*3) + 3] = matrice_finale[matrice_face[(j*3+1)]*3+0];
temp_tab_triangle[ (j*3) + 4] = matrice_finale[matrice_face[(j*3+1)]*3+1];
temp_tab_triangle[ (j*3) + 5] = matrice_finale[matrice_face[(j*3+1)]*3+2];
*/
temp_tab_tex[ (j*3) + 4 ] = matrice_Tfinale[matrice_Tface[(j*3+2)]*2+0];
temp_tab_tex[ (j*3) + 5 ] = matrice_Tfinale[matrice_Tface[(j*3+2)]*2+1];
/*
temp_tab_triangle[ (j*3) + 6] = matrice_finale[matrice_face[(j*3+2)]*3+0];
temp_tab_triangle[ (j*3) + 7] = matrice_finale[matrice_face[(j*3+2)]*3+1];
temp_tab_triangle[ (j*3) + 8] = matrice_finale[matrice_face[(j*3+2)]*3+2];
*/
}
//if(matrice_Tfinale) delete [] matrice_Tfinale;
//if(matrice_finale) delete [] matrice_finale;
//if(matrice_face) delete [] matrice_face;
//if(matrice_Tface) delete [] matrice_Tface;
//printf("Fin alignement...
");
}
There is a lot of code because there the 2 solution (gldraw … and glvertex !)
I don’t understand !!!
My 3D card : Maxi Gamer Pheonix of Guillemot
16 Mo 3dfx (but it’s old !) (- 10 FPS -> 1024768 16 bits)
it’s runs total ok in a TRIDENT 8 Mo in my notebook !!! ( + 35 FPS -> 800 600 32 bits)
why ? some have a very good code to recompile ase file (ou 3ds) to load them in OpenGL Programs very fast with quality ? !!!
Thanks !
bye
Cyril