]> git.lizzy.rs Git - dragonblocks_alpha.git/blobdiff - src/client/game.c
refactoring
[dragonblocks_alpha.git] / src / client / game.c
index 02216ac0b40a93a2493b8635946ed67fcaf04e52..99da5785bf41cf6d6d6ab87dfe3af74479315e02 100644 (file)
@@ -1,42 +1,42 @@
-#include <stdio.h>
-#include <unistd.h>
+#define STB_IMAGE_WRITE_IMPLEMENTATION
 #include <GL/glew.h>
 #include <GL/gl.h>
 #include <GLFW/glfw3.h>
-#define STB_IMAGE_WRITE_IMPLEMENTATION
 #include <stb/stb_image_write.h>
+#include <stdio.h>
+#include <unistd.h>
 #include "client/camera.h"
 #include "client/client.h"
-#include "client/client_map.h"
 #include "client/client_node.h"
 #include "client/client_player.h"
+#include "client/client_terrain.h"
 #include "client/debug_menu.h"
 #include "client/font.h"
+#include "client/frustum.h"
 #include "client/gui.h"
 #include "client/input.h"
-#include "client/scene.h"
 #include "client/sky.h"
 #include "client/window.h"
 #include "day.h"
 #include "interrupt.h"
 
-int window_width, window_height;
+int game_fps = 0;
 
 static void crosshair_init()
 {
-       gui_add(&gui_root, (GUIElementDefinition) {
+       gui_add(NULL, (GUIElementDefinition) {
                .pos = {0.5f, 0.5f},
                .z_index = 0.0f,
                .offset = {0, 0},
                .margin = {0, 0},
                .align = {0.5f, 0.5f},
                .scale = {1.0f, 1.0f},
-               .scale_type = GST_IMAGE,
+               .scale_type = SCALE_IMAGE,
                .affect_parent_scale = false,
                .text = NULL,
                .image = texture_load(RESSOURCE_PATH "textures/crosshair.png", false),
-               .text_color = (v4f32) {0.0f, 0.0f, 0.0f, 0.0f},
-               .bg_color = (v4f32) {0.0f, 0.0f, 0.0f, 0.0f},
+               .text_color = {0.0f, 0.0f, 0.0f, 0.0f},
+               .bg_color = {0.0f, 0.0f, 0.0f, 0.0f},
        });
 }
 
@@ -52,28 +52,33 @@ static void render(f64 dtime)
        glAlphaFunc(GL_GREATER, 0.1f);
        glCullFace(GL_BACK);
        glFrontFace(GL_CCW);
+
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
+       frustum_update();
+       terrain_gfx_update();
+
        sky_render();
-       scene_render(dtime);
+       model_scene_render(dtime);
        gui_render();
 }
 
 static void game_loop()
 {
        f64 fps_update_timer = 1.0f;
-       int frames = 0;
+       unsigned int frames = 0;
 
        struct timespec ts, ts_old;
        clock_gettime(CLOCK_REALTIME, &ts_old);
 
-       while (! glfwWindowShouldClose(window.handle) && ! interrupt->done) {
+       while (!glfwWindowShouldClose(window.handle) && !interrupt.set) {
                clock_gettime(CLOCK_REALTIME, &ts);
                f64 dtime = (f64) (ts.tv_sec - ts_old.tv_sec) + (f64) (ts.tv_nsec - ts_old.tv_nsec) / 1.0e9;
                ts_old = ts;
 
                if ((fps_update_timer -= dtime) <= 0.0) {
-                       debug_menu_update_fps(frames);
+                       debug_menu_changed(ENTRY_FPS);
+                       game_fps = frames;
                        fps_update_timer += 1.0;
                        frames = 0;
                }
@@ -83,9 +88,10 @@ static void game_loop()
                input_tick(dtime);
                client_player_tick(dtime);
 
-               debug_menu_update_time();
-               debug_menu_update_daylight();
-               debug_menu_update_sun_angle();
+               debug_menu_changed(ENTRY_TIME);
+               debug_menu_changed(ENTRY_DAYLIGHT);
+               debug_menu_changed(ENTRY_SUN_ANGLE);
+               debug_menu_update();
 
                render(dtime);
 
@@ -94,116 +100,95 @@ static void game_loop()
        }
 }
 
-bool game()
+bool game(Flag *gfx_init)
 {
-       window_width = 1250;
-       window_height = 750;
-
-       if (! window_init(window_width, window_height))
+       if (!window_init())
                return false;
 
-       if (! font_init())
+       if (!font_init())
                return false;
 
-       if (! scene_init())
-               return false;
+       model_init();
 
-       scene_on_resize(window_width, window_height);
+       if (!sky_init())
+               return false;
 
-       if (! sky_init())
+       if (!terrain_gfx_init())
                return false;
 
        client_node_init();
-       client_map_start();
+       client_terrain_start();
 
        camera_set_position((v3f32) {0.0f, 0.0f, 0.0f});
        camera_set_angle(0.0f, 0.0f);
 
-       if (! gui_init())
+       if (!gui_init())
                return false;
 
-       gui_on_resize(window_width, window_height);
-
        debug_menu_init();
-       debug_menu_toggle();
-       debug_menu_update_fps(0);
-       debug_menu_update_version();
-       debug_menu_update_seed();
-       debug_menu_update_flight();
-       debug_menu_update_collision();
-       debug_menu_update_timelapse();
-       debug_menu_update_fullscreen();
-       debug_menu_update_opengl();
-       debug_menu_update_gpu();
-       debug_menu_update_antialiasing();
-       debug_menu_update_mipmap();
-       debug_menu_update_render_distance();
-       debug_menu_update_simulation_distance();
-
        crosshair_init();
-
        input_init();
 
-       client_player_add_to_scene();
-
+       flag_set(gfx_init);
        game_loop();
 
-       client_map_stop();
+       client_terrain_stop();
 
        font_deinit();
        gui_deinit();
-       scene_deinit();
+       model_deinit();
        sky_deinit();
+       terrain_gfx_deinit();
 
        return true;
 }
 
-char *take_screenshot()
+char *game_take_screenshot()
 {
        // renderbuffer for depth & stencil buffer
-       GLuint RBO;
-       glGenRenderbuffers(1, &RBO);
-       glBindRenderbuffer(GL_RENDERBUFFER, RBO);
-       glRenderbufferStorageMultisample(GL_RENDERBUFFER, 8, GL_DEPTH24_STENCIL8, window_width, window_height);
+       GLuint rbo;
+       glGenRenderbuffers(1, &rbo);
+       glBindRenderbuffer(GL_RENDERBUFFER, rbo);
+       glRenderbufferStorageMultisample(GL_RENDERBUFFER, 8, GL_DEPTH24_STENCIL8, window.width, window.height);
 
        // 2 textures, one with AA, one without
 
-       GLuint textures[2];
-       glGenTextures(2, textures);
+       GLuint txos[2];
+       glGenTextures(2, txos);
 
-       glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textures[0]);
-       glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 8, GL_RGB, window_width, window_height, GL_TRUE);
+       glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, txos[0]);
+       glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 8, GL_RGB, window.width, window.height, GL_TRUE);
 
-       glBindTexture(GL_TEXTURE_2D, textures[1]);
-       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, window_width, window_height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
+       glBindTexture(GL_TEXTURE_2D, txos[1]);
+       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, window.width, window.height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
 
        // 2 framebuffers, one with AA, one without
 
-       GLuint FBOs[2];
-       glGenFramebuffers(2, FBOs);
+       GLuint fbos[2];
+       glGenFramebuffers(2, fbos);
 
-       glBindFramebuffer(GL_FRAMEBUFFER, FBOs[0]);
-       glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, textures[0], 0);
-       glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, RBO);
+       glBindFramebuffer(GL_FRAMEBUFFER, fbos[0]);
+       glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, txos[0], 0);
+       glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);
 
-       glBindFramebuffer(GL_FRAMEBUFFER, FBOs[1]);
-       glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0);
+       glBindFramebuffer(GL_FRAMEBUFFER, fbos[1]);
+       glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, txos[1], 0);
 
        // render scene
-       glBindFramebuffer(GL_FRAMEBUFFER, FBOs[0]);
+       glBindFramebuffer(GL_FRAMEBUFFER, fbos[0]);
        render(0.0);
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
 
        // blit AA-buffer into no-AA buffer
-       glBindFramebuffer(GL_READ_FRAMEBUFFER, FBOs[0]);
-       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FBOs[1]);
-       glBlitFramebuffer(0, 0, window_width, window_height, 0, 0, window_width, window_height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
+       glBindFramebuffer(GL_READ_FRAMEBUFFER, fbos[0]);
+       glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbos[1]);
+       glBlitFramebuffer(0, 0, window.width, window.height, 0, 0, window.width, window.height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
 
        // read data
-       GLubyte data[window_width * window_height * 3];
-       glBindFramebuffer(GL_FRAMEBUFFER, FBOs[1]);
+       GLubyte data[window.width * window.height * 3];
+       glBindFramebuffer(GL_FRAMEBUFFER, fbos[1]);
        glPixelStorei(GL_PACK_ALIGNMENT, 1);
-       glReadPixels(0, 0, window_width, window_height, GL_RGB, GL_UNSIGNED_BYTE, data);
+       glReadPixels(0, 0, window.width, window.height, GL_RGB, GL_UNSIGNED_BYTE, data);
 
        // create filename
        char filename[BUFSIZ];
@@ -212,18 +197,12 @@ char *take_screenshot()
 
        // save screenshot
        stbi_flip_vertically_on_write(true);
-       stbi_write_png(filename, window_width, window_height, 3, data, window_width * 3);
+       stbi_write_png(filename, window.width, window.height, 3, data, window.width * 3);
 
        // delete buffers
-       glDeleteRenderbuffers(1, &RBO);
-       glDeleteTextures(2, textures);
-       glDeleteFramebuffers(2, FBOs);
+       glDeleteRenderbuffers(1, &rbo);
+       glDeleteTextures(2, txos);
+       glDeleteFramebuffers(2, fbos);
 
        return strdup(filename);
 }
-
-void game_on_resize(int width, int height)
-{
-       window_width = width;
-       window_height = height;
-}