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