handle input correctly

This commit is contained in:
opfez 2021-11-13 23:39:49 +01:00
parent 59937f3cd5
commit a539bf2b8f
1 changed files with 32 additions and 16 deletions

48
main.c
View File

@ -28,9 +28,9 @@ die(char *msg)
const rgb WHITE = {255, 255, 255, 255};
const rgb BLACK = {0, 0, 0, 255};
const rgb RED = {255, 0, 0, 255};
const rgb GREEN = {0, 255, 0, 255};
const rgb BLUE = {0, 0, 255, 255};
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};
@ -572,12 +572,12 @@ draw_mesh(rgb canvas[], rgb col, camera c, mesh mesh)
}
else {
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,
(rgb) {
.r = col_mod,
.g = col_mod,
.b = col_mod
.r = col.r * col_mod,
.g = col.g * col_mod,
.b = col.b * col_mod
},
project_triangle(c, (triangle3) {
v0, v1, v2
@ -654,6 +654,7 @@ main(void)
{
sdl_state state = init_sdl();
camera cam = new_camera(180, (vec3){0, 0, 200}, (vec3){0, 0, 0}, UP);
/* print_camera(cam); */
SDL_Event event;
@ -663,7 +664,7 @@ main(void)
uint64_t t = 0;
double rot_speed = 0.5;
double rot_speed = 0.6;
for (;;) {
double elapsed, start = SDL_GetPerformanceCounter();
@ -676,12 +677,7 @@ main(void)
int x, y;
uint32_t buttons = SDL_GetMouseState(&x, &y);
if (buttons & SDL_BUTTON(2))
screenshot(state.canvas);
else if (buttons & (SDL_BUTTON(1)))
wireframe = !wireframe;
clear_canvas(state.canvas, BLACK);
clear_canvas(state.canvas, (rgb){7, 7, 7, 255});
for (size_t i = 0; i < obj.vertex_num; i++) {
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);
render(state);
if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
break;
while (SDL_PollEvent(&event)) {
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;
SDL_Delay(clamp(16.666f - elapsed, 0, 1000));
@ -699,6 +714,7 @@ main(void)
t++;
}
quit:
free_mesh(obj);
free_mesh(obj_copy);
free_sdl(state);