Dragonblocks
world.sqlite
DragonblocksAlpha-*.zip
-
-#version 460 core
-
in float fragmentTextureIndex;
in vec2 fragmentTextureCoords;
in vec3 fragmentColor;
out vec4 outColor;
-uniform sampler2D textures[8]; // ToDo: Replace 8 by max_texture_units
+uniform sampler2D textures[MAX_TEXTURE_UNITS];
vec3 hsv2rgb(vec3 c)
{
-#version 460 core
-
layout(location = 0) in vec3 vertexPosition;
layout(location = 1) in float vertexTextureIndex;
layout(location = 2) in vec2 vertexTextureCoords;
-#version 460 core
-
in vec2 fragmentTextureCoords;
out vec4 outColor;
-#version 460 core
-
layout(location = 0) in vec2 vertexPosition;
layout(location = 1) in vec2 vertexTextureCoords;
-#version 460 core
-
in vec2 fragmentTextureCoords;
out vec4 outColor;
-#version 460 core
-
layout(location = 0) in vec2 vertexPosition;
layout(location = 1) in vec2 vertexTextureCoords;
return false;
}
-static void client_start(int fd)
+static bool client_start(int fd)
{
client.fd = fd;
pthread_mutex_init(&client.mtx, NULL);
pthread_t recv_thread;
pthread_create(&recv_thread, NULL, &reciever_thread, NULL);
- if (client_authenticate())
- game(&client);
+ bool return_value = client_authenticate() && game(&client);
if (client.state != CS_DISCONNECTED)
client_disconnect(true, NULL);
client_map_deinit();
pthread_mutex_destroy(&client.mtx);
+
+ return return_value;
}
int main(int argc, char **argv)
freeaddrinfo(info);
signal_handlers_init();
- client_start(fd);
- return EXIT_SUCCESS;
+ return client_start(fd) ? EXIT_SUCCESS : EXIT_FAILURE;
}
}
}
-void game(Client *client)
+bool game(Client *client)
{
int width, height;
width = 1250;
height = 750;
if (! window_init(width, height))
- return;
+ return false;
if (! font_init())
- return;
+ return false;
if (! scene_init())
- return;
+ return false;
scene_on_resize(width, height);
camera_set_position((v3f32) {0.0f, 0.0f, 0.0f});
camera_set_angle(0.0f, 0.0f);
- hud_init();
+ if (! hud_init())
+ return false;
+
hud_on_resize(width, height);
hud_add((HUDElementDefinition) {
font_deinit();
hud_deinit();
scene_deinit();
+
+ return true;
}
#include "client/client.h"
-void game(Client *client);
+bool game(Client *client);
#endif
bool hud_init()
{
- if (! shader_program_create(RESSOURCEPATH "shaders/hud/image", &hud.image_prog)) {
+ if (! shader_program_create(RESSOURCEPATH "shaders/hud/image", &hud.image_prog, NULL)) {
fprintf(stderr, "Failed to create HUD image shader program\n");
return false;
}
hud.image_loc_model = glGetUniformLocation(hud.image_prog, "model");
hud.image_loc_projection = glGetUniformLocation(hud.image_prog, "projection");
- if (! shader_program_create(RESSOURCEPATH "shaders/hud/font", &hud.font_prog)) {
+ if (! shader_program_create(RESSOURCEPATH "shaders/hud/font", &hud.font_prog, NULL)) {
fprintf(stderr, "Failed to create HUD font shader program\n");
return false;
}
scene.objects = list_create(NULL),
pthread_mutex_init(&scene.mtx, NULL);
- if (! shader_program_create(RESSOURCEPATH "shaders/3d", &scene.prog)) {
+ glGetIntegerv(GL_MAX_TEXTURE_UNITS, &scene.max_texture_units);
+
+ char max_texture_units_def[BUFSIZ];
+ sprintf(max_texture_units_def, "#define MAX_TEXTURE_UNITS %d\n", scene.max_texture_units);
+
+ if (! shader_program_create(RESSOURCEPATH "shaders/3d", &scene.prog, max_texture_units_def)) {
fprintf(stderr, "Failed to create 3D shader program\n");
return false;
}
scene.loc_MVP = glGetUniformLocation(scene.prog, "MVP");
- glGetIntegerv(GL_MAX_TEXTURE_UNITS, &scene.max_texture_units);
-
GLint texture_indices[scene.max_texture_units];
for (GLint i = 0; i < scene.max_texture_units; i++)
texture_indices[i] = i;
#include <stdlib.h>
#include "client/shader.h"
-static GLuint compile_and_attach_shader(GLenum type, const char *path, const char *name, GLuint program)
+static GLuint compile_and_attach_shader(GLenum type, const char *path, const char *name, GLuint program, const char *definitions)
{
char full_path[strlen(path) + 1 + strlen(name) + 1 + 4 + 1];
sprintf(full_path, "%s/%s.glsl", path, name);
GLuint id = glCreateShader(type);
- char const *codeptr = code;
- const int isize = (int) size;
- glShaderSource(id, 1, &codeptr, &isize);
+ const char *version = "#version 460 core\n";
+
+ const char *code_list[3] = {
+ version,
+ definitions,
+ code,
+ };
+
+ int size_list[3] = {
+ 18,
+ strlen(definitions),
+ size,
+ };
+
+ glShaderSource(id, 3, code_list, size_list);
glCompileShader(id);
if (! success) {
char errbuf[BUFSIZ];
glGetShaderInfoLog(id, BUFSIZ, NULL, errbuf);
- fprintf(stderr, "Failed to compile %s shader: %s\n", name, errbuf);
+ fprintf(stderr, "Failed to compile %s shader: %s", name, errbuf);
glDeleteShader(id);
return 0;
}
return id;
}
-
-bool shader_program_create(const char *path, GLuint *idptr)
+bool shader_program_create(const char *path, GLuint *idptr, const char *definitions)
{
GLuint id = glCreateProgram();
+ if (! definitions)
+ definitions = "";
+
GLuint vert, frag;
- if (! (vert = compile_and_attach_shader(GL_VERTEX_SHADER, path, "vertex", id))) {
+ if (! (vert = compile_and_attach_shader(GL_VERTEX_SHADER, path, "vertex", id, definitions))) {
glDeleteProgram(id);
return false;
}
- if (! (frag = compile_and_attach_shader(GL_FRAGMENT_SHADER, path, "fragment", id))) {
+ if (! (frag = compile_and_attach_shader(GL_FRAGMENT_SHADER, path, "fragment", id, definitions))) {
glDeleteShader(vert);
glDeleteProgram(id);
return false;
#include <GL/glew.h>
#include <GL/gl.h>
-bool shader_program_create(const char *path, GLuint *idptr);
+bool shader_program_create(const char *path, GLuint *idptr, const char *definitions);
#endif
--- /dev/null
+#! /bin/bash
+if ! make -j$(nproc); then
+ exit 1
+fi
+
+DEBUG_DIR=/tmp/dragonblocks_alpha_debug_$$/
+mkdir $DEBUG_DIR
+
+echo "singleplayer" > $DEBUG_DIR/name
+
+COMMON="set confirm off
+handle SIGTERM nostop print pass
+handle SIGPIPE nostop noprint pass
+set height 0
+define hook-stop
+ if \$_exitcode == 0
+ quit
+ end
+end
+"
+
+echo "$COMMON
+run ::1 4000 < $DEBUG_DIR/name
+" > $DEBUG_DIR/client_script
+
+echo "$COMMON
+run 4000
+" > $DEBUG_DIR/server_script
+
+konsole -e bash -c "
+ echo \$\$ > $DEBUG_DIR/server_pid
+ exec gdb --command $DEBUG_DIR/server_script ./DragonblocksServer
+" & sleep 0.5
+
+gdb --command $DEBUG_DIR/client_script ./Dragonblocks
+
+kill `cat $DEBUG_DIR/server_pid`
+
+rm -rf $DEBUG_DIR
--- /dev/null
+#! /bin/bash
+COMMAND="./debug.sh"
+
+if [[ $1 == "mapgen" ]]; then
+ COMMAND="./debug_mapgen.sh"
+fi
+
+while true; do
+ if ! $COMMAND; then
+ read
+ fi
+done
--- /dev/null
+#! /bin/bash
+rm -f world.sqlite
+./debug.sh