f6a7ceff2b37db30be07f4c971e421a448e373ef
[demo] / src / opengl / opengl.cc
1 #include <GL/glew.h>
2 #include <GLFW/glfw3.h>
3 #include <stdio.h>
4
5 #include "gfxapi.h"
6 #include "opengl/opengl.h"
7
8 extern GLFWwindow *win;
9 extern int win_h;
10 extern int win_w;
11
12 static void clear(float r, float g, float b);
13 static void viewport(int x, int y, int width, int height);
14 static void zbuffer(bool enable);
15 static void cull_face(Gfx_cull_face cf);
16 static void reshape(int width, int height) {};
17
18 bool init_opengl()
19 {
20         if(!glfwInit()) {
21                 fprintf(stderr, "Failed to initialize GLFW.\n");
22                 return false;
23         }
24
25         glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
26         glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
27         glfwWindowHint(GLFW_SRGB_CAPABLE, GLFW_TRUE);
28
29         if(!(win = glfwCreateWindow(win_w, win_h, "glcow", 0, 0))) {
30                 fprintf(stderr, "Failed to create window.\n");
31                 return false;
32         }
33         glfwMakeContextCurrent(win);
34
35         glewInit();
36
37         glEnable(GL_DEPTH_TEST);
38         glEnable(GL_CULL_FACE);
39         glEnable(GL_FRAMEBUFFER_SRGB); // linear colorspace
40
41         gfx_clear = clear;
42         gfx_viewport = viewport;
43         gfx_zbuffer = zbuffer;
44         gfx_cull_face = cull_face;
45         gfx_reshape = reshape;
46
47         // glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
48         return true;
49 }
50
51 void cleanup_opengl()
52 {
53         if(win) {
54                 glfwDestroyWindow(win);
55         }
56         glfwTerminate();
57 }
58
59 static void clear(float r, float g, float b)
60 {
61         glClearColor(r, g, b, 1.0);
62         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
63 }
64
65 static void viewport(int x, int y, int width, int height)
66 {
67         glViewport(x, y, width, height);
68 }
69
70 static void zbuffer(bool enable)
71 {
72         if(enable)
73                 glEnable(GL_DEPTH_TEST);
74         else
75                 glDisable(GL_DEPTH_TEST);
76 }
77
78 static void cull_face(Gfx_cull_face cf)
79 {
80         switch(cf) {
81         case GFX_CULL_NONE:
82                 glDisable(GL_CULL_FACE);
83                 break;
84         case GFX_CULL_FRONT:
85                 glEnable(GL_CULL_FACE);
86                 glCullFace(GL_FRONT);
87                 break;
88         case GFX_CULL_BACK:
89                 glEnable(GL_CULL_FACE);
90                 glCullFace(GL_BACK);
91                 break;
92         }
93 }