Update 2d rendering library

This commit is contained in:
2024-09-28 22:58:34 +02:00
parent 310c076dfc
commit 44e9e52fc7

View File

@@ -17,10 +17,18 @@ void r_2d_immediate_segment(v2 a, v2 b, v4 a_color, v4 b_color, f32 thickness)
glUniform1i(r_render_state.shader_2d.has_texture[0], 0); glUniform1i(r_render_state.shader_2d.has_texture[0], 0);
// Vertex buffer data // Vertex buffer data
GLuint gl_VAO, gl_VBO; static GLuint gl_VAO, gl_VBO;
glGenVertexArrays(1, &gl_VAO); static bool init = false;
if(!init)
{
init = true;
glGenVertexArrays(1, &gl_VAO);
glBindVertexArray(gl_VAO);
glGenBuffers(1, &gl_VBO);
glBindBuffer(GL_ARRAY_BUFFER, gl_VBO);
}
glBindVertexArray(gl_VAO); glBindVertexArray(gl_VAO);
glGenBuffers(1, &gl_VBO);
glBindBuffer(GL_ARRAY_BUFFER, gl_VBO); glBindBuffer(GL_ARRAY_BUFFER, gl_VBO);
f32 data[12] = { a.x, a.y, b.x, b.y, a_color.r, a_color.g, a_color.b, a_color.a, b_color.r, b_color.g, b_color.b, b_color.a }; f32 data[12] = { a.x, a.y, b.x, b.y, a_color.r, a_color.g, a_color.b, a_color.a, b_color.r, b_color.g, b_color.b, b_color.a };
@@ -36,8 +44,8 @@ void r_2d_immediate_segment(v2 a, v2 b, v4 a_color, v4 b_color, f32 thickness)
glDrawArrays(GL_LINES, 0, 2); glDrawArrays(GL_LINES, 0, 2);
// Deinit // Deinit
glDeleteBuffers(1, &gl_VBO); // glDeleteBuffers(1, &gl_VBO);
glDeleteVertexArrays(1, &gl_VAO); // glDeleteVertexArrays(1, &gl_VAO);
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
} }
@@ -51,10 +59,18 @@ void r_2d_immediate_polygonal_chain(u64 count, v2 *vertices, v4 color, f32 thick
glUniform1i(r_render_state.shader_2d.has_texture[0], 0); glUniform1i(r_render_state.shader_2d.has_texture[0], 0);
// Vertex buffer data // Vertex buffer data
GLuint gl_VAO, gl_VBO; static GLuint gl_VAO, gl_VBO;
glGenVertexArrays(1, &gl_VAO); static bool init = false;
if(!init)
{
init = true;
glGenVertexArrays(1, &gl_VAO);
glBindVertexArray(gl_VAO);
glGenBuffers(1, &gl_VBO);
glBindBuffer(GL_ARRAY_BUFFER, gl_VBO);
}
glBindVertexArray(gl_VAO); glBindVertexArray(gl_VAO);
glGenBuffers(1, &gl_VBO);
glBindBuffer(GL_ARRAY_BUFFER, gl_VBO); glBindBuffer(GL_ARRAY_BUFFER, gl_VBO);
glBufferData(GL_ARRAY_BUFFER, count*sizeof(v2), vertices, GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, count*sizeof(v2), vertices, GL_STATIC_DRAW);
@@ -69,8 +85,8 @@ void r_2d_immediate_polygonal_chain(u64 count, v2 *vertices, v4 color, f32 thick
glDrawArrays(GL_LINE_STRIP, 0, count); glDrawArrays(GL_LINE_STRIP, 0, count);
// Deinit // Deinit
glDeleteBuffers(1, &gl_VBO); // glDeleteBuffers(1, &gl_VBO);
glDeleteVertexArrays(1, &gl_VAO); // glDeleteVertexArrays(1, &gl_VAO);
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
} }
@@ -85,12 +101,21 @@ void r_2d_immediate_triangle(v2 a, v2 b, v2 c, v4 a_color, v4 b_color, v4 c_colo
set_texture_in_shader(&r_render_state.shader_2d, texture); set_texture_in_shader(&r_render_state.shader_2d, texture);
// Vertex buffer data // Vertex buffer data
GLuint gl_VAO, gl_VBO; static GLuint gl_VAO, gl_VBO;
glGenVertexArrays(1, &gl_VAO); static bool init = false;
if(!init)
{
init = true;
glGenVertexArrays(1, &gl_VAO);
glBindVertexArray(gl_VAO);
glGenBuffers(1, &gl_VBO);
glBindBuffer(GL_ARRAY_BUFFER, gl_VBO);
}
glBindVertexArray(gl_VAO); glBindVertexArray(gl_VAO);
glGenBuffers(1, &gl_VBO);
glBindBuffer(GL_ARRAY_BUFFER, gl_VBO); glBindBuffer(GL_ARRAY_BUFFER, gl_VBO);
f32 data[24] = { f32 data[24] = {
a.x, a.y, b.x, b.y, c.x, c.y, a.x, a.y, b.x, b.y, c.x, c.y,
a_color.r, a_color.g, a_color.b, a_color.a, a_color.r, a_color.g, a_color.b, a_color.a,
@@ -111,8 +136,8 @@ void r_2d_immediate_triangle(v2 a, v2 b, v2 c, v4 a_color, v4 b_color, v4 c_colo
glDrawArrays(GL_TRIANGLES, 0, 3); glDrawArrays(GL_TRIANGLES, 0, 3);
// Deinit // Deinit
glDeleteBuffers(1, &gl_VBO); // glDeleteBuffers(1, &gl_VBO);
glDeleteVertexArrays(1, &gl_VAO); // glDeleteVertexArrays(1, &gl_VAO);
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
} }
@@ -127,10 +152,18 @@ void r_2d_immediate_quad(v2 a, v2 b, v2 c, v2 d, v4 color, v2 a_uv, v2 b_uv, v2
set_texture_in_shader(&r_render_state.shader_2d, texture); set_texture_in_shader(&r_render_state.shader_2d, texture);
// Vertex buffer data // Vertex buffer data
GLuint gl_VAO, gl_VBO; static GLuint gl_VAO, gl_VBO;
glGenVertexArrays(1, &gl_VAO); static bool init = false;
if(!init)
{
init = true;
glGenVertexArrays(1, &gl_VAO);
glBindVertexArray(gl_VAO);
glGenBuffers(1, &gl_VBO);
glBindBuffer(GL_ARRAY_BUFFER, gl_VBO);
}
glBindVertexArray(gl_VAO); glBindVertexArray(gl_VAO);
glGenBuffers(1, &gl_VBO);
glBindBuffer(GL_ARRAY_BUFFER, gl_VBO); glBindBuffer(GL_ARRAY_BUFFER, gl_VBO);
f32 data[16] = { f32 data[16] = {
@@ -150,8 +183,8 @@ void r_2d_immediate_quad(v2 a, v2 b, v2 c, v2 d, v4 color, v2 a_uv, v2 b_uv, v2
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
// Deinit // Deinit
glDeleteBuffers(1, &gl_VBO); // glDeleteBuffers(1, &gl_VBO);
glDeleteVertexArrays(1, &gl_VAO); // glDeleteVertexArrays(1, &gl_VAO);
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
} }
@@ -224,12 +257,12 @@ void r_2d_immediate_rounded_rectangle(Rect r, f32 radius, v4 color)
}; };
u32 corner_offset = 30; u32 corner_offset = 30;
// Corner semicircles // Corner semicircles
f32 factor = TAU * .25 / num_of_segments;
v2 inner_vertices[4] = {i0, i1, i2, i3}; v2 inner_vertices[4] = {i0, i1, i2, i3};
for(u32 quadrant = 0; quadrant < 4; quadrant++) for(u32 quadrant = 0; quadrant < 4; quadrant++)
{ {
for(u32 i = quadrant*num_of_segments; i < (quadrant+1)*num_of_segments; i++) for(u32 i = quadrant*num_of_segments; i < (quadrant+1)*num_of_segments; i++)
{ {
f32 factor = TAU * .25 / num_of_segments;
v2 inner = inner_vertices[quadrant]; v2 inner = inner_vertices[quadrant];
v2 a = inner + radius * v2{cos( i * factor), -sin( i * factor)}; v2 a = inner + radius * v2{cos( i * factor), -sin( i * factor)};
v2 b = inner + radius * v2{cos((i+1) * factor), -sin((i+1) * factor)}; v2 b = inner + radius * v2{cos((i+1) * factor), -sin((i+1) * factor)};
@@ -252,11 +285,18 @@ void r_2d_immediate_mesh(u64 count, v2 *vertices, v4 color, v2 *uvs, r_texture *
set_texture_in_shader(&r_render_state.shader_2d, texture); set_texture_in_shader(&r_render_state.shader_2d, texture);
// Vertex buffer data // Vertex buffer data
GLuint gl_VAO, gl_vertices, gl_uvs; static GLuint gl_VAO, gl_vertices, gl_uvs;
glGenVertexArrays(1, &gl_VAO); static bool init = false;
if(!init)
{
init = true;
glGenVertexArrays(1, &gl_VAO);
glBindVertexArray(gl_VAO);
glGenBuffers(1, &gl_vertices);
glGenBuffers(1, &gl_uvs);
}
glBindVertexArray(gl_VAO); glBindVertexArray(gl_VAO);
glGenBuffers(1, &gl_vertices);
glGenBuffers(1, &gl_uvs);
glBindBuffer(GL_ARRAY_BUFFER, gl_vertices); glBindBuffer(GL_ARRAY_BUFFER, gl_vertices);
glBufferData(GL_ARRAY_BUFFER, count * sizeof(v2), vertices, GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, count * sizeof(v2), vertices, GL_STATIC_DRAW);
@@ -273,9 +313,9 @@ void r_2d_immediate_mesh(u64 count, v2 *vertices, v4 color, v2 *uvs, r_texture *
glDrawArrays(GL_TRIANGLES, 0, count); glDrawArrays(GL_TRIANGLES, 0, count);
// Deinitvoid r_2d_draw_mesh(r_2d_mesh *mesh, r_texture *texture); // Deinitvoid r_2d_draw_mesh(r_2d_mesh *mesh, r_texture *texture);
glDeleteBuffers(1, &gl_vertices); // glDeleteBuffers(1, &gl_vertices);
glDeleteBuffers(1, &gl_uvs); // glDeleteBuffers(1, &gl_uvs);
glDeleteVertexArrays(1, &gl_VAO); // glDeleteVertexArrays(1, &gl_VAO);
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
} }
@@ -325,17 +365,22 @@ void r_2d_immediate_rounded_rectangle_outline(Rect r, f32 radius, v4 color, f32
u32 v_index = 1; u32 v_index = 1;
// Corner semicircles // Corner semicircles
f32 factor = TAU * .25 / num_of_segments;
for(u32 quadrant = 0; quadrant < 4; quadrant++) for(u32 quadrant = 0; quadrant < 4; quadrant++)
{ {
v2 inner = inner_vertices[quadrant]; v2 inner = inner_vertices[quadrant];
for(u32 i = quadrant*num_of_segments; i < (quadrant+1)*num_of_segments; i++) v2 offset = {0, 0};
if(num_of_segments > 0)
{ {
v2 a = inner + radius * v2{cos( i * factor), -sin( i * factor)}; f32 factor = TAU * .25 / num_of_segments;
vertices[v_index] = a; for(u32 i = quadrant*num_of_segments; i < (quadrant+1)*num_of_segments; i++)
v_index++; {
v2 a = inner + radius * v2{cos( i * factor), -sin( i * factor)};
vertices[v_index] = a;
v_index++;
}
offset = radius * v2{cos( (quadrant+1)*num_of_segments * factor), -sin( (quadrant+1)*num_of_segments * factor)};
} }
vertices[v_index] = inner + radius * v2{cos( (quadrant+1)*num_of_segments * factor), -sin( (quadrant+1)*num_of_segments * factor)}; vertices[v_index] = inner + offset;
v_index++; v_index++;
} }