]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/client/game.c
Make texture batching optional (for OpenGL 3.3 compat)
[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/opengl.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 "common/day.h"
25 #include "common/interrupt.h"
26
27 #ifdef _WIN32
28 #include <pthread_time.h>
29 #endif
30
31 int game_fps = 0;
32
33 void game_render(f64 dtime)
34 {
35         glEnable(GL_DEPTH_TEST); GL_DEBUG
36         glEnable(GL_BLEND); GL_DEBUG
37         glEnable(GL_MULTISAMPLE); GL_DEBUG
38         glEnable(GL_CULL_FACE); GL_DEBUG
39
40         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); GL_DEBUG
41         glCullFace(GL_BACK); GL_DEBUG
42         glFrontFace(GL_CCW); GL_DEBUG
43
44         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); GL_DEBUG
45
46         frustum_update();
47         terrain_gfx_update();
48         client_entity_gfx_update();
49         client_inventory_update();
50
51         sky_render();
52         model_scene_render(dtime);
53         interact_render();
54         gui_render();
55 }
56
57 static void game_loop()
58 {
59         f64 fps_update_timer = 1.0f;
60         unsigned int frames = 0;
61
62         struct timespec ts, ts_old;
63         clock_gettime(CLOCK_REALTIME, &ts_old);
64
65         while (!glfwWindowShouldClose(window.handle) && !interrupt.set) {
66                 clock_gettime(CLOCK_REALTIME, &ts);
67                 f64 dtime = (f64) (ts.tv_sec - ts_old.tv_sec) + (f64) (ts.tv_nsec - ts_old.tv_nsec) / 1.0e9;
68                 ts_old = ts;
69
70                 if ((fps_update_timer -= dtime) <= 0.0) {
71                         debug_menu_changed(ENTRY_FPS);
72                         game_fps = frames;
73                         fps_update_timer += 1.0;
74                         frames = 0;
75                 }
76
77                 frames++;
78
79                 input_tick(dtime);
80                 client_player_tick(dtime);
81                 interact_tick();
82
83                 debug_menu_changed(ENTRY_TIME);
84                 debug_menu_changed(ENTRY_DAYLIGHT);
85                 debug_menu_changed(ENTRY_SUN_ANGLE);
86                 debug_menu_update();
87
88                 game_render(dtime);
89
90                 glfwSwapBuffers(window.handle);
91                 glfwPollEvents();
92         }
93 }
94
95 void game(Flag *gfx_init)
96 {
97         window_init();
98         font_init();
99         model_init();
100         sky_init();
101         terrain_gfx_init();
102         client_entity_gfx_init();
103         client_player_gfx_init();
104         camera_init();
105         gui_init();
106         interact_init();
107         client_item_init();
108         client_inventory_init();
109         client_node_init();
110         client_terrain_start();
111         debug_menu_init();
112         input_init();
113
114         flag_set(gfx_init);
115         game_loop();
116
117         client_terrain_stop();
118         font_deinit();
119         gui_deinit();
120         model_deinit();
121         sky_deinit();
122         terrain_gfx_deinit();
123         client_entity_gfx_deinit();
124         client_player_gfx_deinit();
125         interact_deinit();
126         client_item_deinit();
127         client_inventory_deinit();
128 }
129