COMMON = array.o list.o map.o signal.o util.o types.o node.o queue.o
SERVER = $(COMMON) server.o servercommands.o servermap.o perlin.o facecache.o mapgen.o mapdb.o
-CLIENT = $(COMMON) client.o clientcommands.o clientmap.o clientnode.o mesh.o scene.o shaders.o blockmesh.o texture.o
+CLIENT = $(COMMON) camera.o client.o clientcommands.o clientmap.o clientnode.o mesh.o scene.o shaders.o blockmesh.o texture.o
LIBRARIES = -lpthread -lm -lz
FLAGS = -g -fmax-errors=4
--- /dev/null
+#include "client.h"
+#include "camera.h"
+
+static mat4x4 view, projection;
+static GLFWwindow *window;
+static ShaderProgram *prog;
+
+void set_camera_position(v3f pos)
+{
+ mat4x4_translate(view, -pos.x, -pos.y, -pos.z);
+ glUniformMatrix4fv(prog->loc_view, 1, GL_FALSE, view[0]);
+}
+
+void set_window_size(int width, int height)
+{
+ mat4x4_perspective(projection, 86.1f / 180.0f * M_PI, (float) width / (float) height, 0.01f, 1000.0f);
+ glUniformMatrix4fv(prog->loc_projection, 1, GL_FALSE, projection[0]);
+}
+
+static void framebuffer_size_callback(__attribute__((unused)) GLFWwindow* window, int width, int height)
+{
+ glViewport(0, 0, width, height);
+ set_window_size(width, height);
+}
+
+void init_camera(GLFWwindow *w, ShaderProgram *p)
+{
+ window = w;
+ prog = p;
+
+ glfwSetFramebufferSizeCallback(window, &framebuffer_size_callback);
+}
#include <GL/glew.h>
#include <GL/gl.h>
#include <GLFW/glfw3.h>
+#include "camera.h"
#include "client.h"
#include "clientmap.h"
#include "clientnode.h"
return NULL;
}
-static void update_view_matrix(ShaderProgram *prog, mat4x4 view)
-{
- mat4x4_translate(view, -client.pos.x, -client.pos.y, -client.pos.z);
- glUniformMatrix4fv(prog->loc_view, 1, GL_FALSE, view[0]);
-}
-
static void client_loop()
{
if(! glfwInit()) {
init_client_node_definitions();
clientmap_start_meshgen();
- mat4x4 view, projection;
+ glUseProgram(prog->id);
- update_view_matrix(prog, view);
- mat4x4_perspective(projection, 86.1f / 180.0f * M_PI, (float) width / (float) height, 0.01f, 1000.0f);
+ init_camera(window, prog);
+ set_window_size(width, height);
- glUseProgram(prog->id);
- glUniformMatrix4fv(prog->loc_view, 1, GL_FALSE, view[0]);
- glUniformMatrix4fv(prog->loc_projection, 1, GL_FALSE, projection[0]);
+ bool pos_changed = true;
while (! glfwWindowShouldClose(window) && client.state != CS_DISCONNECTED && ! interrupted) {
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.52941176470588f, 0.8078431372549f, 0.92156862745098f, 1.0f);
- bool pos_changed = false;
-
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {
pos_changed = true;
client.pos.z -= 1.0f;
}
if (pos_changed) {
- update_view_matrix(prog, view);
+ set_camera_position(client.pos);
+ pos_changed = false;
+
pthread_mutex_lock(&client.mtx);
(void) (write_u32(client.fd, SC_POS) && write_v3f32(client.fd, client.pos));
pthread_mutex_unlock(&client.mtx);