1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
//Draw a mesh face
void BSP::DrawMeshFace(int meshFaceNumber)
{
//skip this face if its texture was not loaded
if(isTextureLoaded[meshFaces[meshFaceNumber].textureIndex]==false)
return;
//set array pointers
glVertexPointer( 3, GL_FLOAT, sizeof(BSP_VERTEX),
&vertices[meshFaces[meshFaceNumber].firstVertexIndex].position);
glTexCoordPointer( 2, GL_FLOAT, sizeof(BSP_VERTEX),
&vertices[meshFaces[meshFaceNumber].firstVertexIndex].decalS);
glClientActiveTextureARB(GL_TEXTURE1_ARB);
glTexCoordPointer( 2, GL_FLOAT, sizeof(BSP_VERTEX),
&vertices[meshFaces[meshFaceNumber].firstVertexIndex].lightmapS);
glClientActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.0f);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//bind textures
//unit 0 - decal texture
glBindTexture(GL_TEXTURE_2D, decalTextures[meshFaces[meshFaceNumber].textureIndex]);
//unit 1 - lightmap
glActiveTextureARB(GL_TEXTURE1_ARB);
if(meshFaces[meshFaceNumber].lightmapIndex>=0) //only bind a lightmap if one exists
glBindTexture(GL_TEXTURE_2D, lightmapTextures[meshFaces[meshFaceNumber].lightmapIndex]);
else
glBindTexture(GL_TEXTURE_2D, whiteTexture);
glActiveTextureARB(GL_TEXTURE0_ARB);
//draw the face, using meshIndices
if(!EXT_draw_range_elements_supported)
{
glDrawElements( GL_TRIANGLES, meshFaces[meshFaceNumber].numMeshIndices, GL_UNSIGNED_INT,
&meshIndices[meshFaces[meshFaceNumber].firstMeshIndex]);
}
else
{
glDrawRangeElementsEXT( GL_TRIANGLES, 0, meshFaces[meshFaceNumber].numVertices,
meshFaces[meshFaceNumber].numMeshIndices, GL_UNSIGNED_INT,
&meshIndices[meshFaces[meshFaceNumber].firstMeshIndex]);
}
int nbT=meshFaces[meshFaceNumber].numMeshIndices/2.0;
if(nbT>0)
{
nbTrianglesDrawn+=nbT;
}
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
} |
Partager