207 lines
6.4 KiB
C
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;
|
|
}
|
|
|