93 lines
2.5 KiB
C
93 lines
2.5 KiB
C
|
|
||
|
void cam_calc_vec(camera_t *cam) {
|
||
|
VEC3_SET(cam->front, cos(glm_rad(cam->yaw)) * cos(glm_rad(cam->pitch)), sin(glm_rad(cam->pitch)), sin(glm_rad(cam->yaw)) * cos(glm_rad(cam->pitch)))
|
||
|
glm_vec3_normalize(cam->front);
|
||
|
glm_vec3_cross(cam->front, cam->world_up, cam->right);
|
||
|
glm_vec3_normalize(cam->right);
|
||
|
glm_vec3_cross(cam->right, cam->front, cam->up);
|
||
|
glm_vec3_normalize(cam->up);
|
||
|
}
|
||
|
|
||
|
void cam_angle(camera_t *cam, float yaw, float pitch) {
|
||
|
cam->yaw = yaw;
|
||
|
cam->pitch = pitch;
|
||
|
cam_calc_vec(cam);
|
||
|
}
|
||
|
|
||
|
void cam_angle_ent(camera_t *cam, entity_t *ent) {
|
||
|
cam->yaw = ent->yaw;
|
||
|
cam->pitch = ent->pitch;
|
||
|
cam_calc_vec(cam);
|
||
|
}
|
||
|
|
||
|
void cam_pos(camera_t *cam, double x, double y, double z) {
|
||
|
cam->pos_x = x;
|
||
|
cam->pos_y = y;
|
||
|
cam->pos_z = z;
|
||
|
}
|
||
|
|
||
|
void cam_pos_ent(camera_t *cam, entity_t *ent, double fraction) {
|
||
|
cam->pos_x = ent->last_x + (ent->pos_x - ent->last_x) * fraction;
|
||
|
cam->pos_y = (ent->last_y + (ent->pos_y - ent->last_y) * fraction) + ent->eye;
|
||
|
cam->pos_z = ent->last_z + (ent->pos_z - ent->last_z) * fraction;
|
||
|
}
|
||
|
|
||
|
void cam_init(camera_t *cam, double x, double y, double z, float yaw, float pitch) {
|
||
|
VEC3_SET(cam->world_up, 0.0f, 1.0f, 0.0f)
|
||
|
cam_angle(cam, yaw, pitch);
|
||
|
cam_pos(cam, x, y, z);
|
||
|
}
|
||
|
|
||
|
void cam_swing(camera_t *cam, float x, float y) {
|
||
|
// if(gdr.cam_fixed)
|
||
|
// return;
|
||
|
cam->yaw += x * sys.sensitivity * 0.1f;
|
||
|
cam->pitch += y * sys.sensitivity * 0.1f;
|
||
|
cam->yaw = fmodf(cam->yaw + 180.0f, 360.0f);
|
||
|
cam->yaw = ((cam->yaw < 0.0f) ? (cam->yaw + 360.0f) : cam->yaw) - 180.0f;
|
||
|
cam->pitch = CLAMP_VALUE(cam->pitch, -89.0f, 89.0f);
|
||
|
cam_calc_vec(cam);
|
||
|
}
|
||
|
|
||
|
void cam_zoom(camera_t *cam, float zoom) {
|
||
|
// if(gdr.zoom_fixed)
|
||
|
// return;
|
||
|
cam->zoom += zoom;
|
||
|
cam->zoom = CLAMP_VALUE(cam->zoom, 0.0f, 1.0f);
|
||
|
}
|
||
|
|
||
|
void cam_rzoom(camera_t *cam) {
|
||
|
cam->zoom = 0.0f;
|
||
|
}
|
||
|
|
||
|
void cam_move_noclip(camera_t *cam, float delta, float speed, byte dir) {
|
||
|
// if(gdr.pos_fixed)
|
||
|
// return;
|
||
|
float velo = speed * delta;
|
||
|
vec3 pos;
|
||
|
VEC3_SET(pos, cam->pos_x, cam->pos_y, cam->pos_z)
|
||
|
switch(dir) {
|
||
|
case DIR_LEFT:
|
||
|
glm_vec3_muladds(cam->right, -velo, pos);
|
||
|
break;
|
||
|
case DIR_RIGHT:
|
||
|
glm_vec3_muladds(cam->right, velo, pos);
|
||
|
break;
|
||
|
case DIR_DOWN:
|
||
|
glm_vec3_muladds(cam->world_up, -velo, pos);
|
||
|
break;
|
||
|
case DIR_UP:
|
||
|
glm_vec3_muladds(cam->world_up, velo, pos);
|
||
|
break;
|
||
|
case DIR_BACKWARD:
|
||
|
glm_vec3_muladds(cam->front, -velo, pos);
|
||
|
break;
|
||
|
case DIR_FORWARD:
|
||
|
glm_vec3_muladds(cam->front, velo, pos);
|
||
|
break;
|
||
|
}
|
||
|
cam->pos_x = pos[0];
|
||
|
cam->pos_y = pos[1];
|
||
|
cam->pos_z = pos[2];
|
||
|
}
|