1111struct GrVAO
1212{
1313 GLuint vertexArray;
14- GLuint vertexBuffer ;
14+ GLuint buffers[ 2 ] ;
1515
1616 int numVertices;
17+ int numIndices;
1718};
1819
1920// -------------------------------------------------------------
@@ -22,11 +23,11 @@ SDL_Window* g_window = nullptr;
2223int g_windowWidth, g_windowHeight;
2324int g_swapInterval = 1 ;
2425
25- int g_PreviousBlendMode = BM_NONE;
26- int g_PreviousDepthMode = 0 ;
27- GrVAO* g_PreviousVAO = nullptr ;
26+ int g_CurrentBlendMode = BM_NONE;
27+ int g_CurrentDepthMode = 0 ;
28+ GrVAO* g_CurrentVAO = nullptr ;
2829TextureID g_lastBoundTexture = -1 ;
29- ShaderID g_PreviousShader = -1 ;
30+ ShaderID g_CurrentShader = -1 ;
3031
3132GLint u_MatrixUniforms[MATRIX_MODES];
3233Matrix4x4 g_matrices[MATRIX_MODES];
@@ -38,7 +39,20 @@ GLint u_WorldViewProj;
3839
3940TextureID g_whiteTexture;
4041
41-
42+ static const GLenum glPrimitiveType[] = {
43+ GL_TRIANGLES,
44+ GL_TRIANGLE_FAN,
45+ GL_TRIANGLE_STRIP,
46+ #ifdef USE_GLES2
47+ 0 , // GL_QUADS,
48+ #else
49+ GL_QUADS,
50+ #endif // USE_GLES2
51+ GL_LINES,
52+ GL_LINE_STRIP,
53+ GL_LINE_LOOP,
54+ GL_POINTS,
55+ };
4256
4357void GR_GetWVPUniforms (GLuint program)
4458{
@@ -306,18 +320,18 @@ ShaderID GR_CompileShader(const char* source)
306320
307321void GR_SetShader (const ShaderID& shader)
308322{
309- if (g_PreviousShader == shader)
323+ if (g_CurrentShader == shader)
310324 return ;
311325
312- g_PreviousShader = shader;
326+ g_CurrentShader = shader;
313327
314328 glUseProgram (shader);
315329 GR_GetWVPUniforms (shader);
316330}
317331
318332// ----------------------------------------------------------------
319333
320- void GR_SetMatrix (MatrixMode mode, const Matrix4x4& matrix)
334+ void GR_SetMatrix (GR_MatrixMode mode, const Matrix4x4& matrix)
321335{
322336 g_matrices[mode] = matrix;
323337}
@@ -422,23 +436,23 @@ void GR_SetPolygonOffset(float ofs)
422436
423437void GR_SetDepth (int enable)
424438{
425- if (g_PreviousDepthMode == enable)
439+ if (g_CurrentDepthMode == enable)
426440 return ;
427441
428- g_PreviousDepthMode = enable;
442+ g_CurrentDepthMode = enable;
429443
430444 if (enable)
431445 glEnable (GL_DEPTH_TEST);
432446 else
433447 glDisable (GL_DEPTH_TEST);
434448}
435449
436- void GR_SetBlendMode (BlendMode blendMode)
450+ void GR_SetBlendMode (GR_BlendMode blendMode)
437451{
438- if (g_PreviousBlendMode == blendMode)
452+ if (g_CurrentBlendMode == blendMode)
439453 return ;
440454
441- if (g_PreviousBlendMode == BM_NONE)
455+ if (g_CurrentBlendMode == BM_NONE)
442456 glEnable (GL_BLEND);
443457
444458 switch (blendMode)
@@ -464,24 +478,29 @@ void GR_SetBlendMode(BlendMode blendMode)
464478 break ;
465479 }
466480
467- g_PreviousBlendMode = blendMode;
481+ g_CurrentBlendMode = blendMode;
468482}
469483
470484// --------------------------------------------------------------------------
471485
472- GrVAO* GR_CreateVAO (int numVertices, GrVertex* verts /* = NULL */ , int dynamic /* = 0*/ )
486+ GrVAO* GR_CreateVAO (int numVertices, GrVertex* verts /* = nullptr */ , int dynamic /* = 0*/ )
473487{
474- GLuint vertexBuffer;
488+ return GR_CreateVAO (numVertices, 0 , verts, nullptr , dynamic);
489+ }
490+
491+ GrVAO* GR_CreateVAO (int numVertices, int numIndices, GrVertex* verts /* = nullptr*/ , int * indices /* = nullptr*/ , int dynamic /* = 0*/ )
492+ {
493+ GLuint buffers[2 ] = { GL_NONE };
475494 GLuint vertexArray;
476495
477496 // gen vertex buffer and index buffer
478497 glGenVertexArrays (1 , &vertexArray);
479498 {
480- glGenBuffers (1 , &vertexBuffer );
499+ glGenBuffers (2 , buffers );
481500
482501 glBindVertexArray (vertexArray);
483502
484- glBindBuffer (GL_ARRAY_BUFFER, vertexBuffer );
503+ glBindBuffer (GL_ARRAY_BUFFER, buffers[ 0 ] );
485504 glBufferData (GL_ARRAY_BUFFER, sizeof (GrVertex) * numVertices, verts, dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
486505
487506 glEnableVertexAttribArray (a_position_tu);
@@ -492,23 +511,31 @@ GrVAO* GR_CreateVAO(int numVertices, GrVertex* verts /*= NULL*/, int dynamic /*=
492511 glVertexAttribPointer (a_normal_tv, 4 , GL_FLOAT, GL_FALSE, sizeof (GrVertex), &((GrVertex*)nullptr )->nx );
493512 glVertexAttribPointer (a_color, 4 , GL_FLOAT, GL_TRUE, sizeof (GrVertex), &((GrVertex*)nullptr )->cr );
494513
514+ if (numIndices)
515+ {
516+ glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, buffers[1 ]);
517+ glBufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (int ) * numIndices, indices, dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
518+ }
519+
495520 glBindVertexArray (0 );
496521 }
497522
498523 GrVAO* newVAO = new GrVAO ();
499524 newVAO->numVertices = numVertices;
525+ newVAO->numIndices = numIndices;
500526 newVAO->vertexArray = vertexArray;
501- newVAO->vertexBuffer = vertexBuffer;
527+ newVAO->buffers [0 ] = buffers[0 ];
528+ newVAO->buffers [1 ] = buffers[1 ];
502529
503530 return newVAO;
504531}
505532
506533void GR_SetVAO (GrVAO* vaoPtr)
507534{
508- if (g_PreviousVAO == vaoPtr)
535+ if (g_CurrentVAO == vaoPtr)
509536 return ;
510537
511- g_PreviousVAO = vaoPtr;
538+ g_CurrentVAO = vaoPtr;
512539
513540 if (vaoPtr == nullptr )
514541 {
@@ -525,8 +552,18 @@ void GR_DestroyVAO(GrVAO* vaoPtr)
525552 return ;
526553
527554 glDeleteVertexArrays (1 , &vaoPtr->vertexArray );
528- glDeleteBuffers (1 , & vaoPtr->vertexBuffer );
555+ glDeleteBuffers (2 , vaoPtr->buffers );
529556 delete vaoPtr;
530557}
531558
532- // --------------------------------------------------------------------------
559+ // --------------------------------------------------------------------------
560+
561+ void GR_DrawNonIndexed (GR_PrimitiveType primitivesType, int firstVertex, int numVertices)
562+ {
563+ glDrawArrays (glPrimitiveType[primitivesType], firstVertex, numVertices);
564+ }
565+
566+ void GR_DrawIndexed (GR_PrimitiveType primitivesType, int firstIndex, int numIndices)
567+ {
568+ glDrawElements (glPrimitiveType[primitivesType], numIndices, GL_UNSIGNED_INT, (void *)(intptr_t )firstIndex);
569+ }
0 commit comments