]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/client/game.c
Client: unify error handling
[dragonblocks_alpha.git] / src / client / game.c
1 #include <GL/glew.h>
2 #include <GL/gl.h>
3 #include <GLFW/glfw3.h>
4 #include <stdio.h>
5 #include <unistd.h>
6 #include "client/camera.h"
7 #include "client/client.h"
8 #include "client/client_entity.h"
9 #include "client/client_inventory.h"
10 #include "client/client_item.h"
11 #include "client/client_node.h"
12 #include "client/client_player.h"
13 #include "client/client_terrain.h"
14 #include "client/debug_menu.h"
15 #include "client/font.h"
16 #include "client/frustum.h"
17 #include "client/game.h"
18 #include "client/gl_debug.h"
19 #include "client/gui.h"
20 #include "client/input.h"
21 #include "client/interact.h"
22 #include "client/sky.h"
23 #include "client/window.h"
24 #include "day.h"
25 #include "interrupt.h"
26
27 int game_fps = 0;
28
29 void game_render(f64 dtime)
30 {
31         glEnable(GL_DEPTH_TEST); GL_DEBUG
32         glEnable(GL_BLEND); GL_DEBUG
33         glEnable(GL_MULTISAMPLE); GL_DEBUG
34         glEnable(GL_CULL_FACE); GL_DEBUG
35
36         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); GL_DEBUG
37         glCullFace(GL_BACK); GL_DEBUG
38         glFrontFace(GL_CCW); GL_DEBUG
39
40         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); GL_DEBUG
41
42         frustum_update();
43         terrain_gfx_update();
44         client_entity_gfx_update();
45         client_inventory_update();
46
47         sky_render();
48         model_scene_render(dtime);
49         interact_render();
50         gui_render();
51 }
52
53 static void game_loop()
54 {
55         f64 fps_update_timer = 1.0f;
56         unsigned int frames = 0;
57
58         struct timespec ts, ts_old;
59         clock_gettime(CLOCK_REALTIME, &ts_old);
60
61         while (!glfwWindowShouldClose(window.handle) && !interrupt.set) {
62                 clock_gettime(CLOCK_REALTIME, &ts);
63                 f64 dtime = (f64) (ts.tv_sec - ts_old.tv_sec) + (f64) (ts.tv_nsec - ts_old.tv_nsec) / 1.0e9;
64                 ts_old = ts;
65
66                 if ((fps_update_timer -= dtime) <= 0.0) {
67                         debug_menu_changed(ENTRY_FPS);
68                         game_fps = frames;
69                         fps_update_timer += 1.0;
70                         frames = 0;
71                 }
72
73                 frames++;
74
75                 input_tick(dtime);
76                 client_player_tick(dtime);
77                 interact_tick();
78
79                 debug_menu_changed(ENTRY_TIME);
80                 debug_menu_changed(ENTRY_DAYLIGHT);
81                 debug_menu_changed(ENTRY_SUN_ANGLE);
82                 debug_menu_update();
83
84                 game_render(dtime);
85
86                 glfwSwapBuffers(window.handle);
87                 glfwPollEvents();
88         }
89 }
90
91 void game(Flag *gfx_init)
92 {
93         window_init();
94         font_init();
95         model_init();
96         sky_init();
97         terrain_gfx_init();
98         client_entity_gfx_init();
99         client_player_gfx_init();
100         camera_init();
101         gui_init();
102         interact_init();
103         client_item_init();
104         client_inventory_init();
105         client_node_init();
106         client_terrain_start();
107         debug_menu_init();
108         input_init();
109
110         flag_set(gfx_init);
111         game_loop();
112
113         client_terrain_stop();
114         font_deinit();
115         gui_deinit();
116         model_deinit();
117         sky_deinit();
118         terrain_gfx_deinit();
119         client_entity_gfx_deinit();
120         client_player_gfx_deinit();
121         interact_deinit();
122         client_item_deinit();
123         client_inventory_deinit();
124 }
125