working on renderer
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 2 Nov 2021 04:07:35 +0000 (23:07 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 2 Nov 2021 04:07:35 +0000 (23:07 -0500)
include/gfx.h [new file with mode: 0644]
src/gfx.c [new file with mode: 0644]
src/heartbreak_graphics.c
tests/simp.onyx

diff --git a/include/gfx.h b/include/gfx.h
new file mode 100644 (file)
index 0000000..2e17a04
--- /dev/null
@@ -0,0 +1,44 @@
+#ifndef HEARTBREAK_GFX_H
+#define HEARTBREAK_GFX_H
+
+
+#include "bh.h"
+#include <GLES3/gl3.h>
+#include <GLFW/glfw3.h>
+
+typedef struct Shader {
+    GLint program;
+
+    GLint position_loc;
+    GLint color_loc;
+    GLint texture_loc;
+
+    GLint texture_uniform;
+    GLint view_uniform;
+    GLint world_uniform;
+} Shader;
+
+Shader gfx_shader_make_from_source(const char* vertex_src, const char* fragment_src);
+
+typedef struct ImmediateVertex {
+    f32 x, y;
+    f32 r, g, b, a;
+    f32 u, v;
+} ImmediateVertex;
+
+#define VERTEX_DATA_MAX_COUNT 1020
+
+typedef struct ImmediateRenderer {
+    bh_allocator vertex_allocator;
+    ImmediateVertex* vertex_data;
+    u32              vertex_count;
+
+    GLint vertex_array;
+    GLint vertex_buffer;
+
+    Shader simple_shader;
+} ImmediateRenderer;
+
+void gfx_immediate_renderer_init(ImmediateRenderer *ir);
+
+#endif
\ No newline at end of file
diff --git a/src/gfx.c b/src/gfx.c
new file mode 100644 (file)
index 0000000..39c5776
--- /dev/null
+++ b/src/gfx.c
@@ -0,0 +1,110 @@
+#include "gfx.h"
+
+static const char* SIMPLE_SHADER_VERTEX = "#version 300 es\n"
+"layout(location = 0) in vec2 a_vertex;\n"
+"layout(location = 1) in vec4 a_color;\n"
+"layout(location = 2) in vec2 a_texture;\n"
+"\n"
+"uniform mat4 u_view;\n"
+"uniform mat4 u_world;\n"
+"\n"
+"out vec4 v_color;\n"
+"out vec2 v_texture;\n"
+"\n"
+"void main() {\n"
+"   gl_Position = u_view * u_world * vec4(a_vertex, 0, 1);\n"
+"   v_color = a_color;\n"
+"   v_texture = a_texture;\n"
+"}";
+
+static const char* SIMPLE_SHADER_FRAGMENT = "#version 300 es\n"
+"precision mediump float;\n"
+"uniform sample2D u_texture;\n"
+"\n"
+"in vec4 v_color;\n"
+"in vec2 v_texture;\n"
+"\n"
+"out vec4 fragColor;\n"
+"\n"
+"void main() {\n"
+"   fragColor = v_color;\n"
+"}";
+
+static b32 compile_shader(GLuint shader_type, const char *src, GLuint *out_shader) {
+    GLuint s = glCreateShader(shader_type);
+
+    glShaderSource(s, 1, src, NULL);
+    glCompileShader(s);
+
+    GLint successful;
+    glGetShaderiv(s, GL_COMPILE_STATUS, &successful);
+    if (successful != GL_TRUE) {
+        GLsizei log_length = 0;
+        GLchar shader_log[1024];
+        glGetShaderInfoLog(s, 1023, &log_length, shader_log);
+
+        bh_printf("Error compiling shader:\n%s\n", shader_log);
+        return 0;
+    }
+
+    *out_shader = s;
+    return 1;
+}
+
+static GLuint link_program(GLuint vertex_shader, GLuint fragment_shader) {
+    GLuint program = glCreateProgram();
+    glAttachShader(program, vertex_shader);
+    glAttachShader(program, fragment_shader);
+    glLinkProgram(program);
+
+    GLuint successful;
+    glGetProgramiv(program, GL_LINK_STATUS, &successful);
+    if (successful != GL_TRUE) {
+        GLsizei log_length = 0;
+        GLchar program_log[1024];
+        glGetShaderInfoLog(s, 1023, &log_length, program_log);
+
+        bh_printf("Error linking program:\n%s\n", program_log);
+        return -1;
+    }
+
+    return program;
+}
+
+Shader gfx_shader_make_from_source(const char *vertex_src, const char *fragment_src) {
+    GLuint vertex_shader, fragment_shader;
+    compile_shader(GL_VERTEX_SHADER, vertex_src, &vertex_shader);
+    compile_shader(GL_FRAGMENT_SHADER, fragment_src, &fragment_shader);
+
+    GLuint program = link_program(vertex_shader, fragment_shader);
+
+    Shader shader;
+    shader.program = program;
+    
+    shader.position_loc = glGetAttribLocation(program, "a_position");
+    shader.color_loc    = glGetAttribLocation(program, "a_color");
+    shader.texture_loc  = glGetAttribLocation(program, "a_texture");
+
+    shader.texture_uniform = glGetUniformLocation(program, "u_texture");
+    shader.view_uniform    = glGetUniformLocation(program, "u_view");
+    shader.world_uniform   = glGetUniformLocation(program, "u_world");
+
+    return shader;
+}
+
+void gfx_immediate_renderer_init(ImmediateRenderer *ir) {
+    ir->vertex_allocator = bh_heap_allocator();
+    ir->vertex_data      = bh_alloc(ir->vertex_allocator, sizeof(ImmediateVertex) * VERTEX_DATA_MAX_COUN);
+    ir->vertex_count     = 0;
+
+    ir->simple_shader = gfx_shader_make_from_source(SIMPLE_SHADER_VERTEX, SIMPLE_SHADER_FRAGMENT);
+
+    glGenVertexArrays(1, &ir->vertex_array);
+    glBindVertexArray(ir->vertex_array);
+
+    glGenBuffers(1, &ir->vertex_buffer);
+    glBindBuffer(GL_ARRAY_BUFFER, ir->vertex_buffer);
+    glBufferData(GL_ARRAY_BUFFER, sizeof(ImmediateVertex) * VERTEX_DATA_MAX_COUNT, NULL, GL_STREAM_DRAW);
+
+    glBindVertexArray(-1);
+}
\ No newline at end of file
index afb4ea0a33ac944546bd5d320b4b4581b0a9204d..7a71b3c74d834b1805930e1a0592bed205625b9b 100644 (file)
@@ -1,5 +1,6 @@
 #define HEARTBREAK_MODULE_NAME graphics
 #include "heartbreak.h"
+#include "gfx.h"
 
 static f32 clear_r, clear_g, clear_b, clear_a;
 
index c5edf2798aec12af1bd3f3ba3a55b01509d2a663..1912180e9c23ba0972f7ce4bcbf223b7debb6cb5 100644 (file)
@@ -33,10 +33,4 @@ draw :: () {
     hb.graphics.rectangle(.Fill, 0, 0, 100, 100);
 }
 
-main :: (_) => {
-    printf("Simp test is working!\n");
-
-    hb.run(.{ init, update, draw });
-    
-    println("Leaving...");
-}
\ No newline at end of file
+main :: (_) => hb.run(.{ init, update, draw });
\ No newline at end of file