summaryrefslogtreecommitdiff
path: root/src/render/gl_2d.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/gl_2d.cpp')
-rw-r--r--src/render/gl_2d.cpp68
1 files changed, 52 insertions, 16 deletions
diff --git a/src/render/gl_2d.cpp b/src/render/gl_2d.cpp
index 44e7e00..ca3a338 100644
--- a/src/render/gl_2d.cpp
+++ b/src/render/gl_2d.cpp
@@ -1,8 +1,8 @@
#include "gl_2d.h"
#include "../util.h"
-GL_PROGRAM* gl_2d_init( GL_DATA* gl, VEC2 screensize, const char* shadername ) {
- GL_PROGRAM* program = gl_program_create( gl, shadername );
+GL_SHADER_PROGRAM* gl_2d_init( GL_DATA* gl, VEC2 screensize, const char* shadername ) {
+ GL_SHADER_PROGRAM* program = gl_program_create( gl, shadername );
if( !OK( gl_program_compile( gl, program ) ) )
dlog( "gl_2d_init() : error compiling shader %s\n", shadername );
@@ -26,10 +26,11 @@ GL_PROGRAM* gl_2d_init( GL_DATA* gl, VEC2 screensize, const char* shadername ) {
return program;
}
-void gl_2d_line( GL_PROGRAM* gl2d, VEC2 start, VEC2 end, CLR col ) {
+void gl_2d_line( GL_SHADER_PROGRAM* gl2d, VEC2 start, VEC2 end, CLR col ) {
static const U16 order[] = { 0, 1 };
glUseProgram( gl2d->id );
+ glBindVertexArray( gl2d->gl->vao );
VERTEX vertices[] = {
{ .pos = { start.x, start.y }, .clr = col },
@@ -47,12 +48,15 @@ void gl_2d_line( GL_PROGRAM* gl2d, VEC2 start, VEC2 end, CLR col ) {
glBindBuffer( GL_ARRAY_BUFFER, 0 );
glDrawElements( GL_LINES, 2, GL_UNSIGNED_SHORT, order );
+
+ glBindVertexArray( 0 );
}
-void gl_2d_rect( GL_PROGRAM* gl2d, VEC2 origin, VEC2 dim, CLR col ) {
+void gl_2d_rect( GL_SHADER_PROGRAM* gl2d, VEC2 origin, VEC2 dim, CLR col ) {
static const U16 order[] = { 0, 1, 2, 3, 4 };
glUseProgram( gl2d->id );
+ glBindVertexArray( gl2d->gl->vao );
VERTEX vertices[] = {
{ .pos = { origin.x , origin.y }, .clr = col },
@@ -73,12 +77,16 @@ void gl_2d_rect( GL_PROGRAM* gl2d, VEC2 origin, VEC2 dim, CLR col ) {
glBindBuffer( GL_ARRAY_BUFFER, 0 );
glDrawElements( GL_LINE_STRIP, 5, GL_UNSIGNED_SHORT, order );
+
+ glBindVertexArray( 0 );
}
-void gl_2d_textured_frect( GL_PROGRAM* gl2d, VEC2 origin, VEC2 dim, GL_TEX2D* texture, CLR col, VEC2* uv, F32 rotation ) {
+void gl_2d_textured_frect( GL_SHADER_PROGRAM* gl2d, VEC2 origin, VEC2 dim, GL_TEX2D* texture, CLR col, VEC2* uv, F32 rotation ) {
static const U16 order[] = { 0, 1, 2, 3 };
glUseProgram( gl2d->id );
+ glBindVertexArray( gl2d->gl->vao );
+
VERTEX vertices[] = {
{ { origin.x, origin.y }, uv? uv[0] : VEC2{ 0.f, 0.f }, col, 0 },
{ { origin.x + dim.x, origin.y }, uv? uv[1] : VEC2{ 1.f, 0.f }, col, 0 },
@@ -125,12 +133,16 @@ void gl_2d_textured_frect( GL_PROGRAM* gl2d, VEC2 origin, VEC2 dim, GL_TEX2D* te
glDrawElements( GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, order );
glBindTexture( GL_TEXTURE_2D, 0 );
+
+ glBindVertexArray( 0 );
}
-void gl_2d_frect( GL_PROGRAM* gl2d, VEC2 origin, VEC2 dim, CLR col ) {
+void gl_2d_frect( GL_SHADER_PROGRAM* gl2d, VEC2 origin, VEC2 dim, CLR col ) {
static const U16 order[] = { 0, 1, 2, 3 };
glUseProgram( gl2d->id );
+ glBindVertexArray( gl2d->gl->vao );
+
VERTEX vertices[] = {
{ .pos = { origin.x, origin.y }, .uv = { 0.f, 0.f }, .clr = col },
{ .pos = { origin.x + dim.x, origin.y }, .uv = { 1.f, 0.f }, .clr = col },
@@ -140,25 +152,38 @@ void gl_2d_frect( GL_PROGRAM* gl2d, VEC2 origin, VEC2 dim, CLR col ) {
glBindBuffer( GL_ARRAY_BUFFER, gl2d->gl->vbuffer );
glBufferData( GL_ARRAY_BUFFER, sizeof(vertices), &vertices[0], GL_DYNAMIC_DRAW );
+
I32 position = glGetAttribLocation( gl2d->id, "in_pos" );
- glEnableVertexAttribArray( position );
- glVertexAttribPointer( position, 2, GL_FLOAT, 0, sizeof(VERTEX), 0 );
I32 color = glGetAttribLocation( gl2d->id, "in_col" );
- glEnableVertexAttribArray( color );
- glVertexAttribPointer( color, 4, GL_FLOAT, 0, sizeof(VERTEX), &( (VERTEX*)nullptr)->clr );
+
+ if (position >= 0) {
+ glEnableVertexAttribArray( position );
+ glVertexAttribPointer( position, 2, GL_FLOAT, 0, sizeof(VERTEX), 0 );
+ }
+
+ if (color >= 0) {
+ glEnableVertexAttribArray( color );
+ glVertexAttribPointer( color, 4, GL_FLOAT, 0, sizeof(VERTEX), &( (VERTEX*)nullptr)->clr );
+ }
+
I32 texcoord = glGetAttribLocation( gl2d->id, "in_texcoord" );
- glEnableVertexAttribArray( texcoord );
- glVertexAttribPointer( texcoord, 2, GL_FLOAT, 0, sizeof(VERTEX), &( (VERTEX*)nullptr)->uv );
+ if (texcoord >= 0) {
+ glEnableVertexAttribArray( texcoord );
+ glVertexAttribPointer( texcoord, 2, GL_FLOAT, 0, sizeof(VERTEX), &( (VERTEX*)nullptr)->uv );
+ }
glBindBuffer( GL_ARRAY_BUFFER, 0 );
glDrawElements( GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, order );
+
+ glBindVertexArray( 0 ); // Unbind VAO
}
-void gl_2d_circle( GL_PROGRAM* gl2d, VEC2 origin, F32 radius, CLR col, U32 res ) {
+void gl_2d_circle( GL_SHADER_PROGRAM* gl2d, VEC2 origin, F32 radius, CLR col, U32 res ) {
static U16* order = 0;
const F32 step = 360.f / (F32)res;
glUseProgram( gl2d->id );
+ glBindVertexArray( gl2d->gl->vao );
if( !order ) {
order = (U16*)malloc( sizeof( U16 ) * (res + 1) );
@@ -193,13 +218,16 @@ void gl_2d_circle( GL_PROGRAM* gl2d, VEC2 origin, F32 radius, CLR col, U32 res )
glDrawElements( GL_LINE_STRIP, res + 1, GL_UNSIGNED_SHORT, order );
free( vertices );
+
+ glBindVertexArray( 0 );
}
-void gl_2d_fcircle( GL_PROGRAM* gl2d, VEC2 origin, F32 radius, CLR col, U32 res ) {
+void gl_2d_fcircle( GL_SHADER_PROGRAM* gl2d, VEC2 origin, F32 radius, CLR col, U32 res ) {
static U16* order = 0;
const F32 step = 360.f / (F32)res;
glUseProgram( gl2d->id );
+ glBindVertexArray( gl2d->gl->vao );
if( !order ) {
order = (U16*)malloc( sizeof( U16 ) * (res * 2) );
@@ -246,10 +274,13 @@ void gl_2d_fcircle( GL_PROGRAM* gl2d, VEC2 origin, F32 radius, CLR col, U32 res
glDrawElements( GL_TRIANGLE_STRIP, res + 2, GL_UNSIGNED_SHORT, order );
free( vertices );
+
+ glBindVertexArray( 0 );
}
-void gl_polygon( GL_PROGRAM* gl2d, VERTEX* vertices, U32 vertices_count ) {
+void gl_polygon( GL_SHADER_PROGRAM* gl2d, VERTEX* vertices, U32 vertices_count ) {
glUseProgram( gl2d->id );
+ glBindVertexArray( gl2d->gl->vao );
glBindBuffer( GL_ARRAY_BUFFER, gl2d->gl->vbuffer );
glBufferData( GL_ARRAY_BUFFER, sizeof(VERTEX) * vertices_count, vertices, GL_STATIC_DRAW );
@@ -271,15 +302,18 @@ void gl_polygon( GL_PROGRAM* gl2d, VERTEX* vertices, U32 vertices_count ) {
order[i] = i;
glDrawElements( GL_TRIANGLE_FAN, vertices_count, GL_UNSIGNED_SHORT, order );
+
+ glBindVertexArray( 0 );
}
void gl_textured_polygon(
- GL_PROGRAM *gl2d,
+ GL_SHADER_PROGRAM *gl2d,
VERTEX *vertices,
U32 vertices_count,
GL_TEX2D *tex
) {
glUseProgram( gl2d->id );
+ glBindVertexArray( gl2d->gl->vao );
for( U32 i = 0; i < vertices_count; ++i )
vertices[i].sampler = 0;
@@ -311,4 +345,6 @@ void gl_textured_polygon(
order[i] = i;
glDrawElements( GL_TRIANGLE_FAN, vertices_count, GL_UNSIGNED_SHORT, order );
+
+ glBindVertexArray( 0 );
}