Here I load textures:
Code :glGenTextures(sceneList.count(), &mTextureID[0]); for (QList<SceneObject*>::ConstIterator i = sceneList.begin();i!=sceneList.end();++i) { Mesh* p = dynamic_cast<Mesh*>(*i); if(p){ if (p->HasTexture()){ QImage* a = p->Mat().GetTexture()->GetImage(); *a= QGLWidget::convertToGLFormat(*a); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, mTextureID[counter]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, p->Mat().GetTexture()->ImageSize().width() , p->Mat().GetTexture()->ImageSize().height() , 0, GL_RGBA, GL_UNSIGNED_BYTE, a.bits()); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glDisable(GL_TEXTURE_2D); } } counter++; } }
Then for every mesh i do this:
Code :glBindTexture(GL_TEXTURE_2D, mTextureID[counter]); //where counter=texture for current mesh ... const QList<Vector3D> vertices=p.Vertices(); QList<Face>& faccie=p.Faces(); int numerofacce=faccie.count(); QList<Vector3D>& normals =p.Normals(); int numerovertici=0 for (int t = 0; t < numerofacce; ++t) { glEnable(GL_TEXTURE_2D); ... switch(f.numVertici) { case 1: a[1]++; face_mode = GL_POINTS; glBegin(face_mode); if(hasNormals) glNormal3fv(&normals[(f.normalIndex)[0]].pos[0]); glTexCoord2f(p.TextureCoords().at(numerovertici).x, p.TextureCoords().at(numerovertici).y); glVertex3fv(&vertices[lista[0]].pos[0]); numerovertici++; break; case 2: face_mode = GL_LINES; glBegin(face_mode); if(hasNormals){ glNormal3fv(&normals[(f.normalIndex)[0]].pos[0]); glTexCoord2f(p.TextureCoords().at(numerovertici).x, p.TextureCoords().at(numerovertici).y); glVertex3fv(&vertices[lista[0]].pos[0]); glNormal3fv(&normals[(f.normalIndex)[1]].pos[0]); glTexCoord2f(p.TextureCoords().at(numerovertici+1).x, p.TextureCoords().at(numerovertici+1).y); glVertex3fv(&vertices[lista[1]].pos[0]); } else{ glTexCoord2f(p.TextureCoords().at(numerovertici).x, p.TextureCoords().at(numerovertici).y); glVertex3fv(&vertices[lista[0]].pos[0]); glTexCoord2f(p.TextureCoords().at(numerovertici+1).x, p.TextureCoords().at(numerovertici+1).y); glVertex3fv(&vertices[lista[1]].pos[0]); } numerovertici+=2; break; case 3: face_mode = GL_TRIANGLES; glBegin(face_mode); if (numerovertici<p.Vertices().count()-3){ if(hasNormals){ glTexCoord2f(p.TextureCoords().at(numerovertici).x, p.TextureCoords().at(numerovertici).y); glNormal3fv(&normals[(f.normalIndex)[0]].pos[0]); glVertex3fv(&vertices[lista[0]].pos[0]); glTexCoord2f(p.TextureCoords().at(numerovertici+1).x, p.TextureCoords().at(numerovertici+1).y); glNormal3fv(&normals[(f.normalIndex)[1]].pos[0]); glVertex3fv(&vertices[lista[1]].pos[0]); glTexCoord2f(p.TextureCoords().at(numerovertici+2).x, p.TextureCoords().at(numerovertici+2).y); glNormal3fv(&normals[(f.normalIndex)[2]].pos[0]); glVertex3fv(&vertices[lista[2]].pos[0]); } else{ glTexCoord2f(p.TextureCoords().at(numerovertici).x, p.TextureCoords().at(numerovertici).y); glVertex3fv(&vertices[lista[0]].pos[0]); glTexCoord2f(p.TextureCoords().at(numerovertici+1).x, p.TextureCoords().at(numerovertici+1).y); glVertex3fv(&vertices[lista[1]].pos[0]); glTexCoord2f(p.TextureCoords().at(numerovertici+2).x, p.TextureCoords().at(numerovertici+2).y); glVertex3fv(&vertices[lista[2]].pos[0]); } numerovertici+=3; break; default: face_mode = GL_POLYGON; break; } glDisable(GL_TEXTURE_2D); ...
**PRE:** Vertices number=number of texture coordinatess
Every glTexCoord2f contains something like p.TextureCoords().at(numerovertici+2).x where
*p* is the current mesh
*TextureCoords()* is a QList<Vector3D> that contains all the 2D coords
*at(numerovertici)* : takes from TextureCoords List the "numerovertici" element
*.x* taking x coordinate
So,I am using a vertices counter named "numerovertici" to remember how many vertices were drawn,and before drawing each vertex I am calling the correspondent texture coordinate.
Is this a coordinates problem (I'm pretty sure they're ok) or should it be something else?