mouse camera
This commit is contained in:
parent
f937f1cdbd
commit
315808a012
26
main.c
26
main.c
|
@ -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
17
types.h
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue