|
@@ -66,11 +66,18 @@ RENDERER_ERROR renderer_init(Renderer *renderer, int width, int height) {
|
|
renderer->height = height;
|
|
renderer->height = height;
|
|
|
|
|
|
RENDERER_ERROR err = renderer_init_glfw(renderer, width, height);
|
|
RENDERER_ERROR err = renderer_init_glfw(renderer, width, height);
|
|
- if (err != RENDERER_ERROR_OK) return err;
|
|
|
|
|
|
+ if (err != RENDERER_ERROR_OK) {
|
|
|
|
+ ERROR_AND_QUIT(err, "could not intialize OpenGL");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
- renderer_init_shaders(renderer);
|
|
|
|
renderer_init_quad(renderer);
|
|
renderer_init_quad(renderer);
|
|
|
|
+ renderer_init_line(renderer);
|
|
renderer_init_textures(renderer);
|
|
renderer_init_textures(renderer);
|
|
|
|
+ renderer_init_shaders(renderer);
|
|
|
|
+
|
|
|
|
|
|
return RENDERER_ERROR_OK;
|
|
return RENDERER_ERROR_OK;
|
|
|
|
|
|
@@ -146,33 +153,14 @@ void renderer_init_shaders(Renderer *renderer) {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-void render_quad(Renderer* renderer, vec2 pos, vec2 size, vec4 color)
|
|
|
|
-{
|
|
|
|
-
|
|
|
|
- GLuint default_shader = renderer->programs[DEFAULT_PROGRAM];
|
|
|
|
- glUseProgram(default_shader);
|
|
|
|
- mat4x4 model;
|
|
|
|
- mat4x4_identity(model);
|
|
|
|
-
|
|
|
|
- mat4x4_translate(model, pos[0], pos[1], 0);
|
|
|
|
- mat4x4_scale_aniso(model, model, size[0], size[1], 1);
|
|
|
|
-
|
|
|
|
- glUniformMatrix4fv(glGetUniformLocation(default_shader, "model"), 1, GL_FALSE, &model[0][0]);
|
|
|
|
- glUniform4fv(glGetUniformLocation(default_shader, "color"), 1, color);
|
|
|
|
-
|
|
|
|
- glBindVertexArray(renderer->vao);
|
|
|
|
- glBindTexture(GL_TEXTURE_2D, renderer->texture_color);
|
|
|
|
- glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, NULL);
|
|
|
|
-
|
|
|
|
- glBindVertexArray(0);
|
|
|
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
void renderer_destroy(Renderer* renderer) {
|
|
void renderer_destroy(Renderer* renderer) {
|
|
|
|
|
|
glDeleteTextures(1, &renderer->texture_color);
|
|
glDeleteTextures(1, &renderer->texture_color);
|
|
- glDeleteBuffers(1, &renderer->vbo);
|
|
|
|
- glDeleteBuffers(1, &renderer->ebo);
|
|
|
|
|
|
+ glDeleteBuffers(1, &renderer->quad.vbo);
|
|
|
|
+ glDeleteBuffers(1, &renderer->quad.ebo);
|
|
|
|
+ glDeleteBuffers(1, &renderer->line.vbo);
|
|
glDeleteProgram(renderer->programs[0]);
|
|
glDeleteProgram(renderer->programs[0]);
|
|
|
|
|
|
glfwTerminate();
|
|
glfwTerminate();
|
|
@@ -265,16 +253,16 @@ void renderer_init_quad(Renderer *renderer) {
|
|
1, 2, 3
|
|
1, 2, 3
|
|
};
|
|
};
|
|
|
|
|
|
- glGenVertexArrays(1, &renderer->vao);
|
|
|
|
- glGenBuffers(1, &renderer->vbo);
|
|
|
|
- glGenBuffers(1, &renderer->ebo);
|
|
|
|
|
|
+ glGenVertexArrays(1, &renderer->quad.vao);
|
|
|
|
+ glGenBuffers(1, &renderer->quad.vbo);
|
|
|
|
+ glGenBuffers(1, &renderer->quad.ebo);
|
|
|
|
|
|
- glBindVertexArray(renderer->vao);
|
|
|
|
|
|
+ glBindVertexArray(renderer->quad.vao);
|
|
|
|
|
|
- glBindBuffer(GL_ARRAY_BUFFER, renderer->vbo);
|
|
|
|
|
|
+ glBindBuffer(GL_ARRAY_BUFFER, renderer->quad.vbo);
|
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
|
|
|
|
|
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, renderer->ebo);
|
|
|
|
|
|
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, renderer->quad.ebo);
|
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
|
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
|
|
|
|
|
|
// x, y, z
|
|
// x, y, z
|
|
@@ -287,4 +275,97 @@ void renderer_init_quad(Renderer *renderer) {
|
|
glEnableVertexAttribArray(1);
|
|
glEnableVertexAttribArray(1);
|
|
|
|
|
|
glBindVertexArray(0);
|
|
glBindVertexArray(0);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void render_quad(Renderer* renderer, vec2 pos, vec2 size, vec4 color)
|
|
|
|
+{
|
|
|
|
+
|
|
|
|
+ GLuint default_shader = renderer->programs[DEFAULT_PROGRAM];
|
|
|
|
+ glUseProgram(default_shader);
|
|
|
|
+ mat4x4 model;
|
|
|
|
+ mat4x4_identity(model);
|
|
|
|
+
|
|
|
|
+ mat4x4_translate(model, pos[0], pos[1], 0);
|
|
|
|
+ mat4x4_scale_aniso(model, model, size[0], size[1], 1);
|
|
|
|
+
|
|
|
|
+ glUniformMatrix4fv(glGetUniformLocation(default_shader, "model"), 1, GL_FALSE, &model[0][0]);
|
|
|
|
+ glUniform4fv(glGetUniformLocation(default_shader, "color"), 1, color);
|
|
|
|
+
|
|
|
|
+ glBindVertexArray(renderer->quad.vao);
|
|
|
|
+ glBindTexture(GL_TEXTURE_2D, renderer->texture_color);
|
|
|
|
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, NULL);
|
|
|
|
+
|
|
|
|
+ glBindVertexArray(0);
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+void renderer_init_line(Renderer *renderer)
|
|
|
|
+{
|
|
|
|
+
|
|
|
|
+ glGenVertexArrays(1, &renderer->line.vao);
|
|
|
|
+ glBindVertexArray(renderer->line.vao);
|
|
|
|
+
|
|
|
|
+ glGenBuffers(1, &renderer->line.vbo);
|
|
|
|
+ glBindBuffer(GL_ARRAY_BUFFER, renderer->line.vbo);
|
|
|
|
+ glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), NULL, GL_DYNAMIC_DRAW);
|
|
|
|
+
|
|
|
|
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), NULL);
|
|
|
|
+ glEnableVertexAttribArray(0);
|
|
|
|
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
|
|
+
|
|
|
|
+ glBindVertexArray(0);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+void render_line(Renderer* renderer, vec2 start, vec2 end, vec4 color)
|
|
|
|
+{
|
|
|
|
+ glEnable(GL_LINE_SMOOTH);
|
|
|
|
+ glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
|
|
|
|
+ GLuint default_shader = renderer->programs[DEFAULT_PROGRAM];
|
|
|
|
+ glUseProgram(default_shader);
|
|
|
|
+ glLineWidth(3);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ float x = end[0] - start[0];
|
|
|
|
+ float y = end[1] - start[1];
|
|
|
|
+ float line[6] = {0, 0, 0, x, y, 0};
|
|
|
|
+
|
|
|
|
+ mat4x4 model;
|
|
|
|
+ mat4x4_translate(model, start[0], start[1], 0);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ glUniformMatrix4fv(glGetUniformLocation(default_shader, "model"), 1, GL_FALSE, &model[0][0]);
|
|
|
|
+ glUniform4fv(glGetUniformLocation(default_shader, "color"), 1, color);
|
|
|
|
+
|
|
|
|
+ glBindTexture(GL_TEXTURE_2D, renderer->texture_color);
|
|
|
|
+ glBindVertexArray(renderer->line.vao);
|
|
|
|
+
|
|
|
|
+ glBindBuffer(GL_ARRAY_BUFFER, renderer->line.vbo);
|
|
|
|
+ glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof (line), line);
|
|
|
|
+ glDrawArrays(GL_LINES, 0, 2);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ glBindVertexArray(0);
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void render_quad_line(Renderer *renderer, vec2 pos, vec2 size, vec4 color) {
|
|
|
|
+ vec2 points[4] = {
|
|
|
|
+ {pos[0] - size[0] * 0.5f, pos[1] - size[1] * 0.5f},
|
|
|
|
+ {pos[0] + size[0] * 0.5f, pos[1] - size[1] * 0.5f},
|
|
|
|
+ {pos[0] + size[0] * 0.5f, pos[1] + size[1] * 0.5f},
|
|
|
|
+ {pos[0] - size[0] * 0.5f, pos[1] + size[1] * 0.5f},
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ render_line(renderer, points[0], points[1], color);
|
|
|
|
+ render_line(renderer,points[1], points[2], color);
|
|
|
|
+ render_line(renderer,points[2], points[3], color);
|
|
|
|
+ render_line(renderer, points[3], points[0], color);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void render_aabb(Renderer *renderer, float *aabb, vec4 color) {
|
|
|
|
+ vec2 size;
|
|
|
|
+ vec2_scale(size, &aabb[2], 2);
|
|
|
|
+ render_quad_line(renderer, &aabb[0], size, color);
|
|
}
|
|
}
|