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]; }