]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/client/game.c
Add items
[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 bool game(Flag *gfx_init)
92 {
93         if (!window_init())
94                 return false;
95
96         if (!font_init())
97                 return false;
98
99         model_init();
100
101         if (!sky_init())
102                 return false;
103
104         if (!terrain_gfx_init())
105                 return false;
106
107         if (!client_entity_gfx_init())
108                 return false;
109
110         client_player_gfx_init();
111
112         camera_init();
113
114         if (!gui_init())
115                 return false;
116
117         if (!interact_init())
118                 return false;
119
120         client_item_init();
121
122         if (!client_inventory_init())
123                 return false;
124
125         client_node_init();
126         client_terrain_start();
127
128         debug_menu_init();
129         input_init();
130
131         flag_set(gfx_init);
132
133         game_loop();
134
135         client_terrain_stop();
136
137         font_deinit();
138         gui_deinit();
139         model_deinit();
140         sky_deinit();
141         terrain_gfx_deinit();
142         client_entity_gfx_deinit();
143         client_player_gfx_deinit();
144         interact_deinit();
145         client_item_deinit();
146         client_inventory_deinit();
147
148         return true;
149 }
150