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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
void initVbo () //Inisalise l'utilisation des VBOs
{
#ifndef NO_VBOS
g_fVBOSupported = IsExtensionSupported( "GL_ARB_vertex_buffer_object" );
if( g_fVBOSupported )
{
glBindBufferARB = (PFNGLBINDBUFFERARBPROC) wglGetProcAddress("glBindBufferARB");
glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) wglGetProcAddress("glDeleteBuffersARB");
glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) wglGetProcAddress("glGenBuffersARB");
glIsBufferARB = (PFNGLISBUFFERARBPROC) wglGetProcAddress("glIsBufferARB");
glBufferDataARB = (PFNGLBUFFERDATAARBPROC) wglGetProcAddress("glBufferDataARB");
glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC) wglGetProcAddress("glBufferSubDataARB");
glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC) wglGetProcAddress("glGetBufferSubDataARB");
glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC) wglGetProcAddress("glGetBufferSubDataARB");
glMapBufferARB = (PFNGLMAPBUFFERARBPROC) wglGetProcAddress("glMapBufferARB");
glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC) wglGetProcAddress("glUnmapBufferARB");
glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC) wglGetProcAddress("glGetBufferParameterivARB");
glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC) wglGetProcAddress("glGetBufferPointervARB");
}
#else
g_fVBOSupported = false;
#endif
}
void Vbo::buildVertex(float * vertex, int taille)
{
if(g_fVBOSupported == true)
{
glGenBuffersARB( 1, &arbVertex );
glBindBufferARB( GL_ARRAY_BUFFER_ARB, arbVertex );
glBufferDataARB( GL_ARRAY_BUFFER_ARB, taille*sizeof(float), vertex, /*GL_STREAM_DRAW_ARB*//*GL_DYNAMIC_DRAW_ARB*/GL_STATIC_DRAW_ARB );
}else
{
bufVertex = vertex;
}
bVertex=true;
}
void Vbo::buildNormal(float * normal, int taille)
{
if(g_fVBOSupported == true)
{
glGenBuffersARB( 1, &arbNormal );
glBindBufferARB( GL_ARRAY_BUFFER_ARB, arbNormal );
glBufferDataARB( GL_ARRAY_BUFFER_ARB, taille*sizeof(float), normal, /*GL_STREAM_DRAW_ARB*//*GL_DYNAMIC_DRAW_ARB*/GL_STATIC_DRAW_ARB );
}else
{
bufNormal = normal;
}
bNormal=true;
}
void Vbo::buildFace(int * face, int taille)
{
nbFace = taille;
if(g_fVBOSupported == true)
{
glGenBuffersARB( 1, &arbFace );
glBindBufferARB( GL_ARRAY_BUFFER_ARB, arbFace );
glBufferDataARB( GL_ARRAY_BUFFER_ARB, taille*sizeof(float), face, /*GL_STREAM_DRAW_ARB*//*GL_DYNAMIC_DRAW_ARB*/GL_STATIC_DRAW_ARB );
}else
{
bufFace = face;
}
bFace=true;
}
void Vbo::afficher()
{
if(bFace && bVertex)
{
glEnableClientState( GL_VERTEX_ARRAY );
if( g_fVBOSupported )
{
if(bNormal)
{
glEnableClientState(GL_NORMAL_ARRAY);
glBindBufferARB( GL_ARRAY_BUFFER_ARB, arbNormal );
glNormalPointer(GL_FLOAT, 0, 0);
}
glBindBufferARB( GL_ARRAY_BUFFER_ARB, arbVertex );
glVertexPointer( 3, GL_FLOAT, 0, (char *) NULL );
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, arbFace);
glDrawElements(GL_TRIANGLES, nbFace, GL_UNSIGNED_INT, 0);
if(bNormal)
{
glDisableClientState(GL_NORMAL_ARRAY);
}
}else
{
if(buildList==1)
{
list = glGenLists(1);
glNewList(list, GL_COMPILE);
if(bNormal)
{
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, bufNormal);
}
glVertexPointer(3, GL_FLOAT, 0, bufVertex);
glDrawElements(GL_TRIANGLES, nbFace, GL_UNSIGNED_INT, bufFace);
if(bNormal)
{
glDisableClientState(GL_NORMAL_ARRAY);
}
glEndList();
buildList=0;
}
glCallList(list);
}
glDisableClientState( GL_VERTEX_ARRAY );
}else
{
printf("Impossible d'afficher le model car les faces ou les vertex n'on pas etait builder !\n");
}
} |
Partager