2022-04-28 09:25:48 +02:00

207 lines
6.4 KiB
C

#include "../include/camera.h"
#include <GL/gl.h>
#include <SDL2/SDL.h>
#include <math.h>
void init_camera(Camera* camera)
{
camera->position.x = 5.0;
camera->position.y = 5.0;
camera->position.z = 90.0;
camera->rotation.x = 0.0;
camera->rotation.y = 0.0;
camera->rotation.z = 0.0;
camera->speed.x = 0.0;
camera->speed.y = 0.0;
camera->speed.z = 0.0;
}
vec3f handle_collision(vec3f camera_pos, ChunkManager *cm)
{
vec3f c_max = { camera_pos.x + 0.25, camera_pos.y + 0.25, camera_pos.z + 0.25 };
vec3f c_min = { camera_pos.x - 0.25, camera_pos.y - 0.25, camera_pos.z - 0.25 };
vec3f b_max;
vec3f b_min;
int i = chunk_get_current_chunk_index(cm, camera_pos);
for (int x = floor(camera_pos.x-1); x < floor(camera_pos.x+1); x++) {
for (int y = floor(camera_pos.y-1); y < floor(camera_pos.y+1); y++) {
int z = floor(camera_pos.z+1);
if (!check_index(x, y, z))
continue;
if(cm->chunks[i].blocks[x][y][z].visible) {
b_min = (vec3f) {x+1, y+1, z};
b_max = (vec3f) {x+2, y+2, z+1};
if (c_max.z > b_min.z &&
c_min.z < b_max.z) {
return (vec3f) {0, 0, 1};
}
}
}
}
//int x = floor(camera_pos.x);
//int y = floor(camera_pos.y);
//int z = floor(camera_pos.z);
//b_min = (vec3f) {x, y, z};
//b_max = (vec3f) {x+1, y+1, z+1};
//
//print_vec3f(c_max, "c_max");
//print_vec3f(c_max, "c_min");
//print_vec3f(c_max, "b_max");
//print_vec3f(c_max, "b_max");
//if (c_max.z > b_min.z &&
// c_min.z < b_max.z) {
// return (vec3f) {0, 0, 1};
//}
return (vec3f) {0, 0, 0};
}
void update_camera(Camera* camera, double time)
{
double angle;
double side_angle;
angle = degree_to_radian(camera->rotation.z);
side_angle = degree_to_radian(camera->rotation.z + 90.0);
float x = camera->position.x + cos(angle) * camera->speed.y * time;
float y = camera->position.y + sin(angle) * camera->speed.y * time;
float z = camera->position.z + camera->speed.z * time;
float x1 = camera->position.x + cos(side_angle) * camera->speed.x * time;
float y1 = camera->position.y + sin(side_angle) * camera->speed.x * time;
float z1 = camera->position.z + camera->speed.z * time;
printf("x: %f\n",camera->position.x + camera->speed.z * time);
printf("x: %f\n",camera->position.y + cos(angle) * camera->speed.y * time);
printf("x: %f\n",camera->position.z + sin(angle) * camera->speed.y * time);
//vec3f v = handle_collision(camera->position, camera->cm);
//camera->position.x += cos(angle) * camera->speed.y * time;
//camera->position.y += sin(angle) * camera->speed.y * time;
//if (v.z == 0) camera->position.z += camera->speed.z * time;
//else camera->speed.z = 0;
//camera->position.x += cos(side_angle) * camera->speed.x * time;
//camera->position.y += sin(side_angle) * camera->speed.x * time;
//if (v.z == 0) camera->position.z += camera->speed.z * time;
//else camera->speed.z = 0;
int i = chunk_get_current_chunk_index(camera->cm, camera->position);
vec3f cs = camera->cm->chunks[i].start_pos;
x -= cs.x; y -= cs.y; z -= cs.z;
x1 -= cs.x; y1 -= cs.y; z1 -= cs.z;
if(!is_block(camera->cm->chunks[i].blocks[(int)x][(int)y][(int)z-1])) {
puts("not is block");
camera->speed.z -= GRAVITY * time;
camera->position.x += cos(angle) * camera->speed.y * time;
camera->position.y += sin(angle) * camera->speed.y * time;
camera->position.z += camera->speed.z * time;
} else {
puts("is block");
camera->speed.z = 0;
while(is_block(camera->cm->chunks[i].blocks[(int)camera->position.x]
[(int)camera->position.y]
[(int)camera->position.z-1])) {
camera->position.z+=0.2;
print_vec3f(camera->position, "camera");
}
}
if(!is_block(camera->cm->chunks[i].blocks[(int)x1][(int)y1][(int)z1-1])) {
puts("not is block");
camera->speed.z -= GRAVITY * time;
camera->position.x += cos(side_angle) * camera->speed.x * time;
camera->position.y += sin(side_angle) * camera->speed.x * time;
camera->position.z += camera->speed.z * time;
} else {
puts("is block");
camera->speed.z = 0;
while(is_block(camera->cm->chunks[i].blocks[(int)camera->position.x]
[(int)camera->position.y]
[(int)camera->position.z-1])) {
camera->position.z+=0.2;
print_vec3f(camera->position, "camera");
}
}
}
void set_view(const Camera* camera)
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(-(camera->rotation.x + 90), 1.0, 0, 0);
glRotatef(-(camera->rotation.z - 90), 0, 0, 1.0);
glTranslatef(-camera->position.x, -camera->position.y, -camera->position.z);
}
void set_view_fix(const Camera* camera)
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(-20, 1.0, 0, 0);
glRotatef(-30, 0, 0, 1.0);
glTranslatef(-5, -5, -50);
}
void rotate_camera(Camera* camera, double horizontal, double vertical)
{
camera->rotation.z += horizontal;
camera->rotation.x += vertical;
if (camera->rotation.z < 0) {
camera->rotation.z += 360.0;
}
if (camera->rotation.z > 360.0) {
camera->rotation.z -= 360.0;
}
if (camera->rotation.x < 0.0) {
camera->rotation.x += 360.0;
}
if (camera->rotation.x > 360.0) {
camera->rotation.x -= 360.0;
}
}
void camera_set_speed(Camera* camera, double speed)
{
camera->speed.y = speed;
}
void camera_set_vertical_speed(Camera* camera, double speed)
{
camera->speed.z = speed;
}
void camera_set_side_speed(Camera* camera, double speed)
{
camera->speed.x = speed;
}
vec3f get_camera_dir_vec3f(Camera *camera)
{
vec3f dir = {cos(degree_to_radian(camera->rotation.x)) *
cos(degree_to_radian(camera->rotation.z)),
sin(degree_to_radian(camera->rotation.z)) *
cos(degree_to_radian(camera->rotation.x)),
sin(degree_to_radian(camera->rotation.x))};
vec3f_normalize(&dir);
return dir;
}