#include "cubes.h" #include "gen.h" #include "linmath.h" #include int is_space; int collision(struct chunk chunk, vec3 pos, vec3 dir_temp, int col, int n) { vec3 closestVert = {floor(pos[0] + 0.5), floor(pos[1] + 0.5), floor(pos[2] + 0.5)}; if (col) { double xd = dir_temp[0] / (closestVert[0] - (pos[0])); double yd = dir_temp[1] / (closestVert[1] - (pos[1])); double zd = dir_temp[2] / (closestVert[2] - (pos[2])); if (xd < 0 && n == 0) { dir_temp[0] = 0; pos[0] = closestVert[0]; return 1; } if (yd < 0 && n == 1) { dir_temp[1] = 0; pos[1] = closestVert[1]; return 1; } if (zd < 0 && n == 2) { dir_temp[2] = 0; pos[2] = closestVert[2]; return 1; } } return 0; } struct v3f controlHandler(double cx, double cy, vec3 pos, vec3 dir_temp, GLFWwindow *window, struct chunk chunk) { vec3 direction = {cosf(cy) * sinf(cx) * 0.1, sinf(cy) * 0.1, cosf(cy) * cosf(cx) * 0.1}; vec3 right = {sinf(cx - 3.14f / 2.0f) * 0.1, 0, cosf(cx - 3.14f / 2.0f) * 0.1}; vec3 front = {sinf(cx) * 0.1, 0, cosf(cx) * 0.1}; vec3 pos_temp = {0, 0, 0}; vec3_dup(pos_temp, pos); if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) { vec3_sub(dir_temp, dir_temp, front); } if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) { vec3_add(dir_temp, dir_temp, front); } if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) { vec3_add(dir_temp, dir_temp, direction); } if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) { vec3_add(dir_temp, dir_temp, right); } if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) { vec3_sub(dir_temp, dir_temp, right); } vec3_scale(dir_temp, dir_temp, 0.6); vec3 off = {0, 0, 0}; int col = 0; for (int a = -2; a < 0; a++) { off[1] = a; col = col || cube_exists(pos[0] + off[0], pos[1] + off[1], pos[2] + off[2], chunk, 0); } vec3_add(pos, pos, dir_temp); dir_temp[1] -= 0.05; if (collision(chunk, pos, dir_temp, col, 1)) { col = 0; for (int a = -2; a < 0; a++) { off[1] = a; col = col || cube_exists(pos[0] + off[0], pos[1] + off[1], pos[2] + off[2], chunk, 0); } if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) { is_space = 3; } } if (is_space > 0) { dir_temp[1] = 0.8; } is_space--; collision(chunk, pos, dir_temp, col, 0); collision(chunk, pos, dir_temp, col, 2); struct v3f dirOut; vec3_dup(dirOut.pos, direction); return dirOut; }