diff --git a/src/rendering/twn_draw.c b/src/rendering/twn_draw.c index a234686..1a0d909 100644 --- a/src/rendering/twn_draw.c +++ b/src/rendering/twn_draw.c @@ -3,6 +3,7 @@ #include "twn_engine_context_c.h" #include "twn_camera_c.h" #include "twn_types.h" +#include "twn_util_c.h" #include "twn_vec.h" #include "twn_deferred_commands.h" @@ -526,3 +527,56 @@ void issue_deferred_draw_commands(void) { } } + +void render_circle(const CirclePrimitive *circle) { + static Vec2 vertices[CIRCLE_VERTICES_MAX]; + static int prev_num_vertices = 0; + static Vec2 prev_position = {0}; + + int const num_vertices = MIN((int)circle->radius, CIRCLE_VERTICES_MAX); + + if (prev_num_vertices != num_vertices) { + create_circle_geometry(circle->position, + circle->radius, + num_vertices, + vertices); + prev_num_vertices = num_vertices; + prev_position = circle->position; + } else { + /* reuse the data, but offset it by difference with previously generated position */ + /* no evil cos sin ops this way, if radius is shared in sequential calls */ + Vec2 const d = { prev_position.x - circle->position.x, prev_position.y - circle->position.y }; + for (int i = 0; i < num_vertices; ++i) + vertices[i] = (Vec2){ vertices[i].x - d.x, vertices[i].y - d.y }; + prev_position = circle->position; + } + + VertexBuffer buffer = get_scratch_vertex_array(); + specify_vertex_buffer(buffer, vertices, sizeof (Vec2) * num_vertices); + + DeferredCommandDraw command = {0}; + + command.vertices = (AttributeArrayPointer) { + .arity = 2, + .type = GL_FLOAT, + .stride = sizeof (Vec2), + .offset = 0, + .buffer = buffer + }; + + command.constant_colored = true; + command.color = circle->color; + + command.element_buffer = get_circle_element_buffer(); + command.element_count = (num_vertices - 2) * 3; + command.range_end = (num_vertices - 2) * 3; + + use_texture_mode(circle->color.a == 255 ? TEXTURE_MODE_OPAQUE : TEXTURE_MODE_GHOSTLY); + + DeferredCommand final_command = { + .type = DEFERRED_COMMAND_TYPE_DRAW, + .draw = command + }; + + arrpush(deferred_commands, final_command); +} diff --git a/src/rendering/twn_gl_15_rendering.c b/src/rendering/twn_gl_15_rendering.c index 6f089ba..d9e61f2 100644 --- a/src/rendering/twn_gl_15_rendering.c +++ b/src/rendering/twn_gl_15_rendering.c @@ -596,60 +596,6 @@ static void load_cubemap_side(const char *path, GLenum target) { } -void render_circle(const CirclePrimitive *circle) { - static Vec2 vertices[CIRCLE_VERTICES_MAX]; - static int prev_num_vertices = 0; - static Vec2 prev_position = {0}; - - int const num_vertices = MIN((int)circle->radius, CIRCLE_VERTICES_MAX); - - if (prev_num_vertices != num_vertices) { - create_circle_geometry(circle->position, - circle->radius, - num_vertices, - vertices); - prev_num_vertices = num_vertices; - prev_position = circle->position; - } else { - /* reuse the data, but offset it by difference with previously generated position */ - /* no evil cos sin ops this way, if radius is shared in sequential calls */ - Vec2 const d = { prev_position.x - circle->position.x, prev_position.y - circle->position.y }; - for (int i = 0; i < num_vertices; ++i) - vertices[i] = (Vec2){ vertices[i].x - d.x, vertices[i].y - d.y }; - prev_position = circle->position; - } - - VertexBuffer buffer = get_scratch_vertex_array(); - specify_vertex_buffer(buffer, vertices, sizeof (Vec2) * num_vertices); - - DeferredCommandDraw command = {0}; - - command.vertices = (AttributeArrayPointer) { - .arity = 2, - .type = GL_FLOAT, - .stride = sizeof (Vec2), - .offset = 0, - .buffer = buffer - }; - - command.constant_colored = true; - command.color = circle->color; - - command.element_buffer = get_circle_element_buffer(); - command.element_count = (num_vertices - 2) * 3; - command.range_end = (num_vertices - 2) * 3; - - use_texture_mode(circle->color.a == 255 ? TEXTURE_MODE_OPAQUE : TEXTURE_MODE_GHOSTLY); - - DeferredCommand final_command = { - .type = DEFERRED_COMMAND_TYPE_DRAW, - .draw = command - }; - - arrpush(deferred_commands, final_command); -} - - void finally_render_skybox(DeferredCommandDrawSkybox command) { static GLuint cubemap = 0; static char *paths_cache = NULL;