Skip to content

Commit 91bbba9

Browse files
committed
- added transform state, index buffers and draw operations
1 parent e469158 commit 91bbba9

2 files changed

Lines changed: 80 additions & 31 deletions

File tree

DriverLevelTool/viewer/gl_renderer.cpp

Lines changed: 61 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@
1111
struct 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;
2223
int g_windowWidth, g_windowHeight;
2324
int 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;
2829
TextureID g_lastBoundTexture = -1;
29-
ShaderID g_PreviousShader = -1;
30+
ShaderID g_CurrentShader = -1;
3031

3132
GLint u_MatrixUniforms[MATRIX_MODES];
3233
Matrix4x4 g_matrices[MATRIX_MODES];
@@ -38,7 +39,20 @@ GLint u_WorldViewProj;
3839

3940
TextureID 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

4357
void GR_GetWVPUniforms(GLuint program)
4458
{
@@ -306,18 +320,18 @@ ShaderID GR_CompileShader(const char* source)
306320

307321
void 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

423437
void 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

506533
void 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+
}

DriverLevelTool/viewer/gl_renderer.h

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ struct GrVertex
2020

2121
struct GrVAO;
2222

23-
enum ShaderAttrib
23+
enum GR_ShaderAttrib
2424
{
2525
a_position_tu,
2626
a_normal_tv,
2727
a_color,
2828
};
2929

30-
enum BlendMode
30+
enum GR_BlendMode
3131
{
3232
BM_NONE,
3333
BM_AVERAGE,
@@ -36,7 +36,7 @@ enum BlendMode
3636
BM_ADD_QUATER_SOURCE
3737
};
3838

39-
enum MatrixMode
39+
enum GR_MatrixMode
4040
{
4141
MATRIX_VIEW = 0,
4242
MATRIX_PROJECTION,
@@ -47,6 +47,18 @@ enum MatrixMode
4747
MATRIX_MODES,
4848
};
4949

50+
enum GR_PrimitiveType
51+
{
52+
PRIM_TRIANGLES = 0,
53+
PRIM_TRIANGLE_FAN,
54+
PRIM_TRIANGLE_STRIP,
55+
PRIM_QUADS,
56+
PRIM_LINES,
57+
PRIM_LINE_STRIP,
58+
PRIM_LINE_LOOP,
59+
PRIM_POINTS,
60+
};
61+
5062
int GR_Init(char* windowName, int width, int height, int fullscreen);
5163
void GR_Shutdown();
5264

@@ -70,24 +82,24 @@ void GR_DestroyTexture(TextureID texture);
7082
//--------------------------------------------------
7183

7284
GrVAO* GR_CreateVAO(int numVertices, GrVertex* verts = nullptr, int dynamic = 0);
85+
GrVAO* GR_CreateVAO(int numVertices, int numIndices, GrVertex* verts = nullptr, int* indices = nullptr, int dynamic = 0);
7386
void GR_DestroyVAO(GrVAO* vaoPtr);
7487

7588
//--------------------------------------------------
7689

7790
void GR_SetShader(const ShaderID& shader);
7891
void GR_SetVAO(GrVAO* vaoPtr);
7992
void GR_SetTexture(TextureID texture);
80-
void GR_SetMatrix(MatrixMode mode, const Matrix4x4& matrix);
93+
void GR_SetMatrix(GR_MatrixMode mode, const Matrix4x4& matrix);
8194

8295
void GR_SetPolygonOffset(float ofs);
8396
void GR_SetDepth(int enable);
8497

8598
void GR_UpdateMatrixUniforms();
8699

87-
88-
89100
//--------------------------------------------------
90101

91-
102+
void GR_DrawNonIndexed(GR_PrimitiveType primitivesType, int firstVertex, int numVertices);
103+
void GR_DrawIndexed(GR_PrimitiveType primitivesType, int firstIndex, int numIndices);
92104

93105
#endif

0 commit comments

Comments
 (0)