client_player_init();
client_entity_init();
dragonnet_peer_run(client);
+ client_auth_init();
- if (!client_auth_init())
- return EXIT_FAILURE;
-
- if (!game(&gfx_init))
- return EXIT_FAILURE;
+ game(&gfx_init);
dragonnet_peer_shutdown(client);
client_auth_deinit();
#include <stddef.h>
#include <stdio.h>
+#include <stdlib.h>
#include <linenoise/linenoise.h>
#include "client.h"
#include "client_auth.h"
}
}
-bool client_auth_init()
+void client_auth_init()
{
client_auth.name = NULL;
pthread_cond_init(&client_auth.cv, NULL);
auth_loop();
flag_uns(&interrupt, &client_auth.cv);
- bool success = client_auth.state == AUTH_SUCCESS;
- pthread_mutex_unlock(&client_auth.mtx);
- return success;
+ if (client_auth.state != AUTH_SUCCESS) {
+ fprintf(stderr, "[error] authentication failed due to interruption or read failure\n");
+ abort();
+ }
+
+ pthread_mutex_unlock(&client_auth.mtx);
}
void client_auth_deinit()
pthread_mutex_t mtx;
} client_auth;
-bool client_auth_init();
+void client_auth_init();
void client_auth_deinit();
#endif // _CLIENT_AUTH_H_
pthread_mutex_destroy(&mtx_nametagged);
}
-bool client_entity_gfx_init()
+void client_entity_gfx_init()
{
char *shader_def;
asprintf(&shader_def, "#define VIEW_DISTANCE %lf\n", client_config.view_distance);
-
- if (!shader_program_create(RESSOURCE_PATH "shaders/3d/entity", &shader_prog, shader_def)) {
- fprintf(stderr, "[error] failed to create entity shader program\n");
- return false;
- }
-
+ shader_prog = shader_program_create(RESSOURCE_PATH "shaders/3d/entity", shader_def);
free(shader_def);
loc_VP = glGetUniformLocation(shader_prog, "VP"); GL_DEBUG
light_shader_locate(&light_shader);
client_entity_depth_offset(0.0f);
-
- return true;
}
void client_entity_gfx_deinit()
void client_entity_init();
void client_entity_deinit();
-bool client_entity_gfx_init();
+void client_entity_gfx_init();
void client_entity_gfx_deinit();
void client_entity_gfx_update();
void client_entity_depth_offset(f32 offset);
static ModelShader _3d_model_shader;
static LightShader _3d_light_shader;
-bool client_inventory_init()
+void client_inventory_init()
{
char *_3d_shader_def;
asprintf(&_3d_shader_def, "#define VIEW_DISTANCE %lf\n", client_config.view_distance);
-
- if (!shader_program_create(RESSOURCE_PATH "shaders/3d/item", &_3d_shader_prog, _3d_shader_def)) {
- fprintf(stderr, "[error] failed to create 3D item shader program\n");
- return false;
- }
-
+ _3d_shader_prog = shader_program_create(RESSOURCE_PATH "shaders/3d/item", _3d_shader_def);
free(_3d_shader_def);
_3d_loc_VP = glGetUniformLocation(_3d_shader_prog, "VP");
light_shader_locate(&_3d_light_shader);
client_inventory_depth_offset(0.0f);
-
- return true;
}
void client_inventory_deinit()
#include "client/client_player.h"
#include "client/model.h"
-bool client_inventory_init();
+void client_inventory_init();
void client_inventory_deinit();
void client_inventory_update();
.size = sizeof(FontVertex),
};
-bool font_init()
+void font_init()
{
if (FT_Init_FreeType(&font_library)) {
fprintf(stderr, "[error] failed to initialize Freetype\n");
- return false;
+ abort();
}
if (FT_New_Face(font_library, RESSOURCE_PATH "fonts/Minecraftia.ttf", 0, &font_face)) {
fprintf(stderr, "[error] failed to load Minecraftia.ttf\n");
- return false;
+ abort();
}
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); GL_DEBUG
FT_Done_Face(font_face);
FT_Done_FreeType(font_library);
-
- return true;
}
void font_deinit()
GLuint *textures;
} Font;
-bool font_init();
+void font_init();
void font_deinit();
Font *font_create(const char *text);
void font_delete(Font *font);
}
}
-bool game(Flag *gfx_init)
+void game(Flag *gfx_init)
{
- if (!window_init())
- return false;
-
- if (!font_init())
- return false;
-
+ window_init();
+ font_init();
model_init();
-
- if (!sky_init())
- return false;
-
- if (!terrain_gfx_init())
- return false;
-
- if (!client_entity_gfx_init())
- return false;
-
+ sky_init();
+ terrain_gfx_init();
+ client_entity_gfx_init();
client_player_gfx_init();
-
camera_init();
-
- if (!gui_init())
- return false;
-
- if (!interact_init())
- return false;
-
+ gui_init();
+ interact_init();
client_item_init();
-
- if (!client_inventory_init())
- return false;
-
+ client_inventory_init();
client_node_init();
client_terrain_start();
-
debug_menu_init();
input_init();
flag_set(gfx_init);
-
game_loop();
client_terrain_stop();
-
font_deinit();
gui_deinit();
model_deinit();
interact_deinit();
client_item_deinit();
client_inventory_deinit();
-
- return true;
}
extern int game_fps;
-bool game(Flag *gfx_init);
+void game(Flag *gfx_init);
void game_render(f64 dtime);
#endif // _GAME_H_
#include "client/shader.h"
#include "client/window.h"
-static GUIElement root_element;
+static GUIElement root_element = {
+ .def = {
+ .pos = {0.0f, 0.0f},
+ .z_index = 0.0f,
+ .offset = {0, 0},
+ .align = {0.0f, 0.0f},
+ .scale = {0.0f, 0.0f},
+ .scale_type = SCALE_NONE,
+ .affect_parent_scale = false,
+ .text = NULL,
+ .image = NULL,
+ .text_color = {0.0f, 0.0f, 0.0f, 0.0f},
+ .bg_color = {0.0f, 0.0f, 0.0f, 0.0f},
+ },
+ .visible = true,
+ .pos = (v2f32) {0.0f, 0.0f},
+ .scale = (v2f32) {0.0f, 0.0f},
+ .text = NULL,
+ .parent = &root_element,
+};
static GLuint background_prog;
static GLint background_loc_model;
// public functions
-bool gui_init()
+void gui_init()
{
// initialize background pipeline
-
- if (!shader_program_create(RESSOURCE_PATH "shaders/gui/background", &background_prog, NULL)) {
- fprintf(stderr, "[error] failed to create GUI background shader program\n");
- return false;
- }
-
+ background_prog = shader_program_create(RESSOURCE_PATH "shaders/gui/background", NULL);
background_loc_model = glGetUniformLocation(background_prog, "model"); GL_DEBUG
background_loc_projection = glGetUniformLocation(background_prog, "projection"); GL_DEBUG
background_loc_color = glGetUniformLocation(background_prog, "color"); GL_DEBUG
// initialize image pipeline
-
- if (!shader_program_create(RESSOURCE_PATH "shaders/gui/image", &image_prog, NULL)) {
- fprintf(stderr, "[error] failed to create GUI image shader program\n");
- return false;
- }
-
+ image_prog = shader_program_create(RESSOURCE_PATH "shaders/gui/image", NULL);
image_loc_model = glGetUniformLocation(image_prog, "model"); GL_DEBUG
image_loc_projection = glGetUniformLocation(image_prog, "projection"); GL_DEBUG
// initialize font pipeline
-
- if (!shader_program_create(RESSOURCE_PATH "shaders/gui/font", &font_prog, NULL)) {
- fprintf(stderr, "[error] failed to create GUI font shader program\n");
- return false;
- }
-
+ font_prog = shader_program_create(RESSOURCE_PATH "shaders/gui/font", NULL);
font_loc_model = glGetUniformLocation(font_prog, "model"); GL_DEBUG
font_loc_projection = glGetUniformLocation(font_prog, "projection"); GL_DEBUG
font_loc_color = glGetUniformLocation(font_prog, "color"); GL_DEBUG
// initialize GUI root element
-
- root_element.def.pos = (v2f32) {0.0f, 0.0f};
- root_element.def.z_index = 0.0f;
- root_element.def.offset = (v2s32) {0, 0};
- root_element.def.align = (v2f32) {0.0f, 0.0f};
- root_element.def.scale = (v2f32) {0.0f, 0.0f};
- root_element.def.scale_type = SCALE_NONE;
- root_element.def.affect_parent_scale = false;
- root_element.def.text = NULL;
- root_element.def.image = NULL;
- root_element.def.text_color = (v4f32) {0.0f, 0.0f, 0.0f, 0.0f};
- root_element.def.bg_color = (v4f32) {0.0f, 0.0f, 0.0f, 0.0f};
- root_element.visible = true;
- root_element.pos = (v2f32) {0.0f, 0.0f};
- root_element.scale = (v2f32) {0.0f, 0.0f};
- root_element.text = NULL;
- root_element.parent = &root_element;
array_ini(&root_element.children, sizeof(GUIElement *), 0);
-
gui_update_projection();
-
- return true;
}
void gui_deinit()
Array children;
} GUIElement;
-bool gui_init();
+void gui_init();
void gui_deinit();
void gui_update_projection();
void gui_render();
.free_data = false,
};
-bool interact_init()
+void interact_init()
{
- if (!shader_program_create(RESSOURCE_PATH "shaders/3d/selection", &shader_prog, NULL)) {
- fprintf(stderr, "[error] failed to create selection shader program\n");
- return false;
- }
-
+ shader_prog = shader_program_create(RESSOURCE_PATH "shaders/3d/selection", NULL);
loc_MVP = glGetUniformLocation(shader_prog, "MVP"); GL_DEBUG
loc_color = glGetUniformLocation(shader_prog, "color"); GL_DEBUG
.text_color = {0.0f, 0.0f, 0.0f, 0.0f},
.bg_color = {0.0f, 0.0f, 0.0f, 0.0f},
});
-
- return true;
}
void interact_deinit()
NodeType node;
} interact_pointed;
-bool interact_init();
+void interact_init();
void interact_deinit();
void interact_tick();
void interact_render();
if (!success) {
char errbuf[BUFSIZ];
glGetShaderInfoLog(id, BUFSIZ, NULL, errbuf); GL_DEBUG
- fprintf(stderr, "[error] failed to compile %s shader: %s", name, errbuf);
+ fprintf(stderr, "[error] failed to compile shader %s: %s", full_path, errbuf);
glDeleteShader(id); GL_DEBUG
return 0;
}
return id;
}
-bool shader_program_create(const char *path, GLuint *idptr, const char *def)
+GLuint shader_program_create(const char *path, const char *def)
{
GLuint id = glCreateProgram(); GL_DEBUG
if (!(vert = compile_shader(GL_VERTEX_SHADER, path, "vertex", id, def))) {
glDeleteProgram(id); GL_DEBUG
- return false;
+ abort();
}
if (!(frag = compile_shader(GL_FRAGMENT_SHADER, path, "fragment", id, def))) {
glDeleteShader(vert); GL_DEBUG
glDeleteProgram(id); GL_DEBUG
- return false;
+ abort();
}
glLinkProgram(id); GL_DEBUG
if (!success) {
char errbuf[BUFSIZ];
glGetProgramInfoLog(id, BUFSIZ, NULL, errbuf); GL_DEBUG
- fprintf(stderr, "[error] failed to link shader program: %s\n", errbuf);
+ fprintf(stderr, "[error] failed to link shader program %s: %s\n", path, errbuf);
glDeleteProgram(id); GL_DEBUG
return false;
}
- *idptr = id;
- return true;
+ return id;
}
#include <GL/gl.h>
#include <stdbool.h>
-bool shader_program_create(const char *path, GLuint *idptr, const char *def);
+GLuint shader_program_create(const char *path, const char *def);
#endif // _SHADER_H_
static GLint clouds_loc_daylight;
static Mesh clouds_mesh;
-bool sky_init()
+void sky_init()
{
clouds_mesh = skybox_mesh;
SkyboxVertex skybox_vertices[6][6], clouds_vertices[6][6];
// skybox
- if (!shader_program_create(RESSOURCE_PATH "shaders/sky/skybox", &skybox_prog, NULL)) {
- fprintf(stderr, "[error] failed to create skybox shader program\n");
- return false;
- }
-
+ skybox_prog = shader_program_create(RESSOURCE_PATH "shaders/sky/skybox", NULL);
glProgramUniform1iv(skybox_prog, glGetUniformLocation(skybox_prog, "textures"), 2, (GLint[]) {0, 1}); GL_DEBUG
-
skybox_loc_VP = glGetUniformLocation(skybox_prog, "VP"); GL_DEBUG
skybox_loc_daylight = glGetUniformLocation(skybox_prog, "daylight"); GL_DEBUG
skybox_texture_day = texture_load_cubemap(RESSOURCE_PATH "textures/skybox/day", true)->txo;
// sun
- if (!shader_program_create(RESSOURCE_PATH "shaders/sky/sun", &sun_prog, NULL)) {
- fprintf(stderr, "[error] failed to create sun shader program\n");
- return false;
- }
-
+ sun_prog = shader_program_create(RESSOURCE_PATH "shaders/sky/sun", NULL);
sun_loc_MVP = glGetUniformLocation(sun_prog, "MVP"); GL_DEBUG
sun_texture = texture_load(RESSOURCE_PATH "textures/sun.png", false)->txo;
// clouds
- if (!shader_program_create(RESSOURCE_PATH "shaders/sky/clouds", &clouds_prog, NULL)) {
- fprintf(stderr, "[error] failed to create clouds shader program\n");
- return false;
- }
-
+ clouds_prog = shader_program_create(RESSOURCE_PATH "shaders/sky/clouds", NULL);
clouds_loc_VP = glGetUniformLocation(clouds_prog, "VP"); GL_DEBUG
clouds_loc_daylight = glGetUniformLocation(clouds_prog, "daylight"); GL_DEBUG
clouds_mesh.data = clouds_vertices;
mesh_upload(&clouds_mesh);
-
- return true;
}
void sky_deinit()
#include <stdbool.h>
-bool sky_init();
+void sky_init();
void sky_deinit();
void sky_render();
return model;
}
-bool terrain_gfx_init()
+void terrain_gfx_init()
{
GLint texture_units;
glGetIntegerv(GL_MAX_TEXTURE_UNITS, &texture_units); GL_DEBUG
texture_units,
client_config.view_distance
);
-
- if (!shader_program_create(RESSOURCE_PATH "shaders/3d/terrain", &shader_prog, shader_def)) {
- fprintf(stderr, "[error] failed to create terrain shader program\n");
- return false;
- }
-
+ shader_prog = shader_program_create(RESSOURCE_PATH "shaders/3d/terrain", shader_def);
free(shader_def);
loc_VP = glGetUniformLocation(shader_prog, "VP"); GL_DEBUG
light_shader.prog = shader_prog;
light_shader_locate(&light_shader);
-
- return true;
}
void terrain_gfx_deinit()
v3f32 color;
} __attribute__((packed)) TerrainVertex;
-bool terrain_gfx_init();
+void terrain_gfx_init();
void terrain_gfx_deinit();
void terrain_gfx_update();
void terrain_gfx_make_chunk_model(TerrainChunk *chunk);
#include <stdio.h>
+#include <stdlib.h>
#include <GL/glew.h>
#include <GL/gl.h>
#include "client/client_config.h"
debug_menu_changed(ENTRY_FULLSCREEN);
}
-bool window_init()
+void window_init()
{
if(!glfwInit()) {
fprintf(stderr, "[error] failed to initialize GLFW\n");
- return false;
+ abort();
}
glfwWindowHint(GLFW_SAMPLES, client_config.antialiasing);
if (!window.handle) {
fprintf(stderr, "[error] failed to create window\n");
glfwTerminate();
- return false;
+ abort();
}
glfwMakeContextCurrent(window.handle);
if (glewInit() != GLEW_OK) {
fprintf(stderr, "[error] failed to initialize GLEW\n");
- return false;
+ abort();
}
glfwSetFramebufferSizeCallback(window.handle, &framebuffer_size_callback);
glfwSetCursorPosCallback(window.handle, &cursor_pos_callback);
glfwSetWindowPosCallback(window.handle, &window_pos_callback);
glfwSetMouseButtonCallback(window.handle, &mouse_button_callback);
-
- return true;
}
mat4x4 projection;
} window;
-bool window_init();
+void window_init();
void window_enter_fullscreen();
void window_exit_fullscreen();