handle input correctly

This commit is contained in:
opfez 2021-11-13 23:39:49 +01:00
parent 59937f3cd5
commit a539bf2b8f

48
main.c
View File

@ -28,9 +28,9 @@ die(char *msg)
const rgb WHITE = {255, 255, 255, 255}; const rgb WHITE = {255, 255, 255, 255};
const rgb BLACK = {0, 0, 0, 255}; const rgb BLACK = {0, 0, 0, 255};
const rgb RED = {255, 0, 0, 255}; const rgb RED = {255, 60, 40, 255};
const rgb GREEN = {0, 255, 0, 255}; const rgb GREEN = {40, 255, 70, 255};
const rgb BLUE = {0, 0, 255, 255}; const rgb BLUE = {50, 70, 255, 255};
const vec3 UP = {0, 1, 0}; const vec3 UP = {0, 1, 0};
@ -572,12 +572,12 @@ draw_mesh(rgb canvas[], rgb col, camera c, mesh mesh)
} }
else { else {
if (x < 0) { if (x < 0) {
double col_mod = clamp(vec3_dot(norm, (vec3){200, 200, 200}) * 0.8, 0.0, 255.0); double col_mod = clamp(vec3_dot(norm, vec3_normalize(c.pos)), 0.0, 1.0);
fill_triangle(canvas, fill_triangle(canvas,
(rgb) { (rgb) {
.r = col_mod, .r = col.r * col_mod,
.g = col_mod, .g = col.g * col_mod,
.b = col_mod .b = col.b * col_mod
}, },
project_triangle(c, (triangle3) { project_triangle(c, (triangle3) {
v0, v1, v2 v0, v1, v2
@ -654,6 +654,7 @@ main(void)
{ {
sdl_state state = init_sdl(); sdl_state state = init_sdl();
camera cam = new_camera(180, (vec3){0, 0, 200}, (vec3){0, 0, 0}, UP); camera cam = new_camera(180, (vec3){0, 0, 200}, (vec3){0, 0, 0}, UP);
/* print_camera(cam); */ /* print_camera(cam); */
SDL_Event event; SDL_Event event;
@ -663,7 +664,7 @@ main(void)
uint64_t t = 0; uint64_t t = 0;
double rot_speed = 0.5; double rot_speed = 0.6;
for (;;) { for (;;) {
double elapsed, start = SDL_GetPerformanceCounter(); double elapsed, start = SDL_GetPerformanceCounter();
@ -676,12 +677,7 @@ main(void)
int x, y; int x, y;
uint32_t buttons = SDL_GetMouseState(&x, &y); uint32_t buttons = SDL_GetMouseState(&x, &y);
if (buttons & SDL_BUTTON(2)) clear_canvas(state.canvas, (rgb){7, 7, 7, 255});
screenshot(state.canvas);
else if (buttons & (SDL_BUTTON(1)))
wireframe = !wireframe;
clear_canvas(state.canvas, BLACK);
for (size_t i = 0; i < obj.vertex_num; i++) { for (size_t i = 0; i < obj.vertex_num; i++) {
obj_copy.vertices[i] = vec3_matrix3x3_multiply(obj.vertices[i], rotation); obj_copy.vertices[i] = vec3_matrix3x3_multiply(obj.vertices[i], rotation);
@ -690,8 +686,27 @@ main(void)
draw_mesh(state.canvas, WHITE, cam, obj_copy); draw_mesh(state.canvas, WHITE, cam, obj_copy);
render(state); render(state);
if (SDL_PollEvent(&event) && event.type == SDL_QUIT) while (SDL_PollEvent(&event)) {
break; switch (event.type) {
case SDL_KEYDOWN: {
switch (event.key.keysym.scancode) {
case SDL_SCANCODE_F3: {
if (!event.key.repeat) wireframe = !wireframe;
break;
}
case SDL_SCANCODE_F6: {
if (!event.key.repeat) screenshot(state.canvas);
break;
}
default:
break;
}
break;
}
case SDL_QUIT:
goto quit;
}
}
elapsed = (SDL_GetPerformanceCounter() - start) / (double)SDL_GetPerformanceFrequency() * 1000.0; elapsed = (SDL_GetPerformanceCounter() - start) / (double)SDL_GetPerformanceFrequency() * 1000.0;
SDL_Delay(clamp(16.666f - elapsed, 0, 1000)); SDL_Delay(clamp(16.666f - elapsed, 0, 1000));
@ -699,6 +714,7 @@ main(void)
t++; t++;
} }
quit:
free_mesh(obj); free_mesh(obj);
free_mesh(obj_copy); free_mesh(obj_copy);
free_sdl(state); free_sdl(state);