mouse camera

This commit is contained in:
opfez 2021-11-15 23:08:58 +01:00
parent f937f1cdbd
commit 315808a012
2 changed files with 23 additions and 20 deletions

26
main.c
View File

@ -32,8 +32,6 @@ const rgb RED = {255, 60, 40, 255};
const rgb GREEN = {40, 255, 70, 255};
const rgb BLUE = {50, 70, 255, 255};
const vec3 UP = {0, 1, 0};
typedef struct {
SDL_Renderer *renderer;
SDL_Window *window;
@ -202,6 +200,9 @@ init_sdl(void)
ret.canvas = malloc(sizeof(rgb) * W * H);
clear_canvas(ret.canvas, (rgb){0, 0, 0, 255});
/* SDL_SetWindowGrab(ret.window, SDL_TRUE); */
SDL_SetRelativeMouseMode(SDL_TRUE);
return ret;
}
@ -664,9 +665,6 @@ main(void)
y_rotation(1.2 * t * rot_speed)),
x_rotation(1.3 * t * rot_speed));
int x, y;
uint32_t buttons = SDL_GetMouseState(&x, &y);
clear_canvas(state.canvas, (rgb){7, 7, 7, 255});
for (size_t i = 0; i < iso.vertex_num; i++) {
@ -676,7 +674,6 @@ main(void)
draw_mesh(state.canvas, WHITE, cam, plane_copy);
draw_mesh(state.canvas, WHITE, cam, iso_copy);
render(state);
/* continuous keyboard events */
@ -688,19 +685,12 @@ main(void)
if (keyboard[SDL_SCANCODE_S]) {
cam.pos = vec3_add(cam.pos, vec3_scalar_mul(cam.front, velocity));
}
if (keyboard[SDL_SCANCODE_E]) {
cam.pos = vec3_add(cam.pos, vec3_scalar_mul(cam.right, velocity));
}
if (keyboard[SDL_SCANCODE_Q]) {
if (keyboard[SDL_SCANCODE_A]) {
cam.pos = vec3_sub(cam.pos, vec3_scalar_mul(cam.right, velocity));
}
if (keyboard[SDL_SCANCODE_D]) {
cam.yaw -= 0.05;
cam.pos = vec3_add(cam.pos, vec3_scalar_mul(cam.right, velocity));
}
if (keyboard[SDL_SCANCODE_A]) {
cam.yaw += 0.05;
}
update_camera(&cam);
/* other events */
while (SDL_PollEvent(&event)) {
@ -717,11 +707,17 @@ main(void)
break;
}
break;
case SDL_MOUSEMOTION:
cam.yaw += -event.motion.xrel * 0.001;
cam.pitch += event.motion.yrel * 0.001;
break;
case SDL_QUIT:
goto quit;
}
}
update_camera(&cam);
elapsed = (SDL_GetPerformanceCounter() - start) / (double)SDL_GetPerformanceFrequency() * 1000.0;
SDL_Delay(clamp(16.666f - elapsed, 0, 1000));

17
types.h
View File

@ -101,6 +101,8 @@ void print_grid4x4(grid4x4 grid) { print_grid(4, 4, grid); }
#undef FIELD
#undef END_STRUCT
const vec3 UP = {0, 1, 0};
vec3
vec3_add(vec3 u, vec3 v)
{
@ -259,14 +261,19 @@ lookat(camera cam)
void
update_camera(camera *cam)
{
double α = cos(cam->pitch);
double β = sin(cam->pitch);
double x = cos(cam->yaw);
double y = sin(cam->yaw);
vec3 front = {
.x = cos(cam->yaw) * cos(cam->pitch),
.y = sin(cam->pitch),
.z = sin(cam->yaw) * cos(cam->pitch)
.x = α * y,
.y = β,
.z = -α * x,
};
cam->front = vec3_normalize(front);
cam->right = vec3_normalize(vec3_cross(cam->front, cam->up));
/* cam->up = vec3_normalize(vec3_cross(cam->right, cam->front)); */
cam->right = vec3_normalize(vec3_cross(cam->front, UP));
cam->up = vec3_normalize(vec3_cross(cam->right, cam->front));
}
#endif