104 lines
No EOL
2.6 KiB
C
104 lines
No EOL
2.6 KiB
C
#include "cubes.h"
|
|
#include "gen.h"
|
|
#include "linmath.h"
|
|
#include <GLFW/glfw3.h>
|
|
|
|
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 control_handler(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 || gen_cube(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 || gen_cube(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;
|
|
} |