#include <GL/glew.h>
+#include <GLFW/glfw3.h>
#include <stdio.h>
+#include "gfxapi.h"
#include "opengl/opengl.h"
extern GLFWwindow *win;
extern int win_h;
extern int win_w;
-/* static test_* functions are going to be removed: just to test the shaders */
-static void test_draw();
-static void test_torus();
+static void clear(float r, float g, float b);
+static void viewport(int x, int y, int width, int height);
+static void zbuffer(bool enable);
+static void cull_face(Gfx_cull_face cf);
+static void reshape(int width, int height) {}
+static void wireframe(bool enable);
+static void swapbuffers();
+static void begin_drawing();
+static void end_drawing();
bool init_opengl()
{
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
+ glfwWindowHint(GLFW_SRGB_CAPABLE, GLFW_TRUE);
if(!(win = glfwCreateWindow(win_w, win_h, "glcow", 0, 0))) {
fprintf(stderr, "Failed to create window.\n");
glfwMakeContextCurrent(win);
glewInit();
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_FRAMEBUFFER_SRGB); // linear colorspace
+
+ gfx_clear = clear;
+ gfx_viewport = viewport;
+ gfx_zbuffer = zbuffer;
+ gfx_cull_face = cull_face;
+ gfx_reshape = reshape;
+ gfx_wireframe = wireframe;
+ gfx_swapbuffers = swapbuffers;
+ gfx_begin_drawing = begin_drawing;
+ gfx_end_drawing = end_drawing;
+
+ // glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
return true;
}
glfwTerminate();
}
-void display_opengl()
+static void clear(float r, float g, float b)
{
+ glClearColor(r, g, b, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glClearColor(0.5, 0.5, 0.5, 1.0);
+}
+static void viewport(int x, int y, int width, int height)
+{
+ glViewport(x, y, width, height);
}
-static void test_draw()
+static void zbuffer(bool enable)
{
- /* this function is going to be removed, it's here only to test the shaders */
+ if(enable)
+ glEnable(GL_DEPTH_TEST);
+ else
+ glDisable(GL_DEPTH_TEST);
+}
-}
\ No newline at end of file
+static void cull_face(Gfx_cull_face cf)
+{
+ switch(cf) {
+ case GFX_CULL_NONE:
+ glDisable(GL_CULL_FACE);
+ break;
+ case GFX_CULL_FRONT:
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_FRONT);
+ break;
+ case GFX_CULL_BACK:
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ break;
+ }
+}
+
+static void wireframe(bool enabled)
+{
+ if(enabled)
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ else
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+}
+
+static void swapbuffers()
+{
+ glfwSwapBuffers(win);
+}
+
+static void begin_drawing()
+{
+}
+
+static void end_drawing()
+{
+}